Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
DD4895EE775FFF2B67DBB695842832E81AC0E4882605C1ACCCB0BD44EDC710D4
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
80,353,190
Gas consumed
FEE
200000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1t2kg2vtr3fukg43eujkn6x53gfdyakhngt4sfd40000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cp/gAwoML3ZtLm1fYWRkcGtnEo3gAwooZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZBLQ3wMKBWFyZW5hEkNnbm8ubGFuZC9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2FyZW5hL3YwGocUCglhcmVuYS5nbm8S+RNwYWNrYWdlIGFyZW5hCgppbXBvcnQgKAoJInN0cmNvbnYiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCi8vIFRoZSB3aG9sZSBzdGF0ZSBvZiB0aGUgcmVhbG0uIEV2ZXJ5dGhpbmcgaXMgdW5leHBvcnRlZCBhbmQgbm90aGluZyBiZWxvdyBpcwovLyBldmVyIHJldHVybmVkIGJ5IHJlZmVyZW5jZTogdGhlIHRyZWVzIGFyZSAvcC8gdHlwZXMgd2l0aCBtdXRhdG9yIG1ldGhvZHMsCi8vIHNvIGhhbmRpbmcgb25lIG91dCB3b3VsZCBiZSBoYW5kaW5nIG91dCB3cml0ZSBhY2Nlc3MgdG8gdGhlIHJlYWxtLgp2YXIgKAoJdmVyc2lvbiBpbnQ2NCAvLyBidW1wcyBvbiBldmVyeSBhZG1pbiB3cml0ZSwgc2VlIFZlcnNpb24KCgkvLyBBcmVuYXMgZXhpc3QgZnJvbSB0aGUgZmlyc3QgcGFpZCBlbnRyeSB1bnRpbCB0aGVpciBnYW1lIGlzIG92ZXIsIG9yCgkvLyB0aGVpciBsb2JieSBpcyBlbXB0eS4gQW4gYXJlbmEgbm9ib2R5IHBhaWQgaW50byBpcyBuZXZlciBzdG9yZWQuCglhcmVuYXMgYnB0cmVlLkJQVHJlZSAvLyBhcmVuYSBpZCAtPiAqYXJlbmEsIHdpdGggaXRzIGxvYmJ5IGFuZCBpdHMgcm91bmQKCgkvLyBUaGUgbGFzdCBnYW1lcyBwbGF5ZWQsIGZvciByZWFkZXJzOiB0aGVpciByZXN1bHQsIGJ5IGFyZW5hIGlkLCBhbmQgdGhlCgkvLyBpZHMgaW4gdGhlIG9yZGVyIHRoZXkgY2xvc2VkLCBvbGRlc3QgZmlyc3QuCglyZXN1bHRzIGJwdHJlZS5CUFRyZWUgLy8gYXJlbmEgaWQgLT4gZW5jb2RlZCByZXN1bHQsIHNlZSByZXN1bHRzLmdubwoJY2xvc2VkICBbXXN0cmluZwoKCXJlZnVuZERlbGF5IGludDY0IC8vIHNlY29uZHMgYWZ0ZXIgYSBnYW1lJ3MgdGltZSBsaW1pdCBiZWZvcmUgYW55b25lIG1heSByZWZ1bmQgaXQKCgllc2Nyb3dlZCBpbnQ2NCAvLyB1Z25vdCBvd2VkIHRvIHBsYXllcnM6IHRoZSBzdGFrZXMgb2YgZXZlcnkgbG9iYnkgYW5kIHJ1bm5pbmcgZ2FtZSwgYW5kIHRoZWlyIHVuY2xhaW1lZCB3aW5uaW5ncwoKCS8vIFdpbm5pbmdzIG5vdCBjbGFpbWVkIHlldCwgc2VlIGNsYWltcy5nbm8uCgljbGFpbXMgYnB0cmVlLkJQVHJlZSAvLyBwbGF5ZXIgYWRkcmVzcyAtPiBlbmNvZGVkIGNyZWRpdHMKCgkvLyBXaGF0IHBsYXllcnMgd29uLCBzZWUgZWFybmluZ3MuZ25vLgoJZWFybmluZ3MgYnB0cmVlLkJQVHJlZSAvLyBwbGF5ZXIgYWRkcmVzcyAtPiBlbmNvZGVkIHRvdGFscywgYWxsb2NhdGVkIG9uIGEgZmlyc3Qgc2V0dGxlZCBnYW1lCgl3aW5uZXJzICByYW5raW5nICAgICAgIC8vIHRoZSB0b3AgcGxheWVycyBieSB3aW5uaW5ncwoKCXdlYlBhdGggc3RyaW5nIC8vICIvci9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9hcmVuYS92MCIsIHVzZWQgdG8gYnVpbGQgbGlua3MgaW4gUmVuZGVyCikKCmNvbnN0IGRlZmF1bHRSZWZ1bmREZWxheSA9IDYwMCAvLyBzZWNvbmRzCgovLyBpbml0IHJ1bnMgb25jZSwgd2hlbiB0aGUgcGFja2FnZSBpcyBhZGRlZCB0byB0aGUgY2hhaW4uIFVubGlrZSB0aGUgZ2FtZQovLyByZWFsbSB0aGlzIG9uZSBoYXMgbm90aGluZyB0byByZW1lbWJlciBhYm91dCBpdHMgZGVwbG95ZXI6IGl0IGhhcyBubyByb2xlCi8vIG9mIGl0cyBvd24uCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCWJvb3RzdHJhcChjdXIuUGtnUGF0aCgpKQp9CgovLyBib290c3RyYXAgKHJlKWNyZWF0ZXMgdGhlIGluaXRpYWwgc3RhdGUuIFRoZSB0ZXN0cyBjYWxsIGl0IHRvIHN0YXJ0IGZyb20gYQovLyBjbGVhbiBzbGF0ZS4KZnVuYyBib290c3RyYXAocGtnUGF0aCBzdHJpbmcpIHsKCWFyZW5hcyA9IGJwdHJlZS5CUFRyZWV7fQoJcmVzdWx0cyA9IGJwdHJlZS5CUFRyZWV7fQoJY2xvc2VkID0gbmlsCglyZWZ1bmREZWxheSA9IGRlZmF1bHRSZWZ1bmREZWxheQoJZXNjcm93ZWQgPSAwCgljbGFpbXMgPSBicHRyZWUuQlBUcmVle30KCWVhcm5pbmdzID0gYnB0cmVlLkJQVHJlZXt9Cgl3aW5uZXJzID0gcmFua2luZ3t9Cgl3ZWJQYXRoID0gd2ViUGF0aE9mKHBrZ1BhdGgpCgl2ZXJzaW9uID0gMQp9CgovLyBWZXJzaW9uIHJldHVybnMgYSBjb3VudGVyIHRoYXQgYnVtcHMgb24gZXZlcnkgYWRtaW4gd3JpdGU6IHRoZSByZWZ1bmQKLy8gZGVsYXkuIFBsYXllciBhbmQgcmVmZXJlZSBhY3Rpb25zIGRvIG5vdCBidW1wIGl0LgpmdW5jIFZlcnNpb24oKSBpbnQ2NCB7CglyZXR1cm4gdmVyc2lvbgp9CgovLyBub3cgcmV0dXJucyB0aGUgYmxvY2sgdGltZSBpbiBVbml4IHNlY29uZHMuCmZ1bmMgbm93KCkgaW50NjQgewoJcmV0dXJuIHRpbWUuTm93KCkuVW5peCgpCn0KCi8vIHdlYlBhdGhPZiB0dXJucyAiZ25vLmxhbmQvci8uLi4iIGludG8gIi9yLy4uLiIuCmZ1bmMgd2ViUGF0aE9mKHBrZ1BhdGggc3RyaW5nKSBzdHJpbmcgewoJZm9yIGkgOj0gMDsgaSA8IGxlbihwa2dQYXRoKTsgaSsrIHsKCQlpZiBwa2dQYXRoW2ldID09ICcvJyB7CgkJCXJldHVybiBwa2dQYXRoW2k6XQoJCX0KCX0KCXJldHVybiAiIgp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsKCXJldHVybiBzdHJjb252LkZvcm1hdEludChuLCAxMCkKfQoasRgKCmNsYWltcy5nbm8SohhwYWNrYWdlIGFyZW5hCgppbXBvcnQgKAoJImNoYWluIgoJInN0cmluZ3MiCikKCi8vIFdpbm5pbmdzIGFyZSBub3Qgc2VudCB3aGVuIGEgZ2FtZSBzZXR0bGVzLiBUaGV5IGFyZSBjcmVkaXRlZCB0byBlYWNoCi8vIHdpbm5lciwgc3RheSBpbiB0aGUgZXNjcm93LCBhbmQgdGhlIHdpbm5lciB0YWtlcyB0aGVtIHdpdGggQ2xhaW0sIGV2ZXJ5Ci8vIGdhbWUgYXQgb25jZS4gQSBzZXR0bGVtZW50IHRoZW4gbW92ZXMgbm8gY29pbiB0byBhIHBsYXllciwgYW5kIGEgcGxheWVyCi8vIHdobyBuZXZlciBjb21lcyBiYWNrIGNvc3RzIG5vYm9keSBhbnl0aGluZy4KLy8KLy8gUmVmdW5kcyAoTGVhdmUsIENhbmNlbFJvdW5kLCBSZWZ1bmRSb3VuZCwgRXhwaXJlTG9iYnkpIHN0aWxsIHNlbmQgdGhlCi8vIHN0YWtlcyBiYWNrIHN0cmFpZ2h0IGF3YXk6IGEgcmVmdW5kIGlzIG5vdCBhIHdpbi4KCi8vIGNsYWltQ3JlZGl0IGlzIHdoYXQgb25lIGdhbWUgb3dlcyBvbmUgcGxheWVyLgp0eXBlIGNsYWltQ3JlZGl0IHN0cnVjdCB7CglpZCAgICAgc3RyaW5nCglhbW91bnQgaW50NjQKfQoKLy8gVGhlIGNyZWRpdHMgb2YgYSBwbGF5ZXIgYXJlIHN0b3JlZCBhcyBvbmUgc3RyaW5nLCBvbGRlc3QgZmlyc3Q6Ci8vCi8vCTxhcmVuYSBpZD46PGFtb3VudD4sPGFyZW5hIGlkPjo8YW1vdW50PgoKZnVuYyBjcmVkaXRzT2YoYWRkciBhZGRyZXNzKSBbXWNsYWltQ3JlZGl0IHsKCXYgOj0gY2xhaW1zLkdldChhZGRyLlN0cmluZygpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXZhciBvdXQgW11jbGFpbUNyZWRpdAoJZm9yIF8sIGVudHJ5IDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQodi4oc3RyaW5nKSwgIiwiKSB7CgkJY29sb24gOj0gaW5kZXhGcm9tKGVudHJ5LCAwLCAnOicpCgkJaWYgY29sb24gPT0gMCB8fCBjb2xvbiA9PSBsZW4oZW50cnkpIHsKCQkJcGFuaWMoZXJyQ29ycnVwdENsYWltcykKCQl9CgkJYW1vdW50LCBvayA6PSBkaWdpdHMoZW50cnlbY29sb24rMTpdKQoJCWlmICFvayB8fCBhbW91bnQgPD0gMCB7CgkJCXBhbmljKGVyckNvcnJ1cHRDbGFpbXMpCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIGNsYWltQ3JlZGl0e2lkOiBlbnRyeVs6Y29sb25dLCBhbW91bnQ6IGFtb3VudH0pCgl9CglyZXR1cm4gb3V0Cn0KCi8vIGNyZWRpdCBvd2VzIGFtb3VudCB0byBhIHBsYXllciBmb3IgdGhlIGdhbWUgb2YgYW4gYXJlbmEuIFRoZSBjb2lucyBhcmUKLy8gYWxyZWFkeSBpbiB0aGUgcmVhbG06IHRoZXkgc3RheSBpbiB0aGUgZXNjcm93IHVudGlsIGNsYWltZWQuCmZ1bmMgY3JlZGl0KGFkZHIgYWRkcmVzcywgaWQgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWlmIGFtb3VudCA8PSAwIHsKCQlyZXR1cm4KCX0KCWVudHJ5IDo9IGlkICsgIjoiICsgaXRvYShhbW91bnQpCglpZiB2IDo9IGNsYWltcy5HZXQoYWRkci5TdHJpbmcoKSk7IHYgIT0gbmlsIHsKCQllbnRyeSA9IHYuKHN0cmluZykgKyAiLCIgKyBlbnRyeQoJfQoJY2xhaW1zLlNldChhZGRyLlN0cmluZygpLCBlbnRyeSkKCWhvbGQoYW1vdW50KQp9CgovLyBDbGFpbSBzZW5kcyB0aGUgY2FsbGVyIGV2ZXJ5dGhpbmcgdGhlIHJlYWxtIG93ZXMgdGhlbSBmcm9tIHNldHRsZWQKLy8gZ2FtZXMsIGFuZCByZXR1cm5zIHRoZSBhbW91bnQgaW4gdWdub3QuIEl0IHBhbmljcyB3aGVuIHRoZXJlIGlzIG5vdGhpbmcKLy8gdG8gY2xhaW0uCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtKSBpbnQ2NCB7CglwbGF5ZXIgOj0gY2FsbGVyT2YoMCwgY3VyKQoJbGlzdCA6PSBjcmVkaXRzT2YocGxheWVyKQoJaWYgbGVuKGxpc3QpID09IDAgewoJCXBhbmljKGVyck5vdGhpbmdUb0NsYWltKQoJfQoJdG90YWwgOj0gaW50NjQoMCkKCWZvciBfLCBjIDo9IHJhbmdlIGxpc3QgewoJCXRvdGFsICs9IGMuYW1vdW50Cgl9CgkvLyBTdGF0ZSBmaXJzdDogbm90aGluZyBpcyBvd2VkIGFueSBtb3JlIGJlZm9yZSB0aGUgY29pbnMgbGVhdmUuCgljbGFpbXMuUmVtb3ZlKHBsYXllci5TdHJpbmcoKSkKCXJlbGVhc2UodG90YWwpCglwYXkoMCwgY3VyLCBwbGF5ZXIsIHRvdGFsKQoJYXNzZXJ0U29sdmVudCgwLCBjdXIpCgljaGFpbi5FbWl0KCJDbGFpbWVkIiwgInBsYXllciIsIHBsYXllci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EodG90YWwpLCAiZ2FtZXMiLCBpdG9hKGludDY0KGxlbihsaXN0KSkpKQoJcmV0dXJuIHRvdGFsCn0KCi8vIENsYWltYWJsZSByZXR1cm5zIHdoYXQgYSBwbGF5ZXIgY2FuIGNsYWltLCBpbiB1Z25vdC4KZnVuYyBDbGFpbWFibGUoYWRkciBhZGRyZXNzKSBpbnQ2NCB7Cgl0b3RhbCA6PSBpbnQ2NCgwKQoJZm9yIF8sIGMgOj0gcmFuZ2UgY3JlZGl0c09mKGFkZHIpIHsKCQl0b3RhbCArPSBjLmFtb3VudAoJfQoJcmV0dXJuIHRvdGFsCn0KCi8vIENsYWltc0pTT04gcmV0dXJucyB3aGF0IGEgcGxheWVyIGNhbiBjbGFpbSwgZ2FtZSBieSBnYW1lLCBvbGRlc3QgZmlyc3Q6Ci8vCi8vCXsgImFkZHJlc3MiOiAiZzEuLi4iLCAidG90YWwiOiAxOTAwMDAwMCwgImdhbWVzIjogWyB7ICJpZCI6ICIuLi4iLCAiYW1vdW50IjogMTkwMDAwMDAgfSBdIH0KLy8KLy8gVGhlIG91dHB1dCBoYXMgbm8gd2hpdGVzcGFjZS4gQW4gYWRkcmVzcyB3aXRoIG5vdGhpbmcgdG8gY2xhaW0gcmV0dXJucwovLyB0aGUgc2FtZSBzaGFwZSB3aXRoIGEgemVybyB0b3RhbCBhbmQgbm8gZ2FtZS4KZnVuYyBDbGFpbXNKU09OKGFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCWxpc3QgOj0gY3JlZGl0c09mKGFkZHIpCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCXRvdGFsIDo9IGludDY0KDApCglmb3IgXywgYyA6PSByYW5nZSBsaXN0IHsKCQl0b3RhbCArPSBjLmFtb3VudAoJfQoJYi5Xcml0ZVN0cmluZyhgeyJhZGRyZXNzIjpgICsgcXVvdGUoYWRkci5TdHJpbmcoKSkgKyBgLCJ0b3RhbCI6YCArIGl0b2EodG90YWwpICsgYCwiZ2FtZXMiOltgKQoJZm9yIGksIGMgOj0gcmFuZ2UgbGlzdCB7CgkJaWYgaSA+IDAgewoJCQliLldyaXRlQnl0ZSgnLCcpCgkJfQoJCWIuV3JpdGVTdHJpbmcoYHsiaWQiOiJgICsgYy5pZCArIGAiLCJhbW91bnQiOmAgKyBpdG9hKGMuYW1vdW50KSArIGB9YCkKCX0KCWIuV3JpdGVTdHJpbmcoIl19IikKCXJldHVybiBiLlN0cmluZygpCn0KGvEYCgdkb2MuZ25vEuUYLy8gdjAgLSBVbmF1ZGl0ZWQ6IFRoaXMgaXMgYW4gaW5pdGlhbCB2ZXJzaW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBmb3JtYWxseSBhdWRpdGVkLgovLyBVc2UgaW4gcHJvZHVjdGlvbiBhdCB5b3VyIG93biByaXNrLgovLwovLyBQYWNrYWdlIGFyZW5hIGhvbGRzIHRoZSBwYWlkIGdhbWVzIG9mIGdub2ZseSwgYSBtdWx0aXBsYXllciBwbGFuZSBnYW1lLiBBCi8vIHBsYXllciBwYXlzIGFuIGVudHJ5IHByaWNlIGluIHVnbm90IHRvIGpvaW4gYSBnYW1lLCB0aGUgcmVhbG0ga2VlcHMgdGhlCi8vIHN0YWtlcyB1bnRpbCB0aGUgZ2FtZSBpcyBvdmVyLCB0aGVuIGNyZWRpdHMgdGhlbSBieSBhIHJ1bGUgaXQgYXBwbGllcwovLyBpdHNlbGYuIFdpbm5lcnMgdGFrZSB3aGF0IHRoZXkgYXJlIG93ZWQgd2l0aCBDbGFpbS4KLy8KLy8gR2FtZXMgYXJlIGNyZWF0ZWQgb2ZmIGNoYWluLCBieSB0aGUgZ2FtZSBzZXJ2ZXIgYXQgYSBwbGF5ZXIncyByZXF1ZXN0LCBhbmQKLy8gZGVzY3JpYmVkIGJ5IGEgc3BlYyAoc2VlIHNwZWMuZ25vKTogbW9kZSwgZW50cnkgcHJpY2UsIHNlYXRzLCBsaXZlcywgZ2FtZQovLyB0aW1lIGFuZCBraWxsIHRhcmdldC4gVGhlIHJlYWxtIG9ubHkgc3RvcmVzIGEgZ2FtZSBvbmNlIHNvbWVvbmUgcGFpZCBmb3IKLy8gaXQsIGFuZCBmb3JnZXRzIGl0IHdoZW4gaXQgaXMgb3ZlciBvciBpdHMgbG9iYnkgZW1wdGllczogbm8gZ2FtZSBub2JvZHkKLy8gcGxheWVkIGlzIGV2ZXIgbGVmdCBvbiBjaGFpbi4KLy8KLy8gRm91ciBraW5kcyBvZiBjYWxsZXJzIHdyaXRlIHRvIGl0OgovLwovLyAgIC0gcGxheWVycyBlbnRlciBhIGdhbWUgd2l0aCB0aGVpciBzdGFrZSBhdHRhY2hlZCwgdGhlIGZpcnN0IG9uZSBoYW5kaW5nCi8vICAgICB0aGUgcmVhbG0gaXRzIHNwZWMsIGFuZCBtYXkgbGVhdmUgYWdhaW4gdW50aWwgaXQgc3RhcnRzIChFbnRlciwgTGVhdmUpOwovLyAgIC0gcmVmZXJlZXMsIHRoZSBnYW1lIHNlcnZlcnMsIHN0YXJ0IGEgZ2FtZSB3aXRoIHRoZSBwbGF5ZXJzIG9mIGl0cyBsb2JieSwKLy8gICAgIGFuZCByZXBvcnQgd2hvIGRpZWQgYnkgd2hvc2UgaGFuZCB3aGVuIGl0IGlzIG92ZXIgKFN0YXJ0Um91bmQsCi8vICAgICBTZXR0bGVSb3VuZCwgQ2FuY2VsUm91bmQpOwovLyAgIC0gYW55b25lIGNhbiBzZW5kIHRoZSBzdGFrZXMgb2YgYSBnYW1lIGJhY2sgdG8gaXRzIHBsYXllcnMgb25jZSB0aGUKLy8gICAgIHJlZmVyZWUgaXMgbG9uZyBvdmVyZHVlLCBhbmQgY2xvc2UgYSBsb2JieSB3aG9zZSBnYW1lIG5ldmVyIHN0YXJ0ZWQgYW4KLy8gICAgIGhvdXIgYWZ0ZXIgaXQgd2FzIGNyZWF0ZWQgKFJlZnVuZFJvdW5kLCBFeHBpcmVMb2JieSk7Ci8vICAgLSB0aGUgYWRtaW5zIG9mIHRoZSBnYW1lIHJlYWxtIHNldCB0aGUgcmVmdW5kIGRlbGF5IChTZXRSZWZ1bmREZWxheSkuCi8vCi8vIFRoZSByZWFsbSBrZWVwcyBubyByb2xlcyBvZiBpdHMgb3duOiB0aGUgb3duZXIsIHRoZSBhZG1pbnMsIHRoZSByZWZlcmVlcwovLyBhbmQgdGhlIHRyZWFzdXJ5IGFyZSB0aG9zZSBvZiBnbm8ubGFuZC9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2dhbWUvdjAsIGFza2VkIGF0Ci8vIHRoZSB0aW1lIG9mIGVhY2ggY2FsbC4KLy8KLy8gVGhlIHJlZmVyZWUgaXMgdHJ1c3RlZCBmb3IgZmFjdHMgb25seTogd2hvIGRpZWQsIGFuZCBieSB3aG9tLiBXaGF0IHRoZXNlCi8vIGZhY3RzIGFyZSB3b3J0aCBpcyBkZWNpZGVkIGJ5IGEgcnVsZSBvZgovLyBnbm8ubGFuZC9wL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2FyZW5hL3BheW91dC92MCwgcGlja2VkIGJ5IHRoZSBtb2RlIG9mIHRoZSBnYW1lLAovLyBhbmQgdGhlIHJlYWxtIGNoZWNrcyB3aGF0IHRoZSBydWxlIHJldHVybnMgYmVmb3JlIGl0IHNlbmRzIGFueXRoaW5nLgovLwovLyAjIE1vbmV5Ci8vCi8vIFRoZSByZWFsbSBvd2VzIGV4YWN0bHkgdGhlIHN0YWtlcyBvZiBpdHMgbG9iYmllcyBhbmQgb2YgaXRzIHJ1bm5pbmcKLy8gZ2FtZXMsIGFuZCB0aGUgd2lubmluZ3Mgbm90IGNsYWltZWQgeWV0LCBhbmQgY291bnRzIHRoZW0gaW4gb25lIG51bWJlciwKLy8gc2VlIEVzY3Jvd2VkLiBFdmVyeSBjb2luIHRoYXQgbGVhdmVzCi8vIGdvZXMgdG8gYSBwbGF5ZXIgb2YgdGhlIGdhbWUgaXQgY2FtZSBmcm9tLCBvciB0byB0aGUgdHJlYXN1cnkgb2YgdGhlIGdhbWUKLy8gcmVhbG06Ci8vCi8vCUVudGVyICAgICAgICArc3Rha2UgICB0aGUgZW52ZWxvcGUgb2YgdGhlIGNhbGwgc3RheXMgaW4gdGhlIHJlYWxtCi8vCUxlYXZlICAgICAgICAtc3Rha2UgICBiYWNrIHRvIHRoZSBwbGF5ZXIKLy8JRXhwaXJlTG9iYnkgIC1zdGFrZXMgIGJhY2sgdG8gdGhlIHBsYXllcnMgb2YgdGhlIGxvYmJ5Ci8vCVN0YXJ0Um91bmQgICAgMCAgICAgICBzdGFrZXMgbW92ZSBmcm9tIHRoZSBsb2JieSB0byB0aGUgZ2FtZQovLwlTZXR0bGVSb3VuZCAgLWZlZSAgICAgdGhlIGZlZSBsZWF2ZXMsIHRoZSByZXN0IGlzIGNyZWRpdGVkIHRvIHRoZSB3aW5uZXJzCi8vCUNsYWltICAgICAgICAtb3dlZCAgICBldmVyeXRoaW5nIGNyZWRpdGVkIHRvIHRoZSBjYWxsZXIsIGV2ZXJ5IGdhbWUgYXQgb25jZQovLwlDYW5jZWxSb3VuZCAgLXBvdCAgICAgYmFjayB0byB0aGUgcGxheWVycyBvZiB0aGUgZ2FtZQovLwlSZWZ1bmRSb3VuZCAgLXBvdCAgICAgYmFjayB0byB0aGUgcGxheWVycyBvZiB0aGUgZ2FtZQovLwovLyBBIGdhbWUgaXMgY2xvc2VkIGJ5IGV4YWN0bHkgb25lIG9mIFNldHRsZVJvdW5kLCBDYW5jZWxSb3VuZCBhbmQKLy8gUmVmdW5kUm91bmQsIG9uY2UuCi8vCi8vIFdoYXQgYSBzZXR0bGVtZW50IGRvZXMgbm90IHBheSB0byB0aGUgcGxheWVycyBpcyB0aGUgaG91c2UncyBjdXQsIGEgZmVlIG9mCi8vIDUlIHNlbnQgdG8gdGhlIHRyZWFzdXJ5IG9mIHRoZSBnYW1lIHJlYWxtLCByb3VuZGluZyBpbmNsdWRlZC4KLy8KLy8gUmVhZHMgYXJlIHBsYWluIGZ1bmN0aW9ucyBtZWFudCBmb3Igdm0vcWV2YWwuIFRoZSBvbmVzIGVuZGluZyBpbiBKU09OCi8vIHJldHVybiBhIHNpbmdsZSBzdHJpbmcgaG9sZGluZyBhIEpTT04gZG9jdW1lbnQuIFJlbmRlciBleHBvc2VzIHRoZSBzYW1lCi8vIGRhdGEgYXMgbWFya2Rvd24gZm9yIGdub3dlYi4KcGFja2FnZSBhcmVuYQoayi4KDGVhcm5pbmdzLmdubxK5LnBhY2thZ2UgYXJlbmEKCmltcG9ydCAiZ25vLmxhbmQvcC9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9hcmVuYS9wYXlvdXQvdjAiCgovLyBFYXJuaW5ncyBhcmUgd2hhdCBwbGF5ZXJzIHdvbiwgYWRkZWQgdXAgcm91bmQgYWZ0ZXIgcm91bmQuIExpa2UgdGhlCi8vIHJlc3VsdHMgdGhleSBhcmUgYSByZWNvcmQgZm9yIHJlYWRlcnM6IG5vIHBheW1lbnQgaXMgZXZlciBjb21wdXRlZCBmcm9tCi8vIHRoZW0uCi8vCi8vIEZvciBvbmUgc2V0dGxlZCByb3VuZCBhIHBsYXllcidzIHdpbm5pbmdzIGFyZSB3aGF0IHRoZXkgd2VyZSBwYWlkIGFib3ZlCi8vIHRoZWlyIG93biBzdGFrZSwgYW5kIG5ldmVyIGxlc3MgdGhhbiB6ZXJvOiBsb3NpbmcgYSBzdGFrZSBkb2VzIG5vdCB0YWtlCi8vIGFueXRoaW5nIGJhY2sgZnJvbSB3aGF0IHdhcyB3b24gYmVmb3JlLiBDYW5jZWxsZWQgYW5kIHJlZnVuZGVkIHJvdW5kcwovLyBjb3VudCBmb3Igbm90aGluZywgbm9ib2R5IHdvbiBvciBsb3N0IGluIHRoZW0uCgovLyB0b3BTaXplIGlzIGhvdyBtYW55IHBsYXllcnMgdGhlIGxpc3Qgb2YgdG9wIHdpbm5lcnMgaG9sZHMuCmNvbnN0IHRvcFNpemUgPSAxMAoKLy8gdG90YWxzIGlzIHdoYXQgdGhlIHJlYWxtIHJlbWVtYmVycyBhYm91dCBvbmUgcGxheWVyLgp0eXBlIHRvdGFscyBzdHJ1Y3QgewoJd29uICAgIGludDY0IC8vIHVnbm90IHdvbiBhYm92ZSB0aGUgc3Rha2VzLCBvdmVyIGV2ZXJ5IHNldHRsZWQgcm91bmQKCXJvdW5kcyBpbnQ2NCAvLyBzZXR0bGVkIHJvdW5kcyBwbGF5ZWQKfQoKLy8gVG90YWxzIGFyZSBzdG9yZWQgYXMgYSBzaW5nbGUgc3RyaW5nLCAid29uOnJvdW5kcyIsIGZvciB0aGUgc2FtZSByZWFzb24KLy8gYXMgdGhlIHBpbG90cyBvZiB0aGUgZ2FtZSByZWFsbTogYSBzdHJ1Y3Qgd291bGQgYmUgb25lIG1vcmUgc3RvcmVkIG9iamVjdAovLyBwZXIgcGxheWVyLCBhbmQgdGhlIHJlZmVyZWUgcGF5cyBmb3IgdXAgdG8gMTYgbmV3IHBsYXllcnMgcGVyIHNldHRsZW1lbnQuCgovLyBlbmNvZGUgcmV0dXJucyB0aGUgc3RvcmVkIGZvcm0gb2YgdC4KZnVuYyAodCB0b3RhbHMpIGVuY29kZSgpIHN0cmluZyB7CglyZXR1cm4gaXRvYSh0LndvbikgKyAiOiIgKyBpdG9hKHQucm91bmRzKQp9CgovLyB0b3RhbHNPZiByZXR1cm5zIHRoZSB0b3RhbHMgb2YgYSBwbGF5ZXIsIHplcm8gZm9yIGEgcGxheWVyIHdobyBuZXZlcgovLyBmaW5pc2hlZCBhIHJvdW5kLgpmdW5jIHRvdGFsc09mKGFkZHIgYWRkcmVzcykgdG90YWxzIHsKCXYgOj0gZWFybmluZ3MuR2V0KGFkZHIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIHRvdGFsc3t9Cgl9CglzIDo9IHYuKHN0cmluZykKCWNvbG9uIDo9IGluZGV4RnJvbShzLCAwLCAnOicpCglpZiBjb2xvbiA9PSBsZW4ocykgewoJCXBhbmljKGVyckNvcnJ1cHRFYXJuaW5ncykKCX0KCXdvbiwgb2sgOj0gZGlnaXRzKHNbOmNvbG9uXSkKCWlmICFvayB7CgkJcGFuaWMoZXJyQ29ycnVwdEVhcm5pbmdzKQoJfQoJcm91bmRzLCBvayA6PSBkaWdpdHMoc1tjb2xvbisxOl0pCglpZiAhb2sgewoJCXBhbmljKGVyckNvcnJ1cHRFYXJuaW5ncykKCX0KCXJldHVybiB0b3RhbHN7d29uOiB3b24sIHJvdW5kczogcm91bmRzfQp9CgovLyBjcmVkaXRSb3VuZCByZWNvcmRzIGEgc2V0dGxlZCByb3VuZCBmb3IgZWFjaCBvZiBpdHMgcGxheWVyczogb25lIG1vcmUKLy8gcm91bmQgcGxheWVkLCBhbmQgd2hhdCB0aGV5IHdlcmUgcGFpZCBhYm92ZSB0aGVpciBzdGFrZSwgaWYgYW55dGhpbmcuCmZ1bmMgY3JlZGl0Um91bmQoc3Rha2UgaW50NjQsIHBsYXllcnMgW11hZGRyZXNzLCBwYXlvdXRzIFtdcGF5b3V0LlBheW91dCkgewoJZm9yIF8sIHAgOj0gcmFuZ2UgcGxheWVycyB7CgkJZ2FpbiA6PSBpbnQ2NCgwKQoJCWZvciBfLCBwYWlkIDo9IHJhbmdlIHBheW91dHMgewoJCQlpZiBwYWlkLkFkZHJlc3MgPT0gcCAmJiBwYWlkLkFtb3VudCA+IHN0YWtlIHsKCQkJCWdhaW4gPSBwYWlkLkFtb3VudCAtIHN0YWtlCgkJCX0KCQl9CgoJCXQgOj0gdG90YWxzT2YocCkKCQliZWZvcmUgOj0gdC53b24KCQl0LndvbiArPSBnYWluCgkJdC5yb3VuZHMrKwoJCWVhcm5pbmdzLlNldChwLlN0cmluZygpLCB0LmVuY29kZSgpKQoKCQlpZiBnYWluID4gMCB7CgkJCWlmIG5leHQsIGNoYW5nZWQgOj0gd2lubmVycy5yYWlzZShwLCBiZWZvcmUsIHQud29uLCB0b3BTaXplKTsgY2hhbmdlZCB7CgkJCQl3aW5uZXJzID0gbmV4dAoJCQl9CgkJfQoJfQp9CgovLyByYW5raW5nIGlzIHRoZSBsaXN0IG9mIHRvcCB3aW5uZXJzOiB0aGUgcGxheWVycyB3aG8gd29uIHRoZSBtb3N0LCBiZXN0Ci8vIGZpcnN0LCBhdCBtb3N0IHRvcFNpemUgbGluZXMgYW5kIG9uZSBsaW5lIHBlciBwbGF5ZXIuIFdpdGggZXF1YWwgd2lubmluZ3MsCi8vIHRoZSBwbGF5ZXIgd2hvIGdvdCB0aGVyZSBmaXJzdCBzdGF5cyBhaGVhZC4KLy8KLy8gSXQgaXMgdGhlIHJhbmtpbmcgb2YgdGhlIGdhbWUgcmVhbG0uIEl0IGlzIGtlcHQgc29ydGVkIGF0IHdyaXRlIHRpbWUsIHNvCi8vIHJlYWRpbmcgaXQgbmV2ZXIgaGFzIHRvIGxvb2sgYXQgZXZlcnkgcGxheWVyLiBXaW5uaW5ncyBvbmx5IGdvaW5nIHVwIGlzCi8vIHdoYXQgbWFrZXMgdGhhdCBleGFjdDogYSBwbGF5ZXIgb3V0c2lkZSB0aGUgbGlzdCBjYW4gb25seSBlbnRlciBpdCB0aHJvdWdoCi8vIHJhaXNlLgovLwovLyBUaGUgdHdvIHNsaWNlcyBhcmUgcGFyYWxsZWw6IHNsaWNlcyBvZiBwbGFpbiB2YWx1ZXMgYXJlIG9uZSBzdG9yZWQgb2JqZWN0Ci8vIGVhY2gsIHdoZXJlIGEgc2xpY2Ugb2Ygc3RydWN0cyB3b3VsZCBiZSBvbmUgb2JqZWN0IHBlciBsaW5lLgp0eXBlIHJhbmtpbmcgc3RydWN0IHsKCWFkZHJzICBbXWFkZHJlc3MKCXNjb3JlcyBbXWludDY0Cn0KCi8vIHJhaXNlIHB1dHMgYSBwbGF5ZXIgYXQgdGhlaXIgcGxhY2UgYWZ0ZXIgdGhlaXIgc2NvcmUgd2VudCB1cCBmcm9tIG9sZCB0bwovLyBzY29yZS4gSXQgcmV0dXJucyB0aGUgcmFua2luZyB0byBzdG9yZSwgYW5kIGNoYW5nZWQgPT0gZmFsc2Ugd2hlbiBpdCBpcwovLyBsZWZ0IGFzIGl0IGlzOiB0aGUgcGxheWVyIGlzIG5vdCBvbiBhIGZ1bGwgbGlzdCBhbmQgc3RpbGwgbm90IGdvb2QgZW5vdWdoCi8vIHRvIGdldCBvbi4KZnVuYyAociByYW5raW5nKSByYWlzZShhZGRyIGFkZHJlc3MsIG9sZCwgc2NvcmUgaW50NjQsIHNpemUgaW50KSAobmV4dCByYW5raW5nLCBjaGFuZ2VkIGJvb2wpIHsKCWZyb20gOj0gci5saW5lT2YoYWRkciwgb2xkKQoJdG8gOj0gci5zZWFyY2goc2NvcmUgLSAxKSAvLyBhZnRlciBldmVyeSBsaW5lIHdpdGggdGhpcyBzY29yZSBvciBtb3JlCglpZiBmcm9tIDwgMCAmJiB0byA+PSBzaXplIHsKCQlyZXR1cm4gciwgZmFsc2UKCX0KCWlmIGZyb20gPj0gMCAmJiB0byA+IGZyb20gewoJCXRvID0gZnJvbSAvLyBjYW5ub3QgaGFwcGVuOiBhIHNjb3JlIG9ubHkgZ29lcyB1cAoJfQoJbmV4dCA9IHJhbmtpbmd7CgkJYWRkcnM6ICBzcGxpY2VBZGRycyhyLmFkZHJzLCBmcm9tLCB0bywgYWRkciwgc2l6ZSksCgkJc2NvcmVzOiBzcGxpY2VJbnRzKHIuc2NvcmVzLCBmcm9tLCB0bywgc2NvcmUsIHNpemUpLAoJfQoJcmV0dXJuIG5leHQsIHRydWUKfQoKLy8gc2VhcmNoIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBsaW5lIHdpdGggYSBzY29yZSBvZiBsaW1pdCBvciBsZXNzLAovLyB0aGUgbnVtYmVyIG9mIGxpbmVzIHdoZW4gdGhlcmUgaXMgbm9uZS4gVGhlIGxpc3QgaXMgc29ydGVkLCBzbyB0aGlzIGlzIGEKLy8gYmluYXJ5IHNlYXJjaC4KZnVuYyAociByYW5raW5nKSBzZWFyY2gobGltaXQgaW50NjQpIGludCB7CglsbywgaGkgOj0gMCwgbGVuKHIuc2NvcmVzKQoJZm9yIGxvIDwgaGkgewoJCW1pZCA6PSAobG8gKyBoaSkgLyAyCgkJaWYgci5zY29yZXNbbWlkXSA8PSBsaW1pdCB7CgkJCWhpID0gbWlkCgkJfSBlbHNlIHsKCQkJbG8gPSBtaWQgKyAxCgkJfQoJfQoJcmV0dXJuIGxvCn0KCi8vIGxpbmVPZiByZXR1cm5zIHRoZSBpbmRleCBvZiBhIHBsYXllcidzIGxpbmUsIC0xIHdoZW4gdGhleSBoYXZlIG5vbmUuIG9sZAovLyBpcyB0aGUgcGxheWVyJ3Mgc2NvcmUgYmVmb3JlIHRoZSBjaGFuZ2UgYmVpbmcgYXBwbGllZC4KLy8KLy8gQSBsaW5lIGFsd2F5cyBjYXJyaWVzIHRoZSBjdXJyZW50IHNjb3JlIG9mIGl0cyBwbGF5ZXIsIGJlY2F1c2UgZXZlcnkKLy8gY2hhbmdlIG9mIGEgc2NvcmUgZ29lcyB0aHJvdWdoIHJhaXNlLiBTbyB0aGUgbGluZSBjYW4gb25seSBiZSBhbW9uZyB0aG9zZQovLyB3aXRoIGV4YWN0bHkgb2xkLiBBIHBsYXllciB3aG9zZSBzY29yZSB3YXMgemVybyBoYXMgbmV2ZXIgYmVlbiB0aHJvdWdoCi8vIHJhaXNlIGFuZCBoYXMgbm8gbGluZS4KZnVuYyAociByYW5raW5nKSBsaW5lT2YoYWRkciBhZGRyZXNzLCBvbGQgaW50NjQpIGludCB7CglpZiBvbGQgPD0gMCB7CgkJcmV0dXJuIC0xCgl9Cglmb3IgaSA6PSByLnNlYXJjaChvbGQpOyBpIDwgbGVuKHIuc2NvcmVzKSAmJiByLnNjb3Jlc1tpXSA9PSBvbGQ7IGkrKyB7CgkJaWYgci5hZGRyc1tpXSA9PSBhZGRyIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglyZXR1cm4gLTEKfQoKLy8gc3BsaWNlQWRkcnMgcmV0dXJucyBhIGNvcHkgb2YgYSByYW5raW5nIGNvbHVtbiB3aXRoIHYgaW5zZXJ0ZWQgYXQgaW5kZXgKLy8gdG8uIFdpdGggZnJvbSA+PSAwIHRoZSBlbGVtZW50IGF0IHRoYXQgaW5kZXgsIHRoZSBwbGF5ZXIncyBwcmV2aW91cyBsaW5lLAovLyBpcyBsZWZ0IG91dDsgdG8gbXVzdCBub3QgYmUgcGFzdCBpdC4gV2l0aCBmcm9tIDwgMCB0aGUgcmVzdWx0IGlzIGtlcHQgdG8KLy8gc2l6ZSBlbGVtZW50cyBieSBkcm9wcGluZyB0aGUgdGFpbDsgdG8gbXVzdCBiZSBiZWxvdyBzaXplLgovLwovLyBUaGUgY29weSBoYXMgZXhhY3RseSB0aGUgbGVuZ3RoIG9mIGl0cyBjb250ZW50LCBzbyB0aGF0IG5vdGhpbmcgZWxzZSBzdGF5cwovLyBpbiBzdG9yYWdlLgpmdW5jIHNwbGljZUFkZHJzKGxpc3QgW11hZGRyZXNzLCBmcm9tLCB0byBpbnQsIHYgYWRkcmVzcywgc2l6ZSBpbnQpIFtdYWRkcmVzcyB7CglpZiBmcm9tIDwgMCB7CgkJaWYgbGVuKGxpc3QpID49IHNpemUgewoJCQlsaXN0ID0gbGlzdFs6c2l6ZS0xXQoJCX0KCQlvdXQgOj0gbWFrZShbXWFkZHJlc3MsIDAsIGxlbihsaXN0KSsxKQoJCW91dCA9IGFwcGVuZChvdXQsIGxpc3RbOnRvXS4uLikKCQlvdXQgPSBhcHBlbmQob3V0LCB2KQoJCXJldHVybiBhcHBlbmQob3V0LCBsaXN0W3RvOl0uLi4pCgl9CglvdXQgOj0gbWFrZShbXWFkZHJlc3MsIDAsIGxlbihsaXN0KSkKCW91dCA9IGFwcGVuZChvdXQsIGxpc3RbOnRvXS4uLikKCW91dCA9IGFwcGVuZChvdXQsIHYpCglvdXQgPSBhcHBlbmQob3V0LCBsaXN0W3RvOmZyb21dLi4uKQoJcmV0dXJuIGFwcGVuZChvdXQsIGxpc3RbZnJvbSsxOl0uLi4pCn0KCi8vIHNwbGljZUludHMgaXMgc3BsaWNlQWRkcnMgZm9yIGEgY29sdW1uIG9mIG51bWJlcnMuCmZ1bmMgc3BsaWNlSW50cyhsaXN0IFtdaW50NjQsIGZyb20sIHRvIGludCwgdiBpbnQ2NCwgc2l6ZSBpbnQpIFtdaW50NjQgewoJaWYgZnJvbSA8IDAgewoJCWlmIGxlbihsaXN0KSA+PSBzaXplIHsKCQkJbGlzdCA9IGxpc3RbOnNpemUtMV0KCQl9CgkJb3V0IDo9IG1ha2UoW11pbnQ2NCwgMCwgbGVuKGxpc3QpKzEpCgkJb3V0ID0gYXBwZW5kKG91dCwgbGlzdFs6dG9dLi4uKQoJCW91dCA9IGFwcGVuZChvdXQsIHYpCgkJcmV0dXJuIGFwcGVuZChvdXQsIGxpc3RbdG86XS4uLikKCX0KCW91dCA6PSBtYWtlKFtdaW50NjQsIDAsIGxlbihsaXN0KSkKCW91dCA9IGFwcGVuZChvdXQsIGxpc3RbOnRvXS4uLikKCW91dCA9IGFwcGVuZChvdXQsIHYpCglvdXQgPSBhcHBlbmQob3V0LCBsaXN0W3RvOmZyb21dLi4uKQoJcmV0dXJuIGFwcGVuZChvdXQsIGxpc3RbZnJvbSsxOl0uLi4pCn0KGqQXCgplcnJvcnMuZ25vEpUXcGFja2FnZSBhcmVuYQoKaW1wb3J0ICJlcnJvcnMiCgovLyBFcnJvcnMgYXJlIHZhbHVlcyBjcmVhdGVkIG9uY2UsIGF0IHBhY2thZ2UgaW5pdDogYSBwYW5pYyB3aXRoIG9uZSBvZiB0aGVtCi8vIGNvc3RzIG5vIGFsbG9jYXRpb24uIE1lc3NhZ2VzIHRoYXQgbmVlZCBhIHZhbHVlIGFyZSBidWlsdCBhdCB0aGUgY2FsbC4KdmFyICgKCWVyclNwb29mZWRSZWFsbSA9IGVycm9ycy5OZXcoImdub2ZseTogc3Bvb2ZlZCByZWFsbSIpCgllcnJOb3RPd25lciAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IGNhbGxlciBpcyBub3QgdGhlIG93bmVyIikKCWVyck5vdEFkbWluICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogY2FsbGVyIGlzIG5vdCBhbiBhZG1pbiIpCgllcnJOb3RSZWZlcmVlICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IGNhbGxlciBpcyBub3QgYSByZWZlcmVlIikKCgllcnJJbnZhbGlkU3BlYyAgICAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IGludmFsaWQgYXJlbmEgc3BlYyIpCgllcnJJbnZhbGlkTW9kZSAgICAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IG1vZGUgbXVzdCBiZSBvbmUgb2Y6IGJhdHRsZS1yb3lhbGUsIGRlYXRobWF0Y2giKQoJZXJySW52YWxpZFN0YWtlICAgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBzdGFrZSBtdXN0IGJlIGJldHdlZW4gMTAwMDAwMCBhbmQgMTAwMDAwMDAwMCB1Z25vdCIpCgllcnJJbnZhbGlkU2VhdHMgICAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IHNlYXRzIG11c3Qgc2F0aXNmeSAyIDw9IG1pblNlYXRzIDw9IG1heFNlYXRzIDw9IDgiKQoJZXJySW52YWxpZExpdmVzICAgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBsaXZlcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMyIpCgllcnJJbnZhbGlkU2Vjb25kcyAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IGdhbWUgdGltZSBtdXN0IGJlIGJldHdlZW4gMzAwIGFuZCAxODAwIHNlY29uZHMiKQoJZXJySW52YWxpZEtpbGxUYXJnZXQgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGUga2lsbCB0YXJnZXQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwIikKCWVyclJveWFsZVRhcmdldCAgICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogYmF0dGxlLXJveWFsZSBoYXMgbm8ga2lsbCB0YXJnZXQ6IHRoZSBsYXN0IG9uZSBmbHlpbmcgd2lucyIpCgllcnJJbnZhbGlkQWRkcmVzcyAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IGludmFsaWQgYWRkcmVzcyIpCgllcnJJbnZhbGlkUmVmdW5kRGVsYXkgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IHJlZnVuZCBkZWxheSBtdXN0IGJlIGJldHdlZW4gNjAgYW5kIDg2NDAwIHNlY29uZHMiKQoJZXJyVW5rbm93bkFyZW5hICAgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB1bmtub3duIGFyZW5hIikKCgllcnJOb3RVc2VyQ2FsbCAgICA9IGVycm9ycy5OZXcoImdub2ZseTogRW50ZXIgbXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYSB1c2VyIChtYWtldHggY2FsbCkiKQoJZXJyRW50cnlDbG9zZWQgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IHRoaXMgYXJlbmEgbm8gbG9uZ2VyIHRha2VzIGVudHJpZXMiKQoJZXJyTm90WWV0Q3JlYXRlZCAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IHRoaXMgYXJlbmEgd2FzIGNyZWF0ZWQgaW4gdGhlIGZ1dHVyZSIpCgllcnJJbnZhbGlkVGlja2V0ICA9IGVycm9ycy5OZXcoImdub2ZseTogdGlja2V0IG11c3QgYmUgNjQgbG93ZXJjYXNlIGhleCBjaGFyYWN0ZXJzIikKCWVyckFscmVhZHlJbkxvYmJ5ID0gZXJyb3JzLk5ldygiZ25vZmx5OiBhbHJlYWR5IGluIHRoZSBsb2JieSBvZiB0aGlzIGFyZW5hIikKCWVyckxvYmJ5RnVsbCAgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGUgbG9iYnkgaXMgZnVsbCIpCgllcnJOb3RJbkxvYmJ5ICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogbm90IGluIHRoZSBsb2JieSBvZiB0aGlzIGFyZW5hIikKCWVyck5vdEV4cGlyZWQgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGlzIGFyZW5hIHN0aWxsIHRha2VzIGVudHJpZXMiKQoKCWVyclJvdW5kUnVubmluZyAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGUgZ2FtZSBvZiB0aGlzIGFyZW5hIGhhcyBzdGFydGVkIikKCWVyclRvb0Zld1BsYXllcnMgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBmZXdlciBwbGF5ZXJzIHRoYW4gdGhlIGFyZW5hIHJlcXVpcmVzIikKCWVyck5vUm91bmQgICAgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGUgZ2FtZSBvZiB0aGlzIGFyZW5hIGlzIG5vdCBydW5uaW5nIikKCWVyclJlZnVuZFRvb0Vhcmx5ID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGUgZ2FtZSBjYW5ub3QgYmUgcmVmdW5kZWQgeWV0IikKCgllcnJCYWRTZXR0bGVtZW50ID0gZXJyb3JzLk5ldygiZ25vZmx5OiBzZXR0bGVtZW50IHJlZnVzZWQ6IHRoZSBydWxlIHBheXMgc29tZW9uZSB3aG8gZGlkIG5vdCBwbGF5LCB0d2ljZSwgb3Igbm90aGluZyIpCgllcnJOb3RDb25zZXJ2ZWQgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBzZXR0bGVtZW50IHJlZnVzZWQ6IHBheW91dHMgYW5kIGZlZSBkbyBub3QgYWRkIHVwIHRvIHRoZSBwb3QiKQoJZXJyRXNjcm93ICAgICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogZXNjcm93IGFjY291bnRpbmcgZXJyb3IiKQoJZXJySW5zb2x2ZW50ICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogdGhlIHJlYWxtIGhvbGRzIGxlc3MgdGhhbiB0aGUgc3Rha2VzIGl0IG93ZXMiKQoKCWVyck5vdGhpbmdUb0NsYWltID0gZXJyb3JzLk5ldygiZ25vZmx5OiBub3RoaW5nIHRvIGNsYWltIikKCWVyckNvcnJ1cHRDbGFpbXMgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBjb3JydXB0IGNsYWltcyByZWNvcmQiKQoKCWVyckNvcnJ1cHRSZXN1bHQgICA9IGVycm9ycy5OZXcoImdub2ZseTogY29ycnVwdCByZXN1bHQgcmVjb3JkIikKCWVyckNvcnJ1cHRFYXJuaW5ncyA9IGVycm9ycy5OZXcoImdub2ZseTogY29ycnVwdCBlYXJuaW5ncyByZWNvcmQiKQopChqaFAoKZXNjcm93LmdubxKLFHBhY2thZ2UgYXJlbmEKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgopCgovLyBUaGUgbW9uZXkgb2YgdGhlIHJlYWxtIGdvZXMgdGhyb3VnaCB0aGUgZm91ciBmdW5jdGlvbnMgYmVsb3cgYW5kIG5vd2hlcmUKLy8gZWxzZS4KLy8KLy8gZXNjcm93ZWQgaXMgd2hhdCB0aGUgcmVhbG0gb3dlczogdGhlIHN0YWtlcyBvZiBldmVyeSBsb2JieSBhbmQgb2YgZXZlcnkKLy8gcnVubmluZyByb3VuZCwgaW4gdWdub3QuIEl0IGdvZXMgdXAgaW4gaG9sZCwgd2hlbiBhIHBsYXllciBlbnRlcnMsIGFuZAovLyBkb3duIGluIHJlbGVhc2UsIGJlZm9yZSBjb2lucyBsZWF2ZS4gVGhlIGJhbGFuY2Ugb2YgdGhlIHJlYWxtJ3MgYWRkcmVzcyBpcwovLyB3aGF0IGl0IGhhcy4gVGhlIHJ1bGUgb2YgdGhpcyBmaWxlIGlzCi8vCi8vCWJhbGFuY2UgPj0gZXNjcm93ZWQsIGFuZCBiYWxhbmNlID09IGVzY3Jvd2VkIHVubGVzcyBzb21lb25lIGdhdmUgY29pbnMgYXdheQovLwovLyBDb2lucyBjYW4gb25seSBjb21lIGluIHRocm91Z2ggRW50ZXI6IHRoZSBjaGFpbiByZWZ1c2VzIGEgY2FsbCB0aGF0Ci8vIGF0dGFjaGVzIGNvaW5zIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCByZWFkIHRoZW0uIFNvbWVvbmUgY2FuIHN0aWxsCi8vIHNlbmQgY29pbnMgc3RyYWlnaHQgdG8gdGhlIHJlYWxtJ3MgYWRkcmVzcyB3aXRoIGEgYmFuayB0cmFuc2Zlci4gU3VjaAovLyBjb2lucyBhcmUgb3dlZCB0byBub2JvZHksIG5vIGZ1bmN0aW9uIHNwZW5kcyB0aGVtLCBhbmQgdGhleSBzdGF5IHRoZXJlLgovLwovLyBFdmVyeSBmdW5jdGlvbiB0aGF0IG1vdmVzIG1vbmV5IGVuZHMgd2l0aCBhc3NlcnRTb2x2ZW50LiBJZiBhIG1pc3Rha2UgaW4KLy8gdGhpcyByZWFsbSBldmVyIG1hZGUgYSBwYXRoIHNlbmQgbW9yZSB0aGFuIGl0IHJlbGVhc2VkLCB0aGUgcmVhbG0gd291bGQgYmUKLy8gcGF5aW5nIG9uZSBwbGF5ZXIgd2l0aCB0aGUgc3Rha2Ugb2YgYW5vdGhlcjogdGhlIGNoZWNrIHR1cm5zIHRoYXQgaW50byBhbgovLyBhYm9ydGVkIHRyYW5zYWN0aW9uLCB3aGljaCB0YWtlcyB0aGUgcGF5bWVudHMgYmFjayB3aXRoIGl0LgoKLy8gcGF5RGVub20gaXMgdGhlIG9ubHkgY29pbiB0aGUgcmVhbG0gZGVhbHMgaW4uCmNvbnN0IHBheURlbm9tID0gInVnbm90IgoKLy8gaG9sZCByZWNvcmRzIHRoYXQgdGhlIHJlYWxtIHJlY2VpdmVkIGFtb3VudCBpbiBzdGFrZXMuCmZ1bmMgaG9sZChhbW91bnQgaW50NjQpIHsKCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYyhlcnJFc2Nyb3cpCgl9Cgllc2Nyb3dlZCArPSBhbW91bnQKfQoKLy8gcmVsZWFzZSB0YWtlcyBhbW91bnQgb3V0IG9mIHdoYXQgdGhlIHJlYWxtIG93ZXMuIEl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlCi8vIGNvaW5zIGFyZSBzZW50LCBhbmQgaXQgcGFuaWNzIHJhdGhlciB0aGFuIGxldCB0aGUgY291bnRlciBnbyBiZWxvdyB6ZXJvLgpmdW5jIHJlbGVhc2UoYW1vdW50IGludDY0KSB7CglpZiBhbW91bnQgPD0gMCB8fCBhbW91bnQgPiBlc2Nyb3dlZCB7CgkJcGFuaWMoZXJyRXNjcm93KQoJfQoJZXNjcm93ZWQgLT0gYW1vdW50Cn0KCi8vIHBheSBzZW5kcyBhbW91bnQgdWdub3QgZnJvbSB0aGUgcmVhbG0ncyBvd24gYmFsYW5jZSB0byBhbiBhZGRyZXNzLgovLwovLyBBIFJlYWxtU2VuZCBiYW5rZXIgY2FuIHNwZW5kIGV2ZXJ5dGhpbmcgdGhlIHJlYWxtIGhvbGRzLCB3aGljaCBpcyB3aHkgaXQKLy8gaXMgYnVpbHQgaGVyZSBhbmQgb25seSBoZXJlLCBmcm9tIHRoZSBsaXZlIGN1ciBvZiB0aGUgY3Jvc3NpbmcgZnVuY3Rpb24KLy8gKHJsbSksIGFuZCBuZXZlciBrZXB0LiBUaGUgYmFuayBhYm9ydHMgdGhlIHRyYW5zYWN0aW9uIGlmIHRoZSByZWFsbSBkb2VzCi8vIG5vdCBoYXZlIHRoZSBjb2lucy4KZnVuYyBwYXkoXyBpbnQsIHJsbSByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7CglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoZXJyRXNjcm93KQoJfQoJY29pbnMgOj0gY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihwYXlEZW5vbSwgYW1vdW50KSkKCWJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIHJsbSkuU2VuZENvaW5zKHJsbS5BZGRyZXNzKCksIHRvLCBjb2lucykKfQoKLy8gYXNzZXJ0U29sdmVudCBwYW5pY3MgdW5sZXNzIHRoZSByZWFsbSBob2xkcyBhdCBsZWFzdCB3aGF0IGl0IG93ZXMuCmZ1bmMgYXNzZXJ0U29sdmVudChfIGludCwgcmxtIHJlYWxtKSB7CglpZiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKHJsbS5BZGRyZXNzKCksIHBheURlbm9tKSA8IGVzY3Jvd2VkIHsKCQlwYW5pYyhlcnJJbnNvbHZlbnQpCgl9Cn0KCi8vIEVzY3Jvd2VkIHJldHVybnMgd2hhdCB0aGUgcmVhbG0gb3dlcyB0byBwbGF5ZXJzLCBpbiB1Z25vdDogdGhlIHN0YWtlcyBvZgovLyBldmVyeSBsb2JieSBhbmQgb2YgZXZlcnkgcnVubmluZyByb3VuZC4gVGhlIGJhbGFuY2Ugb2YgdGhlIHJlYWxtJ3MKLy8gYWRkcmVzcyBpcyBuZXZlciBiZWxvdyBpdC4KZnVuYyBFc2Nyb3dlZCgpIGludDY0IHsKCXJldHVybiBlc2Nyb3dlZAp9ChpqCgtnbm9tb2QudG9tbBJbbW9kdWxlID0gImduby5sYW5kL3IvZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZC9nbm9mbHkvYXJlbmEvdjAiCmdubyA9ICIwLjkiChqVMAoIanNvbi5nbm8SiDBwYWNrYWdlIGFyZW5hCgppbXBvcnQgInN0cmluZ3MiCgovLyBUaGUgSlNPTiBkb2N1bWVudHMgYXJlIGJ1aWx0IGJ5IGhhbmQuIFRoYXQgaXMgc2FmZSBiZWNhdXNlIGV2ZXJ5IHN0cmluZwovLyB0aGF0IHJlYWNoZXMgdGhlbSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgYSBKU09OLXNhZmUgY2hhcnNldCB3aGVuIGl0IHdhcwovLyB3cml0dGVuOiBpZHMgYXJlIGhleCwgbW9kZXMgYW5kIG5vbmNlcyBbYS16MC05LV0sIHRpY2tldHMgaGV4LCBhZGRyZXNzZXMKLy8gYmVjaDMyLiBUaGUgb25lIHN0cmluZyB0aGF0IGlzIG5vdCB1bmRlciB0aGUgcmVhbG0ncyBjb250cm9sLCBhbiBhZGRyZXNzCi8vIHR5cGVkIGludG8gYSBxdWVyeSwgZ29lcyB0aHJvdWdoIHF1b3RlLgovLwovLyBPcmRlcmluZyBpcyBkZXRlcm1pbmlzdGljIGV2ZXJ5d2hlcmU6IGFyZW5hcyBmb2xsb3cgdGhlaXIgaWQgKHRoZSB0cmVlCi8vIGl0ZXJhdGVzIGluIGtleSBvcmRlciksIGEgbG9iYnkgYW5kIGEgcm91bmQgdGhlIG9yZGVyIG9mIGVudHJ5LCByZXN1bHRzCi8vIGFyZSBuZXdlc3QgZmlyc3QgYW5kIGVhcm5pbmdzIGJlc3QgZmlyc3QuCgovLyBBcmVuYXNKU09OIHJldHVybnMgZXZlcnkgYXJlbmEgc29tZW9uZSBwYWlkIGludG8gYW5kIHdob3NlIGdhbWUgaXMgbm90Ci8vIG92ZXIsIGFzIGEgSlNPTiBhcnJheSBzb3J0ZWQgYnkgaWQ6Ci8vCi8vCVsKLy8JICB7ICJpZCI6ICIzZjJhLi4uIiwgIm1vZGUiOiAiZGVhdGhtYXRjaCIsICJzdGFrZSI6IDEwMDAwMDAwLAovLwkgICAgIm1pblNlYXRzIjogMiwgIm1heFNlYXRzIjogOCwgImxpdmVzIjogMywgInNlY29uZHMiOiA5MDAsICJraWxsVGFyZ2V0IjogNSwKLy8JICAgICJjcmVhdG9yIjogImcxLi4uIiwgImNyZWF0ZWQiOiAxNzkwOTUwMDAwLCAibm9uY2UiOiAiazN4OSIsCi8vCSAgICAibG9iYnkiOiBbIHsgImFkZHJlc3MiOiAiZzEuLi4iLCAidGlja2V0IjogIjlmODZkMC4uLjAwYTA4IiB9IF0sCi8vCSAgICAicm91bmQiOiB7ICJzdGFydGVkQXQiOiAxNzkwOTUwMzAwLCAicGxheWVycyI6IFsgImcxLi4uIiwgImcxLi4uIiBdIH0gfQovLwldCi8vCi8vIFRoZSBvdXRwdXQgaGFzIG5vIHdoaXRlc3BhY2UuICJyb3VuZCIgaXMgbnVsbCB1bnRpbCB0aGUgZ2FtZSBzdGFydHMuCi8vIFRoZSBmaWVsZHMgZnJvbSAibW9kZSIgdG8gIm5vbmNlIiBhcmUgdGhlIGFyZW5hJ3Mgc3BlYzogdGhlIGdhbWUgc2VydmVyCi8vIHJlYnVpbGRzIHRoZSBzcGVjIHN0cmluZywgYW5kIHNvIHRoZSBpZCwgZnJvbSB0aGVtLgpmdW5jIEFyZW5hc0pTT04oKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlQnl0ZSgnWycpCglmaXJzdCA6PSB0cnVlCglhcmVuYXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoaWQgc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJaWYgIWZpcnN0IHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQlmaXJzdCA9IGZhbHNlCgkJd3JpdGVBcmVuYSgmYiwgaWQsIHYuKCphcmVuYSkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJYi5Xcml0ZUJ5dGUoJ10nKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gQXJlbmFKU09OIHJldHVybnMgb25lIGFyZW5hIGluIHRoZSBzaGFwZSBvZiBBcmVuYXNKU09OLCBvciBudWxsLgpmdW5jIEFyZW5hSlNPTihpZCBzdHJpbmcpIHN0cmluZyB7CglhIDo9IGdldEFyZW5hKGlkKQoJaWYgYSA9PSBuaWwgewoJCXJldHVybiAibnVsbCIKCX0KCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJd3JpdGVBcmVuYSgmYiwgaWQsIGEpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHdyaXRlQXJlbmEoYiAqc3RyaW5ncy5CdWlsZGVyLCBpZCBzdHJpbmcsIGEgKmFyZW5hKSB7CgliLldyaXRlU3RyaW5nKGB7ImlkIjoiYCArIGlkICsgYCIsIm1vZGUiOiJgICsgYS5tb2RlICsgYCJgKQoJZm9yIF8sIGYgOj0gcmFuZ2UgW11zdHJ1Y3QgewoJCWsgc3RyaW5nCgkJdiBpbnQ2NAoJfXt7InN0YWtlIiwgYS5zdGFrZX0sIHsibWluU2VhdHMiLCBhLm1pblNlYXRzfSwgeyJtYXhTZWF0cyIsIGEubWF4U2VhdHN9LCB7ImxpdmVzIiwgYS5saXZlc30sCgkJeyJzZWNvbmRzIiwgYS5zZWNvbmRzfSwgeyJraWxsVGFyZ2V0IiwgYS5raWxsVGFyZ2V0fX0gewoJCWIuV3JpdGVTdHJpbmcoYCwiYCArIGYuayArIGAiOmAgKyBpdG9hKGYudikpCgl9CgliLldyaXRlU3RyaW5nKGAsImNyZWF0b3IiOiJgICsgYS5jcmVhdG9yLlN0cmluZygpICsgYCIsImNyZWF0ZWQiOmAgKyBpdG9hKGEuY3JlYXRlZCkgKyBgLCJub25jZSI6ImAgKyBhLm5vbmNlICsgYCJgKQoJYi5Xcml0ZVN0cmluZyhgLCJsb2JieSI6W2ApCglmb3IgaSwgcCA6PSByYW5nZSBhLmxvYmJ5IHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVCeXRlKCcsJykKCQl9CgkJYi5Xcml0ZVN0cmluZyhgeyJhZGRyZXNzIjoiYCArIHAuU3RyaW5nKCkgKyBgIiwidGlja2V0IjoiYCArIGEudGlja2V0c1tpXSArIGAifWApCgl9CgliLldyaXRlU3RyaW5nKGBdLCJyb3VuZCI6YCkKCWlmIGEucm91bmQgPT0gbmlsIHsKCQliLldyaXRlU3RyaW5nKCJudWxsfSIpCgkJcmV0dXJuCgl9CgliLldyaXRlU3RyaW5nKGB7InN0YXJ0ZWRBdCI6YCArIGl0b2EoYS5yb3VuZC5zdGFydGVkQXQpICsgYCwicGxheWVycyI6W2ApCglmb3IgaSwgcCA6PSByYW5nZSBhLnJvdW5kLnBsYXllcnMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQliLldyaXRlU3RyaW5nKGAiYCArIHAuU3RyaW5nKCkgKyBgImApCgl9CgliLldyaXRlU3RyaW5nKCJdfX0iKQp9CgovLyBSZXN1bHRzSlNPTiByZXR1cm5zIHRoZSBsYXN0IGNsb3NlZCBnYW1lcywgbmV3ZXN0IGZpcnN0LCBhdCBtb3N0IDUwOgovLwovLwlbIHsgImlkIjogIjNmMmEuLi4iLCAibW9kZSI6ICJkZWF0aG1hdGNoIiwgInN0YWtlIjogMTAwMDAwMDAsCi8vCSAgICAib3V0Y29tZSI6ICJzZXR0bGVkIiwgInBsYXllcnMiOiAyLCAicG90IjogMjAwMDAwMDAsICJmZWUiOiA1MDAwMDAsCi8vCSAgICAiY2xvc2VkQXQiOiAxNzkwOTUxMDAwLAovLwkgICAgInBheW91dHMiOiBbIHsgImFkZHJlc3MiOiAiZzEuLi4iLCAiYW1vdW50IjogMTk1MDAwMDAgfSBdIH0gXQpmdW5jIFJlc3VsdHNKU09OKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZUJ5dGUoJ1snKQoJZm9yIGkgOj0gbGVuKGNsb3NlZCkgLSAxOyBpID49IDA7IGktLSB7CgkJaWYgaSA8IGxlbihjbG9zZWQpLTEgewoJCQliLldyaXRlQnl0ZSgnLCcpCgkJfQoJCXIsIF8gOj0gcmVzdWx0T2YoY2xvc2VkW2ldKQoJCXdyaXRlUmVzdWx0KCZiLCBjbG9zZWRbaV0sIHIpCgl9CgliLldyaXRlQnl0ZSgnXScpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBSZXN1bHRKU09OIHJldHVybnMgdGhlIHJlc3VsdCBvZiBvbmUgY2xvc2VkIGdhbWUgaW4gdGhlIHNoYXBlIG9mCi8vIFJlc3VsdHNKU09OLCBvciBudWxsIHdoZW4gdGhlIHJlYWxtIGRvZXMgbm90IGhhdmUgaXQgKHN0aWxsIHJ1bm5pbmcsIG9yCi8vIHRvbyBvbGQpLgpmdW5jIFJlc3VsdEpTT04oaWQgc3RyaW5nKSBzdHJpbmcgewoJciwgb2sgOj0gcmVzdWx0T2YoaWQpCglpZiAhb2sgewoJCXJldHVybiAibnVsbCIKCX0KCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJd3JpdGVSZXN1bHQoJmIsIGlkLCByKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyB3cml0ZVJlc3VsdChiICpzdHJpbmdzLkJ1aWxkZXIsIGlkIHN0cmluZywgciByZXN1bHQpIHsKCWIuV3JpdGVTdHJpbmcoYHsiaWQiOiJgICsgaWQgKyBgIiwibW9kZSI6ImAgKyByLm1vZGUgKyBgIiwic3Rha2UiOmAgKyBpdG9hKHIuc3Rha2UpICsKCQlgLCJvdXRjb21lIjoiYCArIHIub3V0Y29tZSArIGAiLCJwbGF5ZXJzIjpgICsgaXRvYShyLnBsYXllcnMpICsgYCwicG90IjpgICsgaXRvYShyLnBvdCkgKwoJCWAsImZlZSI6YCArIGl0b2Eoci5mZWUpICsgYCwiY2xvc2VkQXQiOmAgKyBpdG9hKHIuY2xvc2VkQXQpICsgYCwicGF5b3V0cyI6W2ApCglmb3IgaSwgcCA6PSByYW5nZSByLnBheW91dHMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQliLldyaXRlU3RyaW5nKGB7ImFkZHJlc3MiOiJgICsgcC5BZGRyZXNzLlN0cmluZygpICsgYCIsImFtb3VudCI6YCArIGl0b2EocC5BbW91bnQpICsgYH1gKQoJfQoJYi5Xcml0ZVN0cmluZygiXX0iKQp9CgovLyBFYXJuaW5nc0pTT04gcmV0dXJucyB0aGUgdG9wIHdpbm5lcnMgYXMgYSBKU09OIGFycmF5LCBiZXN0IGZpcnN0LCBhdCBtb3N0Ci8vIDEwIGVudHJpZXM6Ci8vCi8vCVsgeyAiYWRkcmVzcyI6ICJnMS4uLiIsICJ3b24iOiAxOTAwMDAwMCwgInJvdW5kcyI6IDMgfSBdCi8vCi8vIFRoZSBvdXRwdXQgaGFzIG5vIHdoaXRlc3BhY2UuICJ3b24iIGFkZHMgdXAsIHJvdW5kIGFmdGVyIHJvdW5kLCB3aGF0IHRoZQovLyBwbGF5ZXIgd2FzIHBhaWQgYWJvdmUgdGhlaXIgb3duIHN0YWtlLCBuZXZlciBsZXNzIHRoYW4gemVybyBmb3IgYSByb3VuZC4KLy8gInJvdW5kcyIgaXMgaG93IG1hbnkgc2V0dGxlZCByb3VuZHMgdGhleSBwbGF5ZWQuIFdpdGggZXF1YWwgd2lubmluZ3MsIHRoZQovLyBwbGF5ZXIgd2hvIGdvdCB0aGVyZSBmaXJzdCBzdGF5cyBhaGVhZC4KZnVuYyBFYXJuaW5nc0pTT04oKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlQnl0ZSgnWycpCglmb3IgaSwgYWRkciA6PSByYW5nZSB3aW5uZXJzLmFkZHJzIHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVCeXRlKCcsJykKCQl9CgkJd3JpdGVUb3RhbHMoJmIsIGAiYCthZGRyLlN0cmluZygpK2AiYCwgdG90YWxzT2YoYWRkcikpCgl9CgliLldyaXRlQnl0ZSgnXScpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBQbGF5ZXJKU09OIHJldHVybnMgb25lIHBsYXllcidzIHRvdGFscyBhcyBhIEpTT04gb2JqZWN0OgovLwovLwl7ICJhZGRyZXNzIjogImcxLi4uIiwgIndvbiI6IDE5MDAwMDAwLCAicm91bmRzIjogMyB9Ci8vCi8vIFRoZSBvdXRwdXQgaGFzIG5vIHdoaXRlc3BhY2UuIEFuIHVua25vd24gYWRkcmVzcyByZXR1cm5zIHRoZSBzYW1lIHNoYXBlCi8vIHdpdGggemVybyB3b24gYW5kIHplcm8gcm91bmRzLgpmdW5jIFBsYXllckpTT04oYWRkciBhZGRyZXNzKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgl3cml0ZVRvdGFscygmYiwgcXVvdGUoYWRkci5TdHJpbmcoKSksIHRvdGFsc09mKGFkZHIpKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gd3JpdGVUb3RhbHMgd3JpdGVzIHRoZSB0b3RhbHMgb2YgYSBwbGF5ZXIuIHF1b3RlZCBpcyB0aGUgcGxheWVyJ3MgYWRkcmVzcwovLyBhcyBhIEpTT04gc3RyaW5nIGxpdGVyYWwsIHF1b3RlcyBpbmNsdWRlZC4KZnVuYyB3cml0ZVRvdGFscyhiICpzdHJpbmdzLkJ1aWxkZXIsIHF1b3RlZCBzdHJpbmcsIHQgdG90YWxzKSB7CgliLldyaXRlU3RyaW5nKGB7ImFkZHJlc3MiOmApCgliLldyaXRlU3RyaW5nKHF1b3RlZCkKCWIuV3JpdGVTdHJpbmcoYCwid29uIjpgKQoJYi5Xcml0ZVN0cmluZyhpdG9hKHQud29uKSkKCWIuV3JpdGVTdHJpbmcoYCwicm91bmRzIjpgKQoJYi5Xcml0ZVN0cmluZyhpdG9hKHQucm91bmRzKSkKCWIuV3JpdGVCeXRlKCd9JykKfQoKLy8gcXVvdGUgcmV0dXJucyBzIGFzIGEgSlNPTiBzdHJpbmcgbGl0ZXJhbCwgcXVvdGVzIGluY2x1ZGVkLiBJdCBpcyBmb3IgdGhlCi8vIHN0cmluZ3MgdGhlIHJlYWxtIGRpZCBub3QgdmFsaWRhdGUuIFF1b3RlcyBhbmQgYmFja3NsYXNoZXMgYXJlIGVzY2FwZWQgYW5kCi8vIGFueXRoaW5nIG91dHNpZGUgcHJpbnRhYmxlIEFTQ0lJIGlzIHJlcGxhY2VkIGJ5ICI/Iiwgc28gdGhlIHJlc3VsdCBpcwovLyB2YWxpZCBKU09OIHdoYXRldmVyIHMgaG9sZHMuCmZ1bmMgcXVvdGUocyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVCeXRlKCciJykKCWZvciBpIDo9IDA7IGkgPCBsZW4ocyk7IGkrKyB7CgkJYyA6PSBzW2ldCgkJc3dpdGNoIHsKCQljYXNlIGMgPT0gJyInIHx8IGMgPT0gJ1xcJzoKCQkJYi5Xcml0ZUJ5dGUoJ1xcJykKCQkJYi5Xcml0ZUJ5dGUoYykKCQljYXNlIGMgPCAweDIwIHx8IGMgPiAweDdlOgoJCQliLldyaXRlQnl0ZSgnPycpCgkJZGVmYXVsdDoKCQkJYi5Xcml0ZUJ5dGUoYykKCQl9Cgl9CgliLldyaXRlQnl0ZSgnIicpCglyZXR1cm4gYi5TdHJpbmcoKQp9ChrVLQoJbG9iYnkuZ25vEsctcGFja2FnZSBhcmVuYQoKaW1wb3J0ICgKCSJjaGFpbiIKCgkvLyBPbmx5IGZvciBPcmlnaW5TZW5kLCBpbiBFbnRlci4gQ2FsbGVyIGlkZW50aXR5IGFsd2F5cyBjb21lcyBmcm9tCgkvLyBjdXIuUHJldmlvdXMoKSwgbmV2ZXIgZnJvbSB0aGlzIHBhY2thZ2UuCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCikKCi8vIGFyZW5hIGlzIG9uZSBnYW1lOiBpdHMgc3BlYywgdGhlIHBsYXllcnMgd2hvIHBhaWQgYW5kIHdhaXQsIGFuZCBvbmNlIGl0Ci8vIHN0YXJ0ZWQsIGl0cyByb3VuZC4gSXQgaXMgc3RvcmVkIGZyb20gdGhlIGZpcnN0IHBhaWQgZW50cnkgYW5kIGRlbGV0ZWQKLy8gd2hlbiBpdHMgcm91bmQgaXMgY2xvc2VkIG9yIGl0cyBsb2JieSBlbXB0aWVzLgp0eXBlIGFyZW5hIHN0cnVjdCB7CglzcGVjCglsb2JieSAgIFtdYWRkcmVzcwoJdGlja2V0cyBbXXN0cmluZyAvLyBTSEEtMjU2IG9mIGVhY2ggcGxheWVyJ3Mgc2VjcmV0LCA2NCBoZXggY2hhcmFjdGVycwoJcm91bmQgICAqcm91bmQgICAvLyBuaWwgdW50aWwgdGhlIGdhbWUgc3RhcnRzCn0KCmZ1bmMgZ2V0QXJlbmEoaWQgc3RyaW5nKSAqYXJlbmEgewoJdiA6PSBhcmVuYXMuR2V0KGlkKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqYXJlbmEpCn0KCmZ1bmMgbXVzdEFyZW5hKGlkIHN0cmluZykgKmFyZW5hIHsKCWEgOj0gZ2V0QXJlbmEoaWQpCglpZiBhID09IG5pbCB7CgkJcGFuaWMoZXJyVW5rbm93bkFyZW5hKQoJfQoJcmV0dXJuIGEKfQoKLy8gRW50ZXIgcHV0cyB0aGUgY2FsbGVyIGluIHRoZSBsb2JieSBvZiB0aGUgYXJlbmEgdGhhdCBzcGVjIGRlc2NyaWJlcywgYW5kCi8vIHJldHVybnMgaXRzIGlkLiBUaGUgZXhhY3Qgc3Rha2UgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNhY3Rpb24KLy8gKC1zZW5kICI8c3Rha2U+dWdub3QiKSBhbmQgc3RheXMgaW4gdGhlIHJlYWxtIHVudGlsIHRoZSBwbGF5ZXIgbGVhdmVzIG9yCi8vIHRoZSBnYW1lIGlzIG92ZXIuCi8vCi8vIFRoZSBmaXJzdCBlbnRyeSBjcmVhdGVzIHRoZSBhcmVuYSwgdGhlIG5leHQgb25lcyBqb2luIGl0OiB0aGUgcmVhbG0KLy8gcmVjb21wdXRlcyB0aGUgaWQgZnJvbSB0aGUgc3BlYyBldmVyeSB0aW1lLiBBbiBhcmVuYSB0YWtlcyBlbnRyaWVzIGZvciBhbgovLyBob3VyIGFmdGVyIGl0IHdhcyBjcmVhdGVkLCBhbmQgdW50aWwgaXRzIGdhbWUgc3RhcnRzLgovLwovLyB0aWNrZXQgaXMgNjQgbG93ZXJjYXNlIGhleCBjaGFyYWN0ZXJzLCB0aGUgU0hBLTI1NiBvZiBhIHNlY3JldCB0aGUKLy8gcGxheWVyJ3MgY2xpZW50IG1hZGUgdXA6IHRoZSBnYW1lIHNlcnZlciBnaXZlcyB0aGUgc2VhdCB0byB3aG9ldmVyIHNob3dzCi8vIHRoZSBzZWNyZXQuCi8vCi8vIEl0IG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGEgdXNlciAobWFrZXR4IGNhbGwpOiBhIGNhbGwgcmVsYXllZCBieQovLyBhbm90aGVyIHJlYWxtIG9yIGJ5IGEgbWFrZXR4IHJ1biBzY3JpcHQgaXMgcmVmdXNlZC4KZnVuYyBFbnRlcihjdXIgcmVhbG0sIHNwZWMgc3RyaW5nLCB0aWNrZXQgc3RyaW5nKSBzdHJpbmcgewoJcGxheWVyIDo9IGNhbGxlck9mKDAsIGN1cikKCS8vIFBhaWQtY2FsbCBndWFyZDogdHdvIGNoZWNrcyB0aGF0IGFyZSBvbmx5IGNvcnJlY3QgdG9nZXRoZXIuCgkvLwoJLy8gKGEpIFRoZSBjYWxsZXIgaXMgYSBwbGFpbiB1c2VyIGFjY291bnQuIE9ubHkgdGhlbiBpcyB0aGUgLXNlbmQKCS8vICAgICBlbnZlbG9wZSBndWFyYW50ZWVkIHRvIGhhdmUgbGFuZGVkIGF0IHRoaXMgcmVhbG0ncyBhZGRyZXNzLiBBCgkvLyAgICAgcmVsYXlpbmcgcmVhbG0gb3IgYSBtYWtldHggcnVuIHNjcmlwdCBjYW4gYXR0YWNoIGNvaW5zIHRvIHRoZQoJLy8gICAgIHRyYW5zYWN0aW9uIGFuZCBrZWVwIHRoZW0sIHdoaWxlIE9yaWdpblNlbmQgc3RpbGwgcmVwb3J0cyB0aGVtLgoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoZXJyTm90VXNlckNhbGwpCgl9CglzcCA6PSBwYXJzZVNwZWMoc3BlYykKCWlkIDo9IGlkT2Yoc3BlYykKCXQgOj0gbm93KCkKCWlmIHQgPiBzcC5jcmVhdGVkK2VudHJ5V2luZG93IHsKCQlwYW5pYyhlcnJFbnRyeUNsb3NlZCkKCX0KCWlmIHNwLmNyZWF0ZWQgPiB0K2Nsb2NrU2tldyB7CgkJcGFuaWMoZXJyTm90WWV0Q3JlYXRlZCkKCX0KCWlmICF2YWxpZFRpY2tldCh0aWNrZXQpIHsKCQlwYW5pYyhlcnJJbnZhbGlkVGlja2V0KQoJfQoJYSA6PSBnZXRBcmVuYShpZCkKCWlmIGEgPT0gbmlsIHsKCQlhID0gJmFyZW5he3NwZWM6IHNwfQoJfQoJaWYgYS5yb3VuZCAhPSBuaWwgewoJCXBhbmljKGVyclJvdW5kUnVubmluZykKCX0KCWlmIGluZGV4T2ZBZGRyKGEubG9iYnksIHBsYXllcikgPj0gMCB7CgkJcGFuaWMoZXJyQWxyZWFkeUluTG9iYnkpCgl9CglpZiBpbnQ2NChsZW4oYS5sb2JieSkpID49IGEubWF4U2VhdHMgewoJCXBhbmljKGVyckxvYmJ5RnVsbCkKCX0KCS8vIChiKSBUaGUgZW52ZWxvcGUgaXMgZXhhY3RseSB0aGUgc3Rha2U6IG9uZSBjb2luLCB0aGUgcmlnaHQgZGVub20sIHRoZQoJLy8gICAgIHJpZ2h0IGFtb3VudC4gQW55dGhpbmcgZWxzZSB3b3VsZCBlaXRoZXIgdW5kZXJwYXkgb3IgbGVhdmUgY29pbnMKCS8vICAgICBpbiB0aGUgcmVhbG0gdGhhdCBpdCBvd2VzIHRvIG5vYm9keS4KCXNlbnQgOj0gdW5zYWZlLk9yaWdpblNlbmQoKQoJaWYgbGVuKHNlbnQpICE9IDEgfHwgc2VudFswXS5EZW5vbSAhPSBwYXlEZW5vbSB8fCBzZW50WzBdLkFtb3VudCAhPSBhLnN0YWtlIHsKCQlwYW5pYygiZ25vZmx5OiB3cm9uZyBwYXltZW50LCBzZW5kIGV4YWN0bHkgIiArIGl0b2EoYS5zdGFrZSkgKyBwYXlEZW5vbSkKCX0KCgkvLyBUaGUgY29pbnMgYXJlIGFscmVhZHkgYXQgdGhlIHJlYWxtJ3MgYWRkcmVzczogdGhlIGNoYWluIG1vdmVkIHRoZW0KCS8vIGJlZm9yZSB0aGUgY2FsbC4gQWxsIHRoYXQgaXMgbGVmdCBpcyB0byB3cml0ZSBkb3duIHdobyB0aGV5IGJlbG9uZyB0by4KCWEubG9iYnkgPSB3aXRoQWRkcihhLmxvYmJ5LCBwbGF5ZXIpCglhLnRpY2tldHMgPSB3aXRoU3RyaW5nKGEudGlja2V0cywgdGlja2V0KQoJYXJlbmFzLlNldChpZCwgYSkKCWhvbGQoYS5zdGFrZSkKCS8vIFRoZSBndWFyZCBhYm92ZSBzYXlzIHRoZSBjb2lucyBhcnJpdmVkLiBUaGlzIGxvb2tzIGF0IHRoZSBiYWxhbmNlLgoJYXNzZXJ0U29sdmVudCgwLCBjdXIpCgoJY2hhaW4uRW1pdCgiRW50ZXJlZCIsCgkJImFyZW5hIiwgaWQsCgkJInBsYXllciIsIHBsYXllci5TdHJpbmcoKSwKCQkic3Rha2UiLCBpdG9hKGEuc3Rha2UpLAoJCSJ0aWNrZXQiLCB0aWNrZXQsCgkJImxvYmJ5IiwgaXRvYShpbnQ2NChsZW4oYS5sb2JieSkpKSwKCSkKCXJldHVybiBpZAp9CgovLyBMZWF2ZSB0YWtlcyB0aGUgY2FsbGVyIG91dCBvZiB0aGUgbG9iYnkgb2YgYW4gYXJlbmEgYW5kIHNlbmRzIHRoZWlyIHN0YWtlCi8vIGJhY2suIEl0IHdvcmtzIHVudGlsIHRoZSBnYW1lIHN0YXJ0cy4gVGhlIGxhc3QgcGxheWVyIG91dCBkZWxldGVzIHRoZQovLyBhcmVuYTogbm90aGluZyBpcyBsZWZ0IG9uIGNoYWluIG9mIGEgZ2FtZSBub2JvZHkgcGxheWVkLgpmdW5jIExlYXZlKGN1ciByZWFsbSwgaWQgc3RyaW5nKSB7CglwbGF5ZXIgOj0gY2FsbGVyT2YoMCwgY3VyKQoJYSA6PSBtdXN0QXJlbmEoaWQpCglzZWF0IDo9IGluZGV4T2ZBZGRyKGEubG9iYnksIHBsYXllcikKCWlmIHNlYXQgPCAwIHsKCQlwYW5pYyhlcnJOb3RJbkxvYmJ5KQoJfQoJYS5sb2JieSA9IHdpdGhvdXRBZGRyKGEubG9iYnksIHNlYXQpCglhLnRpY2tldHMgPSB3aXRob3V0U3RyaW5nKGEudGlja2V0cywgc2VhdCkKCWlmIGxlbihhLmxvYmJ5KSA9PSAwIHsKCQlhcmVuYXMuUmVtb3ZlKGlkKQoJfQoJcmVsZWFzZShhLnN0YWtlKQoKCXBheSgwLCBjdXIsIHBsYXllciwgYS5zdGFrZSkKCWFzc2VydFNvbHZlbnQoMCwgY3VyKQoKCWNoYWluLkVtaXQoIkxlZnQiLAoJCSJhcmVuYSIsIGlkLAoJCSJwbGF5ZXIiLCBwbGF5ZXIuU3RyaW5nKCksCgkJInN0YWtlIiwgaXRvYShhLnN0YWtlKSwKCSkKfQoKLy8gRXhwaXJlTG9iYnkgY2xvc2VzIGFuIGFyZW5hIHdob3NlIGdhbWUgbmV2ZXIgc3RhcnRlZDogZXZlcnkgcGxheWVyIGluIHRoZQovLyBsb2JieSBnZXRzIHRoZWlyIHN0YWtlIGJhY2ssIGFuZCB0aGUgYXJlbmEgaXMgZGVsZXRlZC4gQW55b25lIGNhbiBjYWxsIGl0Ci8vIG9uY2UgdGhlIGFyZW5hIHN0b3BwZWQgdGFraW5nIGVudHJpZXMsIGFuIGhvdXIgYWZ0ZXIgaXQgd2FzIGNyZWF0ZWQuCmZ1bmMgRXhwaXJlTG9iYnkoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHsKCWNhbGxlciA6PSBjYWxsZXJPZigwLCBjdXIpCglhIDo9IG11c3RBcmVuYShpZCkKCWlmIGEucm91bmQgIT0gbmlsIHsKCQlwYW5pYyhlcnJSb3VuZFJ1bm5pbmcpCgl9CglpZiBub3coKSA8PSBhLmNyZWF0ZWQrZW50cnlXaW5kb3cgewoJCXBhbmljKGVyck5vdEV4cGlyZWQpCgl9CglwbGF5ZXJzIDo9IGEubG9iYnkKCWFyZW5hcy5SZW1vdmUoaWQpCglyZWxlYXNlKGEuc3Rha2UgKiBpbnQ2NChsZW4ocGxheWVycykpKQoJZm9yIF8sIHAgOj0gcmFuZ2UgcGxheWVycyB7CgkJcGF5KDAsIGN1ciwgcCwgYS5zdGFrZSkKCX0KCWFzc2VydFNvbHZlbnQoMCwgY3VyKQoKCWNoYWluLkVtaXQoIkxvYmJ5RXhwaXJlZCIsCgkJImFyZW5hIiwgaWQsCgkJInBsYXllcnMiLCBpdG9hKGludDY0KGxlbihwbGF5ZXJzKSkpLAoJCSJjYWxsZXIiLCBjYWxsZXIuU3RyaW5nKCksCgkpCn0KCi8vIFRoZSBmb3VyIGhlbHBlcnMgYmVsb3cgcmV0dXJuIGEgbmV3IHNsaWNlIG9mIGV4YWN0bHkgdGhlIGxlbmd0aCBvZiBpdHMKLy8gY29udGVudCwgc28gdGhhdCBub3RoaW5nIGVsc2Ugc3RheXMgaW4gc3RvcmFnZS4gVGhleSByZXR1cm4gbmlsIGZvciBhbgovLyBlbXB0eSBsaXN0LgoKLy8gd2l0aEFkZHIgcmV0dXJucyBsaXN0IHdpdGggdiBhZGRlZCBhdCB0aGUgZW5kLgpmdW5jIHdpdGhBZGRyKGxpc3QgW11hZGRyZXNzLCB2IGFkZHJlc3MpIFtdYWRkcmVzcyB7CglvdXQgOj0gbWFrZShbXWFkZHJlc3MsIGxlbihsaXN0KSwgbGVuKGxpc3QpKzEpCgljb3B5KG91dCwgbGlzdCkKCXJldHVybiBhcHBlbmQob3V0LCB2KQp9CgovLyB3aXRoU3RyaW5nIHJldHVybnMgbGlzdCB3aXRoIHYgYWRkZWQgYXQgdGhlIGVuZC4KZnVuYyB3aXRoU3RyaW5nKGxpc3QgW11zdHJpbmcsIHYgc3RyaW5nKSBbXXN0cmluZyB7CglvdXQgOj0gbWFrZShbXXN0cmluZywgbGVuKGxpc3QpLCBsZW4obGlzdCkrMSkKCWNvcHkob3V0LCBsaXN0KQoJcmV0dXJuIGFwcGVuZChvdXQsIHYpCn0KCi8vIHdpdGhvdXRBZGRyIHJldHVybnMgbGlzdCB3aXRob3V0IHRoZSBlbGVtZW50IGF0IGluZGV4IGF0LgpmdW5jIHdpdGhvdXRBZGRyKGxpc3QgW11hZGRyZXNzLCBhdCBpbnQpIFtdYWRkcmVzcyB7CglpZiBsZW4obGlzdCkgPT0gMSB7CgkJcmV0dXJuIG5pbAoJfQoJb3V0IDo9IG1ha2UoW11hZGRyZXNzLCAwLCBsZW4obGlzdCktMSkKCW91dCA9IGFwcGVuZChvdXQsIGxpc3RbOmF0XS4uLikKCXJldHVybiBhcHBlbmQob3V0LCBsaXN0W2F0KzE6XS4uLikKfQoKLy8gd2l0aG91dFN0cmluZyByZXR1cm5zIGxpc3Qgd2l0aG91dCB0aGUgZWxlbWVudCBhdCBpbmRleCBhdC4KZnVuYyB3aXRob3V0U3RyaW5nKGxpc3QgW11zdHJpbmcsIGF0IGludCkgW11zdHJpbmcgewoJaWYgbGVuKGxpc3QpID09IDEgewoJCXJldHVybiBuaWwKCX0KCW91dCA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4obGlzdCktMSkKCW91dCA9IGFwcGVuZChvdXQsIGxpc3RbOmF0XS4uLikKCXJldHVybiBhcHBlbmQob3V0LCBsaXN0W2F0KzE6XS4uLikKfQoa0UEKCnJlbmRlci5nbm8SwkFwYWNrYWdlIGFyZW5hCgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9hcmVuYS9wYXlvdXQvdjAiCikKCi8vIFJlbmRlciByZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgYXJlbmFzIGFzIG1hcmtkb3duLCBmb3IgZ25vd2ViOgovLwovLwkiIiAgICAgICAgICAgIHRoZSBvcGVuIGFyZW5hcyBhbmQgdGhlIGxhc3QgZ2FtZXMgcGxheWVkCi8vCSJhcmVuYS88aWQ+IiAgb25lIGFyZW5hOiBpdHMgcnVsZXMsIGxvYmJ5IGFuZCBnYW1lLCBvciBpdHMgcmVzdWx0Ci8vCSJlYXJuaW5ncyIgICAgdGhlIHRvcCB3aW5uZXJzCi8vCi8vIEV2ZXJ5dGhpbmcgcHJpbnRlZCBoZXJlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCBhIG5hcnJvdyBjaGFyc2V0IHdoZW4gaXQgd2FzCi8vIHdyaXR0ZW4gKHNlZSBzcGVjLmdubyBhbmQgdmFsaWRhdGUuZ25vKSwgb3IgaXMgYW4gYWRkcmVzcyB0aGUgY2hhaW4gZ2F2ZQovLyB0aGUgcmVhbG0uIFRoZSBvbmx5IGNhbGxlci1zdXBwbGllZCB2YWx1ZSwgdGhlIGlkIG9mIGFuIGFyZW5hIHBhZ2UsIGlzCi8vIHByaW50ZWQgb25seSBpZiBpdCBpcyBhIHZhbGlkIGlkLiBOb3RoaW5nIG5lZWRzIG1hcmtkb3duIGVzY2FwaW5nLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCB7CgljYXNlIHBhdGggPT0gIiI6CgkJcmV0dXJuIHJlbmRlckhvbWUoKQoJY2FzZSBwYXRoID09ICJlYXJuaW5ncyI6CgkJcmV0dXJuIHJlbmRlckVhcm5pbmdzKCkKCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgImFyZW5hLyIpOgoJCWlkIDo9IHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAiYXJlbmEvIikKCQlpZiBhIDo9IGdldEFyZW5hKGlkKTsgYSAhPSBuaWwgewoJCQlyZXR1cm4gcmVuZGVyQXJlbmEoaWQsIGEpCgkJfQoJCWlmIHIsIG9rIDo9IHJlc3VsdE9mKGlkKTsgb2sgewoJCQlyZXR1cm4gcmVuZGVyUmVzdWx0KGlkLCByKQoJCX0KCX0KCXJldHVybiAiIyBnbm9mbHkgYXJlbmFzXG5cblBhZ2Ugbm90IGZvdW5kLiBHbyBiYWNrIHRvIHRoZSBbb3ZlcnZpZXddKCIgKyBsaW5rKCIiKSArICIpLlxuIgp9CgovLyBsaW5rIHJldHVybnMgdGhlIGdub3dlYiBVUkwgb2YgYSBSZW5kZXIgcGF0aCBvZiB0aGlzIHJlYWxtLgpmdW5jIGxpbmsocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlyZXR1cm4gd2ViUGF0aAoJfQoJcmV0dXJuIHdlYlBhdGggKyAiOiIgKyBwYXRoCn0KCmZ1bmMgcmVuZGVySG9tZSgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgZ25vZmx5IGFyZW5hc1xuXG4iKQoJYi5Xcml0ZVN0cmluZygiUGFpZCBnYW1lcyBvZiBnbm9mbHksIGEgbXVsdGlwbGF5ZXIgcGxhbmUgZ2FtZSwgY3JlYXRlZCBieSBwbGF5ZXJzIGF0IFtnbm9mbHkueHl6L2FyZW5hXShodHRwczovL2dub2ZseS54eXovYXJlbmEpLlxuIikKCWIuV3JpdGVTdHJpbmcoIkEgcGlsb3QgcGF5cyB0aGUgZW50cnkgcHJpY2UgdG8gam9pbiwgdGhlIHJlYWxtIGtlZXBzIHRoZSBzdGFrZXMgdW50aWwgdGhlIGdhbWUgaXMgb3ZlciwgdGhlbiBjcmVkaXRzIHRoZW0gYnkgdGhlIHJ1bGUgb2YgaXRzIG1vZGUuIFdpbm5lcnMgY2xhaW0gd2hhdCB0aGV5IGFyZSBvd2VkIHdpdGggQ2xhaW0uXG4iKQoJYi5Xcml0ZVN0cmluZygiVGhlIGhvdXNlIHRha2VzICIgKyBwZXJjZW50KGZlZUJwcykgKyAiIG9mIHdoYXQgYSBzZXR0bGVkIGdhbWUgcGF5cyBvdXQuXG5cbiIpCgoJYi5Xcml0ZVN0cmluZygiIyMgT3BlbiBhcmVuYXNcblxuIikKCWlmIGFyZW5hcy5TaXplKCkgPT0gMCB7CgkJYi5Xcml0ZVN0cmluZygiTm8gYXJlbmEgaGFzIHBsYXllcnMgcmlnaHQgbm93LlxuXG4iKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCJ8IEFyZW5hIHwgTW9kZSB8IEVudHJ5IHwgU2VhdHMgfCBMaXZlcyB8IFRpbWUgfCBLaWxsIHRhcmdldCB8IFBpbG90cyB8XG58LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCgkJYXJlbmFzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGlkIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCQlhIDo9IHYuKCphcmVuYSkKCQkJcGlsb3RzIDo9IGl0b2EoaW50NjQobGVuKGEubG9iYnkpKSkgKyAiIHdhaXRpbmciCgkJCWlmIGEucm91bmQgIT0gbmlsIHsKCQkJCXBpbG90cyA9IGl0b2EoaW50NjQobGVuKGEucm91bmQucGxheWVycykpKSArICIgcGxheWluZyIKCQkJfQoJCQliLldyaXRlU3RyaW5nKCJ8IFsiICsgaWRbOjhdICsgIl0oIiArIGxpbmsoImFyZW5hLyIraWQpICsgIikgfCAiICsgYS5tb2RlICsgIiB8ICIgKyBnbm90KGEuc3Rha2UpICsKCQkJCSIgfCAiICsgaXRvYShhLm1pblNlYXRzKSArICIgdG8gIiArIGl0b2EoYS5tYXhTZWF0cykgKyAiIHwgIiArIGl0b2EoYS5saXZlcykgKwoJCQkJIiB8ICIgKyBpdG9hKGEuc2Vjb25kcy82MCkgKyAiIG1pbiB8ICIgKyB0YXJnZXRDZWxsKGEua2lsbFRhcmdldCkgKyAiIHwgIiArIHBpbG90cyArICIgfFxuIikKCQkJcmV0dXJuIGZhbHNlCgkJfSkKCQliLldyaXRlQnl0ZSgnXG4nKQoJfQoKCWIuV3JpdGVTdHJpbmcoIiMjIExhc3QgZ2FtZXNcblxuIikKCWlmIGxlbihjbG9zZWQpID09IDAgewoJCWIuV3JpdGVTdHJpbmcoIk5vIGdhbWUgaXMgb3ZlciB5ZXQuXG5cbiIpCgl9IGVsc2UgewoJCWIuV3JpdGVTdHJpbmcoInwgQXJlbmEgfCBNb2RlIHwgT3V0Y29tZSB8IFBpbG90cyB8IFBvdCB8IEZlZSB8XG58LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJCWZvciBpIDo9IGxlbihjbG9zZWQpIC0gMTsgaSA+PSAwICYmIGkgPj0gbGVuKGNsb3NlZCktMTA7IGktLSB7CgkJCXIsIF8gOj0gcmVzdWx0T2YoY2xvc2VkW2ldKQoJCQliLldyaXRlU3RyaW5nKCJ8IFsiICsgY2xvc2VkW2ldWzo4XSArICJdKCIgKyBsaW5rKCJhcmVuYS8iK2Nsb3NlZFtpXSkgKyAiKSB8ICIgKyByLm1vZGUgKyAiIHwgIiArIHIub3V0Y29tZSArCgkJCQkiIHwgIiArIGl0b2Eoci5wbGF5ZXJzKSArICIgfCAiICsgZ25vdChyLnBvdCkgKyAiIHwgIiArIGdub3Qoci5mZWUpICsgIiB8XG4iKQoJCX0KCQliLldyaXRlQnl0ZSgnXG4nKQoJfQoKCWIuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IEluIGVzY3JvdyB8ICIgKyBnbm90KGVzY3Jvd2VkKSArICIgfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgUmVmdW5kIGRlbGF5IHwgIiArIGl0b2EocmVmdW5kRGVsYXkpICsgIiBzIHxcblxuIikKCWIuV3JpdGVTdHJpbmcoIi0gW0Vhcm5pbmdzXSgiICsgbGluaygiZWFybmluZ3MiKSArICIpOiAiICsgaXRvYShpbnQ2NChsZW4od2lubmVycy5hZGRycykpKSArICIgcmFua2VkIHBpbG90c1xuIikKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyQXJlbmEoaWQgc3RyaW5nLCBhICphcmVuYSkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBBcmVuYSAiICsgaWRbOjhdICsgIlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiTW9kZSBgIiArIGEubW9kZSArICJgOiAiICsgbW9kZURvYyhhLm1vZGUpICsgIlxuXG4iKQoKCWIuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IElkIHwgYCIgKyBpZCArICJgIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IEVudHJ5IHwgIiArIGdub3QoYS5zdGFrZSkgKyAiIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IFNlYXRzIHwgIiArIGl0b2EoYS5taW5TZWF0cykgKyAiIHRvICIgKyBpdG9hKGEubWF4U2VhdHMpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBMaXZlcyB8ICIgKyBpdG9hKGEubGl2ZXMpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBHYW1lIHRpbWUgfCAiICsgaXRvYShhLnNlY29uZHMvNjApICsgIiBtaW4gfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgS2lsbCB0YXJnZXQgfCAiICsgdGFyZ2V0Q2VsbChhLmtpbGxUYXJnZXQpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBDcmVhdGVkIGJ5IHwgIiArIGEuY3JlYXRvci5TdHJpbmcoKSArICIgfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgVGFrZXMgZW50cmllcyB1bnRpbCB8ICIgKyBjbG9jayhhLmNyZWF0ZWQrZW50cnlXaW5kb3cpICsgIiB8XG5cbiIpCgoJaWYgYS5yb3VuZCA9PSBuaWwgewoJCWIuV3JpdGVTdHJpbmcoIiMjIExvYmJ5XG5cbiIpCgkJYi5Xcml0ZVN0cmluZygiUGlsb3RzIHdobyBwYWlkIGFuZCB3YWl0IGZvciB0aGUgZ2FtZS4gVGhleSBjYW4gbGVhdmUgd2l0aCBgTGVhdmVgIHVudGlsIGl0IHN0YXJ0cy5cblxuIikKCQliLldyaXRlU3RyaW5nKCJ8IFNlYXQgfCBQaWxvdCB8XG58LS0tfC0tLXxcbiIpCgkJZm9yIGksIHBsYXllciA6PSByYW5nZSBhLmxvYmJ5IHsKCQkJYi5Xcml0ZVN0cmluZygifCAiICsgaXRvYShpbnQ2NChpKzEpKSArICIgfCAiICsgcGxheWVyLlN0cmluZygpICsgIiB8XG4iKQoJCX0KCX0gZWxzZSB7CgkJciA6PSBhLnJvdW5kCgkJYi5Xcml0ZVN0cmluZygiIyMgR2FtZVxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIlN0YXJ0ZWQgYXQgIiArIGNsb2NrKHIuc3RhcnRlZEF0KSArICIgd2l0aCAiICsgaXRvYShpbnQ2NChsZW4oci5wbGF5ZXJzKSkpICsKCQkJIiBwaWxvdHMgYW5kIGEgcG90IG9mICIgKyBnbm90KGEuc3Rha2UqaW50NjQobGVuKHIucGxheWVycykpKSArICIuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIklmIHRoZSByZWZlcmVlIGRvZXMgbm90IHNldHRsZSBpdCwgYW55b25lIGNhbiBzZW5kIHRoZSBzdGFrZXMgYmFjayB3aXRoIGBSZWZ1bmRSb3VuZGAgZnJvbSAiICsKCQkJY2xvY2soci5zdGFydGVkQXQrYS5zZWNvbmRzK3JlZnVuZERlbGF5KSArICIuXG5cbiIpCgkJYi5Xcml0ZVN0cmluZygifCBQaWxvdCB8XG58LS0tfFxuIikKCQlmb3IgXywgcGxheWVyIDo9IHJhbmdlIHIucGxheWVycyB7CgkJCWIuV3JpdGVTdHJpbmcoInwgIiArIHBsYXllci5TdHJpbmcoKSArICIgfFxuIikKCQl9Cgl9CgliLldyaXRlU3RyaW5nKCJcbltFYXJuaW5nc10oIiArIGxpbmsoImVhcm5pbmdzIikgKyAiKSB8IFtPdmVydmlld10oIiArIGxpbmsoIiIpICsgIilcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclJlc3VsdChpZCBzdHJpbmcsIHIgcmVzdWx0KSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIEFyZW5hICIgKyBpZFs6OF0gKyAiXG5cbiIpCgliLldyaXRlU3RyaW5nKCJNb2RlIGAiICsgci5tb2RlICsgImAsICIgKyBpdG9hKHIucGxheWVycykgKyAiIHBpbG90cywgY2xvc2VkIGF0ICIgKyBjbG9jayhyLmNsb3NlZEF0KSArICI6ICIgKyByLm91dGNvbWUgKyAiLlxuXG4iKQoJYi5Xcml0ZVN0cmluZygifCB8IHxcbnwtLS18LS0tfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgRW50cnkgfCAiICsgZ25vdChyLnN0YWtlKSArICIgfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgUG90IHwgIiArIGdub3Qoci5wb3QpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBGZWUgfCAiICsgZ25vdChyLmZlZSkgKyAiIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IFBhaWQgfCAiICsgcGFpZENlbGwocikgKyAiIHxcbiIpCgliLldyaXRlU3RyaW5nKCJcbltPdmVydmlld10oIiArIGxpbmsoIiIpICsgIilcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyB0YXJnZXRDZWxsIGZvcm1hdHMgYSBraWxsIHRhcmdldDogbW9zdCBhcmVuYXMgZW5kIG9uIHRoZSBjbG9jayBvbmx5LgpmdW5jIHRhcmdldENlbGwobiBpbnQ2NCkgc3RyaW5nIHsKCWlmIG4gPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIGl0b2EobikgKyAiIGtpbGxzIgp9CgovLyBwYWlkQ2VsbCBsaXN0cyB3aG8gd2FzIHBhaWQgd2hhdCBpbiBhIHJvdW5kLCBmb3IgYSB0YWJsZSBjZWxsLgpmdW5jIHBhaWRDZWxsKHIgcmVzdWx0KSBzdHJpbmcgewoJaWYgci5vdXRjb21lICE9IG91dGNvbWVTZXR0bGVkIHsKCQlyZXR1cm4gImV2ZXJ5IHN0YWtlIHNlbnQgYmFjayIKCX0KCWlmIGxlbihyLnBheW91dHMpID09IDAgewoJCXJldHVybiAibm9ib2R5IgoJfQoJcGFydHMgOj0gbWFrZShbXXN0cmluZywgbGVuKHIucGF5b3V0cykpCglmb3IgaSwgcCA6PSByYW5nZSByLnBheW91dHMgewoJCXBhcnRzW2ldID0gcC5BZGRyZXNzLlN0cmluZygpICsgIiAiICsgZ25vdChwLkFtb3VudCkKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4ocGFydHMsICIsICIpCn0KCmZ1bmMgcmVuZGVyRWFybmluZ3MoKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIGdub2ZseSBhcmVuYSBlYXJuaW5nc1xuXG4iKQoJYi5Xcml0ZVN0cmluZygiVGhlIHRvcCAiICsgaXRvYSh0b3BTaXplKSArICIgcGlsb3RzIGJ5IHdoYXQgdGhleSB3b24gYWJvdmUgdGhlaXIgb3duIHN0YWtlcywgb3ZlciBldmVyeSBzZXR0bGVkIHJvdW5kLlxuXG4iKQoJaWYgbGVuKHdpbm5lcnMuYWRkcnMpID09IDAgewoJCWIuV3JpdGVTdHJpbmcoIk5vYm9keSB3b24gYW55dGhpbmcgeWV0LlxuIikKCX0gZWxzZSB7CgkJYi5Xcml0ZVN0cmluZygifCBSYW5rIHwgUGlsb3QgfCBXb24gfCBSb3VuZHMgfFxufC0tLXwtLS18LS0tfC0tLXxcbiIpCgkJZm9yIGksIGFkZHIgOj0gcmFuZ2Ugd2lubmVycy5hZGRycyB7CgkJCXQgOj0gdG90YWxzT2YoYWRkcikKCQkJYi5Xcml0ZVN0cmluZygifCAiICsgaXRvYShpbnQ2NChpKzEpKSArICIgfCAiICsgYWRkci5TdHJpbmcoKSArCgkJCQkiIHwgIiArIGdub3QodC53b24pICsgIiB8ICIgKyBpdG9hKHQucm91bmRzKSArICIgfFxuIikKCQl9Cgl9CgliLldyaXRlU3RyaW5nKCJcbltCYWNrIHRvIHRoZSBvdmVydmlld10oIiArIGxpbmsoIiIpICsgIilcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBtb2RlRG9jIGlzIG9uZSBzZW50ZW5jZSBhYm91dCB0aGUgcGF5b3V0IHJ1bGUgb2YgYSBtb2RlLgpmdW5jIG1vZGVEb2MobW9kZSBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggbW9kZSB7CgljYXNlIHBheW91dC5Nb2RlQmF0dGxlUm95YWxlOgoJCXJldHVybiAidGhlIHBvdCwgbGVzcyB0aGUgZmVlLCBnb2VzIHRvIHRoZSBsYXN0IHBpbG90IGZseWluZzsgd2hlbiB0aGUgY2xvY2sgcnVucyBvdXQsIHRvIHRoZSBwaWxvdCBzdGlsbCBpbiB3aXRoIHRoZSBtb3N0IGtpbGxzLiIKCWNhc2UgcGF5b3V0Lk1vZGVEZWF0aG1hdGNoOgoJCXJldHVybiAidGhlIHBvdCwgbGVzcyB0aGUgZmVlLCBnb2VzIHRvIHRoZSB0b3AgdGhyZWUgYnkga2lsbHM6IDYwJSwgMzAlIGFuZCAxMCUuIgoJfQoJcmV0dXJuICJzZWUgdGhlIHBheW91dCBwYWNrYWdlLiIKfQoKLy8gZ25vdCBmb3JtYXRzIGFuIGFtb3VudCBvZiB1Z25vdCBpbiBHTk9ULCB3aXRob3V0IHRyYWlsaW5nIHplcm9zOgovLyAxMDAwMDAwMCBnaXZlcyAiMTAgR05PVCIsIDk1MDAwMDAgZ2l2ZXMgIjkuNSBHTk9UIiwgMSBnaXZlcyAiMC4wMDAwMDEgR05PVCIuCmZ1bmMgZ25vdCh1Z25vdCBpbnQ2NCkgc3RyaW5nIHsKCXdob2xlLCBmcmFjIDo9IHVnbm90LzEwMDAwMDAsIHVnbm90JTEwMDAwMDAKCWlmIGZyYWMgPT0gMCB7CgkJcmV0dXJuIGl0b2Eod2hvbGUpICsgIiBHTk9UIgoJfQoJZGVjaW1hbHMgOj0gaXRvYSgxMDAwMDAwICsgZnJhYylbMTpdIC8vIGFsbCBzaXggb2YgdGhlbSwgemVyb3MgaW5jbHVkZWQKCWVuZCA6PSBsZW4oZGVjaW1hbHMpCglmb3IgZGVjaW1hbHNbZW5kLTFdID09ICcwJyB7CgkJZW5kLS0KCX0KCXJldHVybiBpdG9hKHdob2xlKSArICIuIiArIGRlY2ltYWxzWzplbmRdICsgIiBHTk9UIgp9CgovLyBwZXJjZW50IGZvcm1hdHMgYmFzaXMgcG9pbnRzIGFzIGEgcGVyY2VudGFnZSwgd2l0aG91dCB0cmFpbGluZyB6ZXJvczoKLy8gNTAwIGdpdmVzICI1JSIsIDI1MCBnaXZlcyAiMi41JSIsIDEgZ2l2ZXMgIjAuMDElIi4KZnVuYyBwZXJjZW50KGJwcyBpbnQ2NCkgc3RyaW5nIHsKCXdob2xlLCBmcmFjIDo9IGJwcy8xMDAsIGJwcyUxMDAKCXN3aXRjaCB7CgljYXNlIGZyYWMgPT0gMDoKCQlyZXR1cm4gaXRvYSh3aG9sZSkgKyAiJSIKCWNhc2UgZnJhYyUxMCA9PSAwOgoJCXJldHVybiBpdG9hKHdob2xlKSArICIuIiArIGl0b2EoZnJhYy8xMCkgKyAiJSIKCWNhc2UgZnJhYyA8IDEwOgoJCXJldHVybiBpdG9hKHdob2xlKSArICIuMCIgKyBpdG9hKGZyYWMpICsgIiUiCgl9CglyZXR1cm4gaXRvYSh3aG9sZSkgKyAiLiIgKyBpdG9hKGZyYWMpICsgIiUiCn0KCi8vIGNsb2NrIGZvcm1hdHMgYSBibG9jayB0aW1lIGluIFVuaXggc2Vjb25kcywgaW4gVVRDLgpmdW5jIGNsb2NrKHVuaXggaW50NjQpIHN0cmluZyB7CglyZXR1cm4gdGltZS5Vbml4KHVuaXgsIDApLlVUQygpLkZvcm1hdCgiMjAwNi0wMS0wMiAxNTowNDowNSIpICsgIiBVVEMiCn0KGsIYCgtyZXN1bHRzLmdubxKyGHBhY2thZ2UgYXJlbmEKCmltcG9ydCAoCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9hcmVuYS9wYXlvdXQvdjAiCikKCi8vIHJlc3VsdCBpcyBob3cgYSBnYW1lIGVuZGVkLCBrZXB0IGZvciByZWFkZXJzOiBubyBwYXltZW50IGlzIGV2ZXIgY29tcHV0ZWQKLy8gZnJvbSBpdC4KdHlwZSByZXN1bHQgc3RydWN0IHsKCW1vZGUgICAgIHN0cmluZwoJc3Rha2UgICAgaW50NjQKCW91dGNvbWUgIHN0cmluZyAvLyBzZXR0bGVkLCBjYW5jZWxsZWQgb3IgcmVmdW5kZWQKCXBsYXllcnMgIGludDY0ICAvLyBob3cgbWFueSBwbGF5ZWQKCXBvdCAgICAgIGludDY0ICAvLyB0aGVpciBzdGFrZXMKCWZlZSAgICAgIGludDY0CgljbG9zZWRBdCBpbnQ2NCAgICAgICAgICAgLy8gYmxvY2sgdGltZSwgVW5peCBzZWNvbmRzCglwYXlvdXRzICBbXXBheW91dC5QYXlvdXQgLy8gd2hvIHdhcyBwYWlkIHdoYXQsIGluIHRoZSBvcmRlciBvZiB0aGUgcGxheWVycwp9Cgpjb25zdCAoCglvdXRjb21lU2V0dGxlZCAgID0gInNldHRsZWQiCglvdXRjb21lQ2FuY2VsbGVkID0gImNhbmNlbGxlZCIKCW91dGNvbWVSZWZ1bmRlZCAgPSAicmVmdW5kZWQiCikKCi8vIG1heFJlc3VsdHMgaXMgaG93IG1hbnkgY2xvc2VkIGdhbWVzIHRoZSByZWFsbSByZW1lbWJlcnMuCmNvbnN0IG1heFJlc3VsdHMgPSA1MAoKLy8gQSByZXN1bHQgaXMgc3RvcmVkIGFzIG9uZSBzdHJpbmcsIGl0cyBmaWVsZHMgc2VwYXJhdGVkIGJ5ICJ8IiwgdGhlIHBheW91dHMKLy8gbGFzdCBhcyAiYWRkcmVzczphbW91bnQiIHNlcGFyYXRlZCBieSAiLCI6Ci8vCi8vCW1vZGV8c3Rha2V8b3V0Y29tZXxwbGF5ZXJzfHBvdHxmZWV8Y2xvc2VkQXR8ZzEuLi46MTk1MDAwMDAsZzEuLi46NTAwMDAwCmZ1bmMgKHIgcmVzdWx0KSBlbmNvZGUoKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKHIubW9kZSkKCWZvciBfLCBuIDo9IHJhbmdlIFtdc3RyaW5ne2l0b2Eoci5zdGFrZSksIHIub3V0Y29tZSwgaXRvYShyLnBsYXllcnMpLCBpdG9hKHIucG90KSwgaXRvYShyLmZlZSksIGl0b2Eoci5jbG9zZWRBdCl9IHsKCQliLldyaXRlQnl0ZSgnfCcpCgkJYi5Xcml0ZVN0cmluZyhuKQoJfQoJYi5Xcml0ZUJ5dGUoJ3wnKQoJYi5Xcml0ZVN0cmluZyhqb2luUGF5b3V0cyhyLnBheW91dHMpKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyBkZWNvZGVSZXN1bHQocyBzdHJpbmcpIHJlc3VsdCB7CglmIDo9IHN0cmluZ3MuU3BsaXQocywgInwiKQoJaWYgbGVuKGYpICE9IDggewoJCXBhbmljKGVyckNvcnJ1cHRSZXN1bHQpCgl9CgludW0gOj0gZnVuYyhpIGludCkgaW50NjQgewoJCW4sIG9rIDo9IGRpZ2l0cyhmW2ldKQoJCWlmICFvayB7CgkJCXBhbmljKGVyckNvcnJ1cHRSZXN1bHQpCgkJfQoJCXJldHVybiBuCgl9CglyIDo9IHJlc3VsdHttb2RlOiBmWzBdLCBzdGFrZTogbnVtKDEpLCBvdXRjb21lOiBmWzJdLCBwbGF5ZXJzOiBudW0oMyksIHBvdDogbnVtKDQpLCBmZWU6IG51bSg1KSwgY2xvc2VkQXQ6IG51bSg2KX0KCWlmIHIub3V0Y29tZSAhPSBvdXRjb21lU2V0dGxlZCAmJiByLm91dGNvbWUgIT0gb3V0Y29tZUNhbmNlbGxlZCAmJiByLm91dGNvbWUgIT0gb3V0Y29tZVJlZnVuZGVkIHsKCQlwYW5pYyhlcnJDb3JydXB0UmVzdWx0KQoJfQoJaWYgZls3XSA9PSAiIiB7CgkJcmV0dXJuIHIKCX0KCWZvciBfLCBlbnRyeSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KGZbN10sICIsIikgewoJCWNvbG9uIDo9IGluZGV4RnJvbShlbnRyeSwgMCwgJzonKQoJCWlmIGNvbG9uID09IDAgfHwgY29sb24gPT0gbGVuKGVudHJ5KSB7CgkJCXBhbmljKGVyckNvcnJ1cHRSZXN1bHQpCgkJfQoJCWFtb3VudCwgb2sgOj0gZGlnaXRzKGVudHJ5W2NvbG9uKzE6XSkKCQlpZiAhb2sgewoJCQlwYW5pYyhlcnJDb3JydXB0UmVzdWx0KQoJCX0KCQlyLnBheW91dHMgPSBhcHBlbmQoci5wYXlvdXRzLCBwYXlvdXQuUGF5b3V0e0FkZHJlc3M6IGFkZHJlc3MoZW50cnlbOmNvbG9uXSksIEFtb3VudDogYW1vdW50fSkKCX0KCXJldHVybiByCn0KCi8vIHJlY29yZCBrZWVwcyB0aGUgcmVzdWx0IG9mIGEgY2xvc2VkIGdhbWUsIGFuZCBmb3JnZXRzIHRoZSBvbGRlc3Qgb25lIHBhc3QKLy8gbWF4UmVzdWx0cy4KZnVuYyByZWNvcmQoaWQgc3RyaW5nLCByIHJlc3VsdCkgewoJcmVzdWx0cy5TZXQoaWQsIHIuZW5jb2RlKCkpCgljbG9zZWQgPSBhcHBlbmQoY2xvc2VkLCBpZCkKCWlmIGxlbihjbG9zZWQpID4gbWF4UmVzdWx0cyB7CgkJcmVzdWx0cy5SZW1vdmUoY2xvc2VkWzBdKQoJCW5leHQgOj0gbWFrZShbXXN0cmluZywgbGVuKGNsb3NlZCktMSkKCQljb3B5KG5leHQsIGNsb3NlZFsxOl0pCgkJY2xvc2VkID0gbmV4dAoJfQp9CgovLyByZXN1bHRPZiByZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBjbG9zZWQgZ2FtZSwgaWYgdGhlIHJlYWxtIHN0aWxsIGhhcyBpdC4KZnVuYyByZXN1bHRPZihpZCBzdHJpbmcpIChyZXN1bHQsIGJvb2wpIHsKCXYgOj0gcmVzdWx0cy5HZXQoaWQpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIHJlc3VsdHt9LCBmYWxzZQoJfQoJcmV0dXJuIGRlY29kZVJlc3VsdCh2LihzdHJpbmcpKSwgdHJ1ZQp9CgovLyBpbmRleEZyb20gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGMgaW4gcyBhdCBvciBhZnRlciBpLCBvciBsZW4ocykuCmZ1bmMgaW5kZXhGcm9tKHMgc3RyaW5nLCBpIGludCwgYyBieXRlKSBpbnQgewoJZm9yIGkgPCBsZW4ocykgJiYgc1tpXSAhPSBjIHsKCQlpKysKCX0KCXJldHVybiBpCn0KCi8vIGRpZ2l0cyBwYXJzZXMgYSBub24tbmVnYXRpdmUgZGVjaW1hbCBvZiBhdCBtb3N0IDE4IGRpZ2l0cy4KZnVuYyBkaWdpdHMocyBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJaWYgbGVuKHMpID09IDAgfHwgbGVuKHMpID4gMTggewoJCXJldHVybiAwLCBmYWxzZQoJfQoJbiA6PSBpbnQ2NCgwKQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlpZiBjIDwgJzAnIHx8IGMgPiAnOScgewoJCQlyZXR1cm4gMCwgZmFsc2UKCQl9CgkJbiA9IG4qMTAgKyBpbnQ2NChjLScwJykKCX0KCXJldHVybiBuLCB0cnVlCn0KGpUUCglyb2xlcy5nbm8ShxRwYWNrYWdlIGFyZW5hCgppbXBvcnQgImduby5sYW5kL3IvZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZC9nbm9mbHkvZ2FtZS92MCIKCi8vIFRoZSBhcmVuYSByZWFsbSBrZWVwcyBubyByb2xlcyBvZiBpdHMgb3duLiBXaG8gb3ducyBpdCwgd2hvIGFkbWluaXN0ZXJzCi8vIGl0LCB3aG8gcmVmZXJlZXMgaXRzIHJvdW5kcyBhbmQgd2hlcmUgaXRzIGZlZSBnb2VzIGFyZSB0aGUgYW5zd2VycyBvZiB0aGUKLy8gZ2FtZSByZWFsbSwgYXNrZWQgYWdhaW4gYXQgZXZlcnkgY2FsbDogYSByZWZlcmVlIHJlbW92ZWQgdGhlcmUgaXMgcmVmdXNlZAovLyBoZXJlIGluIHRoZSBzYW1lIGJsb2NrLgoKLy8gYXV0aG9yaXR5IGlzIHRoZSBzZXQgb2YgcXVlc3Rpb25zIHRoaXMgcmVhbG0gYXNrcyBhYm91dCByb2xlcy4KdHlwZSBhdXRob3JpdHkgaW50ZXJmYWNlIHsKCU93bmVyKCkgYWRkcmVzcwoJSXNBZG1pbihhZGRyIGFkZHJlc3MpIGJvb2wKCUlzUmVmZXJlZShhZGRyIGFkZHJlc3MpIGJvb2wKCVRyZWFzdXJ5KCkgYWRkcmVzcwp9CgovLyBnYW1lUm9sZXMgYW5zd2VycyB3aXRoIHRoZSByb2xlcyBvZiB0aGUgZ2FtZSByZWFsbS4KdHlwZSBnYW1lUm9sZXMgc3RydWN0e30KCmZ1bmMgKGdhbWVSb2xlcykgT3duZXIoKSBhZGRyZXNzICAgICAgICAgICAgICB7IHJldHVybiBnYW1lLk93bmVyKCkgfQpmdW5jIChnYW1lUm9sZXMpIElzQWRtaW4oYWRkciBhZGRyZXNzKSBib29sICAgeyByZXR1cm4gZ2FtZS5Jc0FkbWluKGFkZHIpIH0KZnVuYyAoZ2FtZVJvbGVzKSBJc1JlZmVyZWUoYWRkciBhZGRyZXNzKSBib29sIHsgcmV0dXJuIGdhbWUuSXNSZWZlcmVlKGFkZHIpIH0KZnVuYyAoZ2FtZVJvbGVzKSBUcmVhc3VyeSgpIGFkZHJlc3MgICAgICAgICAgIHsgcmV0dXJuIGdhbWUuVHJlYXN1cnkoKSB9CgovLyByb2xlcyBpcyB0aGUgYXV0aG9yaXR5IG9mIHRoaXMgcmVhbG06IHRoZSBnYW1lIHJlYWxtLCBhbHdheXMuCi8vCi8vIEl0IGlzIGEgdmFyaWFibGUgZm9yIG9uZSByZWFzb24uIFVuZGVyIGBnbm8gdGVzdGAgYW4gaW1wb3J0ZWQgcmVhbG0gaXMKLy8gaW5pdGlhbGl6ZWQgd2l0aG91dCBhIGRlcGxveWVyLCBhbmQgYSB0ZXN0IG9mIHRoaXMgcGFja2FnZSBoYXMgbm8gd2F5IHRvCi8vIGJlY29tZSB0aGUgb3duZXIgb2YgdGhlIGdhbWUgcmVhbG0sIHNvIHRoZSB0ZXN0cyBwdXQgdGhlaXIgb3duIGFuc3dlcnMKLy8gaGVyZS4gTm90aGluZyBvdXRzaWRlIHRoZSB0ZXN0IGZpbGVzIGFzc2lnbnMgaXQsIGFuZCB0aGVyZSBpcyBubyBzZXR0ZXIuCnZhciByb2xlcyBhdXRob3JpdHkgPSBnYW1lUm9sZXN7fQoKLy8gY2FsbGVyT2YgcmV0dXJucyB0aGUgdmVyaWZpZWQgY2FsbGVyIG9mIGEgY3Jvc3NpbmcgZnVuY3Rpb24uIHJsbSBtdXN0IGJlCi8vIHRoZSBjdXIgb2YgdGhlIGNyb3NzaW5nIGZ1bmN0aW9uIGNhbGxpbmcgdGhpcyBoZWxwZXI6IGEgc3RhbGUgb3IgZm9yZ2VkCi8vIHJlYWxtIHZhbHVlIGZhaWxzIElzQ3VycmVudCwgYW5kIFByZXZpb3VzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBhIGxpdmUgb25lLgovLwovLyBJdCB0YWtlcyB0aGUgcmVhbG0gaW4gc2Vjb25kIHBvc2l0aW9uIG9uIHB1cnBvc2UsIGxpa2UgcC9udC9vd25hYmxlIGRvZXM6Ci8vIGEgZnVuY3Rpb24gd2hvc2UgZmlyc3QgcGFyYW1ldGVyIGlzIGEgcmVhbG0gaXMgYSBjcm9zc2luZyBmdW5jdGlvbi4KZnVuYyBjYWxsZXJPZihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKGVyclNwb29mZWRSZWFsbSkKCX0KCXJldHVybiBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkKfQoKLy8gYXNzZXJ0T3duZXIgcGFuaWNzIHVubGVzcyB0aGUgY2FsbGVyIGlzIHRoZSBvd25lciBvZiB0aGUgZ2FtZSByZWFsbSwgYW5kCi8vIHJldHVybnMgdGhlIGNhbGxlci4KZnVuYyBhc3NlcnRPd25lcihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWNhbGxlciA6PSBjYWxsZXJPZigwLCBybG0pCglpZiBjYWxsZXIgIT0gcm9sZXMuT3duZXIoKSB7CgkJcGFuaWMoZXJyTm90T3duZXIpCgl9CglyZXR1cm4gY2FsbGVyCn0KCi8vIGFzc2VydEFkbWluIHBhbmljcyB1bmxlc3MgdGhlIGNhbGxlciBpcyBhbiBhZG1pbiBvZiB0aGUgZ2FtZSByZWFsbSwgYW5kCi8vIHJldHVybnMgdGhlIGNhbGxlci4KZnVuYyBhc3NlcnRBZG1pbihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWNhbGxlciA6PSBjYWxsZXJPZigwLCBybG0pCglpZiAhcm9sZXMuSXNBZG1pbihjYWxsZXIpIHsKCQlwYW5pYyhlcnJOb3RBZG1pbikKCX0KCXJldHVybiBjYWxsZXIKfQoKLy8gYXNzZXJ0UmVmZXJlZSBwYW5pY3MgdW5sZXNzIHRoZSBjYWxsZXIgaXMgYSByZWZlcmVlIG9mIHRoZSBnYW1lIHJlYWxtLCBhbmQKLy8gcmV0dXJucyB0aGUgY2FsbGVyLgpmdW5jIGFzc2VydFJlZmVyZWUoXyBpbnQsIHJsbSByZWFsbSkgYWRkcmVzcyB7CgljYWxsZXIgOj0gY2FsbGVyT2YoMCwgcmxtKQoJaWYgIXJvbGVzLklzUmVmZXJlZShjYWxsZXIpIHsKCQlwYW5pYyhlcnJOb3RSZWZlcmVlKQoJfQoJcmV0dXJuIGNhbGxlcgp9ChreSAoKcm91bmRzLmdubxLPSHBhY2thZ2UgYXJlbmEKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9hcmVuYS9wYXlvdXQvdjAiCikKCi8vIHJvdW5kIGlzIHRoZSBzdGFydGVkIGdhbWUgb2YgYW4gYXJlbmEuIEl0cyBwbGF5ZXJzIGFyZSBmaXhlZCBhdCBzdGFydCwgYW5kCi8vIGVhY2ggb2YgdGhlbSBoYXMgb25lIHN0YWtlIGluIGl0Lgp0eXBlIHJvdW5kIHN0cnVjdCB7CglzdGFydGVkQXQgaW50NjQgICAgIC8vIGJsb2NrIHRpbWUsIFVuaXggc2Vjb25kcwoJcGxheWVycyAgIFtdYWRkcmVzcyAvLyBpbiB0aGUgb3JkZXIgdGhleSBlbnRlcmVkCn0KCi8vIEEgZ2FtZSBlbmRzIGluIGV4YWN0bHkgb25lIG9mIHRocmVlIHdheXM6IFNldHRsZVJvdW5kLCBDYW5jZWxSb3VuZCBvcgovLyBSZWZ1bmRSb3VuZC4gRWFjaCBvZiB0aGVtIGRlbGV0ZXMgdGhlIGFyZW5hIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBzbyBhCi8vIHNlY29uZCBvbmUgZmluZHMgbm8gYXJlbmEgYW5kIGFib3J0cy4KCi8vIFN0YXJ0Um91bmQgc3RhcnRzIHRoZSBnYW1lIG9mIGFuIGFyZW5hIHdpdGggZXZlcnkgcGxheWVyIG9mIGl0cyBsb2JieS4KLy8gUmVmZXJlZSBvbmx5LiBUaGUgbG9iYnkgbXVzdCBob2xkIGF0IGxlYXN0IG1pblNlYXRzIHBsYXllcnM7IGl0IGhvbGRzIGF0Ci8vIG1vc3QgbWF4U2VhdHMsIEVudGVyIHNlZXMgdG8gdGhhdC4gTm8gY29pbiBtb3ZlczogdGhlIHN0YWtlcyB0aGF0IHdlcmUKLy8gb3dlZCB0byB0aGUgbG9iYnkgYXJlIG5vdyBvd2VkIHRvIHRoZSByb3VuZC4gSXQgcmV0dXJucyBob3cgbWFueSBwbGF5LgpmdW5jIFN0YXJ0Um91bmQoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIGludDY0IHsKCXJlZmVyZWUgOj0gYXNzZXJ0UmVmZXJlZSgwLCBjdXIpCglhIDo9IG11c3RBcmVuYShpZCkKCWlmIGEucm91bmQgIT0gbmlsIHsKCQlwYW5pYyhlcnJSb3VuZFJ1bm5pbmcpCgl9CglpZiBpbnQ2NChsZW4oYS5sb2JieSkpIDwgYS5taW5TZWF0cyB7CgkJcGFuaWMoZXJyVG9vRmV3UGxheWVycykKCX0KCWEucm91bmQgPSAmcm91bmR7c3RhcnRlZEF0OiBub3coKSwgcGxheWVyczogYS5sb2JieX0KCWEubG9iYnkgPSBuaWwKCWEudGlja2V0cyA9IG5pbAoKCWNoYWluLkVtaXQoIlJvdW5kU3RhcnRlZCIsCgkJImFyZW5hIiwgaWQsCgkJInBsYXllcnMiLCBqb2luQWRkcnMoYS5yb3VuZC5wbGF5ZXJzKSwKCQkic3RhcnRlZEF0IiwgaXRvYShhLnJvdW5kLnN0YXJ0ZWRBdCksCgkJInJlZmVyZWUiLCByZWZlcmVlLlN0cmluZygpLAoJKQoJcmV0dXJuIGludDY0KGxlbihhLnJvdW5kLnBsYXllcnMpKQp9CgovLyBTZXR0bGVSb3VuZCBjbG9zZXMgdGhlIGdhbWUgb2YgYW4gYXJlbmE6IGl0IGFwcGxpZXMgdGhlIHJ1bGUgb2YgaXRzIG1vZGUKLy8gdG8gd2hhdCBoYXBwZW5lZCwgcGF5cyB0aGUgcGxheWVycywgYW5kIHBheXMgdGhlIGZlZSB0byB0aGUgdHJlYXN1cnkuCi8vIFJlZmVyZWUgb25seS4KLy8KLy8gZGVhdGhzIGlzICJ2aWN0aW06a2lsbGVyIiBlbnRyaWVzIHNlcGFyYXRlZCBieSAiOyIsIGluIHRoZSBvcmRlciB0aGV5Ci8vIGhhcHBlbmVkLCAidmljdGltOiIgd2hlbiBub2JvZHkgc2hvdCB0aGUgdmljdGltIGRvd24sIGFuZCB0aGUgZW1wdHkKLy8gc3RyaW5nIHdoZW4gbm9ib2R5IGRpZWQuIEEgcGxheWVyIGRpZXMgYXQgbW9zdCBhcyBvZnRlbiBhcyB0aGUgYXJlbmEgaGFzCi8vIGxpdmVzLgovLwovLyBUaGUgcmVmZXJlZSBpcyB0cnVzdGVkIGZvciB0aGVzZSBmYWN0cyBhbmQgZm9yIG5vdGhpbmcgZWxzZS4gVGhlIHJ1bGUKLy8gcmVmdXNlcyBhIHZpY3RpbSBvciBhIGtpbGxlciB3aG8gaXMgbm90IGEgcGxheWVyIG9mIHRoZSByb3VuZCwgYW5kIGRlY2lkZXMKLy8gdGhlIGFtb3VudHMuIFRoZSByZWFsbSB0aGVuIGNoZWNrcyB0aGVtIChzZWUgc2V0dGxlKSBiZWZvcmUgaXQgcGF5cy4KZnVuYyBTZXR0bGVSb3VuZChjdXIgcmVhbG0sIGlkIHN0cmluZywgZGVhdGhzIHN0cmluZykgewoJcmVmZXJlZSA6PSBhc3NlcnRSZWZlcmVlKDAsIGN1cikKCWEgOj0gcnVubmluZ0FyZW5hKGlkKQoJbGlzdCwgZXJyIDo9IHBheW91dC5QYXJzZURlYXRocyhkZWF0aHMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglydWxlIDo9IHBheW91dC5Mb29rdXAoYS5tb2RlKQoJaWYgcnVsZSA9PSBuaWwgewoJCXBhbmljKGVyckludmFsaWRNb2RlKSAvLyBjYW5ub3QgaGFwcGVuOiBwYXJzZVNwZWMgY2hlY2tlZCB0aGUgbW9kZQoJfQoJLy8gVGhlIHJ1bGUgZ2V0cyBhIGNvcHkgb2YgdGhlIHBsYXllcnM6IHRoZSBsaXN0IHRoZSByZWFsbSBwYXlzIGZyb20gaXMKCS8vIG5vdCBvbmUgYSBydWxlIGNhbiB0b3VjaC4KCXBsYXllcnMgOj0gbWFrZShbXWFkZHJlc3MsIGxlbihhLnJvdW5kLnBsYXllcnMpKQoJY29weShwbGF5ZXJzLCBhLnJvdW5kLnBsYXllcnMpCglnIDo9IHBheW91dC5HYW1le1N0YWtlOiBhLnN0YWtlLCBMaXZlczogYS5saXZlcywgS2lsbFRhcmdldDogYS5raWxsVGFyZ2V0LCBGZWVCcHM6IGZlZUJwc30KCXJlcywgZXJyIDo9IHJ1bGUuU2V0dGxlKGcsIHBsYXllcnMsIGxpc3QpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglzZXR0bGUoMCwgY3VyLCBpZCwgYSwgcmVzLCByZWZlcmVlKQp9CgovLyBzZXR0bGUgY2xvc2VzIHRoZSBnYW1lIG9mIGFuIGFyZW5hIHdpdGggdGhlIHJlc3VsdCBvZiBpdHMgcnVsZS4KLy8KLy8gSXQgdHJ1c3RzIG5vdGhpbmcgYWJvdXQgdGhlIHJlc3VsdC4gQmVmb3JlIGEgY291bnRlciBvciBhIGNvaW4gbW92ZXMsCi8vIGNoZWNrUmVzdWx0IHZlcmlmaWVzIHRoYXQgb25seSBwbGF5ZXJzIG9mIHRoZSByb3VuZCBhcmUgcGFpZCBhbmQgdGhhdCB0aGUKLy8gcGF5b3V0cyBhbmQgdGhlIGZlZSBhZGQgdXAgdG8gdGhlIHBvdCwgdG8gdGhlIHVnbm90LgpmdW5jIHNldHRsZShfIGludCwgcmxtIHJlYWxtLCBpZCBzdHJpbmcsIGEgKmFyZW5hLCByZXMgcGF5b3V0LlJlc3VsdCwgcmVmZXJlZSBhZGRyZXNzKSB7CglyIDo9IGEucm91bmQKCXBvdCA6PSBhLnN0YWtlICogaW50NjQobGVuKHIucGxheWVycykpCgljaGVja1Jlc3VsdChwb3QsIHIucGxheWVycywgcmVzKQoKCS8vIFRoZSBmZWUgZ29lcyB0byB0aGUgdHJlYXN1cnkgb2YgdGhlIGdhbWUgcmVhbG0gYXMgaXQgaXMgbm93LiBJZiB0aGF0CgkvLyBpcyBub3QgYW4gYWRkcmVzcyB0aGUgcmVhbG0gY2FuIHBheSwgdGhlIGZlZSBnb2VzIGJhY2sgdG8gdGhlIHBsYXllcnMKCS8vIGluc3RlYWQ6IHNoYXJlZCBieSB0aGUgb3JkZXIgb2YgdGhlIHJvdW5kLCB0aGUgcmVtYWluZGVyIHRvIHRoZSBmaXJzdC4KCWZlZSA6PSByZXMuRmVlCglwYXlvdXRzIDo9IHJlcy5QYXlvdXRzCgl0cmVhc3VyeSA6PSByb2xlcy5UcmVhc3VyeSgpCglpZiBmZWUgPiAwICYmICghdmFsaWRBZGRyZXNzKHRyZWFzdXJ5KSB8fCB0cmVhc3VyeSA9PSBybG0uQWRkcmVzcygpKSB7CgkJcGF5b3V0cyA9IHdpdGhGZWVTaGFyZWQoci5wbGF5ZXJzLCBwYXlvdXRzLCBmZWUpCgkJZmVlID0gMAoJfQoKCS8vIFN0YXRlIGZpcnN0OiB0aGUgYXJlbmEgaXMgZ29uZSBhbmQgaXRzIHBvdCBpcyBvZmYgdGhlIGJvb2tzIGJlZm9yZSB0aGUKCS8vIGZpcnN0IGNvaW4gbGVhdmVzLgoJYXJlbmFzLlJlbW92ZShpZCkKCXJlbGVhc2UocG90KQoJcmVjb3JkKGlkLCByZXN1bHR7CgkJbW9kZTogICAgIGEubW9kZSwKCQlzdGFrZTogICAgYS5zdGFrZSwKCQlvdXRjb21lOiAgb3V0Y29tZVNldHRsZWQsCgkJcGxheWVyczogIGludDY0KGxlbihyLnBsYXllcnMpKSwKCQlwb3Q6ICAgICAgcG90LAoJCWZlZTogICAgICBmZWUsCgkJY2xvc2VkQXQ6IG5vdygpLAoJCXBheW91dHM6ICBwYXlvdXRzLAoJfSkKCWNyZWRpdFJvdW5kKGEuc3Rha2UsIHIucGxheWVycywgcGF5b3V0cykKCgkvLyBUaGUgd2lubmluZ3Mgc3RheSBpbiB0aGUgcmVhbG0gdW50aWwgZWFjaCBwbGF5ZXIgY2xhaW1zIHRoZW06IGEKCS8vIHNldHRsZW1lbnQgc2VuZHMgbm8gY29pbiB0byBhIHBsYXllciwgc28gaXQgY2Fubm90IGZhaWwgb24gb25lLgoJZm9yIF8sIHAgOj0gcmFuZ2UgcGF5b3V0cyB7CgkJY3JlZGl0KHAuQWRkcmVzcywgaWQsIHAuQW1vdW50KQoJfQoJaWYgZmVlID4gMCB7CgkJcGF5KDAsIHJsbSwgdHJlYXN1cnksIGZlZSkKCX0KCWFzc2VydFNvbHZlbnQoMCwgcmxtKQoKCWNoYWluLkVtaXQoIlJvdW5kU2V0dGxlZCIsCgkJImFyZW5hIiwgaWQsCgkJInBsYXllcnMiLCBpdG9hKGludDY0KGxlbihyLnBsYXllcnMpKSksCgkJInBvdCIsIGl0b2EocG90KSwKCQkiZmVlIiwgaXRvYShmZWUpLAoJCSJwYXlvdXRzIiwgam9pblBheW91dHMocGF5b3V0cyksCgkJInRyZWFzdXJ5IiwgdHJlYXN1cnkuU3RyaW5nKCksCgkJInJlZmVyZWUiLCByZWZlcmVlLlN0cmluZygpLAoJKQp9CgovLyB3aXRoRmVlU2hhcmVkIHJldHVybnMgcGF5b3V0cyB3aXRoIGZlZSBhZGRlZCwgc2hhcmVkIGJldHdlZW4gZXZlcnkgcGxheWVyCi8vIG9mIHRoZSByb3VuZCwgaW4gdGhlaXIgb3JkZXI6IHRoZSByZW1haW5kZXIgZ29lcyB0byB0aGUgZmlyc3QuCmZ1bmMgd2l0aEZlZVNoYXJlZChwbGF5ZXJzIFtdYWRkcmVzcywgcGF5b3V0cyBbXXBheW91dC5QYXlvdXQsIGZlZSBpbnQ2NCkgW11wYXlvdXQuUGF5b3V0IHsKCWVhY2ggOj0gZmVlIC8gaW50NjQobGVuKHBsYXllcnMpKQoJZXh0cmEgOj0gZmVlIC0gZWFjaCppbnQ2NChsZW4ocGxheWVycykpCglvdXQgOj0gbWFrZShbXXBheW91dC5QYXlvdXQsIDAsIGxlbihwbGF5ZXJzKSkKCWZvciBpLCBwIDo9IHJhbmdlIHBsYXllcnMgewoJCWFtb3VudCA6PSBlYWNoCgkJaWYgaSA9PSAwIHsKCQkJYW1vdW50ICs9IGV4dHJhCgkJfQoJCWZvciBfLCBxIDo9IHJhbmdlIHBheW91dHMgewoJCQlpZiBxLkFkZHJlc3MgPT0gcCB7CgkJCQlhbW91bnQgKz0gcS5BbW91bnQKCQkJfQoJCX0KCQlpZiBhbW91bnQgPiAwIHsKCQkJb3V0ID0gYXBwZW5kKG91dCwgcGF5b3V0LlBheW91dHtBZGRyZXNzOiBwLCBBbW91bnQ6IGFtb3VudH0pCgkJfQoJfQoJcmV0dXJuIG91dAp9CgovLyBjaGVja1Jlc3VsdCBwYW5pY3MgdW5sZXNzIGEgcmVzdWx0IGNhbiBiZSBwYWlkIG91dCBvZiBhIHBvdDogZXZlcnkgcGF5b3V0Ci8vIGdvZXMgdG8gYSBwbGF5ZXIgb2YgdGhlIHJvdW5kLCBhIHBsYXllciBpcyBwYWlkIGF0IG1vc3Qgb25jZSBhbmQgbmV2ZXIKLy8gemVybyBvciBsZXNzLCB0aGUgZmVlIGlzIG5vdCBuZWdhdGl2ZSwgYW5kIGFsbCBvZiBpdCBhZGRzIHVwIHRvIHRoZSBwb3QKLy8gZXhhY3RseS4KLy8KLy8gVGhlIGJ1aWx0LWluIHJ1bGVzIGd1YXJhbnRlZSBhbGwgb2YgdGhpcy4gVGhlIGNoZWNrIGlzIGhlcmUgc28gdGhhdCB0aGUKLy8gcmVhbG0gZG9lcyBub3QgZGVwZW5kIG9uIGl0OiB3aGF0ZXZlciBhIHJ1bGUgcmV0dXJucywgdGhlIHJlYWxtIG5ldmVyCi8vIHNlbmRzIG1vcmUgdGhhbiB0aGUgcG90LCBhbmQgbmV2ZXIgdG8gYSBzdHJhbmdlci4KZnVuYyBjaGVja1Jlc3VsdChwb3QgaW50NjQsIHBsYXllcnMgW11hZGRyZXNzLCByZXMgcGF5b3V0LlJlc3VsdCkgewoJLy8gRXZlcnkgYW1vdW50IGlzIGJvdW5kZWQgYnkgdGhlIHBvdCBiZWZvcmUgaXQgaXMgYWRkZWQsIHNvIHRoZSBzdW0KCS8vIGNhbm5vdCBvdmVyZmxvdzogYXQgbW9zdCA5IHRlcm1zIG9mIGF0IG1vc3QgOGU5LgoJaWYgcmVzLkZlZSA8IDAgfHwgcmVzLkZlZSA+IHBvdCB7CgkJcGFuaWMoZXJyTm90Q29uc2VydmVkKQoJfQoJc3VtIDo9IHJlcy5GZWUKCXBhaWQgOj0gbWFrZShbXWJvb2wsIGxlbihwbGF5ZXJzKSkKCWZvciBfLCBwIDo9IHJhbmdlIHJlcy5QYXlvdXRzIHsKCQlzZWF0IDo9IGluZGV4T2ZBZGRyKHBsYXllcnMsIHAuQWRkcmVzcykKCQlpZiBzZWF0IDwgMCB8fCBwYWlkW3NlYXRdIHx8IHAuQW1vdW50IDw9IDAgewoJCQlwYW5pYyhlcnJCYWRTZXR0bGVtZW50KQoJCX0KCQlpZiBwLkFtb3VudCA+IHBvdCB7CgkJCXBhbmljKGVyck5vdENvbnNlcnZlZCkKCQl9CgkJcGFpZFtzZWF0XSA9IHRydWUKCQlzdW0gKz0gcC5BbW91bnQKCX0KCWlmIHN1bSAhPSBwb3QgewoJCXBhbmljKGVyck5vdENvbnNlcnZlZCkKCX0KfQoKLy8gQ2FuY2VsUm91bmQgY2xvc2VzIHRoZSBnYW1lIG9mIGFuIGFyZW5hIHdpdGhvdXQgYSByZXN1bHQ6IGV2ZXJ5IHBsYXllcgovLyBnZXRzIHRoZWlyIHN0YWtlIGJhY2sgaW4gZnVsbC4gUmVmZXJlZSBvbmx5LgovLwovLyBUaGUgZ2FtZSBzZXJ2ZXIgdXNlcyBpdCBmb3IgYSBnYW1lIGl0IGNhbm5vdCByZWZlcmVlLCBmb3IgZXhhbXBsZSBvbmUgaXQKLy8gZmluZHMgcnVubmluZyB3aGVuIGl0IHN0YXJ0cy4KZnVuYyBDYW5jZWxSb3VuZChjdXIgcmVhbG0sIGlkIHN0cmluZykgewoJcmVmZXJlZSA6PSBhc3NlcnRSZWZlcmVlKDAsIGN1cikKCWEgOj0gcnVubmluZ0FyZW5hKGlkKQoJcmVmdW5kKDAsIGN1ciwgaWQsIGEsIG91dGNvbWVDYW5jZWxsZWQsICJSb3VuZENhbmNlbGxlZCIsIHJlZmVyZWUpCn0KCi8vIFJlZnVuZFJvdW5kIGNsb3NlcyB0aGUgZ2FtZSBvZiBhbiBhcmVuYSB3aXRob3V0IGEgcmVzdWx0LCBsaWtlCi8vIENhbmNlbFJvdW5kLCBhbmQgY2FuIGJlIGNhbGxlZCBieSBhbnlvbmUsIG9uY2UKLy8KLy8Jc3RhcnRlZEF0ICsgc2Vjb25kcyArIFJlZnVuZERlbGF5KCkKLy8KLy8gaGFzIHBhc3NlZCBvbiB0aGUgYmxvY2sgY2xvY2suIEl0IGlzIHRoZSBwbGF5ZXJzJyB3YXkgb3V0IHdoZW4gdGhlCi8vIHJlZmVyZWUgbmV2ZXIgc2V0dGxlczogbm8gc3Rha2UgZGVwZW5kcyBvbiBhIHNlcnZlciBzdGF5aW5nIHVwLgpmdW5jIFJlZnVuZFJvdW5kKGN1ciByZWFsbSwgaWQgc3RyaW5nKSB7CgljYWxsZXIgOj0gY2FsbGVyT2YoMCwgY3VyKQoJYSA6PSBydW5uaW5nQXJlbmEoaWQpCglpZiBub3coKSA8IGEucm91bmQuc3RhcnRlZEF0K2Euc2Vjb25kcytyZWZ1bmREZWxheSB7CgkJcGFuaWMoZXJyUmVmdW5kVG9vRWFybHkpCgl9CglyZWZ1bmQoMCwgY3VyLCBpZCwgYSwgb3V0Y29tZVJlZnVuZGVkLCAiUm91bmRSZWZ1bmRlZCIsIGNhbGxlcikKfQoKLy8gcmVmdW5kIGNsb3NlcyB0aGUgZ2FtZSBvZiBhbiBhcmVuYSBhbmQgc2VuZHMgZXZlcnkgcGxheWVyIHRoZWlyIHN0YWtlCi8vIGJhY2suIE5vIGZlZSBpcyB0YWtlbi4KZnVuYyByZWZ1bmQoXyBpbnQsIHJsbSByZWFsbSwgaWQgc3RyaW5nLCBhICphcmVuYSwgb3V0Y29tZSwgZXZlbnQgc3RyaW5nLCBjYWxsZXIgYWRkcmVzcykgewoJciA6PSBhLnJvdW5kCglwb3QgOj0gYS5zdGFrZSAqIGludDY0KGxlbihyLnBsYXllcnMpKQoJcGF5b3V0cyA6PSBtYWtlKFtdcGF5b3V0LlBheW91dCwgbGVuKHIucGxheWVycykpCglmb3IgaSwgcCA6PSByYW5nZSByLnBsYXllcnMgewoJCXBheW91dHNbaV0gPSBwYXlvdXQuUGF5b3V0e0FkZHJlc3M6IHAsIEFtb3VudDogYS5zdGFrZX0KCX0KCgkvLyBTdGF0ZSBmaXJzdCwgYXMgaW4gc2V0dGxlLgoJYXJlbmFzLlJlbW92ZShpZCkKCXJlbGVhc2UocG90KQoJcmVjb3JkKGlkLCByZXN1bHR7CgkJbW9kZTogICAgIGEubW9kZSwKCQlzdGFrZTogICAgYS5zdGFrZSwKCQlvdXRjb21lOiAgb3V0Y29tZSwKCQlwbGF5ZXJzOiAgaW50NjQobGVuKHIucGxheWVycykpLAoJCXBvdDogICAgICBwb3QsCgkJY2xvc2VkQXQ6IG5vdygpLAoJCXBheW91dHM6ICBwYXlvdXRzLAoJfSkKCglmb3IgXywgcCA6PSByYW5nZSByLnBsYXllcnMgewoJCXBheSgwLCBybG0sIHAsIGEuc3Rha2UpCgl9Cglhc3NlcnRTb2x2ZW50KDAsIHJsbSkKCgljaGFpbi5FbWl0KGV2ZW50LAoJCSJhcmVuYSIsIGlkLAoJCSJwbGF5ZXJzIiwgaXRvYShpbnQ2NChsZW4oci5wbGF5ZXJzKSkpLAoJCSJwb3QiLCBpdG9hKHBvdCksCgkJImNhbGxlciIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8gcnVubmluZ0FyZW5hIHJldHVybnMgYW4gYXJlbmEgd2hvc2UgZ2FtZSBpcyBydW5uaW5nLiBJdCBwYW5pY3MgZm9yIGFuCi8vIHVua25vd24gYXJlbmEgYW5kIGZvciBvbmUgd2hvc2UgZ2FtZSBoYXMgbm90IHN0YXJ0ZWQuCmZ1bmMgcnVubmluZ0FyZW5hKGlkIHN0cmluZykgKmFyZW5hIHsKCWEgOj0gbXVzdEFyZW5hKGlkKQoJaWYgYS5yb3VuZCA9PSBuaWwgewoJCXBhbmljKGVyck5vUm91bmQpCgl9CglyZXR1cm4gYQp9CgovLyBSZWZ1bmQgZGVsYXkgYm91bmRzLCBpbiBzZWNvbmRzLgpjb25zdCAoCgltaW5SZWZ1bmREZWxheSA9IDYwCgltYXhSZWZ1bmREZWxheSA9IDg2NDAwCikKCi8vIFNldFJlZnVuZERlbGF5IHNldHMgaG93IGxvbmcgYWZ0ZXIgYSBnYW1lJ3MgdGltZSBsaW1pdCBhbnlvbmUgbWF5IHJlZnVuZAovLyBpdC4gQWRtaW4gb25seS4KZnVuYyBTZXRSZWZ1bmREZWxheShjdXIgcmVhbG0sIHNlY29uZHMgaW50NjQpIHsKCWFzc2VydEFkbWluKDAsIGN1cikKCWlmIHNlY29uZHMgPCBtaW5SZWZ1bmREZWxheSB8fCBzZWNvbmRzID4gbWF4UmVmdW5kRGVsYXkgewoJCXBhbmljKGVyckludmFsaWRSZWZ1bmREZWxheSkKCX0KCXJlZnVuZERlbGF5ID0gc2Vjb25kcwoJdmVyc2lvbisrCgljaGFpbi5FbWl0KCJSZWZ1bmREZWxheVNldCIsICJzZWNvbmRzIiwgaXRvYShzZWNvbmRzKSkKfQoKLy8gUmVmdW5kRGVsYXkgcmV0dXJucyB0aGUgcmVmdW5kIGRlbGF5LCBpbiBzZWNvbmRzLgpmdW5jIFJlZnVuZERlbGF5KCkgaW50NjQgewoJcmV0dXJuIHJlZnVuZERlbGF5Cn0KCi8vIGpvaW5BZGRycyB3cml0ZXMgYWRkcmVzc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIGZvciBhbiBldmVudC4KZnVuYyBqb2luQWRkcnMobGlzdCBbXWFkZHJlc3MpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpLCBhIDo9IHJhbmdlIGxpc3QgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQliLldyaXRlU3RyaW5nKGEuU3RyaW5nKCkpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBqb2luUGF5b3V0cyB3cml0ZXMgcGF5b3V0cyBhcyAiYWRkcmVzczphbW91bnQiIHNlcGFyYXRlZCBieSBjb21tYXMsIGZvcgovLyBhbiBldmVudCBhbmQgZm9yIHRoZSBzdG9yZWQgcmVzdWx0cy4KZnVuYyBqb2luUGF5b3V0cyhsaXN0IFtdcGF5b3V0LlBheW91dCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIGksIHAgOj0gcmFuZ2UgbGlzdCB7CgkJaWYgaSA+IDAgewoJCQliLldyaXRlQnl0ZSgnLCcpCgkJfQoJCWIuV3JpdGVTdHJpbmcocC5BZGRyZXNzLlN0cmluZygpKQoJCWIuV3JpdGVCeXRlKCc6JykKCQliLldyaXRlU3RyaW5nKGl0b2EocC5BbW91bnQpKQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoa/x4KCHNwZWMuZ25vEvIecGFja2FnZSBhcmVuYQoKaW1wb3J0ICgKCSJjcnlwdG8vc2hhMjU2IgoJImVuY29kaW5nL2hleCIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2FyZW5hL3BheW91dC92MCIKKQoKLy8gQW4gYXJlbmEgaXMgY3JlYXRlZCBvZmYgY2hhaW4sIGJ5IHRoZSBnYW1lIHNlcnZlciwgYXQgYSBwbGF5ZXIncyByZXF1ZXN0LgovLyBJdCBpcyBkZXNjcmliZWQgYnkgYSBzcGVjLCBhIHN0cmluZyBvZiBmaWVsZHMgc2VwYXJhdGVkIGJ5ICJ8IjoKLy8KLy8JdjF8bW9kZXxzdGFrZXxtaW5TZWF0c3xtYXhTZWF0c3xsaXZlc3xzZWNvbmRzfGtpbGxUYXJnZXR8Y3JlYXRvcnxjcmVhdGVkfG5vbmNlCi8vCi8vCXYxfGRlYXRobWF0Y2h8MTAwMDAwMDB8Mnw4fDN8OTAwfDV8ZzFhYmMuLi58MTc2MDAwMDAwMHxrM3g5Ci8vCi8vIGFuZCBrbm93biBieSBpdHMgaWQsIHRoZSBmaXJzdCAyNCBoZXggY2hhcmFjdGVycyBvZiB0aGUgU0hBLTI1NiBvZiB0aGUKLy8gc3BlYy4gVGhlIGZpcnN0IHBsYXllciB0byBwYXkgZm9yIGFuIGFyZW5hIGhhbmRzIHRoZSByZWFsbSBpdHMgc3BlYzsgdGhlCi8vIHJlYWxtIGNoZWNrcyBpdCBhbmQgc3RvcmVzIHRoZSBhcmVuYSB1bmRlciB0aGUgaWQgaXQgY29tcHV0ZXMuIE5vYm9keSBjYW4KLy8gY2hhbmdlIHRoZSBzdGFrZSBvciB0aGUgcnVsZXMgb2YgYW4gaWQ6IGEgZGlmZmVyZW50IHNwZWMgaXMgYSBkaWZmZXJlbnQKLy8gaWQuCi8vCi8vIGNyZWF0ZWQgaXMgdGhlIHNlcnZlcidzIGNsb2NrIHdoZW4gdGhlIGFyZW5hIHdhcyBwcm9wb3NlZC4gQW4gYXJlbmEgdGFrZXMKLy8gZW50cmllcyBmb3IgYW4gaG91ciBmcm9tIHRoZW4sIGFuZCBpdHMgbG9iYnkgY2FuIGJlIGNsb3NlZCBieSBhbnlvbmUgYWZ0ZXIKLy8gdGhhdCwgc2VlIEV4cGlyZUxvYmJ5LgoKLy8gQm91bmRzIG9mIGEgc3BlYywgdGhlIHNhbWUgYXMgdGhlIGdhbWUgc2VydmVyJ3MuCmNvbnN0ICgKCXNwZWNWZXJzaW9uID0gInYxIgoJaWRMZW4gICAgICAgPSAyNAoKCW1pblN0YWtlICAgICAgPSAxMDAwMDAwICAgIC8vIHVnbm90LCAxIEdOT1QKCW1heFN0YWtlICAgICAgPSAxMDAwMDAwMDAwIC8vIHVnbm90LCAxMDAwIEdOT1QKCW1pblNlY29uZHMgICAgPSAzMDAgICAgICAgIC8vIDUgbWludXRlcwoJbWF4U2Vjb25kcyAgICA9IDE4MDAgICAgICAgLy8gMzAgbWludXRlcwoJZW50cnlXaW5kb3cgICA9IDM2MDAgICAgICAgLy8gc2Vjb25kcyBhbiBhcmVuYSB0YWtlcyBlbnRyaWVzIGFmdGVyIGl0IHdhcyBjcmVhdGVkCgljbG9ja1NrZXcgICAgID0gMzAwICAgICAgICAvLyBzZWNvbmRzIGEgc2VydmVyIGNsb2NrIG1heSBydW4gYWhlYWQgb2YgdGhlIGNoYWluCgltYXhOb25jZUxlbiAgID0gMTYKCW1heFNwZWNMZW5ndGggPSAxNjAKCgkvLyBmZWVCcHMgaXMgdGhlIGhvdXNlJ3Mgc2hhcmUgb2YgZXZlcnkgc2V0dGxlZCBnYW1lLCBmb3IgdGhlIHRyZWFzdXJ5LgoJZmVlQnBzID0gNTAwCikKCi8vIHNwZWMgaXMgYSBwYXJzZWQgYXJlbmEgc3BlYy4KdHlwZSBzcGVjIHN0cnVjdCB7Cgltb2RlICAgICAgIHN0cmluZwoJc3Rha2UgICAgICBpbnQ2NAoJbWluU2VhdHMgICBpbnQ2NAoJbWF4U2VhdHMgICBpbnQ2NAoJbGl2ZXMgICAgICBpbnQ2NAoJc2Vjb25kcyAgICBpbnQ2NAoJa2lsbFRhcmdldCBpbnQ2NAoJY3JlYXRvciAgICBhZGRyZXNzCgljcmVhdGVkICAgIGludDY0Cglub25jZSAgICAgIHN0cmluZwp9CgovLyBpZE9mIHJldHVybnMgdGhlIGlkIG9mIGEgc3BlYyBzdHJpbmcuCmZ1bmMgaWRPZihzIHN0cmluZykgc3RyaW5nIHsKCXN1bSA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShzKSkKCXJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoc3VtWzpdKVs6aWRMZW5dCn0KCi8vIHBhcnNlU3BlYyByZWFkcyBhbmQgY2hlY2tzIGEgc3BlYyBzdHJpbmcuIEl0IHBhbmljcyBvbiBhbnl0aGluZyB0aGUgcmVhbG0KLy8gd291bGQgbm90IHBsYXkuCmZ1bmMgcGFyc2VTcGVjKHMgc3RyaW5nKSBzcGVjIHsKCWlmIGxlbihzKSA+IG1heFNwZWNMZW5ndGggewoJCXBhbmljKGVyckludmFsaWRTcGVjKQoJfQoJZiA6PSBzdHJpbmdzLlNwbGl0KHMsICJ8IikKCWlmIGxlbihmKSAhPSAxMSB8fCBmWzBdICE9IHNwZWNWZXJzaW9uIHsKCQlwYW5pYyhlcnJJbnZhbGlkU3BlYykKCX0KCW51bSA6PSBmdW5jKGkgaW50KSBpbnQ2NCB7CgkJbiwgb2sgOj0gZGlnaXRzKGZbaV0pCgkJaWYgIW9rIHsKCQkJcGFuaWMoZXJySW52YWxpZFNwZWMpCgkJfQoJCXJldHVybiBuCgl9CglzcCA6PSBzcGVjewoJCW1vZGU6ICAgICAgIGZbMV0sCgkJc3Rha2U6ICAgICAgbnVtKDIpLAoJCW1pblNlYXRzOiAgIG51bSgzKSwKCQltYXhTZWF0czogICBudW0oNCksCgkJbGl2ZXM6ICAgICAgbnVtKDUpLAoJCXNlY29uZHM6ICAgIG51bSg2KSwKCQlraWxsVGFyZ2V0OiBudW0oNyksCgkJY3JlYXRvcjogICAgYWRkcmVzcyhmWzhdKSwKCQljcmVhdGVkOiAgICBudW0oOSksCgkJbm9uY2U6ICAgICAgZlsxMF0sCgl9CglpZiBwYXlvdXQuTG9va3VwKHNwLm1vZGUpID09IG5pbCB7CgkJcGFuaWMoZXJySW52YWxpZE1vZGUpCgl9CglpZiBzcC5zdGFrZSA8IG1pblN0YWtlIHx8IHNwLnN0YWtlID4gbWF4U3Rha2UgewoJCXBhbmljKGVyckludmFsaWRTdGFrZSkKCX0KCWlmIHNwLm1pblNlYXRzIDwgcGF5b3V0Lk1pblBsYXllcnMgfHwgc3AubWluU2VhdHMgPiBzcC5tYXhTZWF0cyB8fCBzcC5tYXhTZWF0cyA+IHBheW91dC5NYXhQbGF5ZXJzIHsKCQlwYW5pYyhlcnJJbnZhbGlkU2VhdHMpCgl9CglpZiBzcC5saXZlcyA8IHBheW91dC5NaW5MaXZlcyB8fCBzcC5saXZlcyA+IHBheW91dC5NYXhMaXZlcyB7CgkJcGFuaWMoZXJySW52YWxpZExpdmVzKQoJfQoJaWYgc3Auc2Vjb25kcyA8IG1pblNlY29uZHMgfHwgc3Auc2Vjb25kcyA+IG1heFNlY29uZHMgewoJCXBhbmljKGVyckludmFsaWRTZWNvbmRzKQoJfQoJaWYgc3Aua2lsbFRhcmdldCA+IHBheW91dC5NYXhLaWxsVGFyZ2V0IHsKCQlwYW5pYyhlcnJJbnZhbGlkS2lsbFRhcmdldCkKCX0KCS8vIEEgYmF0dGxlIHJveWFsZSBpcyB3b24gYnkgc3RheWluZyBpbiB0aGUgYWlyOiBhIGtpbGwgdGFyZ2V0IHdvdWxkIGVuZAoJLy8gaXQgYmVmb3JlIHRoYXQuCglpZiBzcC5tb2RlID09IHBheW91dC5Nb2RlQmF0dGxlUm95YWxlICYmIHNwLmtpbGxUYXJnZXQgIT0gMCB7CgkJcGFuaWMoZXJyUm95YWxlVGFyZ2V0KQoJfQoJaWYgIXZhbGlkQWRkcmVzcyhzcC5jcmVhdG9yKSB7CgkJcGFuaWMoZXJySW52YWxpZEFkZHJlc3MpCgl9CglpZiAhdmFsaWROb25jZShzcC5ub25jZSkgewoJCXBhbmljKGVyckludmFsaWRTcGVjKQoJfQoJcmV0dXJuIHNwCn0KCi8vIHZhbGlkTm9uY2UgcmVwb3J0cyB3aGV0aGVyIHMgaXMgMSB0byAxNiBjaGFyYWN0ZXJzIG9mIFthLXowLTldLgpmdW5jIHZhbGlkTm9uY2UocyBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKHMpID09IDAgfHwgbGVuKHMpID4gbWF4Tm9uY2VMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlpZiAhKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSAmJiAhKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIHZhbGlkSUQgcmVwb3J0cyB3aGV0aGVyIHMgY2FuIGJlIGFuIGFyZW5hIGlkOiAyNCBsb3dlcmNhc2UgaGV4IGNoYXJhY3RlcnMuCmZ1bmMgdmFsaWRJRChzIHN0cmluZykgYm9vbCB7CglpZiBsZW4ocykgIT0gaWRMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlpZiAhKGMgPj0gJzAnICYmIGMgPD0gJzknKSAmJiAhKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KGqoKCgx2YWxpZGF0ZS5nbm8SmQpwYWNrYWdlIGFyZW5hCgovLyBUaGUgc3RyaW5nIHJ1bGVzIGJlbG93IGFyZSB3aGF0IG1ha2VzIHRoZSBoYW5kLWJ1aWx0IEpTT04gYW5kIHRoZSBtYXJrZG93bgovLyBvZiB0aGlzIHJlYWxtIHNhZmU6IGV2ZXJ5IHN0cmluZyB0aGF0IGlzIHN0b3JlZCBhbmQgbGF0ZXIgcHJpbnRlZCB3ZW50Ci8vIHRocm91Z2ggb25lIG9mIHRoZW0sIGFuZCBub25lIG9mIHRoZW0gbGV0cyBhIHF1b3RlLCBhIGJhY2tzbGFzaCwgYSBwaXBlLCBhCi8vIGJyYWNrZXQgb3IgYSBjb250cm9sIGNoYXJhY3RlciBpbi4gVGhleSBhcmUgdGhlIHJ1bGVzIG9mIHRoZSBnYW1lIHJlYWxtLgoKY29uc3QgdGlja2V0TGVuID0gNjQgLy8gYSBTSEEtMjU2IGluIGhleAoKLy8gdmFsaWRUaWNrZXQgcmVwb3J0cyB3aGV0aGVyIHMgaXMgNjQgbG93ZXJjYXNlIGhleCBjaGFyYWN0ZXJzLCB0aGUgU0hBLTI1NgovLyBvZiB0aGUgc2VjcmV0IGEgcGxheWVyJ3MgY2xpZW50IGtlZXBzLgpmdW5jIHZhbGlkVGlja2V0KHMgc3RyaW5nKSBib29sIHsKCWlmIGxlbihzKSAhPSB0aWNrZXRMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlpZiAhKGMgPj0gJzAnICYmIGMgPD0gJzknKSAmJiAhKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIHZhbGlkQWRkcmVzcyByZXBvcnRzIHdoZXRoZXIgYWRkciBpcyBhIHZhbGlkIGFkZHJlc3MgaW4gaXRzIGNhbm9uaWNhbCwKLy8gbG93ZXJjYXNlIGZvcm0uCi8vCi8vIEJlY2gzMiBjYW4gYWxzbyBiZSB3cml0dGVuIGluIGFsbCBjYXBpdGFscywgYW5kIGFkZHJlc3MuSXNWYWxpZCBhY2NlcHRzCi8vIHRoYXQuIEJlY2gzMiBkb2VzIG5vdCBhbGxvdyBtaXhpbmcgY2FzZXMsIHNvIGxvb2tpbmcgYXQgdGhlIGZpcnN0IGNoYXJhY3RlcgovLyBpcyBlbm91Z2guCmZ1bmMgdmFsaWRBZGRyZXNzKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gYWRkci5Jc1ZhbGlkKCkgJiYgYWRkclswXSA9PSAnZycKfQoKLy8gaW5kZXhPZkFkZHIgcmV0dXJucyB0aGUgaW5kZXggb2YgYWRkciBpbiBsaXN0LCAtMSB3aGVuIGl0IGlzIG5vdCB0aGVyZS4KLy8gVGhlIGxpc3RzIG9mIHRoaXMgcmVhbG0gaG9sZCBhdCBtb3N0IDE2IGFkZHJlc3Nlcy4KZnVuYyBpbmRleE9mQWRkcihsaXN0IFtdYWRkcmVzcywgYWRkciBhZGRyZXNzKSBpbnQgewoJZm9yIGksIGEgOj0gcmFuZ2UgbGlzdCB7CgkJaWYgYSA9PSBhZGRyIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglyZXR1cm4gLTEKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTQwMDAwMDAwdWdub3QSEwiAiN6+ARILMjAwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDXlza6HJnll26sYZ1geJSpU+/Irp3yZsxPPd706nF1scSQH04n4Pu3dExT0ALySYzkSqF9Gp9qXq1I8eX8gToXupHMId8iAlYy0fd29wP7auFG8N8Tg4NEi6IPQfkU8p0sVoaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=