Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
827B561A29E72286FA0C94A36655A9460B1625CB1E65B03F7422190A7C7AF977
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
31,636,068
Requested gas limit
GAS USED
24,335,397
Gas consumed
FEE
31637ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1wx60nkcp5lfsxmedeg7sfs47tzxkath05u63t47000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CsyIAQoML3ZtLm1fYWRkcGtnErqIAQooZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NBL+hwEKCGdyYzcyMXYyEjxnbm8ubGFuZC9wL2cxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQvZ3JjNzIxdjIa5UEKDWJhc2ljX25mdC5nbm8S00FwYWNrYWdlIGdyYzcyMXYyCgppbXBvcnQgKAoJImNoYWluIgoJdW5zYWZlcmVhbG0gImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJIm1hdGgvb3ZlcmZsb3ciCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2F2bCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCnR5cGUgQmFzaWNORlQgc3RydWN0IHsKCW5hbWUgICAgICAgICAgICAgIHN0cmluZwoJc3ltYm9sICAgICAgICAgICAgc3RyaW5nCglvcmlnUmVhbG0gICAgICAgICBzdHJpbmcgICAvLyBvd25pbmcgcmVhbG0ncyBwYWNrYWdlIHBhdGgKCW93bmVycyAgICAgICAgICAgIGF2bC5UcmVlIC8vIHRva2VuSWQgLT4gT3duZXJBZGRyZXNzCgliYWxhbmNlcyAgICAgICAgICBhdmwuVHJlZSAvLyBPd25lckFkZHJlc3MgLT4gVG9rZW5Db3VudAoJdG9rZW5BcHByb3ZhbHMgICAgYXZsLlRyZWUgLy8gVG9rZW5JZCAtPiBBcHByb3ZlZEFkZHJlc3MKCXRva2VuVVJJcyAgICAgICAgIGF2bC5UcmVlIC8vIFRva2VuSWQgLT4gVVJJcwoJb3BlcmF0b3JBcHByb3ZhbHMgYXZsLlRyZWUgLy8gIk93bmVyQWRkcmVzczpPcGVyYXRvckFkZHJlc3MiIC0+IGJvb2wKfQoKZnVuYyBOZXdCYXNpY05GVChfIGludCwgXyByZWFsbSwgbmFtZSwgc3ltYm9sIHN0cmluZykgKkJhc2ljTkZUIHsKCXBrZ1BhdGggOj0gdW5zYWZlcmVhbG0uQ3VycmVudFJlYWxtKCkuUGtnUGF0aCgpCglpZiBwa2dQYXRoID09ICIiIHsKCQlwYW5pYyhFcnJOb3RSZWFsbSkKCX0KCWlmICF2YWxpZE5hbWUobmFtZSkgewoJCXBhbmljKEVyckludmFsaWROYW1lKQoJfQoJaWYgIXZhbGlkU3ltYm9sKHN5bWJvbCkgewoJCXBhbmljKEVyckludmFsaWRTeW1ib2wpCgl9CgoJcmV0dXJuICZCYXNpY05GVHsKCQluYW1lOiAgICAgIG5hbWUsCgkJc3ltYm9sOiAgICBzeW1ib2wsCgkJb3JpZ1JlYWxtOiBwa2dQYXRoLAoKCQlvd25lcnM6ICAgICAgICAgICAgYXZsLlRyZWV7fSwKCQliYWxhbmNlczogICAgICAgICAgYXZsLlRyZWV7fSwKCQl0b2tlbkFwcHJvdmFsczogICAgYXZsLlRyZWV7fSwKCQl0b2tlblVSSXM6ICAgICAgICAgYXZsLlRyZWV7fSwKCQlvcGVyYXRvckFwcHJvdmFsczogYXZsLlRyZWV7fSwKCX0KfQoKZnVuYyAocyAqQmFzaWNORlQpIE5hbWUoKSBzdHJpbmcgICAgICB7IHJldHVybiBzLm5hbWUgfQpmdW5jIChzICpCYXNpY05GVCkgU3ltYm9sKCkgc3RyaW5nICAgIHsgcmV0dXJuIHMuc3ltYm9sIH0KZnVuYyAocyAqQmFzaWNORlQpIFRva2VuQ291bnQoKSBpbnQ2NCB7IHJldHVybiBpbnQ2NChzLm93bmVycy5TaXplKCkpIH0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBJRCgpIHN0cmluZyB7CglyZXR1cm4gcy5vcmlnUmVhbG0gKyAiLiIgKyBzLnN5bWJvbAp9CgpmdW5jIChzICpCYXNpY05GVCkgQmFsYW5jZU9mKGFkZHIgYWRkcmVzcykgKGludDY0LCBlcnJvcikgewoJaWYgZXJyIDo9IGlzVmFsaWRBZGRyZXNzKGFkZHIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJYmFsYW5jZSA6PSBzLmJhbGFuY2VzLkdldChhZGRyLlN0cmluZygpKQoJaWYgYmFsYW5jZSA9PSBuaWwgewoJCXJldHVybiAwLCBuaWwKCX0KCglyZXR1cm4gYmFsYW5jZS4oaW50NjQpLCBuaWwKfQoKZnVuYyAocyAqQmFzaWNORlQpIE93bmVyT2YodGlkIFRva2VuSUQpIChhZGRyZXNzLCBlcnJvcikgewoJb3duZXIgOj0gcy5vd25lcnMuR2V0KHN0cmluZyh0aWQpKQoJaWYgb3duZXIgPT0gbmlsIHsKCQlyZXR1cm4gIiIsIEVyckludmFsaWRUb2tlbklkCgl9CgoJcmV0dXJuIG93bmVyLihhZGRyZXNzKSwgbmlsCn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBUb2tlblVSSSh0aWQgVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCXVyaSA6PSBzLnRva2VuVVJJcy5HZXQodGlkLlN0cmluZygpKQoJaWYgdXJpID09IG5pbCB7CgkJcmV0dXJuICIiLCBFcnJJbnZhbGlkVG9rZW5JZAoJfQoKCXJldHVybiB1cmkuKHN0cmluZyksIG5pbAp9CgpmdW5jIChzICpCYXNpY05GVCkgU2V0VG9rZW5VUkkoY2FsbGVyIGFkZHJlc3MsIHRpZCBUb2tlbklELCB0VVJJIFRva2VuVVJJKSAoYm9vbCwgZXJyb3IpIHsKCWlmICFzLmV4aXN0cyh0aWQpIHsKCQlyZXR1cm4gZmFsc2UsIEVyckludmFsaWRUb2tlbklkCgl9CgoJb3duZXIsIGVyciA6PSBzLk93bmVyT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGZhbHNlLCBlcnIKCX0KCWlmIGNhbGxlciAhPSBvd25lciB7CgkJcmV0dXJuIGZhbHNlLCBFcnJDYWxsZXJJc05vdE93bmVyCgl9CglzLnRva2VuVVJJcy5TZXQodGlkLlN0cmluZygpLCB0VVJJLlN0cmluZygpKQoKCWNoYWluLkVtaXQoCgkJVG9rZW5VUklVcGRhdGVFdmVudCwKCQkidG9rZW4iLCBzLklEKCksCgkJInRva2VuSWQiLCB0aWQuU3RyaW5nKCksCgkpCgoJcmV0dXJuIHRydWUsIG5pbAp9CgpmdW5jIChzICpCYXNpY05GVCkgSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IgYWRkcmVzcykgYm9vbCB7CglrZXkgOj0gb3duZXIuU3RyaW5nKCkgKyAiOiIgKyBvcGVyYXRvci5TdHJpbmcoKQoJYXBwcm92ZWQgOj0gcy5vcGVyYXRvckFwcHJvdmFscy5HZXQoa2V5KQoJaWYgYXBwcm92ZWQgPT0gbmlsIHsKCQlyZXR1cm4gZmFsc2UKCX0KCglyZXR1cm4gYXBwcm92ZWQuKGJvb2wpCn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBBcHByb3ZlKGNhbGxlciwgdG8gYWRkcmVzcywgdGlkIFRva2VuSUQpIGVycm9yIHsKCWlmIGVyciA6PSBpc1ZhbGlkQWRkcmVzcyh0byk7IGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglvd25lciwgZXJyIDo9IHMuT3duZXJPZih0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiBvd25lciA9PSB0byB7CgkJcmV0dXJuIEVyckFwcHJvdmFsVG9DdXJyZW50T3duZXIKCX0KCglpZiBjYWxsZXIgIT0gb3duZXIgJiYgIXMuSXNBcHByb3ZlZEZvckFsbChvd25lciwgY2FsbGVyKSB7CgkJcmV0dXJuIEVyckNhbGxlcklzTm90T3duZXJPckFwcHJvdmVkCgl9CgoJdGlkU3RyIDo9IHRpZC5TdHJpbmcoKQoJcy50b2tlbkFwcHJvdmFscy5TZXQodGlkU3RyLCB0bykKCgljaGFpbi5FbWl0KAoJCUFwcHJvdmFsRXZlbnQsCgkJInRva2VuIiwgcy5JRCgpLAoJCSJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJ0byIsIHRvLlN0cmluZygpLAoJCSJ0b2tlbklkIiwgdGlkU3RyLAoJKQoKCXJldHVybiBuaWwKfQoKZnVuYyAocyAqQmFzaWNORlQpIEdldEFwcHJvdmVkKHRpZCBUb2tlbklEKSAoYWRkcmVzcywgZXJyb3IpIHsKCWFkZHIgOj0gcy50b2tlbkFwcHJvdmFscy5HZXQodGlkLlN0cmluZygpKQoJaWYgYWRkciA9PSBuaWwgewoJCXJldHVybiB6ZXJvQWRkcmVzcywgRXJyVG9rZW5JZE5vdEhhc0FwcHJvdmVkCgl9CgoJcmV0dXJuIGFkZHIuKGFkZHJlc3MpLCBuaWwKfQoKZnVuYyAocyAqQmFzaWNORlQpIFNldEFwcHJvdmFsRm9yQWxsKGNhbGxlciwgb3BlcmF0b3IgYWRkcmVzcywgYXBwcm92ZWQgYm9vbCkgZXJyb3IgewoJaWYgZXJyIDo9IGlzVmFsaWRBZGRyZXNzKG9wZXJhdG9yKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIEVyckludmFsaWRBZGRyZXNzCgl9CglyZXR1cm4gcy5zZXRBcHByb3ZhbEZvckFsbChjYWxsZXIsIG9wZXJhdG9yLCBhcHByb3ZlZCkKfQoKZnVuYyAocyAqQmFzaWNORlQpIFNhZmVUcmFuc2ZlckZyb20oY2FsbGVyLCBmcm9tLCB0byBhZGRyZXNzLCB0aWQgVG9rZW5JRCkgZXJyb3IgewoJaWYgIXMuaXNBcHByb3ZlZE9yT3duZXIoY2FsbGVyLCB0aWQpIHsKCQlyZXR1cm4gRXJyQ2FsbGVySXNOb3RPd25lck9yQXBwcm92ZWQKCX0KCgllcnIgOj0gcy50cmFuc2Zlcihmcm9tLCB0bywgdGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWlmICFzLmNoZWNrT25HUkM3MjFSZWNlaXZlZChmcm9tLCB0bywgdGlkKSB7CgkJcmV0dXJuIEVyclRyYW5zZmVyVG9Ob25HUkM3MjFSZWNlaXZlcgoJfQoKCXJldHVybiBuaWwKfQoKZnVuYyAocyAqQmFzaWNORlQpIFRyYW5zZmVyRnJvbShjYWxsZXIsIGZyb20sIHRvIGFkZHJlc3MsIHRpZCBUb2tlbklEKSBlcnJvciB7CglpZiAhcy5pc0FwcHJvdmVkT3JPd25lcihjYWxsZXIsIHRpZCkgewoJCXJldHVybiBFcnJDYWxsZXJJc05vdE93bmVyT3JBcHByb3ZlZAoJfQoKCWVyciA6PSBzLnRyYW5zZmVyKGZyb20sIHRvLCB0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJcmV0dXJuIG5pbAp9CgpmdW5jIChzICpCYXNpY05GVCkgTWludCh0byBhZGRyZXNzLCB0aWQgVG9rZW5JRCkgZXJyb3IgewoJcmV0dXJuIHMubWludCh0bywgdGlkKQp9CgpmdW5jIChzICpCYXNpY05GVCkgU2FmZU1pbnQodG8gYWRkcmVzcywgdGlkIFRva2VuSUQpIGVycm9yIHsKCWVyciA6PSBzLm1pbnQodG8sIHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglpZiAhcy5jaGVja09uR1JDNzIxUmVjZWl2ZWQoemVyb0FkZHJlc3MsIHRvLCB0aWQpIHsKCQlyZXR1cm4gRXJyVHJhbnNmZXJUb05vbkdSQzcyMVJlY2VpdmVyCgl9CgoJcmV0dXJuIG5pbAp9CgpmdW5jIChzICpCYXNpY05GVCkgQnVybih0aWQgVG9rZW5JRCkgZXJyb3IgewoJb3duZXIsIGVyciA6PSBzLk93bmVyT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCXMuYmVmb3JlVG9rZW5UcmFuc2Zlcihvd25lciwgemVyb0FkZHJlc3MsIHRpZCwgMSkKCgl0aWRTdHIgOj0gdGlkLlN0cmluZygpCglzLnRva2VuQXBwcm92YWxzLlJlbW92ZSh0aWRTdHIpCgliYWxhbmNlLCBlcnIgOj0gcy5CYWxhbmNlT2Yob3duZXIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgliYWxhbmNlID0gb3ZlcmZsb3cuU3ViNjRwKGJhbGFuY2UsIDEpCgoJb3duZXJTdHIgOj0gb3duZXIuU3RyaW5nKCkKCXMuYmFsYW5jZXMuU2V0KG93bmVyU3RyLCBiYWxhbmNlKQoJcy5vd25lcnMuUmVtb3ZlKHRpZFN0cikKCgljaGFpbi5FbWl0KAoJCUJ1cm5FdmVudCwKCQkidG9rZW4iLCBzLklEKCksCgkJImZyb20iLCBvd25lclN0ciwKCQkidG9rZW5JZCIsIHRpZFN0ciwKCSkKCglzLmFmdGVyVG9rZW5UcmFuc2Zlcihvd25lciwgemVyb0FkZHJlc3MsIHRpZCwgMSkKCglyZXR1cm4gbmlsCn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBzZXRBcHByb3ZhbEZvckFsbChvd25lciwgb3BlcmF0b3IgYWRkcmVzcywgYXBwcm92ZWQgYm9vbCkgZXJyb3IgewoJaWYgb3duZXIgPT0gb3BlcmF0b3IgewoJCXJldHVybiBFcnJBcHByb3ZhbFRvQ3VycmVudE93bmVyCgl9CgoJa2V5IDo9IG93bmVyLlN0cmluZygpICsgIjoiICsgb3BlcmF0b3IuU3RyaW5nKCkKCXMub3BlcmF0b3JBcHByb3ZhbHMuU2V0KGtleSwgYXBwcm92ZWQpCgoJY2hhaW4uRW1pdCgKCQlBcHByb3ZhbEZvckFsbEV2ZW50LAoJCSJ0b2tlbiIsIHMuSUQoKSwKCQkib3duZXIiLCBvd25lci5TdHJpbmcoKSwKCQkidG8iLCBvcGVyYXRvci5TdHJpbmcoKSwKCQkiYXBwcm92ZWQiLCBzdHJjb252LkZvcm1hdEJvb2woYXBwcm92ZWQpLAoJKQoKCXJldHVybiBuaWwKfQoKZnVuYyAocyAqQmFzaWNORlQpIHRyYW5zZmVyKGZyb20sIHRvIGFkZHJlc3MsIHRpZCBUb2tlbklEKSBlcnJvciB7CglpZiBlcnIgOj0gaXNWYWxpZEFkZHJlc3MoZnJvbSk7IGVyciAhPSBuaWwgewoJCXJldHVybiBFcnJJbnZhbGlkQWRkcmVzcwoJfQoJaWYgZXJyIDo9IGlzVmFsaWRBZGRyZXNzKHRvKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIEVyckludmFsaWRBZGRyZXNzCgl9CgoJaWYgZnJvbSA9PSB0byB7CgkJcmV0dXJuIEVyckNhbm5vdFRyYW5zZmVyVG9TZWxmCgl9CgoJb3duZXIsIGVyciA6PSBzLk93bmVyT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgb3duZXIgIT0gZnJvbSB7CgkJcmV0dXJuIEVyclRyYW5zZmVyRnJvbUluY29ycmVjdE93bmVyCgl9CgoJcy5iZWZvcmVUb2tlblRyYW5zZmVyKGZyb20sIHRvLCB0aWQsIDEpCgoJb3duZXIsIGVyciA9IHMuT3duZXJPZih0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiBvd25lciAhPSBmcm9tIHsKCQlyZXR1cm4gRXJyVHJhbnNmZXJGcm9tSW5jb3JyZWN0T3duZXIKCX0KCgl0aWRTdHIgOj0gdGlkLlN0cmluZygpCglzLnRva2VuQXBwcm92YWxzLlJlbW92ZSh0aWRTdHIpCglmcm9tQmFsYW5jZSwgZXJyIDo9IHMuQmFsYW5jZU9mKGZyb20pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9Cgl0b0JhbGFuY2UsIGVyciA6PSBzLkJhbGFuY2VPZih0bykKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCWZyb21CYWxhbmNlID0gb3ZlcmZsb3cuU3ViNjRwKGZyb21CYWxhbmNlLCAxKQoJdG9CYWxhbmNlID0gb3ZlcmZsb3cuQWRkNjRwKHRvQmFsYW5jZSwgMSkKCglmcm9tU3RyIDo9IGZyb20uU3RyaW5nKCkKCXRvU3RyIDo9IHRvLlN0cmluZygpCgoJcy5iYWxhbmNlcy5TZXQoZnJvbVN0ciwgZnJvbUJhbGFuY2UpCglzLmJhbGFuY2VzLlNldCh0b1N0ciwgdG9CYWxhbmNlKQoJcy5vd25lcnMuU2V0KHRpZFN0ciwgdG8pCgoJY2hhaW4uRW1pdCgKCQlUcmFuc2ZlckV2ZW50LAoJCSJ0b2tlbiIsIHMuSUQoKSwKCQkiZnJvbSIsIGZyb21TdHIsCgkJInRvIiwgdG9TdHIsCgkJInRva2VuSWQiLCB0aWRTdHIsCgkpCgoJcy5hZnRlclRva2VuVHJhbnNmZXIoZnJvbSwgdG8sIHRpZCwgMSkKCglyZXR1cm4gbmlsCn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBtaW50KHRvIGFkZHJlc3MsIHRpZCBUb2tlbklEKSBlcnJvciB7CglpZiBlcnIgOj0gaXNWYWxpZEFkZHJlc3ModG8pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJaWYgcy5leGlzdHModGlkKSB7CgkJcmV0dXJuIEVyclRva2VuSWRBbHJlYWR5RXhpc3RzCgl9CgoJcy5iZWZvcmVUb2tlblRyYW5zZmVyKHplcm9BZGRyZXNzLCB0bywgdGlkLCAxKQoKCWlmIHMuZXhpc3RzKHRpZCkgewoJCXJldHVybiBFcnJUb2tlbklkQWxyZWFkeUV4aXN0cwoJfQoKCXRvQmFsYW5jZSwgZXJyIDo9IHMuQmFsYW5jZU9mKHRvKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJdG9CYWxhbmNlID0gb3ZlcmZsb3cuQWRkNjRwKHRvQmFsYW5jZSwgMSkKCXRvU3RyIDo9IHRvLlN0cmluZygpCgl0aWRTdHIgOj0gdGlkLlN0cmluZygpCglzLmJhbGFuY2VzLlNldCh0b1N0ciwgdG9CYWxhbmNlKQoJcy5vd25lcnMuU2V0KHRpZFN0ciwgdG8pCgoJY2hhaW4uRW1pdCgKCQlNaW50RXZlbnQsCgkJInRva2VuIiwgcy5JRCgpLAoJCSJ0byIsIHRvU3RyLAoJCSJ0b2tlbklkIiwgdGlkU3RyLAoJKQoKCXMuYWZ0ZXJUb2tlblRyYW5zZmVyKHplcm9BZGRyZXNzLCB0bywgdGlkLCAxKQoKCXJldHVybiBuaWwKfQoKZnVuYyAocyAqQmFzaWNORlQpIGlzQXBwcm92ZWRPck93bmVyKGFkZHIgYWRkcmVzcywgdGlkIFRva2VuSUQpIGJvb2wgewoJb3duZXIgOj0gcy5vd25lcnMuR2V0KHRpZC5TdHJpbmcoKSkKCWlmIG93bmVyID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CgoJb3duZXJBZGRyIDo9IG93bmVyLihhZGRyZXNzKQoJaWYgYWRkciA9PSBvd25lckFkZHIgfHwgcy5Jc0FwcHJvdmVkRm9yQWxsKG93bmVyQWRkciwgYWRkcikgewoJCXJldHVybiB0cnVlCgl9CgoJYXBwcm92ZWQsIGVyciA6PSBzLkdldEFwcHJvdmVkKHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBmYWxzZQoJfQoKCXJldHVybiBhcHByb3ZlZCA9PSBhZGRyCn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBleGlzdHModGlkIFRva2VuSUQpIGJvb2wgewoJcmV0dXJuIHMub3duZXJzLkhhcyh0aWQuU3RyaW5nKCkpCn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBiZWZvcmVUb2tlblRyYW5zZmVyKGZyb20sIHRvIGFkZHJlc3MsIGZpcnN0VG9rZW5JZCBUb2tlbklELCBiYXRjaFNpemUgaW50NjQpIHsKfQoKZnVuYyAocyAqQmFzaWNORlQpIGFmdGVyVG9rZW5UcmFuc2Zlcihmcm9tLCB0byBhZGRyZXNzLCBmaXJzdFRva2VuSWQgVG9rZW5JRCwgYmF0Y2hTaXplIGludDY0KSB7Cn0KCmZ1bmMgKHMgKkJhc2ljTkZUKSBjaGVja09uR1JDNzIxUmVjZWl2ZWQoZnJvbSwgdG8gYWRkcmVzcywgdGlkIFRva2VuSUQpIGJvb2wgewoJcmV0dXJuIHRydWUKfQoKZnVuYyAocyAqQmFzaWNORlQpIFJlbmRlckhvbWUoKSAoc3RyIHN0cmluZykgewoJc3RyICs9IHVmbXQuU3ByaW50ZigiIyAlcyAoJCVzKVxuXG4iLCBzLm5hbWUsIHMuc3ltYm9sKQoJc3RyICs9IHVmbXQuU3ByaW50ZigiKiAqKlRvdGFsIHN1cHBseSoqOiAlZFxuIiwgcy5Ub2tlbkNvdW50KCkpCglzdHIgKz0gdWZtdC5TcHJpbnRmKCIqICoqS25vd24gYWNjb3VudHMqKjogJWRcbiIsIHMuYmFsYW5jZXMuU2l6ZSgpKQoKCXJldHVybgp9CgpmdW5jIChuICpCYXNpY05GVCkgR2V0dGVyKCkgTkZUR2V0dGVyIHsKCXJldHVybiBmdW5jKCkgSUdSQzcyMVJlYWRlciB7CgkJcmV0dXJuIG4KCX0KfQoanwkKCmVycm9ycy5nbm8SkAlwYWNrYWdlIGdyYzcyMXYyCgppbXBvcnQgImVycm9ycyIKCnZhciAoCglFcnJJbnZhbGlkVG9rZW5JZCAgICAgICAgICAgICAgPSBlcnJvcnMuTmV3KCJpbnZhbGlkIHRva2VuIGlkIikKCUVyckludmFsaWRBZGRyZXNzICAgICAgICAgICAgICA9IGVycm9ycy5OZXcoImludmFsaWQgYWRkcmVzcyIpCglFcnJUb2tlbklkTm90SGFzQXBwcm92ZWQgICAgICAgPSBlcnJvcnMuTmV3KCJ0b2tlbiBpZCBub3QgYXBwcm92ZWQgZm9yIGFueW9uZSIpCglFcnJBcHByb3ZhbFRvQ3VycmVudE93bmVyICAgICAgPSBlcnJvcnMuTmV3KCJhcHByb3ZhbCB0byBjdXJyZW50IG93bmVyIikKCUVyckNhbGxlcklzTm90T3duZXIgICAgICAgICAgICA9IGVycm9ycy5OZXcoImNhbGxlciBpcyBub3QgdG9rZW4gb3duZXIiKQoJRXJyQ2FsbGVyTm90QXBwcm92ZWRGb3JBbGwgICAgID0gZXJyb3JzLk5ldygiY2FsbGVyIGlzIG5vdCBhcHByb3ZlZCBmb3IgYWxsIikKCUVyckNhbm5vdFRyYW5zZmVyVG9TZWxmICAgICAgICA9IGVycm9ycy5OZXcoImNhbm5vdCBzZW5kIHRyYW5zZmVyIHRvIHNlbGYiKQoJRXJyVHJhbnNmZXJGcm9tSW5jb3JyZWN0T3duZXIgID0gZXJyb3JzLk5ldygidHJhbnNmZXIgZnJvbSBpbmNvcnJlY3Qgb3duZXIiKQoJRXJyVHJhbnNmZXJUb05vbkdSQzcyMVJlY2VpdmVyID0gZXJyb3JzLk5ldygidHJhbnNmZXIgdG8gbm9uIEdSQzcyMVJlY2VpdmVyIGltcGxlbWVudGVyIikKCUVyckNhbGxlcklzTm90T3duZXJPckFwcHJvdmVkICA9IGVycm9ycy5OZXcoImNhbGxlciBpcyBub3QgdG9rZW4gb3duZXIgb3IgYXBwcm92ZWQiKQoJRXJyVG9rZW5JZEFscmVhZHlFeGlzdHMgICAgICAgID0gZXJyb3JzLk5ldygidG9rZW4gaWQgYWxyZWFkeSBleGlzdHMiKQoKCUVyck5vdFJlYWxtICAgICAgPSBlcnJvcnMuTmV3KCJybG0gbXVzdCBiZSBhIHJlYWxtIChnb3QgRU9BL29yaWdpbikiKQoJRXJySW52YWxpZE5hbWUgICA9IGVycm9ycy5OZXcoImludmFsaWQgdG9rZW4gbmFtZSAoZW1wdHksIHRvbyBsb25nLCBvciBjb250YWlucyBjb250cm9sIGNoYXJzKSIpCglFcnJJbnZhbGlkU3ltYm9sID0gZXJyb3JzLk5ldygiaW52YWxpZCB0b2tlbiBzeW1ib2wgKGVtcHR5LCB0b28gbG9uZywgb3IgY29udGFpbnMgY2hhcnMgb3V0c2lkZSBbQS1aYS16MC05Xy1dKSIpCikKGmMKC2dub21vZC50b21sElRtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2dyYzcyMXYyIgpnbm8gPSAiMC45IgoarCQKE2dyYzcyMV9tZXRhZGF0YS5nbm8SlCRwYWNrYWdlIGdyYzcyMXYyCgppbXBvcnQgKAoJImNoYWluIgoJImVuY29kaW5nL2Jhc2U2NCIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQvYXZsIgopCgp0eXBlIE1ldGFkYXRhTkZUIHN0cnVjdCB7CgkqQmFzaWNORlQKCWV4dGVuc2lvbnMgKmF2bC5UcmVlIC8vIEFWTCB0cmVlIGZvciBzdG9yaW5nIG1ldGFkYXRhIGV4dGVuc2lvbnMKfQoKdmFyIF8gSUdSQzcyMU1ldGFkYXRhT25jaGFpbiA9ICgqTWV0YWRhdGFORlQpKG5pbCkKCmZ1bmMgTmV3TkZUV2l0aE1ldGFkYXRhKF8gaW50LCBybG0gcmVhbG0sIG5hbWUsIHN5bWJvbCBzdHJpbmcpICpNZXRhZGF0YU5GVCB7CglyZXR1cm4gJk1ldGFkYXRhTkZUewoJCUJhc2ljTkZUOiAgIE5ld0Jhc2ljTkZUKDAsIHJsbSwgbmFtZSwgc3ltYm9sKSwKCQlleHRlbnNpb25zOiBhdmwuTmV3VHJlZSgpLAoJfQp9CgpmdW5jIChzICpNZXRhZGF0YU5GVCkgU2V0VG9rZW5NZXRhZGF0YShjYWxsZXIgYWRkcmVzcywgdGlkIFRva2VuSUQsIG1ldGFkYXRhIE1ldGFkYXRhKSBlcnJvciB7Cglvd25lciwgZXJyIDo9IHMuT3duZXJPZih0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiBjYWxsZXIgIT0gb3duZXIgewoJCXJldHVybiBFcnJDYWxsZXJJc05vdE93bmVyCgl9CgoJcy5leHRlbnNpb25zLlNldCh0aWQuU3RyaW5nKCksIG1ldGFkYXRhKQoKCWNoYWluLkVtaXQoCgkJTWV0YWRhdGFVcGRhdGVFdmVudCwKCQkidG9rZW4iLCBzLklEKCksCgkJInRva2VuSWQiLCB0aWQuU3RyaW5nKCksCgkpCgoJcmV0dXJuIG5pbAp9CgpmdW5jIChzICpNZXRhZGF0YU5GVCkgVG9rZW5NZXRhZGF0YSh0aWQgVG9rZW5JRCkgKE1ldGFkYXRhLCBlcnJvcikgewoJbWV0YWRhdGEgOj0gcy5leHRlbnNpb25zLkdldCh0aWQuU3RyaW5nKCkpCglpZiBtZXRhZGF0YSA9PSBuaWwgewoJCXJldHVybiBNZXRhZGF0YXt9LCBFcnJJbnZhbGlkVG9rZW5JZAoJfQoKCXJldHVybiBtZXRhZGF0YS4oTWV0YWRhdGEpLCBuaWwKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIE5hbWUoKSBzdHJpbmcgewoJcmV0dXJuIHMuQmFzaWNORlQuTmFtZSgpCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBTeW1ib2woKSBzdHJpbmcgewoJcmV0dXJuIHMuQmFzaWNORlQuU3ltYm9sKCkKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIFRva2VuQ291bnQoKSBpbnQ2NCB7CglyZXR1cm4gcy5CYXNpY05GVC5Ub2tlbkNvdW50KCkKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIEJhbGFuY2VPZihhZGRyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBzLkJhc2ljTkZULkJhbGFuY2VPZihhZGRyKQp9CgpmdW5jIChzICpNZXRhZGF0YU5GVCkgT3duZXJPZih0aWQgVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKSB7CglyZXR1cm4gcy5CYXNpY05GVC5Pd25lck9mKHRpZCkKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIFRva2VuVVJJKHRpZCBUb2tlbklEKSAoc3RyaW5nLCBlcnJvcikgewoJbWV0YWRhdGEsIGVyciA6PSBzLlRva2VuTWV0YWRhdGEodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCXJldHVybiBtZXRhZGF0YURhdGFVUkkobWV0YWRhdGEpLCBuaWwKfQoKZnVuYyBqc29uRXNjYXBlKHMgc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglmb3IgXywgciA6PSByYW5nZSBzIHsKCQlzd2l0Y2ggciB7CgkJY2FzZSAnXFwnOgoJCQliLldyaXRlU3RyaW5nKGBcXGApCgkJY2FzZSAnIic6CgkJCWIuV3JpdGVTdHJpbmcoYFwiYCkKCQljYXNlICdcbic6CgkJCWIuV3JpdGVTdHJpbmcoYFxuYCkKCQljYXNlICdccic6CgkJCWIuV3JpdGVTdHJpbmcoYFxyYCkKCQljYXNlICdcdCc6CgkJCWIuV3JpdGVTdHJpbmcoYFx0YCkKCQlkZWZhdWx0OgoJCQliLldyaXRlUnVuZShyKQoJCX0KCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgbWV0YWRhdGFEYXRhVVJJKG0gTWV0YWRhdGEpIHN0cmluZyB7CglpbWFnZSA6PSBtLkltYWdlCglpZiBpbWFnZSA9PSAiIiB7CgkJaW1hZ2UgPSBtLkltYWdlRGF0YQoJfQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyhgeyJuYW1lIjoiYCkKCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLk5hbWUpKQoJYi5Xcml0ZVN0cmluZyhgIiwiZGVzY3JpcHRpb24iOiJgKQoJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKG0uRGVzY3JpcHRpb24pKQoJYi5Xcml0ZVN0cmluZyhgIiwiaW1hZ2UiOiJgKQoJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKGltYWdlKSkKCWIuV3JpdGVTdHJpbmcoYCJgKQoJaWYgbS5FeHRlcm5hbFVSTCAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZyhgLCJleHRlcm5hbF91cmwiOiJgKQoJCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLkV4dGVybmFsVVJMKSkKCQliLldyaXRlU3RyaW5nKGAiYCkKCX0KCWlmIG0uQmFja2dyb3VuZENvbG9yICE9ICIiIHsKCQliLldyaXRlU3RyaW5nKGAsImJhY2tncm91bmRfY29sb3IiOiJgKQoJCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLkJhY2tncm91bmRDb2xvcikpCgkJYi5Xcml0ZVN0cmluZyhgImApCgl9CglpZiBtLkFuaW1hdGlvblVSTCAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZyhgLCJhbmltYXRpb25fdXJsIjoiYCkKCQliLldyaXRlU3RyaW5nKGpzb25Fc2NhcGUobS5BbmltYXRpb25VUkwpKQoJCWIuV3JpdGVTdHJpbmcoYCJgKQoJfQoJaWYgbS5Zb3V0dWJlVVJMICE9ICIiIHsKCQliLldyaXRlU3RyaW5nKGAsInlvdXR1YmVfdXJsIjoiYCkKCQliLldyaXRlU3RyaW5nKGpzb25Fc2NhcGUobS5Zb3V0dWJlVVJMKSkKCQliLldyaXRlU3RyaW5nKGAiYCkKCX0KCWIuV3JpdGVTdHJpbmcoYCwiYXR0cmlidXRlcyI6W2ApCglmb3IgaSwgdCA6PSByYW5nZSBtLkF0dHJpYnV0ZXMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoYHsidHJhaXRfdHlwZSI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKHQuVHJhaXRUeXBlKSkKCQliLldyaXRlU3RyaW5nKGAiLCJ2YWx1ZSI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKHQuVmFsdWUpKQoJCWIuV3JpdGVTdHJpbmcoYCJ9YCkKCX0KCWIuV3JpdGVTdHJpbmcoIl19IikKCglyZXR1cm4gImRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoYi5TdHJpbmcoKSkpCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBTZXRUb2tlblVSSShjYWxsZXIgYWRkcmVzcywgdGlkIFRva2VuSUQsIHRVUkkgVG9rZW5VUkkpIChib29sLCBlcnJvcikgewoJcmV0dXJuIHMuQmFzaWNORlQuU2V0VG9rZW5VUkkoY2FsbGVyLCB0aWQsIHRVUkkpCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sIHsKCXJldHVybiBzLkJhc2ljTkZULklzQXBwcm92ZWRGb3JBbGwob3duZXIsIG9wZXJhdG9yKQp9CgpmdW5jIChzICpNZXRhZGF0YU5GVCkgQXBwcm92ZShjYWxsZXIsIHRvIGFkZHJlc3MsIHRpZCBUb2tlbklEKSBlcnJvciB7CglyZXR1cm4gcy5CYXNpY05GVC5BcHByb3ZlKGNhbGxlciwgdG8sIHRpZCkKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIEdldEFwcHJvdmVkKHRpZCBUb2tlbklEKSAoYWRkcmVzcywgZXJyb3IpIHsKCXJldHVybiBzLkJhc2ljTkZULkdldEFwcHJvdmVkKHRpZCkKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIFNldEFwcHJvdmFsRm9yQWxsKGNhbGxlciwgb3BlcmF0b3IgYWRkcmVzcywgYXBwcm92ZWQgYm9vbCkgZXJyb3IgewoJcmV0dXJuIHMuQmFzaWNORlQuU2V0QXBwcm92YWxGb3JBbGwoY2FsbGVyLCBvcGVyYXRvciwgYXBwcm92ZWQpCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBTYWZlVHJhbnNmZXJGcm9tKGNhbGxlciwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIFRva2VuSUQpIGVycm9yIHsKCXJldHVybiBzLkJhc2ljTkZULlNhZmVUcmFuc2ZlckZyb20oY2FsbGVyLCBmcm9tLCB0bywgdGlkKQp9CgpmdW5jIChzICpNZXRhZGF0YU5GVCkgVHJhbnNmZXJGcm9tKGNhbGxlciwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIFRva2VuSUQpIGVycm9yIHsKCXJldHVybiBzLkJhc2ljTkZULlRyYW5zZmVyRnJvbShjYWxsZXIsIGZyb20sIHRvLCB0aWQpCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBNaW50KHRvIGFkZHJlc3MsIHRpZCBUb2tlbklEKSBlcnJvciB7CglyZXR1cm4gcy5CYXNpY05GVC5NaW50KHRvLCB0aWQpCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBTYWZlTWludCh0byBhZGRyZXNzLCB0aWQgVG9rZW5JRCkgZXJyb3IgewoJcmV0dXJuIHMuQmFzaWNORlQuU2FmZU1pbnQodG8sIHRpZCkKfQoKZnVuYyAocyAqTWV0YWRhdGFORlQpIEJ1cm4odGlkIFRva2VuSUQpIGVycm9yIHsKCWlmIGVyciA6PSBzLkJhc2ljTkZULkJ1cm4odGlkKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJcy5leHRlbnNpb25zLlJlbW92ZSh0aWQuU3RyaW5nKCkpCglyZXR1cm4gbmlsCn0KCmZ1bmMgKHMgKk1ldGFkYXRhTkZUKSBSZW5kZXJIb21lKCkgc3RyaW5nIHsKCXJldHVybiBzLkJhc2ljTkZULlJlbmRlckhvbWUoKQp9ChrlBQoLaWdyYzcyMS5nbm8S1QVwYWNrYWdlIGdyYzcyMXYyCgp0eXBlIElHUkM3MjFSZWFkZXIgaW50ZXJmYWNlIHsKCU5hbWUoKSBzdHJpbmcKCVN5bWJvbCgpIHN0cmluZwoJVG9rZW5Db3VudCgpIGludDY0CglCYWxhbmNlT2Yob3duZXIgYWRkcmVzcykgKGludDY0LCBlcnJvcikKCU93bmVyT2YodGlkIFRva2VuSUQpIChhZGRyZXNzLCBlcnJvcikKCUdldEFwcHJvdmVkKHRpZCBUb2tlbklEKSAoYWRkcmVzcywgZXJyb3IpCglJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sCn0KCnR5cGUgKAoJVG9rZW5JRCAgc3RyaW5nCglUb2tlblVSSSBzdHJpbmcKKQoKZnVuYyAodCBUb2tlbklEKSBTdHJpbmcoKSBzdHJpbmcgIHsgcmV0dXJuIHN0cmluZyh0KSB9CmZ1bmMgKHQgVG9rZW5VUkkpIFN0cmluZygpIHN0cmluZyB7IHJldHVybiBzdHJpbmcodCkgfQoKY29uc3QgKAoJTWludEV2ZW50ICAgICAgICAgICA9ICJNaW50IgoJQnVybkV2ZW50ICAgICAgICAgICA9ICJCdXJuIgoJVHJhbnNmZXJFdmVudCAgICAgICA9ICJUcmFuc2ZlciIKCUFwcHJvdmFsRXZlbnQgICAgICAgPSAiQXBwcm92YWwiCglBcHByb3ZhbEZvckFsbEV2ZW50ID0gIkFwcHJvdmFsRm9yQWxsIgoJVG9rZW5VUklVcGRhdGVFdmVudCA9ICJUb2tlblVyaVVwZGF0ZSIKCU1ldGFkYXRhVXBkYXRlRXZlbnQgPSAiTWV0YWRhdGFVcGRhdGUiCikKCnR5cGUgTkZUR2V0dGVyIGZ1bmMoKSBJR1JDNzIxUmVhZGVyChqjCwoUaWdyYzcyMV9tZXRhZGF0YS5nbm8SigtwYWNrYWdlIGdyYzcyMXYyCgp0eXBlIElHUkM3MjFDb2xsZWN0aW9uTWV0YWRhdGEgaW50ZXJmYWNlIHsKCU5hbWUoKSBzdHJpbmcgICAvLyBOYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24uCglTeW1ib2woKSBzdHJpbmcgLy8gU3ltYm9sIHJldHVybnMgdGhlIHN5bWJvbCBvZiB0aGUgY29sbGVjdGlvbi4KfQoKdHlwZSBJR1JDNzIxTWV0YWRhdGEgaW50ZXJmYWNlIHsKCUlHUkM3MjFDb2xsZWN0aW9uTWV0YWRhdGEKCVRva2VuVVJJKHRpZCBUb2tlbklEKSAoc3RyaW5nLCBlcnJvcikgLy8gVG9rZW5VUkkgcmV0dXJucyB0aGUgVVJJIG9mIGEgc3BlY2lmaWMgdG9rZW4uCn0KCnR5cGUgSUdSQzcyMU1ldGFkYXRhT25jaGFpbiBpbnRlcmZhY2UgewoJSUdSQzcyMUNvbGxlY3Rpb25NZXRhZGF0YQoJVG9rZW5NZXRhZGF0YSh0aWQgVG9rZW5JRCkgKE1ldGFkYXRhLCBlcnJvcikKfQoKdHlwZSBUcmFpdCBzdHJ1Y3QgewoJRGlzcGxheVR5cGUgc3RyaW5nCglUcmFpdFR5cGUgICBzdHJpbmcKCVZhbHVlICAgICAgIHN0cmluZwp9Cgp0eXBlIE1ldGFkYXRhIHN0cnVjdCB7CglJbWFnZSAgICAgICAgICAgc3RyaW5nICAvLyBVUkwsIElQRlMvQXJ3ZWF2ZSBwYXRoLCBvciAoY29tbW9ubHkgaGVyZSkgYSBkYXRhOiBVUkkgaG9sZGluZyB0aGUgaW1hZ2UgaXRzZWxmLgoJSW1hZ2VEYXRhICAgICAgIHN0cmluZyAgLy8gUmF3IFNWRyBpbWFnZSBkYXRhLCBpZiBnZW5lcmF0aW5nIGltYWdlcyBvbiB0aGUgZmx5LiBPbmx5IHVzZWQgaWYgSW1hZ2UgaXMgZW1wdHkuCglFeHRlcm5hbFVSTCAgICAgc3RyaW5nICAvLyBVUkwgc2hvd24gYWxvbmdzaWRlIHRoZSBhc3NldCBvbiBtYXJrZXRwbGFjZXMsIGxpbmtpbmcgYmFjayB0byB0aGUgY29sbGVjdGlvbidzIG93biBzaXRlLgoJRGVzY3JpcHRpb24gICAgIHN0cmluZyAgLy8gSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGl0ZW0uIE1hcmtkb3duIGlzIHN1cHBvcnRlZC4KCU5hbWUgICAgICAgICAgICBzdHJpbmcgIC8vIE5hbWUgb2YgdGhlIGl0ZW0uCglBdHRyaWJ1dGVzICAgICAgW11UcmFpdCAvLyBBdHRyaWJ1dGVzIGZvciB0aGUgaXRlbSwgc2hvd24gb24gbWFya2V0cGxhY2UgcGFnZXMgZm9yIHRoZSBpdGVtLgoJQmFja2dyb3VuZENvbG9yIHN0cmluZyAgLy8gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaXRlbSBvbiBtYXJrZXRwbGFjZXMuIFNpeC1jaGFyYWN0ZXIgaGV4LCBubyBsZWFkaW5nICMuCglBbmltYXRpb25VUkwgICAgc3RyaW5nICAvLyBVUkwvZGF0YSBVUkkgdG8gYSBtdWx0aW1lZGlhIGF0dGFjaG1lbnQgZm9yIHRoZSBpdGVtLgoJWW91dHViZVVSTCAgICAgIHN0cmluZyAgLy8gVVJMIHRvIGEgWW91VHViZSB2aWRlbyAob25seSB1c2VkIGlmIEFuaW1hdGlvblVSTCBpcyBub3QgcHJvdmlkZWQpLgp9ChrjBQoIdXRpbC5nbm8S1gVwYWNrYWdlIGdyYzcyMXYyCgpjb25zdCAoCglNYXhOYW1lTGVuICAgPSA2NAoJTWF4U3ltYm9sTGVuID0gMTEKKQoKdmFyIHplcm9BZGRyZXNzID0gYWRkcmVzcygiIikKCmZ1bmMgaXNWYWxpZEFkZHJlc3MoYWRkciBhZGRyZXNzKSBlcnJvciB7CglpZiAhYWRkci5Jc1ZhbGlkKCkgewoJCXJldHVybiBFcnJJbnZhbGlkQWRkcmVzcwoJfQoJcmV0dXJuIG5pbAp9CgpmdW5jIHZhbGlkTmFtZShuYW1lIHN0cmluZykgYm9vbCB7CglpZiBuYW1lID09ICIiIHx8IGxlbihuYW1lKSA+IE1heE5hbWVMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgbmFtZSB7CgkJaWYgYyA8IDB4MjAgfHwgYyA9PSAweDdmIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyB2YWxpZFN5bWJvbChzeW1ib2wgc3RyaW5nKSBib29sIHsKCWlmIHN5bWJvbCA9PSAiIiB8fCBsZW4oc3ltYm9sKSA+IE1heFN5bWJvbExlbiB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgXywgYyA6PSByYW5nZSBzeW1ib2wgewoJCWlmICFpc0FsbnVtKGMpICYmIGMgIT0gJ18nICYmIGMgIT0gJy0nIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyBpc0FsbnVtKGMgcnVuZSkgYm9vbCB7CglyZXR1cm4gKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDDcwMDAwMDB1Z25vdBIRCMjplR4SCjMxNjM3dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECZnmjxh8z1An/XbR9f70VPxX5TQTu0HjqzAQDtnm7MVASQPNyt7+kJ+F3pU27CfCrV01geJyL0Lem1a1S32VTC6I+Njb6Fk0DdJX78C207/NkCKCwV/IGtfXSe2sbMqBXNJoaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=