Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
0663CDB8600141419240161A15BA7E19A5BAD08C6937ED35B0A09804EDD34F0D
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
83,077,726
Requested gas limit
GAS USED
41,538,893
Gas consumed
FEE
83078ugnot
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
CojbAQoML3ZtLm1fYWRkcGtnEvbaAQooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRLI2gEKBGl0ZW0SHGduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2l0ZW0aww0KCmNvbmZpZy5nbm8StA1wYWNrYWdlIGl0ZW0KCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgpjb25zdCAoCglTZXRMaXN0TGltaXRFdmVudCAgICAgPSAiU2V0TGlzdExpbWl0IgoJU2V0TWludGVyUmVhbG1FdmVudCAgID0gIlNldE1pbnRlclJlYWxtIgoJVW5zZXRNaW50ZXJSZWFsbUV2ZW50ID0gIlVuc2V0TWludGVyUmVhbG0iCikKCnZhciAoCglsaXN0TGltaXQgICAgaW50ID0gMTAwIC8vIE1heCBpdGVtcyBwZXIgTGlzdEJ5T3duZXIgcGFnZQoJbWludGVyUmVhbG1zICpicHRyZWUuQlBUcmVlCikKCmZ1bmMgU2V0TGlzdExpbWl0KGN1ciByZWFsbSwgbGltaXQgaW50KSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJaWYgbGltaXQgPCAxIHsKCQlwYW5pYygibGltaXQgbXVzdCBiZSBhdCBsZWFzdCAxIikKCX0KCglvbGRMaW1pdCA6PSBsaXN0TGltaXQKCWxpc3RMaW1pdCA9IGxpbWl0CgoJY2hhaW4uRW1pdCgKCQlTZXRMaXN0TGltaXRFdmVudCwKCQkib2xkTGltaXQiLCBzdHJjb252Lkl0b2Eob2xkTGltaXQpLAoJCSJuZXdMaW1pdCIsIHN0cmNvbnYuSXRvYShsaW1pdCksCgkpCn0KCmZ1bmMgR2V0TGlzdExpbWl0KCkgaW50IHsKCXJldHVybiBsaXN0TGltaXQKfQoKZnVuYyBTZXRNaW50ZXJSZWFsbShjdXIgcmVhbG0sIHBrZ1BhdGggc3RyaW5nKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJYWRkciA6PSBtaW50ZXJSZWFsbUFkZHJlc3MocGtnUGF0aCkKCW1pbnRlclJlYWxtcy5TZXQoYWRkci5TdHJpbmcoKSwgdHJ1ZSkKCWNoYWluLkVtaXQoCgkJU2V0TWludGVyUmVhbG1FdmVudCwKCQkicGtnUGF0aCIsIHBrZ1BhdGgsCgkJImFkZHJlc3MiLCBhZGRyLlN0cmluZygpLAoJKQp9CgpmdW5jIFVuc2V0TWludGVyUmVhbG0oY3VyIHJlYWxtLCBwa2dQYXRoIHN0cmluZykgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgYWRtaW4uSXNBZG1pbikKCWFkZHIgOj0gbWludGVyUmVhbG1BZGRyZXNzKHBrZ1BhdGgpCglpZiAhbWludGVyUmVhbG1zLkhhcyhhZGRyLlN0cmluZygpKSB7CgkJcGFuaWMoInBhY2thZ2UgcGF0aCBpcyBub3QgYSBtaW50ZXIgcmVhbG0iKQoJfQoJbWludGVyUmVhbG1zLlJlbW92ZShhZGRyLlN0cmluZygpKQoJY2hhaW4uRW1pdCgKCQlVbnNldE1pbnRlclJlYWxtRXZlbnQsCgkJInBrZ1BhdGgiLCBwa2dQYXRoLAoJCSJhZGRyZXNzIiwgYWRkci5TdHJpbmcoKSwKCSkKfQoKZnVuYyBJc01pbnRlclJlYWxtKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gbWludGVyUmVhbG1zLkhhcyhhZGRyLlN0cmluZygpKQp9CgpmdW5jIG1pbnRlclJlYWxtQWRkcmVzcyhwa2dQYXRoIHN0cmluZykgYWRkcmVzcyB7CglpZiBwa2dQYXRoID09ICIiIHsKCQlwYW5pYygicGFja2FnZSBwYXRoIGlzIHJlcXVpcmVkIikKCX0KCWlmICFzdHJpbmdzLkhhc1ByZWZpeChwa2dQYXRoLCAiZ25vLmxhbmQvci8iKSB8fCBwa2dQYXRoID09ICJnbm8ubGFuZC9yLyIgewoJCXBhbmljKCJpbnZhbGlkIHBhY2thZ2UgcGF0aCIpCgl9CglyZXR1cm4gY2hhaW4uUGFja2FnZUFkZHJlc3MocGtnUGF0aCkKfQoaQwoLZ25vbW9kLnRvbWwSNG1vZHVsZSA9ICJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9pdGVtIgpnbm8gPSAiMC45IgoapDMKCGl0ZW0uZ25vEpczcGFja2FnZSBpdGVtCgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvYWtrYWRpYS9iZXRhL2FjY2Vzc2NvbnRyb2wiCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvZ3JjMTE1NSIKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKKQoKY29uc3QgKAoJbWF4SW50NjQgPSBpbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3KQopCgp2YXIgKAoJaXRlbVRva2VuICAgICA9IGdyYzExNTUuTmV3QmFzaWNHUkMxMTU1VG9rZW4oIiIpCglpdGVtU3VwcGxpZXMgICpicHRyZWUuQlBUcmVlCglvd25lclRva2VuSURzICpicHRyZWUuQlBUcmVlCikKCmZ1bmMgaW5pdCgpIHsgcmVzZXRJdGVtU3RhdGUoKSB9CgpmdW5jIHJlc2V0SXRlbVN0YXRlKCkgewoJaXRlbVRva2VuID0gZ3JjMTE1NS5OZXdCYXNpY0dSQzExNTVUb2tlbigiIikKCWl0ZW1TdXBwbGllcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCglvd25lclRva2VuSURzID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCW1pbnRlclJlYWxtcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCglsaXN0TGltaXQgPSAxMDAKfQoKZnVuYyBTYWZlTWludChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzLCB0b2tlbklEIHN0cmluZywgYW1vdW50IGludDY0KSB7CglleGVjdXRvciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRBZG1pbk9yT3BlcmF0b3JDYWxsZXIoMCwgY3VyLCBhZG1pbi5Jc0FkbWluLCBhZG1pbi5Jc09wZXJhdG9yKQoJYXNzZXJ0SXRlbU5vQ29pbnMoKQoJbWludEl0ZW0oY3Jvc3MoY3VyKSwgZXhlY3V0b3IsIHJlY2lwaWVudCwgdG9rZW5JRCwgYW1vdW50KQp9CgpmdW5jIFNhZmVNaW50RnJvbVJlYWxtKGN1ciByZWFsbSwgcmVjaXBpZW50IGFkZHJlc3MsIHRva2VuSUQgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWV4ZWN1dG9yIDo9IG11c3RHZXRNaW50ZXJSZWFsbUNhbGxlcigwLCBjdXIpCglpZiB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkgIT0gcmVjaXBpZW50IHsKCQlwYW5pYygiaXRlbSByZWNpcGllbnQgbXVzdCBiZSBvcmlnaW4gY2FsbGVyIikKCX0KCW1pbnRJdGVtKGNyb3NzKGN1ciksIGV4ZWN1dG9yLCByZWNpcGllbnQsIHRva2VuSUQsIGFtb3VudCkKfQoKZnVuYyBVcmkoKSBzdHJpbmcgeyByZXR1cm4gaXRlbVRva2VuLlVyaSgpIH0KZnVuYyBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sIHsKCXJldHVybiBpdGVtVG9rZW4uSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IpCn0KCmZ1bmMgU2V0QXBwcm92YWxGb3JBbGwoY3VyIHJlYWxtLCBvcGVyYXRvciBhZGRyZXNzLCBhcHByb3ZlZCBib29sKSB7CgljYWxsZXIgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0VXNlckNhbGxlcigwLCBjdXIpCglhc3NlcnRJdGVtTm9Db2lucygpCglpZiBlcnIgOj0gaXRlbVRva2VuLlNldEFwcHJvdmFsRm9yQWxsKGNhbGxlciwgb3BlcmF0b3IsIGFwcHJvdmVkKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoIml0ZW0gb3BlcmF0b3IgYXBwcm92YWwgZmFpbGVkOiAiICsgZXJyLkVycm9yKCkpCgl9Cn0KCmZ1bmMgU2FmZVRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRva2VuSUQgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWNhbGxlciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRVc2VyQ2FsbGVyKDAsIGN1cikKCWFzc2VydEl0ZW1Ob0NvaW5zKCkKCWFzc2VydEl0ZW1Ub2tlbklEKHRva2VuSUQpCglhc3NlcnRJdGVtQW1vdW50KGFtb3VudCwgInRyYW5zZmVyIikKCWlmIGVyciA6PSBpdGVtVG9rZW4uU2FmZVRyYW5zZmVyRnJvbShjYWxsZXIsIGZyb20sIHRvLCBncmMxMTU1LlRva2VuSUQodG9rZW5JRCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJpdGVtIHRyYW5zZmVyIGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQoJaWYgZnJvbSAhPSB0byB7CgkJYWRkT3duZXJUb2tlbklEKHRvLCB0b2tlbklEKQoJCWlmIEJhbGFuY2VPZihmcm9tLCB0b2tlbklEKSA9PSAwIHsKCQkJcmVtb3ZlT3duZXJUb2tlbklEKGZyb20sIHRva2VuSUQpCgkJfQoJfQp9CgpmdW5jIEJhbGFuY2VPZihvd25lciBhZGRyZXNzLCB0b2tlbklEIHN0cmluZykgaW50NjQgewoJaWYgIW93bmVyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgaXRlbSBvd25lciIpCgl9Cglhc3NlcnRJdGVtVG9rZW5JRCh0b2tlbklEKQoJYmFsYW5jZSwgZXJyIDo9IGl0ZW1Ub2tlbi5CYWxhbmNlT2Yob3duZXIsIGdyYzExNTUuVG9rZW5JRCh0b2tlbklEKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJpdGVtIGJhbGFuY2UgcXVlcnkgZmFpbGVkOiAiICsgZXJyLkVycm9yKCkpCgl9CglyZXR1cm4gYmFsYW5jZQp9CgpmdW5jIFRvdGFsU3VwcGx5KHRva2VuSUQgc3RyaW5nKSBpbnQ2NCB7Cglhc3NlcnRJdGVtVG9rZW5JRCh0b2tlbklEKQoJdmFsdWUgOj0gaXRlbVN1cHBsaWVzLkdldCh0b2tlbklEKQoJaWYgdmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHZhbHVlLihpbnQ2NCkKfQoKZnVuYyBHZXRPd25lZENvdW50KG93bmVyIGFkZHJlc3MpIGludCB7CglpZiAhb3duZXIuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBpdGVtIG93bmVyIikKCX0KCWlkcywgZm91bmQgOj0gZ2V0T3duZXJUb2tlbklEcyhvd25lcikKCWlmICFmb3VuZCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBpZHMuU2l6ZSgpCn0KCmZ1bmMgTGlzdEJ5T3duZXIob3duZXIgYWRkcmVzcywgcGFnZSwgY291bnQgaW50KSBbXW1hcFtzdHJpbmddc3RyaW5nIHsKCWlmICFvd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGl0ZW0gb3duZXIiKQoJfQoJYXNzZXJ0SXRlbUxpc3RQYWdlQ291bnQocGFnZSwgY291bnQpCglpZHMsIGZvdW5kIDo9IGdldE93bmVyVG9rZW5JRHMob3duZXIpCglpZiAhZm91bmQgewoJCXJldHVybiBbXW1hcFtzdHJpbmddc3RyaW5ne30KCX0KCXJlc3VsdCA6PSBbXW1hcFtzdHJpbmddc3RyaW5ne30KCWlkcy5JdGVyYXRlQnlPZmZzZXQoKHBhZ2UtMSkqY291bnQsIGNvdW50LCBmdW5jKHRva2VuSUQgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgbWFwW3N0cmluZ11zdHJpbmd7CgkJCSJ0b2tlbklkIjogdG9rZW5JRCwKCQkJImFtb3VudCI6ICBzdHJjb252LkZvcm1hdEludChCYWxhbmNlT2Yob3duZXIsIHRva2VuSUQpLCAxMCksCgkJfSkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gcmVzdWx0Cn0KCmZ1bmMgQnVybihjdXIgcmVhbG0sIGZyb20gYWRkcmVzcywgdG9rZW5JRCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgewoJY2FsbGVyIDo9IGFjY2Vzc2NvbnRyb2wuTXVzdEdldFVzZXJDYWxsZXIoMCwgY3VyKQoJYXNzZXJ0SXRlbU5vQ29pbnMoKQoJYXNzZXJ0SXRlbVRva2VuSUQodG9rZW5JRCkKCWlmIGNhbGxlciAhPSBmcm9tICYmICFpdGVtVG9rZW4uSXNBcHByb3ZlZEZvckFsbChmcm9tLCBjYWxsZXIpIHsKCQlwYW5pYygiaXRlbSBvd25lciBvciBhcHByb3ZlZCBvcGVyYXRvciByZXF1aXJlZCIpCgl9Cglhc3NlcnRJdGVtQW1vdW50KGFtb3VudCwgImJ1cm4iKQoJYnVybkl0ZW0oY3Jvc3MoY3VyKSwgY2FsbGVyLCBmcm9tLCB0b2tlbklELCBhbW91bnQpCn0KCmZ1bmMgQnVybkZyb21SZWFsbShjdXIgcmVhbG0sIGZyb20gYWRkcmVzcywgdG9rZW5JRCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgewoJY2FsbGVyIDo9IG11c3RHZXRNaW50ZXJSZWFsbUNhbGxlcigwLCBjdXIpCglpZiB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkgIT0gZnJvbSB7CgkJcGFuaWMoIml0ZW0gb3duZXIgbXVzdCBiZSBvcmlnaW4gY2FsbGVyIikKCX0KCWFzc2VydEl0ZW1Ub2tlbklEKHRva2VuSUQpCglhc3NlcnRJdGVtQW1vdW50KGFtb3VudCwgImJ1cm4iKQoJYnVybkl0ZW0oY3Jvc3MoY3VyKSwgY2FsbGVyLCBmcm9tLCB0b2tlbklELCBhbW91bnQpCn0KCmZ1bmMgbWludEl0ZW0oY3VyIHJlYWxtLCBleGVjdXRvciwgcmVjaXBpZW50IGFkZHJlc3MsIHRva2VuSUQgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydEl0ZW1Ub2tlbklEKHRva2VuSUQpCglpZiAhcmVjaXBpZW50LklzVmFsaWQoKSB8fCByZWNpcGllbnQgPT0gY3VyLkFkZHJlc3MoKSB7CgkJcGFuaWMoImludmFsaWQgaXRlbSByZWNpcGllbnQiKQoJfQoJaWYgYW1vdW50IDw9IDAgewoJCXBhbmljKCJpdGVtIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCXN1cHBseSA6PSBUb3RhbFN1cHBseSh0b2tlbklEKQoJaWYgc3VwcGx5ID4gbWF4SW50NjQtYW1vdW50IHsKCQlwYW5pYygiaXRlbSBhbW91bnQgb3ZlcmZsb3ciKQoJfQoJaWYgZXJyIDo9IGl0ZW1Ub2tlbi5TYWZlTWludChleGVjdXRvciwgcmVjaXBpZW50LCBncmMxMTU1LlRva2VuSUQodG9rZW5JRCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJpdGVtIG1pbnQgZmFpbGVkOiAiICsgZXJyLkVycm9yKCkpCgl9CglpdGVtU3VwcGxpZXMuU2V0KHRva2VuSUQsIHN1cHBseSthbW91bnQpCglhZGRPd25lclRva2VuSUQocmVjaXBpZW50LCB0b2tlbklEKQp9CgpmdW5jIGJ1cm5JdGVtKGN1ciByZWFsbSwgb3BlcmF0b3IsIGZyb20gYWRkcmVzcywgdG9rZW5JRCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgewoJc3VwcGx5IDo9IFRvdGFsU3VwcGx5KHRva2VuSUQpCglpZiBzdXBwbHkgPCBhbW91bnQgewoJCXBhbmljKCJpdGVtIGJ1cm4gYW1vdW50IGV4Y2VlZHMgc3VwcGx5IikKCX0KCWlmIGVyciA6PSBpdGVtVG9rZW4uQnVybihvcGVyYXRvciwgZnJvbSwgZ3JjMTE1NS5Ub2tlbklEKHRva2VuSUQpLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiaXRlbSBidXJuIGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQoJaXRlbVN1cHBsaWVzLlNldCh0b2tlbklELCBzdXBwbHktYW1vdW50KQoJaWYgQmFsYW5jZU9mKGZyb20sIHRva2VuSUQpID09IDAgewoJCXJlbW92ZU93bmVyVG9rZW5JRChmcm9tLCB0b2tlbklEKQoJfQp9CgpmdW5jIG11c3RHZXRNaW50ZXJSZWFsbUNhbGxlcihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0Q3VycmVudFJlYWxtKDAsIHJsbSkKCXByZXYgOj0gcmxtLlByZXZpb3VzKCkKCWlmIHByZXYuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygidXNlciBjYWxscyBub3QgYWxsb3dlZDogZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSByZWFsbSIpCgl9CgljYWxsZXIgOj0gcHJldi5BZGRyZXNzKCkKCWlmICFJc01pbnRlclJlYWxtKGNhbGxlcikgewoJCXBhbmljKCJtaW50ZXIgcmVhbG0gcmVxdWlyZWQiKQoJfQoJcmV0dXJuIGNhbGxlcgp9CgpmdW5jIGFzc2VydEl0ZW1Ob0NvaW5zKCkgewoJaWYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpICE9IDAgewoJCXBhbmljKCJhdHRhY2hlZCBjb2lucyBub3QgYWxsb3dlZCIpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXRlbVRva2VuSUQodG9rZW5JRCBzdHJpbmcpIHsKCWlmIHRva2VuSUQgPT0gIiIgewoJCXBhbmljKCJ0b2tlbiBpZCBpcyByZXF1aXJlZCIpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXRlbUFtb3VudChhbW91bnQgaW50NjQsIGFjdGlvbiBzdHJpbmcpIHsKCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiaXRlbSAiICsgYWN0aW9uICsgIiBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXRlbUxpc3RQYWdlQ291bnQocGFnZSwgY291bnQgaW50KSB7CglpZiBwYWdlIDwgMSB7CgkJcGFuaWMoInBhZ2UgbXVzdCBiZSBhdCBsZWFzdCAxIikKCX0KCWlmIGNvdW50IDwgMSB7CgkJcGFuaWMoImNvdW50IG11c3QgYmUgYXQgbGVhc3QgMSIpCgl9CglpZiBjb3VudCA+IGxpc3RMaW1pdCB7CgkJcGFuaWMoImNvdW50IGV4Y2VlZHMgbGlzdExpbWl0IChtYXg6ICIgKyBzdHJjb252Lkl0b2EobGlzdExpbWl0KSArICIpIikKCX0KfQoKZnVuYyBhZGRPd25lclRva2VuSUQob3duZXIgYWRkcmVzcywgdG9rZW5JRCBzdHJpbmcpIHsKCXZhbHVlIDo9IG93bmVyVG9rZW5JRHMuR2V0KG93bmVyLlN0cmluZygpKQoJdmFyIGlkcyAqYnB0cmVlLkJQVHJlZQoJaWYgdmFsdWUgIT0gbmlsIHsKCQlpZHMgPSB2YWx1ZS4oKmJwdHJlZS5CUFRyZWUpCgl9IGVsc2UgewoJCWlkcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCgkJb3duZXJUb2tlbklEcy5TZXQob3duZXIuU3RyaW5nKCksIGlkcykKCX0KCWlkcy5TZXQodG9rZW5JRCwgdHJ1ZSkKfQoKZnVuYyByZW1vdmVPd25lclRva2VuSUQob3duZXIgYWRkcmVzcywgdG9rZW5JRCBzdHJpbmcpIHsKCWlkcywgZm91bmQgOj0gZ2V0T3duZXJUb2tlbklEcyhvd25lcikKCWlmICFmb3VuZCB7CgkJcmV0dXJuCgl9CglpZHMuUmVtb3ZlKHRva2VuSUQpCn0KCmZ1bmMgZ2V0T3duZXJUb2tlbklEcyhvd25lciBhZGRyZXNzKSAoKmJwdHJlZS5CUFRyZWUsIGJvb2wpIHsKCXZhbHVlIDo9IG93bmVyVG9rZW5JRHMuR2V0KG93bmVyLlN0cmluZygpKQoJaWYgdmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoJcmV0dXJuIHZhbHVlLigqYnB0cmVlLkJQVHJlZSksIHRydWUKfQoa/GYKDWl0ZW1fdGVzdC5nbm8S6mZwYWNrYWdlIGl0ZW0KCmltcG9ydCAoCgkiY2hhaW4iCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgp2YXIgaXRlbVRlc3QgPSBzdHJ1Y3QgewoJQWRtaW4sIE9wZXJhdG9yLCBPd25lciwgT3RoZXIgYWRkcmVzcwoJU2V0dXBEb25lICAgICAgICAgICAgICAgICAgICAgYm9vbAp9ewoJQWRtaW46ICAgIHRlc3R1dGlscy5UZXN0QWRkcmVzcygiaXRlbUFkbWluIiksCglPcGVyYXRvcjogdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJpdGVtT3BlcmF0b3IiKSwKCU93bmVyOiAgICB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoIml0ZW1Pd25lciIpLAoJT3RoZXI6ICAgIHRlc3R1dGlscy5UZXN0QWRkcmVzcygiaXRlbU90aGVyIiksCn0KCmZ1bmMgc2V0dXBJdGVtVGVzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdC5IZWxwZXIoKQoJcmVzZXRJdGVtU3RhdGUoKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze30pCglpZiBpdGVtVGVzdC5TZXR1cERvbmUgewoJCXJldHVybgoJfQoJb3JpZ2luYWxBZG1pbiA6PSBhZG1pbi5HZXRBZG1pbigpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihvcmlnaW5hbEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvcmlnaW5hbEFkbWluKSkKCWFkbWluLlRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuQWRtaW4pKQoJYWRtaW4uQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCWFkbWluLlNldE9wZXJhdG9yKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk9wZXJhdG9yKQoJaXRlbVRlc3QuU2V0dXBEb25lID0gdHJ1ZQp9CgpmdW5jIFRlc3RTYWZlTWludFRyYWNrc1N1cHBseShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBJdGVtVGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk9wZXJhdG9yKSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCA1KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1KSwgQmFsYW5jZU9mKGl0ZW1UZXN0Lk93bmVyLCAiNDIiKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNSksIFRvdGFsU3VwcGx5KCI0MiIpKQoJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICI0MiIsIDEpCglTYWZlTWludChjcm9zcyhjdXIpLCBpdGVtVGVzdC5PdGhlciwgIjQyIiwgMikKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNiksIEJhbGFuY2VPZihpdGVtVGVzdC5Pd25lciwgIjQyIikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIpLCBCYWxhbmNlT2YoaXRlbVRlc3QuT3RoZXIsICI0MiIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg4KSwgVG90YWxTdXBwbHkoIjQyIikpCn0KCmZ1bmMgVGVzdEl0ZW1Ub2tlbklEQWNjZXB0c09wYXF1ZVN0cmluZ3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwSXRlbVRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5PcGVyYXRvcikpCglTYWZlTWludChjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjAiLCAxKQoJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICI0Mjk0OTY3Mjk1IiwgMikKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAic3dvcmQiLCAzKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgQmFsYW5jZU9mKGl0ZW1UZXN0Lk93bmVyLCAiMCIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyKSwgVG90YWxTdXBwbHkoIjQyOTQ5NjcyOTUiKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMyksIFRvdGFsU3VwcGx5KCJzd29yZCIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ0b2tlbiBpZCBpcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIiLCAxKQoJfSkKfQoKZnVuYyBUZXN0SXRlbVRyYW5zZmVyQW5kQnVyblVwZGF0ZVN1cHBseShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBJdGVtVGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk9wZXJhdG9yKSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCA1KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk93bmVyKSkKCVNhZmVUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsIGl0ZW1UZXN0Lk90aGVyLCAiNDIiLCAyKQoJQnVybihjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjQyIiwgMSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIEJhbGFuY2VPZihpdGVtVGVzdC5Pd25lciwgIjQyIikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIpLCBCYWxhbmNlT2YoaXRlbVRlc3QuT3RoZXIsICI0MiIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg0KSwgVG90YWxTdXBwbHkoIjQyIikpCn0KCmZ1bmMgVGVzdEl0ZW1BcHByb3ZhbEFsbG93c1RyYW5zZmVyQW5kQnVybihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBJdGVtVGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk9wZXJhdG9yKSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCA1KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk93bmVyKSkKCVNldEFwcHJvdmFsRm9yQWxsKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk90aGVyLCB0cnVlKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3RoZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk90aGVyKSkKCVNhZmVUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsIGl0ZW1UZXN0LkFkbWluLCAiNDIiLCAyKQoJQnVybihjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjQyIiwgMSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIEJhbGFuY2VPZihpdGVtVGVzdC5Pd25lciwgIjQyIikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIpLCBCYWxhbmNlT2YoaXRlbVRlc3QuQWRtaW4sICI0MiIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg0KSwgVG90YWxTdXBwbHkoIjQyIikpCn0KCmZ1bmMgVGVzdFNhZmVNaW50U2VjdXJpdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwSXRlbVRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5Pd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIxIiwgMSkKCX0pCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9pdGVtX3JlbGF5IikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIxIiwgMSkKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk9wZXJhdG9yKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7InVnbm90IiwgMX19KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhdHRhY2hlZCBjb2lucyBub3QgYWxsb3dlZCIsIGZ1bmMoKSB7CgkJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIxIiwgMSkKCX0pCn0KCmZ1bmMgVGVzdEl0ZW1Pd25lZExpc3QoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwSXRlbVRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5PcGVyYXRvcikpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIEdldE93bmVkQ291bnQoaXRlbVRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oTGlzdEJ5T3duZXIoaXRlbVRlc3QuT3duZXIsIDEsIDEwKSkpCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgaXRlbSBvd25lciIsIGZ1bmMoKSB7CgkJR2V0T3duZWRDb3VudChhZGRyZXNzKCIiKSkKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInBhZ2UgbXVzdCBiZSBhdCBsZWFzdCAxIiwgZnVuYygpIHsKCQlMaXN0QnlPd25lcihpdGVtVGVzdC5Pd25lciwgMCwgMSkKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvdW50IG11c3QgYmUgYXQgbGVhc3QgMSIsIGZ1bmMoKSB7CgkJTGlzdEJ5T3duZXIoaXRlbVRlc3QuT3duZXIsIDEsIDApCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBleGNlZWRzIGxpc3RMaW1pdCAobWF4OiAxMDApIiwgZnVuYygpIHsKCQlMaXN0QnlPd25lcihpdGVtVGVzdC5Pd25lciwgMSwgMTAxKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgMTAwLCBHZXRMaXN0TGltaXQoKSkKCglTYWZlTWludChjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjEwIiwgNSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiMjAiLCAzKQoJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIzMCIsIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIEdldE93bmVkQ291bnQoaXRlbVRlc3QuT3duZXIpKQoJcGFnZTEgOj0gTGlzdEJ5T3duZXIoaXRlbVRlc3QuT3duZXIsIDEsIDIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihwYWdlMSkpCgl1YXNzZXJ0LkVxdWFsKHQsICIxMCIsIHBhZ2UxWzBdWyJ0b2tlbklkIl0pCgl1YXNzZXJ0LkVxdWFsKHQsICI1IiwgcGFnZTFbMF1bImFtb3VudCJdKQoJdWFzc2VydC5FcXVhbCh0LCAiMjAiLCBwYWdlMVsxXVsidG9rZW5JZCJdKQoJcGFnZTIgOj0gTGlzdEJ5T3duZXIoaXRlbVRlc3QuT3duZXIsIDIsIDIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGxlbihwYWdlMikpCgl1YXNzZXJ0LkVxdWFsKHQsICIzMCIsIHBhZ2UyWzBdWyJ0b2tlbklkIl0pCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihMaXN0QnlPd25lcihpdGVtVGVzdC5Pd25lciwgMywgMikpKQoJcGFnZTFbMF1bImFtb3VudCJdID0gImhhY2tlZCIKCXVhc3NlcnQuRXF1YWwodCwgIjUiLCBMaXN0QnlPd25lcihpdGVtVGVzdC5Pd25lciwgMSwgMSlbMF1bImFtb3VudCJdKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5Pd25lcikpCglTYWZlVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCBpdGVtVGVzdC5PdGhlciwgIjEwIiwgMikKCXVhc3NlcnQuRXF1YWwodCwgMywgR2V0T3duZWRDb3VudChpdGVtVGVzdC5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldE93bmVkQ291bnQoaXRlbVRlc3QuT3RoZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAiMyIsIExpc3RCeU93bmVyKGl0ZW1UZXN0Lk93bmVyLCAxLCAxMClbMF1bImFtb3VudCJdKQoJdWFzc2VydC5FcXVhbCh0LCAiMiIsIExpc3RCeU93bmVyKGl0ZW1UZXN0Lk90aGVyLCAxLCAxMClbMF1bImFtb3VudCJdKQoJU2FmZVRyYW5zZmVyRnJvbShjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgaXRlbVRlc3QuT3RoZXIsICIxMCIsIDMpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIEdldE93bmVkQ291bnQoaXRlbVRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRPd25lZENvdW50KGl0ZW1UZXN0Lk90aGVyKSkKCUJ1cm4oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIyMCIsIDMpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldE93bmVkQ291bnQoaXRlbVRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAiMzAiLCBMaXN0QnlPd25lcihpdGVtVGVzdC5Pd25lciwgMSwgMTApWzBdWyJ0b2tlbklkIl0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk9wZXJhdG9yKSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiMzAiLCAyKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRPd25lZENvdW50KGl0ZW1UZXN0Lk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgIjMiLCBMaXN0QnlPd25lcihpdGVtVGVzdC5Pd25lciwgMSwgMTApWzBdWyJhbW91bnQiXSkKfQoKZnVuYyBUZXN0U2V0TGlzdExpbWl0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEl0ZW1UZXN0KGNyb3NzKGN1ciksIHQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0LkFkbWluKSkKCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCA1MCkKCXVhc3NlcnQuRXF1YWwodCwgNTAsIEdldExpc3RMaW1pdCgpKQoKCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCAxKQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBleGNlZWRzIGxpc3RMaW1pdCAobWF4OiAxKSIsIGZ1bmMoKSB7CgkJTGlzdEJ5T3duZXIoaXRlbVRlc3QuT3duZXIsIDEsIDIpCgl9KQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibGltaXQgbXVzdCBiZSBhdCBsZWFzdCAxIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgMCkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImxpbWl0IG11c3QgYmUgYXQgbGVhc3QgMSIsIGZ1bmMoKSB7CgkJU2V0TGlzdExpbWl0KGNyb3NzKGN1ciksIC0xKQoJfSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuT3BlcmF0b3IpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCA1MCkKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgNTApCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2l0ZW1fYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgNTApCgl9KQp9CgpmdW5jIFRlc3RTZXRNaW50ZXJSZWFsbShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBJdGVtVGVzdChjcm9zcyhjdXIpLCB0KQoJbWludGVyUGF0aCA6PSAiZ25vLmxhbmQvci9leGFtcGxlL2l0ZW1fbWludGVyIgoJbWludGVyIDo9IHRlc3RpbmcuTmV3Q29kZVJlYWxtKG1pbnRlclBhdGgpCgltaW50ZXJBZGRyIDo9IG1pbnRlci5BZGRyZXNzKCkKCgl1YXNzZXJ0LkVxdWFsKHQsIG1pbnRlckFkZHIuU3RyaW5nKCksIGNoYWluLlBhY2thZ2VBZGRyZXNzKG1pbnRlclBhdGgpLlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCBmYWxzZSwgSXNNaW50ZXJSZWFsbShtaW50ZXJBZGRyKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuT3BlcmF0b3IpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksIG1pbnRlclBhdGgpCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5BZG1pbikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInBhY2thZ2UgcGF0aCBpcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgIiIpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIHBhY2thZ2UgcGF0aCIsIGZ1bmMoKSB7CgkJU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgImduby5sYW5kL3AvYWtrYWRpYS9iZXRhL2l0ZW0iKQoJfSkKCVNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksIG1pbnRlclBhdGgpCgl1YXNzZXJ0LkVxdWFsKHQsIHRydWUsIElzTWludGVyUmVhbG0obWludGVyQWRkcikpCglTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCBtaW50ZXJQYXRoKQoJdWFzc2VydC5FcXVhbCh0LCB0cnVlLCBJc01pbnRlclJlYWxtKG1pbnRlckFkZHIpKQoKCVVuc2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgbWludGVyUGF0aCkKCXVhc3NlcnQuRXF1YWwodCwgZmFsc2UsIElzTWludGVyUmVhbG0obWludGVyQWRkcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInBhY2thZ2UgcGF0aCBpcyBub3QgYSBtaW50ZXIgcmVhbG0iLCBmdW5jKCkgewoJCVVuc2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgbWludGVyUGF0aCkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInBhY2thZ2UgcGF0aCBpcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJVW5zZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCAiIikKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2l0ZW1fYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCBtaW50ZXJQYXRoKQoJfSkKfQoKZnVuYyBUZXN0U2FmZU1pbnRGcm9tUmVhbG0oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwSXRlbVRlc3QoY3Jvc3MoY3VyKSwgdCkKCW1pbnRlciA6PSB0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2l0ZW1fbWludGVyIikKCXVucmVnaXN0ZXJlZCA6PSB0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2l0ZW1fbWludGVyX290aGVyIikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBhIHJlYWxtIiwgZnVuYygpIHsKCQlTYWZlTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjEiLCAxKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHVucmVnaXN0ZXJlZCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibWludGVyIHJlYWxtIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTYWZlTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjEiLCAxKQoJfSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuQWRtaW4pKQoJU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgImduby5sYW5kL3IvZXhhbXBsZS9pdGVtX21pbnRlciIpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKG1pbnRlcikKCVNhZmVNaW50RnJvbVJlYWxtKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNyIsIDMpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMpLCBCYWxhbmNlT2YoaXRlbVRlc3QuT3duZXIsICI3IikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMpLCBUb3RhbFN1cHBseSgiNyIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRPd25lZENvdW50KGl0ZW1UZXN0Lk93bmVyKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIml0ZW0gcmVjaXBpZW50IG11c3QgYmUgb3JpZ2luIGNhbGxlciIsIGZ1bmMoKSB7CgkJU2FmZU1pbnRGcm9tUmVhbG0oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3RoZXIsICI4IiwgMSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBUb3RhbFN1cHBseSgiOCIpKQoKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7InVnbm90IiwgMX19KQoJU2FmZU1pbnRGcm9tUmVhbG0oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICI5IiwgMSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgQmFsYW5jZU9mKGl0ZW1UZXN0Lk93bmVyLCAiOSIpKQp9CgpmdW5jIFRlc3RCdXJuRnJvbVJlYWxtKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEl0ZW1UZXN0KGNyb3NzKGN1ciksIHQpCgltaW50ZXIgOj0gdGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9pdGVtX21pbnRlciIpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0Lk9wZXJhdG9yKSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCA1KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5BZG1pbikpCglTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCAiZ25vLmxhbmQvci9leGFtcGxlL2l0ZW1fbWludGVyIikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBhIHJlYWxtIiwgZnVuYygpIHsKCQlCdXJuRnJvbVJlYWxtKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCAxKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKG1pbnRlcikKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiaXRlbSBvd25lciBtdXN0IGJlIG9yaWdpbiBjYWxsZXIiLCBmdW5jKCkgewoJCUJ1cm5Gcm9tUmVhbG0oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3RoZXIsICI0MiIsIDEpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1KSwgQmFsYW5jZU9mKGl0ZW1UZXN0Lk93bmVyLCAiNDIiKSkKCglCdXJuRnJvbVJlYWxtKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCAyKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzKSwgQmFsYW5jZU9mKGl0ZW1UZXN0Lk93bmVyLCAiNDIiKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMyksIFRvdGFsU3VwcGx5KCI0MiIpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiaXRlbSBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIsIGZ1bmMoKSB7CgkJU2FmZU1pbnRGcm9tUmVhbG0oY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICI5OSIsIDApCgl9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzKSwgQmFsYW5jZU9mKGl0ZW1UZXN0Lk93bmVyLCAiNDIiKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMyksIFRvdGFsU3VwcGx5KCI0MiIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgVG90YWxTdXBwbHkoIjk5IikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldE93bmVkQ291bnQoaXRlbVRlc3QuT3duZXIpKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5BZG1pbikpCglVbnNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksICJnbm8ubGFuZC9yL2V4YW1wbGUvaXRlbV9taW50ZXIiKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKG1pbnRlcikKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibWludGVyIHJlYWxtIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlCdXJuRnJvbVJlYWxtKGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiNDIiLCAxKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMyksIEJhbGFuY2VPZihpdGVtVGVzdC5Pd25lciwgIjQyIikpCn0KGuwTCgpyZW5kZXIuZ25vEt0TcGFja2FnZSBpdGVtCgppbXBvcnQgKAoJIm5ldC91cmwiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2plcm9uaW1vYWxiaS9wYWdlci92MCIKKQoKZnVuYyBSZW5kZXIoaVVSTCBzdHJpbmcpIHN0cmluZyB7Cglhc3NlcnRSZW5kZXJVUkxMZW4oaVVSTCkKCXUsIGVyciA6PSB1cmwuUGFyc2UoaVVSTCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiByZW5kZXJJdGVtRXJyb3IoIkludmFsaWQgVVJMIikKCX0KCglzd2l0Y2ggdS5QYXRoIHsKCWNhc2UgIiI6CgkJcmV0dXJuIHJlbmRlckl0ZW1Ib21lKCkKCWNhc2UgIm93bmVyIjoKCQlyZXR1cm4gcmVuZGVySXRlbU93bmVyKGlVUkwsIGFkZHJlc3ModS5RdWVyeSgpLkdldCgiYWRkcmVzcyIpKSkKCWRlZmF1bHQ6CgkJcmV0dXJuIHJlbmRlckl0ZW1FcnJvcigiTm90IGZvdW5kIikKCX0KfQoKZnVuYyByZW5kZXJJdGVtSG9tZSgpIHN0cmluZyB7CglyZXR1cm4gYCMgQUtLQURJQSBJdGVtCgpMb29rIHVwIGZ1bmdpYmxlIGl0ZW1zIGhlbGQgYnkgYW4gYWRkcmVzcy4KCjxnbm8tZm9ybSBwYXRoPSJvd25lciI+CiAgPGduby1pbnB1dCBuYW1lPSJhZGRyZXNzIiBwbGFjZWhvbGRlcj0iRW50ZXIgdGhlIGFkZHJlc3MiIC8+CjwvZ25vLWZvcm0+CmAKfQoKZnVuYyByZW5kZXJJdGVtT3duZXIoaVVSTCBzdHJpbmcsIG93bmVyIGFkZHJlc3MpIHN0cmluZyB7CglpZiAhb3duZXIuSXNWYWxpZCgpIHsKCQlyZXR1cm4gcmVuZGVySXRlbUVycm9yKCJJbnZhbGlkIGFkZHJlc3MiKQoJfQoKCW91dHB1dCA6PSBgIyBJdGVtIEhvbGRpbmdzCgpb4oaQIEhvbWVdKC4vaXRlbTopCgoqICoqQWRkcmVzcyoqOiBgICsgb3duZXIuU3RyaW5nKCkgKyBgCmAKCgl0b3RhbCA6PSBHZXRPd25lZENvdW50KG93bmVyKQoJb3V0cHV0ICs9ICIqICoqVG90YWwqKjogIiArIHN0cmNvbnYuSXRvYSh0b3RhbCkgKyAiXG5cbiIKCWlmIHRvdGFsID09IDAgewoJCXJldHVybiBvdXRwdXQgKyBgKk5vIGl0ZW1zIGhlbGQuKgpgCgl9CgoJcGFnZVNpemUgOj0gMjAKCWlmIHBhZ2VTaXplID4gbGlzdExpbWl0IHsKCQlwYWdlU2l6ZSA9IGxpc3RMaW1pdAoJfQoJcGFnZXMsIGVyciA6PSBwYWdlci5OZXcoaVVSTCwgdG90YWwsIHBhZ2VyLldpdGhQYWdlU2l6ZShwYWdlU2l6ZSkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gcmVuZGVySXRlbUVycm9yKCJJbnZhbGlkIHBhZ2UiKQoJfQoKCXJvd3MgOj0gTGlzdEJ5T3duZXIob3duZXIsIHBhZ2VzLlBhZ2UoKSwgcGFnZXMuUGFnZVNpemUoKSkKCWZvciBfLCByb3cgOj0gcmFuZ2Ugcm93cyB7CgkJb3V0cHV0ICs9ICIqICoqIiArIGVzY2FwZUl0ZW1NYXJrZG93bihyb3dbInRva2VuSWQiXSkgKyAiKio6ICIgKyBlc2NhcGVJdGVtTWFya2Rvd24ocm93WyJhbW91bnQiXSkgKyAiXG4iCgl9CglpZiBwYWdlcy5IYXNQYWdlcygpIHsKCQlvdXRwdXQgKz0gIlxuIiArIHBhZ2VyLlBpY2tlcihwYWdlcykKCX0KCXJldHVybiBvdXRwdXQKfQoKZnVuYyByZW5kZXJJdGVtRXJyb3IobWVzc2FnZSBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gYCMgRXJyb3IKCj4gYCArIGVzY2FwZUl0ZW1NYXJrZG93bihtZXNzYWdlKSArIGAKClvihpAgSG9tZV0oLi9pdGVtOikKYAp9CgpmdW5jIGVzY2FwZUl0ZW1NYXJrZG93bih2YWx1ZSBzdHJpbmcpIHN0cmluZyB7Cgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIlxcIiwgIlxcXFwiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICJcbiIsICJcXG4iKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICJgIiwgIlxcYCIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIioiLCAiXFwqIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiXyIsICJcXF8iKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICJ7IiwgIlxceyIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIn0iLCAiXFx9IikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiWyIsICJcXFsiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICJdIiwgIlxcXSIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIigiLCAiXFwoIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiKSIsICJcXCkiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICIjIiwgIlxcIyIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIisiLCAiXFwrIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiLSIsICJcXC0iKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICIuIiwgIlxcLiIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIiEiLCAiXFwhIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAifCIsICJcXHwiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICI+IiwgIlxcPiIpCglyZXR1cm4gdmFsdWUKfQoa/BsKD3JlbmRlcl90ZXN0LmdubxLoG3BhY2thZ2UgaXRlbQoKaW1wb3J0ICgKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKZnVuYyBUZXN0UmVuZGVySG9tZUFuZE93bmVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEl0ZW1UZXN0KGNyb3NzKGN1ciksIHQpCgoJaG9tZSA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhob21lLCBgPGduby1mb3JtIHBhdGg9Im93bmVyIj5gKSwgInNob3VsZCByZW5kZXIgdGhlIG93bmVyIGxvb2t1cCBmb3JtIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGhvbWUsIGBuYW1lPSJhZGRyZXNzImApLCAic2hvdWxkIHJlbmRlciB0aGUgYWRkcmVzcyBpbnB1dCIpCgoJZW1wdHkgOj0gUmVuZGVyKCJvd25lcj9hZGRyZXNzPSIgKyBpdGVtVGVzdC5Pd25lci5TdHJpbmcoKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGVtcHR5LCBpdGVtVGVzdC5Pd25lci5TdHJpbmcoKSksICJzaG91bGQgcmVuZGVyIHRoZSBvd25lciBhZGRyZXNzIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGVtcHR5LCAiVG90YWwqKjogMCIpLCAic2hvdWxkIHJlbmRlciBhbiBlbXB0eSB0b3RhbCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhlbXB0eSwgIk5vIGl0ZW1zIGhlbGQiKSwgInNob3VsZCByZW5kZXIgYW4gZW1wdHkgaG9sZGluZyBsaXN0IikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihpdGVtVGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oaXRlbVRlc3QuT3BlcmF0b3IpKQoJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICJ0ZXN0LWlyb24iLCAzKQoJU2FmZU1pbnQoY3Jvc3MoY3VyKSwgaXRlbVRlc3QuT3duZXIsICIqKngqKiIsIDIpCgoJbGlzdGVkIDo9IFJlbmRlcigib3duZXI/YWRkcmVzcz0iICsgaXRlbVRlc3QuT3duZXIuU3RyaW5nKCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICJUb3RhbCoqOiAyIiksICJzaG91bGQgcmVuZGVyIHRoZSBvd25lZCB0b2tlbiBjb3VudCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICJ0ZXN0XFwtaXJvbiIpLCAic2hvdWxkIGVzY2FwZSBpdGVtIHRva2VuIGlkcyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICIqKjogMyIpLCAic2hvdWxkIHJlbmRlciBpdGVtIGFtb3VudHMiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMobGlzdGVkLCBgXCpcKnhcKlwqYCksICJlc2NhcGVkIG1hcmtkb3duIHRva2VuIGlkIHNob3VsZCBiZSB2aXNpYmxlIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICIqKngqKiIpLCAicmF3IG1hcmtkb3duIHRva2VuIGlkIHNob3VsZCBub3QgcmVtYWluIikKfQoKZnVuYyBUZXN0UmVuZGVyT3duZXJQYWdlc1doZW5Db3VudEV4Y2VlZHNMaW1pdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBJdGVtVGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoaXRlbVRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGl0ZW1UZXN0LkFkbWluKSkKCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCAxKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGl0ZW1UZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShpdGVtVGVzdC5PcGVyYXRvcikpCglTYWZlTWludChjcm9zcyhjdXIpLCBpdGVtVGVzdC5Pd25lciwgIjEwIiwgMSkKCVNhZmVNaW50KGNyb3NzKGN1ciksIGl0ZW1UZXN0Lk93bmVyLCAiMjAiLCAxKQoKCXBhZ2UxIDo9IFJlbmRlcigib3duZXI/YWRkcmVzcz0iICsgaXRlbVRlc3QuT3duZXIuU3RyaW5nKCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlMSwgIlRvdGFsKio6IDIiKSwgInNob3VsZCByZW5kZXIgdG90YWwgaG9sZGluZ3MiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZTEsICIqKjEwKioiKSwgInBhZ2UgMSBzaG91bGQgaW5jbHVkZSB0aGUgZmlyc3QgdG9rZW4iKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UxLCAiKioyMCoqIiksICJwYWdlIDEgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBzZWNvbmQgdG9rZW4iKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZTEsICJwYWdlIDEgb2YgMiIpLCAic2hvdWxkIHJlbmRlciBhIHBhZ2UgcGlja2VyIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UxLCAicGFnZT0yIiksICJzaG91bGQgbGluayB0byB0aGUgbmV4dCBwYWdlIikKCglwYWdlMiA6PSBSZW5kZXIoIm93bmVyP2FkZHJlc3M9IiArIGl0ZW1UZXN0Lk93bmVyLlN0cmluZygpICsgIiZwYWdlPTIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZTIsICIqKjIwKioiKSwgInBhZ2UgMiBzaG91bGQgaW5jbHVkZSB0aGUgc2Vjb25kIHRva2VuIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhwYWdlMiwgIioqMTAqKiIpLCAicGFnZSAyIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgZmlyc3QgdG9rZW4iKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZTIsICJwYWdlIDIgb2YgMiIpLCAic2hvdWxkIHJlbmRlciB0aGUgbGFzdCBwYWdlIHBpY2tlciIpCgoJaW52YWxpZFBhZ2UgOj0gUmVuZGVyKCJvd25lcj9hZGRyZXNzPSIgKyBpdGVtVGVzdC5Pd25lci5TdHJpbmcoKSArICImcGFnZT0zIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGludmFsaWRQYWdlLCAiSW52YWxpZCBwYWdlIiksICJzaG91bGQgcmVqZWN0IGEgcGFnZSBwYXN0IHRoZSBsYXN0IHBhZ2UiKQp9CgpmdW5jIFRlc3RSZW5kZXJFcnJvcnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwSXRlbVRlc3QoY3Jvc3MoY3VyKSwgdCkKCglpbnZhbGlkIDo9IFJlbmRlcigib3duZXI/YWRkcmVzcz1pbnZhbGlkLWFkZHJlc3MiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW52YWxpZCwgIkludmFsaWQgYWRkcmVzcyIpLCAic2hvdWxkIHJlamVjdCBhbiBpbnZhbGlkIGFkZHJlc3MiKQoKCXVua25vd24gOj0gUmVuZGVyKCJ1bmtub3duIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHVua25vd24sICJOb3QgZm91bmQiKSwgInNob3VsZCByZWplY3QgYW4gdW5rbm93biByb3V0ZSIpCn0KCmZ1bmMgVGVzdFJlbmRlclJlamVjdHNPdmVyc2l6ZWRVUkwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAidXJsIGV4Y2VlZHMgbWF4IHJ1bmVzIiwgZnVuYygpIHsKCQlSZW5kZXIoc3RyaW5ncy5SZXBlYXQoImEiLCByZW5kZXJVUkxNYXhSdW5lcysxKSkKCX0pCglSZW5kZXIoc3RyaW5ncy5SZXBlYXQoImEiLCByZW5kZXJVUkxNYXhSdW5lcykpCn0KGt4BCg52YWxpZGF0aW9uLmdubxLLAXBhY2thZ2UgaXRlbQoKaW1wb3J0ICJ1bmljb2RlL3V0ZjgiCgpjb25zdCByZW5kZXJVUkxNYXhSdW5lcyA9IDEwMjQKCmZ1bmMgYXNzZXJ0UmVuZGVyVVJMTGVuKHZhbHVlIHN0cmluZykgewoJaWYgdXRmOC5SdW5lQ291bnRJblN0cmluZyh2YWx1ZSkgPiByZW5kZXJVUkxNYXhSdW5lcyB7CgkJcGFuaWMoInVybCBleGNlZWRzIG1heCBydW5lcyIpCgl9Cn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhEIvKmdTxIKODMwNzh1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQItRS2vq8g7O+I4ZvJRzWH7jH0BzvxYjnsf41ryBRUbwxJAPi2weCsSp9moX0JxYhSGLCgyiD9gGZaYyLVMvVDtI41UWjUDNMr9eHq9hkC2EFCMhg+rcXrznB8fsUn5IIawqRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==