Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
8B64CB6DA41BD309DA4FD247965E783D9DAC1084DC18BAFE8597987E44D45C37
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
107,689,442
Requested gas limit
GAS USED
82,838,003
Gas consumed
FEE
107690ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1wx60nkcp5lfsxmedeg7sfs47tzxkath05u63t430000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cs7tAwoML3ZtLm1fYWRkcGtnErztAwooZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NBL/7AMKBWFydDNkEjlnbm8ubGFuZC9wL2cxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQvYXJ0M2Qas+sDCgdhcnQuZ25vEqbrA3BhY2thZ2UgYXJ0M2QKCmltcG9ydCAoCgkiY3J5cHRvL3NoYTI1NiIKCSJtYXRoIgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJY2FudmFzVywgY2FudmFzSCA9IDE3MC4wLCAxNzAuMAoJc3VialgsIHN1YmpZICAgICA9IDg1LjAsIDc4LjAKKQoKZnVuYyBpdG9hKHYgaW50NjQpIHN0cmluZyB7CglpZiB2ID09IDAgewoJCXJldHVybiAiMCIKCX0KCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXZhciBiIFsyMF1ieXRlCglpIDo9IGxlbihiKQoJZm9yIHYgPiAwIHsKCQlpLS0KCQliW2ldID0gYnl0ZSgnMCcgKyB2JTEwKQoJCXYgLz0gMTAKCX0KCWlmIG5lZyB7CgkJaS0tCgkJYltpXSA9ICctJwoJfQoJcmV0dXJuIHN0cmluZyhiW2k6XSkKfQoKZnVuYyBmbnVtKHYgZmxvYXQ2NCkgc3RyaW5nIHsgcmV0dXJuIGNudW0odikgfQoKZnVuYyBmbnVtUGFkKHYgZmxvYXQ2NCkgc3RyaW5nIHsKCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXNjYWxlZCA6PSBpbnQ2NCh2KjEwMCArIDAuNSkKCXdob2xlIDo9IHNjYWxlZCAvIDEwMAoJZnJhYyA6PSBzY2FsZWQgJSAxMDAKCWZyYWNTdHIgOj0gaXRvYShmcmFjKQoJaWYgZnJhYyA8IDEwIHsKCQlmcmFjU3RyID0gIjAiICsgZnJhY1N0cgoJfQoJcyA6PSBpdG9hKHdob2xlKSArICIuIiArIGZyYWNTdHIKCWlmIG5lZyB7CgkJcmV0dXJuICItIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgY251bSh2IGZsb2F0NjQpIHN0cmluZyB7CglzIDo9IGZudW1QYWQodikKCWlmIHN0cmluZ3MuQ29udGFpbnMocywgIi4iKSB7CgkJcyA9IHN0cmluZ3MuVHJpbVJpZ2h0KHN0cmluZ3MuVHJpbVJpZ2h0KHMsICIwIiksICIuIikKCX0KCWlmIHN0cmluZ3MuSGFzUHJlZml4KHMsICIwLiIpIHsKCQlzID0gc1sxOl0KCX0gZWxzZSBpZiBzdHJpbmdzLkhhc1ByZWZpeChzLCAiLTAuIikgewoJCXMgPSAiLSIgKyBzWzI6XQoJfQoJcmV0dXJuIHMKfQoKZnVuYyBmbnVtMSh2IGZsb2F0NjQpIHN0cmluZyB7CgluZWcgOj0gdiA8IDAKCWlmIG5lZyB7CgkJdiA9IC12Cgl9CglzY2FsZWQgOj0gaW50NjQodioxMCArIDAuNSkKCXMgOj0gaXRvYShzY2FsZWQvMTApICsgIi4iICsgaXRvYShzY2FsZWQlMTApCglpZiBuZWcgewoJCXJldHVybiAiLSIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIHBjdG51bSh2IGZsb2F0NjQpIHN0cmluZyB7IHJldHVybiBmbnVtKHYpIH0KCmZ1bmMgaGV4VG9SR0IoaGV4IHN0cmluZykgKGludCwgaW50LCBpbnQpIHsKCWggOj0gaGV4CglpZiBsZW4oaCkgPiAwICYmIGhbMF0gPT0gJyMnIHsKCQloID0gaFsxOl0KCX0KCXIgOj0gaGV4Qnl0ZShoWzA6Ml0pCglnIDo9IGhleEJ5dGUoaFsyOjRdKQoJYiA6PSBoZXhCeXRlKGhbNDo2XSkKCXJldHVybiByLCBnLCBiCn0KCmZ1bmMgaGV4Qnl0ZShzIHN0cmluZykgaW50IHsKCXYgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQl2YXIgZCBpbnQKCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnMCcgJiYgYyA8PSAnOSc6CgkJCWQgPSBpbnQoYyAtICcwJykKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ2YnOgoJCQlkID0gaW50KGMtJ2EnKSArIDEwCgkJY2FzZSBjID49ICdBJyAmJiBjIDw9ICdGJzoKCQkJZCA9IGludChjLSdBJykgKyAxMAoJCX0KCQl2ID0gdioxNiArIGQKCX0KCXJldHVybiB2Cn0KCmZ1bmMgcmdiVG9IZXgociwgZywgYiBpbnQpIHN0cmluZyB7CglyZXR1cm4gIiMiICsgaGV4RGlnaXQyKHIpICsgaGV4RGlnaXQyKGcpICsgaGV4RGlnaXQyKGIpCn0KCmZ1bmMgaGV4RGlnaXQyKHYgaW50KSBzdHJpbmcgewoJaWYgdiA8IDAgewoJCXYgPSAwCgl9CglpZiB2ID4gMjU1IHsKCQl2ID0gMjU1Cgl9Cgljb25zdCBkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXJldHVybiBzdHJpbmcoZGlnaXRzW3YvMTZdKSArIHN0cmluZyhkaWdpdHNbdiUxNl0pCn0KCmZ1bmMgY2xhbXBCeXRlKHYgZmxvYXQ2NCkgaW50IHsKCWl2IDo9IGludCh2KQoJaWYgaXYgPCAwIHsKCQlyZXR1cm4gMAoJfQoJaWYgaXYgPiAyNTUgewoJCXJldHVybiAyNTUKCX0KCXJldHVybiBpdgp9CgpmdW5jIGxpZ2h0ZW4oaGV4IHN0cmluZywgYW10IGZsb2F0NjQpIHN0cmluZyB7CglyLCBnLCBiIDo9IGhleFRvUkdCKGhleCkKCW5yIDo9IGNsYW1wQnl0ZShmbG9hdDY0KHIpICsgKDI1NS1mbG9hdDY0KHIpKSphbXQpCgluZyA6PSBjbGFtcEJ5dGUoZmxvYXQ2NChnKSArICgyNTUtZmxvYXQ2NChnKSkqYW10KQoJbmIgOj0gY2xhbXBCeXRlKGZsb2F0NjQoYikgKyAoMjU1LWZsb2F0NjQoYikpKmFtdCkKCXJldHVybiByZ2JUb0hleChuciwgbmcsIG5iKQp9CgpmdW5jIG1peEhleChoZXgsIHRhcmdldCBzdHJpbmcsIGFtdCBmbG9hdDY0KSBzdHJpbmcgewoJcjEsIGcxLCBiMSA6PSBoZXhUb1JHQihoZXgpCglyMiwgZzIsIGIyIDo9IGhleFRvUkdCKHRhcmdldCkKCW5yIDo9IGNsYW1wQnl0ZShmbG9hdDY0KHIxKSArIGZsb2F0NjQocjItcjEpKmFtdCkKCW5nIDo9IGNsYW1wQnl0ZShmbG9hdDY0KGcxKSArIGZsb2F0NjQoZzItZzEpKmFtdCkKCW5iIDo9IGNsYW1wQnl0ZShmbG9hdDY0KGIxKSArIGZsb2F0NjQoYjItYjEpKmFtdCkKCXJldHVybiByZ2JUb0hleChuciwgbmcsIG5iKQp9CgpmdW5jIGh1ZVJvdGF0ZShoZXggc3RyaW5nLCBkZWcgZmxvYXQ2NCkgc3RyaW5nIHsKCWMsIHNuIDo9IG1hdGguQ29zKGRlZyptYXRoLlBpLzE4MCksIG1hdGguU2luKGRlZyptYXRoLlBpLzE4MCkKCXIsIGcsIGIgOj0gaGV4VG9SR0IoaGV4KQoJZnIsIGZnLCBmYiA6PSBmbG9hdDY0KHIpLCBmbG9hdDY0KGcpLCBmbG9hdDY0KGIpCgluciA6PSAoMC4yMTMrYyowLjc4Ny1zbiowLjIxMykqZnIgKyAoMC43MTUtYyowLjcxNS1zbiowLjcxNSkqZmcgKyAoMC4wNzItYyowLjA3MitzbiowLjkyOCkqZmIKCW5nIDo9ICgwLjIxMy1jKjAuMjEzK3NuKjAuMTQzKSpmciArICgwLjcxNStjKjAuMjg1K3NuKjAuMTQwKSpmZyArICgwLjA3Mi1jKjAuMDcyLXNuKjAuMjgzKSpmYgoJbmIgOj0gKDAuMjEzLWMqMC4yMTMtc24qMC43ODcpKmZyICsgKDAuNzE1LWMqMC43MTUrc24qMC43MTUpKmZnICsgKDAuMDcyK2MqMC45Mjgrc24qMC4wNzIpKmZiCglyZXR1cm4gcmdiVG9IZXgoY2xhbXBCeXRlKG5yKSwgY2xhbXBCeXRlKG5nKSwgY2xhbXBCeXRlKG5iKSkKfQoKZnVuYyBzaGFkZVNlcmllcyhoZXggc3RyaW5nLCBuIGludCwgbG8sIGhpIGZsb2F0NjQpIFtdc3RyaW5nIHsKCXIsIGcsIGIgOj0gaGV4VG9SR0IoaGV4KQoJb3V0IDo9IG1ha2UoW11zdHJpbmcsIG4pCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQl0IDo9IGxvCgkJaWYgbiA+IDEgewoJCQl0ID0gbG8gKyAoaGktbG8pKmZsb2F0NjQoaSkvZmxvYXQ2NChuLTEpCgkJfQoJCW91dFtpXSA9IHJnYlRvSGV4KGNsYW1wQnl0ZShmbG9hdDY0KHIpKnQpLCBjbGFtcEJ5dGUoZmxvYXQ2NChnKSp0KSwgY2xhbXBCeXRlKGZsb2F0NjQoYikqdCkpCgl9CglyZXR1cm4gb3V0Cn0KCnR5cGUgcHJuZyBzdHJ1Y3QgewoJc2VlZCBzdHJpbmcKCW4gICAgaW50Cn0KCmZ1bmMgbmV3UFJORyhzZWVkIHN0cmluZykgKnBybmcgeyByZXR1cm4gJnBybmd7c2VlZDogc2VlZH0gfQoKZnVuYyAocCAqcHJuZykgbmV4dCgpIHVpbnQ2NCB7CglwLm4rKwoJbWF0ZXJpYWwgOj0gcC5zZWVkICsgIjoiICsgaXRvYShpbnQ2NChwLm4pKSAvLyBzYW1lIGJ5dGVzIGFzICIlczolZCIKCXN1bSA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShtYXRlcmlhbCkpCgl2YXIgdiB1aW50NjQKCWZvciBpIDo9IDA7IGkgPCA4OyBpKysgewoJCXYgPSB2PDw4IHwgdWludDY0KHN1bVtpXSkKCX0KCXJldHVybiB2Cn0KCmZ1bmMgKHAgKnBybmcpIGZsb2F0SW4obG8sIGhpIGZsb2F0NjQpIGZsb2F0NjQgewoJZnJhYyA6PSBmbG9hdDY0KHAubmV4dCgpJTEwMDAwMDApIC8gMTAwMDAwMC4wCglyZXR1cm4gbG8gKyBmcmFjKihoaS1sbykKfQoKZnVuYyAocCAqcHJuZykgaW50bihuIGludCkgaW50IHsKCWlmIG4gPD0gMSB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBpbnQocC5uZXh0KCkgJSB1aW50NjQobikpCn0KCnR5cGUgcHQgc3RydWN0eyB4LCB5IGZsb2F0NjQgfQoKZnVuYyBwb2x5UGF0aChwdHMgW11wdCkgc3RyaW5nIHsKCXMgOj0gIk0iCglmb3IgaSwgcCA6PSByYW5nZSBwdHMgewoJCWlmIGkgPiAwIHsKCQkJcyArPSAiIEwiCgkJfQoJCXMgKz0gZm51bShwLngpICsgIiwiICsgZm51bShwLnkpCgl9CglyZXR1cm4gcyArICIgWiIKfQoKZnVuYyBwb2x5Z29uUG9pbnRzKHB0cyBbXXB0KSBzdHJpbmcgewoJcyA6PSAiIgoJZm9yIGksIHAgOj0gcmFuZ2UgcHRzIHsKCQlpZiBpID4gMCB7CgkJCXMgKz0gIiAiCgkJfQoJCXMgKz0gZm51bShwLngpICsgIiwiICsgZm51bShwLnkpCgl9CglyZXR1cm4gcwp9Cgp0eXBlIGdzdG9wIHN0cnVjdCB7CglwY3QgICBmbG9hdDY0Cgljb2xvciBzdHJpbmcKCW9wICAgIGZsb2F0NjQKfQoKdHlwZSBncmFtcCBzdHJ1Y3QgewoJeDEsIHkxLCB4MiwgeTIgZmxvYXQ2NAoJc3RvcHMgICAgICAgICAgW11nc3RvcAp9CgpmdW5jIChnIGdyYW1wKSBzYW1wbGUocHgsIHB5IGZsb2F0NjQpIChzdHJpbmcsIGZsb2F0NjQpIHsKCWR4LCBkeSA6PSBnLngyLWcueDEsIGcueTItZy55MQoJdCA6PSAoKHB4LWcueDEpKmR4ICsgKHB5LWcueTEpKmR5KSAvIChkeCpkeCArIGR5KmR5KSAqIDEwMAoJaWYgdCA8IDAgewoJCXQgPSAwCgl9CglpZiB0ID4gMTAwIHsKCQl0ID0gMTAwCgl9Cglmb3IgaSA6PSAxOyBpIDwgbGVuKGcuc3RvcHMpOyBpKysgewoJCWlmIHQgPD0gZy5zdG9wc1tpXS5wY3QgewoJCQlhLCBiIDo9IGcuc3RvcHNbaS0xXSwgZy5zdG9wc1tpXQoJCQlmIDo9ICh0IC0gYS5wY3QpIC8gKGIucGN0IC0gYS5wY3QpCgkJCXJldHVybiBtaXhIZXgoYS5jb2xvciwgYi5jb2xvciwgZiksIGEub3AgKyAoYi5vcC1hLm9wKSpmCgkJfQoJfQoJbGFzdCA6PSBnLnN0b3BzW2xlbihnLnN0b3BzKS0xXQoJcmV0dXJuIGxhc3QuY29sb3IsIGxhc3Qub3AKfQoKZnVuYyBjZW50cm9pZChwb2x5IFtdcHQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CgljeCwgY3kgOj0gMC4wLCAwLjAKCWZvciBfLCBwIDo9IHJhbmdlIHBvbHkgewoJCWN4ICs9IHAueAoJCWN5ICs9IHAueQoJfQoJcmV0dXJuIGN4IC8gZmxvYXQ2NChsZW4ocG9seSkpLCBjeSAvIGZsb2F0NjQobGVuKHBvbHkpKQp9Cgp0eXBlIGZhY2V0U3R5bGUgc3RydWN0IHsKCWZsYXNoICAgIGdyYW1wCglyaW5nQ2VudCBbXXB0Cglwcm9mICAgICBmaXJlUHJvZmlsZQoJem9uZSAgICAgKnBybmcgLy8gcGVyLWZhY2V0IGh1ZSBkcmlmdCBhbmQgc2hhZGUgaml0dGVyLCBzZWVkZWQgcGVyIHRva2VuCglzdG9uZSAgICBzdHJpbmcgLy8gd2hpY2ggY3J5c3RhbCBoYWJpdCBhIFJhdyBDcnlzdGFsIHRha2VzCgl0aHVtYiBib29sCn0KCnR5cGUgZmlyZVByb2ZpbGUgc3RydWN0IHsKCXNhdCwgaGl0ICBmbG9hdDY0CglwaW5wb2ludHMgaW50CglzaGFkb3cgICAgc3RyaW5nCglib2R5TWl4ICAgZmxvYXQ2NAoJbmV1dHJhbCAgIHN0cmluZwp9CgpmdW5jIGZpcmVQcm9maWxlRm9yKHN0b25lLCBjb2xvck5hbWUgc3RyaW5nKSBmaXJlUHJvZmlsZSB7CglpZiBzdG9uZSA9PSAiRGlhbW9uZCIgewoJCXN3aXRjaCBjb2xvck5hbWUgewoJCWNhc2UgIkNvbG9ybGVzcyI6CgkJCXJldHVybiBmaXJlUHJvZmlsZXsxLjAsIDAuODUsIDUsICIjMGQxMjIyIiwgMC4xMiwgIiNmNGY3ZmMifQoJCWNhc2UgIkJsYWNrIjoKCQkJcmV0dXJuIGZpcmVQcm9maWxlezAuMTUsIDAuMzUsIDEsICIjMDAwMDAwIiwgMCwgIiJ9CgkJfQoJCXJldHVybiBmaXJlUHJvZmlsZXswLjk1LCAwLjcsIDQsICIjMGIwZDE4IiwgMCwgIiJ9Cgl9CglpZiBzdG9uZSA9PSAiUXVhcnR6IiB7CgkJaWYgY29sb3JOYW1lID09ICJSb2NrIENyeXN0YWwiIHsKCQkJcmV0dXJuIGZpcmVQcm9maWxlezAuNCwgMC42LCAzLCAiIzE0MWEyYyIsIDAuMjUsICIjZThlZGY0In0KCQl9CgkJcmV0dXJuIGZpcmVQcm9maWxlezAuMzUsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KCX0KCWlmIGNvbG9yTmFtZSA9PSAiQ29sb3JsZXNzIiB7CgkJcmV0dXJuIGZpcmVQcm9maWxlezEuMCwgMC43LCA0LCAiIzE0MWEyYyIsIDAuNTUsICIjZGZlNGVlIn0KCX0KCWlmIGNvbG9yTmFtZSA9PSAiV2hpdGUiIHsKCQlyZXR1cm4gZmlyZVByb2ZpbGV7MC44NSwgMC42LCAzLCAiIzdkODZhMCIsIDAsICIifQoJfQoJaWYgY29sb3JOYW1lID09ICJDcnlzdGFsIiB7CgkJcmV0dXJuIGZpcmVQcm9maWxlezEuMCwgMC43OCwgNCwgIiMxNDFhMmMiLCAwLjMsICIjZTRlOWYyIn0KCX0KCWlmIHN0b25lID09ICJUb3BheiIgewoJCXJldHVybiBmaXJlUHJvZmlsZXswLjUsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KCX0KCXJldHVybiBmaXJlUHJvZmlsZXswLjcsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KfQoKY29uc3QgZmlyZVpvbmVEZWcgPSA3LjAKCnR5cGUgcmdiSSBzdHJ1Y3R7IHIsIGcsIGIgaW50IH0KCmZ1bmMgdG9SR0JJKGhleCBzdHJpbmcpIHJnYkkgeyByLCBnLCBiIDo9IGhleFRvUkdCKGhleCk7IHJldHVybiByZ2JJe3IsIGcsIGJ9IH0KCmZ1bmMgKGMgcmdiSSkgaGV4KCkgc3RyaW5nIHsgcmV0dXJuIHJnYlRvSGV4KGMuciwgYy5nLCBjLmIpIH0KCmZ1bmMgbWl4SShhLCBiIHJnYkksIGFtdCBmbG9hdDY0KSByZ2JJIHsKCXJldHVybiByZ2JJewoJCWNsYW1wQnl0ZShmbG9hdDY0KGEucikgKyBmbG9hdDY0KGIuci1hLnIpKmFtdCksCgkJY2xhbXBCeXRlKGZsb2F0NjQoYS5nKSArIGZsb2F0NjQoYi5nLWEuZykqYW10KSwKCQljbGFtcEJ5dGUoZmxvYXQ2NChhLmIpICsgZmxvYXQ2NChiLmItYS5iKSphbXQpLAoJfQp9CgpmdW5jIGh1ZVJvdGF0ZUkoeCByZ2JJLCBkZWcgZmxvYXQ2NCkgcmdiSSB7CgljLCBzbiA6PSBtYXRoLkNvcyhkZWcqbWF0aC5QaS8xODApLCBtYXRoLlNpbihkZWcqbWF0aC5QaS8xODApCglmciwgZmcsIGZiIDo9IGZsb2F0NjQoeC5yKSwgZmxvYXQ2NCh4LmcpLCBmbG9hdDY0KHguYikKCW5yIDo9ICgwLjIxMytjKjAuNzg3LXNuKjAuMjEzKSpmciArICgwLjcxNS1jKjAuNzE1LXNuKjAuNzE1KSpmZyArICgwLjA3Mi1jKjAuMDcyK3NuKjAuOTI4KSpmYgoJbmcgOj0gKDAuMjEzLWMqMC4yMTMrc24qMC4xNDMpKmZyICsgKDAuNzE1K2MqMC4yODUrc24qMC4xNDApKmZnICsgKDAuMDcyLWMqMC4wNzItc24qMC4yODMpKmZiCgluYiA6PSAoMC4yMTMtYyowLjIxMy1zbiowLjc4NykqZnIgKyAoMC43MTUtYyowLjcxNStzbiowLjcxNSkqZmcgKyAoMC4wNzIrYyowLjkyOCtzbiowLjA3MikqZmIKCXJldHVybiByZ2JJe2NsYW1wQnl0ZShuciksIGNsYW1wQnl0ZShuZyksIGNsYW1wQnl0ZShuYil9Cn0KCmZ1bmMgaGV4M0koeCByZ2JJKSBzdHJpbmcgewoJZCA6PSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXEgOj0gZnVuYyh2IGludCkgYnl0ZSB7IHJldHVybiBkWyh2KzgpKjE1LzI1NSUxNl0gfQoJcmV0dXJuICIjIiArIHN0cmluZyhbXWJ5dGV7cSh4LnIpLCBxKHguZyksIHEoeC5iKX0pCn0KCnZhciB3aGl0ZUkgPSByZ2JJezI1NSwgMjU1LCAyNTV9CgpmdW5jIGRhcmtlbihoZXgsIHNoYWRvdyBzdHJpbmcsIGFtdCBmbG9hdDY0KSBzdHJpbmcgewoJaWYgYW10ID4gMC45NSB7CgkJYW10ID0gMC45NQoJfQoJcmV0dXJuIG1peEhleChoZXgsIHNoYWRvdywgYW10KQp9Cgpjb25zdCBwcmlzbUZsYXNoID0gdHJ1ZQoKZnVuYyBmbGFzaFJhbXAoZXh0LCBzYXQgZmxvYXQ2NCkgZ3JhbXAgewoJciA6PSBncmFtcHt4MTogc3VialggLSBleHQsIHkxOiBzdWJqWSAtIGV4dCwgeDI6IHN1YmpYICsgZXh0LCB5Mjogc3VialkgKyBleHR9CglpZiAhcHJpc21GbGFzaCB7CgkJci5zdG9wcyA9IFtdZ3N0b3B7ezAsICIjZmZmZmZmIiwgMX0sIHsxMDAsICIjZmZmZmZmIiwgMC4yNX19CgkJcmV0dXJuIHIKCX0KCXIuc3RvcHMgPSBbXWdzdG9wewoJCXswLCAiI2ZmZmZmZiIsIDF9LCB7MTQsICIjZmY0MDQwIiwgMC45NX0sIHsyOCwgIiNmZjlhMWYiLCAwLjk1fSwgezQyLCAiI2ZmZTgxZiIsIDAuOX0sCgkJezU2LCAiIzM1ZmY3YSIsIDAuODV9LCB7NzAsICIjMjJjY2ZmIiwgMC44fSwgezg0LCAiIzU1NjZmZiIsIDAuNzV9LCB7MTAwLCAiI2MwNGRmZiIsIDAuN30sCgl9Cglmb3IgaSA6PSByYW5nZSByLnN0b3BzIHsKCQlyLnN0b3BzW2ldLmNvbG9yID0gbWl4SGV4KHIuc3RvcHNbaV0uY29sb3IsICIjZmZmZmZmIiwgMS1zYXQpCgl9CglyZXR1cm4gcgp9Cgp0eXBlIHYzIHN0cnVjdHsgeCwgeSwgeiBmbG9hdDY0IH0KCmZ1bmMgdnN1YihhLCBiIHYzKSB2MyAgICAgICB7IHJldHVybiB2M3thLnggLSBiLngsIGEueSAtIGIueSwgYS56IC0gYi56fSB9CmZ1bmMgdmRvdChhLCBiIHYzKSBmbG9hdDY0ICB7IHJldHVybiBhLngqYi54ICsgYS55KmIueSArIGEueipiLnogfQpmdW5jIHZjcm9zcyhhLCBiIHYzKSB2MyAgICAgeyByZXR1cm4gdjN7YS55KmIueiAtIGEueipiLnksIGEueipiLnggLSBhLngqYi56LCBhLngqYi55IC0gYS55KmIueH0gfQpmdW5jIHZzY2FsZShhIHYzLCBrIGZsb2F0NjQpIHYzIHsgcmV0dXJuIHYze2EueCAqIGssIGEueSAqIGssIGEueiAqIGt9IH0KZnVuYyB2bm9ybShhIHYzKSB2MyB7CglsIDo9IG1hdGguU3FydCh2ZG90KGEsIGEpKQoJaWYgbCA9PSAwIHsKCQlyZXR1cm4gYQoJfQoJcmV0dXJuIHYze2EueCAvIGwsIGEueSAvIGwsIGEueiAvIGx9Cn0KCmZ1bmMgc2duUG93KHYsIGUgZmxvYXQ2NCkgZmxvYXQ2NCB7CglpZiB2IDwgMCB7CgkJcmV0dXJuIC1tYXRoLlBvdygtdiwgZSkKCX0KCXJldHVybiBtYXRoLlBvdyh2LCBlKQp9Cgp0eXBlIG91dGxpbmVGbiBmdW5jKHQgZmxvYXQ2NCkgKGZsb2F0NjQsIGZsb2F0NjQpCgpmdW5jIGNpcmNsZU91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJYSA6PSAyICogbWF0aC5QaSAqIHQKCXJldHVybiBtYXRoLkNvcyhhKSwgbWF0aC5TaW4oYSkKfQoKZnVuYyBzdXBlck91dGxpbmUocCBmbG9hdDY0KSBvdXRsaW5lRm4gewoJcmV0dXJuIGZ1bmModCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJCWEgOj0gMiAqIG1hdGguUGkgKiB0CgkJcmV0dXJuIHNnblBvdyhtYXRoLkNvcyhhKSwgMi9wKSwgc2duUG93KG1hdGguU2luKGEpLCAyL3ApCgl9Cn0KCmZ1bmMgcG9seU91dGxpbmUodnMgW11wdCkgb3V0bGluZUZuIHsKCXJldHVybiBmdW5jKHQgZmxvYXQ2NCkgKGZsb2F0NjQsIGZsb2F0NjQpIHsKCQluIDo9IGxlbih2cykKCQlmIDo9IHQgKiBmbG9hdDY0KG4pCgkJayA6PSBpbnQobWF0aC5GbG9vcihmKSkKCQlmciA6PSBmIC0gZmxvYXQ2NChrKQoJCWEgOj0gdnNbKChrJW4pK24pJW5dCgkJYiA6PSB2c1soKChrKzEpJW4pK24pJW5dCgkJcmV0dXJuIGEueCArIChiLngtYS54KSpmciwgYS55ICsgKGIueS1hLnkpKmZyCgl9Cn0KCmZ1bmMgb2N0YWdvbihodywgaGgsIGMgZmxvYXQ2NCkgW11wdCB7CglyZXR1cm4gW11wdHsKCQl7aHcgLSBjLCBoaH0sIHstaHcgKyBjLCBoaH0sIHstaHcsIGhoIC0gY30sIHstaHcsIC1oaCArIGN9LAoJCXstaHcgKyBjLCAtaGh9LCB7aHcgLSBjLCAtaGh9LCB7aHcsIC1oaCArIGN9LCB7aHcsIGhoIC0gY30sCgl9Cn0KCmZ1bmMgcGVhck91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJYSA6PSAyICogbWF0aC5QaSAqIHQKCWMgOj0gbWF0aC5Db3MoYSkKCXJldHVybiBjKjAuOTIgKyAwLjA4LCAwLjcgKiBtYXRoLlNpbihhKSAqICgxIC0gMC40NipjKQp9CgpmdW5jIG1hcnF1aXNlT3V0bGluZSh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CglhIDo9IDIgKiBtYXRoLlBpICogdAoJcmV0dXJuIG1hdGguQ29zKGEpLCAwLjUyICogc2duUG93KG1hdGguU2luKGEpLCAxLjM1KQp9CgpmdW5jIGhlYXJ0T3V0bGluZSh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CglhIDo9IDIgKiBtYXRoLlBpICogdAoJc24gOj0gbWF0aC5TaW4oYSkKCXkgOj0gKDEzKm1hdGguQ29zKGEpIC0gNCptYXRoLkNvcygyKmEpIC0gMS40Km1hdGguQ29zKDMqYSkgLSAwLjUqbWF0aC5Db3MoNCphKSkgLyAxNwoJcmV0dXJuIDAuODgqc24qc24qc24gKyAwLjEyKnNuLCAoeSArIDAuMTU3NikgLyAwLjc4OTQKfQoKZnVuYyB0cmlsbGlvbk91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJdnMgOj0gW11wdHt7MCwgMX0sIHstMC44NjYsIC0wLjV9LCB7MC44NjYsIC0wLjV9fQoJZiA6PSB0ICogMwoJayA6PSBpbnQobWF0aC5GbG9vcihmKSkKCWZyIDo9IGYgLSBmbG9hdDY0KGspCglhLCBiIDo9IHZzWygoayUzKSszKSUzXSwgdnNbKCgoaysxKSUzKSszKSUzXQoJYnVsZ2UgOj0gMSArIDAuMTYqbWF0aC5TaW4obWF0aC5QaSpmcikKCXJldHVybiAoYS54ICsgKGIueC1hLngpKmZyKSAqIGJ1bGdlLCAoYS55ICsgKGIueS1hLnkpKmZyKSAqIGJ1bGdlCn0KCnR5cGUgY3V0U3BlYyBzdHJ1Y3QgewoJbiAgICAgICAgIGludAoJYnJpbGxpYW50IGJvb2wKCW91dGxpbmUgICBvdXRsaW5lRm4KCXJ4LCByeSAgICBmbG9hdDY0Cn0KCnZhciBTaGFwZU5hbWVzID0gW11zdHJpbmd7CgkiUm91bmQgQnJpbGxpYW50IiwgIk92YWwiLCAiQ3VzaGlvbiIsICJFbWVyYWxkIEN1dCIsICJBc3NjaGVyIiwKCSJSYWRpYW50IiwgIlByaW5jZXNzIEN1dCIsICJQZWFyIiwgIk1hcnF1aXNlIiwgIlRyaWxsaW9uIiwKCSJIZWFydCIsICJSb3NlIEN1dCIsICJSYXcgQ3J5c3RhbCIsCn0KCmNvbnN0ICgKCXNoYXBlSGVhcnQgPSAxMAoJc2hhcGVSb3NlICA9IDExCglzaGFwZVJhdyAgID0gMTIKKQoKY29uc3Qgc3RvbmVTY2FsZSA9IDAuNzgKCmZ1bmMgY3V0Rm9yKHNoYXBlSWR4IGludCkgY3V0U3BlYyB7CgljIDo9IGN1dEZvclVuc2NhbGVkKHNoYXBlSWR4KQoJYy5yeCwgYy5yeSA9IGMucngqc3RvbmVTY2FsZSwgYy5yeSpzdG9uZVNjYWxlCglyZXR1cm4gYwp9CgpmdW5jIGN1dEZvclVuc2NhbGVkKHNoYXBlSWR4IGludCkgY3V0U3BlYyB7Cglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSAxOgoJCXJldHVybiBjdXRTcGVjezgsIHRydWUsIGNpcmNsZU91dGxpbmUsIDMwLCAyMS41fQoJY2FzZSAyOgoJCXJldHVybiBjdXRTcGVjezgsIHRydWUsIHN1cGVyT3V0bGluZSgzLjQpLCAyNywgMjR9CgljYXNlIDM6CgkJcmV0dXJuIGN1dFNwZWN7OCwgZmFsc2UsIHBvbHlPdXRsaW5lKG9jdGFnb24oMSwgMSwgMC4zKSksIDMwLCAyMX0KCWNhc2UgNDoKCQlyZXR1cm4gY3V0U3BlY3s4LCBmYWxzZSwgcG9seU91dGxpbmUob2N0YWdvbigxLCAxLCAwLjM2KSksIDI1LCAyNX0KCWNhc2UgNToKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBwb2x5T3V0bGluZShvY3RhZ29uKDEsIDEsIDAuMykpLCAyOSwgMjIuNX0KCWNhc2UgNjoKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBwb2x5T3V0bGluZShbXXB0e3sxLCAxfSwgezAsIDF9LCB7LTEsIDF9LCB7LTEsIDB9LCB7LTEsIC0xfSwgezAsIC0xfSwgezEsIC0xfSwgezEsIDB9fSksIDIzLjUsIDIzLjV9CgljYXNlIDc6CgkJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgcGVhck91dGxpbmUsIDMxLCAyN30KCWNhc2UgODoKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBtYXJxdWlzZU91dGxpbmUsIDMzLCAzMH0KCWNhc2UgOToKCQlyZXR1cm4gY3V0U3BlY3s5LCB0cnVlLCB0cmlsbGlvbk91dGxpbmUsIDI3LCAyN30KCWNhc2Ugc2hhcGVIZWFydDoKCQlyZXR1cm4gY3V0U3BlY3sxMCwgdHJ1ZSwgaGVhcnRPdXRsaW5lLCAyOSwgMjh9CgljYXNlIHNoYXBlUm9zZToKCQlyZXR1cm4gY3V0U3BlY3s2LCB0cnVlLCBjaXJjbGVPdXRsaW5lLCAyNywgMjd9CgljYXNlIHNoYXBlUmF3OgoJCXJldHVybiBjdXRTcGVjezAsIGZhbHNlLCBjaXJjbGVPdXRsaW5lLCAyNywgMjd9IC8vIHNpemVkIHBlciBzdG9uZSBpbiBidWlsZFJhdwoJfQoJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgY2lyY2xlT3V0bGluZSwgMjcsIDI3fQp9CgpmdW5jIEN1dHNGb3JTdG9uZShzdG9uZSBzdHJpbmcpIFtdaW50IHsKCXN3aXRjaCBzdG9uZSB7CgljYXNlICJEaWFtb25kIjoKCQlyZXR1cm4gW11pbnR7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgc2hhcGVIZWFydCwgc2hhcGVSb3NlLCBzaGFwZVJhd30KCWNhc2UgIlNhcHBoaXJlIjoKCQlyZXR1cm4gW11pbnR7MSwgMiwgMCwgMywgNywgc2hhcGVIZWFydCwgOCwgOSwgNiwgc2hhcGVSb3NlLCBzaGFwZVJhd30KCWNhc2UgIlRvcGF6IjoKCQlyZXR1cm4gW11pbnR7MywgMSwgNywgMiwgOCwgMCwgOSwgc2hhcGVIZWFydCwgNiwgc2hhcGVSYXd9Cgl9CglyZXR1cm4gW11pbnR7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgc2hhcGVIZWFydCwgc2hhcGVSb3NlLCBzaGFwZVJhd30KfQoKY29uc3QgKAoJa0Nyb3duID0gaW90YQoJa1RhYmxlCglrUGF2CikKCnR5cGUgZmFjZSBzdHJ1Y3QgewoJcCAgICBbXXYzCglraW5kIGludAp9CgpmdW5jIHJpbmdQdHMoYyBjdXRTcGVjLCBuIGludCwgc2NhbGUsIHosIG9mZiBmbG9hdDY0KSBbXXYzIHsKCW91dCA6PSBtYWtlKFtddjMsIG4pCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQl4LCB5IDo9IGMub3V0bGluZSgoZmxvYXQ2NChrKSArIG9mZikgLyBmbG9hdDY0KG4pKQoJCW91dFtrXSA9IHYze3ggKiBjLnJ4ICogc2NhbGUsIHkgKiBjLnJ5ICogc2NhbGUsIHp9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgYnVpbGRDdXQoYyBjdXRTcGVjKSAoZmFjZXMgW11mYWNlLCBnaXJkbGUgW112MykgewoJYmFzZSA6PSBjLnJ4CglpZiBjLnJ5IDwgYmFzZSB7CgkJYmFzZSA9IGMucnkKCX0KCWhjLCBocCA6PSAwLjM0KmJhc2UsIDAuOSpiYXNlCgluIDo9IGMubgoJaWYgYy5icmlsbGlhbnQgewoJCVQgOj0gcmluZ1B0cyhjLCBuLCAwLjU2LCBoYywgMCkKCQlCIDo9IHJpbmdQdHMoYywgbiwgMC44LCBoYyowLjQ2LCAwLjUpCgkJRyA6PSByaW5nUHRzKGMsIDIqbiwgMSwgMCwgMCkKCQljdWxldCA6PSB2M3swLCAwLCAtaHB9CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7VCwga1RhYmxlfSkKCQlmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQkJazEgOj0gKGsgKyAxKSAlIG4KCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tUW2tdLCBCW2tdLCBUW2sxXX0sIGtDcm93bn0pCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7VFtrMV0sIEJba10sIEdbKDIqaysyKSUoMipuKV0sIEJbazFdfSwga0Nyb3dufSkKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tCW2tdLCBHWzIqa10sIEdbMiprKzFdfSwga0Nyb3dufSkKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tCW2tdLCBHWzIqaysxXSwgR1soMiprKzIpJSgyKm4pXX0sIGtDcm93bn0pCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7R1syKmtdLCBHWzIqaysxXSwgR1soMiprKzIpJSgyKm4pXSwgY3VsZXR9LCBrUGF2fSkKCQl9CgkJcmV0dXJuIGZhY2VzLCBHCgl9CglUIDo9IHJpbmdQdHMoYywgbiwgMC41NCwgaGMsIDApCglTIDo9IHJpbmdQdHMoYywgbiwgMC43OCwgaGMqMC41LCAwKQoJRyA6PSByaW5nUHRzKGMsIG4sIDEsIDAsIDApCglQMSA6PSByaW5nUHRzKGMsIG4sIDAuNywgLWhwKjAuNDIsIDApCglQMiA6PSByaW5nUHRzKGMsIG4sIDAuMzgsIC1ocCowLjc4LCAwKQoJSyA6PSByaW5nUHRzKGMsIG4sIDAuMSwgLWhwLCAwKQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7VCwga1RhYmxlfSkKCXJvd3MgOj0gW11bMl1bXXYze3tULCBTfSwge1MsIEd9fQoJZm9yIF8sIHIgOj0gcmFuZ2Ugcm93cyB7CgkJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJCWsxIDo9IChrICsgMSkgJSBuCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7clswXVtrXSwgclswXVtrMV0sIHJbMV1bazFdLCByWzFdW2tdfSwga0Nyb3dufSkKCQl9Cgl9Cglwcm93IDo9IFtdWzJdW112M3t7RywgUDF9LCB7UDEsIFAyfSwge1AyLCBLfX0KCWZvciBfLCByIDo9IHJhbmdlIHByb3cgewoJCWZvciBrIDo9IDA7IGsgPCBuOyBrKysgewoJCQlrMSA6PSAoayArIDEpICUgbgoJCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze3JbMF1ba10sIHJbMF1bazFdLCByWzFdW2sxXSwgclsxXVtrXX0sIGtQYXZ9KQoJCX0KCX0KCXJldHVybiBmYWNlcywgRwp9CgpmdW5jIGJ1aWxkUm9zZShjIGN1dFNwZWMpIChmYWNlcyBbXWZhY2UsIGdpcmRsZSBbXXYzKSB7CgluIDo9IGMubgoJYmFzZSA6PSBtYXRoLk1pbihjLnJ4LCBjLnJ5KQoJaCA6PSAwLjYyICogYmFzZQoJYXBleCA6PSB2M3swLCAwLCBofQoJUiA6PSByaW5nUHRzKGMsIG4sIDAuNTUsIGgqMC42MiwgMC41KQoJRyA6PSByaW5nUHRzKGMsIDIqbiwgMSwgMCwgMCkKCWZvciBrIDo9IDA7IGsgPCBuOyBrKysgewoJCWsxIDo9IChrICsgMSkgJSBuCgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3thcGV4LCBSW2tdLCBSW2sxXX0sIGtDcm93bn0pCgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tHWzIqa10sIEdbMiprKzFdLCBSW2tdfSwga0Nyb3dufSkKCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze0dbMiprKzFdLCBHWygyKmsrMiklKDIqbildLCBSW2tdfSwga0Nyb3dufSkKCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze1Jba10sIEdbKDIqaysyKSUoMipuKV0sIFJbazFdfSwga0Nyb3dufSkKCX0KCWJhY2sgOj0gbWFrZShbXXYzLCBsZW4oRykpCglmb3IgaSA6PSByYW5nZSBHIHsKCQliYWNrW2xlbihHKS0xLWldID0gR1tpXQoJfQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7YmFjaywga1Bhdn0pCglyZXR1cm4gZmFjZXMsIEcKfQoKZnVuYyByaW5nWChuIGludCwgeCwgcnksIHJ6LCBwaGFzZSBmbG9hdDY0KSBbXXYzIHsKCW91dCA6PSBtYWtlKFtddjMsIG4pCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQlhIDo9IDIqbWF0aC5QaSooZmxvYXQ2NChrKStwaGFzZSkvZmxvYXQ2NChuKSArIG1hdGguUGkvMgoJCW91dFtrXSA9IHYze3gsIHJ5ICogbWF0aC5Db3MoYSksIHJ6ICogbWF0aC5TaW4oYSl9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgYmFuZFgoYSwgYiBbXXYzKSBbXWZhY2UgewoJdmFyIGZzIFtdZmFjZQoJZm9yIGsgOj0gcmFuZ2UgYSB7CgkJazEgOj0gKGsgKyAxKSAlIGxlbihhKQoJCWZzID0gYXBwZW5kKGZzLCBmYWNle1tddjN7YVtrXSwgYVtrMV0sIGJbazFdLCBiW2tdfSwga0Nyb3dufSkKCX0KCXJldHVybiBmcwp9CgpmdW5jIGNhcFgociBbXXYzKSBmYWNlIHsgcmV0dXJuIGZhY2V7ciwga0Nyb3dufSB9CgpmdW5jIHR1cm5GYWNlcyhmcyBbXWZhY2UsIGF4LCBheiBmbG9hdDY0KSBbXWZhY2UgewoJY3gsIHN4LCBjeiwgc3ogOj0gbWF0aC5Db3MoYXgpLCBtYXRoLlNpbihheCksIG1hdGguQ29zKGF6KSwgbWF0aC5TaW4oYXopCglmb3IgaSA6PSByYW5nZSBmcyB7CgkJZnNbaV0ua2luZCA9IGtQYXYKCQlmb3IgaiwgcCA6PSByYW5nZSBmc1tpXS5wIHsKCQkJeSwgeiA6PSBwLnkqY3gtcC56KnN4LCBwLnkqc3grcC56KmN4CgkJCWZzW2ldLnBbal0gPSB2M3twLngqY3ogLSB5KnN6LCBwLngqc3ogKyB5KmN6LCB6fQoJCX0KCX0KCXJldHVybiBmcwp9CgpmdW5jIGJ1aWxkUmF3KHN0b25lIHN0cmluZykgKGZhY2VzIFtdZmFjZSwgZ2lyZGxlIFtddjMpIHsKCWRlZyA6PSBtYXRoLlBpIC8gMTgwCglzd2l0Y2ggc3RvbmUgewoJY2FzZSAiRGlhbW9uZCI6CgkJYSwgYiwgaCA6PSAyNS4wKnN0b25lU2NhbGUsIDIyLjAqc3RvbmVTY2FsZSwgMjMuMCpzdG9uZVNjYWxlCgkJdiA6PSBbXXYze3thLCAwLCAwfSwgezAsIGIsIDB9LCB7LWEsIDAsIDB9LCB7MCwgLWIsIDB9fQoJCXRvcCwgYm90IDo9IHYzezAsIDAsIGh9LCB2M3swLCAwLCAtaH0KCQlmb3IgayA6PSAwOyBrIDwgNDsgaysrIHsKCQkJazEgOj0gKGsgKyAxKSAlIDQKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3t0b3AsIHZba10sIHZbazFdfSwga0Nyb3dufSkKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tib3QsIHZbazFdLCB2W2tdfSwga0Nyb3dufSkKCQl9CgkJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTM4KmRlZywgMjgqZGVnKSwgbmlsCgljYXNlICJTYXBwaGlyZSI6CgkJTCwgUiA6PSAyNi4wKnN0b25lU2NhbGUsIDE2LjAqc3RvbmVTY2FsZQoJCXIwIDo9IHJpbmdYKDYsIC1MLCBSKjAuNDIsIFIqMC40MiwgMCkKCQlyMSA6PSByaW5nWCg2LCAtTCowLjMsIFIsIFIqMC45NCwgMCkKCQlyMiA6PSByaW5nWCg2LCBMKjAuMywgUiwgUiowLjk0LCAwKQoJCXIzIDo9IHJpbmdYKDYsIEwsIFIqMC40MiwgUiowLjQyLCAwKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMSwgcjIpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMiwgcjMpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBjYXBYKHIzKSkKCQlyZXYgOj0gbWFrZShbXXYzLCA2KQoJCWZvciBpIDo9IHJhbmdlIHIwIHsKCQkJcmV2WzUtaV0gPSByMFtpXQoJCX0KCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJCXJldHVybiB0dXJuRmFjZXMoZmFjZXMsIC0zMCpkZWcsIC0xNCpkZWcpLCBuaWwKCX0KCWlmIHN0b25lID09ICJRdWFydHoiIHsKCQlMLCBSIDo9IDI3LjAqc3RvbmVTY2FsZSwgMTIuNSpzdG9uZVNjYWxlCgkJcjAgOj0gcmluZ1goNiwgLUwsIFIqMS4wNCwgUiwgMCkKCQlyMSA6PSByaW5nWCg2LCBMKjAuNCwgUiwgUiowLjk2LCAwKQoJCXBvaW50IDo9IHYze0wsIDAsIDB9CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGJhbmRYKHIwLCByMSkuLi4pCgkJZm9yIGsgOj0gMDsgayA8IDY7IGsrKyB7CgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7cjFba10sIHIxWyhrKzEpJTZdLCBwb2ludH0sIGtDcm93bn0pCgkJfQoJCXJldiA6PSBtYWtlKFtddjMsIDYpCgkJZm9yIGkgOj0gcmFuZ2UgcjAgewoJCQlyZXZbNS1pXSA9IHIwW2ldCgkJfQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBjYXBYKHJldikpCgkJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTMyKmRlZywgMTYqZGVnKSwgbmlsCgl9CglMLCByeSwgcnogOj0gMjYuMCpzdG9uZVNjYWxlLCAxNi4wKnN0b25lU2NhbGUsIDEzLjAqc3RvbmVTY2FsZQoJcjAgOj0gcmluZ1goOCwgLUwsIHJ5LCByeiwgMC41KQoJcjEgOj0gcmluZ1goOCwgTCowLjUsIHJ5LCByeiwgMC41KQoJdGlwIDo9IHJpbmdYKDgsIEwqMC44MiwgcnkqMC40NSwgcnoqMC40NSwgMC41KQoJcG9pbnQgOj0gdjN7TCwgMCwgMH0KCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGJhbmRYKHIxLCB0aXApLi4uKQoJZm9yIGsgOj0gMDsgayA8IDg7IGsrKyB7CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3t0aXBba10sIHRpcFsoaysxKSU4XSwgcG9pbnR9LCBrQ3Jvd259KQoJfQoJcmV2IDo9IG1ha2UoW112MywgOCkKCWZvciBpIDo9IHJhbmdlIHIwIHsKCQlyZXZbNy1pXSA9IHIwW2ldCgl9CglmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTMwKmRlZywgMTIqZGVnKSwgbmlsCn0KCmNvbnN0IHZpZXdUaWx0ID0gNjEuMAoKY29uc3QgKAoJcGllY2VDWSAgID0gc3VialkgKyAxLjUKKQoKZnVuYyBuMSh2IGZsb2F0NjQpIHN0cmluZyB7CgluZWcgOj0gdiA8IDAKCWlmIG5lZyB7CgkJdiA9IC12Cgl9Cgl0IDo9IGludDY0KHYqMTAgKyAwLjUpCgl3LCBmIDo9IHQvMTAsIHQlMTAKCXMgOj0gIiIKCWlmIGYgPT0gMCB7CgkJcyA9IGl0b2EodykKCX0gZWxzZSBpZiB3ID09IDAgewoJCXMgPSAiLiIgKyBzdHJpbmcoYnl0ZSgnMCcrZikpCgl9IGVsc2UgewoJCXMgPSBpdG9hKHcpICsgIi4iICsgc3RyaW5nKGJ5dGUoJzAnK2YpKQoJfQoJaWYgbmVnICYmIHQgIT0gMCB7CgkJcmV0dXJuICItIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgcmVsUGF0aChwcyBbXXB0KSBzdHJpbmcgewoJcyA6PSAiTSIgKyBuMShwc1swXS54KSArICIgIiArIG4xKHBzWzBdLnkpICsgImwiCglweCwgcHkgOj0gbWF0aC5Sb3VuZChwc1swXS54KjEwKS8xMCwgbWF0aC5Sb3VuZChwc1swXS55KjEwKS8xMAoJZm9yIGkgOj0gMTsgaSA8IGxlbihwcyk7IGkrKyB7CgkJcXgsIHF5IDo9IG1hdGguUm91bmQocHNbaV0ueCoxMCkvMTAsIG1hdGguUm91bmQocHNbaV0ueSoxMCkvMTAKCQlkeCwgZHkgOj0gbjEocXgtcHgpLCBuMShxeS1weSkKCQlpZiBpID4gMSAmJiBkeFswXSAhPSAnLScgewoJCQlzICs9ICIgIgoJCX0KCQlzICs9IGR4CgkJaWYgZHlbMF0gIT0gJy0nIHsKCQkJcyArPSAiICIKCQl9CgkJcyArPSBkeQoJCXB4LCBweSA9IHF4LCBxeQoJfQoJcmV0dXJuIHMgKyAieiIKfQoKZnVuYyBoZXgzKGggc3RyaW5nKSBzdHJpbmcgewoJciwgZywgYiA6PSBoZXhUb1JHQihoKQoJZCA6PSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXEgOj0gZnVuYyh2IGludCkgYnl0ZSB7IHJldHVybiBkWyh2KzgpKjE1LzI1NSUxNl0gfQoJcmV0dXJuICIjIiArIHN0cmluZyhbXWJ5dGV7cShyKSwgcShnKSwgcShiKX0pCn0KCmZ1bmMgY29udmV4SHVsbChwcyBbXXB0KSBbXXB0IHsKCW4gOj0gbGVuKHBzKQoJaWR4IDo9IG1ha2UoW11pbnQsIG4pCglmb3IgaSA6PSByYW5nZSBpZHggewoJCWlkeFtpXSA9IGkKCX0KCWxlc3MgOj0gZnVuYyhhLCBiIGludCkgYm9vbCB7CgkJcmV0dXJuIHBzW2FdLnggPCBwc1tiXS54IHx8IChwc1thXS54ID09IHBzW2JdLnggJiYgcHNbYV0ueSA8IHBzW2JdLnkpCgl9Cgl0bXAgOj0gbWFrZShbXWludCwgbikKCWZvciB3IDo9IDE7IHcgPCBuOyB3ICo9IDIgewoJCWZvciBsbyA6PSAwOyBsbyA8IG47IGxvICs9IDIgKiB3IHsKCQkJbWlkLCBoaSA6PSBsbyt3LCBsbysyKncKCQkJaWYgbWlkID4gbiB7CgkJCQltaWQgPSBuCgkJCX0KCQkJaWYgaGkgPiBuIHsKCQkJCWhpID0gbgoJCQl9CgkJCWksIGosIGsgOj0gbG8sIG1pZCwgbG8KCQkJZm9yIGkgPCBtaWQgJiYgaiA8IGhpIHsKCQkJCWlmIGxlc3MoaWR4W2pdLCBpZHhbaV0pIHsKCQkJCQl0bXBba10gPSBpZHhbal0KCQkJCQlqKysKCQkJCX0gZWxzZSB7CgkJCQkJdG1wW2tdID0gaWR4W2ldCgkJCQkJaSsrCgkJCQl9CgkJCQlrKysKCQkJfQoJCQlmb3IgaSA8IG1pZCB7CgkJCQl0bXBba10gPSBpZHhbaV0KCQkJCWkrKwoJCQkJaysrCgkJCX0KCQkJZm9yIGogPCBoaSB7CgkJCQl0bXBba10gPSBpZHhbal0KCQkJCWorKwoJCQkJaysrCgkJCX0KCQl9CgkJaWR4LCB0bXAgPSB0bXAsIGlkeAoJfQoJY3IgOj0gZnVuYyhvLCBhLCBiIHB0KSBmbG9hdDY0IHsgcmV0dXJuIChhLngtby54KSooYi55LW8ueSkgLSAoYS55LW8ueSkqKGIueC1vLngpIH0KCXZhciBoIFtdcHQKCWZvciBwYXNzIDo9IDA7IHBhc3MgPCAyOyBwYXNzKysgewoJCXN0YXJ0IDo9IGxlbihoKQoJCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCQlwIDo9IHBzW2lkeFtpXV0KCQkJaWYgcGFzcyA9PSAxIHsKCQkJCXAgPSBwc1tpZHhbbi0xLWldXQoJCQl9CgkJCWZvciBsZW4oaCkgPj0gc3RhcnQrMiAmJiBjcihoW2xlbihoKS0yXSwgaFtsZW4oaCktMV0sIHApIDw9IDAgewoJCQkJaCA9IGhbOmxlbihoKS0xXQoJCQl9CgkJCWggPSBhcHBlbmQoaCwgcCkKCQl9CgkJaCA9IGhbOmxlbihoKS0xXQoJfQoJcmV0dXJuIGgKfQoKZnVuYyBwb2x5QXJlYShwcyBbXXB0KSBmbG9hdDY0IHsKCWEgOj0gMC4wCglmb3IgaSA6PSByYW5nZSBwcyB7CgkJaiA6PSAoaSArIDEpICUgbGVuKHBzKQoJCWEgKz0gcHNbaV0ueCpwc1tqXS55IC0gcHNbal0ueCpwc1tpXS55Cgl9CglpZiBhIDwgMCB7CgkJcmV0dXJuIC1hIC8gMgoJfQoJcmV0dXJuIGEgLyAyCn0KCmZ1bmMgY2xpcEhhbGYocHMgW11wdCwgb3gsIG95LCBueCwgbnkgZmxvYXQ2NCkgW11wdCB7CglpZiBsZW4ocHMpID09IDAgewoJCXJldHVybiBwcwoJfQoJZCA6PSBmdW5jKHEgcHQpIGZsb2F0NjQgeyByZXR1cm4gKHEueC1veCkqbnggKyAocS55LW95KSpueSB9Cgl2YXIgb3V0IFtdcHQKCWZvciBpIDo9IHJhbmdlIHBzIHsKCQlhLCBiIDo9IHBzW2ldLCBwc1soaSsxKSVsZW4ocHMpXQoJCWRhLCBkYiA6PSBkKGEpLCBkKGIpCgkJaWYgZGEgPD0gMCB7CgkJCW91dCA9IGFwcGVuZChvdXQsIGEpCgkJfQoJCWlmIChkYSA8IDAgJiYgZGIgPiAwKSB8fCAoZGEgPiAwICYmIGRiIDwgMCkgewoJCQl0IDo9IGRhIC8gKGRhIC0gZGIpCgkJCW91dCA9IGFwcGVuZChvdXQsIHB0e2EueCArIChiLngtYS54KSp0LCBhLnkgKyAoYi55LWEueSkqdH0pCgkJfQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIGNsaXBUb0NvbnZleChwcywgd2luIFtdcHQpIFtdcHQgewoJZm9yIGkgOj0gcmFuZ2Ugd2luIHsKCQlhLCBiIDo9IHdpbltpXSwgd2luWyhpKzEpJWxlbih3aW4pXQoJCW54LCBueSA6PSBiLnktYS55LCBhLngtYi54CgkJbWlkIDo9IHB0eyhhLnggKyBiLngpIC8gMiwgKGEueSArIGIueSkgLyAyfQoJCWN4LCBjeSA6PSBjZW50cm9pZCh3aW4pCgkJaWYgKG1pZC54LWN4KSpueCsobWlkLnktY3kpKm55IDwgMCB7CgkJCW54LCBueSA9IC1ueCwgLW55CgkJfQoJCXBzID0gY2xpcEhhbGYocHMsIGEueCwgYS55LCBueCwgbnkpCgkJaWYgbGVuKHBzKSA8IDMgewoJCQlyZXR1cm4gbmlsCgkJfQoJfQoJcmV0dXJuIHBzCn0KCmZ1bmMgc3BsaXRQb2x5KHBzIFtdcHQsIGFuZyBmbG9hdDY0KSAoW11wdCwgW11wdCkgewoJY3gsIGN5IDo9IGNlbnRyb2lkKHBzKQoJbngsIG55IDo9IG1hdGguQ29zKGFuZyksIG1hdGguU2luKGFuZykKCXJldHVybiBjbGlwSGFsZihwcywgY3gsIGN5LCBueCwgbnkpLCBjbGlwSGFsZihwcywgY3gsIGN5LCAtbngsIC1ueSkKfQoKZnVuYyByZW5kZXJTb2xpZDNEKHNoYXBlSWR4IGludCwgYmFzZSwgc2FsdCBzdHJpbmcsIGZzICpmYWNldFN0eWxlKSAodW5kZXIsIGZhY2V0cywgb3ZlciBzdHJpbmcpIHsKCWMgOj0gY3V0Rm9yKHNoYXBlSWR4KQoJdmFyIGZhY2VzIFtdZmFjZQoJdmFyIGdpcmRsZSBbXXYzCglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSBzaGFwZVJvc2U6CgkJZmFjZXMsIGdpcmRsZSA9IGJ1aWxkUm9zZShjKQoJY2FzZSBzaGFwZVJhdzoKCQlmYWNlcywgZ2lyZGxlID0gYnVpbGRSYXcoZnMuc3RvbmUpCglkZWZhdWx0OgoJCWZhY2VzLCBnaXJkbGUgPSBidWlsZEN1dChjKQoJfQoJcmF3IDo9IHNoYXBlSWR4ID09IHNoYXBlUmF3CgoJc2ggOj0gZnMucHJvZi5zaGFkb3cKCWlmIGZzLnByb2YubmV1dHJhbCAhPSAiIiB7CgkJYmFzZSA9IGZzLnByb2YubmV1dHJhbAoJfQoJYmFzZSA9IG1peEhleChiYXNlLCBzaCwgZnMucHJvZi5ib2R5TWl4KQoJZGVlcCA6PSBkYXJrZW4oYmFzZSwgc2gsIDAuOSkKCWJyaWdodCA6PSBsaWdodGVuKGJhc2UsIDAuNSkKCWZzLmZsYXNoID0gZmxhc2hSYW1wKDI4LCBmcy5wcm9mLnNhdCkKCWRlZXBJLCBiYXNlSSwgYnJpZ2h0SSA6PSB0b1JHQkkoZGVlcCksIHRvUkdCSShiYXNlKSwgdG9SR0JJKGJyaWdodCkKCXRvbmVJIDo9IGZ1bmMobHVtIGZsb2F0NjQpIHJnYkkgewoJCWlmIGx1bSA8IDAgewoJCQlsdW0gPSAwCgkJfQoJCWlmIGx1bSA+IDEgewoJCQlsdW0gPSAxCgkJfQoJCWlmIGx1bSA8IDAuNSB7CgkJCXJldHVybiBtaXhJKGRlZXBJLCBiYXNlSSwgbHVtKjIpCgkJfQoJCXJldHVybiBtaXhJKGJhc2VJLCBicmlnaHRJLCAobHVtLTAuNSkqMikKCX0KCXRvbmUgOj0gZnVuYyhsdW0gZmxvYXQ2NCkgc3RyaW5nIHsgcmV0dXJuIHRvbmVJKGx1bSkuaGV4KCkgfQoKCXlhdyA6PSBmcy56b25lLmZsb2F0SW4oLTEzLCAxMykgKiBtYXRoLlBpIC8gMTgwCgl0aCA6PSB2aWV3VGlsdCAqIG1hdGguUGkgLyAxODAKCWN5LCBzeSA6PSBtYXRoLkNvcyh5YXcpLCBtYXRoLlNpbih5YXcpCgljdCwgc3R0IDo9IG1hdGguQ29zKHRoKSwgbWF0aC5TaW4odGgpCgl2aWV3IDo9IGZ1bmMocCB2MykgdjMgewoJCXgxLCB5MSA6PSBwLngqY3ktcC55KnN5LCBwLngqc3krcC55KmN5CgkJcmV0dXJuIHYze3gxLCB5MSpjdCArIHAueipzdHQsIHAueipjdCAtIHkxKnN0dH0KCX0KCWV4MCwgZXkwLCBleDEsIGV5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJZm9yIF8sIGYgOj0gcmFuZ2UgZmFjZXMgewoJCWZvciBfLCBwIDo9IHJhbmdlIGYucCB7CgkJCXEgOj0gdmlldyhwKQoJCQlleDAsIGV5MCA9IG1hdGguTWluKGV4MCwgcS54KSwgbWF0aC5NaW4oZXkwLCBxLnkpCgkJCWV4MSwgZXkxID0gbWF0aC5NYXgoZXgxLCBxLngpLCBtYXRoLk1heChleTEsIHEueSkKCQl9Cgl9CglveCwgb3kgOj0gLShleDArZXgxKS8yLCAtKGV5MCtleTEpLzIKCXNjciA6PSBmdW5jKHAgdjMpIHB0IHsgcmV0dXJuIHB0e3N1YmpYICsgcC54ICsgb3gsIHBpZWNlQ1kgLSAocC55ICsgb3kpfSB9CglsaWdodCA6PSB2bm9ybSh2M3stMC41LCAwLjYyLCAwLjZ9KQoJaW5zaWRlIDo9IHYzezAsIDAsIC0wLjI1ICogYy5yeX0KCWlmIHJhdyB7CgkJaW5zaWRlID0gdjN7fQoJfSBlbHNlIGlmIHNoYXBlSWR4ID09IHNoYXBlUm9zZSB7CgkJaW5zaWRlID0gdjN7MCwgMCwgMC4xNSAqIGMucnl9Cgl9CgoJdHlwZSBkcmF3biBzdHJ1Y3QgewoJCXB0cyAgIFtdcHQKCQlkZXB0aCBmbG9hdDY0CgkJZmlsbCAgc3RyaW5nCgkJa2luZCAgaW50CgkJbHVtICAgZmxvYXQ2NAoJCW52ICAgICAgICAgICAgICAgIHYzCgkJaml0LCBkcmlmdCwgdGhpY2sgZmxvYXQ2NAoJCWV4dCAgICAgICAgICAgICAgIGJvb2wKCX0KCXNoYWRlRnJvbnQgOj0gZnVuYyhraW5kIGludCwgbnYsIEwgdjMsIGppdCwgZHJpZnQsIHRoaWNrIGZsb2F0NjQsIGV4dCBib29sKSAoc3RyaW5nLCBmbG9hdDY0KSB7CgkJSCA6PSB2bm9ybSh2M3tMLngsIEwueSwgTC56ICsgMX0pCgkJbGFtIDo9IG1hdGguTWF4KDAsIHZkb3QobnYsIEwpKQoJCWx1bSA6PSAwLjAzICsgMC43Km1hdGguUG93KGxhbSwgMi4xKSArIGppdAoJCWlmIGV4dCB7CgkJCWx1bSAqPSAwLjMKCQl9CgkJaWYga2luZCA9PSBrVGFibGUgewoJCQlsdW0gPSAwLjM2ICsgMC4yNipsYW0KCQl9CgkJaWYga2luZCA9PSBrUGF2IHsKCQkJbHVtID0gMC4yMiArIDAuNSptYXRoLk1heCgwLCB2ZG90KHZzY2FsZShudiwgLTEpLCBMKSkgKyBqaXQKCQl9CgkJaWYgcmF3IHsKCQkJbHVtID0gMC4zICsgMC40MiptYXRoLlBvdyhsYW0sIDEuNCkgKyAwLjIyKm1hdGguTWF4KDAsIHZkb3QodnNjYWxlKG52LCAtMSksIEwpKSArIGppdCowLjYKCQl9CgkJY29sIDo9IG1peEkodG9uZUkobHVtKSwgZGVlcEksIDAuMzQqdGhpY2sqdGhpY2spCgkJaWYgc3AgOj0gbWF0aC5Qb3cobWF0aC5NYXgoMCwgdmRvdChudiwgSCkpLCAyOCk7IHNwID4gMC4zIHsKCQkJY29sID0gbWl4SShjb2wsIHdoaXRlSSwgc3AqMC44NSkKCQl9CgkJaWYgbHVtID4gMC41ICYmIGtpbmQgIT0ga1RhYmxlIHsKCQkJYW10IDo9IG1hdGguTWluKDEsIChsdW0tMC41KS8wLjQpICogZGlzcGVyc2lvbk1peCAqIGZzLnByb2Yuc2F0CgkJCXQgOj0gbWF0aC5BdGFuMihudi55LCBudi54KS9tYXRoLlBpICsgZHJpZnQvNDAKCQkJY29sID0gbWl4SShjb2wsIHNwZWN0cnVtQXRJKHQpLCBhbXQpCgkJfQoJCXJldHVybiBoZXgzSShodWVSb3RhdGVJKGNvbCwgZHJpZnQpKSwgbHVtCgl9Cgl2YXIgYmFjaywgZnJvbnQsIHBhdiBbXWRyYXduCgl2YXIgYWxsIFtdcHQKCWZvciBfLCBmIDo9IHJhbmdlIGZhY2VzIHsKCQl2cCA6PSBtYWtlKFtddjMsIGxlbihmLnApKQoJCWN0ciA6PSB2M3t9CgkJZm9yIGksIHAgOj0gcmFuZ2UgZi5wIHsKCQkJdnBbaV0gPSB2aWV3KHApCgkJCWN0ciA9IHYze2N0ci54ICsgcC54LCBjdHIueSArIHAueSwgY3RyLnogKyBwLnp9CgkJfQoJCWN0ciA9IHZzY2FsZShjdHIsIDEvZmxvYXQ2NChsZW4oZi5wKSkpCgkJbm0gOj0gdjN7fQoJCWZvciBpIDo9IHJhbmdlIGYucCB7CgkJCWEsIGIgOj0gZi5wW2ldLCBmLnBbKGkrMSklbGVuKGYucCldCgkJCW5tID0gdjN7bm0ueCArIChhLnktYi55KSooYS56K2IueiksIG5tLnkgKyAoYS56LWIueikqKGEueCtiLngpLCBubS56ICsgKGEueC1iLngpKihhLnkrYi55KX0KCQl9CgkJbm0gPSB2bm9ybShubSkKCQlpZiB2ZG90KG5tLCB2c3ViKGN0ciwgaW5zaWRlKSkgPCAwIHsKCQkJbm0gPSB2c2NhbGUobm0sIC0xKQoJCX0KCQludiA6PSB2bm9ybSh2aWV3KG5tKSkKCQlkIDo9IGRyYXdue2tpbmQ6IGYua2luZH0KCQlmb3IgXywgcCA6PSByYW5nZSB2cCB7CgkJCWQucHRzID0gYXBwZW5kKGQucHRzLCBzY3IocCkpCgkJCWQuZGVwdGggKz0gcC56CgkJCWFsbCA9IGFwcGVuZChhbGwsIHNjcihwKSkKCQl9CgkJZC5kZXB0aCAvPSBmbG9hdDY0KGxlbih2cCkpCgkJck4gOj0gbWF0aC5TcXJ0KChjdHIueC9jLnJ4KSooY3RyLngvYy5yeCkgKyAoY3RyLnkvYy5yeSkqKGN0ci55L2MucnkpKQoJCWlmIHJOID4gMSB7CgkJCXJOID0gMQoJCX0KCQl0aGljayA6PSAxIC0gck4KCQlqaXQgOj0gZnMuem9uZS5mbG9hdEluKC0wLjEzLCAwLjEzKQoJCWlmIG52LnogPiAwLjAyIHsKCQkJZXh0IDo9IGYua2luZCA9PSBrQ3Jvd24gJiYgZnMuem9uZS5mbG9hdEluKDAsIDEpIDwgMC4yOAoJCQlkcmlmdCA6PSBmcy56b25lLmZsb2F0SW4oLWZpcmVab25lRGVnLCBmaXJlWm9uZURlZykKCQkJZC5udiwgZC5qaXQsIGQuZHJpZnQsIGQudGhpY2ssIGQuZXh0ID0gbnYsIGppdCwgZHJpZnQsIHRoaWNrLCBleHQKCQkJZC5maWxsLCBkLmx1bSA9IHNoYWRlRnJvbnQoZi5raW5kLCBudiwgbGlnaHQsIGppdCwgZHJpZnQsIHRoaWNrLCBleHQpCgkJCWZyb250ID0gYXBwZW5kKGZyb250LCBkKQoJCQlpZiBmLmtpbmQgPT0ga1BhdiB7CgkJCQlwYXYgPSBhcHBlbmQocGF2LCBkKQoJCQl9CgkJfSBlbHNlIGlmIGYua2luZCA9PSBrUGF2IHsKCQkJaW5uZXIgOj0gdnNjYWxlKG52LCAtMSkKCQkJbHVtIDo9IDAuMiArIDAuNiptYXRoLk1heCgwLCB2ZG90KGlubmVyLCBsaWdodCkpICsgaml0CgkJCWQuZmlsbCA9IGhleDMobWl4SGV4KHRvbmUobHVtKSwgZGVlcCwgMC4zNCp0aGljayp0aGljaykpCgkJCWQubHVtID0gbHVtCgkJCWJhY2sgPSBhcHBlbmQoYmFjaywgZCkKCQkJcGF2ID0gYXBwZW5kKHBhdiwgZCkKCQl9Cgl9Cglzb3J0RHJhd24gOj0gZnVuYyhkcyBbXWRyYXduKSB7CgkJZm9yIGkgOj0gMTsgaSA8IGxlbihkcyk7IGkrKyB7CgkJCWZvciBqIDo9IGk7IGogPiAwICYmIGRzW2pdLmRlcHRoIDwgZHNbai0xXS5kZXB0aDsgai0tIHsKCQkJCWRzW2pdLCBkc1tqLTFdID0gZHNbai0xXSwgZHNbal0KCQkJfQoJCX0KCX0KCXNvcnREcmF3bihiYWNrKQoJc29ydERyYXduKGZyb250KQoKCWh1bGwgOj0gY29udmV4SHVsbChhbGwpCglpZiBzaGFwZUlkeCA9PSBzaGFwZUhlYXJ0IHsKCQlodWxsID0gbmlsCgkJZm9yIF8sIGcgOj0gcmFuZ2UgZ2lyZGxlIHsKCQkJaHVsbCA9IGFwcGVuZChodWxsLCBzY3IodmlldyhnKSkpCgkJfQoJfQoJdmFyIHVuZGVyQiwgZmFjZXRzQiBzdHJpbmdzLkJ1aWxkZXIKCXVuZGVyQi5Xcml0ZVN0cmluZyhgPGRlZnM+PHJhZGlhbEdyYWRpZW50IGlkPSJiZGAgKyBzYWx0ICsgYCIgY3g9Ii40IiBjeT0iLjM1IiByPSIuNzUiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9ImAgKyBoZXgzKGJhc2UpICsgYCIvPjxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9ImAgKyBoZXgzKGRhcmtlbihiYXNlLCBzaCwgMC4yNSkpICsgYCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iYCArIGhleDMoZGFya2VuKGJhc2UsIHNoLCAwLjg1KSkgKyBgIi8+PC9yYWRpYWxHcmFkaWVudD48L2RlZnM+YCArCgkJYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGh1bGwpICsgYCIgZmlsbD0idXJsKCNiZGAgKyBzYWx0ICsgYCkiIG9wYWNpdHk9Ii43Ii8+PGcgZmlsbC1vcGFjaXR5PSIuNiI+YCkKCWZvciBfLCBkIDo9IHJhbmdlIGJhY2sgewoJCXVuZGVyQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiLz5gKQoJfQoJdW5kZXJCLldyaXRlU3RyaW5nKGA8L2c+YCkKCgluQ3Jvd24gOj0gMAoJZm9yIF8sIGQgOj0gcmFuZ2UgZnJvbnQgewoJCWlmIGQua2luZCA9PSBrQ3Jvd24gewoJCQluQ3Jvd24rKwoJCX0KCX0KCWNhbmRQIDo9IDEuMAoJaWYgbkNyb3duID4gZmlyZU1heEZhY2V0cyB7CgkJY2FuZFAgPSBmbG9hdDY0KGZpcmVNYXhGYWNldHMpIC8gZmxvYXQ2NChuQ3Jvd24pICogMS4yNQoJfQoJbkNhbmQgOj0gMAoJblNwbGl0IDo9IDAKCWlmIHJhdyB8fCBmcy50aHVtYiB7CgkJY2FuZFAgPSAwCgl9Cglmb3IgXywgZCA6PSByYW5nZSBmcm9udCB7CgkJaWYgZC5raW5kID09IGtUYWJsZSAmJiBzaGFwZUlkeCA9PSBzaGFwZUhlYXJ0IHsKCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiIGZpbGwtb3BhY2l0eT0iLjQ2Ii8+YCkKCQkJY29udGludWUKCQl9CgkJaWYgZC5raW5kID09IGtUYWJsZSB7CgkJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGQucHRzKSArIGAiIGZpbGw9ImAgKyBkLmZpbGwgKyBgIiBmaWxsLW9wYWNpdHk9Ii40NiIvPmApCgkJCXdpbiA6PSBjb252ZXhIdWxsKGQucHRzKQoJCQl0eCwgdHkgOj0gY2VudHJvaWQod2luKQoJCQlpZiBsZW4ocGF2KSA+IDAgJiYgIWZzLnRodW1iIHsKCQkJCWJ4MCwgYnkwLCBieDEsIGJ5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJCQkJZm9yIF8sIGIgOj0gcmFuZ2UgcGF2IHsKCQkJCQlmb3IgXywgcSA6PSByYW5nZSBiLnB0cyB7CgkJCQkJCWJ4MCwgYnkwID0gbWF0aC5NaW4oYngwLCBxLngpLCBtYXRoLk1pbihieTAsIHEueSkKCQkJCQkJYngxLCBieTEgPSBtYXRoLk1heChieDEsIHEueCksIG1hdGguTWF4KGJ5MSwgcS55KQoJCQkJCX0KCQkJCX0KCQkJCXd4MCwgd3kwLCB3eDEsIHd5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJCQkJZm9yIF8sIHEgOj0gcmFuZ2Ugd2luIHsKCQkJCQl3eDAsIHd5MCA9IG1hdGguTWluKHd4MCwgcS54KSwgbWF0aC5NaW4od3kwLCBxLnkpCgkJCQkJd3gxLCB3eTEgPSBtYXRoLk1heCh3eDEsIHEueCksIG1hdGguTWF4KHd5MSwgcS55KQoJCQkJfQoJCQkJayA6PSAwLjkyICogbWF0aC5NaW4oKHd4MS13eDApL21hdGguTWF4KDEsIGJ4MS1ieDApLCAod3kxLXd5MCkvbWF0aC5NYXgoMSwgYnkxLWJ5MCkpCgkJCQlieCwgYnkgOj0gKGJ4MCtieDEpLzIsIChieTArYnkxKS8yCgkJCQl2YXIgbW9zQiBzdHJpbmdzLkJ1aWxkZXIKCQkJCW5SZWZsIDo9IDAKCQkJCWZvciBfLCBiIDo9IHJhbmdlIHBhdiB7CgkJCQkJaWYgblJlZmwgPj0gOCB7CgkJCQkJCWJyZWFrCgkJCQkJfQoJCQkJCW1wIDo9IG1ha2UoW11wdCwgbGVuKGIucHRzKSkKCQkJCQlmb3IgaSwgcSA6PSByYW5nZSBiLnB0cyB7CgkJCQkJCW1wW2ldID0gcHR7dHggKyAocS54LWJ4KSprLCB0eSAtIChxLnktYnkpKmt9CgkJCQkJfQoJCQkJCWNsIDo9IGNsaXBUb0NvbnZleChtcCwgd2luKQoJCQkJCWlmIGxlbihjbCkgPCAzIHx8IHBvbHlBcmVhKGNsKSA8IDQgewoJCQkJCQljb250aW51ZQoJCQkJCX0KCQkJCQluUmVmbCsrCgkJCQkJbW9zQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoY2wpICsgYCIgZmlsbD0iYCArIGhleDModG9uZShiLmx1bSowLjk1KSkgKyBgIi8+YCkKCQkJCX0KCQkJCWlmIG1vc0IuTGVuKCkgPiAwIHsKCQkJCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8ZyBmaWxsLW9wYWNpdHk9Ii41NSI+YCArIG1vc0IuU3RyaW5nKCkgKyBgPC9nPmApCgkJCQl9CgkJCX0KCQkJY29udGludWUKCQl9CgkJaWYgZC5raW5kID09IGtDcm93biAmJiBuQ2FuZCA8IGZpcmVNYXhGYWNldHMgJiYgZnMuem9uZS5mbG9hdEluKDAsIDEpIDwgY2FuZFAgewoJCQluQ2FuZCsrCgkJCWN4LCBjeXkgOj0gY2VudHJvaWQoZC5wdHMpCgkJCWZzLnJpbmdDZW50ID0gYXBwZW5kKGZzLnJpbmdDZW50LCBwdHtjeCwgY3l5fSkKCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiIGNsYXNzPSJmIi8+YCkKCQkJY29udGludWUKCQl9CgkJaWYgIXJhdyAmJiBuU3BsaXQgPCA2ICYmIHBvbHlBcmVhKGQucHRzKSA+IDI2ICYmIGZzLnpvbmUuZmxvYXRJbigwLCAxKSA8IDAuNSB7CgkJCWEsIGIgOj0gc3BsaXRQb2x5KGQucHRzLCBmcy56b25lLmZsb2F0SW4oMCwgbWF0aC5QaSkpCgkJCWlmIGxlbihhKSA+PSAzICYmIGxlbihiKSA+PSAzIHsKCQkJCW5TcGxpdCsrCgkJCQlsbyA6PSBoZXgzKG1peEhleCh0b25lKG1hdGguTWF4KDAsIGQubHVtKjAuNi0wLjA0KSksIGRlZXAsIDAuMTgpKQoJCQkJaGkgOj0gaGV4Myh0b25lKG1hdGguTWluKDEsIGQubHVtKjEuMzUrMC4wNikpKQoJCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoYSkgKyBgIiBmaWxsPSJgICsgaGkgKyBgIi8+PHBhdGggZD0iYCArIHJlbFBhdGgoYikgKyBgIiBmaWxsPSJgICsgbG8gKyBgIi8+YCkKCQkJCWNvbnRpbnVlCgkJCX0KCQl9CgkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiLz5gKQoJfQoKCV8sIF8sIF8sIF8sIHJvdERlZyA6PSBtb3Rpb25QaGFzZXMoc2FsdCkKCXR5cGUgY2FuZCBzdHJ1Y3QgewoJCWkgICAgIGludAoJCWZpbGwgIHN0cmluZwoJCWRlbHRhIGZsb2F0NjQKCX0KCWZvciBzaSwgc2duIDo9IHJhbmdlIFtdZmxvYXQ2NHsxLCAtMX0gewoJCWlmIGZzLnRodW1iIHsKCQkJYnJlYWsKCQl9CgkJYSA6PSAtc2duICogcm90RGVnICogbGlnaHRTd2luZyAqIG1hdGguUGkgLyAxODAKCQljYSwgc2EgOj0gbWF0aC5Db3MoYSksIG1hdGguU2luKGEpCgkJTCA6PSB2bm9ybSh2M3tsaWdodC54KmNhIC0gbGlnaHQueSpzYSwgbGlnaHQueCpzYSArIGxpZ2h0LnkqY2EsIGxpZ2h0Lnp9KQoJCXZhciBjcyBbXWNhbmQKCQlmb3IgaSwgZCA6PSByYW5nZSBmcm9udCB7CgkJCWlmIGQua2luZCA9PSBrVGFibGUgewoJCQkJY29udGludWUKCQkJfQoJCQlmMiwgXyA6PSBzaGFkZUZyb250KGQua2luZCwgZC5udiwgTCwgZC5qaXQsIGQuZHJpZnQsIGQudGhpY2ssIGQuZXh0KQoJCQlpZiBkbCA6PSBsdW1hRGVsdGEoZjIsIGQuZmlsbCk7IGRsID4gMC4wNiAmJiBwb2x5QXJlYShkLnB0cykgPiAzIHsKCQkJCWNzID0gYXBwZW5kKGNzLCBjYW5ke2ksIGYyLCBkbH0pCgkJCX0KCQl9CgkJZm9yIGkgOj0gMTsgaSA8IGxlbihjcyk7IGkrKyB7CgkJCWZvciBqIDo9IGk7IGogPiAwICYmIGNzW2pdLmRlbHRhID4gY3Nbai0xXS5kZWx0YTsgai0tIHsKCQkJCWNzW2pdLCBjc1tqLTFdID0gY3Nbai0xXSwgY3Nbal0KCQkJfQoJCX0KCQlpZiBsZW4oY3MpID4gbGlnaHRNYXhGYWNldHMgewoJCQljcyA9IGNzWzpsaWdodE1heEZhY2V0c10KCQl9CgkJaWYgbGVuKGNzKSA9PSAwIHsKCQkJY29udGludWUKCQl9CgkJY2xzIDo9ICJndC1sYSIKCQlpZiBzaSA9PSAxIHsKCQkJY2xzID0gImd0LWxiIgoJCX0KCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8ZyBjbGFzcz0iYCArIGNscyArIGAiIG9wYWNpdHk9IjAiPmApCgkJZm9yIF8sIGMgOj0gcmFuZ2UgY3MgewoJCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8cGF0aCBkPSJgICsgcmVsUGF0aChmcm9udFtjLmldLnB0cykgKyBgIiBmaWxsPSJgICsgYy5maWxsICsgYCIvPmApCgkJfQoJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDwvZz5gKQoJfQoKCWdkLCBsYXN0RyA6PSAiIiwgIiIKCWZvciBpIDo9IHJhbmdlIGdpcmRsZSB7CgkJYSwgYiA6PSB2aWV3KGdpcmRsZVtpXSksIHZpZXcoZ2lyZGxlWyhpKzEpJWxlbihnaXJkbGUpXSkKCQltaWQgOj0gdnNjYWxlKHYze2dpcmRsZVtpXS54ICsgZ2lyZGxlWyhpKzEpJWxlbihnaXJkbGUpXS54LCBnaXJkbGVbaV0ueSArIGdpcmRsZVsoaSsxKSVsZW4oZ2lyZGxlKV0ueSwgMH0sIDAuNSkKCQlpZiB2aWV3KHZub3JtKG1pZCkpLnotMCA+IC0wLjA1ICYmIHZpZXcobWlkKS56ID49IHZpZXcodjN7fSkuei0wLjAxIHsKCQkJcGEsIHBiIDo9IHNjcihhKSwgc2NyKGIpCgkJCXNhIDo9IG4xKHBhLngpICsgIiAiICsgbjEocGEueSkKCQkJaWYgc2EgIT0gbGFzdEcgewoJCQkJZ2QgKz0gIk0iICsgc2EKCQkJfQoJCQlsYXN0RyA9IG4xKHBiLngpICsgIiAiICsgbjEocGIueSkKCQkJZ2QgKz0gIiAiICsgbGFzdEcKCQl9Cgl9CglvdmVyID0gYDxwYXRoIGQ9ImAgKyBnZCArIGAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iYCArIGhleDMobGlnaHRlbihiYXNlLCAwLjE4KSkgKyBgIiBzdHJva2Utd2lkdGg9Ii43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIG9wYWNpdHk9Ii40Ii8+YAoJcmV0dXJuIHVuZGVyQi5TdHJpbmcoKSwgZmFjZXRzQi5TdHJpbmcoKSwgb3Zlcgp9Cgpjb25zdCBkaXNwZXJzaW9uTWl4ID0gMC4zMgoKdmFyIHNwZWN0cnVtID0gW11zdHJpbmd7IiNmZjQwNDAiLCAiI2ZmOWExZiIsICIjZmZlODFmIiwgIiMzNWZmN2EiLCAiIzIyY2NmZiIsICIjNTU2NmZmIiwgIiNjMDRkZmYifQoKdmFyIHNwZWN0cnVtSSA9IGZ1bmMoKSBbXXJnYkkgewoJb3V0IDo9IG1ha2UoW11yZ2JJLCBsZW4oc3BlY3RydW0pKQoJZm9yIGksIGggOj0gcmFuZ2Ugc3BlY3RydW0gewoJCW91dFtpXSA9IHRvUkdCSShoKQoJfQoJcmV0dXJuIG91dAp9KCkKCmZ1bmMgc3BlY3RydW1BdEkodCBmbG9hdDY0KSByZ2JJIHsKCXQgPSB0IC0gbWF0aC5GbG9vcih0KQoJZiA6PSB0ICogZmxvYXQ2NChsZW4oc3BlY3RydW1JKSkKCWkgOj0gaW50KGYpCglyZXR1cm4gbWl4SShzcGVjdHJ1bUlbaSVsZW4oc3BlY3RydW1JKV0sIHNwZWN0cnVtSVsoaSsxKSVsZW4oc3BlY3RydW1JKV0sIGYtZmxvYXQ2NChpKSkKfQoKZnVuYyBzcGVjdHJ1bUF0KHQgZmxvYXQ2NCkgc3RyaW5nIHsKCXQgPSB0IC0gbWF0aC5GbG9vcih0KQoJZiA6PSB0ICogZmxvYXQ2NChsZW4oc3BlY3RydW0pKQoJaSA6PSBpbnQoZikKCXJldHVybiBtaXhIZXgoc3BlY3RydW1baSVsZW4oc3BlY3RydW0pXSwgc3BlY3RydW1bKGkrMSklbGVuKHNwZWN0cnVtKV0sIGYtZmxvYXQ2NChpKSkKfQoKY29uc3QgKAoJbGlnaHRTd2luZyAgICAgPSAyLjIKCWxpZ2h0TWF4RmFjZXRzID0gMTIKKQoKZnVuYyBsdW1hRGVsdGEoYSwgYiBzdHJpbmcpIGZsb2F0NjQgewoJd2lkZSA6PSBmdW5jKGggc3RyaW5nKSBzdHJpbmcgewoJCWlmIGxlbihoKSA9PSA0IHsKCQkJcmV0dXJuICIjIiArIGhbMToyXSArIGhbMToyXSArIGhbMjozXSArIGhbMjozXSArIGhbMzo0XSArIGhbMzo0XQoJCX0KCQlyZXR1cm4gaAoJfQoJYXIsIGFnLCBhYiA6PSBoZXhUb1JHQih3aWRlKGEpKQoJYnIsIGJnLCBiYiA6PSBoZXhUb1JHQih3aWRlKGIpKQoJZCA6PSAoMC4yMTI2KmZsb2F0NjQoYXItYnIpICsgMC43MTUyKmZsb2F0NjQoYWctYmcpICsgMC4wNzIyKmZsb2F0NjQoYWItYmIpKSAvIDI1NQoJaWYgZCA8IDAgewoJCXJldHVybiAtZAoJfQoJcmV0dXJuIGQKfQoKY29uc3QgZmlyZU1heEZhY2V0cyA9IDEyCgpjb25zdCBzdGFyZmllbGQgPSB0cnVlCgpmdW5jIHJlbmRlclN0YXJzKHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJaWYgIXN0YXJmaWVsZCB7CgkJcmV0dXJuICIiCgl9CglybmQgOj0gbmV3UFJORygic3RhcnMiICsgc2FsdCkKCXR5cGUgc3RhciBzdHJ1Y3R7IHgsIHkgZmxvYXQ2NCB9Cgl2YXIgYnlMZXZlbCBbNF1bXXN0YXIKCWZvciBpIDo9IDA7IGkgPCAzNjsgaSsrIHsKCQl4LCB5IDo9IHJuZC5mbG9hdEluKDMsIGNhbnZhc1ctMyksIHJuZC5mbG9hdEluKDMsIDEyNykKCQlrIDo9IHJuZC5pbnRuKDIwKQoJCWR4LCBkeSA6PSB4LXN1YmpYLCB5LXN1YmpZCgkJaWYgciA6PSBtYXRoLlNxcnQoZHgqZHggKyBkeSpkeSk7IHIgPiA0MyAmJiByIDwgNTggewoJCQljb250aW51ZQoJCX0KCQlsdmwgOj0gMCAvLyBtb3N0IHN0YXJzIGFyZSBmYWludDsgYSBmZXcgYXJlIGJyaWdodAoJCXN3aXRjaCB7CgkJY2FzZSBrID49IDE4OgoJCQlsdmwgPSAzCgkJY2FzZSBrID49IDE0OgoJCQlsdmwgPSAyCgkJY2FzZSBrID49IDg6CgkJCWx2bCA9IDEKCQl9CgkJYnlMZXZlbFtsdmxdID0gYXBwZW5kKGJ5TGV2ZWxbbHZsXSwgc3Rhcnt4LCB5fSkKCX0KCXdpZHRocyA6PSBbNF1zdHJpbmd7Ii40NSIsICIuNiIsICIuODUiLCAiMS4xNSJ9CglvcHMgOj0gWzRdc3RyaW5neyIuMjIiLCAiLjM4IiwgIi41OCIsICIuODUifQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGA8ZyBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgZmlsbD0ibm9uZSI+YCkKCXZhciB0dyBbXXN0YXIKCWZvciBsIDo9IDA7IGwgPCA0OyBsKysgewoJCWlmIGxlbihieUxldmVsW2xdKSA9PSAwIHsKCQkJY29udGludWUKCQl9CgkJZCA6PSAiIgoJCWZvciBpLCBzdCA6PSByYW5nZSBieUxldmVsW2xdIHsKCQkJaWYgbCA+PSAxICYmIGwgPD0gMiAmJiBsZW4odHcpIDwgMyAmJiBpJTMgPT0gMCB7CgkJCQl0dyA9IGFwcGVuZCh0dywgc3QpCgkJCQljb250aW51ZQoJCQl9CgkJCWQgKz0gIk0iICsgbjEoc3QueCkgKyAiICIgKyBuMShzdC55KSArICJoLjAxIgoJCX0KCQlpZiBkICE9ICIiIHsKCQkJYi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIGQgKyBgIiBzdHJva2Utd2lkdGg9ImAgKyB3aWR0aHNbbF0gKyBgIiBvcGFjaXR5PSJgICsgb3BzW2xdICsgYCIvPmApCgkJfQoJfQoJZm9yIF8sIHN0IDo9IHJhbmdlIHR3IHsKCQlkdXIgOj0gcm5kLmZsb2F0SW4oNSwgMTIpCgkJYi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iTWAgKyBuMShzdC54KSArICIgIiArIG4xKHN0LnkpICsgYGguMDEiIHN0cm9rZS13aWR0aD0iLjkiIG9wYWNpdHk9Ii40IiBjbGFzcz0iZ3QtdHciIHN0eWxlPSItLWQ6YCArIGZudW0xKGR1cikgKyBgczstLWRsOi1gICsgZm51bTEocm5kLmZsb2F0SW4oMCwgZHVyKSkgKyBgcyIvPmApCgl9CgliLldyaXRlU3RyaW5nKGA8L2c+YCkKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsIHN0cmluZykgc3RyaW5nIHsKCXIsIGcsIGIgOj0gaGV4VG9SR0IoYmFzZSkKCWx1bSA6PSAoMC4yMTI2KmZsb2F0NjQocikgKyAwLjcxNTIqZmxvYXQ2NChnKSArIDAuMDcyMipmbG9hdDY0KGIpKSAvIDI1NQoJc2hhZG93IDo9ICIjNGE0MDM4IgoJaWYgbHVtIDwgMC40IHsKCQlzaGFkb3cgPSAiIzAwMDAwMCIKCX0KCWhpIDo9IGJhc2UKCXNjLCBzcywgc3cgOj0gIi42IiwgIi4zMiIsICIuMTYiCgltbyA6PSAiLjMiCglpZiBsdW0gPCAwLjQgewoJCW1vID0gIi4yMiIKCQloaSA9IG1peEhleChiYXNlLCAiI2M5ZDJkOCIsIDAuMjgpCgkJc2MsIHNzLCBzdyA9ICIuMzQiLCAiLjE2IiwgIi4wNyIKCX0KCXJldHVybiBgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCIgY3g9Ii40IiBjeT0iLjM2IiByPSIuNyIgZng9Ii4zNCIgZnk9Ii4yOCI+YCArCgkJYDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iYCArIGhpICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii40IiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC4xMykgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjc2IiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC4zNikgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjkzIiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC41KSArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC4zKSArIGAiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgbyIgY3g9Ii40NSIgY3k9Ii40NCIgcj0iLjYyIj5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuMyIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjYyIiBzdG9wLWNvbG9yPSIjZmZiM2NmIiBzdG9wLW9wYWNpdHk9Ii4yIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjg4IiBzdG9wLWNvbG9yPSIjYjNmZmQ2IiBzdG9wLW9wYWNpdHk9Ii4yIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2MzZDNmZiIgc3RvcC1vcGFjaXR5PSIuMTIiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgcyIgY3g9Ii4zNiIgY3k9Ii4zIiByPSIuNCI+YCArCgkJYDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSJgICsgc2MgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjM1IiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9ImAgKyBzcyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuNyIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIuMDYiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgbSIgY3g9Ii40MiIgY3k9Ii4zNiIgcj0iLjY4Ij5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuNzgiIHN0b3AtY29sb3I9ImAgKyBtZXRhbCArIGAiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii45MyIgc3RvcC1jb2xvcj0iYCArIG1ldGFsICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgbW8gKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iYCArIG1ldGFsICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+PC9yYWRpYWxHcmFkaWVudD5gICsKCQlgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYHciIGN4PSIuNjYiIGN5PSIuNzMiIHI9Ii4yIj5gICsKCQlgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9ImAgKyBzdyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz48L3JhZGlhbEdyYWRpZW50PmAKfQoKZnVuYyBwZWFybExheWVycyhzaGFwZSwgZ2lkLCBiZXR3ZWVuIHN0cmluZykgc3RyaW5nIHsKCWkgOj0gc3RyaW5ncy5JbmRleChzaGFwZSwgYCBmaWxsPSJgKQoJaWYgaSA8IDAgewoJCXJldHVybiBzaGFwZQoJfQoJY3AgOj0gZnVuYyhzdWZmaXggc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gc2hhcGVbOmldICsgYCBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBzdWZmaXggKyBgKSIvPmAgfQoJcmV0dXJuIHNoYXBlICsgY3AoIm8iKSArIGNwKCJtIikgKyBiZXR3ZWVuICsgY3AoInciKSArIGNwKCJzIikKfQoKZnVuYyBwZWFybFN3ZWVwQ29sb3JJbnRlbnNpdHkoYmFzZSBzdHJpbmcpIGZsb2F0NjQgewoJciwgZywgYiA6PSBoZXhUb1JHQihiYXNlKQoJbHVtIDo9IDAuMjEyNipmbG9hdDY0KHIpLzI1NSArIDAuNzE1MipmbG9hdDY0KGcpLzI1NSArIDAuMDcyMipmbG9hdDY0KGIpLzI1NQoJaWYgbHVtIDwgMC40IHsKCQlyZXR1cm4gMC41NQoJfQoJcmV0dXJuIDIuMAp9CgpmdW5jIHBlYXJsU3dlZXBHcmFkaWVudChnaWQsIGJhc2Ugc3RyaW5nKSBzdHJpbmcgewoJbXVsdCA6PSBwZWFybFN3ZWVwQ29sb3JJbnRlbnNpdHkoYmFzZSkKCW8xLCBvMiwgbzMgOj0gZm51bSgwLjMqbXVsdCksIGZudW0oMC4zNSptdWx0KSwgZm51bSgwLjMqbXVsdCkKCXJldHVybiBgPGxpbmVhckdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxOCUiIHN0b3AtY29sb3I9IiNmZmQyZTYiIHN0b3Atb3BhY2l0eT0iYCArIG8xICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjM4JSIgc3RvcC1jb2xvcj0iI2NmZThmZiIgc3RvcC1vcGFjaXR5PSJgICsgbzIgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iNTglIiBzdG9wLWNvbG9yPSIjZDRmZmU0IiBzdG9wLW9wYWNpdHk9ImAgKyBvMyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSI4MCUiIHN0b3AtY29sb3I9IiNmZmYwYzIiIHN0b3Atb3BhY2l0eT0iYCArIG8zICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCWA8L2xpbmVhckdyYWRpZW50PmAKfQoKZnVuYyBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBzaGFwZUdlb20gc3RyaW5nLCB3LCBoIGZsb2F0NjQpIHN0cmluZyB7CglybmQgOj0gbmV3UFJORyhzYWx0ICsgIi1zd2VlcCIpCgljb25zdCBwYXNzZXMgPSAzCgl0b3RhbCA6PSAxNS4wICsgcm5kLmZsb2F0SW4oMCwgOSkKCglkdXJzIDo9IG1ha2UoW11mbG9hdDY0LCBwYXNzZXMpCglzdW1EdXIgOj0gMC4wCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCWR1cnNbaV0gPSAyLjQgKyBybmQuZmxvYXRJbigwLCAyLjIpCgkJc3VtRHVyICs9IGR1cnNbaV0KCX0KCWdhcFRvdGFsIDo9IHRvdGFsIC0gc3VtRHVyCglpZiBnYXBUb3RhbCA8IGZsb2F0NjQocGFzc2VzKSowLjUgewoJCWdhcFRvdGFsID0gZmxvYXQ2NChwYXNzZXMpICogMC41Cgl9Cgl3ZWlnaHRzIDo9IG1ha2UoW11mbG9hdDY0LCBwYXNzZXMpCglzdW1XIDo9IDAuMAoJZm9yIGkgOj0gMDsgaSA8IHBhc3NlczsgaSsrIHsKCQl3ZWlnaHRzW2ldID0gMC40ICsgcm5kLmZsb2F0SW4oMCwgMSkKCQlzdW1XICs9IHdlaWdodHNbaV0KCX0KCWdhcHMgOj0gbWFrZShbXWZsb2F0NjQsIHBhc3NlcykKCWZvciBpIDo9IDA7IGkgPCBwYXNzZXM7IGkrKyB7CgkJZ2Fwc1tpXSA9IHdlaWdodHNbaV0gLyBzdW1XICogZ2FwVG90YWwKCX0KCXN0YXJ0cyA6PSBtYWtlKFtdZmxvYXQ2NCwgcGFzc2VzKQoJdCA6PSBnYXBzWzBdCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCXN0YXJ0c1tpXSA9IHQKCQl0ICs9IGR1cnNbaV0KCQlpZiBpIDwgcGFzc2VzLTEgewoJCQl0ICs9IGdhcHNbaSsxXQoJCX0KCX0KCgl0cmF2ZWwgOj0gdyAqIDEuMDUKCWNsaXBJRCA6PSAiY2xwIiArIHNhbHQKCWdyYWRJRCA6PSAic3dwIiArIHNhbHQKCW9mZiwgb24xLCBvbjIsIG91dCA6PSBmbnVtKC10cmF2ZWwpLCBmbnVtKC10cmF2ZWwqMC41KSwgZm51bSh0cmF2ZWwqMC41KSwgZm51bSh0cmF2ZWwpCgoJdmFyIGRlZnMgc3RyaW5ncy5CdWlsZGVyCglkZWZzLldyaXRlU3RyaW5nKGA8ZGVmcz48Y2xpcFBhdGggaWQ9ImAgKyBjbGlwSUQgKyBgIj5gICsgc2hhcGVHZW9tICsgYDwvY2xpcFBhdGg+YCkKCWRlZnMuV3JpdGVTdHJpbmcocGVhcmxTd2VlcEdyYWRpZW50KGdyYWRJRCwgYmFzZSkpCgoJdmFyIG1hcmtzIHN0cmluZ3MuQnVpbGRlcgoJbWFya3MuV3JpdGVTdHJpbmcoYDxnIGNsaXAtcGF0aD0idXJsKCNgICsgY2xpcElEICsgYCkiPmApCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCWFuZ2xlIDo9IGZudW0ocm5kLmZsb2F0SW4oMCwgMzYwKSkKCQlzdGFydFBjdCA6PSBzdGFydHNbaV0gLyB0b3RhbCAqIDEwMAoJCWR1clBjdCA6PSBkdXJzW2ldIC8gdG90YWwgKiAxMDAKCQlyYW1wUGN0IDo9IGR1clBjdCAqIDAuMzIKCQlpZiByYW1wUGN0ID4gNiB7CgkJCXJhbXBQY3QgPSA2CgkJfQoJCXAwLCBwMSwgcDIsIHAzIDo9IHN0YXJ0UGN0LCBzdGFydFBjdCtyYW1wUGN0LCBzdGFydFBjdCtkdXJQY3QtcmFtcFBjdCwgc3RhcnRQY3QrZHVyUGN0CgkJa2YgOj0gInN3cCIgKyBzYWx0ICsgIl8iICsgdWZtdC5TcHJpbnRmKCIlZCIsIGkpCgoJCWNsb3NpbmcgOj0gIiIKCQlpZiBwMyA8IDk5Ljk5OSB7CgkJCWNsb3NpbmcgPSBgMTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlKGAgKyBvZmYgKyBgcHgsMCk7b3BhY2l0eTowfWAKCQl9CgkJZGVmcy5Xcml0ZVN0cmluZyhgPHN0eWxlPkBrZXlmcmFtZXMgYCArIGtmICsgYHtgICsKCQkJYDAle3RyYW5zZm9ybTp0cmFuc2xhdGUoYCArIG9mZiArIGBweCwwKTtvcGFjaXR5OjB9YCArCgkJCWZudW0ocDApICsgYCV7dHJhbnNmb3JtOnRyYW5zbGF0ZShgICsgb2ZmICsgYHB4LDApO29wYWNpdHk6MH1gICsKCQkJZm51bShwMSkgKyBgJXt0cmFuc2Zvcm06dHJhbnNsYXRlKGAgKyBvbjEgKyBgcHgsMCk7b3BhY2l0eToxfWAgKwoJCQlmbnVtKHAyKSArIGAle3RyYW5zZm9ybTp0cmFuc2xhdGUoYCArIG9uMiArIGBweCwwKTtvcGFjaXR5OjF9YCArCgkJCWZudW0ocDMpICsgYCV7dHJhbnNmb3JtOnRyYW5zbGF0ZShgICsgb3V0ICsgYHB4LDApO29wYWNpdHk6MH1gICsKCQkJY2xvc2luZyArCgkJCWB9PC9zdHlsZT5gKQoKCQltYXJrcy5Xcml0ZVN0cmluZyhgPGcgdHJhbnNmb3JtPSJyb3RhdGUoYCArIGFuZ2xlICsgYCBgICsgZm51bShzdWJqWCkgKyBgIGAgKyBmbnVtKHN1YmpZKSArIGApIj5gICsKCQkJYDxyZWN0IHg9ImAgKyBmbnVtKHN1YmpYLXcqMS4zKSArIGAiIHk9ImAgKyBmbnVtKHN1YmpZLWgqMC45NSkgKyBgIiB3aWR0aD0iYCArIGZudW0odyoyLjYpICsgYCIgaGVpZ2h0PSJgICsgZm51bShoKjEuOSkgKyBgIiBmaWxsPSJ1cmwoI2AgKyBncmFkSUQgKyBgKSIgb3BhY2l0eT0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOnNjcmVlbjthbmltYXRpb246YCArIGtmICsgYCBgICsgZm51bSh0b3RhbCkgKyBgcyBsaW5lYXIgaW5maW5pdGUiLz5gICsKCQkJYDwvZz5gKQoJfQoJbWFya3MuV3JpdGVTdHJpbmcoYDwvZz5gKQoJZGVmcy5Xcml0ZVN0cmluZyhgPC9kZWZzPmApCglyZXR1cm4gZGVmcy5TdHJpbmcoKSArIG1hcmtzLlN0cmluZygpCn0KCmZ1bmMgcGVhcmxSb3VuZChiYXNlLCBtZXRhbCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7CglnaWQgOj0gInBybCIgKyBzYWx0CglyIDo9IDI0LjAgKiBzdG9uZVNjYWxlCglib2R5IDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBgKSIvPmAKCWNsaXBHZW9tIDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHIqMiwgcioyKQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgIiIpICsgc3dlZXAKfQoKZnVuYyBwZWFybE92YWwoYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJcngsIHJ5IDo9IDE4LjAqc3RvbmVTY2FsZSwgMjUuMCpzdG9uZVNjYWxlCglib2R5IDo9IGA8ZWxsaXBzZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHJ4PSJgICsgZm51bShyeCkgKyBgIiByeT0iYCArIGZudW0ocnkpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPGVsbGlwc2UgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByeD0iYCArIGZudW0ocngpICsgYCIgcnk9ImAgKyBmbnVtKHJ5KSArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgcngqMiwgcnkqMikKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxCdXR0b24oYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJcngsIHJ5IDo9IDI1LjAqc3RvbmVTY2FsZSwgMTguMCpzdG9uZVNjYWxlCglib2R5IDo9IGA8ZWxsaXBzZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHJ4PSJgICsgZm51bShyeCkgKyBgIiByeT0iYCArIGZudW0ocnkpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPGVsbGlwc2UgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByeD0iYCArIGZudW0ocngpICsgYCIgcnk9ImAgKyBmbnVtKHJ5KSArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgcngqMiwgcnkqMikKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxEcm9wKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXcsIGggOj0gMzIuMCpzdG9uZVNjYWxlLCA0Mi4wKnN0b25lU2NhbGUKCXBhdGggOj0gYE0gYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWS1oKjAuNTUpICsKCQlgIEMgYCArIGZudW0oc3VialgrdyowLjU1KSArIGAgYCArIGZudW0oc3VialktaCowLjE1KSArIGAgYCArIGZudW0oc3VialgrdyowLjQyKSArIGAgYCArIGZudW0oc3VialkraCowLjQyKSArIGAgYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWStoKjAuNDgpICsKCQlgIEMgYCArIGZudW0oc3VialgtdyowLjQyKSArIGAgYCArIGZudW0oc3VialkraCowLjQyKSArIGAgYCArIGZudW0oc3VialgtdyowLjU1KSArIGAgYCArIGZudW0oc3VialktaCowLjE1KSArIGAgYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWS1oKjAuNTUpICsgYCBaYAoJYm9keSA6PSBgPHBhdGggZD0iYCArIHBhdGggKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBgKSIvPmAKCWNsaXBHZW9tIDo9IGA8cGF0aCBkPSJgICsgcGF0aCArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgdyoxLjYsIGgqMC45KQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgIiIpICsgc3dlZXAKfQoKZnVuYyBwZWFybEJhcm9xdWVPdXRsaW5lKHNlZWQgc3RyaW5nKSBbXXB0IHsKCXJuZCA6PSBuZXdQUk5HKHNlZWQpCgluIDo9IDEwCglwdHMgOj0gbWFrZShbXXB0LCBuKQoJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJYSA6PSAyICogbWF0aC5QaSAqIGZsb2F0NjQoaykgLyBmbG9hdDY0KG4pCgkJcnIgOj0gMjEuMCAqIHN0b25lU2NhbGUgKiAoMC43NSArIDAuNCpybmQuZmxvYXRJbigwLCAxKSkKCQlwdHNba10gPSBwdHtzdWJqWCArIHJyKm1hdGguQ29zKGEpKjEuMSwgc3VialkgKyByciptYXRoLlNpbihhKSowLjl9Cgl9CglyZXR1cm4gcHRzCn0KCmZ1bmMgcGVhcmxCYXJvcXVlU21vb3RoUGF0aChwdHMgW11wdCkgc3RyaW5nIHsKCW4gOj0gbGVuKHB0cykKCW1pZCA6PSBmdW5jKGEsIGIgcHQpIHB0IHsgcmV0dXJuIHB0eyhhLnggKyBiLngpIC8gMiwgKGEueSArIGIueSkgLyAyfSB9CglzdGFydCA6PSBtaWQocHRzW24tMV0sIHB0c1swXSkKCXBhdGggOj0gIk0gIiArIGZudW0oc3RhcnQueCkgKyAiICIgKyBmbnVtKHN0YXJ0LnkpCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQluZXh0IDo9IHB0c1soaysxKSVuXQoJCW0gOj0gbWlkKHB0c1trXSwgbmV4dCkKCQlwYXRoICs9ICIgUSAiICsgZm51bShwdHNba10ueCkgKyAiICIgKyBmbnVtKHB0c1trXS55KSArICIgIiArIGZudW0obS54KSArICIgIiArIGZudW0obS55KQoJfQoJcmV0dXJuIHBhdGggKyAiIFoiCn0KCmZ1bmMgcGVhcmxCYXJvcXVlKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXBhdGhEIDo9IHBlYXJsQmFyb3F1ZVNtb290aFBhdGgocGVhcmxCYXJvcXVlT3V0bGluZSgiYmFyb3F1ZSIgKyBzYWx0KSkKCWJvZHkgOj0gYDxwYXRoIGQ9ImAgKyBwYXRoRCArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIi8+YAoJY2xpcEdlb20gOj0gYDxwYXRoIGQ9ImAgKyBwYXRoRCArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgNDAqc3RvbmVTY2FsZSwgMzAqc3RvbmVTY2FsZSkKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxDaXJjbGVkKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXIgOj0gMjQuMCAqIHN0b25lU2NhbGUKCWJvZHkgOj0gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShyKSArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIi8+YAoJcmluZ1RvbmUgOj0gbWl4SGV4KGJhc2UsICIjMDAwMDAwIiwgMC4xMikKCXJpbmdzIDo9ICIiCglmb3IgXywgZiA6PSByYW5nZSBbXWZsb2F0NjR7MC40MiwgMC41OCwgMC43NCwgMC45fSB7CgkJcmluZ3MgKz0gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShyKmYpICsgYCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJgICsgcmluZ1RvbmUgKyBgIiBzdHJva2Utd2lkdGg9IjAuOSIgb3BhY2l0eT0iMC4zNSIvPmAKCX0KCWNsaXBHZW9tIDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHIqMiwgcioyKQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgcmluZ3MpICsgc3dlZXAKfQoKdmFyIFBlYXJsU2hhcGVOYW1lcyA9IFtdc3RyaW5neyJSb3VuZCIsICJPdmFsIiwgIkJ1dHRvbiIsICJEcm9wIiwgIkJhcm9xdWUiLCAiQ2lyY2xlZCJ9CgpmdW5jIHJlbmRlclBlYXJsU2hhcGUoc2hhcGVJZHggaW50LCBiYXNlLCBtZXRhbCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSAwOgoJCXJldHVybiBwZWFybFJvdW5kKGJhc2UsIG1ldGFsLCBzYWx0KQoJY2FzZSAxOgoJCXJldHVybiBwZWFybE92YWwoYmFzZSwgbWV0YWwsIHNhbHQpCgljYXNlIDI6CgkJcmV0dXJuIHBlYXJsQnV0dG9uKGJhc2UsIG1ldGFsLCBzYWx0KQoJY2FzZSAzOgoJCXJldHVybiBwZWFybERyb3AoYmFzZSwgbWV0YWwsIHNhbHQpCgljYXNlIDQ6CgkJcmV0dXJuIHBlYXJsQmFyb3F1ZShiYXNlLCBtZXRhbCwgc2FsdCkKCWRlZmF1bHQ6CgkJcmV0dXJuIHBlYXJsQ2lyY2xlZChiYXNlLCBtZXRhbCwgc2FsdCkKCX0KfQoKZnVuYyByZW5kZXJSaW5nKG1ldGFsSGksIG1ldGFsTG8sIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJyaW5nIiArIHNhbHQKCWJyaWdodCA6PSBsaWdodGVuKG1ldGFsSGksIDAuNDUpCglkZWVwIDo9IG1peEhleChtZXRhbExvLCAiIzAwMDAwMCIsIDAuNDUpCglzdCA6PSBmdW5jKG9mZiwgYyBzdHJpbmcpIHN0cmluZyB7IHJldHVybiBgPHN0b3Agb2Zmc2V0PSJgICsgb2ZmICsgYCIgc3RvcC1jb2xvcj0iYCArIGMgKyBgIi8+YCB9CglkZWZzIDo9IGA8bGluZWFyR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgIiB4Mj0iMSIgeTI9IjEiPmAgKwoJCXN0KCIwIiwgYnJpZ2h0KSArIHN0KCIuMTIiLCBtZXRhbEhpKSArIHN0KCIuMjYiLCBkZWVwKSArIHN0KCIuNCIsIG1ldGFsTG8pICsgc3QoIi41MiIsIGJyaWdodCkgKwoJCXN0KCIuNjQiLCBtZXRhbEhpKSArIHN0KCIuNzgiLCBkZWVwKSArIHN0KCIuOSIsIG1ldGFsTG8pICsgc3QoIjEiLCBicmlnaHQpICsgYDwvbGluZWFyR3JhZGllbnQ+YAoKCW91dGVyIDo9IGA8ZyBmaWxsPSJub25lIiB0cmFuc2Zvcm09InRyYW5zbGF0ZShgICsgY251bShzdWJqWCkgKyBgIGAgKyBjbnVtKHN1YmpZKSArIGApIj5gICsKCQlgPGNpcmNsZSByPSI1Mi42IiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS42IiBvcGFjaXR5PSIuNDUiLz5gICsKCQlgPGNpcmNsZSByPSI1MCIgc3Ryb2tlPSJ1cmwoI2AgKyBnaWQgKyBgKSIgc3Ryb2tlLXdpZHRoPSI0LjQiLz5gICsKCQlgPGNpcmNsZSByPSI1Mi4zIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNyIgb3BhY2l0eT0iLjgiLz5gICsKCQlgPGNpcmNsZSByPSI0Ny43IiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNiIgb3BhY2l0eT0iLjciLz5gICsKCQlgPGNpcmNsZSByPSI0OC41IiBzdHJva2U9ImAgKyBsaWdodGVuKG1ldGFsSGksIDAuMzUpICsgYCIgc3Ryb2tlLXdpZHRoPSIuNSIgb3BhY2l0eT0iLjQ1Ii8+PC9nPmAKCgljb25zdCByT3V0ID0gNDYuMAoJY29uc3QgY29yZUhhbGYgPSAwLjYKCWNvbnN0IG91dHdhcmRCbG9vbSA9IDAuOQoJZ2xvd1IgOj0gck91dCArIG91dHdhcmRCbG9vbSArIDMKCXBjdCA6PSBmdW5jKHYgZmxvYXQ2NCkgZmxvYXQ2NCB7CgkJcCA6PSB2IC8gZ2xvd1IgKiAxMDAKCQlpZiBwIDwgMCB7CgkJCXAgPSAwCgkJfQoJCWlmIHAgPiAxMDAgewoJCQlwID0gMTAwCgkJfQoJCXJldHVybiBwCgl9Cgljb3JlQ29sb3IgOj0gbGlnaHRlbihtZXRhbEhpLCAwLjI1KQoJZG9udXRTdG9wcyA6PSBmdW5jKGlud2FyZEJsb29tLCBwZWFrT3AgZmxvYXQ2NCwgZ2lkIHN0cmluZykgc3RyaW5nIHsKCQlibG9vbU9wIDo9IHBlYWtPcCAqIDAuMzUKCQltaWRPcCA6PSBwZWFrT3AgKiAwLjcKCQlyZXR1cm4gYDxyYWRpYWxHcmFkaWVudCBpZD0iYCArIGdpZCArIGAiIGN4PSI1MCUiIGN5PSI1MCUiIHI9IjUwJSI+YCArCgkJCWA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSJgICsgbWV0YWxIaSArIGAiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0LWlud2FyZEJsb29tLTEuNSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQtaW53YXJkQmxvb20pKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgbWV0YWxIaSArIGAiIHN0b3Atb3BhY2l0eT0iYCArIGZudW0oYmxvb21PcCkgKyBgIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQtY29yZUhhbGYpKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgY29yZUNvbG9yICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShtaWRPcCkgKyBgIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQpKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgY29yZUNvbG9yICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShwZWFrT3ApICsgYCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0K2NvcmVIYWxmKSkgKyBgJSIgc3RvcC1jb2xvcj0iYCArIGNvcmVDb2xvciArIGAiIHN0b3Atb3BhY2l0eT0iYCArIGZudW0obWlkT3ApICsgYCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0K291dHdhcmRCbG9vbSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShibG9vbU9wKSArIGAiLz5gICsKCQkJYDxzdG9wIG9mZnNldD0iYCArIHBjdG51bShwY3Qock91dCtvdXR3YXJkQmxvb20rMSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+PC9yYWRpYWxHcmFkaWVudD5gCgl9CgoJcm5kIDo9IG5ld1BSTkcoImVuZXJneSIgKyBzYWx0KQoJZ2lkQSwgZ2lkQiA6PSAiZ2xvd0EiK3NhbHQsICJnbG93QiIrc2FsdAoJZHVyIDo9IHJuZC5mbG9hdEluKDIuMTMsIDMuMikKCXBoYXNlIDo9IHJuZC5mbG9hdEluKDAsIGR1cikKCglzdG9wc0EgOj0gZG9udXRTdG9wcygyLjUqMi4wLzMuMCowLjUsIDAuNCwgZ2lkQSkKCXN0b3BzQiA6PSBkb251dFN0b3BzKDguMCoyLjAvMy4wKjAuNSwgMC42LCBnaWRCKQoKCWVuZXJneSA6PSBgPGRlZnM+YCArIHN0b3BzQSArIHN0b3BzQiArIGA8L2RlZnM+YCArCgkJYDxnPmAgKwoJCWA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0oZ2xvd1IpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkQSArIGApIi8+YCArCgkJYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShnbG93UikgKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWRCICsgYCkiIG9wYWNpdHk9IjAiIGNsYXNzPSJndC1nbG93IiBzdHlsZT0iLS1nbG93LWR1cjpgICsgZm51bShkdXIpICsgYHM7LS1nbG93LWRlbGF5Oi1gICsgZm51bShwaGFzZSkgKyBgcyIvPmAgKwoJCWA8L2c+YAoKCXJldHVybiBgPGRlZnM+YCArIGRlZnMgKyBgPC9kZWZzPmAgKyBvdXRlciArIGVuZXJneQp9Cgpjb25zdCAoCgltb3Rpb25WRHVyLCBtb3Rpb25IRHVyLCBtb3Rpb25SRHVyLCBtb3Rpb25TRHVyID0gMy40LCA0LjY2LCA1LjgxLCA2LjU2Cgltb3Rpb25Sb3RNaW4sIG1vdGlvblJvdE1heCAgICAgICAgICAgICAgICAgICAgID0gNC4wLCA4LjAKCW1vdGlvblNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLjA5CikKCmZ1bmMgbW90aW9uUGhhc2VzKHNhbHQgc3RyaW5nKSAodnBoYXNlLCBocGhhc2UsIHJwaGFzZSwgc3BoYXNlLCByb3REZWcgZmxvYXQ2NCkgewoJcm5kIDo9IG5ld1BSTkcoIm1vdGlvbiIgKyBzYWx0KQoJdnBoYXNlID0gcm5kLmZsb2F0SW4oMCwgbW90aW9uVkR1cikKCWhwaGFzZSA9IHJuZC5mbG9hdEluKDAsIG1vdGlvbkhEdXIpCglycGhhc2UgPSBybmQuZmxvYXRJbigwLCBtb3Rpb25SRHVyKQoJc3BoYXNlID0gcm5kLmZsb2F0SW4oMCwgbW90aW9uU0R1cikKCXJvdERlZyA9IHJuZC5mbG9hdEluKG1vdGlvblJvdE1pbiwgbW90aW9uUm90TWF4KQoJcmV0dXJuCn0KCmZ1bmMgYXBwbHlNb3Rpb24oY29udGVudCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7Cgl2cGhhc2UsIGhwaGFzZSwgcnBoYXNlLCBzcGhhc2UsIHJvdERlZyA6PSBtb3Rpb25QaGFzZXMoc2FsdCkKCglyZXR1cm4gYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKGAgKyBmbnVtKHN1YmpYKSArIGAgYCArIGZudW0oc3VialkpICsgYCkiPmAgKwoJCWA8ZyBjbGFzcz0iZ3QtdiIgc3R5bGU9Ii0tdi1kdXI6YCArIGZudW0obW90aW9uVkR1cikgKyBgczstLXYtZGVsYXk6LWAgKyBmbnVtKHZwaGFzZSkgKyBgcyI+YCArCgkJYDxnIGNsYXNzPSJndC1oIiBzdHlsZT0iLS1oLWR1cjpgICsgZm51bShtb3Rpb25IRHVyKSArIGBzOy0taC1kZWxheTotYCArIGZudW0oaHBoYXNlKSArIGBzIj5gICsKCQlgPGcgY2xhc3M9Imd0LXIiIHN0eWxlPSItLXItZHVyOmAgKyBmbnVtKG1vdGlvblJEdXIpICsgYHM7LS1yLWRlbGF5Oi1gICsgZm51bShycGhhc2UpICsgYHM7LS1yb3QtZGVnOmAgKyBmbnVtKHJvdERlZykgKyBgZGVnIj5gICsKCQlgPGcgY2xhc3M9Imd0LXMiIHN0eWxlPSItLXMtZHVyOmAgKyBmbnVtKG1vdGlvblNEdXIpICsgYHM7LS1zLWRlbGF5Oi1gICsgZm51bShzcGhhc2UpICsgYHMiPmAgKwoJCWA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtYCArIGZudW0oc3VialgpICsgYCAtYCArIGZudW0oc3VialkpICsgYCkiPmAgKwoJCWNvbnRlbnQgKyBgPC9nPjwvZz48L2c+PC9nPjwvZz48L2c+YAp9Cgpjb25zdCBkb3RYLCBkb3RZID0gc3VialggKyA1MCwgc3VialkgKyA0MgoKZnVuYyByZW5kZXJTdGF0dXNCYWRnZShhY3RpdmUgYm9vbCkgc3RyaW5nIHsKCWlmIGFjdGl2ZSB7CgkJcmV0dXJuIGA8Y2lyY2xlIGN4PSJgICsgZm51bShkb3RYKSArIGAiIGN5PSJgICsgZm51bShkb3RZKSArIGAiIHI9IjQiIGZpbGw9IiM3ZmQ4OGYiLz5gICsKCQkJYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKGAgKyBmbnVtKGRvdFgpICsgYCBgICsgZm51bShkb3RZKSArIGApIj48Y2lyY2xlIHI9IjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzdmZDg4ZiIgc3Ryb2tlLXdpZHRoPSIxLjIiIGNsYXNzPSJndC1iYWRnZS1wdWxzZSIgb3BhY2l0eT0iMC44Ii8+PC9nPmAKCX0KCXJldHVybiBgPGNpcmNsZSBjeD0iYCArIGZudW0oZG90WCkgKyBgIiBjeT0iYCArIGZudW0oZG90WSkgKyBgIiByPSI0IiBmaWxsPSIjNWE1ZjZiIi8+YAp9Cgp0eXBlIGZhY2V0U3BhbiBzdHJ1Y3QgewoJc3RhcnQsIGVuZCBpbnQKCXJpbmdNZW1iZXIgYm9vbAp9CgpmdW5jIHNjYW5GYWNldFNwYW5zKG1hcmt1cCBzdHJpbmcpIFtdZmFjZXRTcGFuIHsKCXZhciBzcGFucyBbXWZhY2V0U3BhbgoJaSA6PSAwCglmb3IgewoJCXJlbCA6PSBzdHJpbmdzLkluZGV4KG1hcmt1cFtpOl0sICI8IikKCQlpZiByZWwgPCAwIHsKCQkJYnJlYWsKCQl9CgkJc3RhcnQgOj0gaSArIHJlbAoJCXJlbEVuZCA6PSBzdHJpbmdzLkluZGV4KG1hcmt1cFtzdGFydDpdLCAiLz4iKQoJCWlmIHJlbEVuZCA8IDAgewoJCQlicmVhawoJCX0KCQllbmQgOj0gc3RhcnQgKyByZWxFbmQgKyAyCgkJdGFnIDo9IG1hcmt1cFtzdGFydDplbmRdCgkJaSA9IGVuZAoJCWlzRmFjZXRUYWcgOj0gc3RyaW5ncy5IYXNQcmVmaXgodGFnLCAiPHBhdGgiKSB8fCBzdHJpbmdzLkhhc1ByZWZpeCh0YWcsICI8Y2lyY2xlIikgfHwgc3RyaW5ncy5IYXNQcmVmaXgodGFnLCAiPHBvbHlnb24iKQoJCWlmICFpc0ZhY2V0VGFnIHsKCQkJY29udGludWUKCQl9CgkJc3BhbnMgPSBhcHBlbmQoc3BhbnMsIGZhY2V0U3BhbntzdGFydDogc3RhcnQsIGVuZDogZW5kLCByaW5nTWVtYmVyOiBzdHJpbmdzLkNvbnRhaW5zKHRhZywgYGNsYXNzPSJmImApfSkKCX0KCXJldHVybiBzcGFucwp9Cgpjb25zdCAoCglmaXJlU3dlZXBBeGlzID0gLTM1LjAgKiBtYXRoLlBpIC8gMTgwCglmaXJlU3dlZXBTcGFuID0gMS42IC8vIHNlY29uZHMgYSBzd2VlcCB0YWtlcyB0byBjcm9zcyB0aGUgc3RvbmUKKQoKZnVuYyBhcHBseUNhc2NhZGUobWFya3VwLCB0aWRTdHIgc3RyaW5nLCBmcyAqZmFjZXRTdHlsZSkgKG92ZXJsYXkgc3RyaW5nLCBjc3Mgc3RyaW5nKSB7CglpZiBmcyA9PSBuaWwgfHwgbGVuKGZzLnJpbmdDZW50KSA9PSAwIHsKCQlyZXR1cm4gIiIsICIiCgl9CglzcGFucyA6PSBzY2FuRmFjZXRTcGFucyhtYXJrdXApCglybmQgOj0gbmV3UFJORygiZmlyZSIgKyB0aWRTdHIpCglfLCBfLCBycGhhc2UsIF8sIF8gOj0gbW90aW9uUGhhc2VzKHRpZFN0cikKCXBlcmlvZCA6PSAyICogbW90aW9uUkR1cgoJYXhpcyA6PSBmaXJlU3dlZXBBeGlzICsgcm5kLmZsb2F0SW4oLTAuMywgMC4zKQoJZHgsIGR5IDo9IG1hdGguQ29zKGF4aXMpLCBtYXRoLlNpbihheGlzKQoKCWthLCBrYiA6PSAiZmEiK3RpZFN0ciwgImZiIit0aWRTdHIKCXNoYXBlIDo9IGZ1bmMoYXQgZmxvYXQ2NCkgc3RyaW5nIHsKCQlyZXR1cm4gZm51bTEoYXQpICsgYCV7b3BhY2l0eTowfWAgKyBmbnVtMShhdCsyKSArIGAle29wYWNpdHk6dmFyKC0tbyk7ZmlsbDojZmZmfWAgKwoJCQlmbnVtMShhdCs0LjUpICsgYCV7b3BhY2l0eTouNDtmaWxsOnZhcigtLWMpfWAgKyBmbnVtMShhdCs4KSArIGAle29wYWNpdHk6MH1gCgl9CglwZXIgOj0gZm51bShwZXJpb2QpCgljc3MgPSBgLmAgKyBrYSArIGB7YW5pbWF0aW9uOmAgKyBrYSArIGAgYCArIHBlciArIGBzIGxpbmVhciBpbmZpbml0ZX0uYCArIGtiICsgYHthbmltYXRpb246YCArIGtiICsgYCBgICsgcGVyICsgYHMgbGluZWFyIGluZmluaXRlfWAgKwoJCWBAa2V5ZnJhbWVzIGAgKyBrYSArIGB7YCArIHNoYXBlKDEyLjUpICsgYDEwMCV7b3BhY2l0eTowfX1gICsKCQlgQGtleWZyYW1lcyBgICsga2IgKyBge2AgKyBzaGFwZSg2Mi41KSArIGAxMDAle29wYWNpdHk6MH19YAoKCXZhciBvdXQgc3RyaW5ncy5CdWlsZGVyCglyaW5nSWR4IDo9IC0xCglmb3IgXywgc3BhbiA6PSByYW5nZSBzcGFucyB7CgkJaWYgIXNwYW4ucmluZ01lbWJlciB7CgkJCWNvbnRpbnVlCgkJfQoJCXJpbmdJZHgrKwoJCWlmIHJpbmdJZHggPj0gbGVuKGZzLnJpbmdDZW50KSB7CgkJCWJyZWFrCgkJfQoJCWMgOj0gZnMucmluZ0NlbnRbcmluZ0lkeF0KCQljb2xvciwgY29sb3JPcCA6PSBmcy5mbGFzaC5zYW1wbGUoYy54LCBjLnkpCgkJcG9zIDo9ICgoYy54LXN1YmpYKSpkeCArIChjLnktcGllY2VDWSkqZHkpIC8gKDMwICogc3RvbmVTY2FsZSkKCQluYW1lIDo9IGthCgkJaWYgcm5kLmZsb2F0SW4oMCwgMSkgPCAwLjUgewoJCQluYW1lLCBwb3MgPSBrYiwgLXBvcwoJCX0KCQlkZWxheSA6PSBycGhhc2UgLSAwLjI1Km1vdGlvblJEdXIgKyBwZXJpb2QgLSBwb3MqZmlyZVN3ZWVwU3Bhbi8yCgkJdGFnIDo9IG1hcmt1cFtzcGFuLnN0YXJ0OnNwYW4uZW5kXQoJCWdlb21FbmQgOj0gc3RyaW5ncy5JbmRleCh0YWcsIGAiIGZpbGw9YCkKCQlpZiBnZW9tRW5kIDwgMCB7CgkJCWNvbnRpbnVlCgkJfQoJCW91dC5Xcml0ZVN0cmluZyh0YWdbOmdlb21FbmRdICsgYCIgb3BhY2l0eT0iMCIgY2xhc3M9ImAgKyBuYW1lICsgYCIgc3R5bGU9Ii0tbzpgICsgZm51bShtYXRoLlJvdW5kKHJuZC5mbG9hdEluKDAuNTUsIDAuOSkqY29sb3JPcCoxMCkvMTApICsgYDstLWM6YCArIGhleDMoY29sb3IpICsKCQkJYDthbmltYXRpb24tZGVsYXk6LWAgKyBmbnVtMShkZWxheSkgKyBgcyIvPmApCgl9CglyZXR1cm4gb3V0LlN0cmluZygpLCBjc3MKfQoKZnVuYyByZW5kZXJNZXRhbExhYmVsUmVjdChtZXRhbEhpLCBtZXRhbExvIHN0cmluZywgeCwgeSwgdywgaCwgcnggZmxvYXQ2NCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7CglnaWQgOj0gImxnIiArIHNhbHQKCWJyaWdodCA6PSBsaWdodGVuKG1ldGFsSGksIDAuNCkKCWRlZXAgOj0gbWl4SGV4KG1ldGFsTG8sICIjMDAwMDAwIiwgMC41KQoJc3QgOj0gZnVuYyhvZmYsIGMgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gYDxzdG9wIG9mZnNldD0iYCArIG9mZiArIGAiIHN0b3AtY29sb3I9ImAgKyBjICsgYCIvPmAgfQoJZGVmcyA6PSBgPGxpbmVhckdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCI+YCArCgkJc3QoIjAiLCBtZXRhbExvKSArIHN0KCIuMjIiLCBtZXRhbEhpKSArIHN0KCIuNDIiLCBicmlnaHQpICsgc3QoIi42MiIsIG1ldGFsSGkpICsgc3QoIjEiLCBtZXRhbExvKSArIGA8L2xpbmVhckdyYWRpZW50PmAKCXJlY3QgOj0gYDxyZWN0IHg9ImAgKyBjbnVtKHgpICsgYCIgeT0iYCArIGNudW0oeSkgKyBgIiB3aWR0aD0iYCArIGNudW0odykgKyBgIiBoZWlnaHQ9ImAgKyBjbnVtKGgpICsgYCIgcng9ImAgKyBjbnVtKHJ4KSArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuOCIvPmAKCWNvbnN0IGluXyA9IDAuOQoJYXJjIDo9IGAgYWAgKyBjbnVtKHJ4LWluXykgKyBgIGAgKyBjbnVtKHJ4LWluXykgKyBgIDAgMCBgCglkIDo9IGNudW0ocnggLSBpbl8pCgllZGdlcyA6PSBgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj5gICsKCQlgPHBhdGggZD0iTWAgKyBjbnVtKHgraW5fKSArIGAgYCArIGNudW0oeStyeCkgKyBhcmMgKyBgMSBgICsgZCArIGAgLWAgKyBkICsgYEhgICsgY251bSh4K3ctcngpICsgYXJjICsgYDEgYCArIGQgKyBgIGAgKyBkICsgYCIgc3Ryb2tlPSJgICsgbGlnaHRlbihtZXRhbEhpLCAwLjQ1KSArIGAiIHN0cm9rZS13aWR0aD0iLjQ1IiBvcGFjaXR5PSIuNCIvPmAgKwoJCWA8cGF0aCBkPSJNYCArIGNudW0oeCtpbl8pICsgYCBgICsgY251bSh5K2gtcngpICsgYXJjICsgYDAgYCArIGQgKyBgIGAgKyBkICsgYEhgICsgY251bSh4K3ctcngpICsgYXJjICsgYDAgYCArIGQgKyBgIC1gICsgZCArIGAiIHN0cm9rZT0iYCArIGRlZXAgKyBgIiBzdHJva2Utd2lkdGg9Ii41IiBvcGFjaXR5PSIuNSIvPjwvZz5gCglzaWQgOj0gInNoIiArIHNhbHQKCWRlZnMgKz0gYDxnIGlkPSJgICsgc2lkICsgYCI+PGNpcmNsZSBjeD0iLjE1IiBjeT0iLjIiIHI9IjEuNiIgZmlsbD0iYCArIGRlZXAgKyBgIiBvcGFjaXR5PSIuNTUiLz5gICsKCQlgPGNpcmNsZSByPSIxLjMiIGZpbGw9ImAgKyBtaXhIZXgobWV0YWxMbywgbWV0YWxIaSwgMC40KSArIGAiIHN0cm9rZT0iYCArIGRlZXAgKyBgIiBzdHJva2Utd2lkdGg9Ii4yNSIvPmAgKwoJCWA8Y2lyY2xlIGN4PSItLjQiIGN5PSItLjQiIHI9Ii43NSIgZmlsbD0iYCArIGxpZ2h0ZW4obWV0YWxIaSwgMC4zKSArIGAiIG9wYWNpdHk9Ii4zNSIvPjwvZz5gCglzZWVkIDo9IDAKCWZvciBrIDo9IDA7IGsgPCBsZW4oc2FsdCk7IGsrKyB7CgkJc2VlZCArPSBpbnQoc2FsdFtrXSkKCX0KCWhlYWRzLCBzbG90cyA6PSAiIiwgIiIKCW4gOj0gMAoJZm9yIF8sIHB4IDo9IHJhbmdlIFtdZmxvYXQ2NHt4ICsgNC4yLCB4ICsgdyAtIDQuMn0gewoJCWZvciBfLCBweSA6PSByYW5nZSBbXWZsb2F0NjR7eSArIDMuNywgeSArIGggLSAzLjd9IHsKCQkJaGVhZHMgKz0gYDx1c2UgaHJlZj0iI2AgKyBzaWQgKyBgIiB4PSJgICsgY251bShweCkgKyBgIiB5PSJgICsgY251bShweSkgKyBgIi8+YAoJCQlhbmcgOj0gZmxvYXQ2NCgoc2VlZCozNytuKjcxKSUxODApICogbWF0aC5QaSAvIDE4MAoJCQlkeCwgZHkgOj0gMC45Km1hdGguQ29zKGFuZyksIDAuOSptYXRoLlNpbihhbmcpCgkJCXNsb3RzICs9IGBNYCArIGNudW0ocHgtZHgpICsgYCBgICsgY251bShweS1keSkgKyBgbGAgKyBjbnVtKDIqZHgpICsgYCBgICsgY251bSgyKmR5KQoJCQluKysKCQl9Cgl9CglyaXZldHMgOj0gaGVhZHMgKyBgPHBhdGggZD0iYCArIHNsb3RzICsgYCIgc3Ryb2tlPSJgICsgZGVlcCArIGAiIHN0cm9rZS13aWR0aD0iLjQ1IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gCglyZXR1cm4gYDxkZWZzPmAgKyBkZWZzICsgYDwvZGVmcz5gICsgcmVjdCArIGVkZ2VzICsgcml2ZXRzCn0KCmNvbnN0ICgKCXBsYXRlRm9udCAgICA9IGAnRElOIEFsdGVybmF0ZScsQmFobnNjaHJpZnQsJ1JvYm90byBDb25kZW5zZWQnLHNhbnMtc2VyaWZgCglwbGF0ZVNpemUgICAgPSA4LjYKCXBsYXRlU3BhY2luZyA9IDEuMQoJcGxhdGVNYXhXICAgID0gMTAwLjAKKQoKZnVuYyByZW5kZXJQbGF0ZVRleHQobGFiZWwsIGZpbGwsIG1ldGFsSGkgc3RyaW5nKSBzdHJpbmcgewoJZyA6PSBgPGcgZm9udC1zaXplPSJgICsgY251bShwbGF0ZVNpemUpICsgYCIgbGV0dGVyLXNwYWNpbmc9ImAgKyBjbnVtKHBsYXRlU3BhY2luZykgKyBgIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iYCArIHBsYXRlRm9udCArIGAiIGZvbnQtd2VpZ2h0PSI3MDAiYAoJaWYgZXN0IDo9IGZsb2F0NjQobGVuKGxhYmVsKSkqKHBsYXRlU2l6ZSowLjUyK3BsYXRlU3BhY2luZyk7IGVzdCA+IHBsYXRlTWF4VyB7CgkJZyArPSBgIHRleHRMZW5ndGg9ImAgKyBjbnVtKHBsYXRlTWF4VykgKyBgIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmdBbmRHbHlwaHMiYAoJfQoJeCA6PSBjbnVtKHN1YmpYKQoJcmV0dXJuIGcgKyBgPjx0ZXh0IHg9ImAgKyB4ICsgYCIgeT0iMTQ0LjkiIGZpbGw9ImAgKyBsaWdodGVuKG1ldGFsSGksIDAuNSkgKyBgIiBvcGFjaXR5PSIuNDUiPmAgKyBsYWJlbCArIGA8L3RleHQ+YCArCgkJYDx0ZXh0IHg9ImAgKyB4ICsgYCIgeT0iMTQ0LjQiIGZpbGw9ImAgKyBmaWxsICsgYCI+YCArIGxhYmVsICsgYDwvdGV4dD48L2c+YAp9CgpmdW5jIHJlbmRlclNlcmlhbFRleHQodGlkU3RyLCBjb2xvciBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gYDx0ZXh0IHg9ImAgKyBmbnVtKHN1YmpYKSArIGAiIHk9IjE1OS41IiBmb250LXNpemU9IjYuNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iYCArIGNvbG9yICsgYCIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSxtb25vc3BhY2UiIG9wYWNpdHk9IjAuODUiPiNgICsgdGlkU3RyICsgYDwvdGV4dD5gCn0KCnR5cGUgbmFtZWRDb2xvciBzdHJ1Y3R7IGhleCwgbmFtZSBzdHJpbmcgfQoKdmFyIHN0b25lQnlDaGFpbiA9IG1hcFtzdHJpbmddc3RyaW5newoJIlRPUEFaLTEiOiAgICAiVG9wYXoiLAoJIlNBUFBISVJFLTEiOiAiU2FwcGhpcmUiLAoJIlBFQVJMLTEiOiAgICAiUGVhcmwiLAoJIkdOT0xBTkQtMSI6ICJEaWFtb25kIiwKfQoKdmFyIHN0b25lUGFsZXR0ZXMgPSBtYXBbc3RyaW5nXVtdbmFtZWRDb2xvcnsKCSJTYXBwaGlyZSI6IHsKCQl7IiMyYTVmZTAiLCAiQmx1ZSJ9LCB7IiNmZjZlYTQiLCAiUGluayJ9LCB7IiNmZjg1MDEiLCAiT3JhbmdlIn0sIHsiI2ZmZDUwMCIsICJZZWxsb3cifSwKCQl7IiMxYWE4OGEiLCAiR3JlZW4ifSwgeyIjYTY1OGZmIiwgIlZpb2xldCJ9LCB7IiNlNmU5ZjgiLCAiV2hpdGUifSwgeyIjZmY4ZjcyIiwgIlBhZHBhcmFkc2NoYSJ9LAoJfSwKCSJUb3BheiI6IHsKCQl7IiNmNWVkZDEiLCAiQ29sb3JsZXNzIn0sIHsiI2ZmYTMwMCIsICJJbXBlcmlhbCJ9LCB7IiNmZmQxMDAiLCAiR29sZGVuIn0sCgkJeyIjYzk2YTI4IiwgIlNoZXJyeSBCcm93biJ9LCB7IiM4NmNkZjIiLCAiU2t5IEJsdWUifSwgeyIjZmY5NmJhIiwgIlBpbmsifSwKCX0sCgkiUXVhcnR6IjogewoJCXsiI2VlZjJmNyIsICJSb2NrIENyeXN0YWwifSwgeyIjOWI1OWQ2IiwgIkFtZXRoeXN0In0sIHsiI2YyYjAxZSIsICJDaXRyaW5lIn0sCgkJeyIjZjViOWNhIiwgIlJvc2UgUXVhcnR6In0sIHsiIzdkNjI1MCIsICJTbW9reSBRdWFydHoifSwgeyIjYTlkOWEyIiwgIlByYXNpb2xpdGUifSwKCX0sCgkiRGlhbW9uZCI6IHsKCQl7IiNmM2Y2ZmMiLCAiQ29sb3JsZXNzIn0sIHsiI2ZmYzQwMCIsICJGYW5jeSBZZWxsb3cifSwgeyIjZmY0ZjlhIiwgIkZhbmN5IFBpbmsifSwKCQl7IiMxZjhmZmYiLCAiRmFuY3kgQmx1ZSJ9LCB7IiMxNGM0NmUiLCAiRmFuY3kgR3JlZW4ifSwgeyIjZDlhNTYwIiwgIkNoYW1wYWduZSJ9LAoJCXsiI2I0NTYxYSIsICJDb2duYWMifSwgeyIjMmIyZDM0IiwgIkJsYWNrIn0sCgkJeyIjZTAyNDNhIiwgIlJlZCJ9LCB7IiNmZjdhMWEiLCAiT3JhbmdlIn0sIHsiIzliNGZkNiIsICJQdXJwbGUifSwKCX0sCgkiUGVhcmwiOiB7CgkJeyIjZjhmNmYwIiwgIldoaXRlIn0sIHsiI2YwZTRjOCIsICJDcmVhbSJ9LCB7IiMzYTNhM2MiLCAiQmxhY2sifSwgeyIjYzhjZGQ0IiwgIlNpbHZlciJ9LAoJCXsiI2Q0YWY2YSIsICJHb2xkIn0sIHsiI2YwZDRkYyIsICJQaW5rIn0sIHsiI2YyYzlhOCIsICJQZWFjaCJ9LCB7IiNkOGNiZTAiLCAiTGF2ZW5kZXIifSwKCX0sCn0KCnZhciBjb2xvcldlaWdodHMgPSBtYXBbc3RyaW5nXVtdaW50ewoJIkRpYW1vbmQiOiB7MzAsIDE4LCA1LCA0LCAzLCAxNCwgMTIsIDgsIDEsIDMsIDJ9LAoJIlF1YXJ0eiI6IHsyNSwgMjUsIDE4LCA5LCAxOCwgNX0sCn0KCmNvbnN0IGRlZmF1bHRDb2xvcldlaWdodCA9IDUKCmZ1bmMgY29sb3JXZWlnaHQoc3RvbmUgc3RyaW5nLCBpZHggaW50KSBpbnQgewoJdywgb2sgOj0gY29sb3JXZWlnaHRzW3N0b25lXQoJaWYgIW9rIHsKCQlyZXR1cm4gMQoJfQoJaWYgaWR4IDwgbGVuKHcpIHsKCQlyZXR1cm4gd1tpZHhdCgl9CglyZXR1cm4gZGVmYXVsdENvbG9yV2VpZ2h0Cn0KCmZ1bmMgUGlja0NvbG9ySW5kZXgoc3RvbmUgc3RyaW5nLCByb2xsIHVpbnQ2NCkgaW50IHsKCW4gOj0gQ29sb3JQYWxldHRlU2l6ZShzdG9uZSkKCXRvdGFsIDo9IDAKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXRvdGFsICs9IGNvbG9yV2VpZ2h0KHN0b25lLCBpKQoJfQoJciA6PSBpbnQocm9sbCAlIHVpbnQ2NCh0b3RhbCkpCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQlyIC09IGNvbG9yV2VpZ2h0KHN0b25lLCBpKQoJCWlmIHIgPCAwIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglyZXR1cm4gbiAtIDEKfQoKZnVuYyBDb2xvclByb2JhYmlsaXR5KHN0b25lIHN0cmluZywgaWR4IGludCkgZmxvYXQ2NCB7CgluIDo9IENvbG9yUGFsZXR0ZVNpemUoc3RvbmUpCgl0b3RhbCA6PSAwCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQl0b3RhbCArPSBjb2xvcldlaWdodChzdG9uZSwgaSkKCX0KCXJldHVybiBmbG9hdDY0KGNvbG9yV2VpZ2h0KHN0b25lLCBpZHgpKSAvIGZsb2F0NjQodG90YWwpCn0KCmZ1bmMgQ29sb3JSYXJpdHlDU1Yoc3RvbmUgc3RyaW5nKSBzdHJpbmcgewoJbiA6PSBDb2xvclBhbGV0dGVTaXplKHN0b25lKQoJdG90YWwgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJdG90YWwgKz0gY29sb3JXZWlnaHQoc3RvbmUsIGkpCgl9CglvdXQgOj0gbWFrZShbXXN0cmluZywgbikKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXBtIDo9IGNvbG9yV2VpZ2h0KHN0b25lLCBpKSAqIDEwMDAgLyB0b3RhbAoJCW91dFtpXSA9IGNvbG9yRm9yU3RvbmUoc3RvbmUsIGkpLm5hbWUgKyAiOiIgKyB1Zm10LlNwcmludGYoIiVkLiVkIiwgcG0vMTAsIHBtJTEwKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihvdXQsICI7IikKfQoKZnVuYyBDaGFpbkFsd2F5c0FjdGl2ZShjaGFpbiBzdHJpbmcpIGJvb2wgeyByZXR1cm4gY2hhaW4gPT0gIkdOT0xBTkQtMSIgfQoKdmFyIHN0b25lTmFtZXMgPSBbXXN0cmluZ3siU2FwcGhpcmUiLCAiVG9wYXoiLCAiUGVhcmwiLCAiRGlhbW9uZCIsICJRdWFydHoifQoKZnVuYyByZWdpc3RlclN0b25lTmFtZShzdG9uZSBzdHJpbmcpIHsKCWZvciBfLCBzIDo9IHJhbmdlIHN0b25lTmFtZXMgewoJCWlmIHMgPT0gc3RvbmUgewoJCQlyZXR1cm4KCQl9Cgl9CglzdG9uZU5hbWVzID0gYXBwZW5kKHN0b25lTmFtZXMsIHN0b25lKQp9CgpmdW5jIFNldFN0b25lRm9yQ2hhaW4oY2hhaW5OYW1lLCBzdG9uZSBzdHJpbmcpIHsKCXN0b25lQnlDaGFpbltjaGFpbk5hbWVdID0gc3RvbmUKCXJlZ2lzdGVyU3RvbmVOYW1lKHN0b25lKQp9CgpmdW5jIEFkZFN0b25lQ29sb3Ioc3RvbmUsIGhleCwgbmFtZSBzdHJpbmcpIHsKCXN0b25lUGFsZXR0ZXNbc3RvbmVdID0gYXBwZW5kKHN0b25lUGFsZXR0ZXNbc3RvbmVdLCBuYW1lZENvbG9ye2hleDogaGV4LCBuYW1lOiBuYW1lfSkKCXJlZ2lzdGVyU3RvbmVOYW1lKHN0b25lKQp9CgpmdW5jIFN0b25lTmFtZXNDU1YoKSBzdHJpbmcgewoJcmV0dXJuIHN0cmluZ3MuSm9pbihzdG9uZU5hbWVzLCAiOyIpCn0KCmZ1bmMgQ29sb3JQYWxldHRlQ1NWKHN0b25lIHN0cmluZykgc3RyaW5nIHsKCXBhbGV0dGUgOj0gc3RvbmVQYWxldHRlc1tzdG9uZV0KCXBhaXJzIDo9IG1ha2UoW11zdHJpbmcsIGxlbihwYWxldHRlKSkKCWZvciBpLCBjIDo9IHJhbmdlIHBhbGV0dGUgewoJCXBhaXJzW2ldID0gYy5oZXggKyAiOiIgKyBjLm5hbWUKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4ocGFpcnMsICI7IikKfQoKZnVuYyBNZXRhbFRvbmVIZXgobWV0YWxOYW1lIHN0cmluZykgc3RyaW5nIHsKCXQsIG9rIDo9IG1ldGFsc1ttZXRhbE5hbWVdCglpZiAhb2sgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHQuaGkgKyAiOyIgKyB0LmxvCn0KCmZ1bmMgU3RvbmVGb3JDaGFpbihjaGFpbiBzdHJpbmcpIHN0cmluZyB7CglpZiBzLCBvayA6PSBzdG9uZUJ5Q2hhaW5bY2hhaW5dOyBvayB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiAiUXVhcnR6Igp9CgpmdW5jIGNvbG9yRm9yU3RvbmUoc3RvbmUgc3RyaW5nLCBjb2xvcklkeCBpbnQpIG5hbWVkQ29sb3IgewoJcGFsZXR0ZSA6PSBzdG9uZVBhbGV0dGVzW3N0b25lXQoJaWYgbGVuKHBhbGV0dGUpID09IDAgewoJCXBhbGV0dGUgPSBzdG9uZVBhbGV0dGVzWyJRdWFydHoiXQoJfQoJaWYgY29sb3JJZHggPCAwIHsKCQljb2xvcklkeCA9IDAKCX0KCWlmIGNvbG9ySWR4ID49IGxlbihwYWxldHRlKSB7CgkJY29sb3JJZHggPSBsZW4ocGFsZXR0ZSkgLSAxCgl9CglyZXR1cm4gcGFsZXR0ZVtjb2xvcklkeF0KfQoKZnVuYyBDb2xvclBhbGV0dGVTaXplKHN0b25lIHN0cmluZykgaW50IHsKCWlmIG4gOj0gbGVuKHN0b25lUGFsZXR0ZXNbc3RvbmVdKTsgbiA+IDAgewoJCXJldHVybiBuCgl9CglyZXR1cm4gbGVuKHN0b25lUGFsZXR0ZXNbIlF1YXJ0eiJdKQp9CgpmdW5jIEZpbmRTaGFwZUluZGV4KHN0b25lLCBuYW1lIHN0cmluZykgKGlkeCBpbnQsIG9rIGJvb2wpIHsKCW5hbWVzIDo9IFNoYXBlTmFtZXMKCWlmIHN0b25lID09ICJQZWFybCIgewoJCW5hbWVzID0gUGVhcmxTaGFwZU5hbWVzCgl9Cglmb3IgaSwgcyA6PSByYW5nZSBuYW1lcyB7CgkJaWYgcyA9PSBuYW1lIHsKCQkJcmV0dXJuIGksIHRydWUKCQl9Cgl9CglyZXR1cm4gLTEsIGZhbHNlCn0KCmZ1bmMgRmluZENvbG9ySW5kZXgoY2hhaW4sIGNvbG9yTmFtZSBzdHJpbmcpIChpZHggaW50LCBvayBib29sKSB7CglzdG9uZSA6PSBTdG9uZUZvckNoYWluKGNoYWluKQoJcGFsZXR0ZSA6PSBzdG9uZVBhbGV0dGVzW3N0b25lXQoJaWYgbGVuKHBhbGV0dGUpID09IDAgewoJCXBhbGV0dGUgPSBzdG9uZVBhbGV0dGVzWyJRdWFydHoiXQoJfQoJZm9yIGksIGMgOj0gcmFuZ2UgcGFsZXR0ZSB7CgkJaWYgYy5uYW1lID09IGNvbG9yTmFtZSB7CgkJCXJldHVybiBpLCB0cnVlCgkJfQoJfQoJcmV0dXJuIC0xLCBmYWxzZQp9Cgp0eXBlIG1ldGFsVG9uZSBzdHJ1Y3R7IGhpLCBsbyBzdHJpbmcgfQoKdmFyIG1ldGFscyA9IG1hcFtzdHJpbmddbWV0YWxUb25lewoJIkdvbGQiOiAgICAgeyIjYTQ4YjNmIiwgIiM2YTUxMTcifSwKCSJTaWx2ZXIiOiAgIHsiIzk1OTg5YyIsICIjNWU2NDZjIn0sCgkiQnJvbnplIjogICB7IiM4NjViMzQiLCAiIzUyMzkxZCJ9LAoJIlBsYXRpbnVtIjogeyIjYzNjNmM4IiwgIiM4NzkwOWEifSwKCSJPYnNpZGlhbiI6IHsiIzNhM2Q0NyIsICIjMGQwZTEyIn0sCn0KCnZhciBNZXRhbE5hbWVzID0gW11zdHJpbmd7IkdvbGQiLCAiU2lsdmVyIiwgIkJyb256ZSIsICJQbGF0aW51bSIsICJPYnNpZGlhbiJ9Cgp0eXBlIG1ldGFsTGFiZWxUb25lIHN0cnVjdHsgYmcsIHRleHQgc3RyaW5nIH0KCnZhciBtZXRhbExhYmVsID0gbWFwW3N0cmluZ11tZXRhbExhYmVsVG9uZXsKCSJHb2xkIjogICAgIHsiI2Y0ZDA2MCIsICIjMDQxMjFhIn0sCgkiU2lsdmVyIjogICB7IiNkZmU0ZWEiLCAiIzA0MTIxYSJ9LAoJIkJyb256ZSI6ICAgeyIjYzk4ODRmIiwgIiMwNDEyMWEifSwKCSJQbGF0aW51bSI6IHsiI2VlZjJmNSIsICIjMDQxMjFhIn0sCgkiT2JzaWRpYW4iOiB7IiM1YTVmNmIiLCAiI2U4ZTlmMCJ9LAp9CgpmdW5jIFJlbmRlclRva2VuVGh1bWJTVkcoY2hhaW4sIG1ldGFsIHN0cmluZywgc2hhcGVJZHgsIGNvbG9ySWR4IGludCwgYWN0aXZlIGJvb2wsIHRpZFN0ciBzdHJpbmcpIHN0cmluZyB7CglzdmcsIF8sIF8sIF8gOj0gcmVuZGVyVG9rZW4oY2hhaW4sIG1ldGFsLCBzaGFwZUlkeCwgY29sb3JJZHgsIGFjdGl2ZSwgdGlkU3RyLCB0cnVlKQoJcmV0dXJuIHN2Zwp9CgpmdW5jIFJlbmRlclRva2VuU1ZHKGNoYWluLCBtZXRhbCBzdHJpbmcsIHNoYXBlSWR4LCBjb2xvcklkeCBpbnQsIGFjdGl2ZSBib29sLCB0aWRTdHIgc3RyaW5nKSAoc3ZnIHN0cmluZywgc3RvbmUgc3RyaW5nLCBjb2xvckhleCBzdHJpbmcsIGNvbG9yTmFtZSBzdHJpbmcpIHsKCXJldHVybiByZW5kZXJUb2tlbihjaGFpbiwgbWV0YWwsIHNoYXBlSWR4LCBjb2xvcklkeCwgYWN0aXZlLCB0aWRTdHIsIGZhbHNlKQp9CgpmdW5jIHJlbmRlclRva2VuKGNoYWluLCBtZXRhbCBzdHJpbmcsIHNoYXBlSWR4LCBjb2xvcklkeCBpbnQsIGFjdGl2ZSBib29sLCB0aWRTdHIgc3RyaW5nLCB0aHVtYiBib29sKSAoc3ZnIHN0cmluZywgc3RvbmUgc3RyaW5nLCBjb2xvckhleCBzdHJpbmcsIGNvbG9yTmFtZSBzdHJpbmcpIHsKCXZhciBjYXNjYWRlQ1NTIHN0cmluZwoJc3RvbmUgPSBTdG9uZUZvckNoYWluKGNoYWluKQoJaWYgQ2hhaW5BbHdheXNBY3RpdmUoY2hhaW4pIHsKCQlhY3RpdmUgPSB0cnVlCgl9CgluYyA6PSBjb2xvckZvclN0b25lKHN0b25lLCBjb2xvcklkeCkKCWNvbG9ySGV4LCBjb2xvck5hbWUgPSBuYy5oZXgsIG5jLm5hbWUKCW10IDo9IG1ldGFsc1ttZXRhbF0KCglyaW5nRWxzIDo9IHJlbmRlclJpbmcobXQuaGksIG10LmxvLCB0aWRTdHIpCgl2YXIgcGllY2VNYXJrdXAgc3RyaW5nCglpZiBzdG9uZSA9PSAiUGVhcmwiIHsKCQlwZWFybCA6PSByZW5kZXJQZWFybFNoYXBlKHNoYXBlSWR4LCBjb2xvckhleCwgbXQuaGksIHRpZFN0cikKCQlvdmVybGF5LCBjc3MgOj0gYXBwbHlDYXNjYWRlKHBlYXJsLCB0aWRTdHIsIG5pbCkKCQlwaWVjZU1hcmt1cCwgY2FzY2FkZUNTUyA9IHBlYXJsK292ZXJsYXksIGNzcwoJfSBlbHNlIHsKCQlmcyA6PSAmZmFjZXRTdHlsZXtwcm9mOiBmaXJlUHJvZmlsZUZvcihzdG9uZSwgY29sb3JOYW1lKSwgem9uZTogbmV3UFJORygiem9uZSIgKyB0aWRTdHIpLCBzdG9uZTogc3RvbmUsIHRodW1iOiB0aHVtYn0KCQl1bmRlciwgZmFjZXRzLCBvdmVyIDo9IHJlbmRlclNvbGlkM0Qoc2hhcGVJZHgsIGNvbG9ySGV4LCB0aWRTdHIsIGZzKQoJCW92ZXJsYXksIGNzcyA6PSBhcHBseUNhc2NhZGUoZmFjZXRzLCB0aWRTdHIsIGZzKQoJCWNhc2NhZGVDU1MgPSBjc3MKCQlwaWVjZU1hcmt1cCA9IHVuZGVyICsgYDxnIGZpbGwtb3BhY2l0eT0iLjkiPmAgKyBmYWNldHMgKyBgPC9nPmAgKyBvdmVybGF5ICsgb3ZlcgoJfQoJZmxvYXRpbmdQaWVjZSA6PSBhcHBseU1vdGlvbihwaWVjZU1hcmt1cCwgdGlkU3RyKQoJc3RhdHVzIDo9IHJlbmRlclN0YXR1c0JhZGdlKGFjdGl2ZSkKCXNlcmlhbCA6PSByZW5kZXJTZXJpYWxUZXh0KHRpZFN0ciwgbXQuaGkpCglsYWJlbFRleHQgOj0gbWV0YWxMYWJlbFttZXRhbF0udGV4dAoJbGFiZWxSZWN0IDo9IHJlbmRlck1ldGFsTGFiZWxSZWN0KG10LmhpLCBtdC5sbywgMjQsIDEzNCwgMTIyLCAxNSwgMywgdGlkU3RyKQoKCWlubmVyIDo9IGA8cmVjdCB3aWR0aD0iYCArIGZudW0oY2FudmFzVykgKyBgIiBoZWlnaHQ9ImAgKyBmbnVtKGNhbnZhc0gpICsgYCIgZmlsbD0iIzBhMGIxMCIvPmAgKwoJCXJlbmRlclN0YXJzKHRpZFN0cikgKyByaW5nRWxzICsgZmxvYXRpbmdQaWVjZSArIHN0YXR1cyArIHNlcmlhbCArIGxhYmVsUmVjdCArCgkJcmVuZGVyUGxhdGVUZXh0KGNoYWluKyIgQ0hBSU4iLCBsYWJlbFRleHQsIG10LmhpKQoKCXN2ZyA9IGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9ImAgKyBmbnVtKGNhbnZhc1cpICsgYCIgaGVpZ2h0PSJgICsgZm51bShjYW52YXNIKSArIGAiIHZpZXdCb3g9IjAgMCBgICsgZm51bShjYW52YXNXKSArIGAgYCArIGZudW0oY2FudmFzSCkgKyBgIj5gICsgc3R5bGVCbG9jaygpICsKCQlgPHN0eWxlPmAgKyBjYXNjYWRlQ1NTICsgYDwvc3R5bGU+YCArIGlubmVyICsgYDwvc3ZnPmAKCXJldHVybiBzdmcsIHN0b25lLCBjb2xvckhleCwgY29sb3JOYW1lCn0KCmZ1bmMgc3R5bGVCbG9jaygpIHN0cmluZyB7Cgljb25zdCBlYXNlT3V0ID0gImN1YmljLWJlemllcigwLDAsLjMsMSkiCglyZXR1cm4gYDxzdHlsZT4uZ3QtdiwuZ3QtaCwuZ3QtciwuZ3Qtc3t3aWxsLWNoYW5nZTp0cmFuc2Zvcm19YCArCgoJCWAuZ3QtdnthbmltYXRpb246Z3QtdiB2YXIoLS12LWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tdi1kZWxheSkgaW5maW5pdGV9YCArCgkJYC5ndC1oe2FuaW1hdGlvbjpndC1oIHZhcigtLWgtZHVyKSBlYXNlLWluLW91dCB2YXIoLS1oLWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LXJ7YW5pbWF0aW9uOmd0LXIgdmFyKC0tci1kdXIpIGVhc2UtaW4tb3V0IHZhcigtLXItZGVsYXkpIGluZmluaXRlfWAgKwoJCWAuZ3Qtc3thbmltYXRpb246Z3QtcyB2YXIoLS1zLWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tcy1kZWxheSkgaW5maW5pdGV9YCArCgkJYC5ndC1nbG93e2FuaW1hdGlvbjpndC1nbG93IHZhcigtLWdsb3ctZHVyKSBlYXNlLWluLW91dCB2YXIoLS1nbG93LWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LWxhe2FuaW1hdGlvbjpndC1sYSB2YXIoLS1yLWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tci1kZWxheSkgaW5maW5pdGV9YCArCgkJYC5ndC1sYnthbmltYXRpb246Z3QtbGIgdmFyKC0tci1kdXIpIGVhc2UtaW4tb3V0IHZhcigtLXItZGVsYXkpIGluZmluaXRlfWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWxhezAlLDUwJSwxMDAle29wYWNpdHk6MH0yNSV7b3BhY2l0eToxfX1gICsKCQlgQGtleWZyYW1lcyBndC1sYnswJSw1MCUsMTAwJXtvcGFjaXR5OjB9NzUle29wYWNpdHk6MX19YCArCgkJYC5ndC1iYWRnZS1wdWxzZXthbmltYXRpb246Z3QtYnAgMS44cyBgICsgZWFzZU91dCArIGAgaW5maW5pdGV9YCArCgkJYEBrZXlmcmFtZXMgZ3QtdnswJSwxMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDIuNXB4KX01MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTIuNXB4KX19YCArCgkJYEBrZXlmcmFtZXMgZ3QtaHs1MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMS44cHgpfX1gICsKCQlgQGtleWZyYW1lcyBndC1yezI1JXt0cmFuc2Zvcm06cm90YXRlKGNhbGMoLTEqdmFyKC0tcm90LWRlZykpKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSh2YXIoLS1yb3QtZGVnKSl9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LXN7NTAle3RyYW5zZm9ybTpzY2FsZShgICsgZm51bShtb3Rpb25TY2FsZSkgKyBgKX19YCArCgkJYC5ndC10d3thbmltYXRpb246Z3QtdHcgdmFyKC0tZCkgZWFzZS1pbi1vdXQgdmFyKC0tZGwpIGluZmluaXRlfUBrZXlmcmFtZXMgZ3QtdHd7MCUsODQlLDEwMCV7b3BhY2l0eTouNH05MCV7b3BhY2l0eToxfTk0JXtvcGFjaXR5Oi4yfX1gICsKCQlgQGtleWZyYW1lcyBndC1nbG93ezUwJXtvcGFjaXR5OjF9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWJwe2Zyb217dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6Ljh9dG97dHJhbnNmb3JtOnNjYWxlKDIuMjUpO29wYWNpdHk6MH19YCArCgkJYDwvc3R5bGU+YAp9ChpgCgtnbm9tb2QudG9tbBJRbW9kdWxlID0gImduby5sYW5kL3AvZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NC9hcnQzZCIKZ25vID0gIjAuOSIKIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0zMDAwMDAwMHVnbm90EhIIxNfZZhILMTA3NjkwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECZnmjxh8z1An/XbR9f70VPxX5TQTu0HjqzAQDtnm7MVASQGUuSZTkL7C0I2O5mL4TROzaT+2DvZdhGDOy8Y/yxhnHbnjwvY8amOioJl74xS+y+gHm68v4cw/ZZ6HObqMncpkaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=