IyMgVXAgdG8gUFIjOTk5OSBmb3IgUiA8IDMuMC4wCgpwZGYoInJlZy10ZXN0cy0xYS5wZGYiLCBlbmNvZGluZyA9ICJJU09MYXRpbjEuZW5jIikKCiMjIGZvcmNlIHN0YW5kYXJkIGhhbmRsaW5nIGZvciBkYXRhIGZyYW1lcwpvcHRpb25zKHN0cmluZ3NBc0ZhY3RvcnM9VFJVRSkKIyMgLk1hY2hpbmUKKE1lcHMgPC0gLk1hY2hpbmUkZG91YmxlLmVwcykjIGFuZCB1c2UgaXQgaW4gdGhpcyBmaWxlCiMjIEZhY2lsaXRhdGUgZGlhZ25vc2luZyBvZiB0ZXN0aW5nIHN0YXJ0dXA6CmVudkxzdCA8LSBjKHQob3V0ZXIoYygiUl9FTlZJUk9OIiwiUl9QUk9GSUxFIiksIGMoIiIsIl9VU0VSIiksIHBhc3RlMCkpLAoJICAgICJSX0NIRUNLX0VOVklST04iLCJSX0xJQlMiKQpjYmluZChTeXMuZ2V0ZW52KGVudkxzdCkpCi5saWJQYXRocygpCgphc3NlcnRFcnJvciA8LSB0b29sczo6YXNzZXJ0RXJyb3IKCiMjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIjMzc2CmFnZ3JlZ2F0ZSh0cygxOjIwKSwgbmZyZXE9MS8zKQojIyBDb21tZW50czogbW92ZWQgZnJvbSBhZ2dyZWdhdGUuUmQKCgojIyBhcGVybQojIGNoZWNrIHRoZSBuYW1lcwp4IDwtIGFycmF5KDE6MjQsIGMoNCwgNikpCm5tcyA8LSBsaXN0KGhhcHB5PWxldHRlcnNbMTo0XSwgc2FkPUxFVFRFUlNbMTo2XSkKCmRpbW5hbWVzKHgpIDwtIG5tcwp0bXAgPC0gYXBlcm0oeCwgYygyLCAxKSkKc3RvcGlmbm90KGFsbC5lcXVhbChkaW1uYW1lcyh0bXApLCBubXNbYygyLCAxKV0pKQoKZGltbmFtZXMoeCkgPC0gYyhubXNbMV0sIGxpc3QoTlVMTCkpCnRtcCA8LSBhcGVybSh4LCBjKDIsIDEpKQpzdG9waWZub3QoYWxsLmVxdWFsKGRpbW5hbWVzKHRtcCksIGMobGlzdChOVUxMKSwgbm1zWzFdKSkpCgpuYW1lcyhubXMpIDwtIGMoImhhcHB5IiwgInNhZCIpCmRpbW5hbWVzKHgpIDwtIG5tcwp0bXAgPC0gYXBlcm0oeCwgYygyLCAxKSkKc3RvcGlmbm90KGFsbC5lcXVhbChuYW1lcyhkaW1uYW1lcyh0bXApKSwgbmFtZXMobm1zW2MoMiwgMSldKSkpCgpkaW1uYW1lcyh4KSA8LSBjKG5tc1sxXSwgbGlzdChOVUxMKSkKdG1wIDwtIGFwZXJtKHgsIGMoMiwgMSkpCnN0b3BpZm5vdChhbGwuZXF1YWwobmFtZXMoZGltbmFtZXModG1wKSksIGMoIiIsIG5hbWVzKG5tcylbMV0pKSkKCiMgY2hlY2sgcmVzaXplCnN0b3BpZm5vdChkaW0oYXBlcm0oeCwgYygyLCAxKSwgRkFMU0UpKSA9PSBkaW0oeCkpCnN0b3BpZm5vdChpcy5udWxsKGRpbW5hbWVzKGFwZXJtKHgsIGMoMiwgMSksIEZBTFNFKSkpKQoKIyBjaGVjayB0aGUgdHlwZXMKeCA8LSBhcnJheSgxOjI0LCBjKDQsIDYpKQpzdG9waWZub3QoYWxsLmVxdWFsKGFwZXJtKHgsIGMoMiwgMSkpLCB0KHgpKSkKc3RvcGlmbm90KGlzLmludGVnZXIoYXBlcm0oeCwgYygyLCAxKSkpKQoKeCA8LSB4ICsgMC4wCnN0b3BpZm5vdChhbGwuZXF1YWwoYXBlcm0oeCwgYygyLCAxKSksIHQoeCkpKQpzdG9waWZub3QoaXMuZG91YmxlKGFwZXJtKHgsIGMoMiwgMSkpKSkKCnggPC0geCArIDAuMGkKc3RvcGlmbm90KGFsbC5lcXVhbChhcGVybSh4LCBjKDIsIDEpKSwgdCh4KSkpCgp4W10gPC0gTEVUVEVSU1sxOjI0XQpzdG9waWZub3QoYWxsLmVxdWFsKGFwZXJtKHgsIGMoMiwgMSkpLCB0KHgpKSkKCnggPC0gYXJyYXkobGlzdCgiZnJlZCIpLCBjKDQsIDYpKQp4W1szLCA0XV0gPC0gMToxMApzdG9waWZub3QoYWxsLmVxdWFsKGFwZXJtKHgsIGMoMiwgMSkpLCB0KHgpKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gYXBlcm0uUmQKCgojIyBhcHBlbmQKc3RvcGlmbm90KGFwcGVuZCgxOjUsIDA6MSwgYWZ0ZXI9MykgPT0gYXBwZW5kKDE6MywgYygwOjEsIDQ6NSkpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBhcHBlbmQuUmQKCgojIyBhcnJheQojIGZ1bm55IG9iamVjdCwgYnV0IHdoYXRldmVyIHdhcyB0aGUgcG9pbnQgb2YgdGhhdD8KdXRpbHM6OnN0cihhcnJheSgxOjMsIDApKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBhcnJheS5SZAoKCiMjIGFzLlBPU0lYbHQKeiA8LSBTeXMudGltZSgpCnN0b3BpZm5vdChyYW5nZSh6KSA9PSB6LAoJICBtaW4oeikgPT0geiwKCSAgbWF4KHopID09IHosCgkgIG1lYW4oeikgPT0geikKIyMgZW5kIG9mIG1vdmVkIGZyb20gYXMuUE9TSVhsdC5SZAoKCiMjIGF1dG9sb2FkCnN0b3BpZm5vdChscygiQXV0b2xvYWRzIikgPT0gbHMoZW52aXIgPSAuQXV0b2xvYWRFbnYpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBhdXRvbG9hZC5SZAoKCiMjIGF4aXMKWSA8LSBjKDEwLjUwLCA0LjAsIDEzLjc1LCA3LjI1KQpwbG90KDE6NCwgWSwgeGxpbT1jKDAsNSksIHlsaW09YygwLDE1KSkKYXhpcyhzaWRlPTQsIGF0PVksIGxhYmVscz1MRVRURVJTWzE6NF0pCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGF4aXMuUmQKCgojIyBiYWNrc29sdmUKciA8LSByYmluZChjKDEsMiwzKSwKCSAgIGMoMCwxLDEpLAoJICAgYygwLDAsMikpCiggeSA8LSBiYWNrc29sdmUociwgeCA8LSBjKDgsNCwyKSkgKSAjIC0xIDMgMQpyICUqJSB5ICMgPT0geCA9ICg4LDQsMikKKCB5MiA8LSBiYWNrc29sdmUociwgeCwgdHJhbnNwb3NlID0gVFJVRSkpICMgOCAtMTIgLTUKc3RvcGlmbm90KGFsbC5lcXVhbChkcm9wKHQocikgJSolIHkyKSwgeCkpCnN0b3BpZm5vdChhbGwuZXF1YWwoeSwgYmFja3NvbHZlKHQociksIHgsIHVwcGVyID0gRkFMU0UsIHRyYW5zcG9zZSA9IFRSVUUpKSkKc3RvcGlmbm90KGFsbC5lcXVhbCh5MiwgYmFja3NvbHZlKHQociksIHgsIHVwcGVyID0gRkFMU0UsIHRyYW5zcG9zZSA9IEZBTFNFKSkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGJhY2tzb2x2ZS5SZAoKCiMjIGJhc2VuYW1lCmRpcm5hbWUoY2hhcmFjdGVyKDApKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBiYXNlbmFtZS5SZAoKCiMjIEJlc3NlbAojIyBDaGVjayB0aGUgU2NhbGluZyA6Cm51cyA8LSBjKDA6NSwxMCwyMCkKeCA8LSBzZXEoMCw0MCxsZW49ODAxKVstMV0KZm9yKG51IGluIG51cykKICAgc3RvcGlmbm90KGFicygxLSBiZXNzZWxLKHgsbnUpKmV4cCggeCkgLyBiZXNzZWxLKHgsbnUsZXhwbz1UUlVFKSkgPCAyZS0xNSkKZm9yKG51IGluIG51cykKICAgc3RvcGlmbm90KGFicygxLSBiZXNzZWxJKHgsbnUpKmV4cCgteCkgLyBiZXNzZWxJKHgsbnUsZXhwbz1UUlVFKSkgPCAxZS0xNSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gQmVzc2VsLlJkCgoKIyMgYwpsbCA8LSBsaXN0KEEgPSAxLCBjPSJDIikKc3RvcGlmbm90KGlkZW50aWNhbChjKGxsLCBkPTE6MyksIGMobGwsIGFzLmxpc3QoYyhkPTE6MykpKSkpCiMjIG1vdmVkIGZyb20gYy5SZAoKCiMjIENhdWNoeQpzdG9waWZub3QoYWxsLmVxdWFsKGRjYXVjaHkoLTE6NCksIDEgLyAocGkqKDEgKyAoLTE6NCleMikpKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gQ2F1Y2h5LlJkCgoKIyMgY2hvbAooIG0gPC0gbWF0cml4KGMoNSwxLDEsMyksMiwyKSApCiggY20gPC0gY2hvbChtKSApCnN0b3BpZm5vdChhYnMobQkgLSAgdChjbSkgJSolIGNtKSA8IDEwMCogTWVwcykKCiMjIGNoZWNrIHdpdGggcGl2b3RpbmcKKCBtIDwtIG1hdHJpeChjKDUsMSwxLDMpLDIsMikgKQooIGNtIDwtIGNob2wobSwgVFJVRSkgKQpzdG9waWZub3QoYWJzKG0JIC0gIHQoY20pICUqJSBjbSkgPCAxMDAqIE1lcHMpCgp4IDwtIG1hdHJpeChjKDE6NSwgKDE6NSleMiksIDUsIDIpCm0gPC0gY3Jvc3Nwcm9kKHgpClEgPC0gY2hvbChtKQpzdG9waWZub3QoYWxsLmVxdWFsKHQoUSkgJSolIFEsIG0pKQoKUSA8LSBjaG9sKG0sIHBpdm90ID0gVFJVRSkKcGl2b3QgPC0gYXR0cihRLCAicGl2b3QiKQpvbyA8LSBvcmRlcihwaXZvdCkKc3RvcGlmbm90KGFsbC5lcXVhbCh0KFFbLCBvb10pICUqJSBRWywgb29dLCBtKSkKc3RvcGlmbm90KGFsbC5lcXVhbCh0KFEpICUqJSBRLCBtW3Bpdm90LCBwaXZvdF0pKQoKIyBub3cgZm9yIHNvbWV0aGluZyBwb3NpdGl2ZSBzZW1pLWRlZmluaXRlCnggPC0gY2JpbmQoeCwgeFssIDFdKzMqeFssIDJdKQptIDwtIGNyb3NzcHJvZCh4KQpxcihtKSRyYW5rICMgaXMgMiwgYXMgaXQgc2hvdWxkIGJlCgooUSA8LSBjaG9sKG0sIHBpdm90ID0gVFJVRSkpICMgTkIgd3JvbmcgcmFuayBoZXJlIC4uLiBzZWUgV2FybmluZyBzZWN0aW9uLgpwaXZvdCA8LSBhdHRyKFEsICJwaXZvdCIpCm9vIDwtIG9yZGVyKHBpdm90KQpzdG9waWZub3QoYWxsLmVxdWFsKHQoUVssIG9vXSkgJSolIFFbLCBvb10sIG0pKQpzdG9waWZub3QoYWxsLmVxdWFsKHQoUSkgJSolIFEsIG1bcGl2b3QsIHBpdm90XSkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGNob2wuUmQKCgojIyBjaG9sMmludgpjbWEgPC0gY2hvbChtYQk8LSBjYmluZCgxLCAxOjMsIGMoMSwzLDcpKSkKc3RvcGlmbm90KGFsbC5lcXVhbChkaWFnKDMpLCBtYSAlKiUgY2hvbDJpbnYoY21hKSkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGNob2wyaW52LlJkCgoKIyMgY29sMnJnYgpwcCA8LSBwYWxldHRlKCk7IG5hbWVzKHBwKSA8LSBwcCAjIGFkZCAmIHVzZSBuYW1lcyA6CnN0b3BpZm5vdChjb2wycmdiKDE6OCkgPT0gcHJpbnQoY29sMnJnYihwcCkpKQpzdG9waWZub3QoY29sMnJnYigiIzA4YTBmZiIpID09IGMoOCwgMTYwLCAyNTUpKQpnckMgPC0gY29sMnJnYihwYXN0ZSgiZ3JheSIsMDoxMDAsc2VwPSIiKSkKc3RvcGlmbm90KGdyQ1sicmVkIixdID09IGdyQ1siZ3JlZW4iLF0sCgkgIGdyQ1sicmVkIixdID09IGdyQ1siYmx1ZSIsXSwKCSAgZ3JDWyJyZWQiLCAxOjRdID09IGMoMCwzLDUsOCkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGNvbDJyZ2IuUmQKCgojIyBjb2xuYW1lcwptMCA8LSBtYXRyaXgoTkEsIDQsIDApCnJvd25hbWVzKG0wLCBkby5OVUxMID0gRkFMU0UpCmNvbG5hbWVzKG0wLCBkby5OVUxMID0gRkFMU0UpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGNvbG5hbWVzLlJkCgoKIyMgQ29uc3RhbnRzCnN0b3BpZm5vdCgKIG5jaGFyKGxldHRlcnMpID09IDEsCiBtb250aC5hYmIgPT0gc3Vic3RyKG1vbnRoLm5hbWUsIDEsIDMpCikKCnN0b3BpZm5vdChhbGwuZXF1YWwocGksIDQqYXRhbigxKSwgdG9sPSAyKk1lcHMpKQoKIyBKb2huIE1hY2hpbiAoMTcwNSkgY29tcHV0ZWQgMTAwIGRlY2ltYWxzIG9mIHBpIDoKc3RvcGlmbm90KGFsbC5lcXVhbChwaS80LCA0KmF0YW4oMS81KSAtIGF0YW4oMS8yMzkpLCA0Kk1lcHMpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBDb25zdGFudHMuUmQKCgojIyBjb3IKc3RvcGlmbm90KCAgaXMubmEodmFyKDEpKSwKCSAgIWlzLm5hbih2YXIoMSkpKQoKenogPC0gYygtMS4zMDE2NywgLTAuNDk1NywgLTEuNDY3NDksIDAuNDY5MjcpCnIgPC0gY29yKHp6LHp6KTsgciAtIDEKc3RvcGlmbm90KHIgPD0gMSkgIyBmYWlscyBpbiBSIDw9IDEuMy54LCBmb3IgdmVyc2lvbnMgb2YgTGludXggYW5kIFNvbGFyaXMKIyMgZW5kIG9mIG1vdmVkIGZyb20gY29yLlJkCiMjIFNwZWFybWFuIGNvcnJlbGF0aW9ucyByYW5rZWQgbWlzc2luZyB2YWx1ZXMgYXQgZW5kIDw9IDEuOC4xClggPC0gY2JpbmQoYygxLDMsNCxOQSksYygxLDQsMixOQSkpClgxIDwtIFhbLTQsXQpzdG9waWZub3QoYWxsLmVxdWFsKGNvcihYLFgsbWV0aG9kPSJzcGVhcm1hbiIsdXNlPSJjb21wbGV0ZSIpLAogICAgICAgICAgICAgICAgICAgIGNvcihYMSxYMSxtZXRob2Q9InNwZWFybWFuIix1c2U9ImNvbXBsZXRlIikpKQpzdG9waWZub3QoYWxsLmVxdWFsKGNvdihYLFgsbWV0aG9kPSJzcGVhcm1hbiIsdXNlPSJjb21wbGV0ZSIpLAogICAgICAgICAgICAgICAgICAgIGNvdihYMSxYMSxtZXRob2Q9InNwZWFybWFuIix1c2U9ImNvbXBsZXRlIikpKQoKIyMgRGF0ZVRpbWVDbGFzc2VzCihkbHMgPC0gLmxlYXAuc2Vjb25kc1stMV0gLSAubGVhcC5zZWNvbmRzWy1sZW5ndGgoLmxlYXAuc2Vjb25kcyldKQp0YWJsZShkbHMpCnN0b3BpZm5vdChzdW0oZGxzID09IDM2NSkgPj0gMTEpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIERhdGVUaW1lQ2xhc3Nlcy5SZAoKCiMjIGRlcml2CnRyaWcuZXhwIDwtIGV4cHJlc3Npb24oc2luKGNvcyh4ICsgeV4yKSkpCkQuc2MgPC0gRCh0cmlnLmV4cCwgIngiKQpkeHkgPC0gZGVyaXYodHJpZy5leHAsIGMoIngiLCAieSIpKQp5IDwtIDEKc3RvcGlmbm90KGV2YWwoRC5zYykgPT0KCSAgYXR0cihldmFsKGR4eSksImdyYWRpZW50IilbLCJ4Il0pCmZmIDwtIHkgfiBzaW4oY29zKHgpICogeSkKc3RvcGlmbm90KGFsbC5lcXVhbChkZXJpdihmZiwgYygieCIsInkiKSwgZnVuYyA9IFRSVUUgKSwKCQkgICAgZGVyaXYoZmYsIGMoIngiLCJ5IiksIGZ1bmMgPSBmdW5jdGlvbih4LHkpeyB9ICkpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBkZXJpdi5SZAoKCiMjIGRpZmYKeCA8LSBjdW1zdW0oY3Vtc3VtKDE6MTApKQpzdG9waWZub3QoZGlmZih4LCBsYWcgPSAyKSA9PSB4WygxKzIpOjEwXSAtIHhbMTooMTAgLSAyKV0sCgkgIGRpZmYoeCwgbGFnID0gMikgPT0gKDM6MTApXjIsCgkgIGRpZmYoZGlmZih4KSkJICAgPT0gZGlmZih4LCBkaWZmZXJlbmNlcyA9IDIpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBkaWZmLlJkCgoKIyMgZHVwbGljYXRlZAp4IDwtIGMoOToyMCwgMTo1LCAzOjcsIDA6OCkKIyMgZXh0cmFjdCB1bmlxdWUgZWxlbWVudHMKKHh1IDwtIHhbIWR1cGxpY2F0ZWQoeCldKQpzdG9waWZub3QoeHUgPT0gdW5pcXVlKHgpLCAjIGJ1dCB1bmlxdWUoeCkgaXMgbW9yZSBlZmZpY2llbnQKCSAgMDoyMCA9PSBzb3J0KHhbIWR1cGxpY2F0ZWQoeCldKSkKCnN0b3BpZm5vdChkdXBsaWNhdGVkKGlyaXMpWzE0M10gPT0gVFJVRSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gZHVwbGljYXRlZC5SZAoKCiMjIGVpZ2VuCnNldC5zZWVkKDMyMSwga2luZCA9ICJkZWZhdWx0IikJICMgZm9yY2UgYSBwYXJ0aWN1bGFyIHNlZWQKbSA8LSBtYXRyaXgocm91bmQocm5vcm0oMjUpLDMpLCA1LDUpCnNtIDwtIG0gKyB0KG0pICMtIHN5bW1ldHJpYyBtYXRyaXgKZW0gPC0gZWlnZW4oc20pOyBWIDwtIGVtJHZlY3QKcHJpbnQobGFtIDwtIGVtJHZhbHVlcykgIyBvcmRlcmVkIERFY3JlYXNpbmdseQoKc3RvcGlmbm90KAogYWJzKHNtICUqJSBWIC0gViAlKiUgZGlhZyhsYW0pKQkgIDwgNjAqTWVwcywKIGFicyhzbQkgICAgICAtIFYgJSolIGRpYWcobGFtKSAlKiUgdChWKSkgPCA2MCpNZXBzKQoKIyMtLS0tLS0tIFN5bW1ldHJpYyA9IEZBTFNFOiAgLS0gZGlmZmVyZW50IHRvIGFib3ZlIDogLS0tCgplbSA8LSBlaWdlbihzbSwgc3ltbWV0cmljID0gRkFMU0UpOyBWMiA8LSBlbSR2ZWN0CnByaW50KGxhbTIgPC0gZW0kdmFsdWVzKSAjIG9yZGVyZWQgZGVjcmVhc2luZ2x5IGluIEFCU29sdXRlIHZhbHVlICEKcHJpbnQoaSA8LSByZXYob3JkZXIobGFtMikpKQpzdG9waWZub3QoYWJzKGxhbSAtIGxhbTJbaV0pIDwgMTAwICogTWVwcykgIyBjb21wYXJpbmcgdHdvIHNvbG5zCgp6YXBzbWFsbChEaWFnIDwtIHQoVjIpICUqJSBWMikKc3RvcGlmbm90KCBhYnMoMS0gZGlhZyhEaWFnKSkgPCA2MCpNZXBzKQoKc3RvcGlmbm90KGFicyhzbSAlKiUgVjIgLSBWMiAlKiUgZGlhZyhsYW0yKSkJCTwgNjAqTWVwcywKCSAgYWJzKHNtCSAtIFYyICUqJSBkaWFnKGxhbTIpICUqJSB0KFYyKSkgPCA2MCpNZXBzKQoKIyMgUmUtb3JkZXJlZCBhcyB3aXRoIHN5bW1ldHJpYzoKc1YgPC0gVjJbLGldCnNsYW0gPC0gbGFtMltpXQpzdG9waWZub3QoYWJzKHNtICUqJSBzViAtICBzViAlKiUgZGlhZyhzbGFtKSkJCSAgPCA2MCpNZXBzKQpzdG9waWZub3QoYWJzKHNtCS0gIHNWICUqJSBkaWFnKHNsYW0pICUqJSB0KHNWKSkgPCA2MCpNZXBzKQojIyBzViAgKmlzKiBub3cgZXF1YWwgdG8gViAgLS0gdXAgdG8gc2lnbiAoKy0pIGFuZCByb3VuZGluZyBlcnJvcnMKc3RvcGlmbm90KGFicyhjKDEgLSBhYnMoc1YgLyBWKSkpCTwgICAgIDEwMDAqTWVwcykKIyMgZW5kIG9mIG1vdmVkIGZyb20gZWlnZW4uUmQKCgojIyBldXJvCnN0b3BpZm5vdChldXJvID09IHNpZ25pZihldXJvLDYpLCBldXJvLmNyb3NzID09IG91dGVyKDEvZXVybywgZXVybykpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGV1cm8uUmQKCgojIyBFeHBvbmVudGlhbApyIDwtIHJleHAoMTAwKQpzdG9waWZub3QoYWJzKDEgLSBkZXhwKDEsIHIpIC8gKHIqZXhwKC1yKSkpIDwgMWUtMTQpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIEV4cG9uZW50aWFsLlJkCgoKIyMgZmFtaWx5CmdmIDwtIEdhbW1hKCkKc3RvcGlmbm90KDE6MTAgPT0gZ2YkbGlua2Z1bihnZiRsaW5raW52KDE6MTApKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gZmFtaWx5LlJkCgoKIyMgZmZ0CnNldC5zZWVkKDEyMykKZXBzIDwtIDFlLTEwICAjIHR5cGljYWxseSBzZWUgYXJvdW5kIDFlLTExCmZvcihOIGluIDE6MTMwKSB7CiAgICB4IDwtIHJub3JtKE4pCiAgICBpZihOICUlIDUgPT0gMCkgewoJbTUgPC0gbWF0cml4KHgsbmNvbD01KQoJc3RvcGlmbm90KGFwcGx5KG01LDIsZmZ0KSA9PSBtdmZmdChtNSkpCiAgICB9CiAgICBkZCA8LSBNb2QoMSAtIChmMiA8LSBmZnQoZmZ0KHgpLCBpbnZlcnNlPVRSVUUpLyh4Kmxlbmd0aCh4KSkpKQogICAgc3RvcGlmbm90KGRkIDwgZXBzKQp9CiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGZmdC5SZAoKCiMjIGZpbmRpbnQKTiA8LSAxMDAKWCA8LSBzb3J0KHJvdW5kKHJ0KE4sIGRmPTIpLCAyKSkKdHQgPC0gYygtMTAwLCBzZXEoLTIsMiwgbGVuPTIwMSksICsxMDApCml0IDwtIGZpbmRJbnRlcnZhbCh0dCwgWCkKCiMjIFNlZSB0aGF0IHRoaXMgaXMgTiAqIEZuKC4pIDoKdHQgPC0gYyh0dCxYKQpzdG9waWZub3QoaXRbYygxLDIwMyldID09IGMoMCwgMTAwKSwKCSAgYWxsLmVxdWFsKE4gKiBzdGF0czo6ZWNkZihYKSh0dCksCgkJICAgIGZpbmRJbnRlcnZhbCh0dCwgWCksICB0b2wgPSAxMDAgKiBNZXBzKSwKCSAgZmluZEludGVydmFsKHR0LFgpID09CSBhcHBseSggb3V0ZXIodHQsIFgsICI+PSIpLCAxLCBzdW0pCgkgICkKIyMgZW5kIG9mIG1vdmVkIGZyb20gZmluZGludC5SZAojIyBOQSAmIEluZidzIDoKdHRbaW5hIDwtIGMoMiwzLDUsNyldIDwtIE5BCnR0WzMwMF0gPC0gSW5mClggPC0gYygtSW5mLCBYLCBJbmYpCml0IDwtIGZpbmRJbnRlcnZhbCh0dCxYKQpzdG9waWZub3QoaWRlbnRpY2FsKGl0LCBhcy5pbnRlZ2VyKHJvd1N1bXMob3V0ZXIodHQsIFgsICI+PSIpKSkpLAoJICBpcy5uYShpdFtpbmFdKSkKCgojIyBmaXgKb28gPC0gb3B0aW9ucyhlZGl0b3I9InRvdWNoIikgIyBub3QgcmVhbGx5IGNoYW5naW5nIGFueXRoaW5nCmZpeChwaSkKaWYoIWlzLm51bWVyaWMocGkpIHx8IGxlbmd0aChwaSkhPTEgfHwKICAgIWlzLm51bGwoYXR0cmlidXRlcyhwaSkpIHx8IGFicyhwaSAtIDMuMTQxNSkgPiAxZS00KQogICAgICBzdG9wKCJPT1BTOiAgZml4KCkgaXMgYnJva2VuIC4uLiIpCnJtKHBpKTsgb3B0aW9ucyhvbykKIyMgZW5kIG9mIG1vdmVkIGZyb20gZml4LlJkCgoKIyMgZm9ybWF0CihkZCA8LSBzYXBwbHkoMToxMCwgZnVuY3Rpb24oaSlwYXN0ZSgoOTowKVsxOmldLGNvbGxhcHNlPSIiKSkpCm5wIDwtIG5jaGFyKHBkIDwtIHByZXR0eU51bShkZCwgYmlnLm1hcms9IiciKSkKc3RvcGlmbm90KHNhcHBseSgwOjIsIGZ1bmN0aW9uKG0pCgkgICBhbGwoZ3JlcCgiJyIsIHN1YnN0cihwZCwgMSwgbnAgLSA0Km0pKSA9PSAoNCszKm0pOjEwKSkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGZvcm1hdC5SZAoKCiMjIEdlb21ldHJpYwpwcCA8LSBzb3J0KGMoKDE6OSkvMTAsIDEgLSAuMl4oMjo4KSkpCnByaW50KHFnIDwtIHFnZW9tKHBwLCBwcm9iID0gLjIpKQojIyB0ZXN0IHRoYXQgcWdlb20gaXMgYW4gaW52ZXJzZSBvZiBwZ2VvbQpwcmludChxZzEgPC0gcWdlb20ocGdlb20ocWcsIHByb2I9LjIpLCBwcm9iID0uMikpCnN0b3BpZm5vdChpZGVudGljYWwocWcsIHFnMSkpCiMjIG1vdmVkIGZyb20gR2VvbWV0cmljLlJkCgoKIyMgZ2xtCiMjIHRoZXNlIGFyZSB0aGUgc2FtZSAtLSBleGFtcGxlIGZyb20gSmltIExpbmRzZXkKeSA8LSBybm9ybSgyMCkKeTEgPC0geVstMV07IHkyIDwtIHlbLTIwXQpzdW1tYXJ5KGcxIDwtIGdsbSh5MSAtIHkyIH4gMSkpCnN1bW1hcnkoZzIgPC0gZ2xtKHkxIH4gb2Zmc2V0KHkyKSkpCkVxIDwtIGZ1bmN0aW9uKHgseSkgYWxsLmVxdWFsKHgseSwgdG9sID0gMWUtMTIpCnN0b3BpZm5vdChFcShjb2VmKGcxKSwgY29lZihnMikpLAoJICBFcShkZXZpYW5jZShnMSksIGRldmlhbmNlKGcyKSksCgkgIEVxKHJlc2lkKGcxKSwgcmVzaWQoZzIpKSkKIyMgZnJvbSBsb2dMaWsuZ2xtLlJkCmFub3JleGlhIDwtCnN0cnVjdHVyZShsaXN0KFRyZWF0ID0gc3RydWN0dXJlKGMoMkwsIDJMLCAyTCwgMkwsIDJMLCAyTCwgMkwsCjJMLCAyTCwgMkwsIDJMLCAyTCwgMkwsIDJMLCAyTCwgMkwsIDJMLCAyTCwgMkwsIDJMLCAyTCwgMkwsIDJMLAoyTCwgMkwsIDJMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwKMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsCjNMLCAzTCwgM0wsIDNMLCAzTCwgM0wsIDNMLCAzTCwgM0wsIDNMLCAzTCwgM0wsIDNMLCAzTCwgM0wsIDNMLAozTCksIC5MYWJlbCA9IGMoIkNCVCIsICJDb250IiwgIkZUIiksIGNsYXNzID0gImZhY3RvciIpLCBQcmV3dCA9IGMoODAuNywKODkuNCwgOTEuOCwgNzQsIDc4LjEsIDg4LjMsIDg3LjMsIDc1LjEsIDgwLjYsIDc4LjQsIDc3LjYsIDg4LjcsCjgxLjMsIDc4LjEsIDcwLjUsIDc3LjMsIDg1LjIsIDg2LCA4NC4xLCA3OS43LCA4NS41LCA4NC40LCA3OS42LAo3Ny41LCA3Mi4zLCA4OSwgODAuNSwgODQuOSwgODEuNSwgODIuNiwgNzkuOSwgODguNywgOTQuOSwgNzYuMywKODEsIDgwLjUsIDg1LCA4OS4yLCA4MS4zLCA3Ni41LCA3MCwgODAuNCwgODMuMywgODMsIDg3LjcsIDg0LjIsCjg2LjQsIDc2LjUsIDgwLjIsIDg3LjgsIDgzLjMsIDc5LjcsIDg0LjUsIDgwLjgsIDg3LjQsIDgzLjgsIDgzLjMsCjg2LCA4Mi41LCA4Ni43LCA3OS42LCA3Ni45LCA5NC4yLCA3My40LCA4MC41LCA4MS42LCA4Mi4xLCA3Ny42LAo4My41LCA4OS45LCA4NiwgODcuMyksIFBvc3R3dCA9IGMoODAuMiwgODAuMSwgODYuNCwgODYuMywgNzYuMSwKNzguMSwgNzUuMSwgODYuNywgNzMuNSwgODQuNiwgNzcuNCwgNzkuNSwgODkuNiwgODEuNCwgODEuOCwgNzcuMywKODQuMiwgNzUuNCwgNzkuNSwgNzMsIDg4LjMsIDg0LjcsIDgxLjQsIDgxLjIsIDg4LjIsIDc4LjgsIDgyLjIsCjg1LjYsIDgxLjQsIDgxLjksIDc2LjQsIDEwMy42LCA5OC40LCA5My40LCA3My40LCA4Mi4xLCA5Ni43LAo5NS4zLCA4Mi40LCA3Mi41LCA5MC45LCA3MS4zLCA4NS40LCA4MS42LCA4OS4xLCA4My45LCA4Mi43LCA3NS43LAo4Mi42LCAxMDAuNCwgODUuMiwgODMuNiwgODQuNiwgOTYuMiwgODYuNywgOTUuMiwgOTQuMywgOTEuNSwKOTEuOSwgMTAwLjMsIDc2LjcsIDc2LjgsIDEwMS42LCA5NC45LCA3NS4yLCA3Ny44LCA5NS41LCA5MC43LAo5Mi41LCA5My44LCA5MS43LCA5OCkpLCAuTmFtZXMgPSBjKCJUcmVhdCIsICJQcmV3dCIsICJQb3N0d3QiCiksIGNsYXNzID0gImRhdGEuZnJhbWUiLCByb3cubmFtZXMgPSAxOjcyKQphbm9yZXguMSA8LSBnbG0oUG9zdHd0IH4gUHJld3QgKyBUcmVhdCArIG9mZnNldChQcmV3dCksCgkgICAgZmFtaWx5ID0gZ2F1c3NpYW4sIGRhdGEgPSBhbm9yZXhpYSkKc3VtbWFyeShhbm9yZXguMSkKRXEgPC0gZnVuY3Rpb24oeCx5KSBhbGwuZXF1YWwoeCx5LCB0b2wgPSAxZS0xMikKc3RvcGlmbm90KEVxKEFJQyhhbm9yZXguMSksIGFub3JleC4xJGFpYyksCgkgIEVxKEFJQyhnMSksIGcxJGFpYyksCgkgIEVxKEFJQyhnMiksIGcyJGFpYykpCiMjIG5leHQgd2FzIHdyb25nIGluIDEuNC4xCnggPC0gMToxMApsbXggPC0gbG9nTGlrKGxtKHggfiAxKSk7IGdsbXggPC0gbG9nTGlrKGdsbSh4IH4gMSkpCnN0b3BpZm5vdChhbGwuZXF1YWwoYXMudmVjdG9yKGxteCksIGFzLnZlY3RvcihnbG14KSksCgkgIGFsbC5lcXVhbChhdHRyKGxteCwgJ2RmJyksIGF0dHIoZ2xteCwgJ2RmJykpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBnbG0uUmQgYW5kIGxvZ0xpay5nbG0uUmQKCgojIyBIeXBlcmJvbGljCnggPC0gc2VxKC0zLCAzLCBsZW49MjAwKQpzdG9waWZub3QoCiBhYnMoY29zaCh4KSAtIChleHAoeCkgKyBleHAoLXgpKS8yKSA8IDIwKk1lcHMsCiBhYnMoc2luaCh4KSAtIChleHAoeCkgLSBleHAoLXgpKS8yKSA8IDIwKk1lcHMsCiBhYnModGFuaCh4KSpjb3NoKHgpIC0gc2luaCh4KSkgPCAyMCpNZXBzCikKCnN0b3BpZm5vdChhYnMoYXNpbmgoc2luaCh4KSkgLSB4KSA8IDIwKk1lcHMpCnN0b3BpZm5vdChhYnMoYWNvc2goY29zaCh4KSkgLSBhYnMoeCkpIDwgMTAwMCpNZXBzKSAjLSBpbXByZWNpc2UgZm9yIHNtYWxsIHgKc3RvcGlmbm90KGFicyhhdGFuaCh0YW5oKHgpKSAtIHgpIDwgMTAwKk1lcHMpCgpzdG9waWZub3QoYWJzKGFzaW5oKHgpIC0gbG9nKHggKyBzcXJ0KHheMiArIDEpKSkgPCAxMDAqTWVwcykKY3ggPC0gY29zaCh4KQpzdG9waWZub3QoYWJzKGFjb3NoKGN4KSAtIGxvZyhjeCArIHNxcnQoY3heMiAtIDEpKSkgPCAxMDAwKk1lcHMpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIEh5cGVyYm9saWMuUmQKCgojIyBpbWFnZQojIyBEZWdlbmVyYXRlLCBzaG91bGQgc3RpbGwgd29yawppbWFnZShhcy5tYXRyaXgoMSkpCmltYWdlKG1hdHJpeChwaSwyLDQpKQp4IDwtIHNlcSgwLDEsbGVuPTEwMCkKaW1hZ2UoeCwgMSwgbWF0cml4KHgpLCBjb2w9aGVhdC5jb2xvcnMoMTApKQppbWFnZSh4LCAxLCBtYXRyaXgoeCksIGNvbD1oZWF0LmNvbG9ycygxMCksIG9sZHN0eWxlID0gVFJVRSkKaW1hZ2UoeCwgMSwgbWF0cml4KHgpLCBjb2w9aGVhdC5jb2xvcnMoMTApLCBicmVha3MgPSBzZXEoMC4xLDEuMSxsZW49MTEpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBpbWFnZS5SZAoKCiMjIGludGVncmF0ZQooaWkgPC0gaW50ZWdyYXRlKGRub3JtLCAtMS45NiwgMS45NikpCihpMSA8LSBpbnRlZ3JhdGUoZG5vcm0sIC1JbmYsIEluZikpCnN0b3BpZm5vdChhbGwuZXF1YWwoMC45NTAwMDQyMDk3LCBpaSR2YWwsIHRvbCA9IGlpJGFicy5lcnIsIHNjYWxlPTEpLAoJICBhbGwuZXF1YWwoIDEsCQkgIGkxJHZhbCwgdG9sID0gaTEkYWJzLmVyciwgc2NhbGU9MSkpCgppbnRlZ3JhbmQgPC0gZnVuY3Rpb24oeCkgezEvKCh4KzEpKnNxcnQoeCkpfQooaWkgPC0gaW50ZWdyYXRlKGludGVncmFuZCwgbG93ZXIgPSAwLCB1cHBlciA9IEluZiwgcmVsLnRvbCA9IDFlLTEwKSkKc3RvcGlmbm90KGFsbC5lcXVhbChwaSwgaWkkdmFsLCB0b2wgPSBpaSRhYnMuZXJyLCBzY2FsZT0xKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gaW50ZWdyYXRlLlJkCgoKIyMgaXMuZmluaXRlCiggd2VpcmQudmFsdWVzIDwtIGMoLTIwLjkvMCwgMS8wLCAwLzAsIE5BKSApCgpNbWF4IDwtIC5NYWNoaW5lJGRvdWJsZS54bWF4Ck1taW4gPC0gLk1hY2hpbmUkZG91YmxlLnhtaW4KKCBYLnZhbCA8LSBjKE1taW4qYygyXigtMTA6MyksMWU1LDFlMTApLAoJICAgICBNbWF4KmMoMWUtMTAsMWUtNSwyXigtMzowKSwxLjAwMSkpICkKKCB0c3QudmFsIDwtIHNvcnQoYyhYLnZhbCwgd2VpcmQudmFsdWVzKSwgbmEubGFzdCA9IFRSVUUpICkKKCB4MiA8LSBjKC0xOjEvMCxwaSwxLE5BKSApCiggejIgPC0gYyh4MiwgMSsxaSwgSW5mIC1JbmYqIDFpKSApCgppcy5pbmYgPC0KICBmdW5jdGlvbih4KSAoaXMubnVtZXJpYyh4KSB8fCBpcy5jb21wbGV4KHgpKSAmJiAhaXMubmEoeCkgJiYgIWlzLmZpbml0ZSh4KQoKZm9yKHggaW4gbGlzdCh0c3QudmFsLCB4MiwgejIpKQogIHByaW50KGNiaW5kKGZvcm1hdCh4KSwgaXMuaW5maW5pdGU9Zm9ybWF0KGlzLmluZmluaXRlKHgpKSksIHF1b3RlPUZBTFNFKQoKcmJpbmQoaXMubmFuKHRzdC52YWwpLAogICAgICBpcy5uYSAodHN0LnZhbCkpCnRzdC52YWwgWyBpcy5uYW4odHN0LnZhbCkgIT0gIGlzLm5hKHRzdC52YWwpIF0KCnN0b3BpZm5vdCgKICAgIGlzLm5hKDAvMCksCiAgICAhaXMubmEoSW5mKSwKICAgIGlzLm5hbigwLzApLAoKICAgICFpcy5uYW4oTkEpCSAmJiAgIWlzLmluZmluaXRlKE5BKSAgJiYgIWlzLmZpbml0ZShOQSksCiAgICAgaXMubmFuKE5hTikgJiYgICFpcy5pbmZpbml0ZShOYU4pICYmICFpcy5maW5pdGUoTmFOKSwKICAgICFpcy5uYW4oYygxLE5BKSksCiAgICBjKEZBTFNFLFRSVUUsRkFMU0UpID09IGlzLm5hbihjICAgKDEsTmFOLE5BKSkKKQphc3NlcnRFcnJvcihpcy5uYW4obGlzdCgxLE5hTixOQSkpKSAjLT4gcmVzdWx0IGFsbG93ZWQgYnV0IHZhcmllcyBpbiBvbGRlciB2ZXJzaW9ucwoKCnN0b3BpZm5vdChpZGVudGljYWwobGdhbW1hKEluZiksIEluZikpCnN0b3BpZm5vdChpZGVudGljYWwoSW5mICsgSW5mLCBJbmYpKQpzdG9waWZub3QoaWRlbnRpY2FsKEluZiAtIEluZiwgTmFOKSkKc3RvcGlmbm90KGlkZW50aWNhbCgoMS8wKSAqICgxLzApLCBJbmYpKQpzdG9waWZub3QoaWRlbnRpY2FsKCgxLzApIC8gKDEvMCksIE5hTikpCnN0b3BpZm5vdChpZGVudGljYWwoZXhwKC1JbmYpLCAwKSkKc3RvcGlmbm90KGlkZW50aWNhbChsb2coMCksIC1JbmYpKQpzdG9waWZub3QoaWRlbnRpY2FsKCgtMSkvMCwgLUluZikpCnBtIDwtIGMoLTEsMSkgIyAncG0nID0gcGx1cy9taW51cwpzdG9waWZub3QoYXRhbihJbmYqcG0pID09IHBtKnBpLzIpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGlzLmZpbml0ZS5SZAoKCiMjIGtyb25lY2tlcgooIE0gPC0gbWF0cml4KDE6NiwgbmNvbD0yKSApCnN0b3BpZm5vdChrcm9uZWNrZXIoNCwgTSk9PTQgKiBNKQojIEJsb2NrIGRpYWdvbmFsIG1hdHJpeDoKc3RvcGlmbm90KGtyb25lY2tlcihkaWFnKDEsIDMpLCBNKSA9PSBkaWFnKDEsIDMpICV4JSBNKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBrcm9uZWNrZXIuUmQKCgojIyBsaXN0CnN0cihwbCA8LSBhcy5wYWlybGlzdChwcy5vcHRpb25zKCkpKQoKIyMgVGhlc2UgYXJlIGFsbCBUUlVFOgpzdG9waWZub3QoaXMubGlzdChwbCkgJiYgaXMucGFpcmxpc3QocGwpLAogICAgICAgICAgIWlzLm51bGwobGlzdCgpKSwKICAgICAgICAgIGlzLm51bGwocGFpcmxpc3QoKSksCiAgICAgICAgICAhaXMubGlzdChOVUxMKSwKICAgICAgICAgIGlzLnBhaXJsaXN0KHBhaXJsaXN0KCkpLAogICAgICAgICAgaXMubnVsbChhcy5wYWlybGlzdChsaXN0KCkpKSwKICAgICAgICAgIGlzLm51bGwoYXMucGFpcmxpc3QoTlVMTCkpCiAgICAgICAgICApCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGxpc3QuUmQKCgojIyBsb2cKc3RvcGlmbm90KGFsbC5lcXVhbChsb2coMToxMCksIGxvZygxOjEwLCBleHAoMSkpKSkKc3RvcGlmbm90KGFsbC5lcXVhbChsb2cxMCgzMCksIGxvZygzMCwgMTApKSkKc3RvcGlmbm90KGFsbC5lcXVhbChsb2cyKDJecGkpLCAyXmxvZzIocGkpKSkKc3RvcGlmbm90KE1vZChwaSAtIGxvZyhleHAocGkqMWkpKSAvIDFpKSA8IDEwKiBNZXBzKQpzdG9waWZub3QoTW9kKDErZXhwKHBpKjFpKSkgPCAxMCogTWVwcykKIyMgZW5kIG9mIG1vdmVkIGZyb20gTG9nLlJkCgoKIyMgbG9naXN0aWMKZXBzIDwtIDEwMCAqIE1lcHMKeCA8LSBjKDA6NCwgcmxvZ2lzKDEwMCkpCnN0b3BpZm5vdChhbGwuZXF1YWwocGxvZ2lzKHgpLAkxIC8gKDEgKyBleHAoLXgpKSwgdG9sID0gZXBzKSkKc3RvcGlmbm90KGFsbC5lcXVhbChwbG9naXMoeCwgbG93ZXI9RkFMU0UpLCAgZXhwKC14KS8gKDEgKyBleHAoLXgpKSwgdG9sID0gZXBzKSkKc3RvcGlmbm90KGFsbC5lcXVhbChwbG9naXMoeCwgbG93ZXI9RkFMU0UsIGxvZz1UUlVFKSwgLWxvZygxICsgZXhwKHgpKSwKCQkgICAgdG9sID0gZXBzKSkKc3RvcGlmbm90KGFsbC5lcXVhbChkbG9naXMoeCksIGV4cCh4KSAqICgxICsgZXhwKHgpKV4tMiwgdG9sID0gZXBzKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gTG9naXN0aWMuUmQKCgojIyBMb2dub3JtYWwKeCA8LSBybG5vcm0oMTAwMCkJIyBub3QgeWV0IGFsd2F5cyA6CnN0b3BpZm5vdChhYnMoeAkgLSAgcWxub3JtKHBsbm9ybSh4KSkpIDwgMWU0ICogTWVwcyAqIHgpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIExvZ25vcm1hbC5SZAoKCiMjIGxvd2VyLnRyaQptYSA8LSBtYXRyaXgoMToyMCwgNCwgNSkKc3RvcGlmbm90KGxvd2VyLnRyaShtYSkgPT0gIXVwcGVyLnRyaShtYSwgZGlhZz1UUlVFKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gbG93ZXIudHJpLlJkCgoKIyMgbWFrZS5uYW1lcwpzdG9waWZub3QobWFrZS5uYW1lcyhsZXR0ZXJzKSA9PSBsZXR0ZXJzKQojIyBlbmQgb2YgbWFrZS5uYW1lcwoKCiMjIG1lYW4KeCA8LSBjKDA6MTAsIDUwKQpzdG9waWZub3QoYWxsLmVxdWFsKG1lYW4oeCwgdHJpbSA9IDAuNSksIG1lZGlhbih4KSkpCiMjIG1vdmVkIGZyb20gbWVhbi5SZAoKCiMjIE11bHRpbm9tCk4gPC0gMjAKcHIgPC0gYygxLDMsNiwxMCkgIyBub3JtYWxpemF0aW9uIG5vdCBuZWNlc3NhcnkgZm9yIGdlbmVyYXRpb24Kc2V0LnNlZWQoMTUzKQpyciA8LSBybXVsdGlub20oNTAwMCwgTiwgcHJvYiA9IHByKQpzdG9waWZub3QoY29sU3VtcyhycikgPT0gTikKKG0gPC0gcm93TWVhbnMocnIpKQphbGwuZXF1YWwobSwgTiAqIHByL3N1bShwcikpICMgcmVsLmVycm9yIH4wLjAwMwpzdG9waWZub3QobWF4KGFicyhtLyhOKnByL3N1bShwcikpIC0gMSkpIDwgMC4wMSkKCihQciA8LSBkbXVsdGlub20oYygwLDAsMyksIHByb2IgPSBjKDEsIDEsIDE0KSkpCnN0b3BpZm5vdChhbGwuZXF1YWwoUHIsIGRiaW5vbSgzLCAzLCBwID0gMTQvMTYpKSkKClggPC0gdChhcy5tYXRyaXgoZXhwYW5kLmdyaWQoMDozLCAwOjMpKSkKWCA8LSBYWywgY29sU3VtcyhYKSA8PSAzXQpYIDwtIHJiaW5kKFgsIDM6MyAtIGNvbFN1bXMoWCkpCmZvcihwIGluIGxpc3QoYygxLDIsNSksIDE6MywgMzoxLCAyOjAsIDA6MiwgYygxLDIsMSksIGMoMCwwLDEpKSkgewogIHB4IDwtIGFwcGx5KFgsIDIsIGZ1bmN0aW9uKHgpIGRtdWx0aW5vbSh4LCBwcm9iID0gcCkpCiAgc3RvcGlmbm90KGFsbC5lcXVhbChzdW0ocHgpLCAxKSkKfQojIyBlbmQgb2YgbW92ZWQgZnJvbSBNdWx0aW5vbS5SZAoKCiMjIFBvaXNzb24KZHBvaXMoYygwLCAxLCAwLjE3LCAwLjc3KSwgMSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gUG9pc3Nvbi5SZAoKCiMjIHFyCiMjIHRlc3RzIG9mIGNvbXBsZXggY2FzZQpzZXQuc2VlZCgxKQpBIDwtIG1hdHJpeChybm9ybSgyNSksIDUsIDUsIGRpbW5hbWVzPWxpc3QoMTo1LCBsZXR0ZXJzWzE6NV0pKQpxci5zb2x2ZShBLCAxOjUpCkFbXSA8LSBhcy5jb21wbGV4KEEpCnFyLmNvZWYocXIoQSksIDE6NSkKcXIuc29sdmUoQSwgMTo1KQoKIyMgY2hlY2sgZm9yIHJhbmstZGVmaWNpZW50IGNhc2VzClggPC0gY2JpbmQoMTozLCAxOjMsIDEpCnN0b3BpZm5vdChhbGwuZXF1YWwocXIuWChxcihYKSksIFgpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBxci5SZAoKCiMjIHFyYXV4CnAgPC0gbmNvbCh4IDwtIExpZmVDeWNsZVNhdmluZ3NbLC0xXSkgIyBub3QgdGhlIGBzcicKcXJzdHIgPC0gcXIoeCkJICMgZGltKHgpID09IGMobixwKQpRIDwtIHFyLlEocXJzdHIpICMgZGltKFEpID09IGRpbSh4KQpSIDwtIHFyLlIocXJzdHIpICMgZGltKFIpID09IG5jb2woeCkKWCA8LSBxci5YKHFyc3RyKSAjIFggPT0geApzdG9waWZub3QoYWxsLmVxdWFsKFgsCWFzLm1hdHJpeCh4KSkpCgojIyBYID09IFEgJSolIFIgOgpzdG9waWZub3QoKDEgLSBYIC8oIFEgJSolIFIpKTwgMTAwKk1lcHMpCgpkaW0oUWMgPC0gcXIuUShxcnN0ciwgY29tcGxldGU9VFJVRSkpICMgU3F1YXJlOiBkaW0oUWMpID09IHJlcChucm93KHgpLDIpCnN0b3BpZm5vdCgoY3Jvc3Nwcm9kKFFjKSAtIGRpYWcobnJvdyh4KSkpIDwgMTAqTWVwcykKClFEIDwtIHFyLlEocXJzdHIsIEQ9MTpwKSAgICAgICMgUUQgPT0gUSBcJSpcJSBkaWFnKDE6cCkKc3RvcGlmbm90KFFEIC0gUSAlKiUgZGlhZygxOnApCTwgOCogTWVwcykKCmRpbShSYyA8LSBxci5SKHFyc3RyLCBjb21wbGV0ZT1UUlVFKSkgIyA9PSBkaW0oeCkKZGltKFhjIDwtIHFyLlgocXJzdHIsIGNvbXBsZXRlPVRSVUUpKSAjIHNxdWFyZTogbnJvdyh4KSBeIDIKZGltbmFtZXMoWCkgPC0gTlVMTApzdG9waWZub3QoYWxsLmVxdWFsKFhjWywxOnBdLCBYKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gcXJhdXguUmQKCgojIyBxdWFudGlsZQp4IDwtIHJub3JtKDEwMDEpCm4gPC0gbGVuZ3RoKHgpICMjIHRoZSBmb2xsb3dpbmcgaXMgZXhhY3QsIGJlY2F1c2UgMS8oMTAwMS0xKSBpcyBleGFjdDoKc3RvcGlmbm90KHNvcnQoeCkgPT0gcXVhbnRpbGUoeCwgcHJvYnMgPSAoKDE6biktMSkvKG4tMSksIG5hbWVzPUZBTFNFKSkKCm4gPC0gNzc3Cm94IDwtIHNvcnQoeCA8LSByb3VuZChybm9ybShuKSwxKSkjIHJvdW5kKCkgcHJvZHVjZXMgdGllcwpveCA8LSBjKG94LCBveFtuXSkgIy0gc3VjaCB0aGF0IG94W24rMV0gOj0gb3hbbl0KcCA8LSBjKDAsMSxydW5pZigxMDApKQppIDwtIGZsb29yKHIgPC0gMSArIChuLTEpKnApCmYgPC0gciAtIGkKc3RvcGlmbm90KGFicyhxdWFudGlsZSh4LHApIC0gKCgxLWYpKm94W2ldICsgZipveFtpKzFdKSkgPCAyMCpNZXBzKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBxdWFudGlsZS5SZAoKCiMjIHJlcApzdG9waWZub3QoaWRlbnRpY2FsKHJlcChsZXR0ZXJzLCAwKSwgY2hhcmFjdGVyKDApKSwKCSAgaWRlbnRpY2FsKHJlcC5pbnQoMToyLCAwKSwgaW50ZWdlcigwKSkpCgpzdG9waWZub3Qoc3VtKDE6OCkgPT0gbGVuZ3RoKHJlcCgxOjQsIDE6OCwgZWFjaD0yKSkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIHJlcC5SZAoKCiMjIFJvdW5kCngxIDwtIHNlcSgtMiwgNCwgYnkgPSAuNSkKbm9uLmludCA8LSBjZWlsaW5nKHgxKSAhPSBmbG9vcih4MSkKc3RvcGlmbm90KAogdHJ1bmMoeDEpID09IGFzLmludGVnZXIoeDEpLAogbm9uLmludCA9PSAoY2VpbGluZyh4MSkgIT0gdHJ1bmMoeDEpIHwgdHJ1bmMoeDEpICE9IGZsb29yKHgxKSksCiAoc2lnbmlmKHgxLCAxKSAhPSByb3VuZCh4MSwxKSkgPT0gKG5vbi5pbnQgJiBhYnMoeDEpID4gMSkKKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBSb3VuZC5SZAoKCiMjIHNlcQpzdG9waWZub3QoCiAzID09IHNlcSgzLDMsCWJ5PXBpKSwKIDMgPT0gc2VxKDMsMy4xLGJ5PXBpKSwKIHNlcSgxLDYsYnk9MykgPT0gYygxLDQpLAogc2VxKDEwLDQuMDUsYnk9LTMpID09IGMoMTAsNykKKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBzZXEuUmQKCgojIyBzb3J0CnggPC0gc3dpc3MkRWR1Y2F0aW9uWzE6MjVdCnN0b3BpZm5vdCghaXMudW5zb3J0ZWQoc29ydCh4KSksCgkgICFpcy51bnNvcnRlZChMRVRURVJTKSwKCSAgIGlzLnVuc29ydGVkKGMoTkEsMTozLDIpLCBuYS5ybSA9IFRSVUUpKQoKZm9yKG4gaW4gMToyMCkgewogICAgeiA8LSBybm9ybShuKQogICAgZm9yKHggaW4gbGlzdCh6LCByb3VuZCh6LDEpKSkgeyAjIyAybmQgb25lIGhhcyB0aWVzCiAgICAgICBxeGkgPC0gc29ydCh4LCAgbWV0aG9kID0gInF1aWNrIiwgIGluZGV4LnJldHVybiA9IFRSVUUpCiAgICAgICBzdG9waWZub3QocXhpJHggPT0gc29ydCh4LCBtZXRob2QgPSAic2hlbGwiKSwKCQkgYW55KGR1cGxpY2F0ZWQoeCkpIHx8IGFsbChxeGkkaXggPT0gb3JkZXIoeCkpLAoJCSB4W3F4aSRpeF0gPT0gcXhpJHgpCiAgIH0KfQojIyBlbmQgb2YgbW92ZWQgZnJvbSBzb3J0LlJkCgoKIyMgc3Vic3RyCnNzIDwtIHN1YnN0cmluZygiYWJjZGVmIiwxOjYsMTo2KQpzdG9waWZub3Qoc3MgPT0gc3Ryc3BsaXQgKCJhYmNkZWYiLE5VTEwpW1sxXV0pCnggPC0gYygiYXNmZWYiLCAicXdlcnR5IiwgInl1aW9wWyIsICJiIiwgInN0dWZmLmJsYWgueWVjaCIpCnN0b3BpZm5vdChzdWJzdHIoeCwgMiwgNSkgPT0gc3Vic3RyaW5nKHgsIDIsIDUpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBzdWJzdHIuUmQKCgojIyBzdmQKaGlsYmVydCA8LSBmdW5jdGlvbihuKSB7IGkgPC0gMTpuOyAxIC8gb3V0ZXIoaSAtIDEsIGksICIrIikgfQpzdHIoWCA8LSBoaWxiZXJ0KDkpWywxOjZdKQpzdHIocyA8LSBzdmQoWCkpCkVwcyA8LSAxMDAgKiBNZXBzCgpEIDwtIGRpYWcocyRkKQpzdG9waWZub3QoYWJzKFggLSBzJHUgJSolIEQgJSolIHQocyR2KSkgPCBFcHMpIwkgWCA9IFUgRCBWJwpzdG9waWZub3QoYWJzKEQgLSB0KHMkdSkgJSolIFggJSolIHMkdikgPCBFcHMpIwkgRCA9IFUnIFggVgoKWCA8LSBjYmluZCgxLCAxOjcpCnN0cihzIDwtIHN2ZChYKSk7IEQgPC0gZGlhZyhzJGQpCnN0b3BpZm5vdChhYnMoWCAtIHMkdSAlKiUgRCAlKiUgdChzJHYpKSA8IEVwcykjCSBYID0gVSBEIFYnCnN0b3BpZm5vdChhYnMoRCAtIHQocyR1KSAlKiUgWCAlKiUgcyR2KSA8IEVwcykjCSBEID0gVScgWCBWCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIHN2ZC5SZAoKCiMjIFRyaWcKIyMgbWFueSBvZiB0aGVzZSB0ZXN0ZWQgZm9yIG1hY2hpbmUgYWNjdXJhY3ksIHdoaWNoIHNlZW1zIGEgYml0IGV4dHJlbWUKc2V0LnNlZWQoMTIzKQpzdG9waWZub3QoY29zKDApID09IDEpCnN0b3BpZm5vdChzaW4oMypwaS8yKSA9PSBjb3MocGkpKQp4IDwtIHJub3JtKDk5KQpzdG9waWZub3QoYWxsLmVxdWFsKCBzaW4oLXgpLCAtIHNpbih4KSkpCnN0b3BpZm5vdChhbGwuZXF1YWwoIGNvcygteCksIGNvcyh4KSkpCnggPC0gYWJzKHgpOyB5IDwtIGFicyhybm9ybSh4KSkKc3RvcGlmbm90KGFicyhhdGFuMih5LCB4KSAtIGF0YW4oeS94KSkgPCAxMCAqIE1lcHMpCnN0b3BpZm5vdChhYnMoYXRhbjIoeSwgeCkgLSBhdGFuKHkveCkpIDwgMTAgKiBNZXBzKQoKeCA8LSAxOjk5LzEwMApzdG9waWZub3QoTW9kKDEgLSAoY29zKHgpICsgMWkqc2luKHgpKSAvIGV4cCgxaSp4KSkgPCAxMCAqIE1lcHMpCiMjIGVycm9yIGlzIGFib3V0IDY1MCogYXQgeD0wLjAxOgpzdG9waWZub3QoYWJzKDEgLSB4IC8gYWNvcyhjb3MoeCkpKSA8IDEwMDAgKiBNZXBzKQpzdG9waWZub3QoYWJzKDEgLSB4IC8gYXNpbihzaW4oeCkpKSA8PSAxMCAqIE1lcHMpCnN0b3BpZm5vdChhYnMoMSAtIHggLyBhdGFuKHRhbih4KSkpIDw9IDEwICpNZXBzKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBUcmlnLlJkCgojIyBVbmlmb3JtCnUgPC0gcnVuaWYoMjApCnN0b3BpZm5vdChwdW5pZih1KSA9PSB1LCBkdW5pZih1KSA9PSAxLAoJICBydW5pZigxMDAsIDIsMikgPT0gMikjLT4gVFJVRSBbYnVnIGluIFIgdmVyc2lvbiA8PSAwLjYzLjFdCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIFVuaWZvcm0uUmQKCgojIyB1bmlxdWUKbXkudW5pcXVlIDwtIGZ1bmN0aW9uKHgpIHhbIWR1cGxpY2F0ZWQoeCldCmZvcihpIGluIDE6NCkKIHsgeCA8LSBycG9pcygxMDAsIHBpKTsgc3RvcGlmbm90KHVuaXF1ZSh4KSA9PSBteS51bmlxdWUoeCkpIH0KCnVuaXF1ZShpcmlzKQpzdG9waWZub3QoZGltKHVuaXF1ZShpcmlzKSkgPT0gYygxNDksIDUpKQojIyBlbmQgb2YgbW92ZWQgZnJvbSB1bmlxdWUuUmQKCgojIyB3aGljaC5taW4Kc3RvcGlmbm90KGxlbmd0aCh3aGljaC5taW4obnVtZXJpYygwKSkpID09IDApCnN0b3BpZm5vdChsZW5ndGgod2hpY2gubWF4KCBjKE5BLE5BKSApKSA9PSAwKQojIyBlbmQgb2YgbW92ZWQgZnJvbSB3aGljaC5taW4uUmQKCgojIyBXaWxjb3hvbgp4IDwtIC0xOig0KjYgKyAxKQpmeCA8LSBkd2lsY294KHgsIDQsIDYpCnN0b3BpZm5vdChmeCA9PSBkd2lsY294KHgsIDYsIDQpKQpGeCA8LSBwd2lsY294KHgsIDQsIDYpCnN0b3BpZm5vdChhYnMoRnggLSBjdW1zdW0oZngpKSA8IDEwICogTWVwcykKIyMgZW5kIG9mIG1vdmVkIGZyb20gV2lsY294b24uUmQKCgojIyBBbGwgdGhlIGZvbGxvd2luZyByZWxhdGlvbnMgbXVzdCBob2xkIDoKc3RvcGlmbm90KAogMSArCSBNZXBzICE9IDEsCiAxICsgLjUqIE1lcHMgPT0gMSwKIGxvZzIoLk1hY2hpbmUkZG91YmxlLnhtYXgpID09IC5NYWNoaW5lJGRvdWJsZS5tYXguZXhwLAogbG9nMiguTWFjaGluZSRkb3VibGUueG1pbikgPT0gLk1hY2hpbmUkZG91YmxlLm1pbi5leHAKKQojIFRoaXMgdGVzdCBmYWlsZWQgb24gSFAtVVggc2luY2UgcG93KDIsMTAyNCkgcmV0dXJucyBEQkxfTUFYIGFuZCBzZXRzCiMgZXJybm8gPSBFUkFOR0UuICBNb3N0IG90aGVyIHN5c3RlbXMgcmV0dXJuIEluZiBhbmQgc2V0IGVycm5vCnN0b3BpZm5vdChpcy5pbmZpbml0ZSguTWFjaGluZSRkb3VibGUuYmFzZSBeIC5NYWNoaW5lJGRvdWJsZS5tYXguZXhwKSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gek1hY2hpbmUuUmQKCgojIyBQUiA2NDAgKGRpZmYuZGVmYXVsdCBjb21wdXRlcyBhbiBpbmNvcnJlY3Qgc3RhcnRpbmcgdGltZSkKIyMgQnk6IExhaW1vbmlzIEthdmFsaWVyaXMgPGxrYXZhbGllcmlzQG1hdGhzLm90YWdvLmFjLm56Pgp5IDwtIHRzKHJub3JtKDI0KSwgZnJlcT0xMikKeCA8LSB0cyhybm9ybSgyNCksIGZyZXE9MTIpCmFyaW1hMCh5LCB4cmVnID0geCwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyPWMoMCwxLDApKSkKIyMgQ29tbWVudHM6CgoKIyMgUFIgNjQ0IChjcmFzaCB1c2luZyBmaXNoZXIudGVzdCBvbiBXaW5kb3dzKQojIyBCeTogVXdlIExpZ2dlcyA8bGlnZ2VzQHN0YXRpc3Rpay51bmktZG9ydG11bmQuZGU+CnggPC0gbWF0cml4KGMoMiwgMiwgNCwgOCwgNiwgMCwgMSwgMSwgNywgOCwgMSwgMywgMSwgMywgNywgNCwgMiwgMiwgMiwKCSAgICAgIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDAsIDEsIDEsIDAsIDIsIDEsIDAsIDAsIDApLAoJICAgIG5jID0gMikKZmlzaGVyLnRlc3QoeCkKIyMgQ29tbWVudHM6ICh3YXNuJ3QganVzdCBvbiBXaW5kb3dzKQoKIyMgUFIgNjUzIChleHRyYXBvbGF0aW9uIGluIHNwbGluZSkKIyMgQnk6IElhbiBXaGl0ZSA8aW1zd0Bob2x5cm9vZC5lZC5hYy51az4KeCA8LSBjKDIsNSw4LDEwKQp5IDwtIGMoMS4yMjY2LC0xLjc2MDYsLTAuNTA1MSwxLjAzOTApCmZuIDwtIHNwbGluZWZ1bih4LCB5LCBtZXRob2Q9Im5hdHVyYWwiKQp4eDEgPC0gZm4oMDoxMikKIyBzaG91bGQgYmUgdGhlIHNhbWUgaWYgcmVmbGVjdGVkCmZuIDwtIHNwbGluZWZ1bihyZXYoLXgpLHJldih5KSxtZXRob2Q9Im5hdHVyYWwiKQp4eDIgPC0gZm4oMDotMTIpCnN0b3BpZm5vdChhbGwuZXF1YWwoeHgxLCB4eDIpKQojIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbnRlcnBTcGxpbmUKbGlicmFyeShzcGxpbmVzKQp4eDMgPC0gcHJlZGljdChpbnRlcnBTcGxpbmUoeCwgeSksIDA6MTIpCnN0b3BpZm5vdChhbGwuZXF1YWwoeHgxLCB4eDMkeSkpCnVubG9hZE5hbWVzcGFjZSgic3BsaW5lcyIpCiMjIENvbW1lbnRzOiBhbGwgdGhyZWUgZGlmZmVyZWQgaW4gMS4yLjEuCgoKIyMgUFIgNjk4IChwcmludCBwcm9ibGVtIHdpdGggZGF0YSBmcmFtZXMpCiMjIGFjdHVhbGx5LCBhIHN1YnNldHRpbmcgcHJvYmxlbSB3aXRoIGRhdGEgZnJhbWVzCmZyZWQgPC0gZGF0YS5mcmFtZShoYXBweT1jKFRSVUUsIEZBTFNFLCBUUlVFKSwgc2FkPTc6OSkKeiA8LSB0cnkodG1wIDwtIGZyZWRbYyhGQUxTRSwgRkFMU0UsIFRSVUUsIFRSVUUpXSkKc3RvcGlmbm90KGNsYXNzKHopID09ICJ0cnktZXJyb3IiKQojIyBDb21tZW50czogTm8gZXJyb3IgYmVmb3JlIDEuMi4xCgoKIyMgUFIgNzUzIChzdGVwIGNhbid0IGZpbmQgdmFyaWFibGVzKQojIwp4IDwtIGRhdGEuZnJhbWUoYT1ybm9ybSgxMCksIGI9cm5vcm0oMTApLCBjPXJub3JtKDEwKSkKeDAubG0gPC0gbG0oYSB+IDEsIGRhdGE9eCkKc3RlcCh4MC5sbSwgfiBiICsgYykKIyMgQ29tbWVudHM6CgoKIyMgUFIgNzk2IChhaWMgaW4gYmlub21pYWwgbW9kZWxzIGlzIG9mdGVuIHdyb25nKQojIwphMSA8LSBnbG0oY2JpbmQobmNhc2VzLCBuY29udHJvbHMpIH4gYWdlZ3AgKyB0b2JncCAqIGFsY2dwLAoJICBkYXRhID0gZXNvcGgsIGZhbWlseSA9IGJpbm9taWFsKCkpJGFpYwphMQphMiA8LSBnbG0obmNhc2VzLyhuY2FzZXMrbmNvbnRyb2xzKSB+IGFnZWdwICsgdG9iZ3AgKiBhbGNncCwKCSAgZGF0YSA9IGVzb3BoLCBmYW1pbHkgPSBiaW5vbWlhbCgpLCB3ZWlnaHRzPW5jYXNlcytuY29udHJvbHMpJGFpYwphMgpzdG9waWZub3QoYWxsLmVxdWFsKGExLCBhMikpCiMjIENvbW1lbnRzOgojIGJvdGggc2hvdWxkIGJlIDIzNi45NjQ1CiMgY2hhbmdlZCB0byB1c2UgYWxsLmVxdWFsIHJhdGhlciB0aGFuID09IGluIDIuMS4wIC1wZAoKIyMgRm9sbG93IHVwOiBleGFtcGxlIGZyb20gTGluZHNleSwgcHVycG9ydGVkbHkgb2YgaW5hY2N1cmFjeSBpbiBhaWMKeSA8LSBtYXRyaXgoYygyLCAwLCA3LCAzLCAwLCA5KSwgbmNvbD0yKQp4IDwtIGdsKDMsIDEpCmEgPC0gZ2xtKHkgfiB4LCBmYW1pbHk9Ymlub21pYWwpJGFpYwpzdG9waWZub3QoaXMuZmluaXRlKGEpKQojIyBDb21tZW50czogZ2F2ZSBOYU4gcHJpb3IgdG8gMS4yLjEKCgojIyBQUiA4MDIgKGNyYXNoIHdpdGggc2NhbiguLi4sIHdoYXQ9bGlzdCgsLCkpKQojIwptIDwtIG1hdHJpeCgxOjksIDMsMykKd3JpdGUobSwgInRlc3QuZGF0IiwgMykKdHJ5KHNjYW4oInRlc3QuZGF0Iiwgd2hhdD1saXN0KCwsLCkpKQp1bmxpbmsoInRlc3QuZGF0IikKIyMgQ29tbWVudHM6IHNlZ2ZhdWx0ZWQgaW4gMS4yLjAKCgojIyBKb25hdGhhbiBSb3VnaWVyLCAyMDAxLTAxLTMwCSBbYnVnIGluIDEuMi4xIGFuZCBlYXJsaWVyXQp0bXAgPC0gYXJyYXkobGlzdCgzKSwgYygyLCAzKSkKdG1wW1syLCAzXV0gPC0gImZyZWQiCmFsbC5lcXVhbCh0KHRtcCksIGFwZXJtKHRtcCkpCgoKIyMgUFIgODYwIChDb250ZXh0IHByb2JsZW0gd2l0aCAuLi4gYW5kIHJiaW5kKSBQcm9mIEJyaWFuIEQgUmlwbGV5LCAyMDAxLTAzLTAzLApmIDwtIGZ1bmN0aW9uKHgsIC4uLikKewogICBnIDwtIGZ1bmN0aW9uKHgsIC4uLikgeAogICByYmluZChudW1lcmljKCksIGcoeCwgLi4uKSkKfQpmKDE6MykKIyMgRXJyb3IgaW4gMS4yLjIKZiA8LSBmdW5jdGlvbih4LCAuLi4pIGgoZyh4LCAuLi4pKQpnIDwtIGZ1bmN0aW9uKHgsIC4uLikgeApoIDwtIGZ1bmN0aW9uKC4uLilzdWJzdGl0dXRlKGxpc3QoLi4uKSkKZigxKQojIyBFcnJvciBpbiAxLjIuMgpzdWJzdGl0dXRlKGxpc3QoLi4uKSkKIyMgRXJyb3IgaW4gMS4yLjIKCgojIyBNYXJ0aW4gTWFlY2hsZXIsIDIwMDEtMDMtMDcgWzEuMi4yIGFuZCBpbiBwYXJ0cyBlYXJsaWVyXQp0ZiA8LSB0ZW1wZmlsZSgpCmNhdCgxOjMsIlxuIiwgZmlsZSA9IHRmKQpmb3IobGluZSBpbiBsaXN0KDQ6NiwgIiIsIDc6OSkpIGNhdChsaW5lLCJcbiIsIGZpbGUgPSB0ZiwgYXBwZW5kID0gVFJVRSkKCmNvdW50LmZpZWxkcyh0ZikgIyAzIDMgMyA6IG9rIHtibGFuayBsaW5lIHNraXBwZWR9CnogPC0gc2Nhbih0Ziwgd2hhdD1yZXAobGlzdCgiIiksMyksIG5tYXggPSAzKQpzdG9waWZub3Qoc2FwcGx5KHosIGxlbmd0aCkgPT0gMykKIyMgRkFMU0UgaW4gMS4yLjIKeiA8LSBhcy5kYXRhLmZyYW1lKHNjYW4odGYsIHdoYXQ9cmVwKGxpc3QoIiIpLDMpLCBuPTkpKQpkaW0oeikKIyMgc2hvdWxkIGJlIDMgMy4gIFdhcyAyIDMgaW4gMS4yLjIuCnJlYWQudGFibGUodGYpCiMjIGdhdmUgZXJyb3IgaW4gMS4yLjIKdW5saW5rKHRmKQoKCiMjIFBSIDg3MCAoYXMubnVtZXJpYyBhbmQgTkFzKQlIYXJhbGQgRmVrauZyLCAyMDAxLTAzLTA4LAppcy5uYShhcy5udW1lcmljKCIgIikpCmlzLm5hKGFzLmludGVnZXIoIiAiKSkKaXMubmEoYXMuY29tcGxleCgiICIpKQojIyBhbGwgZmFsc2UgaW4gMS4yLjIKCgojIyBQUiA4NzEgKGRlcGFyc2luZyBvZiBhdHRyaWJ1dGUgbmFtZXMpIEhhcmFsZCBGZWtq5nIsIDIwMDEtMDMtMDgsCm1pZGwgPC0gNAphdHRyKG1pZGwsIk9iamVjdCBjcmVhdGVkIikgPC0gZGF0ZSgpCmRlcGFyc2UobWlkbCkKZHVtcCgibWlkbCIsICJtaWRsLlIiKQpzb3VyY2UoIm1pZGwuUiIpICMjIHN5bnRheCBlcnJvciBpbiAxLjIuMgp1bmxpbmsoIm1pZGwuUiIpCgoKIyMgUFIgODcyIChzdXJwcmlzaW5nIGJlaGF2aW9yIG9mIG1hdGNoLmFyZygpKSBXb29kcm93IFNldHplciwgMjAwMS0wMy0wOCwKZnVuMSA8LSBmdW5jdGlvbih4LCBBPWMoInBvd2VyIiwiY29uc3RhbnQiKSkgewogIGFyZyA8LSBtYXRjaC5hcmcoQSkKICBmb3JtYWxzKCkKfQp0b3BmdW4gPC0gZnVuY3Rpb24oeCwgRnVuPWZ1bjEpIHsKICBhMSA8LSBmdW4xKHgpCiAgcHJpbnQoYTEpCiAgYTIgPC0gRnVuKHgsQT0icG93ZXIiKQogIHN0b3BpZm5vdChhbGwuZXF1YWwoYTEsIGEyKSkKICBwcmludChhMikKfQp0b3BmdW4oMiwgZnVuMSkKIyMgYTEgcHJpbnRlZCB3aXRob3V0IGRlZmF1bHRzIGluIDEuMi4yCgoKIyMgUFIgODczIChsb25nIGZvcm11bGFzIGluIHRlcm1zKCkpIEplcm9tZSBBc3NlbGluLCAyMDAxLTAzLTA4LApmb3JtIDwtIGNiaW5kKGxvZyhpbmZsb3dkMSksbG9nKGluZmxvd2QyKSxsb2coaW5mbG93ZDMpLAogICAgbG9nKGluZmxvd2Q0KSxsb2coaW5mbG93ZDUpLGxvZyhpbmZsb3dkNikpIH4gcHJlY2lwKkkoVG1heF4yKQp0ZXJtcyhmb3JtKSAjIGVycm9yIGluIDEuMi4yCgoKIyMgUFIgODgxIEluY29ycmVjdCB2YWx1ZXMgaW4gbm9uLWNlbnRyYWwgY2hpc3EgdmFsdWVzIG9uIExpbnV4LCAyMDAxLTAzLTIxCnggPC0gZGNoaXNxKGMoNy4xLCA3LjIsIDcuMyksIGRmPTIsIG5jcD0yMCkKc3RvcGlmbm90KGRpZmYoeCkgPiAwKQojIyBvbiAxLjIuMiBvbiBSSDYuMiBpNjg2IExpbnV4IHggPSAwLjAxMTQwNTEyIDAuMDA4MDQ1MjggMC4wMTIxMDUxNAoKCiMjIFBSIDg4MiBlaWdlbiBzZWdmYXVsdHMgb24gMC1kaW1sIG1hdHJpY2VzLCAyMDAxLTAzLTIzCm0gPC0gbWF0cml4KDEsIDAsIDApICAjIDEgdG8gZm9yY2UgbnVtZXJpYyBub3QgbG9naWNhbAp0cnkoZWlnZW4obSkpCiMjIHNlZ2ZhdWx0cyBvbiAxLjIuMgoKCiMjIDEuMy4wIGhhZCBwb29yIGNvbXByZXNzaW9uIG9uIGd6ZmlsZSgpIHdpdGggbG90cyBvZiBzbWFsbCBwaWVjZXMuCnp6IDwtIGd6ZmlsZSgidDEuZ3oiLCAidyIpCndyaXRlKDE6MTAwMCwgenopCmNsb3NlKHp6KQooc3ogPC0gZmlsZS5pbmZvKCJ0MS5neiIpJHNpemUpCnVubGluaygidDEuZ3oiKQpzdG9waWZub3Qoc3ogPCAyMDAwKQoKCiMjIFBSIDEwMTA6IHBsb3QubXRzICh0eXBlPSJwIikgd2FzIGJyb2tlbiBpbiAxLjMuMCBhbmQgdGhpcyBjYWxsIGZhaWxlZC4KcGxvdCh0cyhtYXRyaXgocnVuaWYoMTApLCBuY29sID0gMikpLCB0eXBlID0gInAiKQoKCiMjIGluIDEuMy4wIHJlYWRMaW5lcyhvaz1GQUxTRSkgZmFpbGVkLgpjYXQoZmlsZT0iZm9vLnR4dCIsIDE6MTAsIHNlcD0iXG4iKQp4IDwtIHRyeShyZWFkTGluZXMoImZvby50eHQiLCAxMDAsIG9rPUZBTFNFKSkKdW5saW5rKCJmb28udHh0IikKc3RvcGlmbm90KGxlbmd0aChjbGFzcyh4KSkgPT0gMSAmJiBjbGFzcyh4KSA9PSAidHJ5LWVycm9yIikKCgojIyBQUiAxMDQ3IFs8LWRhdGEuZnJhbWUgZmFpbHVyZSwgQkRSIDIwMDEtMDgtMTAKdGVzdCA8LSBkZiA8LSBkYXRhLmZyYW1lKHg9MToxMCwgeT0xMToyMCwgcm93Lm5hbWVzPWxldHRlcnNbMToxMF0pCnRlc3RbXSA8LSBsYXBwbHkoZGYsIGZhY3RvcikKdGVzdAojIyBlcnJvciBpbiAxLjMuMCBpbiB0ZXN0W10KCgojIyBQUiAxMDQ4IGJ1ZyBpbiBkdW1teS5jb2VmLmxtLCBBZHJpYW4gQmFkZGVsZXksIDIwMDEtMDgtMTAKIyMgbW9kaWZpZWQgdG8gZ2l2ZSBhIHNlbnNpYmxlIHRlc3QKb2xkIDwtIGdldE9wdGlvbigiY29udHJhc3RzIikKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuaGVsbWVydCIsICJjb250ci5wb2x5IikpCkRGIDwtIGRhdGEuZnJhbWUoeD0xOjIwLHk9cm5vcm0oMjApLHo9ZmFjdG9yKDE6MjAgPD0gMTApKQpkdW1teS5jb2VmKGxtKHkgfiB6ICogSSh4KSwgZGF0YT1ERikpCmR1bW15LmNvZWYobG0oeSB+IHogKiBwb2x5KHgsMSksIGRhdGE9REYpKQojIyBmYWlsZWQgaW4gMS4zLjAuICBTZWNvbmQgb25lIHdhcm5zOiBkZWZpY2llbmN5IG9mIHRoZSBtZXRob2QuCm9wdGlvbnMoY29udHJhc3RzPW9sZCkKCgojIyBQUiAxMDUwIGVycm9yIGluIGtzbW9vdGggQyBjb2RlICsgcGF0Y2gsIEhzaXUtS2h1ZXJuIFRhbmcsIDIwMDEtMDgtMTIKeCA8LSAxOjQKeSA8LSAxOjQKeiA8LSBrc21vb3RoKHgsIHksIHgucG9pbnRzPXgpCnN0b3BpZm5vdChhbGwuZXF1YWwoeiR5LCB5KSkKIyMgZGlkIHNvbWUgc21vb3RoaW5nIHByaW9yIHRvIDEuMy4xLgoKCiMjIFRoZSBsZW5ndGggb2YgbGluZXMgcmVhZCBieSBzY2FuKCkgd2FzIGxpbWl0ZWQgYmVmb3JlIDEuNC4wCnh4IDwtIHBhc3RlKHJlcCgwOjksIDIwMDApLCBjb2xsYXBzZT0iIikKenogPC0gZmlsZSgiZm9vLnR4dCIsICJ3IikKd3JpdGVMaW5lcyh4eCwgenopCmNsb3NlKHp6KQp4eHggPC0gc2NhbigiZm9vLnR4dCIsICIiLCBzZXA9IlxuIikKc3RvcGlmbm90KGlkZW50aWNhbCh4eCwgeHh4KSkKdW5saW5rKCJmb28udHh0IikKCgojIyBhcy5jaGFyYWN0ZXIgd2FzIHRydW5jYXRpbmcgZm9ybXVsYWU6ICBKb2huIEZveCAyMDAxLTA4LTIzCm1vZCA8LSB0aGlzIH4gaXMgKyBhICsgdmVyeSArIGxvbmcgKyBmb3JtdWxhICsgd2l0aCArIGEgKyB2ZXJ5ICsgbGFyZ2UgKyBudW1iZXIgKyBvZiArIGNoYXJhY3RlcnMKenogPC0gYXMuY2hhcmFjdGVyKG1vZCkKenoKbmNoYXIoenopCnN0b3BpZm5vdChuY2hhcih6eilbM10gPT0gODMpCiMjIHRydW5jYXRlZCBpbiAxLjMuMAoKCiMjIHN1YnN0cjwtLCBUb20gVm9nZWxzLCAyMDAxLTA5LTA3CnggPC0gImFiY2RlZiIKc3Vic3RyKHgsIDIsIDMpIDwtICJ3eCIKc3RvcGlmbm90KHggPT0gImF3eGRlZiIpCgp4IDwtICJhYmNkZWYiCnN1YnN0cih4LCAyLCAzKSA8LSAid3h5IgpzdG9waWZub3QoeCA9PSAiYXd4ZGVmIikKCnggPC0gImFiY2RlZiIKc3Vic3RyKHgsIDIsIDMpIDwtICJ3IgpzdG9waWZub3QoeCA9PSAiYXdjZGVmIikKIyMgbGFzdCB3YXMgImF3IiBpbiAxLjMuMQoKCiMjIHJlYWRpbmcgYnl0ZXMgZnJvbSBhIGNvbm5lY3Rpb24sICBGcmllZHJpY2ggTGVpc2NoIDIwMDEtMDktMDcKY2F0KCJIZWxsbyBXb3JsZCIsIGZpbGU9IndvcmxkLnR4dCIpCmNvbiA8LSBmaWxlKCJ3b3JsZC50eHQiLCAiciIpCnp6IDwtIHJlYWRDaGFyKGNvbiwgMTAwKQpjbG9zZShjb24pCnVubGluaygid29ybGQudHh0IikKc3RvcGlmbm90KHp6ID09ICJIZWxsbyBXb3JsZCIpCiMjIHdhcyAiIiBpbiAxLjMuMS4KCgojIyBwcmVkaWN0aW9uIHdhcyBmYWlsaW5nIGZvciBpbnRlcmNlcHQtb25seSBtb2RlbAojIyBhcyBtb2RlbCBmcmFtZSBoYXMgbm8gY29sdW1ucy4KZCA8LSBkYXRhLmZyYW1lKHg9cnVuaWYoNTApLCB5PXJub3JtKDUwKSkKZC5sbSA8LSBsbSh5IH4gMSwgZGF0YT1kKQpwcmVkaWN0KGQubG0sIGRhdGEuZnJhbWUoeD0wLjUpKQojIyBlcnJvciBpbiAxLjMuMQoKCiMjIHByZWRpY3QuYXJpbWEwIG5lZWRlZCBhIG1hdHJpeCBuZXd4cmVnOiBSb2dlciBLb2Vua2VyLCAyMDAxLTA5LTI3CnUgPC0gcm5vcm0oMTIwKQpzIDwtIDE6MTIwCnkgPC0gMC4zKnMgKyA1KmZpbHRlcih1LCBjKC45NSwtLjEpLCAicmVjdXJzaXZlIiwgaW5pdD1ybm9ybSgyKSkKZml0MCA8LSBhcmltYTAoeSxvcmRlcj1jKDIsMCwwKSwgeHJlZz1zKQpmaXQxIDwtIGFyaW1hMCh5LG9yZGVyPWMoMiwxLDApLCB4cmVnPXMsIGluY2x1ZGUubWVhbj1UUlVFKQpmb3JlMCA8LSBwcmVkaWN0KGZpdDAgLG4uYWhlYWQ9NDQsIG5ld3hyZWc9MTIxOjE2NCkKZm9yZTEgPC0gcHJlZGljdChmaXQxLCBuLmFoZWFkPTQ0LCBuZXd4cmVnPTEyMToxNjQpCnBhcihtZnJvdz1jKDEsMikpCnRzLnBsb3QoeSxmb3JlMCRwcmVkLCBmb3JlMCRwcmVkKzIqZm9yZTAkc2UsIGZvcmUwJHByZWQtMipmb3JlMCRzZSwKCQlncGFycz1saXN0KGx0eT1jKDEsMiwzLDMpKSkKYWJsaW5lKGZpdDAkY29lZlszOjRdLCBsdHk9MikKdHMucGxvdCh5LCBmb3JlMSRwcmVkLCBmb3JlMSRwcmVkKzIqZm9yZTEkc2UsIGZvcmUxJHByZWQtMipmb3JlMSRzZSwKCQlncGFycz1saXN0KGx0eT1jKDEsMiwzLDMpKSkKYWJsaW5lKGMoMCwgZml0MSRjb2VmWzNdKSwgbHR5PTIpCgoKIyMgbWVyZ2luZyB3aGVuIE5BIGlzIGEgbGV2ZWwKYSA8LSBkYXRhLmZyYW1lKHggPSAxOjQpCmIgPC0gZGF0YS5mcmFtZSh4ID0gMTozLCB5ID0gZmFjdG9yKGMoIk5BIiwgImEiLCAiYiIpLCBleGNsdWRlPSIiKSkKKG0gPC0gbWVyZ2UoYSwgYiwgYWxsLnggPSBUUlVFKSkKc3RvcGlmbm90KGlzLm5hKG1bNCwgMl0pKQojIyB3YXMgbGV2ZWwgTkEgaW4gMS4zLjEKc3RvcGlmbm90KCFpcy5uYShtWzEsIDJdKSkKCgojIyBtZXJnaW5nIHdpdGggUE9TSVhjdCBjb2x1bW5zOgp4IDwtIGRhdGEuZnJhbWUoYSA9IGFzLlBPU0lYY3QoU3lzLnRpbWUoKSArICgxOjMpKjEwMDAwKSwgYiA9IExFVFRFUlNbMTozXSkKeSA8LSBkYXRhLmZyYW1lKGIgPSBMRVRURVJTWzM6NF0sIGMgPSAxOjIpCnN0b3BpZm5vdCgxID09IG5yb3cobWVyZ2UoeCwgeSkpKQpzdG9waWZub3QoNCA9PSBucm93KG1lcmdlKHgsIHksIGFsbCA9IFRSVUUpKSkKCgojIyBQUiAxMTQ5LiAgcHJvbWF4IHdhcyByZXR1cm5pbmcgdGhlIHdyb25nIHJvdGF0aW9uIG1hdHJpeC4KYWJpbGl0eS5GQSA8LSBmYWN0YW5hbChmYWN0b3JzID0gMiwgY292bWF0ID0gYWJpbGl0eS5jb3YsIHJvdGF0aW9uID0gIm5vbmUiKQpwbSA8LSBwcm9tYXgoYWJpbGl0eS5GQSRsb2FkaW5ncykKdG1wMSA8LSBhcy52ZWN0b3IoYWJpbGl0eS5GQSRsb2FkaW5ncyAlKiUgcG0kcm90bWF0KQp0bXAyIDwtIGFzLnZlY3RvcihwbSRsb2FkaW5ncykKc3RvcGlmbm90KGFsbC5lcXVhbCh0bXAxLCB0bXAyKSkKCgojIyBQUiAxMTU1LiBPbiBzb21lIHN5c3RlbXMgc3RycHRpbWUgd2FzIG5vdCBzZXR0aW5nIHRoZSBtb250aCBvciBtZGF5CiMjIHdoZW4geWRheSB3YXMgc3VwcGxpZWQuCmJ2MSA8LSBkYXRhLmZyYW1lKGRheT1jKDM0NiwzNDYsMzQ3LDM0NywzNDcpLCB0aW1lPWMoMjM0MCwyMzUwLDAsMTAsMjApKQphdHRhY2goYnYxKQp0bXAgPC0gc3RycHRpbWUocGFzdGUoZGF5LCB0aW1lICUvJSAxMDAsIHRpbWUgJSUgMTAwKSwgIiVqICVIICVNIikKZGV0YWNoKCkKc3RvcGlmbm90KHRtcCRtb24gPT0gMTEpCiMgZGF5IG9mIG1vbnRoIHdpbGwgYmUgZGlmZmVyZW50IGluIGEgbGVhcCB5ZWFyIG9uIHN5c3RlbXMgdGhhdCBkZWZhdWx0CiMgdG8gdGhlIGN1cnJlbnQgeWVhciwgc28gdGVzdCBkaWZmZXJlbmNlczoKc3RvcGlmbm90KGRpZmYodG1wJG1kYXkpID09IGMoMCwgMSwgMCwgMCkpCiMjIENvbW1lbnRzOiBmYWlsZWQgb24gZ2xpYmMtYmFzZWQgc3lzdGVtcyBpbiAxLjMuMSwgaW5jbHVkaW5nIFdpbmRvd3MuCgoKIyMgUFIgMTAwNCAoZm9sbG93IHVwKS4JIEV4YWN0IEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0IGdhdmUgaW5jb3JyZWN0CiMjIHJlc3VsdHMgZHVlIHRvIHJvdW5kaW5nIGVycm9ycyAoQ2hhcmxlcyBHZXllciwgY2hhcmxpZUBzdGF0LnVtbi5lZHUsCiMjIDIwMDEtMTAtMjUpLgojIyBFeGFtcGxlIDUuNCBpbiBIb2xsYW5kZXIgYW5kIFdvbGZlIChOb25wYXJhbWV0cmljIFN0YXRpc3RpY2FsCiMjIE1ldGhvZHMsIDJuZCBlZC4sIFdpbGV5LCAxOTk5LCBwcC4gMTgwLTE4MSkuCnggPC0gYygtMC4xNSwgOC42LCA1LCAzLjcxLCA0LjI5LCA3Ljc0LCAyLjQ4LCAzLjI1LCAtMS4xNSwgOC4zOCkKeSA8LSBjKDIuNTUsIDEyLjA3LCAwLjQ2LCAwLjM1LCAyLjY5LCAtMC45NCwgMS43MywgMC43MywgLTAuMzUsIC0wLjM3KQpzdG9waWZub3Qocm91bmQoa3MudGVzdCh4LCB5KSRwLnZhbHVlLCA0KSA9PSAwLjA1MjQpCgoKIyMgUFIgMTE1MC4gIFdpbGNveG9uIHJhbmsgc3VtIGFuZCBzaWduZWQgcmFuayB0ZXN0cyBkaWQgbm90IHJldHVybiB0aGUKIyMgSG9kZ2VzLUxlaG1hbm4gZXN0aW1hdG9ycyBvZiB0aGUgYXNzb2NpYXRlZCBjb25maWRlbmNlIGludGVydmFsCiMjIChDaGFybGVzIEdleWVyLCBjaGFybGllQHN0YXQudW1uLmVkdSwgMjAwMS0xMC0yNSkuCiMjIE9uZS1zYW1wbGUgdGVzdDogRXhhbXBsZSAzLjEgaW4gSG9sbGFuZGVyICYgV29sZmUgKDE5NzMpLCAyOWYuCnggPC0gYygxLjgzLCAgMC41MCwgIDEuNjIsICAyLjQ4LCAxLjY4LCAxLjg4LCAxLjU1LCAzLjA2LCAxLjMwKQp5IDwtIGMoMC44NzgsIDAuNjQ3LCAwLjU5OCwgMi4wNSwgMS4wNiwgMS4yOSwgMS4wNiwgMy4xNCwgMS4yOSkKd2UgPC0gd2lsY294LnRlc3QoeSwgeCwgcGFpcmVkID0gVFJVRSwgY29uZi5pbnQgPSBUUlVFKQojIyBOT1RFIG9yZGVyOiB5IHRoZW4geC4KIyMgUmVzdWx0cyBmcm9tIEhvbGxhbmRlciAmIFdvbGZlICgxOTk5KSwgMm5kIGVkaXRpb24sIHBhZ2UgNDAgYW5kIDUzCnN0b3BpZm5vdChyb3VuZCh3ZSRwLnZhbHVlLDQpID09IDAuMDM5MSkKc3RvcGlmbm90KHJvdW5kKHdlJGNvbmYuaW50LDMpID09IGMoLTAuNzg2LCAtMC4wMTApKQpzdG9waWZub3Qocm91bmQod2UkZXN0aW1hdGUsMykgPT0gLTAuNDYpCiMjIFR3by1zYW1wbGUgdGVzdDogRXhhbXBsZSA0LjEgaW4gSG9sbGFuZGVyICYgV29sZmUgKDE5NzMpLCA2OWYuCnggPC0gYygwLjgwLCAwLjgzLCAxLjg5LCAxLjA0LCAxLjQ1LCAxLjM4LCAxLjkxLCAxLjY0LCAwLjczLCAxLjQ2KQp5IDwtIGMoMS4xNSwgMC44OCwgMC45MCwgMC43NCwgMS4yMSkKd2UgPC0gd2lsY294LnRlc3QoeSwgeCwgY29uZi5pbnQgPSBUUlVFKQojIyBOT1RFIG9yZGVyOiB5IHRoZW4geC4KIyMgUmVzdWx0cyBmcm9tIEhvbGxhbmRlciAmIFdvbGZlICgxOTk5KSwgMm5kIGVkaXRpb24sIHBhZ2UgMTExIGFuZCAxMjYKc3RvcGlmbm90KHJvdW5kKHdlJHAudmFsdWUsNCkgPT0gMC4yNTQ0KQpzdG9waWZub3Qocm91bmQod2UkY29uZi5pbnQsMykgPT0gYygtMC43NiwgMC4xNSkpCnN0b3BpZm5vdChyb3VuZCh3ZSRlc3RpbWF0ZSwzKSA9PSAtMC4zMDUpCgoKIyMgcmFuZ2UgZ2F2ZSB3cm9uZyBsZW5ndGggcmVzdWx0IGZvciBSIDwgMS40LjAKc3RvcGlmbm90KGxlbmd0aChyYW5nZShudW1lcmljKDApKSkgPT0gMikKIyMgIENvbW1lbnRzOiB3YXMganVzdCBOQQoKCiMjIG1pc2hhbmRsaW5nIG9mIGludGVnZXIoMCkgaW4gUiA8IDEuNC4wCngxIDwtIGludGVnZXIoMCkgLyAoMTozKQp4MiA8LSBpbnRlZ2VyKDApIF4gKDE6MykKc3RvcGlmbm90KGxlbmd0aCh4MSkgPT0gMCAmIGxlbmd0aCh4MikgPT0gMCkKIyMgIENvbW1lbnRzOiB3ZXJlIGludGVnZXIgTkFzIGluIHJlYWwgYW5zd2VyIGluIDEuMy4xLgoKCiMjIFBSIzExMzgvOSAgcm91bmRpbmcgY291bGQgZ2l2ZSBub24taW50ZWdlciBhbnN3ZXIuCnggPC0gcm91bmQoMTAwMDAwLzMsIC0yKSAtIDMzMzAwCnN0b3BpZm5vdCh4ID09IDApCiMjIGZhaWxlZCBpbiAxLjMueCBvbiBTb2xhcmlzIGFuZCBXaW5kb3dzIGJ1dCBub3QgRGViaWFuIExpbnV4LgoKCiMjIFBSIzExNjAgZmluZGluZyBtaWRwb2ludHMgaW4gaW1hZ2UgPGphbmVmQHN0YXQuYmVya2VsZXkuZWR1LCAyMDAxLTExLTA2Pgp4MiA8LSBjKDAsIDAuMDAyMjQyMTUyLCAwLjAwNDQ4NDMwNSwgMC4wMDY3MjY0NTcsIDAuMDA4OTY4NjEsCgkwLjAxMTIxMDc2LCAwLjAxMzQ1MjkxLCAwLjAxNTY5NTA3LCAwLjAxNzkzNzIyLCAwLjAyMDE3OTM3LAoJMC4wMjI0MjE1MiwgMC4wMjQ2NjM2OCwgMC4wMjY5MDU4MywgMC4wMjkxNDc5OCwgMC4wMzEzOTAxMywKCTAuMDMzNjMyMjksIDAuMDM1ODc0NDQsIDAuMDM4MTE2NTksIDAuMDQwMzU4NzQsIDAuMDQ5MzI3MzUsCgkwLjA1MTU2OTUxLCAwLjA1MzgxMTY2KQp6IDwtIGMoMCwgMC4wNjcsIE5BLCAwLjE2NywgMC4wODMsIDAuMDUsIDAuMDY3LCBOQSwgMCwgMC4xLCAwLCAwLjA1LAogICAgICAgMC4wNjcsIDAuMDY3LCAwLjAxNiwgMC4xMTcsIDAuMDE3LCAtMC4wMTcsIDAuMiwgMC4zNSwgMC4xMzQsIDAuMTUpCmltYWdlKHgyLCAxLCBhcy5tYXRyaXgoeikpCiMjIENvbW1lbnRzOiBmYWlsZWQgdW5kZXIgUiAxLjMuMS4KCgojI1BSIDExNzUgYW5kIDExMjMjIwpzZXQuc2VlZCgxMjMpCiMjIFdlIGNhbid0IHNlZW0gdG8gZ2V0IFBlYXJzb24gcmVzaWR1YWxzIHJpZ2h0ICMjCnggPC0gMTo0ICMgcmVncmVzc29yIHZhcmlhYmxlCnkgPC0gYygyLDYsNyw4KSAjIHJlc3BvbnNlIGJpbm9taWFsIGNvdW50cwpuIDwtIHJlcCgxMCw0KSAjIG51bWJlciBvZiBiaW5vbWlhbCB0cmlhbHMKeW0gPC0gY2JpbmQoeSxuLXkpICMgcmVzcG9uc2UgdmFyaWFibGUgYXMgYSBtYXRyaXgKZ2xtMSA8LSBnbG0oeW1+eCxiaW5vbWlhbCkgIyBmaXQgYSBnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWwKZiA8LSBmaXR0ZWQoZ2xtMSkKcnAxIDwtICh5LW4qZikvc3FydChuKmYqKDEtZikpICMgZGlyZWN0IGNhbGN1bGF0aW9uIG9mIHBlYXJzb24gcmVzaWR1YWxzCnJwMiA8LSByZXNpZHVhbHMoZ2xtMSx0eXBlPSJwZWFyc29uIikgIyBzaG91bGQgYmUgcGVhcnNvbiByZXNpZHVhbHMKc3RvcGlmbm90KGFsbC5lcXVhbChycDEscnAyKSkKIyBzaWduIHNob3VsZCBiZSBzYW1lIGFzIHJlc3BvbnNlIHJlc2lkdWFscwp4IDwtIDE6MTAKeSA8LSByZ2FtbWEoMTAsMikveApnbG0yIDwtIGdsbSh5fngsZmFtaWx5PUdhbW1hKQpzdG9waWZub3QoYWxsLmVxdWFsKHNpZ24ocmVzaWQoZ2xtMiwicmVzcG9uc2UiKSksc2lnbihyZXNpZChnbG0yLCJwZWFyc29uIikpKSkKIyBzaG91bGRuJ3QgZGVwZW5kIG9uIGxpbmsgZm9yIGEgc2F0dXJhdGVkIG1vZGVsCng8LXJlcCgwOjEsMTApCnk8LXJlcChjKDAsMSwxLDAsMSksNCkKZ2xtMzwtZ2xtKHl+eCxmYW1pbHk9Ymlub21pYWwoKSxjb250cm9sPWdsbS5jb250cm9sKGVwcz0xZS04KSkKZ2xtNDwtZ2xtKHl+eCxmYW1pbHk9Ymlub21pYWwoImxvZyIpLGNvbnRyb2w9Z2xtLmNvbnRyb2woZXBzPTFlLTgpKQpzdG9waWZub3QoYWxsLmVxdWFsKHJlc2lkKGdsbTMsInBlYXJzb24iKSxyZXNpZChnbG00LCJwZWFyc29uIikpKQoKCiMjIFRvcnN0ZW4gSG90aG9ybiwgMjAwMS0xMi0wNApzdG9waWZub3QocHQoLUluZiwgMywgbmNwPTApID09IDAsIHB0KEluZiwgMywgbmNwPTApID09IDEpCiMjICBDb21tZW50czogd2VyZSAwLjUgaW4gMS4zLjEKCgojIyBQYXVsIEdpbGJlcnQsIDIwMDEtMTItMDcKY2FuY29yKG1hdHJpeChybm9ybSgxMDApLDEwMCwxKSwgbWF0cml4KHJub3JtKDMwMCksMTAwLDMpKQojIyAgQ29tbWVudHM6IGZhaWxlZCBpbiBSLWRldmVsLgoKCiMjIFBSIzEyMDE6IGluY29ycmVjdCB2YWx1ZXMgaW4gcWJldGEKeCA8LSBzZXEoMCwgMC44LCBsZW49MTAwMCkKeHggPC0gcGJldGEocWJldGEoeCwgMC4xNDM4OTEsIDAuMDUpLCAwLjE0Mzg5MSwgMC4wNSkKc3RvcGlmbm90KG1heChhYnMoeCAtIHh4KSkgPCAxZS02KQojIyAgQ29tbWVudHM6ICBHZXQgYSByYW5nZSBvZiB6ZXJvZXMgaW4gMS4zLjEKCgojIyBQUiMxMjE2OiBiaW5vbWlhbCBudWxsIG1vZGVsCnkgPC0gcmJpbm9tKDIwLCAxLCAwLjUpCmdsbSh5IH4gMCwgZmFtaWx5ID0gYmlub21pYWwpCiMjICBDb21tZW50czogIDEuMy4xIGdhdmUgIEVycm9yIGluIGFueShuID4gMSkgOiBPYmplY3QgIm4iIG5vdCBmb3VuZAoKCiMjIEludGVnZXIgb3ZlcmZsb3cgaW4gdHlwZS5jb252ZXJ0CnJlcyA8LSB0eXBlLmNvbnZlcnQoIjEyMzQ1Njg5IikKc3RvcGlmbm90KHR5cGVvZihyZXMpID09ICJpbnRlZ2VyIikKcmVzIDwtIHR5cGUuY29udmVydCgiMTIzNDU2ODkwMTIiKQpzdG9waWZub3QodHlwZW9mKHJlcykgPT0gImRvdWJsZSIpCiMjICBDb21tZW50czogd2FzIGludGVnZXIgaW4gMS40LjAKCgojIyBMYS5laWdlbigpIHNlZ2ZhdWx0CiNlMSA8LSBMYS5laWdlbihtIDwtIG1hdHJpeCgxOjksMykpCiNzdG9waWZub3QoZTEkdmFsdWVzID09IExhLmVpZ2VuKG0sIG9ubHkudmFsdWVzID0gVFJVRSkkdmFsdWVzKQojIyAyLjAuMDogTGEuZWlnZW4gaXMgZGVmdW5jdAoKCiMjIFBhdHJpY2sgQ29ubmVsbHkgMjAwMS0wMS0yMiwgcHJlZGljdGlvbiB3aXRoIG9mZnNldHMgZmFpbGVkCiMjIGEgc2ltcGxlciBleGFtcGxlCmNvdW50cyA8LSBjKDE4LCAxNywgMTUsIDIwLCAxMCwgMjAsIDI1LCAxMywgMTIpCm91dGNvbWUgPC0gZ2woMywgMSwgOSkKdHJlYXRtZW50IDwtIGdsKDMsIDMpCkRGIDwtIGRhdGEuZnJhbWUoY291bnRzID0gYygxOCwgMTcsIDE1LCAyMCwgMTAsIDIwLCAyNSwgMTMsIDEyKSwKCQkgb3V0Y29tZSA9IGdsKDMsIDEsIDkpLCB0cmVhdG1lbnQgPSBnbCgzLCAzKSwKCQkgZXhwb3N1cmUgPSBjKDEuMTcsIDEuNzgsIDEuMDAsIDIuMzYsIDIuNTgsIDAuODAsIDIuNTEsCgkJIDEuMTYsIDEuNzcpKQpmaXQgPC0gZ2xtKGNvdW50cyB+IG91dGNvbWUgKyB0cmVhdG1lbnQgKyBvZmZzZXQobG9nKGV4cG9zdXJlKSksCgkgICBmYW1pbHkgPSBwb2lzc29uLCBkYXRhID0gREYpCnAxIDwtIHByZWRpY3QoZml0KQpwMiA8LSBwcmVkaWN0KGZpdCwgc2UgPSBUUlVFKSAgIyMgZmFpbGVkIDwgMS40LjEKcDMgPC0gcHJlZGljdChmaXQsIG5ld2RhdGEgPSBERikKcDQgPC0gcHJlZGljdChmaXQsIG5ld2RhdGEgPSBERiwgc2UgPSBUUlVFKQpzdG9waWZub3QoYWxsLmVxdWFsKHAxLCBwMiRmaXQpLCBhbGwuZXF1YWwocDEsIHAzKSwgYWxsLmVxdWFsKHAyLCBwNCkpCmZpdCA8LSBnbG0oY291bnRzIH4gb3V0Y29tZSArIHRyZWF0bWVudCwgb2Zmc2V0ID0gbG9nKGV4cG9zdXJlKSwKCSAgIGZhbWlseSA9IHBvaXNzb24sIGRhdGEgPSBERikKcDEgPC0gcHJlZGljdChmaXQpCnAyIDwtIHByZWRpY3QoZml0LCBzZSA9IFRSVUUpICAjIyBmYWlsZWQgPCAxLjQuMQpwMyA8LSBwcmVkaWN0KGZpdCwgbmV3ZGF0YSA9IERGKQpwNCA8LSBwcmVkaWN0KGZpdCwgbmV3ZGF0YSA9IERGLCBzZSA9IFRSVUUpCnN0b3BpZm5vdChhbGwuZXF1YWwocDEsIHAyJGZpdCksIGFsbC5lcXVhbChwMSwgcDMpLCBhbGwuZXF1YWwocDIsIHA0KSkKCgojIyBQUiMxMjY3IGhhc2hpbmcgTmFOCmxvYWQoZmlsZS5wYXRoKFN5cy5nZXRlbnYoIlNSQ0RJUiIpLCAibmFuYnVnLnJkYSIpKQpiYiA8LSBiOyBiYls1XSA8LSBOYU4KaWRlbnRpY2FsKGIsIGJiKQkgICAgIyBUUlVFCnVuaXF1ZShjKE5hTiwgYmIpKQkgICAgI1sxXSBOYU4gMCAxIDIgMyBOQQpzdG9waWZub3QoaWRlbnRpY2FsKHVuaXF1ZShjKE5hTiwgYikpLCB1bmlxdWUoYyhOYU4sIGJiKSkpKQojIyAxLjQuMCBnaXZlcyBbMV0gTmFOIDAgMSAyIE5hTiAzIE5BCW9uIG1vc3QgcGxhdGZvcm1zCgoKIyMgcmVwb3J0ZWQgYnkgUEQgMjAwMi0wMS0yNApZIDwtIG1hdHJpeChybm9ybSgyMCksICwgMikKZml0IDwtIG1hbm92YShZIH4gMSkKZml0ICMgZmFpbGVkCnByaW50KGZpdCwgaW50ZXJjZXB0ID0gVFJVRSkKc3VtbWFyeShmaXQpICMgZmFpbGVkCnN1bW1hcnkoZml0LCBpbnRlcmNlcHQgPSBUUlVFKQoKCiMjIFNldmVyYWwgIHFyLiooKSBmdW5jdGlvbnMgbG9zZSAoZGltKW5hbWVzLgojIyByZXBvcnRlZCBieSBNTSAyMDAyLTAxLTI2CgojIyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIGJvdGggaW4gUiBhbmQgUysgOgpxNCA8LSBxcihYNCA8LSBjYmluZChhID0gMTo5LCBiID0gYygxOjYsMzoxKSwgYyA9IDI6MTAsIGQgPSByZXAoMSw5KSkpCiMjcTIgPC0gcXIoWDRbLDE6Ml0pCnkwNCA8LSB5NCA8LSBjYmluZChBPTE6OSxCPTI6MTAsQz0zOjExLEQ9NDoxMikKZGltbmFtZXMoeTQpW1sxXV0gPC0gcGFzdGUoImMiLDE6OSxzZXA9Ii4iKQp5MSA8LSB5NFssMl0KeTQwIDwtIHk0IDsgZGltbmFtZXMoeTQwKSA8LSBsaXN0KGRpbW5hbWVzKHk0KVtbMV1dLCBOVUxMKQoKYzEgPC0gcXIuY29lZiggcTQsIHk0KSAjIHJvdy0gQU5EIGNvbC1uYW1lcwpjMiA8LSBxci5jb2VmKCBxNCwgeTA0KSMgZGl0dG8KYzMgPC0gcXIuY29lZiggcTQsIHk0MCkjIHJvdy0tbmFtZXMKZG4zIDwtIGRpbW5hbWVzKGMzKQpzdG9waWZub3QoaWRlbnRpY2FsKGRpbW5hbWVzKGMxKSwgZGltbmFtZXMoYzIpKSwKCSAgaWRlbnRpY2FsKGRpbW5hbWVzKGMxKSwgbGlzdChsZXR0ZXJzWzE6NF0sIExFVFRFUlNbMTo0XSkpLAoJICBpZGVudGljYWwoZG4zW1sxXV0sIGxldHRlcnNbMTo0XSksICBsZW5ndGgoZG4zW1syXV0pID09IDAsCgkgIGlkZW50aWNhbChuYW1lcyhxci5jb2VmKHE0LHkxKSksICAgbGV0dGVyc1sxOjRdKSwKCSAgaWRlbnRpY2FsKGRpbW5hbWVzKHFyLlIocTQpKVtbMl1dLCBsZXR0ZXJzWzE6NF0pLAoKCSAgaWRlbnRpY2FsKGRpbW5hbWVzKHFyLnF0eShxNCx5NCkpLCBkaW1uYW1lcyh5NCkpLAoJICBpZGVudGljYWwoZGltbmFtZXMocXIucXR5KHE0LHk0MCkpLCBkaW1uYW1lcyh5NDApKSwKCSAgaWRlbnRpY2FsKGRpbW5hbWVzKHFyLnF5IChxNCx5MDQpKSwgZGltbmFtZXMoeTA0KSksCgoJICBhbGwuZXF1YWwoeTEsCSBxci5maXR0ZWQocTQsIHkxICksIHRvbCA9IDFlLTEyKSwKCSAgYWxsLmVxdWFsKHk0LAkgcXIuZml0dGVkKHE0LCB5NCApLCB0b2wgPSAxZS0xMiksCgkgIGFsbC5lcXVhbCh5NDAsIHFyLmZpdHRlZChxNCwgeTQwKSwgdG9sID0gMWUtMTIpLAoJICBhbGwuZXF1YWwoeTA0LCBxci5maXR0ZWQocTQsIHkwNCksIHRvbCA9IDFlLTEyKSwKCgkgIGFsbC5lcXVhbChYNCwgcXIuWChxNCksIHRvbCA9IDFlLTEyKQopCgoKIyMgUFIgMTI5NyAgcmVhZC5md2YoKSB3YXMgaW50ZXJwcmV0aW5nIGAjJyBpbiAxLjQuMC8xCmNhdChmaWxlPSJ0ZXN0LmZ3ZiIsICIxMjNBQkMxMjMiLCAiMTIzIzMgMTIzIiwgIjEyM1hZWjEyMyIsIHNlcD0iXG4iKQoocmVzIDwtIHJlYWQuZndmKCJ0ZXN0LmZ3ZiIsIHdpZHRocz1jKDMsMywzKSwgY29tbWVudC5jaGFyPSIiKSkKdW5saW5rKCJ0ZXN0LmZ3ZiIpCnN0b3BpZm5vdChyZXNbMiwgMl0gPT0gIiMzICIpCgoKIyMgYWJzIHdhcyBmYWlsaW5nIHRvIGRpc3BhdGNoIGFzIHBhcnQgb2YgdGhlIE1hdGggZ3JvdXAgZ2VuZXJpYwp0bXAgPC0gZGF0YS5mcmFtZSh4ID0gLTU6NSkKYWJzKHRtcCkKIyMgZmFpbGVkIGluIDEuNC4xLgoKCiMjIFBSIDEzNjMgTGEuc3ZkIHdhcyBub3Qgd29ya2luZyBmb3IgaW50ZWdlciBhcmdzCm0gPC0gbWF0cml4KDE6NCwgMikKKHMxIDwtIHN2ZChtKSkKKHMyIDwtIExhLnN2ZChtKSkKc3RvcGlmbm90KGFsbC5lcXVhbChzMSRkLCBzMiRkKSwgYWxsLmVxdWFsKHMxJHUsIHMyJHUpLAoJICBhbGwuZXF1YWwoczEkdiwgdChzMiR2dCkpKQooZTEgPC0gZWlnZW4obSkpCiMgKGUyIDwtIExhLmVpZ2VuKG0pKSAjIDIuMC4wOiBMYS5laWdlbiBpcyBkZWZ1bmN0CnN0b3BpZm5vdChhbGwuZXF1YWwoZTEkZCwgZTEkZCkpCgoKIyMgb3JkZXIvc29ydC5saXN0IG9uIE5BX1NUUklORwp4IDwtIGMoIkEiLCBOQSwgIloiKQpzdG9waWZub3QoaWRlbnRpY2FsKHNvcnQoeCwgbmEubGFzdCA9IFRSVUUpLCB4W3NvcnQubGlzdCh4LCBuYS5sYXN0ID0gVFJVRSldKSkKc3RvcGlmbm90KGlkZW50aWNhbChzb3J0KHgsIG5hLmxhc3QgPSBGQUxTRSksIHhbc29ydC5saXN0KHgsIG5hLmxhc3QgPSBGQUxTRSldKSkKIyMgMS40LjEgc29ydGVkIE5BIGNvcnJlY3RseSB3aXRoIHNvcnQgYnV0IG5vdCBzb3J0Lmxpc3QuCgoKIyMgRG9uIE1hY1F1ZWVuIDIwMDItMDMtMjYKc3RvcGlmbm90KGxlbmd0aChzZXEoMTAyNDkwMjAxMCwgMTAyNDkwMjAyNSwgYnk9MSkpID09IDE2KQp0MCA8LSBJU09kYXRldGltZSgyMDAyLDYsMjQsMCwwLDEwKQp4IDwtIHNlcS5QT1NJWHQoZnJvbT10MCx0bz10MCsxNSxieT0nMSBzZWMnKQpzdG9waWZub3QobGVuZ3RoKHgpID09IDE2KQoKCiMjIHdoaWxzdCByZWFkaW5nIHRoZSBjb2RlIEJEUiAyMDAyLTAzLTMxCnogPC0gdHJ5KG1heChjb21wbGV4KDApKSkKc3RvcGlmbm90KGluaGVyaXRzKHosICJ0cnktZXJyb3IiKSkKeiA8LSB0cnkobWluKGNvbXBsZXgoMCkpKQpzdG9waWZub3QoaW5oZXJpdHMoeiwgInRyeS1lcnJvciIpKQojIyAxLjQuMSBnYXZlICstSW5mICsgcmFuZG9tIGltYWdpbmFyeSBwYXJ0CgoKIyMgUFIjMTI4MyAgbWluL21heChOVUxMKSBvciAoaW50ZWdlcigwKSkKeiA8LSBtaW4oTlVMTCkKc3RvcGlmbm90KCFpcy5uYSh6KSwgbW9kZSh6KSA9PSAibnVtZXJpYyIsIHogPT0gSW5mKQp6IDwtIG1pbihpbnRlZ2VyKDApKQpzdG9waWZub3QoIWlzLm5hKHopLCBtb2RlKHopID09ICJudW1lcmljIiwgeiA9PSBJbmYpCnogPC0gbWF4KE5VTEwpCnN0b3BpZm5vdCghaXMubmEoeiksIG1vZGUoeikgPT0gIm51bWVyaWMiLCB6ID09IC1JbmYpCnogPC0gbWF4KGludGVnZXIoMCkpCnN0b3BpZm5vdCghaXMubmEoeiksIG1vZGUoeikgPT0gIm51bWVyaWMiLCB6ID09IC1JbmYpCgoKIyMgbW9yZSByZWFkaW5nIHRoZSBjb2RlIEJEUiAyMDAyLTAzLTMxCnN0b3BpZm5vdChpZGVudGljYWwocmFuZ2UoKSwgcmFuZ2UobnVtZXJpYygwKSkpKQojIyBpbiAxLjQuMSByYW5nZSgpIHdhcyBjKDEsMSkKc3RvcGlmbm90KGlzLm51bGwoYygpKSkKIyMgaW4gMS40LjEgdGhpcyB3YXMgc3RydWN0dXJlKFRSVUUsIG5hbWVzPSJyZWN1cnNpdmUiKQoKIyMgcmFuZ2UobnVtZXJpYygwKSkgd2FzIG5vdCBhcyBkb2N1bWVudGVkCnggPC0gbnVtZXJpYygwKQoocnggPC0gcmFuZ2UoeCkpCnN0b3BpZm5vdChpZGVudGljYWwocngsIGMobWluKHgpLCBtYXgoeCkpKSkKIyMgMS40LjEgaGFkIGMoTkEsIE5BKQoKCiMjIFBSIDE0MzEgcGVyc3AoKSBjcmFzaGVzIHdpdGggbnVtZXJpYyB2YWx1ZXMgZm9yIFt4LHksel1sYWIKcGVyc3AoMToyLCAxOjIsIG1hdHJpeCgxOjQsIDIpLCB4bGFiPTEpCiMjIHNlZ2ZhdWx0ZWQgaW4gMS40LjEKCgojIyBQUiMxMjQ0IGJ1ZyBpbiBkZXQgdXNpbmcgbWV0aG9kPSJxciIKIyMgbWV0aG9kIGFyZ3VtZW50IGlzIG5vIGxvbmdlciB1c2VkIGluIGRldAojbTIgPC0gc3RydWN0dXJlKGMoOTgyMjYxNjAwMCwgMzg0MTcyMzAwMCwgNzk3OTAuMDksIDM4NDE3MjMwMDAsIDE1MDI1MzYwMDAsCiMJCSAgMzEyNTEuODIsIDc5NzkwLjA5LCAzMTI1MS44MiwgNjQxNTY0MTkuMzYpLCAuRGltID0gYygzLCAzKSkKIyhkMSA8LSBkZXQobTIsIG1ldGhvZD0iZWlnZW52YWx1ZXMiKSkKIyhkMiA8LSBkZXQobTIsIG1ldGhvZD0icXIiKSkKI3N0b3BpZm5vdChkMiA9PSAwKSAjIyAxLjQuMSBnYXZlIDkuMzMxODkzZSsxOQojKGQzIDwtIGRldChtMiwgbWV0aG9kPSJxciIsIHRvbCA9IDFlLTEwKSkKI3N0b3BpZm5vdChhbGwuZXF1YWwoZDEsIGQzLCB0b2w9MWUtMykpCgoKIyMgUFIjMTQyMiBnbG0gc3RhcnQvb2Zmc2V0IGJ1Z3MKcmVzIDwtIHRyeShkYXRhKHNoaXBzLCBwYWNrYWdlID0gTUFTUykpCmlmKCFpbmhlcml0cyhyZXMsICJ0cnktZXJyb3IiKSkgewpzaGlwcy5nbG0gPC0gZ2xtKGluY2lkZW50cyB+IHR5cGUgKyB5ZWFyICsgcGVyaW9kICsgb2Zmc2V0KGxvZyhzZXJ2aWNlKSksCgkJIGZhbWlseSA9IHBvaXNzb24sIGRhdGEgPSBzaGlwcywgc3Vic2V0ID0gKHNlcnZpY2UgIT0gMCkpCnVwZGF0ZShzaGlwcy5nbG0sIHN0YXJ0ID0gY29lZihzaGlwcy5nbG0pKQp9CiMjIGZhaWxlZCBpbiAxLjQuMS4KCgojIyBQUiMxNDM5IGZpbGUuaW5mbygpJGlzZGlyIHdhcyBvbmx5IHBhcnRpYWxseSBsb2dpY2FsCihpbmZvIDwtIGZpbGUuaW5mbygiLiIpKQppbmZvJGlzZGlyCnN0b3BpZm5vdChpbmZvJGlzZGlyID09IFRSVUUpCiMjIDEuNC4xIGhhZCBhIFRSVUUgdmFsdWUgdGhhdCB3YXMgbm90IGludGVybmFsbHkgaW50ZWdlciAxLgoKIyMgUFIjMTQ3MyBwcmVkaWN0LipiU3BsaW5lKCkgYnVncyBleHRyYXBvbGF0aW5nIGZvciBkZXJpdiA+PSAxCmxpYnJhcnkoc3BsaW5lcykKeCA8LSBjKDE6Myw1OjYpCnkgPC0gYygzOjEsNTo2KQooaXNQIDwtIGludGVycFNwbGluZSh4LHkpKSMgcG9seS1zcGxpbmUgcmVwcmVzZW50YXRpb24KKGlzQiA8LSBpbnRlcnBTcGxpbmUoeCx5LCBiU3BsID0gVFJVRSkpIyBCLXNwbGluZSByZXByLgp4byA8LSBjKDAsIHgsIDEwKSMgeCArIG91dHNpZGUgcG9pbnRzCm9wIDwtIG9wdGlvbnMoZGlnaXRzID0gNCkKZm9yKGRlciBpbiAwOjMpICMgZGVyaXY9MyBmYWlscyEKICAgIHByaW50KGZvcm1hdEModHJ5KHByZWRpY3QoaXNQLCB4bywgZGVyaXYgPSBkZXIpJHkpLCB3aWQ9Nyxmb3JtYXQ9ImYiKSwKCSAgcXVvdGUgPSBGQUxTRSkKIyMgYW5kIGZvciBCLXNwbGluZSAoaW5zdGVhZCBvZiBwb2x5bm9taWFsKToKZm9yKGRlciBpbiAwOjMpCSAjIGRlcml2PTMgZmFpbGVkCiAgICBwcmludChmb3JtYXRDKHRyeShwcmVkaWN0KGlzQiwgeG8sIGRlcml2ID0gZGVyKSR5KSwgd2lkPTcsZm9ybWF0PSJmIiksCgkgIHF1b3RlID0gRkFMU0UpCm9wdGlvbnMob3ApCnVubG9hZE5hbWVzcGFjZSgic3BsaW5lcyIpCgoKIyMgUFIgOTAyIHNlZ2ZhdWx0cyB3aGVuIHdhcm5pbmcgc3RyaW5nIGlzIHRvbyBsb25nLCBCZW4gQm9sa2VyIDIwMDEtMDQtMDkKcHJvdm9rZS5idWcgPC0gZnVuY3Rpb24obj05MDAwKSB7CiAgIHdhcm5tc2cgPC0gcGFzdGUoTEVUVEVSU1tzYW1wbGUoMToyNixuLHJlcGxhY2U9VFJVRSldLGNvbGxhcHNlPSIiKQogICB3YXJuaW5nKHdhcm5tc2cpCn0KcHJvdm9rZS5idWcoKQojIyBzZWdmYXVsdGVkIGluIDEuMi4yLCB3aWxsIGFsc28gb24gbWFjaGluZXMgd2l0aG91dCB2c25wcmludGYgKG5vbmUgbm93KQoKCiMjIFBSIzE1MTAgbWVyZ2Ugd2l0aCBtdWx0aXBsZSBtYXRjaCByb3dzIGFuZCBkaWZmZXJlbnQgbmFtZXMuCmRmMSA8LSBkYXRhLmZyYW1lKHogPSAxOjEwLCBtID0gbGV0dGVyc1sxOjEwXSwgdyA9IHJub3JtKDEwKSkKZGYyIDwtIGRhdGEuZnJhbWUoeCA9IDE6MTAsIHkgPSBybm9ybSgxMCksIG4gPSBsZXR0ZXJzWzE6MTBdKQptZXJnZShkZjIsIGRmMSwgYnkueCA9IGMoIngiLCAibiIpLCBieS55ID0gYygieiIsICJtIikpCiMjIGZhaWxlZCBpbiAxLjUuMAoKCiMjIFBSIDE1MjQgIFByb2JsZW1zIHdpdGggcGFzdGUvdW5saXN0CmwgPC0gbmFtZXModW5saXN0KGxpc3QoYWEgPSBsaXN0KGJiID0gMSkpKSkKbAojIHRoaXMgaXMgZXhhY3RseSAiYWEuYmIiCnN0b3BpZm5vdChpZGVudGljYWwobCwgImFhLmJiIikpCmwyIDwtIHBhc3RlKGwsICJ0aGlzIHNob3VsZCBiZSBhZGRlZCIpCnN0b3BpZm5vdChpZGVudGljYWwobDIsICJhYS5iYiB0aGlzIHNob3VsZCBiZSBhZGRlZCIpKQojIyAxLjUuMCBnYXZlIGwyIHByaW50aW5nIGFzIGwuCgoKIyMgUFIgMTUzMCBkcm9wIGluY29uc2lzdGVuY3kgZm9yIGRhdGEgZnJhbWVzCkRGIDwtIGRhdGEuZnJhbWUoeCA9IDE6MywgeSA9IGMoIkEiLCJEIiwiRSIpLCB6ID0gYyg2LDksMTApKQphMSA8LSBERlsxLDE6M10KeHggPC0gREZbMSxdCmEyIDwtIHh4WywgMTozXQphMyA8LSBERlsxLDE6MywgZHJvcCA9IFRSVUVdCmE0IDwtIHh4WywgMTozLCBkcm9wID0gVFJVRV0Kc3RvcGlmbm90KGlkZW50aWNhbChhMSwgYTIpLCBpZGVudGljYWwoYTMsIGE0KSkKIyMgPD0gMS41LjAgaGFkIGEyID09IGEzLgoKCiMjIFBSIDE1MzYgcmJpbmQuZGF0YS5mcmFtZSBjb252ZXJ0cyBsb2dpY2FsIHRvIGZhY3RvcgpkZiA8LSBkYXRhLmZyYW1lKGEgPSAxOjEwKQpkZiRiIDwtIGRmJGEgPCA1CmRkZiA8LSByYmluZChkZiwgZGYpCnN0b3BpZm5vdCghaXMuZmFjdG9yKGRkZiRiKSkKIyMgMS41LjAgaGFkIGIgYXMgYSBmYWN0b3IuCgoKIyMgUFIgMTU0OCA6IHByZXR0eU51bSBpbnNlcnRlZCBsZWFkaW5nIGNvbW1hcwpzdG9waWZub3QocHJldHR5TnVtKDEyMzQ1NiwgYmlnLm1hcms9IiwiKSA9PSAiMTIzLDQ1NiIpCgoKIyMgUFIgMTU1MjogY3V0LmRlbmRyb2dyYW0KaGMgPC0gaGNsdXN0KGRpc3QoVVNBcnJlc3RzKSwgImF2ZSIpCmNjIDwtIGN1dChhcy5kZW5kcm9ncmFtKGhjKSwgaCA9IDIwKSMjIGVycm9yIGluIDEuNS4wCgojIyBwcmVkaWN0LnNtb290aC5zcGxpbmUoKiwgZGVyaXYgPiAwKSA6CnggPC0gKDE6MjAwKS8zMgpzcyA8LSBzbW9vdGguc3BsaW5lKHgsIDEwKnNpbih4KSkKc3RvcGlmbm90KGxlbmd0aCh4KSA9PSBsZW5ndGgocHJlZGljdChzcyxkZXJpdj0xKSR4KSkjIG5vdCB5ZXQgaW4gMS41LjAKCiMjIHB3ZWlidWxsKGxhcmdlLCBsb2c9VCk6CnN0b3BpZm5vdChwd2VpYnVsbChzZXEoMSw1MCxsZW49MTAwMSksIDIsMywgbG9nID0gVFJVRSkgPCAwKQoKIyMgcGFydCBvZiBQUiAxNjYyOiBmaXNoZXIudGVzdCB3aXRoIHRvdGFsIG9uZQpmaXNoZXIudGVzdChjYmluZCgwLCBjKDAsMCwwLDEpKSkKIyMgY3Jhc2hlZCBpbiBSIDw9IDEuNS4wCgpzdG9waWZub3QoTW9kKHZlY3RvcigiY29tcGxleCIsIDcpKSA9PSAwKSAjIGNvbnRhaW5lZCBnYXJiYWdlIGluIDEuNS4wCgojIyBoaXN0LlBPU0lYdCB3aXRoIG51bWVyaWMgYGJyZWFrcycKaGlzdCgubGVhcC5zZWNvbmRzLCBicmVha3MgPSA1KQojIyBlcnJvciBpbiAxLjUuMQoKCiMjSm9uYXRoYW4gUm91Z2llciAyMDAyLTA2LTE4CnggPC0gbWF0cml4KHJ1bmlmKDMwKSwgMTAsIDMpCnBvbHkoeCwgZGVncmVlPTIpCiMjIGZhaWxlZCBpbiAxLjUuMQoKCiMjIFBSIzE2OTQgY3V0IHdpdGggaW5maW5pdGUgdmFsdWVzIC0+IE5BIChNYXJrdXMgSuRudHRpKQpjdXQub2ZmIDwtIGMoLUluZiwgMCwgSW5mKQp4IDwtIGMoLUluZiwgLTEwLCAwLCAxMCwgSW5mKQoocmVzIDwtIGN1dCh4LCBjdXQub2ZmLCBpbmNsdWRlLmxvd2VzdD1UUlVFKSkKc3RvcGlmbm90KCFpcy5uYShyZXMpKQoocmVzIDwtIGN1dCh4LCBjdXQub2ZmLCBpbmNsdWRlLmxvd2VzdD1UUlVFLCByaWdodD1GQUxTRSkpCnN0b3BpZm5vdCghaXMubmEocmVzKSkKIyMgb3V0ZXIgdmFsdWVzIHdlcmUgTkEgaW4gMS41LjEKCgojIyBscy5zdHIoKSBmb3IgZnVuY3Rpb24gZW52aXJvbm1lbnRzOgpGbiA8LSBlY2RmKHJub3JtKDUwKSkKbHMuc3RyKGVudmlyID0gZW52aXJvbm1lbnQoRm4pKQojIyBmYWlsZWQgaW4gMS41LjEKCgojIyBQUiAxNzY3IGFsbC5lcXVhbC5jaGFyYWN0ZXIgZm9yIG5vbi1tYXRjaGluZyBOQXMKYWxsLmVxdWFsKGMoIkEiLCAiQiIpLCBjKCJBIiwgTkEpKQojIyBmYWlsZWQgaW4gMS41LjEKCgojIyBmYWlsZWQgc2luY2UgYXQgbGVhc3QgdmVyc2lvbiAwLjkwOgpzdG9waWZub3QoaXMuY2hhcmFjdGVyKGExMiA8LSBhbGwuZXF1YWwoMSwxOjIpKSwKCSAgbGVuZ3RoKGExMikgPT0gMSwjIHdhcyAyIHRpbGwgMS42LjIKCSAgYTEyID09ICJOdW1lcmljOiBsZW5ndGhzICgxLCAyKSBkaWZmZXIiKQojIyBhMTIgd2FzICpsaXN0KiBvZiBsZW5ndGggMwoKCiMjIHJlbGF0ZWQgdG8gUFIgMTU3Ny8xNjA4LCBjb252ZXJzaW9ucyB0byBjaGFyYWN0ZXIKREYgPC0gZGF0YS5mcmFtZShiID0gTEVUVEVSU1sxOjNdKQpzYXBwbHkoREYsIGNsYXNzKQpERltbMV1dIDwtIExFVFRFUlNbMTozXQpzdG9waWZub3QoaXMuY2hhcmFjdGVyKERGJGIpKSAjIyB3YXMgZmFjdG9yIDwgMS42LjAKREYgPC0gZGF0YS5mcmFtZShiID0gTEVUVEVSU1sxOjNdKQpERiRiIDwtIExFVFRFUlNbMTozXQpzdG9waWZub3QoaXMuY2hhcmFjdGVyKERGJGIpKSAjIyBhbHdheXMgd2FzIGNoYXJhY3Rlci4KCnggPC0gZGF0YS5mcmFtZSh2YXIgPSBMRVRURVJTWzE6M10pOyB4JHZhciA8LSBhcy5jaGFyYWN0ZXIoeCR2YXIpCnhbWzFdXVsyXSA8LSAiMyIKeApzdG9waWZub3QoaXMuY2hhcmFjdGVyKHgkdmFyKSkKaXMubmEoeFtbMV1dKSA8LSAyCnN0b3BpZm5vdChpcy5jaGFyYWN0ZXIoeCR2YXIpKQoKeCA8LSBkYXRhLmZyYW1lKHZhciA9IEkoTEVUVEVSU1sxOjNdKSkKeFtbMV1dWzJdIDwtICIzIgp4CnN0b3BpZm5vdChpcy5jaGFyYWN0ZXIoeCR2YXIpKQppcy5uYSh4W1sxXV0pIDwtIDIKc3RvcGlmbm90KGlzLmNoYXJhY3Rlcih4JHZhcikpCgp4IDwtIGRhdGEuZnJhbWUodmFyID0gTEVUVEVSU1sxOjNdKQp4W1sxXV1bMl0gPC0gIjMiCngKc3RvcGlmbm90KGlzLmZhY3Rvcih4JHZhcikpCmlzLm5hKHhbWzFdXSkgPC0gMgpzdG9waWZub3QoaXMuZmFjdG9yKHgkdmFyKSkKCnggPC0gZGF0YS5mcmFtZShhID0gMTo0KQp5IDwtIGRhdGEuZnJhbWUoYiA9IExFVFRFUlNbMTozXSkKeSRiIDwtIGFzLmNoYXJhY3Rlcih5JGIpCnogPC0gbWVyZ2UoeCwgeSwgYnkgPSAwLCBhbGwueCA9IFRSVUUpCnNhcHBseSh6LCBkYXRhLmNsYXNzKQpzdG9waWZub3QoaXMuY2hhcmFjdGVyKHokYikpCiMjIGVuZCBvZiBgcmVsYXRlZCB0byBQUiAxNTc3LzE2MDgnCgoKIyMgbG9naWNhbHMgYmVjYW1lIGZhY3RvcnMgPCAxLjYuMApzdG9waWZub3Qoc2FwcGx5KGFzLmRhdGEuZnJhbWUobWF0cml4KCgxOjEyKSUlIDQgPT0gMSwgMyw0KSksCgkJIGlzLmxvZ2ljYWwpKQoKCiMjIHJlY3ljbGluZyBvZiBmYWN0b3JzIGluIGRhdGEuZnJhbWUgKHdpc2ggZnJvbSBQUiMxNzEzKQpkYXRhLmZyYW1lKHg9YygiQSIsIkIiKSwgeT0iQyIpCSAgICAgIyBmYWlsZWQgdG8gcmVjeWNsZSBpbiAxLjUuMQpYIDwtIGRhdGEuZnJhbWUoeD1jKCJBIiwiQiIpLCB5PUkoIkMiKSkgIyBhbHNvIGZhaWxlZApYWCA8LSBkYXRhLmZyYW1lKHg9YygiQSIsIkIiKSwgeT1JKHJlcCgiQyIsIDIpKSkgIyBmaW5lCnN0b3BpZm5vdChpZGVudGljYWwoWCwgWFgpKQojIyBMYXN0IGlzIGZhbHNlIGluIHNvbWUgUyB2YXJpYW50cy4KCgojIyB0ZXN0IG9mIHJhbmstZGVmaWNpZW50IHByZWRpY3Rpb24sIGFzIHZhcmlvdXMgY2xhaW1zIHRoaXMgZGlkIG5vdCB3b3JrCiMjIG9uIFItaGVscCBpbiBKdW5lIDIwMDIKeDEgPC0gcm5vcm0oMTAwKQp4MyA8LSBybm9ybSgxMDApCnkgPC0gcm5vcm0oMTAwKQp0cmFpbiA8LSBkYXRhLmZyYW1lKHk9eSwgeDE9eDEsIHgyPXgxLCB4Mz14MykKZml0IDwtIGxtKHkgfiAuLCB0cmFpbikKc3RvcGlmbm90KGFsbC5lcXVhbChwcmVkaWN0KGZpdCksIHByZWRpY3QoZml0LCB0cmFpbikpKQojIyB3YXJuaW5nIGFkZGVkIGZvciAxLjYuMAoKCiMjIHRlcm1zKHkgfiAuKSBvbiBkYXRhIGZyYW1lcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcwpERiA8LSBkYXRhLmZyYW1lKHkgPSBybm9ybSgxMCksIHgxID0gcm5vcm0oMTApLCB4MiA9IHJub3JtKDEwKSwgeDMgPSBybm9ybSgxMCkpCm5hbWVzKERGKVszXSA8LSAieDEiCmZpdCA8LSB0cnkobG0oeSB+IC4sIERGKSkKc3RvcGlmbm90KGNsYXNzKGZpdCkgPT0gInRyeS1lcnJvciIpCiMjIGhhZCBmb3JtdWxhIHkgfiB4MSArIHgxICsgeDMgaW4gMS41LjEuCgoKIyMgUFIjMTc1OSBhcy5jaGFyYWN0ZXIub2N0bW9kZSgpIChIZW5yaWsgQmVuZ3Rzc29uKQp4IDwtIDA7IGNsYXNzKHgpIDwtICJvY3Rtb2RlIgpzdG9waWZub3QoYXMuY2hhcmFjdGVyKHgpID09ICIwIikKIyMgZ2F2ZSAiIiBpbiAxLjUuMQoKCiMjIFBSIzE4NDMgdW5zcGxpdCgpIHdpdGggZiBhIGxpc3QKZyA8LSBmYWN0b3Iocm91bmQoMTAgKiBydW5pZigxMDAwKSkpCnggPC0gcm5vcm0oMTAwMCkgKyBzcXJ0KGFzLm51bWVyaWMoZykpCnhnIDwtIHNwbGl0KHgsIGxpc3QoZzE9ZyxnMj1nKSkKcmVzIDwtIHVuc3BsaXQoeGcsIGxpc3QoZzE9ZywgZzI9ZykpCnN0b3BpZm5vdCh4ID09IHJlcykgIyBjYW4ndCBoYXZlIHJvdW5kaW5nIGVycm9yIGhlcmUKIyMgZ2F2ZSBpbmNvcnJlY3QgcmVzdWx0IHdpdGggd2FybmluZyBpbiAxLjUuMS4KCgojIyBtYXRjaGluZyBOQXMgb24gU29sYXJpcyAoTU0gMjAwMi0wOC0wMikKIyB4IDwtIGFzLmRvdWJsZShOQSkKIyBpZGVudGljYWwoeCArIDAsIHgpCiMgc3RvcGlmbm90KG1hdGNoKHggKyAwLCB4LCAwKSA9PSAxKQojIyBtYXRjaCBmYWlsZWQgb24gU29sYXJpcyB3aXRoIHNvbWUgY29tcGlsZXIgc2V0dGluZ3MKIyMgTkErMCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBOQTogY291bGQgYmUgTmFOCgoKIyMgaWRlbnRpY2FsIG9uIHNwZWNpYWxzICAoQkRSIDIwMDItMDgtMDIpCnN0b3BpZm5vdChpZGVudGljYWwoYXMuZG91YmxlKE5BKSwgTmFOKSA9PSBGQUxTRSkKIyMgd2FzIGlkZW50aWNhbCBvbiAxLjUuMQoKCiMjIHNhZmUgcHJlZGljdGlvbiAoUFIjMTg0MCkKY2Fycy4xIDwtIGxtKGRpc3QgfiBwb2x5KHNwZWVkLCBkZWdyZWUgPSAxKSwgZGF0YSA9IGNhcnMpCmNhcnMxICA8LSBsbShkaXN0IH4JIHNwZWVkLAkJICAgICBkYXRhID0gY2FycykKREYgPC0gZGF0YS5mcmFtZShzcGVlZD00KQpzdG9waWZub3QoYWxsLmVxdWFsKHByZWRpY3QoY2Fycy4xLCBERiksIHByZWRpY3QoY2FyczEsIERGKSkpCiMjIGVycm9yIGluIDEuNS4xCgoKIyMgT3BzLmRhdGEuZnJhbWUgKFBSIzE4ODkpCmQgPC0gZGF0YS5mcmFtZSgxOjEwKQpkID4gbGlzdCg1KQojIyBmYWlsZWQgaW4gMS41LjEKCgojIyBvcmRlcihuYS5sYXN0ID0gTkEpIChQUiMxOTEzIC8gMTkwNiAvIDE5ODEpCnggPC0gMQpvcmRlcih4LCBuYS5sYXN0PU5BKQpvcmRlcih4LCB4LCB4LCBuYS5sYXN0PU5BKQojIyBmYWlsZWQgaW4gMS41LjEsIHNpbmNlIHNhcHBseSBzaW1wbGlmaWVkIHRvIGEgc2NhbGFyLgpzdG9waWZub3QoMzoxID09IG9yZGVyKGMoMSwyLDMsTkEpLCBuYS5sYXN0PU5BLCBkZWNyZWFzaW5nPVRSVUUpKQojIyBpZ25vcmVkIGBkZWNyZWFzaW5nJyBpbiAxLjUuMQpvcmRlcihjKE5BLCBOQSksIG5hLmxhc3QgPSBOQSkKIyMgZXJyb3IgaW4gMS41LjEsIG5vdyBpbnRlZ2VyKDApCgojIyBhcy5saXN0KCkgY29lcmNlZCBsb2dpY2FsIHRvIGludGVnZXIgKFBSIzE5MjYpCnggPC0gYyhUUlVFLEZBTFNFLE5BKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsIHVubGlzdChhcy5saXN0KHgpKSkpCiMjIHRoZSAybmQgd2FzICgxLDAsTkEpIGJlZm9yZSAxLjYKCgojIyB0ZXN0IG9mIGxvbmcgRXJyb3IgZXhwcmVzc2lvbiBpbiBhb3YoKTogUFIjMTMxNSBhbmQgbGF0ZXIsCiMjIGFuZCBhbHNvIGEgY3Jvc3MtY2hlY2sgb2YgZGVwYXJzZSgsIGN1dG9mZiA9IDUwMCkKQUEgPC0gc3RydWN0dXJlKGxpc3QoWTIgPSBjKDEwLCA5LCAwLCAwLCA1LCA2LCAwLCAwLCA4LCA5LCAwLCAwLCA0LAo0LCAwLCAwLCAxMiwgMTEsIDIsIDAsIDYsIDcsIDAsIDApLCBQMiA9IHN0cnVjdHVyZShjKDFMLCAxTCwKMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMkwsIDJMLCAyTCwgMkwsIDJMLCAyTCwgMkwsIDJMLCAzTCwgM0wsCjNMLCAzTCwgM0wsIDNMLCAzTCwgM0wpLCAuTGFiZWwgPSBjKCIxIiwgIjIiLCAiMyIpLCBjbGFzcyA9ICJmYWN0b3IiKSwKICAgIEFBQUFBQUFBID0gc3RydWN0dXJlKGMoMUwsIDFMLCAxTCwgMUwsIDJMLCAyTCwgMkwsIDJMLCAxTCwKICAgIDFMLCAxTCwgMUwsIDJMLCAyTCwgMkwsIDJMLCAxTCwgMUwsIDFMLCAxTCwgMkwsIDJMLCAyTCwgMkwKICAgICksIC5MYWJlbCA9IGMoIkUxIiwgIkUyIiksIGNsYXNzID0gImZhY3RvciIpLCBCMiA9IHN0cnVjdHVyZShjKDFMLAogICAgMUwsIDJMLCAyTCwgMUwsIDFMLCAyTCwgMkwsIDFMLCAxTCwgMkwsIDJMLCAxTCwgMUwsIDJMLCAyTCwKICAgIDFMLCAxTCwgMkwsIDJMLCAxTCwgMUwsIDJMLCAyTCksIC5MYWJlbCA9IGMoIlJlZCIsICJVbnJlZCIKICAgICksIGNsYXNzID0gImZhY3RvciIpLCBDMiA9IHN0cnVjdHVyZShjKDFMLCAyTCwgMUwsIDJMLCAxTCwKICAgIDJMLCAxTCwgMkwsIDFMLCAyTCwgMUwsIDJMLCAxTCwgMkwsIDFMLCAyTCwgMUwsIDJMLCAxTCwgMkwsCiAgICAxTCwgMkwsIDFMLCAyTCksIC5MYWJlbCA9IGMoIkFnZW50IiwgIlBhdGllbnQiKSwgY2xhc3MgPSAiZmFjdG9yIikpLAogICAgLk5hbWVzID0gYygiWTIiLCAiUDIiLCAiQUFBQUFBQUEiLCAiQjIiLCAiQzIiKSwKICAgIGNsYXNzID0gImRhdGEuZnJhbWUiLCByb3cubmFtZXMgPSAxOjI0KQpBSzJhbm92YS5vdXQgPC0KICAgIGFvdihZMiB+IEFBQUFBQUFBICogQjIgKiBDMiArCglFcnJvcihQMiArIFAyOkFBQUFBQUFBICsgUDI6QjIgKyBQMjpDMiArIFAyOkFBQUFBQUFBOkIyICsKCSAgICAgIFAyOkFBQUFBQUFBOkMyICsgUDI6QjI6QzIgKyBQMjpBQUFBQUFBQTpCMjpDMiksCglkYXRhPUFBKQojIyBmYWlsZWQgaW4gMS41LjEKCiMjIGFzLmNoYXJhY3RlciB3YXMgc2lsZW50bHkgdHJ1bmNhdGluZyBleHByZXNzaW9ucyB0byA2MCBjaGFycwpxMiA8LSBleHByZXNzaW9uKGMoMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTkpKQoocTMgPC0gYXMuY2hhcmFjdGVyKHEyKSkKc3RvcGlmbm90KG5jaGFyKHEzKSA9PSA2OCkKIyMgd2FzIDYxIGluIDEuNS4xCgoKIyMgT3BzIHdhc24ndCB1c2luZyBOZXh0TWV0aG9kIGNvcnJlY3RseQoKIyMgT3BzLm9yZGVyZWQ6Cm9yIDwtIG9yZGVyZWQoYygiYSIsImIiLCJjIikpCnN0b3BpZm5vdCggKG9yID09ICJhIikgPT0gYyhUUlVFLEZBTFNFLEZBTFNFKSkKc3RvcGlmbm90KG9yID09IG9yKQpzdG9waWZub3Qob3IgIT0gImQiKQojIyAgbGFzdCB3YXMgTkEgTkEgTkEgaW4gMS41LjEKCgpPcHMuZm9vIDwtIGZ1bmN0aW9uKGUxLCBlMikgewogICAgTmV4dE1ldGhvZCgpCn0KT3BzLmJheiA8LSBmdW5jdGlvbihlMSwgZTIpIHsKICAgTmV4dE1ldGhvZCgpCn0KYSA8LSBiIDwtIDEKY2xhc3MoYSkgPC0gYygiZm9vIiwiYmFyIiwiYmF6IikKY2xhc3MoYikgPC0gYygiZm9vIiwiYmF6IikKc3RvcGlmbm90KGEgPT0gMSwKCSAgYiA9PSBhKQojIyhhbHJlYWR5IHdvcmtlZCBpbiAxLjUuMSkKCgojIyB0KCkgd3JvbmdseSBrZXB0ICJ0cyIgY2xhc3MgYW5kICJ0c3AiCnQodHMoYyhhPTEsIGQ9MikpKQojIyBnYXZlIGVycm9yIHdoaWxlIHByaW50aW5nIGluIDEuNS4xCmF0IDwtIGF0dHJpYnV0ZXModCh0cyhjYmluZCgxLCAxOjIwKSkpKQpzdG9waWZub3QobGVuZ3RoKGF0KSA9PSAyLAoJICBhdCRkaW0gPT0gYygyLCAyMCksCgkgIGF0JGRpbW5hbWVzW1sxXV0gPT0gcGFzdGUoIlNlcmllcyIsIDE6MikpCiMjIGZhaWxlZCBpbiAxLjUuMQoKCiMjIE5leHRtZXRob2QgZnJvbSBhbm9ueW1vdXMgZnVuY3Rpb24gKFBSIzEyMTEpCnRyeSggZ2V0KCJwcmludC50cyIpKDEpICkjIC0+IEVycm9yCiMjIHNlZy5mYXVsdGVkIHRpbGwgMS41LjEKCgojIyBjYmluZC9yYmluZCBzaG91bGQgd29yayB3aXRoIE5VTEwgb25seSBhcmdzCnN0b3BpZm5vdChpcy5udWxsKGNiaW5kKE5VTEwpKSwgaXMubnVsbChjYmluZChOVUxMLE5VTEwpKSwKCSAgaXMubnVsbChyYmluZChOVUxMKSksIGlzLm51bGwocmJpbmQoTlVMTCxOVUxMKSkpCiMjIGdhdmUgZXJyb3IgZnJvbSAwLjYzIHRpbGwgMS41LjEKCgojIyBzZXEuUE9TSVh0KCkgaGFkIHJvdW5kaW5nIHByb2JsZW06CnN0b3BpZm5vdCg0ID09IGxlbmd0aChzZXEoZnJvbT1JU09kYXRlKDIwMDAsMSwxKSwgdG89SVNPZGF0ZSgyMDAwLDEsNCksCgkJCSAgbGVuZ3RoLm91dD00KSkpCiMjIGxlbmd0aCB3YXMgNSB0aWxsIDEuNi4wCgoKIyMgbG9lc3MgaGFzIGEgbGltaXQgb2YgNCBwcmVkaWN0b3JzIChKb2huIERla2Ugb24gUi1oZWxwLCAyMDAyLTA5LTE2KQpkYXRhMSA8LSBhcnJheShydW5pZig1MDAqNSksYyg1MDAsNSkpCmNvbG5hbWVzKGRhdGExKSA8LSBjKCJ4MSIsIngyIiwieDMiLCJ4NCIsIng1IikKeSA8LSAzKzIqZGF0YTFbLCJ4MSJdKzE1KmRhdGExWywieDIiXSsxMypkYXRhMVssIngzIl0tOCpkYXRhMVssIng0Il0rMTQqZGF0YTFbLCJ4NSJdK3Jub3JtKDUwMCkKZGF0YTIgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh5LGRhdGExKSkKcmVzdWx0NCA8LSBsb2Vzcyh5fngxK3gyK3gzK3g0LGRhdGEyKQp0cnkocmVzdWx0NSA8LSBsb2Vzcyh5fngxK3gyK3gzK3g0K3g1LGRhdGEyKSkKIyMgc2VnZmF1bHRlZCBpbiAxLjUuMQoKCiMjIGZvcm1hdC5Bc0lzIHdhcyBub3QgaGFuZGxpbmcgbWF0cmljZXMKamsgPC0gZGF0YS5mcmFtZSh4MT0yLCB4Mj1JKG1hdHJpeCgwLDEsMikpKQpqawojIyBwcmludGluZyBmYWlsZWQgaW4gMS41LjEKCgojIyBlaWdlbnZlY3RvcnMgZ290IGlycmVsZXZhbnQgbmFtZXMgKFBSIzIxMTYpCnNldC5zZWVkKDEpCkEgPC0gbWF0cml4KHJub3JtKDIwKSwgNSwgNSkKZGltbmFtZXMoQSkgPC0gbGlzdChMRVRURVJTWzE6NV0sIGxldHRlcnNbMTo1XSkKKGV2IDwtIGVpZ2VuKEEpJHZlY3RvcnMpCnN0b3BpZm5vdChpcy5udWxsKGNvbG5hbWVzKGV2KSkpCiMjIGhhZCBjb2xuYW1lcyBpbiAxLjYuMAoKCiMjIHByZXR0eSB3YXMgbm90IHByZXR0eSB7YmVjYXVzZSBzZXEoKSBpc24ndH0gKFBSIzEwMzIgYW5kIEQuQnJhaG0pCnN0b3BpZm5vdChwcmV0dHkoYygtLjEsIDEpKVsyXSA9PSAwLCAjIyBbMl0gd2FzIC0yLjc3NTU1OGUtMTcKCSAgcHJldHR5KGMoLS40LC44KSlbM10gPT0gMCwgIyMgWzNdIHdhcyA1LjU1MTExNWUtMTcKCSAgcHJldHR5KDEwMCsgYygwLCBwaSoxZS0xMCkpWzRdID4gMTAwLCMgPCBub3QgdG9vIG11Y2ggcm91bmRpbmchCgkgIHByZXR0eShjKDIuOCwzKSlbMV0gPT0gMi44KQojIyBsYXN0IGRpZmZlcmVkIGJ5IDQuNDRlLTE2IGluIFIgMS4xLjEKCgojIyBhZGQxIHdhcyBnaXZpbmcgbWlzbGVhZGluZyBtZXNzYWdlIHdoZW4gc2NvcGUgd2FzIG5vbnNlbnNpY2FsLgpjb3VudHMgPC0gYygxOCwxNywxNSwyMCwxMCwyMCwyNSwxMywxMikKZml0IDwtIGdsbShjb3VudHMgfiAxLCBmYW1pbHk9cG9pc3NvbikKcmVzIDwtIHRyeShhZGQxKGZpdCwgfiAuKSkKIyMgZXJyb3IgaW4gMS42LjAgd2FzCiMjIGBFcnJvciBpbiBpZiAobmNvbChhZGQpID4gMSkgeyA6IG1pc3NpbmcgdmFsdWUgd2hlcmUgbG9naWNhbCBuZWVkZWQnCnN0b3BpZm5vdChsZW5ndGgoZ3JlcCgibWlzc2luZyB2YWx1ZSIsIHJlcykpID09IDApCgoKIyMgc3RyaXBjaGFydCB3aXRoIE5BcyAoUFIjMjAxOCkKU2VwYWwgPC0gaXJpcyRTZXBhbC5MZW5ndGgKU2VwYWxbMjddIDwtIE5BCnN0cmlwY2hhcnQoU2VwYWwgfiBpcmlzJFNwZWNpZXMsIG1ldGhvZD0ic3RhY2siKQojIyBmYWlsZWQgaW4gMS42LjEKCgojIyBsb3NpbmcgaXMub2JqZWN0IGJpdCBpbnRlcm5hbGx5IChQUiMyMzE1KQpzdG9waWZub3QoaXMudHMobG9nKGFzLnRzKDE6MTApKSkpCiMjIGZhaWxlZCBmb3IgaW50ZWdlciBvcmlnaW5hbCBhcyBoZXJlIGluIDEuNi4xLgoKCiMjIGZvcm1hdEMgaWdub3JlZCByb3VuZGluZyB1cCAoUFIjMjI5OSkKc3RvcGlmbm90KGZvcm1hdEMoOTkuOSwgMSwgZm9ybWF0PSJmZyIpID09ICIxMDAiKQpzdG9waWZub3QoZm9ybWF0Qyg5OS45LCAyLCBmb3JtYXQ9ImZnIikgPT0gIjEwMCIpCnN0b3BpZm5vdChmb3JtYXRDKDk5LjksIDMsIGZvcm1hdD0iZmciKSA9PSAiOTkuOSIpCiMjIGdhdmUgZXhwb25lbnRpYWwgZm9ybWF0IG9uIDEuNi4xCgoKIyMgZnVsbC9wYXJ0aWFsIG1hdGNoaW5nIGluIGF0dHIuCnRtcCA8LSBsaXN0KGlkPTEpCmF0dHIodG1wLCJuLmNoIikgPC0gMgphdHRyKHRtcCwibiIpIDwtIDEKYXR0cmlidXRlcyh0bXApCihyZXMgPC0gYXR0cih0bXAsICJuIikpCnN0b3BpZm5vdChsZW5ndGgocmVzKSA9PSAxICYmIHJlcyA9PSAxKQojIyBnYXZlIE5VTEwgaW4gMS42LjEKCgojIyBGb3JtZXJseSB1bmRvY3VtZW50ZWQgbGluZSBsaW1pdCBpbiBzeXN0ZW0oaW50ZXJuPVRSVUUpCiMjIE5hb2tpIFRha2ViYXlhc2hpIDxudGFrZWJheUBiaW8uaW5kaWFuYS5lZHU+IDIwMDItMTItMDcKdG1wIDwtIHRlbXBmaWxlKCkKbG9uZyA8LSBwYXN0ZShyZXAoIjAxMjM0NTY3ODkiLCAyMEwpLCBjb2xsYXBzZT0iIikKY2F0KGxvbmcsICJcbiIsIHNlcD0iIiwgZmlsZT10bXApCmp1bmsgPC0gc3lzdGVtKHBhc3RlKCJjYXQiLCBzaFF1b3RlKHRtcCkpLCBpbnRlcm4gPSBUUlVFKQpzdG9waWZub3QobGVuZ3RoKGp1bmspID09IDFMLCBuY2hhcihqdW5rWzFdKSA9PSAyMDBMKQojIyBhbmQgc3BsaXQgdHJ1bmNhdGVkIG9uIDEuNi4xCgoKIyMgbWlzc2luZyBncm91cCBnZW5lcmljcyBmb3IgYGRpZmZ0aW1lJyAocmVsYXRlZCB0byBQUiMyMzQ1KQp4IDwtIGFzLmRpZmZ0aW1lKGMoIjA6MzoyMCIsICIxMToyMzoxNSIpKQp5IDwtIElTT2RhdGUoMjAwMSwgNCwgMjYpIC0gSVNPZGF0ZSgyMDAxLCAyLCAyNikKeCArIHgKMip4CnggPCB5CnggPCAxMDAKIyMgYWxsIGJ1dCBsYXN0IGZhaWxlZCBpbiBSIDwgMS43LjAKCgojIyBQUiAyMzU4IChwYXJ0KQptbSA8LSAxOjIKbmFtZXMobW0pWzJdIDwtICd5JwoobW0gPC0gYyhtbSwgMykpCnN0b3BpZm5vdChpcy5uYShuYW1lcyhtbSlbMV0pKQojIyAxLjYuMSBoYWQgIk5BIgoKCiMjIFBSIDIzNTcKYSA8LSBtYXRyaXgoYygxLDIsMywtMSwtMiwzKSwyLDMsZGltbmFtZXM9bGlzdChjKCJBIiwiQiIpLE5VTEwpKQooeiA8LSBwbWF4KGEsIDApKQpzdG9waWZub3QoaWRlbnRpY2FsKGRpbW5hbWVzKHopLCBkaW1uYW1lcyhhKSkpCiMgZnVydGhlciBjaGVja3MKYSA8LSBtYXRyaXgoYygxLDIsMywtMSwtMiwzKSwyLDMsZGltbmFtZXM9bGlzdChjKCJBIiwiQiIpLDE6MykpCih6IDwtIHBtYXgoYSwgMCkpCnN0b3BpZm5vdChpZGVudGljYWwoZGltbmFtZXMoeiksIGRpbW5hbWVzKGEpKSkKYSA8LSBtYXRyaXgoYygxLDIsMywtMSwtMiwzKSwyLDMsZGltbmFtZXM9bGlzdChOVUxMLCBsZXR0ZXJzWzE6M10pKQooeiA8LSBwbWF4KGEsIDApKQpzdG9waWZub3QoaWRlbnRpY2FsKGRpbW5hbWVzKHopLCBkaW1uYW1lcyhhKSkpCiMjIDEuNi4xIG9ubHkgdHJhbnNmZXJyZWQgZGltbmFtZXMgaWYgYm90aCBjb21wb25lbnRzIHdlcmUgbm9uLW51bGwKCgojIyBpbnRlcm5hbCBjb252ZXJzaW9uIHRvIGZhY3RvciBpbiB0eXBlLmNvbnZlcnQgd2FzIG5vdCByaWdodAojIyBpZiBhIGNoYXJhY3RlciBzdHJpbmcgTkEgd2FzIGludm9sdmVkLgp4IDwtIGMoTkEsICJOQSIsICJmb28iKQooeiA8LSB0eXBlLmNvbnZlcnQoeCkpCnN0b3BpZm5vdChpZGVudGljYWwobGV2ZWxzKHopLCAiZm9vIikpCih6IDwtIHR5cGUuY29udmVydCh4LCBuYS5zdHJpbmdzPWNoYXJhY3RlcigwKSkpCnN0b3BpZm5vdChpZGVudGljYWwobGV2ZWxzKHopLCBzb3J0KGMoImZvbyIsICJOQSIpKSkpCih6IDwtIHR5cGUuY29udmVydCh4LCBuYS5zdHJpbmdzPSJmb28iKSkKc3RvcGlmbm90KGlkZW50aWNhbChsZXZlbHMoeiksICJOQSIpKQojIyBleHRyYSBsZXZlbCBpbiAxLjYuMQoKCiMjIHJlbGF0ZWQgZXhhbXBsZQp0bXAgPC0gdGVtcGZpbGUoKQpjYXQoYygiMSIsICJmb28iLCAiXG4iLCAiMiIsICJOQSIsICJcbiIpLCBmaWxlID0gdG1wKQooeiA8LSByZWFkLnRhYmxlKHRtcCwgbmEuc3RyaW5ncz0iZm9vIikpCnVubGluayh0bXApCnN0b3BpZm5vdChpZGVudGljYWwobGV2ZWxzKHokVjIpLCAiTkEiKSwKCSAgaWRlbnRpY2FsKGlzLm5hKHokVjIpLCBjKFRSVUUsIEZBTFNFKSkpCiMjIDEuNi4xIGhhZCBWMiBhcyBOQSBOQS4KCgojIyBQUiMyMzk2LCBwYXJzaW5nIGFuZCBwdXNoYmFja3MuCnRtcCA8LSB0ZW1wZmlsZSgpCmNhdCggYyggIjEiLCAiYStiIiwgIjIiKSwgZmlsZT10bXAsIHNlcD0iXG4iKQpvcGVuKHRjb24gPC0gZmlsZSh0bXApKQpyZWFkTGluZXModGNvbiwgbj0xKQpwdXNoQmFjaygiYTErYjEiLCB0Y29uKQpwYXJzZShmaWxlPXRjb24sIG49MSkKY2xvc2UodGNvbikKdW5saW5rKHRtcCkKIyMgZmFpbGVkIHdpdGggc3ludGF4IGVycm9yIGluIDEuNi4xCgoKIyMgTkFzIGluIG1heC5jb2wKYSA8LSBtYXRyaXgoMSwgMywgMykKYVsxLDJdIDwtIE5BCih6IDwtIG1heC5jb2woYSkpCnN0b3BpZm5vdChpcy5uYSh6WzFdKSkKIyMgZ2F2ZSAocmFuZG9tbHkpIDEgb3IgMyBpbiAxLjYuMQoKCiMjIFBSIzI0Njk6IHJlYWQudGFibGUgb24gTWFjIE9TIENSLXRlcm1pbmF0ZWQgZmlsZXMuCnRtcCA8LSB0ZW1wZmlsZSgpCnggPC0gYygiYWFhIiwgImJiYiIsICJjY2MiKQpjYXQoeCwgc2VwPSJcciIsIGZpbGU9dG1wKQpjb24gPC0gZmlsZSh0bXApCm9wZW4oY29uKQpsaW5lIDwtIHJlYWRMaW5lcyhjb24sIDEpCnB1c2hCYWNrKGxpbmUsIGNvbikKKHkgPC0gcmVhZExpbmVzKGNvbikpCmNsb3NlKGNvbikKdW5saW5rKHRtcCkKc3RvcGlmbm90KGlkZW50aWNhbCh4LCB5KSkKIyMgcHVzaGJhY2sgcHJvYmxlbXMgaW4gMS42LjIgb25seQoKCiMjIGRpbW5hbWVzIGluIHNvbHZlKCk6IG5vdCBhIGJ1ZyBqdXN0IGFuIGltcHJvdmVtZW50IGluIDEuNy4wCkEgPC0gZGlhZygzKQpkaW1uYW1lcyhBKSA8LSBsaXN0KExFVFRFUlNbMTozXSwgbGV0dGVyc1sxOjNdKQooQiA8LSBzb2x2ZShBKSkKc3RvcGlmbm90KGlkZW50aWNhbChjb2xuYW1lcyhCKSwgcm93bmFtZXMoQSkpKQojIyBSIDwgMS43LjAgaGFkIG5vIGNvbG5hbWVzIGZvciBCLCBhbmQgUyBoYXMgdGhlIGNvbG5hbWVzIG9mIEEuCnN0b3BpZm5vdChhbGwuZXF1YWwodChCKSwgc29sdmUodChBKSkpKQojIyB0ZXN0IGhlcmUgaXMgb2YgZGltbmFtZXMKCgojIyBQUiMyNTA3OiBleHRyYWN0aW5nIDAtbGVuZ3RoIGRpbWVuc2lvbnMgZm9yIGFycmF5cwpkbiA8LSBsaXN0KExFVFRFUlNbMToyXSwgbGV0dGVyc1sxOjNdLCBwYXN0ZSgidCIsMTo0LHNlcD0iIikpCkEuIDwtIGFycmF5KDE6MjQsIGRpbSA9IDI6NCwgZGltbmFtZXMgPSBkbikKc3RyKEEuWzEsIDAsIDIgXSkKc3RyKEEuWzEsIDAsIDIsIGRyb3AgPSBGQUxTRV0pCiMjIGJvdGggZ2F2ZSBlcnJvcnMgaW4gMS42LjIKCnBsb3Qoc2YgPC0gc3RlcGZ1bigyLCAzOjQpKQojIyBmYWlsZWQgaW4gMS42LjIKCgojIyBQUiMyNTQxLCBjYmluZCAoYW5kIHJiaW5kKSB3aXRoIHplcm8tbGVuZ3RoIGNvbXBvbmVudHMKeSA8LSBtYXRyaXgoMCwxLDApCmNiaW5kKHksIGludGVnZXIoMCkpCnkgPC0gbWF0cml4KDAsMCwxKQpyYmluZCh5LCBpbnRlZ2VyKDApKQojIyBnYXZlIGZhdGFsIGVycm9yIGluIDEuNi4yLCBzaW5jZSBtaXNjYWxjdWxhdGVkIG5vIG9mIHJvd3MvY29scy4KCgojIyBQUiMyNTE4IG11bHRpcGxlIG9iamVjdHMgaW4gQUlDLmRlZmF1bHQuCmxtMSA8LSBsbSh5IH4geCwgbGlzdCh4PTE6MTAsIHk9aml0dGVyKDE6MTApKSkKbG0yIDwtIGxtKHkgfiB4LCBsaXN0KHg9MToxMCwgeT1qaXR0ZXIoMToxMCkpKQpBSUMobG0xLCBsbTIpCkFJQyhsbTEsIGxtMiwgIGs9MikKIyMgc2Vjb25kIGZhaWxlZCBpbiAxLjYuMgoKCiMjIFBSIzI1OTEgdW5pcXVlIG9uIG9yZGVyZWQgZmFjdG9yCmYgPC0gb3JkZXJlZChtb250aC5uYW1lLCBsZXZlbHM9bW9udGgubmFtZSkKKHVmIDwtIHVuaXF1ZShmKSkKc3RvcGlmbm90KGlzLm9yZGVyZWQodWYpKQojIyBnYXZlIGZhY3RvciBpbiAxLjYuMgoKCiMjIFBSIzI1ODcgY29lcmNpb24gb2YgbGVuZ3RoLTAgdmVjdG9ycwp4IDwtIG51bWVyaWMoMCkKeFsxXSA8LSBOQQpzdG9waWZub3QoaWRlbnRpY2FsKG1vZGUoeCksICJudW1lcmljIikpCiMjCgoKIyMgY29lcmNpb24gbG9zdCB0aGUgb2JqZWN0IGJpdCBpbiBbPC0KeCA8LSBJKFRSVUUpCmlzLm9iamVjdCh4KQp4WzJdIDwtICJOIgpzdG9waWZub3QoaXMub2JqZWN0KHgpKQojIyBmYWlsZWQgaW4gMS42LjIKCgojIyBjaGVjayBpbmhlcml0cyBub3cgd29ya3MgZm9yIGJhc2ljIGNsYXNzZXM6CnggPC0gMTozCmlzLm9iamVjdCh4KSAjIEZBTFNFCnN0b3BpZm5vdChpbmhlcml0cyh4LCAiaW50ZWdlciIpKQojIyAyMDAzLU1hci0xMiBpdCBkaWQgbm90CgoKIyMgcmFuaygpIGlzIG51bWVyaWMgYWxzbyBmb3IgTkEgY2hhciB2ZWN0b3JzCnN0b3BpZm5vdChpcy5udW1lcmljKHJrIDwtIHJhbmsoYygiY2giLCJjIiwgTkEpKSksCiAgICAgICAgICBhbGwocmsgPT0gYygyLDEsMykpKQojIyBkaWQgbm90IGZyb20gUiAxLjIgLS0gMS42CgoKIyMgdGFibGUoKSBzaG91bGQgYnkgZGVmYXVsdCBrZWVwIE5BIGxldmVscyBvZiBmYWN0b3JzCmkgPC0gYygxOjIsTkEpOwkgZmkgPC0gZmFjdG9yKGksIGV4Y2x1ZGUgPSBOVUxMKQpzdG9waWZub3QoaWRlbnRpY2FsKGFzLmNoYXJhY3RlcihpKSwgZGltbmFtZXModGFibGUoZmkpKVtbMV1dKSkKIyMgbm90IGluIDIwMDMtTWFyLTEwIHVuc3RhYmxlCgoKIyMgW2xtLl1pbmZsdWVuY2UoKSBmb3IgbXVsdGl2YXJpYXRlIGxtIDoKbiA8LSAzMgpZMCA8LSBtYXRyaXgocm5vcm0oMyAqIG4pLCBuLCAzKSAjIGFuZCBhIHZlcnNpb24gd2l0aCBuYW1lZCBZJ3MKWW4gPC0gWTA7IGNvbG5hbWVzKFluKSA8LSBwYXN0ZTAoIlkiLDE6MykKWCA8LSBtYXRyaXgocm5vcm0oNSAqIG4pLCBuLCA1KQpmb3IoWSBpbiBsaXN0KFkwLCBZbikpIHsKICAgIGZtTCA8LSBsYXBwbHkoMTozLCBmdW5jdGlvbihqKSBsbShZWyxqXSB+IFgpKQogICAgaW5mTCA8LSBsYXBwbHkoZm1MLCBsbS5pbmZsdWVuY2UpCiAgICBpbmZtIDwtIGxtLmluZmx1ZW5jZShtb2QgPC0gbG0oWSB+IFgpKQogICAgaWYoaW50ZXJhY3RpdmUoKSkgc3RyKGluZkwsIGdpdmUuYXR0cj1GQUxTRSkgIyBzaG91bGQgbWF0Y2ggdGhlICdpbmZtJyBwYXJ0cwogICAgIyMgMS4gImhhdCIgYXJlIGFsbCB0aGUgMyB0aGUgc2FtZQogICAgaGF0TCA8LSBzYXBwbHkoaW5mTCwgYFtbYCwgImhhdCIpCiAgICBzdG9waWZub3QoYWxsLmVxdWFsKGhhdExbLDFdLCBoYXRMWywyXSksIGFsbC5lcXVhbChoYXRMWywyXSwgaGF0TFssM10pKQogICAgIyMgMi4gdGhlIG90aGVyIDMgY29tcG9uZW50cyBzaG91bGQgYmUgImNvbmNhdGVuYXRlZCIgdG8gZ2l2ZSBzYW1lIGFzIG1sbSA6CiAgICBmb3Iobm0gaW4gYygiY29lZmZpY2llbnRzIiwgInNpZ21hIiwgInd0LnJlcyIpKSB7CiAgICAgICAgc3RvcGlmbm90KGFsbC5lcXVhbCh1bm5hbWUoaW5mbVtbbm1dXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bm5hbWUoc2FwcGx5KGluZkwsIGBbW2AsIG5tLCBzaW1wbGlmeT0iYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0UuTkFNRVM9RkFMU0UpKSkpCiAgICB9CiAgICAjIyBmYWlsZWQgdXAgdG8gMjAwMy0wMy0yOSAocHJlIDEuNy4wKQogICAgaW0xIDwtIGluZmx1ZW5jZS5tZWFzdXJlcyhtb2QpCiAgICBkZmJzIDwtIGRmYmV0YXMobW9kKQogICAgZGltbmFtZXMoZGZicylbWzNdXSA8LSBkaW1uYW1lcyhpbTEkaW5mbWF0KVtbM11dWzE6Nl0KICAgIHN0b3BpZm5vdChhbGwuZXF1YWwoaW0xJGluZm1hdFssLDE6Nl0sIGRmYnMpKQp9IyBmb3IgYm90aCBZJ3MKIyMgbG0uaW5mbHVlbmNlKCkgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBmb3IgIm1sbSJzIGluIFIgPD0gMy41LjEKCgojIyByYmluZC5kYXRhLmZyYW1lIHdpdGggY2hhcmFjdGVyIGFuZCBvcmRlcmVkIGNvbHVtbnMKQSA8LSBkYXRhLmZyYW1lKGE9MSkKQSRiIDwtICJBIgpCIDwtIGRhdGEuZnJhbWUoYT0yKQpCJGIgPC0gIkIiCkFCIDwtIHJiaW5kKEEsQikKKGNsIDwtIHNhcHBseShBQiwgY2xhc3MpKQpzdG9waWZub3QoY2xbMl0gPT0gImNoYXJhY3RlciIpICMgd2FzIGZhY3RvciBpbiAxLjYuMgoKQSA8LSBkYXRhLmZyYW1lKGE9MTozLCBiPW9yZGVyZWQobGV0dGVyc1sxOjNdKSkKQiA8LSBkYXRhLmZyYW1lKGE9Nzo5LCBiPW9yZGVyZWQobGV0dGVyc1s3OjldKSkKQUIgPC0gcmJpbmQoQSxCKQooY2wgPC0gc2FwcGx5KEFCLCBjbGFzcykpCnN0b3BpZm5vdChjbCRiWzFdID09ICJvcmRlcmVkIikgIyB3YXMgZmFjdG9yIGluIDEuNi4yCkMgPC0gZGF0YS5mcmFtZShhPTQ6NiwgYj1sZXR0ZXJzWzQ6Nl0pCkFCQyA8LSByYmluZChBQiwgQykKKGNsIDwtIHNhcHBseShBQkMsIGNsYXNzKSkKc3RvcGlmbm90KGNsWzJdID09ICJmYWN0b3IiKQoKQSA8LSBkYXRhLmZyYW1lKGE9MSkKQSRiIDwtICJBIgpCIDwtIGRhdGEuZnJhbWUoYT0yLCBiPSJCIikKKEFCIDwtIHJiaW5kKEEsQikpCihjbCA8LSBzYXBwbHkoQUIsIGNsYXNzKSkKc3RvcGlmbm90KGNsWzJdID09ICJjaGFyYWN0ZXIiKQoKQSA8LSBkYXRhLmZyYW1lKGE9MSwgYj0iQSIpCkIgPC0gZGF0YS5mcmFtZShhPTIpCkIkYiA8LSAiQiIKKEFCIDwtIHJiaW5kKEEsQikpCihjbCA8LSBzYXBwbHkoQUIsIGNsYXNzKSkKc3RvcGlmbm90KGNsWzJdID09ICJmYWN0b3IiKQpBIDwtIGRhdGEuZnJhbWUoYT1jKCJBIiwgTkEsICJDIikpCkIgPC0gZGF0YS5mcmFtZShhPWMoIkIiLCBOQSwgIkMiKSkKKEFCIDwtIHJiaW5kKEEsQikpCnN0b3BpZm5vdChsZXZlbHMoQUIkYSkgPT0gYygiQSIsICJDIiwgIkIiKSkKQSA8LSBkYXRhLmZyYW1lKGE9SShjKCJBIiwgTkEsICJDIikpKQpCIDwtIGRhdGEuZnJhbWUoYT1JKGMoIkIiLCBOQSwgIkMiKSkpCihBQiA8LSByYmluZChBLEIpKQooY2wgPC0gc2FwcGx5KEFCLCBjbGFzcykpCnN0b3BpZm5vdChjbFsxXSA9PSAiQXNJcyIpCgpBIDwtIGRhdGEuZnJhbWUoYT0xKQpBJGIgPC0gIkEiCkIgPC0gZGF0YS5mcmFtZShhPTIsIGI9SSgiQiIpKQooQUIgPC0gcmJpbmQoQSxCKSkKKGNsIDwtIHNhcHBseShBQiwgY2xhc3MpKQpzdG9waWZub3QoY2xbMl0gPT0gImNoYXJhY3RlciIpCgpBIDwtIGRhdGEuZnJhbWUoYT0xLCBiPSJBIikKQiA8LSBkYXRhLmZyYW1lKGE9MiwgYj1JKCJCIikpCihBQiA8LSByYmluZChBLEIpKQooY2wgPC0gc2FwcGx5KEFCLCBjbGFzcykpCnN0b3BpZm5vdChjbFsyXSA9PSAiZmFjdG9yIikKIyMKCgojIyBoY2x1c3QoKSwgYXMuaGNsdXN0LnR3aW5zKCksIGFnbmVzKCkgIGNvbnNpc3RlbmN5CnggPC0gbWF0cml4KHJub3JtKDMwKSwgbmNvbD0zKSAgIyBubyBvYnNlcnZhdGlvbiBuYW1lcwp4biA8LSB4OyByb3duYW1lcyh4bikgPC0gbGV0dGVyc1sxMDoxXSMgaGFzIG9icy4gbmFtZXMKaGMgIDwtIGhjbHVzdChkaXN0KHgpLCAgbWV0aG9kPSJjb21wbGV0ZSIpCmhjbiA8LSBoY2x1c3QoZGlzdCh4biksIG1ldGhvZD0iY29tcGxldGUiKQppQzEgPC0gIW5hbWVzKGhjKSAlaW4lIGMoImxhYmVscyIsICJjYWxsIikKc3RvcGlmbm90KGlkZW50aWNhbChoYywgaGhjIDwtIGFzLmhjbHVzdChoYykpLAogICAgICAgICAgaWRlbnRpY2FsKGhoYywgYXMuaGNsdXN0KGhoYykpLAogICAgICAgICAgaWRlbnRpY2FsKGhjW2lDMV0sIGhjbltpQzFdKSwKICAgICAgICAgIGlkZW50aWNhbChoY24kbGFiZWxzLCByb3duYW1lcyh4bikpCiAgICAgICAgICApCgppZihyZXF1aXJlKGNsdXN0ZXIpKSB7ICMgcmVxdWlyZWQgcGFja2FnZQogIGFnIDwtIGFnbmVzKHgsIG1ldGhvZD0iY29tcGxldGUiKQogIGhjYWcgPC0gYXMuaGNsdXN0KGFnKQogIGFnbiA8LSBhZ25lcyh4biwgbWV0aG9kPSJjb21wbGV0ZSIpCiAgaGNhZ24gPC0gYXMuaGNsdXN0KGFnbikKICBpQzIgPC0gIW5hbWVzKGhjYWcpICVpbiUgYygibGFiZWxzIiwgImNhbGwiKQogIHN0b3BpZm5vdChpZGVudGljYWwoaGNhZ25baUMyXSwgaGNhZ1tpQzJdKSwKICAgICAgICAgICAgaWRlbnRpY2FsKGhjYWduJGxhYmVscywgaGNuJGxhYmVscyksCiAgICAgICAgICAgIGFsbC5lcXVhbChoYyRoZWlnaHQsIGhjYWckaGVpZ2h0LCB0b2wgPSAxZS0xMiksCiAgICAgICAgICAgIGFsbChoYyRtZXJnZSA9PSBoY2FnJG1lcmdlIHwgaGMkbWVyZ2UgPT0gaGNhZyRtZXJnZVsgLDI6MV0pCiAgICAgICAgICAgICkKICBkZXRhY2goInBhY2thZ2U6Y2x1c3RlciIpCn0KIyMgYXMuaGNsdXN0LnR3aW5zKCkgbG9zdCBsYWJlbHMgYW5kIG1vcmUgdGlsbCAoaW5jbCkgMS42LjIKCgojIyBQUiMyODY3IHFyKExBUEFDSz1UUlVFKSBkaWRuJ3QgYWx3YXlzIHBpdm90IGluIDEuNy4wCnNldC5zZWVkKDEpClggPC0gbWF0cml4KHJub3JtKDQwKSwxMCw0KQpYWywxXSA8LSBYWywyXQoocXJ4IDwtIHFyKFgsIExBUEFDSz1UUlVFKSkKc3RvcGlmbm90KGFueShxcngkcGl2b3QgIT0gMTo0KSkgIyBjaGVjayBmb3IgcGl2b3RpbmcKIyMKCgojIyByb3duYW1lczwtIGRpZCBub3Qgd29yayBvbiBhbiBhcnJheSB3aXRoID4gMiBkaW1zIGluIDEuNy4wCkEgPC0gYXJyYXkoMToxMiwgZGltPWMoMiwgMywgMikpCnJvd25hbWVzKEEpIDwtIGxldHRlcnNbMToyXQpBIDwtIGFycmF5KDE6MTIsIGRpbT1jKDIsIDMsIDIpKQpjb2xuYW1lcyhBKSA8LSAxOjMKIyMgZmFpbGVkIGluIDEuNy4wCgoKIyMgcHJlZGljdCBvbiBjb25zdGFudCBtb2RlbCwgUFIjMjk1OApyZXMgPC0gbW9kZWwuZnJhbWUofjEsIGRhdGEuZnJhbWUoeCA9IDE6NSkpCnN0b3BpZm5vdChucm93KHJlcykgPT0gNSkKcmVzIDwtIHByZWRpY3QobG0oeSB+IDEsIGRhdGEgPSBkYXRhLmZyYW1lKHkgPSByZXAoMDozLCBjKDUsOSw3LDEpKSkpLAogICAgICAgICAgICAgICBuZXdkYXRhID0gZGF0YS5mcmFtZSh4ID0gMTo1KSkKc3RvcGlmbm90KGxlbmd0aChyZXMpID09IDUpCnJlcyA8LSBwcmVkaWN0KGdsbSh5IH4gMSwgZmFtaWx5ID0gcG9pc3NvbiwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZyYW1lKHkgPSByZXAoMDozLCBjKDUsOSw3LDEpKSkpLAogICAgICAgICAgICAgICBuZXdkYXRhID0gZGF0YS5mcmFtZSh4ID0gMTo1KSwgdHlwZSA9ICJyIikKc3RvcGlmbm90KGxlbmd0aChyZXMpID09IDUpCiMjIGFsbCBsZW5ndGggb25lIGluIDEuNy4wCgoKIyMgUFIjMjk5MyBuZWVkIHRvIGNvbnNpZGVyIGRlbHRhPU5VTEwgaW4gcG93ZXIudC50ZXN0e2N0ZXN0fQpwb3dlci50LnRlc3Qobj0xMCwgZGVsdGE9TlVMTCwgcG93ZXI9LjksIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiKQojIyBmYWlsZWQgaW4gMS43LjAKCgojIyBQUiMzMjIxIGVpZ2VudmVjdG9ycyBzaG91bGQgYmUgYSBtYXRyaXggZXZlbiBpbiB0aGUgMXgxIGNhc2UKQSA8LSBtYXRyaXgoMSkKc3RvcGlmbm90KGlzLm1hdHJpeChlaWdlbihBKSR2ZWN0b3JzKSkKIyMgZ2F2ZSB2ZWN0b3IgaW4gMS43LjAKCgojIyBbWzwtLmRhdGEuZnJhbWUKdGVzdGRhdGEgPC0gZGF0YS5mcmFtZShhPTE6MiwgYiA9IGMoVFJVRSwgTkEpKQp0ZCA8LSBzdHJwdGltZShjKCIzMTEyMTk5MSIsICIzMTEyMTk5MiIpLCAiJWQlbSVZIikKdGVzdGRhdGFbWyJhIl1dIDwtIHRkCmlmKEZBTFNFKQpzdG9waWZub3QoaW5oZXJpdHMoLkxhc3QudmFsdWUsICJ0cnktZXJyb3IiKSkKIyMgc3VjY2VlZGVkIGluIDEuNy4wIGFuZCBhZ2FpbiBpbiAyLjExLngge3Nob3VsZCBpdCBub3Q/fQoKCiMjIHBhY2Ygb24gbiB4IDEgbWF0cml4OiBQYXVsIEdpbGJlcnQsIFItZGV2ZWwsIDIwMDMtMDYtMTgKeiA8LSBhcy50cyhtYXRyaXgocm5vcm0oMTAwKSwgLCAxKSkKY2xhc3MoeikgIyBub3QgIm10cyIKaXMubWF0cml4KHopICMgVFJVRSBpbiAxLjcuMQpwYWNmKHopCnBhY2YobWF0cml4KHJub3JtKDEwMCksICwgMSkpCiMjIGJvdGggZmFpbGVkIGluIDEuNy4xLgoKCiMjIGxzZml0IHdhcyBub3Qgc2V0dGluZyByZXNpZHVhbHMgaW4gdGhlIHJhbms9MCBjYXNlCmZpdCA8LSBsc2ZpdChtYXRyaXgoMCwgMTAsIDEpLCAxOjEwLCBpbnRlcmNlcHQ9RkFMU0UpCnN0b3BpZm5vdChmaXQkcmVzaWR1YWxzID09IDE6MTApCiMjIHplcm8gcmVzaWR1YWxzIGluIDEuNy4xLgoKCiMjIGludGVydmFsIGNhbGN1bGF0aW9ucyBvbiBwcmVkaWN0LmxtCnggPC0gMToxMAp5IDwtIHJub3JtKDEwKQpwcmVkaWN0KGxtKHkgfiB4KSwgdHlwZT0idGVybXMiLCBpbnRlcnZhbD0iY29uZmlkZW5jZSIpCiMjCgoKIyMgMC1sZXZlbCBmYWN0b3JzCmYgPC0gZmFjdG9yKG51bWVyaWMoMCkpCnNvcnQoZikKdW5pcXVlKGYpCiMjIGJvdGggZmFpbGVkIGluIDEuNy4xCgoKIyMgZGF0YSBmYWlsZWQgd2l0aCBzb21lIG11bHRpcGxlIGlucHV0cwpkYXRhKGNhcnMsIHdvbWVuKQojIyBmYWlsZWQgaW4gMS43LjEKCgojIyBib2R5KCkgYW5kIGZvcm1hbHMoKSBsb29rZWQgaW4gZGlmZmVyZW50IHBsYWNlcwpiYXIgPC0gZnVuY3Rpb24oeD1OVUxMKQp7CiAgIGZvbyA8LSBmdW5jdGlvbih5PTMpIHRlc3RpdCgpCiAgIHByaW50KGZvcm1hbHMoImZvbyIpKQogICBwcmludChib2R5KCJmb28iKSkKfQpiYXIoKQojIyB0aGUgY2FsbCB0byBib2R5KCkgZmFpbGVkIGluIDEuNy4wCgoKIyMgc3RyaW5nIE5BcyBzaG91bGRuJ3QgaGF2ZSBhbnkgaW50ZXJuYWwgc3RydWN0dXJlLihQUiMzMDc4KQphIDwtIGMoIk5BIiwgTkEsICJCQU5BTkEiKQpuYSA8LSBOQV9jaGFyYWN0ZXJfCmExIDwtIHN1YnN0cihhLDEsMSkKc3RvcGlmbm90KGlzLm5hKGExKT09aXMubmEoYSkpCmEyIDwtIHN1YnN0cmluZyhhLDEsMSkKc3RvcGlmbm90KGlzLm5hKGEyKT09aXMubmEoYSkpCmEzIDwtIHN1YigiTkEiLCJuYSIsYSkKc3RvcGlmbm90KGlzLm5hKGEzKT09aXMubmEoYSkpCmEzIDwtIGdzdWIoIk5BIiwibmEiLGEpCnN0b3BpZm5vdChpcy5uYShhMyk9PWlzLm5hKGEpKQpzdWJzdHIoYTMsIDEsIDIpIDwtICJuYSIKc3RvcGlmbm90KGlzLm5hKGEzKT09aXMubmEoYSkpCnN1YnN0cihhMywgMSwgMikgPC0gbmEKc3RvcGlmbm90KGFsbChpcy5uYShhMykpKQpzdG9waWZub3QoYWdyZXAoIk5BIiwgYSkgPT0gYygxLCAzKSkKc3RvcGlmbm90KGdyZXAoIk5BIiwgYSkgPT0gYygxLCAzKSkKc3RvcGlmbm90KGdyZXAoIk5BIiwgYSwgcGVybD1UUlVFKSA9PSBjKDEsIDMpKQpzdG9waWZub3QoYWxsKGlzLm5hKGFncmVwKG5hLCBhKSkpKQpzdG9waWZub3QoYWxsKGlzLm5hKGdyZXAobmEsIGEpKSkpCnN0b3BpZm5vdChhbGwoaXMubmEoZ3JlcChuYSwgYSwgcGVybD1UUlVFKSkpKQphNCA8LSBhYmJyZXZpYXRlKGEpCnN0b3BpZm5vdChpcy5uYShhNCkgPT0gaXMubmEoYSkpCmE1IDwtIGNoYXJ0cigiTkEiLCAibmEiLCBhKQpzdG9waWZub3QoaXMubmEoYTUpID09IGlzLm5hKGEpKQphNiA8LSBnc3ViKG5hLCAibmEiLCBhKQpzdG9waWZub3QoYWxsKGlzLm5hKGE2KSkpCmE2YSA8LSBnc3ViKCJOQU5BIiwgbmEsIGEpCnN0b3BpZm5vdChpcy5uYShhNmEpPT1jKEZBTFNFLCBUUlVFLCBUUlVFKSkKYTcgPC0gYTsgc3Vic3RyKGE3LCAxLCAyKSA8LSAibmEiCnN0b3BpZm5vdChpcy5uYShhNykgPT0gaXMubmEoYSkpCmE4IDwtIGE7IHN1YnN0cihhOCwgMSwgMikgPC0gbmEKc3RvcGlmbm90KGFsbChpcy5uYShhOCkpKQpzdG9waWZub3QoaWRlbnRpY2FsKGEsIHRvdXBwZXIodG9sb3dlcihhKSkpKQphOSA8LSBzdHJzcGxpdChhLCAiTkEiKQpzdG9waWZub3QoaWRlbnRpY2FsKGE5LCBsaXN0KCIiLCBuYSAsYygiQkEiLCIiKSkpKQphOSA8LSBzdHJzcGxpdChhLCAiTkEiLCBmaXhlZCA9IFRSVUUpCnN0b3BpZm5vdChpZGVudGljYWwoYTksIGxpc3QoIiIsIG5hICxjKCJCQSIsIiIpKSkpCmE5IDwtIHN0cnNwbGl0KGEsICJOQSIsIHBlcmwgPSBUUlVFKQpzdG9waWZub3QoaWRlbnRpY2FsKGE5LCBsaXN0KCIiLCBuYSAsYygiQkEiLCIiKSkpKQphMTAgPC0gc3Ryc3BsaXQoYSwgbmEpCnN0b3BpZm5vdChpZGVudGljYWwoYTEwLCBhcy5saXN0KGEpKSkKIyMgbmNoYXIoKSBkaWZmZXJzIGEgYml0CnN0b3BpZm5vdChpZGVudGljYWwoaXMubmEoYSksIGlzLm5hKG5jaGFyKGEpKSksCiAgICAgICAgICBhbGwoIWlzLm5hKG5jaGFyKGEsIHR5cGUgPSAid2lkdGgiKSkpKQojIyBOQSBhbmQgIk5BIiB3ZXJlIG5vdCBkaXN0aW5ndWlzaGVkIGluIDEuNy54CgoKIyMgY29lcmNpbmcgMC1sZW5ndGggZ2VuZXJpYyB2ZWN0b3JzCmFzLmRvdWJsZShsaXN0KCkpCmFzLmludGVnZXIobGlzdCgpKQphcy5sb2dpY2FsKGxpc3QoKSkKYXMuY29tcGxleChsaXN0KCkpCmFzLmNoYXJhY3RlcihsaXN0KCkpCiMjIGFsbCBidXQgdGhlIGxhc3QgZmFpbGVkIGluIDEuNy54CgoKIyMgaGVscCBvbiByZXNlcnZlZCB3b3JkcwojIyBpZiBlbHNlIHJlcGVhdCB3aGlsZSBmdW5jdGlvbiBmb3IgaW4gbmV4dCBicmVhayAgd2lsbCBmYWlsCmlmKC5QbGF0Zm9ybSRPUy50eXBlID09ICJ3aW5kb3dzIikgb3B0aW9ucyhwYWdlcj0iY29uc29sZSIpCmZvcih0b3BpYyBpbiBjKCJUUlVFIiwgIkZBTFNFIiwgICJOVUxMIiwgIk5BIiwgIkluZiIsICJOYU4iLAogICAgICAgICAgICAgICAiTkFfaW50ZWdlcl8iLCAiTkFfcmVhbF8iLCAiTkFfY29tcGxleF8iLCAiTkFfY2hhcmFjdGVyXyIpKSB7CiAgICBldmFsKHBhcnNlKHRleHQ9cGFzdGUoIj8iLCB0b3BpYywgc2VwPSIiKSkpCiAgICBldmFsKHBhcnNlKHRleHQ9cGFzdGUoImhlbHAoIiwgdG9waWMsICIpIiwgc2VwPSIiKSkpCn0KIyMgP05VTEwgYW5kIGFsbCB0aGUgaGVscCBjYWxscyBmYWlsIGluIDEuNy54CgoKIyMgcm93IG5hbWVzIGluIGRhdGEgZnJhbWVzCnh4IDwtIHN0cnVjdHVyZSgxOjMsIG5hbWVzPWxldHRlcnNbMTozXSkKZGF0YS5mcmFtZSh4eCkKZGF0YS5mcmFtZSh4eCwgeXk9MTo2KSAjIGZhaWxlZCB3aXRoIG1pc2xlYWRpbmcgbWVzc2FnZSBpbiAxLjcueApkYXRhLmZyYW1lKHh4LCB5eT0xOjYsIHJvdy5uYW1lcz1OVUxMKSAjIG5vIHdhcm5pbmcKIyMKCgojIyBlbXB0eSBwYXN0ZQpzdG9waWZub3QobGVuZ3RoKHBhc3RlKGNoYXJhY3RlcigwKSwgY2hhcmFjdGVyKDApKSkgPT0gMCkgIyB3YXMgIiIKc3RvcGlmbm90KGlkZW50aWNhbChwYXN0ZShjaGFyYWN0ZXIoMCksIGNoYXJhY3RlcigwKSwgY29sbGFwc2U9IisiKSwgIiIpKQojIwoKCiMjIGNvbmNhdGVuYXRpb24gb2YgbWFrZS5uYW1lcyAoVG9tIE1pbmthLCBSLWhlbHAsIDIwMDMtMDYtMTcpCmExIDwtIG1ha2UubmFtZXMoYygiYSIsICJhIiwgImEiKSwgdW5pcXVlPVRSVUUpCmEyIDwtIG1ha2UubmFtZXMoYyhtYWtlLm5hbWVzKGMoImEiLCAiYSIpLCB1bmlxdWU9VFJVRSksICJhIiksIHVuaXF1ZT1UUlVFKQpzdG9waWZub3QoaWRlbnRpY2FsKGExLCBhMikpCgpkZjEgPC0gcmJpbmQoZGF0YS5mcmFtZSh4PTEpLCBkYXRhLmZyYW1lKHg9MiksIGRhdGEuZnJhbWUoeD0zKSkKZGYyIDwtIHJiaW5kKHJiaW5kKGRhdGEuZnJhbWUoeD0xKSwgZGF0YS5mcmFtZSh4PTIpKSwgZGF0YS5mcmFtZSh4PTMpKQpzdG9waWZub3QoaWRlbnRpY2FsKGRmMSwgZGYyKSkKIyMKCgojIyBQUiMzMjgwIGRhdGEuZnJhbWUoY2hlY2submFtZT1GQUxTRSkgd2FzIG5vdCBhbHdheXMgcmVzcGVjdGVkCkRGIDwtIGRhdGEuZnJhbWUobGlzdCgiYSoiID0gMyksIGNoZWNrLm5hbWVzID0gRkFMU0UpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoREYpLCAiYSoiKSkKIyMgZ2F2ZSAiYS4iIGluIDEuNy4xCgoKIyMgZnVuY3Rpb25zIHVzaW5nIGdldCgpIHdlcmUgbm90IGFsd2F5cyBsb29raW5nIGZvciBmdW5jdGlvbnMgb3IgaW4gdGhlCiMjIHJpZ2h0IHBsYWNlCnggPC0gZmFjdG9yKDE6MykKY29udHJhc3RzKHgpIDwtICJjdHIiCnRlc3QgPC0gZnVuY3Rpb24oeCkKewogICAgY3RyIDwtIGNvbnRyLnRyZWF0bWVudAogICAgY29udHJhc3RzKHgpICAjIGZhaWxlZCBpbiAxLjcuMQp9CnRlc3QoeCkKIyMKCiMjIGdldC9leGlzdHMgd2VyZSBpZ25vcmluZyBtb2RlIGluIGJhc2UKc3RvcGlmbm90KGV4aXN0cygiLkRldmljZSIpKQpzdG9waWZub3QoIWV4aXN0cygiLkRldmljZSIsIG1vZGU9ImZ1bmN0aW9uIikpICMgd2FzIHRydWUgaW4gMS43LjEKIyMKCgojIyBpbmFkdmVydGVudCByZWN1cnNpdmUgaW5kZXhpbmcgYnVnIChQUiMzMzI0KQp4IDwtIGxpc3QoYT0xOjMsIGI9Mjo0KQp0cnkoeFtbYygiYyIsICJkIildXSkKdHJ5KHhbW2MoImMiLCAiZCIpXV0gPC0gTkEpCiMjIGJvdGggc2VnZmF1bHRlZCBpbiAxLjcuMQoKCiMjIGVtcHR5IGluZGV4aW5nIG9mIGRhdGEgZnJhbWVzICAoUFIjMzUzMikKeCA8LSBkYXRhLmZyYW1lKHggPSAiMS41IikKbnVtIDwtIG51bWVyaWMoMCkKeFtudW1dIDwtIGxpc3QoKQp4WywgbnVtXSA8LSBsaXN0KCkKIyMgeFtbbnVtXV0gaXMgcmlnaHRseSBhbiBlcnJvcgojIyB4W251bV0gZXRjIGZhaWxlZCBpbiAxLjcueC4KCgojIyAuUmFuZG9tLnNlZWQgd2FzIHNlYXJjaGVkIGZvciB3aXRoIGluaGVyaXRzPVRSVUUKcm0oLlJhbmRvbS5zZWVkKQphdHRhY2gobGlzdCguUmFuZG9tLnNlZWQ9YygwOjQpKSkKeCA8LSBydW5pZigxKQpkZXRhY2goMikKKG5ldyA8LSBSTkdraW5kKCkpCnN0b3BpZm5vdChpZGVudGljYWwobmV3LCBjKCJNZXJzZW5uZS1Ud2lzdGVyIiwgIkludmVyc2lvbiIsICJSZWplY3Rpb24iKSkpCnN0b3BpZm5vdChpZGVudGljYWwoZmluZCgiLlJhbmRvbS5zZWVkIiksICIuR2xvYmFsRW52IikpCiMjIHRvb2sgZnJvbSBhbmQgYXNzaWduZWQgdG8gbGlzdCBpbiAxLjcueC4KCgojIyBQUiMzNzUwCnkgPC0gYygxLCBOQSwgTkEsIDcpCmlkZW50aWNhbCh5LCBxcW5vcm0oeSwgcGxvdC5pdD1GQUxTRSkkeSkKIyMgcXFub3JtKCkgdXNlZCB0byBkcm9wIE5BJ3MgaW4gaXRzIHJlc3VsdCB0aWxsIDEuNy54CgoKIyMgUFIjMzc2MwpkMCA8LSBJU09kYXRlKDIwMDEsMSwxKVswXSAjIGxlbmd0aCAwIFBPU0lYCihyZDAgPC0gcm91bmQoZDAsICJkYXkiKSkKc3RvcGlmbm90KGlkZW50aWNhbChyZDAsIGFzLlBPU0lYbHQoZDApKSkKIyMgMm5kIGxpbmUgZ2F2ZSBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gKGluIGZvcm1hdCgqKSEpCgoKIyMgTmV3IGRldCgpIGZ1bmN0aW9uCm0gPC0gY2JpbmQoMSwgYygxLCAxKSkKc3RvcGlmbm90KGRldChtKSA9PSAwLCBkZXRlcm1pbmFudChtKSRtb2QgPT0gLUluZiwKICAgICAgICAgIGRldGVybWluYW50KG0sIGxvZz1GQUxTRSkkbW9kID09IDApCiMjIGdhdmUgZXJyb3IgZm9yIHNpbmd1bGFyIG1hdHJpY2VzIGluIGVhcmxpZXIgQXVnLjIwMDMKCgojIyB0ZXN0cyBvZiBtb2RlbCBmaXR0aW5nIGluIHRoZSBwcmVzZW5jZSBvZiBub24tc3ludGFjdGljIG5hbWVzCm5hbWVzKHN3aXNzKVs2XSA8LSAiSW5mYW50IE1vcnRhbGl0eSIKKGxtMSA8LSBsbShGZXJ0aWxpdHkgfiAuLCBkYXRhID0gc3dpc3MpKQpmb3JtdWxhKGxtMSkgIyBpcyBleHBhbmRlZCBvdXQKc2xtMSA8LSBzdGVwKGxtMSkKYWRkMShsbTEsIH4gSShFZHVjYXRpb25eMikgKyAuXjIpCnN0ZXAobG0xLCBzY29wZT1+IEkoRWR1Y2F0aW9uXjIpICsgLl4yKQoKUXVpbmUgPC0gc3RydWN0dXJlKGxpc3QoRXRoID0gc3RydWN0dXJlKGMoMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiksIC5MYWJlbCA9IGMoIkEiLCAiTiIpLCBjbGFzcyA9ICJmYWN0b3IiKSwKICAgIFNleCA9IHN0cnVjdHVyZShjKDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCiAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLAogICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsCiAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAogICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwKICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCiAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSwgLkxhYmVsID0gYygiRiIsCiAgICAiTSIpLCBjbGFzcyA9ICJmYWN0b3IiKSwgQWdlID0gc3RydWN0dXJlKGMoMSwgMSwgMSwgMSwgMSwKICAgIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCiAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAogICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgNCwgNCwKICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsCiAgICAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LAogICAgNCwgNCwgNCwgNCwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDQsCiAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0KSwgLkxhYmVsID0gYygiRjAiLCAiRjEiLCAiRjIiLCAiRjMiCiAgICApLCBjbGFzcyA9ICJmYWN0b3IiKSwgTHJuID0gc3RydWN0dXJlKGMoMiwgMiwgMiwgMSwgMSwgMSwKICAgIDEsIDEsIDIsIDIsIDIsIDEsIDEsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCiAgICAxLCAxLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAogICAgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwKICAgIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCiAgICAyLCAyLCAyLCAxLCAxLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAogICAgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKICAgIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsCiAgICAxLCAxLCAxLCAxLCAxLCAxLCAxKSwgLkxhYmVsID0gYygiQUwiLCAiU0wiKSwgY2xhc3MgPSAiZmFjdG9yIiksCiAgICBEYXlzID0gYygyLCAxMSwgMTQsIDUsIDUsIDEzLCAyMCwgMjIsIDYsIDYsIDE1LCA3LCAxNCwgNiwKICAgIDMyLCA1MywgNTcsIDE0LCAxNiwgMTYsIDE3LCA0MCwgNDMsIDQ2LCA4LCAyMywgMjMsIDI4LCAzNCwKICAgIDM2LCAzOCwgMywgNSwgMTEsIDI0LCA0NSwgNSwgNiwgNiwgOSwgMTMsIDIzLCAyNSwgMzIsIDUzLAogICAgNTQsIDUsIDUsIDExLCAxNywgMTksIDgsIDEzLCAxNCwgMjAsIDQ3LCA0OCwgNjAsIDgxLCAyLCAwLAogICAgMiwgMywgNSwgMTAsIDE0LCAyMSwgMzYsIDQwLCA2LCAxNywgNjcsIDAsIDAsIDIsIDcsIDExLCAxMiwKICAgIDAsIDAsIDUsIDUsIDUsIDExLCAxNywgMywgNCwgMjIsIDMwLCAzNiwgOCwgMCwgMSwgNSwgNywgMTYsCiAgICAyNywgMCwgMzAsIDEwLCAxNCwgMjcsIDQxLCA2OSwgMjUsIDEwLCAxMSwgMjAsIDMzLCA1LCA3LAogICAgMCwgMSwgNSwgNSwgNSwgNSwgNywgMTEsIDE1LCA1LCAxNCwgNiwgNiwgNywgMjgsIDAsIDUsIDE0LAogICAgMiwgMiwgMywgOCwgMTAsIDEyLCAxLCAxLCA5LCAyMiwgMywgMywgNSwgMTUsIDE4LCAyMiwgMzcpKSwKICAgIC5OYW1lcyA9IGMoIkV0aCIsICJTZXgiLCAiQWdlIiwgIlNsb3cgb3IgZmFzdCIsICJEYXlzIiksCiAgICBjbGFzcyA9ICJkYXRhLmZyYW1lIiwgcm93Lm5hbWVzID0gMTo0NikKc3RlcChhb3YobG9nKERheXMrMi41KSB+IC5eNCwgZGF0YT1RdWluZSkpCnNldC5zZWVkKDExKQpERiA8LSBkYXRhLmZyYW1lKHk9cm5vcm0oMjEpLCBgeCAxYD0tMTA6MTAuLCBjaGVjay5uYW1lcyA9IEZBTFNFKQpsbSh5IH4gLiwgZGF0YSA9IERGKQooZm0gPC0gbG0oeSB+IGB4IDFgICsgSShgeCAxYF4yKSwgZGF0YSA9IERGKSkKc3RlcChmbSkKCk4gPC0gYygwLDEsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDEsMCwwLDEsMCwxLDAsMSwxLDAsMCkKUCA8LSBjKDEsMSwwLDAsMCwxLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwLDAsMSwwLDEsMSwwKQpLIDwtIGMoMSwwLDAsMSwwLDEsMSwwLDAsMSwwLDEsMCwxLDEsMCwwLDAsMSwxLDEsMCwxLDApCnlpZWxkIDwtIGMoNDkuNSw2Mi44LDQ2LjgsNTcuMCw1OS44LDU4LjUsNTUuNSw1Ni4wLDYyLjgsNTUuOCw2OS41LDU1LjAsCiAgICAgICAgICAgNjIuMCw0OC44LDQ1LjUsNDQuMiw1Mi4wLDUxLjUsNDkuOCw0OC44LDU3LjIsNTkuMCw1My4yLDU2LjApCm5wayA8LSBkYXRhLmZyYW1lKGBibG9jayBub2A9Z2woNiw0KSwgTj1mYWN0b3IoTiksIFA9ZmFjdG9yKFApLAogICAgICAgICAgICAgICAgICBLPWZhY3RvcihLKSwgeWllbGQ9eWllbGQsIGNoZWNrLm5hbWVzPUZBTFNFKQpvcCA8LSBvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5oZWxtZXJ0IiwgImNvbnRyLnRyZWF0bWVudCIpKQoobnBrLmFvdkUgPC0gYW92KHlpZWxkIH4gIE4qUCpLICsgRXJyb3IoYGJsb2NrIG5vYCksIG5waykpCnN1bW1hcnkobnBrLmFvdkUpCm1vZGVsLnRhYmxlcyhucGsuYW92RSkKbW9kZWwudGFibGVzKG5way5hb3ZFLCAibWVhbnMiKQpvcHRpb25zKG9wKSMgcmVzZXQgdG8gcHJldmlvdXMKIyMgRGlkbid0IHdvcmsgYmVmb3JlIDEuOC4wCgoKIyMgY21kc2NhbGUKIyMgZmFpbGVkIGluIHZlcnNpb25zIDw9IDEuNC4wIDoKY20xIDwtIGNtZHNjYWxlKGV1cm9kaXN0LCBrPTEsIGFkZD1UUlVFLCB4LnJldCA9IFRSVUUpCmNtZHNFIDwtIGNtZHNjYWxlKGV1cm9kaXN0LCBrPTIwLCBhZGQgPSBUUlVFLCBlaWcgPSBUUlVFLCB4LnJldCA9IFRSVUUpCiMgRkFJTEVEIG9uIERlYmlhbiB0ZXN0aW5nIGp1c3QgcHJpb3IgdG8gMS45LjAhCiNzdG9waWZub3QoaWRlbnRpY2FsKGNtMSR4LCAgY21kc0UkeCksCiMgICAgICAgICAgaWRlbnRpY2FsKGNtMSRhYywgY21kc0UkYWMpKQpzdG9waWZub3QoYWxsLmVxdWFsKGNtMSR4LCAgY21kc0UkeCksCiAgICAgICAgICBhbGwuZXF1YWwoY20xJGFjLCBjbWRzRSRhYykpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIGNtZHNjYWxlLlJkCgoKIyMgY3V0cmVlCmhjIDwtIGhjbHVzdChkaXN0KFVTQXJyZXN0cykpCmN0IDwtIGN1dHJlZShoYywgaCA9IGMoMCwgaGMkaGVpZ2h0W2MoMSw0OSldLCAxMDAwKSkKc3RvcGlmbm90KGN0WywiMCJdPT0gMTo1MCwKICAgICAgICAgIHVuaXF1ZShjdFssMl0pID09IDE6NDksCiAgICAgICAgICBjdFssM10gID09IGN0Wyw0XSwKICAgICAgICAgIGN0Wyw0XSAgPT0gMSkKIyMgZW5kIG9mIG1vdmVkIGZyb20gY3V0cmVlLlJkCgoKIyMgcHJpbmNvbXAKVVNBcnJlc3RzWzEsIDJdIDwtIE5BCnBjLmNyIDwtIHByaW5jb21wKH4gTXVyZGVyICsgQXNzYXVsdCArIFVyYmFuUG9wLAogICAgICAgICAgICAgICAgICBkYXRhID0gVVNBcnJlc3RzLCBuYS5hY3Rpb249bmEuZXhjbHVkZSwgY29yID0gVFJVRSkKdXBkYXRlKHBjLmNyLCB+IC4gKyBSYXBlKQojIyBlbmQgb2YgbW92ZWQgZnJvbSBwcmluY29tcC5SZAoKCiMjIGFyaW1hezB9CihmaXQgPC0gYXJpbWEobGgsIGMoMSwwLDApKSkKdHNkaWFnKGZpdCkKKGZpdCA8LSBhcmltYTAobGgsIGMoMSwwLDApKSkKdHNkaWFnKGZpdCkKIyMgZW5kIG9mIG1vdmVkIGZyb20gYXJpbWF7MH0uUmQKCgojIyBwcmVkaWN0LmFyaW1hCnByZWRpY3QoYXJpbWEobGgsIG9yZGVyPWMoMSwwLDEpKSwgbi5haGVhZD01KQpwcmVkaWN0KGFyaW1hKGxoLCBvcmRlcj1jKDEsMSwwKSksIG4uYWhlYWQ9NSkKcHJlZGljdChhcmltYShsaCwgb3JkZXI9YygwLDIsMSkpLCBuLmFoZWFkPTUpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIHByZWRpY3QuYXJpbWEuUmQKCgpsaWJyYXJ5KHNwbGluZXMpCiMjIG5zCiMjIENvbnNpc3RlbmN5Ogp4IDwtIGMoMTozLDU6NikKc3RvcGlmbm90KGlkZW50aWNhbChucyh4KSwgbnMoeCwgZGYgPSAxKSksCiAgICAgICAgICAhaXMubnVsbChrayA8LSBhdHRyKG5zKHgpLCAia25vdHMiKSksIyBub3QgdHJ1ZSB0aWxsIDEuNS4xCiAgICAgICAgICBsZW5ndGgoa2spID09IDApCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIG5zLlJkCgoKIyMgcHJlZGljdC5icwojIyBDb25zaXN0ZW5jeToKYmFzaXMgPC0gbnMod29tZW4kaGVpZ2h0LCBkZiA9IDUpCm5ld1ggPC0gc2VxKDU4LCA3MiwgbGVuID0gNTEpCndoIDwtIHdvbWVuJGhlaWdodApiYmFzZSA8LSBicyh3aCkKbmJhc2UgPC0gbnMod2gpCnN0b3BpZm5vdChpZGVudGljYWwocHJlZGljdChiYXNpcyksIHByZWRpY3QoYmFzaXMsIG5ld3g9d2gpKSwKICAgICAgICAgIGlkZW50aWNhbChwcmVkaWN0KGJiYXNlKSwgcHJlZGljdChiYmFzZSwgbmV3eD13aCkpLAogICAgICAgICAgaWRlbnRpY2FsKHByZWRpY3QobmJhc2UpLCBwcmVkaWN0KG5iYXNlLCBuZXd4PXdoKSkpCiMjIGVuZCBvZiBtb3ZlZCBmcm9tIHByZWRpY3QuYnMuUmQKCgojIyBpbnRlcm5hbCBjb2VyY2VWZWN0b3IoKSB3YXMgdG9vIGxlbmllbnQKcGxvdCgxKQpyIDwtIHRyeShzdHJ3aWR0aChwbG90KSkjIyBFcnJvcjogY2Fubm90IGNvZXJjZQpzdG9waWZub3QoaW5oZXJpdHMociwgInRyeS1lcnJvciIpLAogICAgICAgICAgZ3JlcCgiY2Fubm90IGNvZXJjZSIsIHIpID09IDEpCiMjIGdhdmUgc2VnLmZhdWx0IG9yIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGJlZm9yZSAxLjguMAoKCiMjIHJhbmsgc29tZXRpbWVzIGtlcHQgYW5kIHNvbWV0aW1lcyBkcm9wcGVkIG5hbWVzCngyIDwtIGMoMywgMSwgNCwgMSwgNSwgTkEsIDksIDIsIDYsIDUsIDMsIDUpCm5hbWVzKHgyKSA8LSBsZXR0ZXJzWzE6MTJdCih5MSA8LSByYW5rKHgyKSkKKHkyIDwtIHJhbmsoeDIsIG5hLmxhc3Q9RkFMU0UpKQooeTMgPC0gcmFuayh4MiwgbmEubGFzdD1OQSkpCih5NCA8LSByYW5rKHgyLCBuYS5sYXN0PSJrZWVwIikpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeTEpLCBuYW1lcyh4MikpLAogICAgICAgICAgaWRlbnRpY2FsKG5hbWVzKHkyKSwgbmFtZXMoeDIpKSwKICAgICAgICAgIGlkZW50aWNhbChuYW1lcyh5NCksIG5hbWVzKHgyKSksCiAgICAgICAgICBpZGVudGljYWwobmFtZXMoeTMpLCBuYW1lcyh4MilbLTZdKSkKIyMKCiMjIGFzLmRpc3QoeCkgb25seSBvYmV5ZWQgYGRpYWc9VFJVRScgb3IgYHVwcGVyPVRSVUUnIHdoZW4geCB3YXMgImRpc3QiIGFscmVhZHkKbSA8LSBhcy5tYXRyaXgoZGlzdChtYXRyaXgocm5vcm0oMTAwKSwgbnJvdz01KSkpCnN0b3BpZm5vdChpZGVudGljYWwoVFJVRSwgYXR0cihhcy5kaXN0KG0sIGRpYWc9VFJVRSksICJEaWFnIikpKQojIyBmYWlsZWQgcHJldmlvdXMgdG8gMS44LjAKCnN0b3BpZm5vdCgxOjIgPT0gYXZlKDE6MixmYWN0b3IoMjozLGxldmVscz0xOjMpKSkKIyMgZ2F2ZSAiMiBOQSIgcHJldmlvdXMgdG8gMS44LjAsIGJlY2F1c2UgdW51c2VkIGxldmVscyB3ZXJlbid0IGRyb3BwZWQKCgojIyBQUiM0MDkyOiBhcnJheXMgd2l0aCBsZW5ndGgoZGltKC4pKSA9IDEKeiA8LSBhcnJheShjKC0yOjEsIDEuNCksNSkKY3ogPC0gY3Jvc3Nwcm9kKGFzLnZlY3Rvcih6KSkKZGltbmFtZXMoeikgPC0gbGlzdChsZXR0ZXJzWzE6NV0pCnowIDwtIHoKbmFtZXMoZGltbmFtZXMoeikpIDwtICJEMSIKc3RvcGlmbm90KGNyb3NzcHJvZCh6KSA9PSBjeiwjIHRoZSBmaXJzdCBoYXMgTlVMTCBkaW1uYW1lcwogICAgICAgICAgaWRlbnRpY2FsKGNyb3NzcHJvZCh6KSwgY3Jvc3Nwcm9kKHowKSksCiAgICAgICAgICBpZGVudGljYWwoY3Jvc3Nwcm9kKHopLCBjcm9zc3Byb2Qoeix6MCkpKQojIyBjcm9zc3Byb2Qoeikgc2VnZmF1bHRlZCAob3IgZ2F2ZSBzaWxseSBlcnJvciBtZXNzYWdlKSBiZWZvcmUgMS44LjAKCgojIyBQUiM0NDMxCnN0b3BpZm5vdCghaXMubmEocm11bHRpbm9tKDEyLDEwMCwgYygzLCA0LCAyLCAwLDApKSkpCiMjIDNyZCBsaW5lIHdhcyBhbGwgTkEgYmVmb3JlIDEuOC4wCgoKIyMgUFIjNDI3NTogZ2V0QW55d2hlcmUgd2l0aCBleHRyYSAiLiIKZzAgPC0gZ2V0QW55d2hlcmUoInByZWRpY3QubG9lc3MiKQpnMSA8LSBnZXRBbnl3aGVyZSgiYXMuZGVuZHJvZ3JhbS5oY2x1c3QiKQpnMiA8LSBnZXRBbnl3aGVyZSgicHJlZGljdC5zbW9vdGguc3BsaW5lIikKZzMgPC0gZ2V0QW55d2hlcmUoInByaW50LmRhdGEuZnJhbWUiKQppcy5TM21ldGggPC0gZnVuY3Rpb24oZ2EpIGFueShzdWJzdHIoZ2Ekd2hlcmUsIDEsMjApID09ICJyZWdpc3RlcmVkIFMzIG1ldGhvZCIpCnN0b3BpZm5vdChpcy5TM21ldGgoZzApLCBpcy5TM21ldGgoZzEpLAogICAgICAgICAgaXMuUzNtZXRoKGcyKSwgaXMuUzNtZXRoKGczKSkKIyMgYWxsIGJ1dCBnMCBmYWlsZWQgdW50aWwgMS44LjAgKE9jdCA2KQoKCiMjIHN5bW51bSh4KSBmb3IgbGVuZ3RoIDAgYW5kIHNvbWUgbG9naWNhbCBhcnJheXM6CnNtIDwtIHN5bW51bShtIDwtIG1hdHJpeCgxOjggJSUgMyA9PSAwLCAyKSkKc3RvcGlmbm90KGlkZW50aWNhbChzeW1udW0oRkFMU0VbRkFMU0VdKSwgbm9xdW90ZSgiIltGQUxTRV0pKSwKICAgICAgICAgIGlkZW50aWNhbChzeW1udW0oYyhtKSksIGMoc3ltbnVtKG0pKSksCiAgICAgICAgICBkaW0oc20pID09IGRpbShtKSwgY2xhc3Moc20pID09ICJub3F1b3RlIikKIyMgc3ltbnVtKDxsZW5ndGggMD4pIGdhdmUgbm9xdW90ZSgiKCkiKSBiZWZvcmUgMS44LjEKCgojIyBhYmJyZXZpYXRlIHdpdGggbGVhZGluZyAob3IgdHJhaWxpbmcpIHNwYWNlIGRpZmZlcmVuY2VzIChQUiM0NTY0KQphYmJyZXZpYXRlKGMoIkEiLCIgQSIpLCA0KQojIyB0aGlzIGdhdmUgaW5maW5pdGUgbG9vcCBiZWZvcmUgMS44LjEKCgojIyBjcm9zc3Byb2Qgb24gMC1leHRlbnQgbWF0cmljZXMKYSA8LSBtYXRyaXgoLDAsNSkKc3RvcGlmbm90KGNyb3NzcHJvZChhKSA9PSAwKQpzdG9waWZub3QoY3Jvc3Nwcm9kKGEsYSkgPT0gMCkKc3RvcGlmbm90KGNyb3NzcHJvZChhKzBpKSA9PSAwKzBpKQojIyB3ZXJlIHJhbmRvbSBhcmVhcyBpbiA8PSAxLjguMAoKCiMjIERGW1tpLCBqXV0gc2hvdWxkIGJlIHJvdyBpLCBjb2wgagpzdG9waWZub3Qod29tZW5bWzIsIDFdXSA9PSB3b21lblsyLCAxXSkKd29tZW5bWzIsIDFdXSA8LSA3NwpzdG9waWZub3Qod29tZW5bMiwgMV0gPT0gNzcpCiMjIHdhcyByZXZlcnNlZCBmcm9tIE1heSAyMDAyIHRvIE9jdCAyMDAzCgoKIyMgbWVyZ2UuZGF0YS5mcmFtZSB3aXRoIGEgc2luZ2xlLWNvbHVtbiBkZiAoUFIjNDI5OSkKeCA8LSBkYXRhLmZyYW1lKHggPSAxOjUsIHkgPSBsZXR0ZXJzWzE6NV0pCnkgPC0gZGF0YS5mcmFtZSh6ID0gMToyKQp6IDwtIG1lcmdlKHgsIHkpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeiksIGMoIngiLCAieSIsICJ6IikpKQojIyB0aGlyZCBuYW1lIHdhcyB3cm9uZyBpbiAxLjguMAoKCiMjIGNvcihtYXQsIHVzZSA9ICJwYWlyIikgd2FzIHBsYWlubHkgd3JvbmcKIyBsb25nbGV5IGhhcyBubyBOQSdzIC0tIGhlbmNlIGFsbCAidXNlID0gIiBzaG91bGQgZ2l2ZSB0aGUgc2FtZSEKWCA8LSBsb25nbGV5CmVwIDwtIDMyICogTWVwcwpmb3IobWV0aCBpbiBldmFsKGZvcm1hbHMoY29yKSRtZXRob2QpKSB7CiAgICBjYXQoIm1ldGhvZCA9ICIsIG1ldGgsIlxuIikKICAgIENsIDwtIGNvcihYLCBtZXRob2QgPSBtZXRoKQogICAgc3RvcGlmbm90KGFsbC5lcXVhbChDbCwgY29yKFgsIG1ldGhvZD0gbWV0aCwgdXNlPSAiY29tcGxldGUiKSwgdG9sPWVwKSwKICAgICAgICAgICAgICBhbGwuZXF1YWwoQ2wsIGNvcihYLCBtZXRob2Q9IG1ldGgsIHVzZT0gInBhaXJ3aXNlIiksIHRvbD1lcCksCiAgICAgICAgICAgICAgYWxsLmVxdWFsKENsLCBjb3IoWCwgWCwgbWV0aG9kPSBtZXRoKSwgdG9sPWVwKSwKICAgICAgICAgICAgICBhbGwuZXF1YWwoQ2wsIGNvcihYLCBYLCBtZXRob2Q9IG1ldGgsIHVzZT0gInBhaXJ3aXNlIiksIHRvbD1lcCksCiAgICAgICAgICAgICAgYWxsLmVxdWFsKENsLCBjb3IoWCwgWCwgbWV0aG9kPSBtZXRoLCB1c2U9ICJwYWlyd2lzZSIpLCB0b2w9ZXApCiAgICAgICAgICAgICAgKQp9CiMjICJwYWlyd2lzZSIgZmFpbGVkIGluIDEuOC4wCgoKIyMgcmVnZXhwcigqLCBmaXhlZD1UUlVFKSBoYWQgMC1pbmRleCBmcm9tIEMKdHh0IDwtIGMoImVuZ2xpc2giLCAiZnJlbmNoIiwgInN3aXNzIikKaXIgPC0gcmVnZXhwcigiZW4iLCB0eHQsIGZpeGVkID0gVFJVRSkKc3RvcGlmbm90KGlyID09IGMoMSwgMywgLTEpLAogICAgICAgICAgaWRlbnRpY2FsKGlyLCByZWdleHByKCJlbiIsIHR4dCkpKQojIyAoKiwgZml4ZWQ9VFJVRSkgZ2F2ZSAwIDIgLTEgYmVmb3JlIFIgMS44LjEKCgojIyBQUiM1MDE3OiBmaWx0ZXIoaW5pdD0pIGhhZCB0aGUgd3JvbmcgdGltZSBvcmRlcgp4eCA8LSBmaWx0ZXIoNDo4LCBjKDEsIDAuNSwgMC4yNSksIG1ldGhvZD0icmVjdXJzaXZlIiwgaW5pdD0zOjEpCnN0b3BpZm5vdChpZGVudGljYWwoeHhbMTozXSwgYyg4LjI1LCAxNS4yNSwgMjYuMTI1KSkpCiMjIDEuOC4wIGdhdmUgNi43NSAxMi43NSAyMi4zNzUKCgojIyBQUiM1MDkwIHVzZXIgZXJyb3Igd2l0aCB3cml0ZUNoYXIgY291bGQgc2VnZmF1bHQKdGYgPC0gdGVtcGZpbGUoKQp6eiA8LSBmaWxlKHRmLCAid2IiKQp3cml0ZUNoYXIoIiIsIHp6LCBuY2hhcnM9MTAwMDAwMDApCmNsb3NlKHp6KQp1bmxpbmsodGYpCiMjIHNlZ2ZhdWx0cyBpbiAxLjguMAoKCiMjIFBSIzQ3MTAgcm91bmQgKGFuZCBzaWduaWYpIGRyb3BwZWQgYXR0cmlidXRlcwp4IDwtIHJvdW5kKG1hdHJpeCgwLCAwLCAzKSkKc3RvcGlmbm90KGlkZW50aWNhbChkaW0oeCksIGFzLmludGVnZXIoYygwLCAzKSkpKQojIyBudW1lcmljKDApIGluIDEuOC4wCgoKIyMgUFIjNTQwNQp0cnkoc3RlcGZ1bihjKCksIDEpKDIpKSMgPiBFcnJvcgojIyBzZWdmYXVsdHMgaW4gMS44LjEgYW5kIGVhcmxpZXIKCgojIyBQUiM0OTU1IG5vdyBhbGxvdyBlbWJlZGRlZCBuZXdsaW5lcyBpbiBxdW90ZWQgZmllbGRzIGluIHJlYWQudGFibGUKdGVtcCA8LSB0ZW1wZmlsZSgpCmRhdGEgPC0gZGF0YS5mcmFtZShhPWMoImMiLCAiZVxubmV3bGluZSIpKQp3cml0ZS50YWJsZShkYXRhLCBzZXA9IiwiLCByb3cubmFtZXM9RkFMU0UsIGZpbGU9dGVtcCkKZGF0YTIgPC0gcmVhZC5jc3YodGVtcCkKdW5saW5rKHRlbXApCiMgYXR0cmlidXRlcyBnZXQgYSBkaWZmZXJlbnQgb3JkZXIgaGVyZQpzdG9waWZub3QoaWRlbnRpY2FsKGRhdGEkYSwgZGF0YTIkYSkpCiMjIG5vdCBhbGxvd2VkIHByaW9yIHRvIDEuOS4wCgoKIyMgc2NvcGluZyBwcm9ibGVtcyB3aXRoIG1vZGVsLmZyYW1lIG1ldGhvZHMKZm9vIDwtIGMoMSwxLDAsMCwxLDEpCnJlcCA8LSAxOjYKbSA8LSBsbShmb28gfiByZXAsIG1vZGVsPUZBTFNFKQptb2RlbC5tYXRyaXgobSkKbiA8LSAxOjYKbSA8LSBsbShmb28gfiBuLCBtb2RlbD1GQUxTRSkKbW9kZWwubWF0cml4KG0pCiMjIGZhaWxlZCBpbiAxLjguMCBiZWNhdXNlIHRoZSB3cm9uZyBuIG9yIHJlcCB3YXMgZm91bmQuCnJtKGZvbywgcmVwKQpmdW5jIDwtIGZ1bmN0aW9uKCkKewogICAgZm9vIDwtIGMoMSwxLDAsMCwxLDEpCiAgICByZXAgPC0gMTo2CiAgICBtIDwtIGxtKGZvbyB+IHJlcCwgbW9kZWw9RkFMU0UpCiAgICBtb2RlbC5tYXRyaXgobSkKfQpmdW5jKCkKIyMKCgojIyBicm9rZW4gc3RycHRpbWUgaW4gZ2xpYmMgKGFuZCBjb2RlIHVzZWQgb24gV2luZG93cykKIyB0aGUgc3BlYyBzYXlzICVkIGlzIGFsbG93ZWQgaW4gMS0zMSwgYnV0IGl0IHNlZW1zIEhQLVVYIHRoaW5rcwojIHRoZSBkYXRlIGlzIGludmFsaWQuCiMgc3RvcGlmbm90KCFpcy5uYShzdHJwdGltZSgiMjAwMy0wMi0zMCIsIGZvcm1hdD0iJVktJW0tJWQiKSkpCnN0b3BpZm5vdChpcy5uYShzdHJwdGltZSgiMjAwMy0wMi0zNSIsIGZvcm1hdD0iJVktJW0tJWQiKSkpCiMgdGhpcyBvbmUgaXMgc3RpbGwgd3JvbmcgaW4gZ2xpYmMKc3RvcGlmbm90KGlzLm5hKHN0cnB0aW1lKCIyMDAzLTAyLTQwIiwgZm9ybWF0PSIlWS0lbS0lZCIpKSkKc3RvcGlmbm90KGlzLm5hKHN0cnB0aW1lKCIyMDAzLTIyLTIwIiwgZm9ybWF0PSIlWS0lbS0lZCIpKSkKIyBhbmQgc28gaXMgdGhpcyBvbmUKc3RvcGlmbm90KGlzLm5hKHN0cnB0aW1lKCIyMDAzIDIyIDIwIiwgZm9ybWF0PSIlWSAlbSAlZCIpKSkKc3RvcGlmbm90KGlzLm5hKElTT2RhdGUoeWVhcj0yMDAzLCBtb250aD0yMiwgZGF5PTIwKSkpCiMjIHNldmVyYWwgYWZ0ZXIgdGhlIGZpcnN0IGdhdmUgbm9uLU5BIHZhbHVlcyBpbiAxLjguMSBvbiBzb21lIGJyb2tlbiBPU2VzCgoKIyMgUFIjNDY4OApyZWxpIDwtIGNiaW5kKFNpID0gYygyMTIxLCAxMDAsIDI3LCAwKSwKICAgICAgICAgICAgICBhdiA9IGMoNDcwMCwgMjE2LCA2NywgMCksCiAgICAgICAgICAgICAgTmMgPSBjKDYyMzQsMjQ2MSw1MDIsMTQpKQpzdG9waWZub3QoaW5oZXJpdHModHJ5KGZpc2hlci50ZXN0KHJlbGksIHdvcmtzcGFjZT0yMDAwMDAwKSksICJ0cnktZXJyb3IiKSkKIyMgZ2F2ZSBwLnZhbHVlID0gSW5mIDsgbm93IGdpdmVzIEZFWEFDVCBlcnJvciA1MDEKCgojIyBQUiM1NzAxCmNoaXNxLnRlc3QobWF0cml4KDIzMTcxLDIsMiksIHNpbXVsYXRlPVRSVUUpCiMjIGdhdmUgaW5maW5pdGUgbG9vcCBpbiAxLjguMSBhbmQgZWFybGllcgoKCiMjIGFzLm1hdHJpeCBvbiBhbiBhbGwtbG9naWNhbCBkYXRhIGZyYW1lCmxsIDwtIGRhdGEuZnJhbWUoYSA9IHJwb2lzKDEwLDEpID4gMCwgYiA9IHJwb2lzKDEwLDEpID4gMCkKc3RvcGlmbm90KG1vZGUoYXMubWF0cml4KGxsKSkgPT0gImxvZ2ljYWwiKQpsbGwgPC0gZGF0YS5mcmFtZShhID0gTEVUVEVSU1sxOjEwXSwgYiA9IHJwb2lzKDEwLDEpID4gMCkKc3RvcGlmbm90KG1vZGUoYXMubWF0cml4KGxsbCkpID09ICJjaGFyYWN0ZXIiKQojIyBib3RoIHdlcmUgY2hhciBiZWZvcmUgMS45LjAKCgojIyBvdXRlciBjYWxsZWQgcmVwIHdpdGggYSBub24tZ2VuZXJpYyBhcmcKeCA8LSAubGVhcC5zZWNvbmRzWzE6Nl0Kb3V0ZXIoeCwgeCwgIjwiKQpvdXRlcih4LCB4LCAiLSIpCih6IDwtIG91dGVyKHgsIHgsICJkaWZmdGltZSIsIHVuaXRzPSJkYXlzIikpCnN0b3BpZm5vdChjbGFzcyh6KSA9PSAiZGlmZnRpbWUiKQojIyBmYWlsZWQgaW4gMS44LjEKCgojIyBQUiM1OTAwIHFiaW5vbSB3aGVuIHByb2JhYmlsaXR5IGlzIDEKc3RvcGlmbm90KHFiaW5vbSgwLjk1LCAxMCwgMSkgPT0gMTApCnN0b3BpZm5vdChxYmlub20oMCwgMTAsIDEpID09IDApCiMgYW5kIGZvciBwcm9iID0gMApzdG9waWZub3QocWJpbm9tKDAuOTUsIDEwLCAwKSA9PSAwKQpzdG9waWZub3QocWJpbm9tKDAsIDEwLCAwKSA9PSAwKQojIGFuZCBzaXplID0gMApzdG9waWZub3QocWJpbm9tKDAuOTUsIDAsIDAuNSkgPT0gMCkKIyMgMS44LjEgd2FzIHByb2dyYW1tZWQgdG8gZ2l2ZSBOYU4KCgojIyBiYXNlOjogYW5kIDo6OiB3ZXJlIHNlYXJjaGluZyBpbiB0aGUgd3JvbmcgcGxhY2VzCnN0b3BpZm5vdChpbmhlcml0cyh0cnkoYmFzZTo6bG0pLCAidHJ5LWVycm9yIikpCnN0b3BpZm5vdChpbmhlcml0cyh0cnkoZ3JhcGhpY3M6OmxvZyksICJ0cnktZXJyb3IiKSkKIyMgZXF1aXZhbGVudCBjb25zdHJ1Y3RzIHN1Y2NlZWRlZCBpbiAxLjguMQoKCiMjIChQUiM2NDUyKSBwcmluY29tcCBwcmVkaWN0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBjZW50ZXJzIHNob3VsZCBnaXZlIE5Bcwp4IDwtIG1hdHJpeChybm9ybSg0MDApLCBuY29sPTQpCmZpdCA8LSBwcmluY29tcChjb3ZtYXQ9Y292KHgpKQpzdG9waWZub3QoaXMubnVsbChmaXQkc2NvcmVzKSkKc3RvcGlmbm90KGlzLm5hKHByZWRpY3QoZml0LCBuZXdkYXRhPXhbMToxMCwgXSkpKQojIyBmYWlsZWQgaW4gMS44LjEKCgojIyAoUFIjNjQ1MSkgcmVnZXggZnVuY3Rpb25zIGRpZCBub3QgY29lcmNlIGFyZ3MgdG8gY2hhcmFjdGVyLgpzdWIoeD1OQSwgcGF0dGVybj0ieCIsIHJlcGxhY2VtZW50PSJ5IikKIyMgZmFpbGVkIGluIDEuOC4xCgoKIyMgbGVuZ3RoPC0gbmVlZGVkIGEgZmFjdG9yIG1ldGhvZCwgYW5kIHNvIG5lZWRlZCB0byBiZSBnZW5lcmljCmFhIDwtIGZhY3RvcihsZXR0ZXJzKQpsZW5ndGgoYWEpIDwtIDIwCmFhCnN0b3BpZm5vdChpcy5mYWN0b3IoYWEpKQojIyByZXR1cm5lZCBhIHZlY3RvciBpbiAxLjguMQoKCiMjIHNwZWMucGdyYW0oKSB3YXMgdG9vCnBBUiA8LSBjKDIuNzYwNywgLTMuODIsIDIuNjUzNSwgLTAuOTIzOCkKTiA8LSAxICsgMl4xNCMgMTYzODUKc2V0LnNlZWQoMTIzKQp4IDwtIGFyaW1hLnNpbShtb2RlbCA9IGxpc3QoYXIgPSBwQVIpLCBuID0gTikKc3BQIDwtIHNwZWMucGdyYW0oeCwgc3BhbnMgPSA0MSwgcGxvdD1GQUxTRSkKc3BBIDwtIHNwZWMuYXIoeD1saXN0KGFyPXBBUiwgb3JkZXI9NCwgdmFyLnByZWQ9MSwgZnJlcXVlbmN5PTEpLAogICAgICAgICAgICAgICBuLmZyZXEgPSBzcFAkbi51c2VkICUvJSAyLCBwbG90PUZBTFNFKQpyIDwtIHNwUCRzcGVjIC8gc3BBJHNwZWMKc3RvcGlmbm90KGFicyhtZWFuKHIpIC0gMSkgPCAwLjAwMykKIyMgd2FzIDAuMDI2OCBpbiBSIDEuOC4xCgoKIyMgY2hlY2sgZm9yIGEgTWljcm9zb2Z0IGJ1ZyBpbiB0aW1lem9uZXMgYWhlYWQgb2YgR01UCnN0b3BpZm5vdCghaXMubmEoYXMuUE9TSVhjdCgiMTk3MC0wMS0wMSAwMDowMDowMCIpKSkKIyMKCgojIyBQUiM2NjcyLCBzcGxpdC5kZWZhdWx0IG9uIGZhY3RvcnMKeCA8LSBjKE5BLCAxLCAyKQp5IDwtIGFzLmZhY3Rvcih4KQpzcGxpdCh4LCB5KQpzcGxpdCh5LCB5KSAjIGluY2x1ZGVkIE5BcyBpbiAxLjguMQpyMSA8LSB0YXBwbHkoeCwgeSwgbGVuZ3RoKQpyMiA8LSB0YXBwbHkoeSwgeSwgbGVuZ3RoKQpzdG9waWZub3QocjEgPT0gcjIpCiMjCgoKIyMgUFIjNjY1MiwgcG9pbnRzLmZvcm11bGEgd2l0aCBzdWJzZXQgYW5kIGV4dHJhIGFyZ3VtZW50cy4Kcm9sbGVyIDwtCiAgICBkYXRhLmZyYW1lKHdlaWdodCA9IGMoMS45LCAzLjEsIDMuMywgNC44LCA1LjMsIDYuMSwgNi40LCA3LjYsIDkuOCwgMTIuNCksCiAgICAgICAgICAgICAgIGRlcHJlc3Npb24gPSBjKDIsIDEsIDUsIDUsIDIwLCAyMCwgMjMsIDEwLCAzMCwgMjUpKQpwbG90KGRlcHJlc3Npb24gfiB3ZWlnaHQsIGRhdGE9cm9sbGVyLCB0eXBlPSJuIikKd2l0aChyb2xsZXIsIHBvaW50cyggZGVwcmVzc2lvbn53ZWlnaHQsIHN1YnNldD04OjEwLCBjb2w9MikpCndpdGgocm9sbGVyLCBwb2ludHMoIGRlcHJlc3Npb25+d2VpZ2h0LCBzdWJzZXQ9ODoxMCwgY29sPTI6NCkpCnBsb3QoZGVwcmVzc2lvbiB+IHdlaWdodCwgZGF0YT1yb2xsZXIsIHR5cGU9Im4iKQpwb2ludHMoZGVwcmVzc2lvbn53ZWlnaHQsIHN1YnNldD04OjEwLCBjb2w9Mjo0LCBkYXRhPXJvbGxlcikKIyMgZmlyc3QgdHdvIGdhdmUgZXJyb3IgaW4gMS44LjEKCgojIyBQUiM0NTU4IHBhcnQgMgp4IDwtIHNlcShhcy5QT1NJWGN0KCIyMDA0LTAzLTI1IiksIGFzLlBPU0lYY3QoIjIwMDQtMDMtMzEiKSwgYnk9IkRTVGRheXMiKQpzdG9waWZub3QobGVuZ3RoKHgpID09IDcpCiMjIHdhcyBsZW5ndGggNiBpbiB0aGUgVUsgdGltZSB6b25lLgoKCiMjIFBSIzY3MDIgYy9yYmluZCBvbiBsaXN0IG1hdHJpY2VzCkEgPC0gbWF0cml4KGFzLmxpc3QoMTo0KSwgMiwgMikKKHJlcyA8LSBjYmluZChBLCBBKSkKc3RvcGlmbm90KHR5cGVvZihyZXMpID09ICJsaXN0IikKKHJlcyA8LSByYmluZChBLCBBKSkKc3RvcGlmbm90KHR5cGVvZihyZXMpID09ICJsaXN0IikKIyMgd2VyZSBub3QgaW1wbGVtZW50ZWQgaW4gMS44LjEKCgojIyBEYXRlIG9iamVjdHMgd2l0aCBOQSdzCih0MSA8LSBzdHJwdGltZShjKCI2LiBBdWcuIDE5MzAiLCAiMy4gTm92LiAxOTI1IiwgIjI4LiBNYXIuIDE5NTkiLAogICAgICAgICAgICAgICAgIE5BLCBwYXN0ZSgxOjI5LCIgRmViLiAxOTYwIiwgc2VwPSIuIikpLAogICAgICAgICAgICAgICBmb3JtYXQgPSAiJWQuICViLiAlWSIpKQpzdG9waWZub3QoNiA9PSBsZW5ndGgocHJpbnQoczEgPC0gc3VtbWFyeSh0MSkpKSwKICAgICAgICAgIHMxPT0gc3VtbWFyeShhcy5QT1NJWGN0KHQxKSksCiAgICAgICAgICA2ID09IGxlbmd0aChwcmludChmb3JtYXQoYXMuRGF0ZShzMSkpKSkgKQojIyBnYXZlIGJpemFycmUgIk5BJ3MiIGVudHJ5IGluIFIgMS44LjEgYW5kIDEuOS4wYWxwaGEKCgojIyBhcy5EYXRlIG9uIGEgZmFjdG9yCmFzLkRhdGUoZmFjdG9yKCIyMDAwLTAxLTAyIikpCiMjIGZhaWxlZCBpbiAxLjkuMAoKCiMjIGFzLmRhdGEuZnJhbWUubGlzdCAoUFIjNjc4MikKeHggPC0gbGlzdChyb3cubmFtZXM9MToyLGZveGdsb3ZlPTM6NCx0b2FkZmxheD01OjYpCmZvbyA8LSBhcy5kYXRhLmZyYW1lKHh4KQpzdG9waWZub3QoaWRlbnRpY2FsKG5hbWVzKHh4KSwgbmFtZXMoZm9vKSkpCiMjIDEuOS4wIGNoYW5nZWQgdGhlIGxhc3QgbmFtZSB0byAieCIuCgoKIyMgdHlwZS5jb252ZXJ0IHF1aXJrIChQUiM2NzgxKQpyZXMxIDwtIHR5cGUuY29udmVydCggYygiYWJjIiwiLSIpLCBhcy5pcz1UUlVFLCBuYS5zdHJpbmdzPSItIiApCnN0b3BpZm5vdChpZGVudGljYWwobW9kZShyZXMxKSwgImNoYXJhY3RlciIpLCBpcy5uYShyZXMxWzJdKSkKIyMgcmVzMVsyXSB3YXMgIi0iIDw9IDEuOS4wLgoKCiMjIHN1YnNldHRpbmcgZmFjdG9yIHN3YXBzIG9yZGVyIG9mIGF0dHJpYnV0ZXMgKFBSIzY3OTkpCmFmIDwtIGZhY3RvcihjKCdBJywnQicpKQpzdG9waWZub3QoaWRlbnRpY2FsKGFmLCBhZlsxOjJdKSkKIyMgZmFpbGVkIGluIDEuOS4wIGFzIHRoZSBhdHRyaWJ1dGVzIHdlcmUgY2xhc3MsIGxldmVsIGZvciBhZlsxOjJdCgoKIyMgQ29tcGFyaXNvbiBiZXR3ZWVuIGxpc3RzIGFuZCBleHByZXNzaW9ucwpzdG9waWZub3QoaW5oZXJpdHModHJ5KGxpc3QoMSkgPD0gbGlzdCgyKSksICJ0cnktZXJyb3IiKSkKZSA8LSBleHByZXNzaW9uKDMgKyAyICogNCkKc3RvcGlmbm90KGluaGVyaXRzKHRyeShlID09IGUpLCAidHJ5LWVycm9yIikpCiMjIGJvdGggd2VyZSBhbGxvd2VkIGJ1dCBub25zZW5zZSBpbiAxLjkuMAoKCiMjICJub3doZXJlIiBpbnRlcnBvbGF0aW9uIChQUiM2ODA5KQp0cnkoYXBwcm94KGxpc3QoeD1yZXAoTmFOLCA5KSwgeT0xOjkpLCB4b3V0PU5hTikpCiMjIGdhdmUgYSBzZWcuZmF1bHQgaW4gMS45LjAKCgojIyBhZ2dyZWdhdGUuZGF0YS5mcmFtZSBmYWlsZWQgaWYgcmVzdWx0IHdvdWxkIGhhdmUgb25lIHJvdwojIyBQaGlsaXBwZSBIdXDpLCBSLWhlbHAsIDIwMDQtMDUtMTQKZGF0IDwtIGRhdGEuZnJhbWUoYT1yZXAoMiwxMCksYj1yZXAoImEiLDEwKSkKYWdncmVnYXRlKGRhdCRhLCBieT1saXN0KGExPWRhdCRhLCBiMT1kYXQkYiksIE5ST1cpCiMjIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBkcm9wID0gRkFMU0UKCgojIyBbPC0uZGF0YS5mcmFtZSB3aXRoIGEgZGF0YS1mcmFtZSB2YWx1ZQp4IDwtIGRhdGEuZnJhbWUoYT0xOjMsIGI9NDo2LCBjPTc6OSkKaW5mbyA8LSB4WzE6Ml0KeFssIG5hbWVzKGluZm8pXSA8LSAgaW5mb1sxLF0KIyMKCgojIyBhcy5kZW5kcm9ncmFtLmhjbHVzdCgpCmQgPC0gYXMuZGVuZHJvZ3JhbShoRVUgPC0gaGNsdXN0KGV1cm9kaXN0LCAiYXZlIikpCnN0b3BpZm5vdChvcmRlci5kZW5kcm9ncmFtKGQpID09IGhFVSRvcmRlcikjIG5vdCBuZXcKIyNOIHJlcXVpcmUoZ2NsdXMpOyBoRTEgPC0gcmVvcmRlci5oY2x1c3QoaEVVLCBkaXMpCiMjIHJlY29uc3RydWN0IHdpdGhvdXQgZ2NsdXMgKGZvciBSJ3MgdGVzdGluZykKaEUyIDwtIGhFVTsgaWkgPC0gYyg1LDk6MTEsIDEzLCAxNToxOCk7IGhFMiRtZXJnZVtpaSxdIDwtIGhFVSRtZXJnZVtpaSwgMjoxXQpoRTIkb3JkZXIgPC0gYXMuaW50ZWdlcihjKDEsMTksOSwxMiwxNCwyLDE1LDgsMTMsMTYsMTcsMjEsNiwzLDExLDQsMTgsNSwxMCw3LDIwKSkKIyNOIHN0b3BpZm5vdChpZGVudGljYWwoaEUxLCBoRTIpKQpkMSA8LSBhcy5kZW5kcm9ncmFtKGhFMikKc3RvcGlmbm90KG9yZGVyLmRlbmRyb2dyYW0oZDEpID09IGhFMiRvcmRlciwKICAgICAgICAgIGlkZW50aWNhbChkMSwgcmV2KHJldihkMSkpKSkKIyMgbm90IHRydWUgaW4gMS45LjAKCgojIyB0cnVuYyBvbiBhIERhdGUKdHJ1bmMoeHggPC0gU3lzLkRhdGUoKSkgIyBmYWlsZWQgaW4gMS45LjEKeCA8LSB4eCArIDAuOQpzdG9waWZub3QoaWRlbnRpY2FsKHRydW5jKHgpLCB4eCkpICMgZ2F2ZSBuZXh0IGRheSBpbiAxLjkuMQp4eCA8LSBhcy5EYXRlKCIxOTYwLTAyLTAyIikKeCA8LSB4eCArIDAuMgpzdG9waWZub3QoaWRlbnRpY2FsKHRydW5jKHgpLCB4eCkpICMgbXVzdCBub3QgdHJ1bmNhdGUgdG93YXJkcyAwLgojIwoKIyMjIGVuZCBvZiB0ZXN0cyBhZGRlZCBpbiAxLjkuMSAjIyMKCiMjIDEuOS4xIHBhdGNoZWQKCiMjIG9wdGlvbnMobGlzdCgnLi4nLCAnLi4nKSkKdHJ5KG9wdGlvbnMobGlzdCgnZGlnaXRzJywgJ3dpZHRoJykpKSMgZ2l2ZSBhbiBlcnJvcgojIyBnYXZlIGEgc2VnZmF1bHQgaW4gMS45LjEKCgojIyBQUiM3MTAwIHNlZyBmYXVsdGVkIG9yIHBhdGggdG9vIGxvbmcgZXJyb3Igb24gLi8uLy4vLi8uLy4vLiAuLi4KbGVuZ3RoKCBsaXN0LmZpbGVzKCcuJywgYWxsLmZpbGVzID0gVFJVRSwgcmVjdXJzaXZlID0gVFJVRSkgKQoKCiMjIFBSIzcxMTYgc2VnZmF1bHRlZCBvbiBBLCBsYXRlciB2ZXJzaW9ucyBzZWdmYXVsdGVkIG9uIEIgb3IgZ2F2ZSBkaWZmZXJlbnQKIyMgZGltcyBmb3IgdGhlIHJlc3VsdHMuCkEgPC0gY29yKGFzLmFycmF5KGMoYT0xLGI9MikpLCBjYmluZCgxOjIpKQpCIDwtIGNvcihjYmluZCgxOjIpLCBhcy5hcnJheShjKGE9MSxiPTIpKSkKc3RvcGlmbm90KGlkZW50aWNhbChBLCBCKSkKCgojIyByZWdyZXNzaW9uIHRlc3QgZm9yIFBSIzcxMDgKYW5zIDwtIGdzdWIoIiAiLCAiIiwgImIgYyArIGQgfCBhICogYiIsIHBlcmw9VFJVRSkgIyBOVUxMIGluIDEuOS4xCnN0b3BpZm5vdChpZGVudGljYWwoYW5zLCBnc3ViKCIgIiwgIiIsICJiIGMgKyBkIHwgYSAqIGIiKSkpCmdzdWIoIiAiLCAiIiwgImE6IDEyMzQ1IDphIiwgcGVybD1UUlVFKSAjIHNlZ2ZhdWx0ZWQgaW4gMS45LjEKIyMgd3JvbmcgYW5zd2Vycywgc2VnZmF1bHRzIGluIDEuOS4xLgoKCiMjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIjNzEzMgp0bXAgPC0gZGF0YS5mcmFtZSh5PXJub3JtKDgpLAogICAgICAgICAgICAgICAgICBhYT1mYWN0b3IoYygxLDEsMSwxLDIsMiwyLDIpKSwKICAgICAgICAgICAgICAgICAgYmI9ZmFjdG9yKGMoMSwxLDIsMiwxLDEsMiwyKSksCiAgICAgICAgICAgICAgICAgIGNjPWZhY3RvcihjKDEsMiwzLDQsMSwyLDMsNCkpKQp0bXAuYW92IDwtIGFvdih5IH4gY2MgKyBiYi9hYSwgZGF0YT10bXApCmFub3ZhKHRtcC5hb3YpCm1vZGVsLnRhYmxlcyh0bXAuYW92LCB0eXBlPSJtZWFucyIpCiMjIGZhaWxlZCBpbiAxLjkuMS4KCmlmKHJlcXVpcmUoc3Vydml2YWwpKSB7ICMgcmVxdWlyZWQgcGFja2FnZQogIGEgPC0gU3VydigxOjQsIDI6NSwgYygwLDEsMSwwKSkKICBzdHIoYSkKICBzdHIoYVtyZXAoMTo0LDMpXSwgdmVjLmxlbiA9IDcpCiAgZGV0YWNoKCJwYWNrYWdlOnN1cnZpdmFsIikKfQoKIyMjIGVuZCBvZiB0ZXN0cyBhZGRlZCBpbiAxLjkuMSBwYXRjaGVkICMjIwoKCiMjIG5hbWVzIGluIGNvbHVtbnMgb2YgZGF0YSBmcmFtZXMKeCA8LSAxOjEwCm5hbWVzKHgpIDwtIGxldHRlcnNbeF0KREYgPC0gZGF0YS5mcmFtZSh4PXgpCihubSA8LSBuYW1lcyhERiR4KSkKc3RvcGlmbm90KGlzLm51bGwobm0pKQpERiR5MSA8LSB4CkRGWyJ5MiJdIDwtIHgKREZbLCAieTMiXSA8LSB4CkRGW1sieTQiXV0gPC0geApzdG9waWZub3QoaXMubnVsbChuYW1lcyhERiR5MSkpLCBpcy5udWxsKG5hbWVzKERGJHkyKSksCiAgICAgICAgICBpcy5udWxsKG5hbWVzKERGJHkzKSksIGlzLm51bGwobmFtZXMoREYkeTQpKSkKIyBuYW1lcyB3ZXJlIHByZXNlcnZlZCBpbiAxLjkueAojIGNoZWNrIGZhY3RvcnMKeHggPC0gYXMuZmFjdG9yKHgpCkRGIDwtIGRhdGEuZnJhbWUoeD14eCkKKG5tIDwtIG5hbWVzKERGJHh4KSkKc3RvcGlmbm90KGlzLm51bGwobm0pKQpERiR5MSA8LSB4eApERlsieTIiXSA8LSB4eApERlssICJ5MyJdIDwtIHh4CkRGW1sieTQiXV0gPC0geHgKc3RvcGlmbm90KGlzLm51bGwobmFtZXMoREYkeTEpKSwgaXMubnVsbChuYW1lcyhERiR5MikpLAogICAgICAgICAgaXMubnVsbChuYW1lcyhERiR5MykpLCBpcy5udWxsKG5hbWVzKERGJHk0KSkpCiMgaG93IGFib3V0IEFzSXM/ICBUaGlzIHNob3VsZCBwcmVzZXJ2ZSBuYW1lcwpERiA8LSBkYXRhLmZyYW1lKHg9SSh4KSkKKG5tIDwtIG5hbWVzKERGJHgpKQpzdG9waWZub3QoaWRlbnRpY2FsKG5tLCBuYW1lcyh4KSkpCkRGMiA8LSByYmluZChERiwgREZbNzo4LCwgZHJvcD1GQUxTRV0pCihubSA8LSBuYW1lcyhERjIkeCkpCnN0b3BpZm5vdChpZGVudGljYWwobm0sIGMobmFtZXMoeCksIG5hbWVzKHgpWzc6OF0pKSkKIyBhbmQgbWF0cmljZXM/ICBPcmRpbmFyeSBtYXRyaWNlcyB3aWxsIGJlIHNwbGl0IGludG8gY29sdW1ucwp4IDwtIDE6MTAKZGltKHgpIDwtIGMoNSwyKQpkaW1uYW1lcyh4KSA8LSBsaXN0KGxldHRlcnNbMTo1XSwgYygiaSIsICJpaSIpKQpERiA8LSBkYXRhLmZyYW1lKHg9SSh4KSkKREYyIDwtIHJiaW5kKERGLCBERikKKHJuIDwtIHJvd25hbWVzKERGMiR4KSkKc3RvcGlmbm90KGlkZW50aWNhbChybiwgYyhyb3duYW1lcyh4KSwgcm93bmFtZXMoeCkpKSkKY2xhc3MoeCkgPC0gIm1vZGVsLm1hdHJpeCIKREYgPC0gZGF0YS5mcmFtZSh4PXgpCkRGMiA8LSByYmluZChERiwgREYpCihybiA8LSByb3duYW1lcyhERjIkeCkpCnN0b3BpZm5vdChpZGVudGljYWwocm4sIGMocm93bmFtZXMoeCksIHJvd25hbWVzKHgpKSkpCiMjIG5hbWVzIHdlcmUgYWx3YXlzIHByZXNlcnZlZCBpbiAxLjkueCwgYnV0IHJiaW5kIGRyb3BwZWQgbmFtZXMgYW5kIGRpbW5hbWVzLgoKCiMjIGN1bXN1bSBldGMgZHJvcHBlZCBuYW1lcwp4IDwtIHJub3JtKDEwKQpuYW1lcyh4KSA8LSBubSA8LSBsZXR0ZXJzWzE6MTBdCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoY3Vtc3VtKHgpKSwgbm0pLAogICAgICAgICAgaWRlbnRpY2FsKG5hbWVzKGN1bXByb2QoeCkpLCBubSksCiAgICAgICAgICBpZGVudGljYWwobmFtZXMoY3VtbWF4KHgpKSwgbm0pLAogICAgICAgICAgaWRlbnRpY2FsKG5hbWVzKGN1bW1pbih4KSksIG5tKSkKeCA8LSB4KzFpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoY3Vtc3VtKHgpKSwgbm0pLAogICAgICAgICAgaWRlbnRpY2FsKG5hbWVzKGN1bXByb2QoeCkpLCBubSkpCiMjIDEuOS54IGRyb3BwZWQgbmFtZXMKCiMjIGN1bXN1bSBldGMgcHJlc2VydmUgTkFzCiMgZG91YmxlCnggPC0gYygxLCBOQSwgIDMpCnIgPC0gYygxLCBOQSwgTkEpCnN0b3BpZm5vdChpZGVudGljYWwoY3Vtc3VtKHgpLCByKSkKc3RvcGlmbm90KGlkZW50aWNhbChjdW1wcm9kKHgpLCByKSkKc3RvcGlmbm90KGlkZW50aWNhbChjdW1taW4oeCksIHIpKQpzdG9waWZub3QoaWRlbnRpY2FsKGN1bW1heCh4KSwgcikpCiMgY29tcGxleAp4IDwtIGMoMSsxaSwgTkEsIDMpCnIgPC0gYygxKzFpLCBOQSwgTkEpCnN0b3BpZm5vdChpZGVudGljYWwoY3Vtc3VtKHgpLCByKSkKc3RvcGlmbm90KGlkZW50aWNhbChjdW1wcm9kKHgpLCByKSkKIyBpbnRlZ2VyCnggPC0gYygxTCwgTkEsIDNMKQpyIDwtIGMoMUwsIE5BLCBOQSkKc3RvcGlmbm90KGlkZW50aWNhbChjdW1zdW0oeCksIHIpKQpzdG9waWZub3QoaWRlbnRpY2FsKGN1bXByb2QoeCksIGMoMSwgTkEsIE5BKSkpICMgcmV0dXJucyBkb3VibGUKc3RvcGlmbm90KGlkZW50aWNhbChjdW1taW4oeCksIHIpKQpzdG9waWZub3QoaWRlbnRpY2FsKGN1bW1heCh4KSwgcikpCgojIyBjb21wbGV4IHN1cGVyYXNzaWdubWVudHMKZSA8LSBjKGE9MSwgYj0yKQpmIDwtIGMoYT0xLCBiPTIpCmcgPC0gZQpoIDwtIGxpc3QoYT0xLCBsaXN0KGI9MiwgbGlzdChjPTMsIGQ9NCksIGxpc3QoZT01KSkpCmogPC0gbWF0cml4KDEsIDIsIDIpCmEgPC0gIkEiCmxvY2FsKHsKICBlb2xkIDwtIGUgPC0gYyhBPTEwLCBCPTExKQogIGhvbGQgPC0gaCA8LSAyCiAgam9sZCA8LSBqIDwtIDcKICBnb2xkIDwtIGcgPC0gZQogIGEgPC0gIkIiCgogIGVbMl0gPDwtIGVbMl0rMQogIG5hbWVzKGYpWzJdIDw8LSBhCiAgZyA8PC0gMQogIGhbWzJdXVtbaF1dW1sgZltlPT0xMF0gXV0gPDwtIGgKICBuYW1lcyhoW1syXV1bW2hdXSlbZltlPT0xMF0gXSA8PC0gYQogIGpbaCwgaF0gPDwtIGgKICBjb2xuYW1lcyhqKVsyXSA8PC0gYQoKICBzdG9waWZub3QoaWRlbnRpY2FsKGUsIGVvbGQpKQogIHN0b3BpZm5vdChpZGVudGljYWwoaCwgaG9sZCkpCiAgc3RvcGlmbm90KGlkZW50aWNhbChnLCBnb2xkKSkKICBzdG9waWZub3QoaWRlbnRpY2FsKGosIGpvbGQpKQp9KQoKc3RvcGlmbm90KGlkZW50aWNhbChlLCBjKGE9MSwgYj0xMikpKQpzdG9waWZub3QoaWRlbnRpY2FsKGYsIGMoYT0xLCBCPTIpKSkKc3RvcGlmbm90KGlkZW50aWNhbChnLCAxKSkKc3RvcGlmbm90KGlkZW50aWNhbChoLCBsaXN0KGE9MSwgbGlzdChiPTIsIGxpc3QoQj0yLCBkPTQpLCBsaXN0KGU9NSkpKSkpCnN0b3BpZm5vdChpZGVudGljYWwoYXMudmVjdG9yKGopLCBjKDEsIDEsIDEsIDIpKSkKc3RvcGlmbm90KGlkZW50aWNhbChjb2xuYW1lcyhqKSwgYyhOQSwiQiIpKSkKIyMgZ2F2ZSBlcnJvciAnc3Vic2NyaXB0IG91dCBvZiBib3VuZHMnIGluIDEuOS4xCgojIyBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGN5Y2xlcyBvdXQgb2YgY2hhbmdlcyB0byBzdWJhc3NpZ24zLgp4IDwtIGxpc3QoYT0xLCB5PTIpCngkYSA8LSB4CnByaW50KHgpCngkZCA8LSB4CnByaW50KHgpCnkgPC0geAp4JGIgPC0geQpwcmludCh4KQp4JGYgPC0geQpwcmludCh4KQojIwoKCiMjIG1vZGVsLmZyYW1lIGluY29ycmVjdGx5IHByZXNlcnZlZCB0cyBhdHRyaWJ1dGVzCngxIDwtIHRzKGMoMToxMCwgTkEpKQp5MSA8LSB0cyhybm9ybSgxMSkpCmxtKHkxIH4geDEpCmxtKHkxIH4geDEgKyBJKHgxXjIpKSAjIHNlY29uZCB0ZXJtIGhhcyB0d28gY2xhc3NlcwojIyBmYWlsZWQgaW4gMS45LjEKCgojIyByYW5nZSBjaGVja3MgbWlzc2luZyBpbiByZWN1cnNpdmUgYXNzaWdubWVudHMgKFBSIzcxOTYpCmwgPC0gbGlzdCgpCnRyeShsW1syOjNdXSA8LSAxKQpsIDwtIGxpc3QoeD0yKQp0cnkobFtbMjozXV0gPC0gMSkKbCA8LSBsaXN0KHg9MiwgeT0zKQpsW1syOjNdXSA8LSAxCiMjIGZpcnN0IHR3byBzZWdmYXVsdGVkIGluIDEuOS54CgoKIyMgYXBwbHkoKSBvbiBhbiBhcnJheSBvZiBkaW1lbnNpb24gPj0zIEFORCB3aGVuIGZvciBlYWNoIGl0ZXJhdGlvbgojIyB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG5hbWVkIHZlY3RvciBvZiBsZW5ndGggPj0yIChQUiM3MjA1KQphIDwtIGFycmF5KDE6MjQsIGRpbT0yOjQpCmZ1bmMxIDwtIGZ1bmN0aW9uKHgpIGMoYT1tZWFuKHgpLCBiPW1heCh4KSkKYXBwbHkoYSwgMToyLCBmdW5jMSkKIyMgZmFpbGVkIGluIDEuOS4xCgoKIyBjb2wycmdiIG11c3QgcmV0dXJuIGEgbWF0cml4IGZvciBhIHNpbmdsZSBjb2xvdXIKc3RvcGlmbm90KGlzLm1hdHJpeChjb2wycmdiKCJyZWQiKSkpCiMjIHdhcyB2ZWN0b3IgYXQgb25lIHBvaW50IGluIHByZS0yLjAuMAoKCiMjIFN1YnNjcmlwdGluZyBtYXRyaWNlcyB3aXRoIE5BJ3MKQUFBIDwtIGFycmF5KDE6NiwgYyg2LDEsMSkpCmlkeCA8LSBjKDEsMixOQSxOQSw1LDYpCkIgPC0gMTAKQUFBW2lkeCwxLDFdIDwtIEIKc3RvcGlmbm90KGFsbC5lcXVhbChhcy52ZWN0b3IoQUFBKSwgYygxMCwxMCwzLDQsMTAsMTApKSkKIyMgYXNzaWduZWQgb25seSB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzIGluIDEuOS4xLgojIyBUZXN0cyBmb3IgPj0gMi4wLjAKQSA8LSBjKDEsMiwzLDQsNSw2KQpBW2lkeF0gPC0gMjcgIyBPSywgb25lIHZhbHVlCnN0b3BpZm5vdChpZGVudGljYWwoQSwgYygyNywyNywzLDQsMjcsMjcpKSkKdHJ5KEFbaWR4XSA8LSA2OjEpICMgd2FzIDYgNSAzIDQgMiAxIGluIDEuOS4xCnN0b3BpZm5vdChpbmhlcml0cyguTGFzdC52YWx1ZSwgInRyeS1lcnJvciIpKQoKQUEgPC0gbWF0cml4KGMoMSwyLDMsNCw1LDYpLCA2LCAxKQpBQVtpZHgsXSA8LSAyNyAjIE9LLCBvbmUgdmFsdWUKc3RvcGlmbm90KGlkZW50aWNhbChBQSwgbWF0cml4KGMoMjcsMjcsMyw0LDI3LDI3KSwgNiwgMSkpKQp0cnkoQUFbaWR4LF0gPC0gNjoxKSAjIHdhcyA2IDUgMyA0IDQgMyBpbiAxLjkuMQpzdG9waWZub3QoaW5oZXJpdHMoLkxhc3QudmFsdWUsICJ0cnktZXJyb3IiKSkKCkFBQSA8LSBhcnJheShjKDEsMiwzLDQsNSw2KSwgYyg2LDEsMSkpCkFBQVtpZHgsLF0gPC0gMjcgIyBPSywgb25lIHZhbHVlCnN0b3BpZm5vdChpZGVudGljYWwoQUFBLCBhcnJheShjKDI3LDI3LDMsNCwyNywyNyksIGMoNiwxLDEpKSkpCnRyeShBQUFbaWR4LCxdIDwtIDY6MSkgIyB3YXMgNiA1IDMgNCA1IDYgaW4gMS45LjEKc3RvcGlmbm90KGluaGVyaXRzKC5MYXN0LnZhbHVlLCAidHJ5LWVycm9yIikpCiMjIG9ubHkgbGVuZ3RoLTEgdmFsdWVzIGFyZSBhbGxvd2VkIGluID49IDIuMC4wLgoKCiMjIGhpc3Qgd2l0aCBpbmZpbml0ZSB2YWx1ZXMgKFBSIzcyMjApCmhpc3QobG9nKC01OjEwMCksIHBsb3QgPSBGQUxTRSkKIyMgZmFpbGVkIGluIDEuOS4xOiB3aWxsIHdhcm4sIGNvcnJlY3RseS4KCgojIyBtZXJnZSBwcm9ibGVtIHdpdGggbmFtZXMvbm90IGluIHJiaW5kLmRhdGEuZnJhbWUKeCA8LSBzdHJ1Y3R1cmUoYygiYSIsICJiIiwgIjIiLCAiMC4yLTI2IiwgIk8iLCAiTyIpLCAuRGltID0gMjozLAogICAgICAgICAgICAgICAuRGltbmFtZXMgPSBsaXN0KGMoIjEiLCAiMiIpLCBjKCJQIiwgIlYiLCAiMiIpKSkKeSA8LSBzdHJ1Y3R1cmUoYygiYSIsICJiIiwgIjIiLCAiMC4yLTI1IiwgIk8iLCAiTyIpLCAuRGltID0gMjozLAogICAgICAgICAgICAgICAuRGltbmFtZXMgPSBsaXN0KGMoIjEiLCAiMiIpLCBjKCJQIiwgIlYiLCAiMSIpKSkKbWVyZ2UoeCwgeSwgYWxsLnkgPSBUUlVFKQojIyBmYWlsZWQgZm9yIGEgd2hpbGUgaW4gcHJlLTIuMC4wCgoKIyMgbWF0cml4IHJlc3BvbnNlcyBpbiBiaW5vbWlhbCBnbG0gbG9zdCBuYW1lcyBwcmlvciB0byAyLjAuMAp5IDwtIHJiaW5vbSgxMCwgMTAsIDAuNSkKeCA8LSAxOjEwCm5hbWVzKHkpIDwtIGxldHRlcnNbMToxMF0KeW0gPC0gY2JpbmQoeSwgMTAteSkKZml0MiA8LSBnbG0oeW0gfiB4LCBiaW5vbWlhbCkKc3RvcGlmbm90KGlkZW50aWNhbChuYW1lcyhyZXNpZChmaXQyKSksIG5hbWVzKHkpKSkKIyMgTm90ZTogZml0IDwtIGdsbSh5LzEwIH4geCwgYmlub21pYWwsIHdlaWdodHM9cmVwKDEwLCAxMCkpCiMjIERvZXMgbm90IHByZXNlcnZlIG5hbWVzIGluIFIgPCAyLjAuMSwgYnV0IGRvZXMgaW4gUy4KZml0IDwtIGdsbSh5LzEwIH4geCwgYmlub21pYWwsIHdlaWdodHM9cmVwKDEwLCAxMCkpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMocmVzaWQoZml0KSksIG5hbWVzKHkpKSkKIyMgVGhlIHByb2JsZW0gd2FzIGdsbS5maXQgYXNzdW1lZCBhIHZlY3RvciByZXNwb25zZS4KCgojIyBkbG9naXMoLTIwMDApIHdhcyBOYU4gaW4gPD0gMi4wLjAuCnN0b3BpZm5vdChpZGVudGljYWwoZGxvZ2lzKC0yMDAwKSwgMC4wKSkKIyMKCgojIyBzaG9ydCB2ZWN0b3JzIGluIHNwbGluZVtmdW5dICAoUFIjNzI5MCkKdHJ5KHNwbGluZWZ1bigxWzBdLCAxWzBdKSgxKSkgIyBzZWdmYXVsdCBpbiA8PSAyLjAuMApmb3IobWV0aCBpbiBjKCJmbW0iLCAibmF0IiwgInBlciIpKQogICAgc3RvcGlmbm90KGFsbChzcGxpbmVmdW4oMSwgcGksIG1ldGhvZCA9IG1ldGgpKDA6MikgPT0gcmVwKHBpLCAzKSkpCiMjIGV4YWN0bHkgY29uc3RhbnQgZm9yIG49MTsgd2FzIE5BIGZvciAicGVyaW9kaWMiIGluIDw9IDIuMC4wCgoKIyMgZWNkZiB3aXRoIE5BcyAocGFydCBvZiBQUiM3MjkyKS4KeCA8LSBjKDEsMiwyLDQsNywgTkEsIDEwLDEyLCAxNSwyMCkKZWNkZih4KQojIyBmYWlsZWQgaW4gPD0gMi4wLjAuCgoKIyMgSW5jb3JyZWN0IHVzZSBvZiBhcy5EYXRlIHNlZ2ZhdWx0ZWQgb24gc29tZSB4ODZfNjQgc3lzdGVtcy4KYXMuRGF0ZSgiMjAwMSIsICIlWSIpCiMjIGFuc3dlciBpcyB1c3VhbGx5IGN1cnJlbnQgbW9uICYgZGF5LCBidXQgMjAwMS0wMS0wMSBvbiBTb2xhcmlzLgoKCiMjIHJhbmsgYW5kIG9yZGVyIGFjY2VwdGVkIGludmFsaWQgaW5wdXRzIChhbmQgZ2F2ZSBub25zZW5zZSkKeDEgPC0gYXMubGlzdCgxMDoxKQp4MiA8LSAgY2hhclRvUmF3KCJBIHRlc3Qgc3RyaW5nIikKc3RvcGlmbm90KGluaGVyaXRzKHRyeShvcmRlcih4MSkpLCAidHJ5LWVycm9yIiksCiAgICAgICAgICBpbmhlcml0cyh0cnkob3JkZXIoeDIpKSwgInRyeS1lcnJvciIpLAogICAgICAgICAgaW5oZXJpdHModHJ5KHJhbmsoeDEpKSwgInRyeS1lcnJvciIpLAogICAgICAgICAgaW5oZXJpdHModHJ5KHJhbmsoeDIpKSwgInRyeS1lcnJvciIpKQojIyB3b3JrZWQgYnV0IGdhdmUgMTpuIGluIDIuMC4wLgpzdG9waWZub3QoaW5oZXJpdHModHJ5KHNvcnQoeDEpKSwgInRyeS1lcnJvciIpLAogICAgICAgICAgaW5oZXJpdHModHJ5KHNvcnQoeDIpKSwgInRyeS1lcnJvciIpLAogICAgICAgICAgaW5oZXJpdHModHJ5KHNvcnQoeDEsIHBhcnRpYWw9NSkpLCAidHJ5LWVycm9yIiksCiAgICAgICAgICBpbmhlcml0cyh0cnkoc29ydCh4MiwgcGFydGlhbD01KSksICJ0cnktZXJyb3IiKSkKIyMKCgojIyBwbWF4IGZhaWxlZCB3aXRoIE5BIGlucHV0cwpwbWF4KGMoMSwyLE5BKSwgYygzLDQsTkEpLCBuYS5ybT1UUlVFKQojIyBmYWlsZWQgYWZ0ZXIgZm9yIDIuMC4wIGNoYW5nZSB0byBzdWJhc3NpZ25tZW50CgoKIyMgc3ViYXNzaWduaW5nIGV4cHJlc3Npb24gY291bGQgc2VnZmF1bHQgKFBSIzczMjYpCmZvbyA8LSBleHByZXNzaW9uKGFscGhhLCBiZXRhLCBnYW1tYSkKZm9vWzJdCmZvb1syXSA8LSBOQQpmb28KIyMgc2VnZmF1bHRlZCBpbiAyLjAuMAoKCiMjIGluY29ycmVjdCBhcmcgbWF0Y2hpbmcgaW4gc3VtIG1pbiBtYXggcHJvZCBhbnkgYWxsCiMjIFBhdCBCdXJucywgUi1kZXZlbCAyMDA0LTExLTE5CnN0b3BpZm5vdChpZGVudGljYWwoc3VtKDE6NCwgTkEsIG4gPSA3OCwgbmEucm0gPSBUUlVFKSwgODgpKQojIyB3YXMgMTEgaW4gMi4wLjEKCgojIyBzZWdmYXVsdCBmcm9tIHRleHQsIFAgRWhsZXJzLCBSLWRldmVsIDIwMDQtMTEtMjQKcGxvdCgxOjEwKQpsb2MgPC0gbGlzdCg1LCA2KQp0cnkodGV4dChsb2MsIGxhYmVscyA9ICJhIikpCiMjIHNlZ2ZhdWx0ZWQgaW4gMi4wLjEKCgojIyBhdXRvbWF0aWMgcm93Lm5hbWVzIGNhbiBiZSBudW1iZXItbGlrZSwgTU0sIDIwMDQtMTEtMjYKZDAgPC0gZGF0YS5mcmFtZSh4PTE6MywgeT1waSoyOjApCnJvdy5uYW1lcyhkMClbM10gPC0gYygiMDEuMDAiKQp3cml0ZS50YWJsZShkMCwgKHRmIDwtIHRlbXBmaWxlKCkpKQpkIDwtIHJlYWQudGFibGUodGYpCiMjIGdhdmUgZXJyb3IgKCJkdXBsaWNhdGUgcm93Lm5hbWVzIikgaW4gMi4wLjEKc3RvcGlmbm90KGFsbC5lcXVhbChkLGQwKSkKdW5saW5rKHRmKQoKCiMjIHNlcSgpIHNob3VsZCBiZSBtb3JlIGNvbnNpc3RlbnQgaW4gcmV0dXJuaW5nICJpbnRlZ2VyIgpzdG9waWZub3QodHlwZW9mKHNlcShsZW5ndGg9MCkpID09ICJpbnRlZ2VyIiwKICAgICAgICAgIGlkZW50aWNhbChzZXEobGVuZ3RoPTApLCBzZXEoYWxvbmcud2l0aD0wWzBdKSksCiAgICAgICAgICBpZGVudGljYWwoc2VxKGxlbmd0aD0zKSwgMTozKSwKICAgICAgICAgIGlkZW50aWNhbChzZXEobGVuZ3RoPTMpLCBzZXEoYWxvbmcud2l0aD0xOjMpKSkKCgojIyBsYWJlbHMubG0gd2FzIGJyb2tlbiAoUFIjNzQxNykKIyBwYXJ0IG9mIGV4YW1wbGUobG0pCmN0bCA8LSBjKDQuMTcsNS41OCw1LjE4LDYuMTEsNC41MCw0LjYxLDUuMTcsNC41Myw1LjMzLDUuMTQpCnRydCA8LSBjKDQuODEsNC4xNyw0LjQxLDMuNTksNS44NywzLjgzLDYuMDMsNC44OSw0LjMyLDQuNjkpCmdyb3VwIDwtIGdsKDIsMTAsMjAsIGxhYmVscz1jKCJDdGwiLCJUcnQiKSkKd2VpZ2h0IDwtIGMoY3RsLCB0cnQpCmxtLkQ5IDwtIGxtKHdlaWdodCB+IGdyb3VwKQpzdG9waWZub3QobGFiZWxzKGxtLkQ5KSA9PSAiZ3JvdXAiKQojIyBmYWlsZWQgaW4gMi4wLjEsIGdpdmluZyBsZW5ndGggMAoKCiMjIHNwcmludGYgaGFkIG5vIGxlbmd0aCBjaGVjayAoUFIjNzU1NCkKYSA8LSBtYXRyaXggKG5jb2w9MTAwLCBucm93PTEwMCwgZGF0YT1jKDEsMiwzLDQsNSkpCmEuc2VyaWFsIDwtIHJhd1RvQ2hhcihzZXJpYWxpemUoYSwgTlVMTCwgYXNjaWk9VFJVRSkpCnRyeShzcHJpbnRmKCdmb286ICVzXG4nLCBhLnNlcmlhbCkpCiMjIHNlcWZhdWx0ZWQgaW4gMi4wLjEKCgojIyBhbGwvYW55IGRpZCBub3QgY29lcmNlIGFzIHRoZSBCbHVlIEJvb2sgZGVzY3JpYmVkLgpmb3IoeCBpbiBjKCJGIiwgIkZBTFNFIiwgIlQiLCAiVFJVRSIsICJOQSIpKSB7CiAgICBwcmludChhbGwoeCkpCiAgICBwcmludChhbnkoeCkpCn0KYWxsKGxpc3QoKSkKYW55KGxpc3QoKSkKIyMgYWxsIGZhaWxlZCBpbiAyLjAuMSB3aXRoICdpbmNvcnJlY3QgYXJndW1lbnQgdHlwZScKCgojIy0tLS0gbmFtZWQgZGltbmFtZXMgb2YgICUqJSBhbmQgY3Jvc3Nwcm9kKCkgLS0gbWF0cmljZXMgYW5kIDEtZCBhcnJheXM6CnRzdDEgPC0gZnVuY3Rpb24obSkgewogICAgc3RvcGlmbm90KGlkZW50aWNhbCh0KG0pICUqJSAgKG0pLCBjcm9zc3Byb2QobSkpKQogICAgc3RvcGlmbm90KGlkZW50aWNhbChtICAgICUqJSB0KG0pLCBjcm9zc3Byb2QodChtKSkpKQp9CnRzdDIgPC0gZnVuY3Rpb24oeCwgeT14KSB7CiAgICBzdG9waWZub3QoaWRlbnRpY2FsKHQoeCkgJSolICh5KSwoY3Jvc3Nwcm9kKHgseSkgLT4gIEMpKSkKICAgIHN0b3BpZm5vdChpZGVudGljYWwodCh5KSAlKiUgKHgpLChjcm9zc3Byb2QoeSx4KSAtPiB0QykpKQogICAgc3RvcGlmbm90KGlkZW50aWNhbCh0QywgdChDKSkpCn0KCnttMSA8LSBhcnJheSgxOjIsMToyKTsgZGltbmFtZXMobTEpIDwtIGxpc3QoRDE9IkEiLCBEMj1jKCJhIiwiYiIpKTsgbTF9CnRzdDEobTEpCm0yIDwtIG0xOyBuYW1lcyhkaW1uYW1lcyhtMikpIDwtIGMoIiIsICJkMiIpOyB0c3QxKG0yKQptMyA8LSBtMTsgbmFtZXMoZGltbmFtZXMobTMpKSA8LSBjKCIiLCAiIikgIDsgdHN0MShtMykKbTQgPC0gbTE7IG5hbWVzKGRpbW5hbWVzKG00KSkgPC0gTlVMTCAgICAgICA7IHRzdDEobTQpCgp0c3QyKG0xLG0yKQp0c3QyKG0xLG0zKQp0c3QyKG0xLG00KQp0c3QyKG0yLG0zKQp0c3QyKG0yLG00KQp0c3QyKG0zLG00KQoKIyMgMikgTm93IHRoZSAnc2FtZScgd2l0aCAxLWQgYXJyYXlzOgphMSA8LSBtMTsgZGltKGExKSA8LSBsZW5ndGgoYTEpOyBkaW1uYW1lcyhhMSkgPC0gZGltbmFtZXMobTEpWzJdOyBhMSAjIG5hbWVkIGRuCmEyIDwtIGExOyBuYW1lcyhkaW1uYW1lcyhhMikpIDwtIE5VTEwgOyBhMiAjIHVubmFtZWQgZG4KYTMgPC0gYTE7IGRpbW5hbWVzKGEzKSA8LSBOVUxMIDsgYTMgIyBubyBkbgpzdG9waWZub3QoaWRlbnRpY2FsKGRpbW5hbWVzKHQoYTEpKVsyXSwgZGltbmFtZXMoYTEpKSkKIyMgaW4gdmVyc2lvbiA8PSAyLjAuMSwgIHQoLikgd2FzIGxvb3NpbmcgbmFtZXMgb2YgZGltbmFtZXMoKQp0c3QxKGExKSMgZmFpbGVkIGluIDIuMC4xICgidHdpY2UiKQp0c3QxKGEyKSMgZmFpbGVkIGluIDIuMC4xCnRzdDEoYTMpIyBvawojIyB0aGVzZSBhbGwgdGhyZWUgZmFpbGVkIGluICgyLjAuMSkgZm9yIG1vcmUgdGhhbiBvbmUgcmVhc29uOgp0c3QyKGExLGEyKQp0c3QyKGExLGEzKQp0c3QyKGEyLGEzKQojIyBlbmQge3Rlc3RpbmcgbmFtZWQgZGltbmFtZXMgZm9yICUqJSBhbmQgY3Jvc3Nwcm9kKCl9CgoKIyMgLS0gY29lcmNpbmcgYXMuZGF0YS5mcmFtZShOVUxMKSB0byBhIHBhaXJsaXN0IGRpZG4ndCB3b3JrCnk8LTE6MTAKZXZhbChxdW90ZSh5KSwgYXMuZGF0YS5mcmFtZShOVUxMKSkKIyMgTlVMTCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGV2YWwgc2hvdWxkIGJlIHRyZWF0ZWQKIyMgbGlrZSBhIGxpc3Qgb3IgZGF0YSBmcmFtZQpldmFsKHF1b3RlKHkpLCBOVUxMKQojIyBlbmQKCgojIyBkYXRhIGZyYW1lIHdpdGggbm90aGluZyB0byByZXBsYWNlCkEgPC0gbWF0cml4KDE6NCwgMiwgMikKQVtpcy5uYShBKV0gPC0gMApBIDwtIGFzLmRhdGEuZnJhbWUoQSkKQVtpcy5uYShBKV0gPC0gMAojIyBsYXN0IG5vdCBhY2NlcHRlZCBwcmlvciB0byAyLjEuMAoKCiMjIHNjYW4gb24gcGFydGlhbCBsaW5lcyBvbiBhbiBvcGVuIGNvbm5lY3Rpb24KY2F0KCJUSVRMRSBleHRyYSBsaW5lIiwgIjIzNSAzMzUgNTM1IDczNSIsICIxMTUgMTM1IDE3NSIsCiAgICBmaWxlPSJleC5kYXRhIiwgc2VwPSJcbiIpCmNuLnggPC0gZmlsZSgiZXguZGF0YSIsIG9wZW49InIiKQpyZXMgPC0gc2Nhbihjbi54LCBza2lwPTEsIG49MikKcmVzIDwtIGMocmVzLCBzY2FuKGNuLngsIG49MikpCnJlcyA8LSBjKHJlcywgc2Nhbihjbi54LCBuPTIpKQpyZXMgPC0gYyhyZXMsIHNjYW4oY24ueCwgbj0yKSkKY2xvc2UoY24ueCwgc2VwPSIgIikKdW5saW5rKCJleC5kYXRhIikKc3RvcGlmbm90KGlkZW50aWNhbChyZXMsIGMoMjM1LCAzMzUsIDUzNSwgNzM1LCAxMTUsIDEzNSwgMTc1KSkpCiMjIGRyb3BwZWQgc29tZSBmaXJzdCBjaGFycyA8IDIuMS4wCgoKIyMgUFIjNzY4NiBmb3JtYXRDIGRvZXMgbm90IHBpY2sgdXAgb24gaW5jb3JyZWN0ICdmbGFnJyBpbnB1dHMKdHJ5KGZvcm1hdEMoMSwgZmxhZz0icyIpKQojIyBzZWdmYXVsdGVkIGluIDIuMC4xCgoKIyMgUFIjNzY5NSBjb250cmFzdHMgbmVlZGVkIGNvZXJjaW9uIHRvIGRvdWJsZQpjIDwtIG1hdHJpeChjKDAsMSwyKSwgbnJvdz0zKQpzdG9yYWdlLm1vZGUoYykgPC0gImludGVnZXIiCmYgPC0gZmFjdG9yKDE6MykKY29udHJhc3RzKGYsIDEpIDwtIGMKeCA8LSBtb2RlbC5tYXRyaXgofmYpCnN0b3BpZm5vdCh4ID09IGMoMSwxLDEsMCwxLDIpKQojIyBnYXZlIG1hY2hpbmUtZGVwZW5kZW5kZW50IHNpbGx5IG51bWJlcnMgaW4gMi4wLjEKCgojIyBleHRyZW1lIChkZS1ub3JtYWxpemVkKSBheGlzIHJhbmdlCnggPC0gMl4tc2VxKDY3LCAxMDY3LCBsZW5ndGg9MjApCnBsb3QoeF4uOSwgeCwgdHlwZT0ibCIsIGxvZz0ieHkiKSAjIHN0aWxsIHdhcm5pbmcgYW5kIHVnbHkgbGFiZWxzIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgZS5nLiwgMTBeLTMyMyB8PT0+IDkuODgxMzEzZS0zMjQgbnVtZXJpY2FsbHkKIyMgZ2F2ZSBlcnJvciAibG9nIC0gYXhpcygpLCAnYXQnIGNyZWF0aW9uLCBfTEFSR0VfIHJhbmdlLi4uIiBpbiAyLjAuMQoKCiMjIHRvcnR1cmUgdGVzdCBvZiBzY2FuKCkgd2l0aCBhbGxvd0VzY2FwZT1UUlVFCnRmIDwtIHRlbXBmaWxlKCkKeCA8LSBjKCdBQkMnLCAnIjEyMyInLCAiYSdiIikKY2F0KHNoUXVvdGUoeCwgImNtZCIpLCBzZXA9IlxuIiwgZmlsZT10ZikKKHgyIDwtIHNjYW4odGYsICIiKSkKdW5saW5rKHRmKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsIHgyKSkKIyMgQXQgb25lIHBvaW50IHByZS0yLjEuMCBnb3QgY29uZnVzZWQKCgojIyBzZS5jb250cmFzdCBmYWlsZWQgaW4gMi4wLjEgd2l0aCBzb21lIGVmZmVjdGl2ZWx5IG9uZS1zdHJhdHVtIGRlc2lnbnMuCm9sZCA8LSBnZXRPcHRpb24oImNvbnRyYXN0cyIpCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIuaGVsbWVydCIsICJjb250ci5wb2x5IikpCkxhYiA8LSBmYWN0b3IocmVwKGMoIjEiLCIyIiwiMyIpLCBlYWNoPTEyKSkKTWF0ZXJpYWwgPC0gZmFjdG9yKHJlcChjKCJBIiwiQiIsIkMiLCJEIiksZWFjaD0zLHRpbWVzPTMpKQpNZWFzdXJlbWVudCA8LSBjKDEyLjIwLDEyLjI4LDEyLjE2LDE1LjUxLDE1LjAyLDE1LjI5LDE4LjE0LDE4LjA4LDE4LjIxLAogICAgICAgICAgICAgICAgIDE4LjU0LDE4LjM2LDE4LjQ1LDEyLjU5LDEyLjMwLDEyLjY3LDE0Ljk4LDE1LjQ2LDE1LjIyLAogICAgICAgICAgICAgICAgIDE4LjU0LDE4LjMxLDE4LjYwLDE5LjIxLDE4Ljc3LDE4LjY5LDEyLjcyLDEyLjc4LDEyLjY2LAogICAgICAgICAgICAgICAgIDE1LjMzLDE1LjE5LDE1LjI0LDE4LjAwLDE4LjE1LDE3LjkzLDE4Ljg4LDE4LjEyLDE4LjAzKQp0ZXN0ZGF0YSA8LSBkYXRhLmZyYW1lKExhYiwgTWF0ZXJpYWwsIE1lYXN1cmVtZW50KQoodGVzdC5hb3YgPC0gYW92KE1lYXN1cmVtZW50IH4gTWF0ZXJpYWwgKyBFcnJvcihMYWIvTWF0ZXJpYWwpLAogICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXN0ZGF0YSkpCmVmZi5hb3ZsaXN0KHRlc3QuYW92KQoocmVzIDwtIHNlLmNvbnRyYXN0KHRlc3QuYW92LAogICAgICAgICAgICAgICAgICAgIGxpc3QoTWF0ZXJpYWw9PSJBIiwgTWF0ZXJpYWw9PSJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGVyaWFsPT0iQyIsIE1hdGVyaWFsPT0iRCIpLAogICAgICAgICAgICAgICAgICAgIGNvZWYgPSBjKDEsIDEsIC0xLCAtMSksIGRhdGEgPSB0ZXN0ZGF0YSkpCiMjIGZhaWxlZCBpbiAyLjAuMSBhcyBhIG1hdHJpeCB3YXMgMSB4IDEuCgojIyAyLjAuMSBhbHNvIGZhaWxlZCB0byBjaGVjayBmb3Igb3J0aG9nb25hbCBjb250cmFzdHMKIyMgaW4gY2FsY3VsYXRpbmcgdGhlIGVmZmljaWVuY2llcyAod2hpY2ggYXJlIDEgaGVyZSkuCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIudHJlYXRtZW50IiwgImNvbnRyLnBvbHkiKSkKKHRlc3QyLmFvdiA8LSBhb3YoTWVhc3VyZW1lbnQgfiBNYXRlcmlhbCArIEVycm9yKExhYi9NYXRlcmlhbCksCiAgICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXN0ZGF0YSkpCihyZXMyIDwtIHNlLmNvbnRyYXN0KHRlc3QyLmFvdiwKICAgICAgICAgICAgICAgICAgICAgbGlzdChNYXRlcmlhbD09IkEiLCBNYXRlcmlhbD09IkIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGVyaWFsPT0iQyIsIE1hdGVyaWFsPT0iRCIpLAogICAgICAgICAgICAgICAgICAgICBjb2VmID0gYygxLCAxLCAtMSwgLTEpLCBkYXRhID0gdGVzdGRhdGEpKQpzdG9waWZub3QoYWxsLmVxdWFsKHJlcywgcmVzMikpCgojIyByZWxhdGVkIGNoZWNrcyBvbiBlZmYuYW92bGlzdAojIGZyb20gZXhhbXBsZShlZmYuYW92bGlzdCkgIyBoZWxtZXJ0IGNvbnRyYXN0cwpCbG9jayA8LSBnbCg4LCA0KQpBPC1mYWN0b3IoYygwLDEsMCwxLDAsMSwwLDEsMCwxLDAsMSwwLDEsMCwxLDAsMSwwLDEsMCwxLDAsMSwwLDEsMCwxLDAsMSwwLDEpKQpCPC1mYWN0b3IoYygwLDAsMSwxLDAsMCwxLDEsMCwxLDAsMSwxLDAsMSwwLDAsMCwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwxLDEpKQpDPC1mYWN0b3IoYygwLDEsMSwwLDEsMCwwLDEsMCwwLDEsMSwwLDAsMSwxLDAsMSwwLDEsMSwwLDEsMCwwLDAsMSwxLDEsMSwwLDApKQpZaWVsZCA8LSBjKDEwMSwgMzczLCAzOTgsIDI5MSwgMzEyLCAxMDYsIDI2NSwgNDUwLCAxMDYsIDMwNiwgMzI0LCA0NDksCiAgICAgICAgICAgMjcyLCA4OSwgNDA3LCAzMzgsIDg3LCAzMjQsIDI3OSwgNDcxLCAzMjMsIDEyOCwgNDIzLCAzMzQsCiAgICAgICAgICAgMTMxLCAxMDMsIDQ0NSwgNDM3LCAzMjQsIDM2MSwgMzAyLCAyNzIpCmFvdmRhdCA8LSBkYXRhLmZyYW1lKEJsb2NrLCBBLCBCLCBDLCBZaWVsZCkKb2xkIDwtIGdldE9wdGlvbigiY29udHJhc3RzIikKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuaGVsbWVydCIsICJjb250ci5wb2x5IikpCmZpdCA8LSBhb3YoWWllbGQgfiBBICogQiAqIEMgKyBFcnJvcihCbG9jayksIGRhdGEgPSBhb3ZkYXQpCmVmZjEgPC0gZWZmLmFvdmxpc3QoZml0KQpvcHRpb25zKGNvbnRyYXN0cyA9IG9sZCkKZml0IDwtIGFvdihZaWVsZCB+IEEgKiBCICogQyArIEVycm9yKEJsb2NrKSwgZGF0YSA9IGFvdmRhdCkKZWZmMiA8LSBlZmYuYW92bGlzdChmaXQpCnN0b3BpZm5vdChhbGwuZXF1YWwoZWZmMSwgZWZmMikpICMgd2lsbCBoYXZlIHJvdW5kaW5nLWVycm9yIGRpZmZlcmVuY2VzCiMjIFdlcmUgZGlmZmVyZW50IGluIGVhcmxpZXIgdmVyc2lvbnMKCgojIyBwYXJ0cyBvZiBQUiM3NzQyIGFuZCBvdGhlciBleGFtcGxlcwpzdWIoJ14nLCd2XycsIDE6MywgcGVybD1UUlVFKQojIyAyLjAuMSBkaWQgbm90IGNvZXJjZSB0byBjaGFyYWN0ZXIgKG5vciB3YXMgaXQgZG9jdW1lbnRlZCB0bykuCnggPC0gTEVUVEVSU1sxOjNdCnN0b3BpZm5vdChpZGVudGljYWwocGFzdGUoJ3ZfJywgeCwgc2VwPSIiKSwKICAgICAgICAgICAgICAgICAgICBzdWIoJ14nLCd2XycsIHgsIHBlcmwgPSBUUlVFKSkpCiMjIDIuMC4xIGFkZGVkIHJhbmRvbSBjaGFycyBhdCB0aGUgZW5kCnN0b3BpZm5vdChpZGVudGljYWwocGFzdGUoJ3ZfJywgeCwgc2VwPSIiKSwgc3ViKCdeJywndl8nLCB4KSkpCiMjIDIuMC4xIGRpZCBub3Qgc3Vic3RpdHV0ZSBhdCBhbGwKKHggPC0gZ3N1YigiXFxiIiwgInwiLCAiVGhlIHF1aWNrIGJyb3duIGZveCIsIHBlcmwgPSBUUlVFKSkKc3RvcGlmbm90KGlkZW50aWNhbCh4LCAifFRoZXwgfHF1aWNrfCB8YnJvd258IHxmb3h8IikpCiMjIGNoZWNrZWQgYWdhaW5zdCBzZWQ6IDIuMC4xIGluZmluaXRlLWxvb3BlZC4KIyMgTkIsIHRoZSBoZWxwIHBhZ2Ugd2FybnMgeW91IG5vdCB0byBkbyB0aGlzIG9uZSBleGNlcHQgaW4gcGVybAooeCA8LSBnc3ViKCJcXGIiLCAifCIsICJUaGUgcXVpY2sgYnJvd24gZm94IiwgcGVybCA9IFRSVUUpKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsICJ8VGhlfCB8cXVpY2t8IHxicm93bnwgfGZveHwiKSkKIyMgMi4wLjEgZ2F2ZSB3cm9uZyBhbnN3ZXIKIyMgQW5vdGhlciBib3VuZGFyeSBjYXNlLCBzYW1lIHdhcm5pbmcKIyMgKHggPC0gZ3N1YigiXFxiIiwgInwiLCAiIFRoZSBxdWljayAiKSkKIyMgc3RvcGlmbm90KGlkZW50aWNhbCh4LCAiIHxUaGV8IHxxdWlja3wgIikpCih4IDwtIGdzdWIoIlxcYiIsICJ8IiwgIiBUaGUgcXVpY2sgIiwgcGVybCA9IFRSVUUpKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsICIgfFRoZXwgfHF1aWNrfCAiKSkKIyMgYW5kIHNvbWUgZnJvbSBhIGNvbW1lbnQgaW4gdGhlIEdOVSBzZWQgY29kZQp4IDwtIGdzdWIoImEqIiwgIngiLCAiYmFhYWFjIikKc3RvcGlmbm90KGlkZW50aWNhbCh4LCAieGJ4Y3giKSkKeCA8LSBnc3ViKCJhKiIsICJ4IiwgImJhYWFhYyIsIHBlcmwgPSBUUlVFKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsICJ4YnhjeCIpKQojIyBlYXJsaWVyIHZlcnNpb25zIGdvdCAiYnhjIiBvciAieGJ4eGN4IgooeCA8LSBnc3ViKCJeMTIiLCAieCIsICIxMjEyIikpICMgd2FzICJ4eCIKc3RvcGlmbm90KGlkZW50aWNhbCh4LCAieDEyIikpCih4IDwtIGdzdWIoIl4xMiIsICJ4IiwgIjEyMTIiLCBwZXJsID0gVFJVRSkpICMgd2FzICJ4eCIKc3RvcGlmbm90KGlkZW50aWNhbCh4LCAieDEyIikpCiMjIHZhcmlvdXMgZml4ZXMgaW4gMi4xLjAKCiMjIGxlbmd0aCgwKSAiZGlzdCI6CihkMDEuIDwtIGRpc3QobWF0cml4KDAuLCAwLDEpKSkKIyMgZmFpbGVkIGluIDIuMC4xIGFuZCBlYXJsaWVyCgoKIyMgV2lzaCBvZiBQUiM3Nzc1CnggPC0gbWF0cml4KDAsIG5yb3c9MCwgbmNvbD0yKQpjb2xTdW1zKHgpOyByb3dTdW1zKHgpCnggPC0gbWF0cml4KDAsIG5yb3c9MiwgbmNvbD0wKQpjb2xTdW1zKHgpOyByb3dTdW1zKHgpCiMjIG5vdCBhbGxvd2VkIGluIDIuMC4xCgoKIyMgaW5maW5pdGUgcmVjdXJzaW9uIGluIDIuMC4xIChhbmQgUi1iZXRhIDIwMDUtMDQtMTEpOgpzdW1tYXJ5KGRhdGEuZnJhbWUobWF0ID0gSShtYXRyaXgoMTo4LCAyKSkpKQpzdW1tYXJ5KGRhdGEuZnJhbWUoeCA9IGdsKDIsMiksIEkobWF0cml4KDE6OCwgNCkpKSkKIyMKCgoKIyMjIGZpeGVzIGZvciAyLjEuMSAjIyMKCiMjIFBSIzc3OTI6IHByZWRpY3QuZ2xtIGRyb3BwZWQgbmFtZXMKbm0gPC0gbmFtZXMocHJlZGljdChnbG0oeSB+IHgsIGZhbWlseT1iaW5vbWlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhLmZyYW1lKHk9YygxLCAwLCAxLCAwKSwgeD1jKDEsIDEsIDAsIDApKSksCiAgICAgICAgICAgICAgICAgICAgbmV3ZGF0YT1kYXRhLmZyYW1lKHg9YygwLCAwLjUsIDEpKSwgdHlwZT0icmVzcG9uc2UiKSkKc3RvcGlmbm90KGlkZW50aWNhbChubSwgYXMuY2hhcmFjdGVyKDE6MykpKQojIyBubyBuYW1lcyBpbiAyLjEuMAoKCiMjIFBSIzc4MDg6IGFzLmRhdGEuZnJhbWU6IEVycm9yIGluICJuYW1lczwtLmRlZmF1bHQiCngxIDwtIGFycmF5KDE6OSwgYygzLCAzLCAzKSkKRlVOIDwtIGZ1bmN0aW9uKHgxLCB4MiwgeDMsIHg0KSBjYmluZCh4MVssIDEsIDE6Ml0sIHgxWywgMiwgMToyXSlbLCAxXQphcy5kYXRhLmZyYW1lKEZVTih4MVsxOjMsLF0sIHgyID0gYygiYSIsICJiIiksCiAgICAgICAgICAgICAgICAgIHgzID0gYygiYSIsICJiIiksIHg0ID0gYygiYSIsICJiIikpKQojIyBmYWlsZWQgaW4gMi4xLjAKCgojIyBQUiM3Nzk3IGNpdGF0aW9uKCkgY2hvcHMgIlJvZWxhbmQgIgpzdG9waWZub3QoYXMucGVyc29uTGlzdCgiUm9lbGFuZCBMYXN0bmFtZSIpW1sxXV0kZ2l2ZW5bMV0gPT0gIlJvZWxhbmQiKQojIyB3YXMgZW1wdHkgaW4gMi4xLjAuCgoKIyMgcnVubWVkKCkncyBUdXJsYWNoIGFsZ29yaXRobSBzZWcuZmF1bHRlZCBpbiByYXJlIGNhc2VzOgp0MiA8LSBjKC0yLC03LDUsMiwtMywgMCwxLDMsMiwtMSwyLDEsMiwxLDEsMSwtMiw0LCAxLDEsMSwgMzIpCnJTIDwtIHJ1bm1lZCh0Miwgaz0yMSwgYWxnb3JpdGhtPSAiU3R1ZXR6bGUiKQpyVCA8LSBydW5tZWQodDIsIGs9MjEsIGFsZ29yaXRobT0gIlR1cmxhY2giKQpzdG9waWZub3QoaWRlbnRpY2FsKHJTLCByVCkpCiMjIHNlZy5mYXVsdCBpbiAyLjEuMAoKCiMjIGR1cGxpY2F0ZWQgYW5kIHVuaXF1ZSBvbiBhIGxpc3QKeCA8LSBsaXN0KDEsIDIsIDMsIDIpCmR1cGxpY2F0ZWQoeCkKdW5pcXVlKHgpCiMjIHVuaXF1ZSBmYWlsZWQgaW4gMi4xLjAKCgojIyBwcm9nLmFvdmxpc3Qgb24gZGF0YSB3aXRoIHJvdy5uYW1lcwpOIDwtIGMoMCwxLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwxLDAsMCwxLDAsMSwwLDEsMSwwLDApClAgPC0gYygxLDEsMCwwLDAsMSwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMCwwLDEsMCwxLDEsMCkKSyA8LSBjKDEsMCwwLDEsMCwxLDEsMCwwLDEsMCwxLDAsMSwxLDAsMCwwLDEsMSwxLDAsMSwwKQp5aWVsZCA8LSBjKDQ5LjUsNjIuOCw0Ni44LDU3LjAsNTkuOCw1OC41LDU1LjUsNTYuMCw2Mi44LDU1LjgsNjkuNSwKCSAgIDU1LjAsIDYyLjAsNDguOCw0NS41LDQ0LjIsNTIuMCw1MS41LDQ5LjgsNDguOCw1Ny4yLDU5LjAsNTMuMiw1Ni4wKQpucGsgPC0gZGF0YS5mcmFtZShibG9jaz1nbCg2LDQpLCBOPWZhY3RvcihOKSwgUD1mYWN0b3IoUCksCgkJICBLPWZhY3RvcihLKSwgeWllbGQ9eWllbGQpCnJvdy5uYW1lcyhucGspIDwtIGxldHRlcnNbMjoyNV0KbnBrLmFvdkUgPC0gYW92KHlpZWxkIH4gIE4qUCpLICsgRXJyb3IoYmxvY2spLCBucGspCnByIDwtIHByb2oobnBrLmFvdkUpCiMjIGZhaWxlZCBpbiAyLjEuMAoKCiMjIFBSIzc4OTQ6IFJldmVyc2luZyBheGlzIGluIGEgbG9nIHBsb3QKeCA8LSAxOjMKcGxvdCh4LCBleHAoeCksIGxvZyA9ICJ5IiwgeWxpbSA9IGMoMzAsMSkpCiMjIGdhdmUgZXJyb3IgKGFuZCB3YXJuaW5nKSBpbiAgbG9nIC0gYXhpcygpLCAnYXQnIGNyZWF0aW9uCgojIyMgZW5kIG9mIHRlc3RzIGFkZGVkIGluIDIuMS4wIHBhdGNoZWQgIyMjCgoKCiMjIE11bHRpYnl0ZSBjaGFyYWN0ZXIgc2V0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgaGFkIGJ1ZmZlciBvdmVycnVuCnJlZ2V4cHIoIlthLXpdIiwgTkEpCiMjIGNyYXNoZWQgb24gMi4xLjEgb24gV2luZG93cyBpbiBNQkNTIGJ1aWxkLgoKCiMjIFBSIzgwMzM6IGRlbnNpdHkgd2l0aCAnSW5mJyBpbiB4OgpkIDwtIGRlbnNpdHkoMS8wOjIsIGtlcm4gPSAicmVjdCIsIGJ3PTEsIGZyb209MCwgdG89MSwgbj0yKQpzdG9waWZub3QoYWxsLmVxdWFsKHJlcCgxL3NxcnQoMjcpLCAyKSwgZCR5LCB0b2w9MWUtMTQpKQojIyBmYWlsZWQgaW4gUiAyLjEuMSAoc2luY2UgYWJvdXQgMS45LjApCgpzdG9waWZub3QoYWxsLmVxdWFsKEFyZygtMSksIHBpKSkKIyMgZmFpbGVkIGluIFIgPD0gMi4xLjEKCgojIyBQUiM3OTczOiByZXZlcnNlZCBsb2ctc2NhbGVkIGF4aXMKcGxvdCgxOjEwMCwgbG9nPSJ5IiwgeWxpbT1jKDEwMCwxMCkpCnN0b3BpZm5vdChheFRpY2tzKDIpID09IDEwKmMoMTAsNSwyLDEpKQojIyBlbXB0eSA8IDIuMi4wCgoKIyMgcm91bmRpbmcgZXJyb3JzIGluIHdpbmRvdy5kZWZhdWx0IChyZXBvcnRlZCBieSBTdGVmYW5vIElhY3VzKQp4IDwtIHRzKHJub3JtKDUwMDAxKSwgc3RhcnQ9MCwgZGVsdGF0PTAuMSkKbGVuZ3RoKHdpbmRvdyh4LCBkZWx0YXQ9MC40KSkKbGVuZ3RoKHdpbmRvdyh4LCBkZWx0YXQ9MSkpCmxlbmd0aCh3aW5kb3coeCwgZGVsdGF0PTQuOSkpCmxlbmd0aCh3aW5kb3coeCwgZGVsdGF0PTUpKQojIyBsYXN0IGZhaWxlZCBpbiAyLjEuMQoKCiMjIGluY29ycmVjdCBzb3J0IGluIG9yZGVyIHdpdGggbmEubGFzdCAhPSBOQQp4IDwtIGMoIjUiLCI2IixOQSwiNCIsTkEpCnkgPC0geFtvcmRlcih4LG5hLmxhc3Q9RkFMU0UpXQpzdG9waWZub3QoaWRlbnRpY2FsKHksIGMoTkEsIE5BLCAiNCIsICI1IiwgIjYiKSkpCiMjIDIuMS4xIHNvcnRlZCAiNCIgZmlyc3Q6IHRoZSBmZW5jZSB3YXMgd3JvbmcuCgoKIyMgaW50ZWdlciBvdmVyZmxvdyBpbiBjb3IudGVzdCAoUFIjODA4NykKbiA8LSA0NjM0MQooeiA8LSBjb3IudGVzdChydW5pZihuKSwgcnVuaWYobiksIG1ldGhvZCA9ICJzcGVhcm1hbiIpKQpzdG9waWZub3QoIWlzLm5hKHokcC52YWx1ZSkpCiMjCgojIyBzZWVrIG9uIGEgZmlsZSBtZXNzZWQgdXAgaW4gV2luZG93cyAoUFIjNzg5NikKdGYgPC0gdGVtcGZpbGUoKQpmIDwtIGZpbGUodGYsICJ3K2IiKQp3cml0ZUNoYXIoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgZiwgZW9zPU5VTEwpCnNlZWsoZiwgMCwgImVuZCIsIHJ3PSJyIikKc3RvcGlmbm90KHNlZWsoZiwgTkEsIHJ3PSJyIikgPT0gMjYpICMgTWluR1cgbWVzc2VkIHVwIHNlZWsgdG8gZW5kIG9mIGZpbGUgdGhhdCB3YXMgb3BlbiBmb3Igd3JpdGluZwpjbG9zZShmKQpmIDwtIGZpbGUodGYsICJyYiIpCnNlZWsoZiwgMTIpCnN0b3BpZm5vdChyZWFkQ2hhcihmLCAxKSA9PSAibSIpICAjIEZpcnN0IHBhdGNoIG1lc3NlZCB1cCBvbiByZWFkLW9ubHkgZmlsZXMKY2xvc2UoZikKdW5saW5rKHRmKQojIwoKIyMjIGVuZCBvZiB0ZXN0cyBhZGRlZCBpbiAyLjEuMSBwYXRjaGVkICMjIwoKCgojIyB0ZXN0cyBvZiBoZXhhZGVjaW1hbCBjb25zdGFudHMKeCA8LSAweEFiYwpzdG9waWZub3QoeCA9PSAyNzQ4KQp4eCA8LSBhcy5pbnRlZ2VyKCIweEFiYyIpCnN0b3BpZm5vdCh4ID09IHh4KQp4eCA8LSBhcy5udW1lcmljKCIweEFiYyIpCnN0b3BpZm5vdCh4ID09IHh4KQpzdG9waWZub3QoYXMuaW50ZWdlcigiMTMuNyIpID09IDEzKQojIyBuZXcgaW4gMi4yLjAKCgojIyBzYXZlKCkgb2YgcmF3IHZlY3RvciB3YXMgaW5jb3JyZWN0IG9uIGJpZy1lbmRpYW4gc3lzdGVtCih5IDwtIHggPC0gY2hhclRvUmF3KCIxMjM0NSIpKQpzYXZlKHgsIGZpbGU9InguUmRhIikKcm0oeCkKbG9hZCgieC5SZGEiKQp4CnN0b3BpZm5vdChpZGVudGljYWwoeCwgeSkpCnVubGluaygieC5SZGEiKQojIyAwMCAwMCAwMCAwMCAwMCBpbiAyLjEuMCBvbiBPUyBYIChub3cgbWFjT1MpCiMjIGZpeGVkIGZvciAyLjEuMSwgYnV0IHRlc3QgYWRkZWQgb25seSBpbiAyLjIueAoKCiMjIFBSIzc5MjI6ICBDb3VsZCBub3QgdXNlIGV4cHJlc3Npb24oKSBhcyBhbiBpbml0aWFsIGV4cHJlc3Npb24gdmFsdWUKc2V0Q2xhc3MoInRlc3QyIiwgcmVwcmVzZW50YXRpb24oYmFyID0gImV4cHJlc3Npb24iKSkKbmV3KCJ0ZXN0MiIsIGJhciA9IGV4cHJlc3Npb24oKSkKIyMgZmFpbGVkCgoKIyMgT3BzLmRhdGEuZnJhbWUgaGFkIHRoZSBkZWZhdWx0IGNoZWNrLm5hbWVzPVRSVUUKREYgPC0gZGF0YS5mcmFtZSgiMTAwIj0xOjIsICIyMDAiPTM6NCwgY2hlY2submFtZXM9RkFMU0UpCkRGL0RGCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoREYpLCBuYW1lcyhERi9ERikpKQojIyBERi9ERiBuYW1lcyBoYWQgWCBwcmVwZW5kZWQgPCAyLjIuMAoKCiMjIHN1bShUKSB3YXMgZG91YmxlCnggPC0gMToxMApzdG9waWZub3QodHlwZW9mKHN1bSh4KSkgPT0gImludGVnZXIiKQp4IDwtIGMoVFJVRSwgRkFMU0UpCnN0b3BpZm5vdCh0eXBlb2Yoc3VtKHgpKSA9PSAiaW50ZWdlciIpCiMjIGRvdWJsZSA8IDIuMi4wCgoKIyMgT3ZlcmZsb3cgaW4gUHJpbnRHZW5lcmljVmVjdG9yCnggPC0gcGFzdGUoMTo1MDAwLCBjb2xsYXBzZT0iKyIpCmFzLm1hdHJpeChsaXN0KGE9MToyLCBiPTI6MywgYz14KSkKIyMgc2VnZmF1bHQgaW4gMi4xLjEsIHNpbGVudCB0cnVuY2F0aW9uIGluIDIuMS4xIHBhdGNoZWQKCgojIyB3ZWlnaHRlZC5yZXNpZHVhbHMgZm9yIGdsbSBmaXRzIChQUiM3OTYxKQpzZXQuc2VlZCgxKQp4IDwtIHJ1bmlmKDEwKQp5IDwtIHggKyBybm9ybSgxMCkKdyA8LSAwOjkKcjEgPC0gd2VpZ2h0ZWQucmVzaWR1YWxzKGxtKHkgfiB4LCB3ZWlnaHRzID0gdykpCnIyIDwtIHdlaWdodGVkLnJlc2lkdWFscyhnbG0oeSB+IHgsIHdlaWdodHMgPSB3KSkKc3RvcGlmbm90KGFsbC5lcXVhbChyMSwgcjIpKQojIyBkaWZmZXJlbnQgaW4gMi4xLjEKCgojIyBlcnJvcnMgaW4gYWRkMS57bG0sZ2xtfSB3aGVuIGFkZGluZyB2YXJzIHdpdGggbWlzc2luZyB2YWx1ZXMoUFIjODA0OSkKc2V0LnNlZWQoMikKeSA8LSBybm9ybSgxMCkKeCA8LSAxOjEwCmlzLm5hKHhbOV0pIDwtIFRSVUUKCmxtMCA8LSBsbSh5IH4gMSkKbG0xIDwtIGxtKHkgfiAxLCB3ZWlnaHRzID0gcmVwKDEsIDEwKSkKCmFkZDEobG0wLCBzY29wZSA9IH4geCkKYWRkMShsbTEsIHNjb3BlID0gfiB4KSAgIyMgZXJyb3IgaW4gMi4xLjEKCmdsbTAgPC0gZ2xtKHkgfiAxKQpnbG0xIDwtIGdsbSh5IH4gMSwgd2VpZ2h0cyA9IHJlcCgxLCAxMCkpCmdsbTIgPC0gZ2xtKHkgfiAxLCBvZmZzZXQgPSByZXAoMCwgMTApKQoKYWRkMShnbG0wLCBzY29wZSA9IH4geCkgICMjIGVycm9yIGluIDIuMS4xCmFkZDEoZ2xtMSwgc2NvcGUgPSB+IHgpICAjIyBlcnJvciBpbiAyLjEuMQphZGQxKGdsbTIsIHNjb3BlID0gfiB4KSAgIyMgZXJyb3IgaW4gMi4xLjEKIyMKCgojIyBsZXZlbHM8LS5mYWN0b3IgZHJvcHBlZCBvdGhlciBhdHRyaWJ1dGVzLgojIyBIZWlueiBUdWVjaGxlciwgUi1oZWxwLCAyMDA1LTA3LTE4CmYxIDwtIGZhY3RvcihjKCJsZXZlbCBjIiwgImxldmVsIGIiLCAibGV2ZWwgYSIsICJsZXZlbCBjIiksIG9yZGVyZWQ9VFJVRSkKYXR0cihmMSwgInRlc3RhdHRyaWJ1dGUiKSA8LSAidGVzdHN0cmluZyIKKG9sZCA8LSBhdHRyaWJ1dGVzKGYxKSkKbGV2ZWxzKGYxKSA8LSBjKCJMLUEiLCAiTC1CIiwgIkwtQyIpCmYxCihuZXcgPC0gYXR0cmlidXRlcyhmMSkpCm5ldyRsZXZlbHMgPC0gb2xkJGxldmVscyA8LSBOVUxMCnN0b3BpZm5vdChpZGVudGljYWwob2xkLCBuZXcpKQpmMiA8LSBmYWN0b3IobGV0dGVyc1sxOjRdKQpsZXZlbHMoZjIpIDwtIGFzLmNoYXJhY3RlcihjKDE6MywgTkEpKQpmMgpzdG9waWZub3QobmxldmVscyhmMikgPT0gMykKIyMgZHJvcHBlZCBvdGhlciBhdHRyaWJ1dGVzIDwgMi4yLjAuCgoKIyMgcmVncmVzc2VkIGF0IG9uZSBwb2ludCBpbiBwcmUtMi4yLjAKQSA8LSBtYXRyaXgocGksIDAsIDIpCnN0b3BpZm5vdChpZGVudGljYWwoZGltKEEpLCBkaW0oZm9ybWF0KEEpKSkpCiMjIGRyb3BwZWQgZGltIGF0IG9uZSBwb2ludAoKCiMjIGxzLmRpYWcgd2l0aCBtaXNzaW5nIHZhbHVlcyAoUFIjODEzOSkKeCA8LSBtYXRyaXgoYygxLC0xLDEsLTEsMSwtMSwxLC0xLDEsLTEsICAxLDIsMyw0LDUsNiw3LDgsOSwxMCksIDEwLCAyKQp5IDwtIGFzLm1hdHJpeChjKDEsMiwzLE5BLDMsNCwzLDQsNSw0KSkKd3QgPC0gYygxLDEsMSwxLDEsMSwxLDEsMSwwKQpyZWdyZXMgPC0gbHNmaXQoeCwgeSwgd3Q9d3QpCnJlZ2RpYWcgPC0gbHMuZGlhZyhyZWdyZXMpCiMjIGZhaWxlZCA8IDIuMi4wLgoKCiMjIHdpbmRvdy5kZWZhdWx0IGhhZCBhbiBpbmFwcHJvcHJpYXRlIHRvbGVyYW5jZQphIDwtIHRzKDE6NTAwMCwgc3RhcnQgPSAwLCBmcmVxID0gMTApCmIgPC0gbGFnKGEsIDEpCmJiIDwtIHdpbmRvdyhiLCBzdGFydCA9IDApCnN0b3BpZm5vdChsZW5ndGgoYmIpID09IGxlbmd0aChhKSAtIDEpCiMjIHdhcyBsZW5ndGgoYSkgLSAyIGluIDIuMS4xLCBzaW5jZSB0aGUgdG9sZXJhbmNlIHdhcyBhYnMoc3RhcnQpICogdHMuZW5kCgoKIyMgc3ViYXNzaWdubWVudCBvZiBsZW5ndGggemVybyB2ZWN0b3IgdG8gTlVMTCBnYXZlIGdhcmJhZ2UgYW5zd2VyIChQUiM4MTU3KQp4IDwtIE5VTEwKeFtbMV1dIDwtIG51bWVyaWMoMCkKc3RvcGlmbm90KGxlbmd0aCh4W1sxXV0pID09IDApCiMjIGZhaWxlZCA8IDIuMi4wCgoKIyMgc29tZSBjaGVja3MgZm9yIHJhdyBpbiBkYXRhIGZyYW1lcyBhbmQgbGlzdHMKeCA8LSBjaGFyVG9SYXcoInRlc3QiKQooeiA8LSBkYXRhLmZyYW1lKHgpKQp6JHkgPC0geAp6W1sieTIiXV0gPC0geAp6WyJ5MyJdIDwtIHgKegojIyBsaXN0cyB1c2Ugc2VwYXJhdGUgY29kZQp6IDwtIGxpc3QoeD14KQp6JHkgPC0geAp6W1sieTIiXV0gPC0geAp6WyJ5MyJdIDwtIGxpc3QoeCkKegojIyBOb3QgY29tcGxldGVseSBzdXBwb3J0ZWQgcHJpb3IgdG8gMi4yLjAKCgojIyMgZW5kIG9mIHRlc3RzIGFkZGVkIGluIDIuMi4wICMjIwoKCiMjIHN1bW1hcnkubWF0cml4IGZhaWxlZCBvbiBzb21lIGNsYXNzZWQgb2JqZWN0cwpzdXJ2IDwtIHN0cnVjdHVyZShjKDIuMDYsIDIuMTMsIDAuMDksIDAuMjcsIDEsIDAuMzYsIDMuMDQsIDAuNjcsIDAuMzUsCiAgICAgICAgICAgICAgICAgICAgMC4yNCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCksCiAgICAgICAgICAgICAgICAgIC5EaW0gPSBjKDEwTCwgMkwpLAogICAgICAgICAgICAgICAgICAuRGltbmFtZXMgPSBsaXN0KE5VTEwsIGMoInRpbWUiLCAic3RhdHVzIikpLAogICAgICAgICAgICAgICAgICB0eXBlID0gInJpZ2h0IiwgY2xhc3MgPSAiU3VydiIpCnN1bW1hcnkoc3VydikKIyMgSGFkIGluZmluaXRlIHJlY3Vyc2lvbiAoc29tZXRpbWVzIHNlZ2ZhdWx0KSBvbiAyLjIuMC4KCiMjIG5lZWQgZnV6eiBldmVuIGZvciAiPj0iIDoKc2V0LnNlZWQoMSkKc3RvcGlmbm90KGFsbC5lcXVhbChjaGlzcS50ZXN0KGNiaW5kKDE6MCwgYyg3LDE2KSksIHNpbXVsYXRlLnAgPSBUUlVFKSRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgIDAuMzM2ODMxNTg0MiwgdG9sID0gMWUtNikpCiMjIHNvbWUgaTY4NiBwbGF0Zm9ybXMgZ2F2ZSAwLjAwMDQ5OTc1CgoKIyMgUFIjODIyOCBpbWFnZSgpIGZhaWxlZCBvbiBhIG1hdHJpeCB3aXRoIGFsbCBOQXMKaW1hZ2Uoej1tYXRyaXgoTkEsIDEsIDEpLCB4PTA6MSwgeT0wOjEpCgoKIyMgcmVhZC5md2YoaGVhZGVyPVRSVUUpIGZhaWxlZCAoUFIjODIyNikKZmYgPC0gdGVtcGZpbGUoKQpjYXQoZmlsZT1mZiwgIkFcdEJcdEMiLCAiMTIzNDU2IiwgIjk4NzY1NCIsIHNlcD0iXG4iKQp6IDwtIHJlYWQuZndmKGZmLCB3aWR0aD1jKDEsMiwzKSwgaGVhZGVyPVRSVUUpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeiksIExFVFRFUlNbMTozXSkpCnVubGluayhmZikKIyMgZmFpbGVkIGluIDw9IDIuMi4wCgojIyBkaWFnKCkgZmFpbGVkIGlmIG1hdHJpeCBoYWQgTkEgZGltbmFtZXMKeCA8LSBtYXRyaXgoMSwgMiwgMikKZGltbmFtZXMoeCkgPC0gbGlzdChjKCJhIiwgTkEpLCBjKCJhIiwgTkEpKQpkaWFnKHgpCgoKIyMgY29sbmFtZXMgaW4gcGl2b3RlZCBkZWNvbXBvc2l0aW9ucyAoUFIjODI1OCkKQSA8LSAxOjEwClggPC0gY2JpbmQoQSxCPUFeMiwgQz1BXjItQSwgRD0xKQpxclggPC0gcXIoWCkKb28gPC0gb3JkZXIocXJYJHBpdm90KQpRIDwtIHFyLlEocXJYKQpSIDwtIHFyLlIocXJYKQooeiA8LSAoUSUqJVIpWyxvb10pCnN0b3BpZm5vdChpZGVudGljYWwoY29sbmFtZXMoWCksIGNvbG5hbWVzKHopKSkKCnFyWCA8LSBxcihYLCBMQVBBQ0s9VFJVRSkKb28gPC0gb3JkZXIocXJYJHBpdm90KQpRIDwtIHFyLlEocXJYKQpSIDwtIHFyLlIocXJYKQooeiA8LSAoUSUqJVIpWyxvb10pCnN0b3BpZm5vdChpZGVudGljYWwoY29sbmFtZXMoWCksIGNvbG5hbWVzKHopKSkKClkgPC0gY3Jvc3Nwcm9kKFgpClUgPC0gY2hvbChZLCBwaXZvdD1UUlVFKQpvbyA8LSBvcmRlcihhdHRyKFUsICJwaXZvdCIpKQooeiA8LSB0KFVbLG9vXSklKiUgVVssb29dKQpzdG9waWZub3QoaWRlbnRpY2FsKGNvbG5hbWVzKFgpLCBjb2xuYW1lcyh6KSkpCiMjIHVucGl2b3RlZCBjb2xuYW1lcyBpbiBSIDw9IDIuMi4wCgoKIyMgSW0oLTEpIChQUiM4MjcyKQpzdG9waWZub3QoYWxsLmVxdWFsKEltKGMoMSwgMCwgLTEpKSwgcmVwKDAsIDMpKSkKIyMgUiA8PSAyLjIuMCBoYWQgSW0gYW5kIEFyZyB0aGUgc2FtZSBmb3Igbm9uLWNvbXBsZXggbnVtYmVycwoKCiMjIHJvdW5kaW5nIGVycm9ycyBpbiBhZ2dyZWdhdGUudHMKYWdncmVnYXRlKGFzLnRzKGMoMSwyLDMsNCw1LDYsNyw4LDksMTApKSwxLzUsbWVhbikKIyMgZmFpbGVkIGluIDIuMi4wCgoKIyMgcHJjb21wKHRvbD0xZS02KQpzZXQuc2VlZCgxNikKeCA8LSBtYXRyaXgocnVuaWYoMzApLG5jb2w9MTApCnMgPC0gcHJjb21wKHgsIHRvbD0xZS02KQpzdG9waWZub3QobGVuZ3RoKHMkc2RldikgPT0gMywgbmNvbChzJHJvdGF0aW9uKSA9PSAyKQpzdW1tYXJ5KHMpCiMjIGxhc3QgZmFpbGVkIGluIDIuMi4wCgoKIyMgbWFwcGx5IGRpZCBub3QgdGVzdCB0eXBlIG9mIE1vcmVBcmdzCnRyeShtYXBwbHkocmVwLHRpbWVzPTE6NCwgTW9yZUFyZ3M9NDIpKQojIyBzZWdmYXVsdGVkIGluIDIuMi4wCgoKIyMgcWJpbm9tIGhhZCBpbmNvcnJlY3QgdGVzdCBmb3IgcCB3aXRoIGxvZz1UUlVFCih6IDwtIHFiaW5vbSgtSW5mLCAxLCAwLjUsIGxvZy5wID0gVFJVRSkpCnN0b3BpZm5vdChpcy5maW5pdGUoeikpCiMjIHdhcyBOYU4gaW4gMi4yLjAKCgojIyB0KC4pIHdpdGggTlVMTCBkaW1uYW1lcwp4IDwtIGRpYWcoMikKZGltbmFtZXMoeCkgPC0gbGlzdChOVUxMLCBOVUxMKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsIHQoeCkpLAogICAgICAgICAgaWRlbnRpY2FsKGRpbW5hbWVzKHgpLCBkaW1uYW1lcyh0KGFycmF5KDMsIDEsIGRpbW5hbWVzPWxpc3QoTlVMTCkpKSkpKSMjIGRyb3BwZWQgdGhlIGxlbmd0aC0yIGxpc3QgdGlsbCAyLjIuMAoKCiMjIGluZmluaXRlIGluZmx1ZW5jZSBtZWFzdXJlcyAoUFIjODM2NykKZGF0YShvY2N1cGF0aW9uYWxTdGF0dXMpCkRpYWcgPC0gYXMuZmFjdG9yKGRpYWcoMTo4KSkKUnNjb3JlIDwtIHNjYWxlKGFzLm51bWVyaWMocm93KG9jY3VwYXRpb25hbFN0YXR1cykpLCBzY2FsZSA9IEZBTFNFKQpDc2NvcmUgPC0gc2NhbGUoYXMubnVtZXJpYyhjb2wob2NjdXBhdGlvbmFsU3RhdHVzKSksIHNjYWxlID0gRkFMU0UpClVuaWZvcm0gPC0gZ2xtKEZyZXEgfiBvcmlnaW4gKyBkZXN0aW5hdGlvbiArIERpYWcgKyBSc2NvcmU6Q3Njb3JlLAoJICAgICAgIGZhbWlseSA9IHBvaXNzb24sIGRhdGEgPSBvY2N1cGF0aW9uYWxTdGF0dXMpCkluZCA8LSBhcy5sb2dpY2FsKGRpYWcoOCkpCnJlc2lkdWFscyhVbmlmb3JtKVtJbmRdICN6ZXJvL25lYXItemVybwpzdG9waWZub3QoaXMubmFuKHJzdGFuZGFyZChVbmlmb3JtKVtJbmRdKSwKICAgICAgICAgIGlzLm5hbihyc3R1ZGVudCAoVW5pZm9ybSlbSW5kXSksCiAgICAgICAgICBpcy5uYW4oZGZmaXRzICAgKFVuaWZvcm0pW0luZF0pLAogICAgICAgICAgaXMubmFuKGNvdnJhdGlvIChVbmlmb3JtKVtJbmRdKSwKICAgICAgICAgIGlzLm5hbihjb29rcy5kaXN0YW5jZShVbmlmb3JtKVtJbmRdKSkKIyMgaGFkIGluZmluaXRpZXMgaW4gMi4yLjAgb24gc29tZSBwbGF0Zm9ybXMKIyMgcGxvdC5sbSgpIG9uIDxnbG0+IG9iamVjdHM6CnBsb3QoVW5pZm9ybSkgIyBsYXN0IHBsb3QgZ2l2ZXMgd2FybmluZyBvbiBoX2lpIH49IDEKcGxvdChVbmlmb3JtLCA2KSAjIGFkZGVkIDIwMDYtMDEtMTAKcGxvdChVbmlmb3JtLCA1OjYpIyBmYWlsZWQgZm9yIGEgZmV3IGRheXMgMjAwOC0wNQpwbG90KFVuaWZvcm0sIDE6MiwgY2FwdGlvbiA9ICIiKSMgZGl0dG8KIyMKCgojIyMgZW5kIG9mIHRlc3RzIGFkZGVkIGluIDIuMi4xICMjIwoKIyMgc3ViKGZpeGVkPVRSVUUpLCByZXBvcnRlZCBieSBSb2dlciBQZW5nIDIwMDUtMTItMjEKeCA8LSAwOjEwCnYgPC0gcGFzdGUoeCwgImFzZGYiLCBzZXA9Ii4iKQooeHggPC0gc3ViKCIuYXNkZiIsICIiLCB2LCBmaXhlZCA9IFRSVUUpKQpzdG9waWZub3QobmNoYXIoeHgpID09IG5jaGFyKHgpLCB4eCA9PSB4KQojIyBoYWQgcmFuZG9tIHRyYWlsaW5nIGJ5dGVzIGZyb20gc2Vjb25kIGVsZW1lbnQgb24gaW4gMi4yLjEuCiMjIGlkZW50aWNhbCByZXBvcnRlZCB0cnVlLCBmaXhlZCBpbiAyLjMuMC4KCgojIyByYmluZCBvbiBkYXRhIGZyYW1lcyB3aXRoIDAgcm93cyAoUFIjODUwNikKZm9vIDwtIGRhdGEuZnJhbWUoeCA9IDE6MTAsIHkgPSBybm9ybSgxMCkpCmJhcjEgPC0gcmJpbmQuZGF0YS5mcmFtZShmb29bMTo1LF0sIGZvb1tudW1lcmljKDApLF0pCnN0b3BpZm5vdChkaW0oYmFyMSkgPT0gYyg1LDIpKQpiYXIyIDwtIHJiaW5kLmRhdGEuZnJhbWUoYSA9IGZvb1sxOjUsXSwgYiA9IGZvb1tudW1lcmljKDApLF0pCnN0b3BpZm5vdChkaW0oYmFyMikgPT0gYyg1LDIpKQojIyBMYXN0IGhhZCA2IHJvd3MgaW4gMi4yLjEsIGFuZCB3YXMgYSBjb3JydXB0IGRhdGEgZnJhbWUKCiMjIGVudmlyb25tZW50cyBhcmUgcmVjdXJzaXZlIGJ1dCBjYW5ub3QgYmUgaW5kZXhlZCAtIGFsbC5lcXVhbC5kZWZhdWx0KCkKZCA8LSBkYXRhLmZyYW1lKGs9MTo3LCBuPTI6OCwgeD0wOjYpCnIgPC0gZ2xtKGNiaW5kKGssIG4taykgfiB4LCBmYW1pbHk9Ymlub21pYWwsIGRhdGE9ZCkKc3RvcGlmbm90KGFsbC5lcXVhbChyLHIpKQojIyBmYWlsZWQgaW4gMi4yLjEKCiMjIyBlbmQgb2YgdGVzdHMgYWRkZWQgaW4gMi4yLjEgcGF0Y2hlZCAjIyMKCgojIyBzb3J0IHVzZWQgdG8gcHJlc2VydmUgaW5hcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBub3QgYWx3YXlzIHNvcnQgbmFtZXMuCnggPC0gcnVuaWYoMTApCnRzcCh4KSA8LSBjKDEsMTAsMSkKKHogPC0gc29ydCh4KSkgICAgICAgICAgICAgICAgICMga2VwdCB0c3AgYXR0cmlidXRlCnN0b3BpZm5vdChpcy5udWxsKGF0dHJpYnV0ZXMoeikpKQooeiA8LSBzb3J0KHgsIG1ldGhvZD0icXVpY2siKSkgIyBzYW1lCnN0b3BpZm5vdChpcy5udWxsKGF0dHJpYnV0ZXMoeikpKQooeiA8LSBzb3J0KHgsIHBhcnRpYWwgPSAxOjEwKSkgIyBzYW1lCnN0b3BpZm5vdChpcy5udWxsKGF0dHJpYnV0ZXMoeikpKQoKbmFtZXMoeCkgPC0gbGV0dGVyc1sxOjEwXQpvIDwtIHNvcnQubGlzdCh4KQp6MiA8LSBzdHJ1Y3R1cmUoYyh4KVtvXSwgbmFtZXM9bmFtZXMoeClbb10pCih6IDwtIHNvcnQoeCkpICAgICAgICAgICAgICAgICAjIHNvcnRlZCBuYW1lcywgZHJvcHBlZCB0aGUgdHNwIGF0dHJpYnV0ZQpzdG9waWZub3QoaWRlbnRpY2FsKHosIHoyKSkKKHogPC0gc29ydCh4LCBtZXRob2Q9InF1aWNrIikpICMgc29ydGVkIG5hbWVzLCBrZXB0IHRoZSB0c3AgYXR0cmlidXRlLgpzdG9waWZub3QoaWRlbnRpY2FsKHosIHoyKSkKKHogPC0gc29ydCh4LCBwYXJ0aWFsID0gMToxMCkpICMgZGlkIG5vdCBzb3J0IG5hbWVzLCBrZXB0IHRzcCBhdHRyaWJ1dGUKc3RvcGlmbm90KGlzLm51bGwoYXR0cmlidXRlcyh6KSkpCiMjIGZpeGVkIGZvciAyLjMuMCB0byBzb3J0IG5hbWVzIChleGNlcHQgcGFydGlhbCksIGRyb3AgYWxsIG90aGVyIGF0dHJpYnV0ZXMuCgoKIyMgZm9ybWF0QyBvbiBhcy5zaW5nbGUgKFBSIzgyMTEpCiMgbm90IGRvY3VtZW50ZWQgdG8gd29yayBidXQgc29tZW9uZSB0cmllZCBpdC4KKHogPC0gZm9ybWF0Qyhhcy5zaW5nbGUoMSkpKQpzdG9waWZub3QoaWRlbnRpY2FsKHosICIxIikpCiMjIHdhcyB3cm9uZyA8IDIuMy4wCgoKIyMgb3V0ZXIgb24gZmFjdG9ycyB3YXMgYnJva2VuIGluIHByZS0yLjMuMAp4IDwtIGZhY3RvcigxOjMpCm91dGVyKHgsIHgsICIhPSIpCiMjIGZhaWxlZCAyMDA1LTEwLTE3CgoKIyMgYWRkIHRlc3RzIGZvciA8IDAgc2hhcGUgaW4gW2RwcXJdZ2FtbWEKZGdhbW1hKDEsIC0yKQpwZ2FtbWEoMSwgLTIpCnFnYW1tYSgwLjk1LCAtMikKcmdhbW1hKDMsIC0yMCkKIyMgYWxsIGVycm9ycyA8IDIuMS4xLCBub3cgTmFOcwoKCiMjIE1ha2Ugc3VyZSByZWZlcmVuY2UgdG8gbG9jYWwgZW52aXJvbm1lbnQgaXMgc2VyaWFsaXplZApmIDwtIGZ1bmN0aW9uKCkgeyBmdW5jdGlvbigpe30gfQpzZXJpYWxpemUoZigpLCBOVUxMKQojIwoKCiMjIGR1bW15X3ZmcHJpbnRmIHdpdGggb3ZlcmxvbmcgZm9ybWF0Cnh4IDwtIHBhc3RlKHJlcCgiYSIsIDEwMDAwKSwgY29sbGFwc2U9IisiKQpjb24gPC0gZ3pmaWxlKCJ0ZXN0Lmd6IiwgInciKQp3cml0ZUxpbmVzKHh4LCBjb24pCmNsb3NlKGNvbikKdW5saW5rKCJ0ZXN0Lmd6IikKIyMgc2VnZmF1bHRlZCBpbiAyLjIuMCBvbiBzb21lIHg4Nl82NCBzeXN0ZW1zLgoKCiMjIGZvcm1hdCgpIHdpdGggKi5tYXJrczoKeCA8LSAxLjIzNDUgKyAxMF4oMDo1KQpmZiA8LSBmb3JtYXQoeCwgd2lkdGggPSAxMSwgYmlnLm1hcmsgPSAiJyIpCnN0b3BpZm5vdChuY2hhcihmZikgPT0gMTIpCiMjIHNtYWxsIG1hcmtzIHRlc3QKZjIgPC0gZm9ybWF0KHgsIGJpZy5tYXJrID0gIiciLCBzbWFsbC5tYXJrPSJfIiwgc21hbGwuaW50ZXJ2YWwgPSAyKQpuYyA8LSBuY2hhcihmMikKc3RvcGlmbm90KHN1YnN0cmluZyhmMiwgbmMsbmMpICE9ICJfIiwgIyBubyB0cmFsaW5nIHNtYWxsIG1hcmsKICAgICAgICAgIG5jID09IG5jWzFdKSMgYWxsIHRoZSBzYW1lCmZjIDwtIGZvcm1hdEMoMS4yMzQgKyAxMF4oMDo4KSwgZm9ybWF0PSJmZyIsIHdpZHRoPTExLCBiaWcubWFyayA9ICInIikKc3RvcGlmbm90KG5jaGFyKGZjKSA9PSAxMSkKIyMgaGFkIG5vbi1hZGp1c3RlZCBzdHJpbmdzIGJlZm9yZSAyLjMuMAoKCiMjIGRhdGEubWF0cml4IG9uIHplcm8tbGVuZ3RoIGNvbHVtbnMKREYgPC0gZGF0YS5mcmFtZSh4PWMoImEiLCAiYiIpLCB5PTI6MylbRkFMU0UsXQpzdG9waWZub3QoaXMubnVtZXJpYyhkYXRhLm1hdHJpeChERikpKQojIHdhcyBsb2dpY2FsIGluIDIuMi4xLgpERiA8LSBkYXRhLmZyYW1lKGE9SShjaGFyYWN0ZXIoMCkpKQpYIDwtIGRhdGEubWF0cml4KERGKQpzdG9waWZub3QoaXMubnVtZXJpYyhYKSkKIyMgZ2F2ZSBsb2dpY2FsIG1hdHJpeCBpbiAyLjIuMS4KCnN0b3BpZm5vdChwYmlydGhkYXkoOTUwLCBjb2luY2lkZW50PTI1MCkgPT0gMCwKICAgICAgICAgIHBiaXJ0aGRheSg5NTAsIGNvaW5jaWRlbnQ9MjAwKSA+IDApCiMjIGdhdmUgZXJyb3IgYmVmb3JlIDIuMy4wCgoKIyMgcmF3IG1hdHJpY2VzIChQUiM4NTI5LzMwKQp2IDwtIGFzLnJhdyhjKDE6NikpCmRpbSh2KSA8LSBjKDIsMykKZGltbmFtZXModikgPC0gbGlzdChjKCJ4IiwieSIpLCBjKCJQIiwgIlEiLCAiUiIpKQp2CnMgPC0gYXMucmF3KGMoMTE6MTYpKQpkaW0ocykgPC0gYygyLDMpCnMKcmJpbmQocyx2LHYpCihtIDwtIGNiaW5kKHMsdix2LHMpKQptWzIsNF0gPC0gYXMucmF3KDI1NCkKbQptWzE6MiwyOjRdIDwtIHMKbQojIyB1bmltcGxlbWVudGVkIGJlZm9yZSAyLjMuMAoKCiMjIHdpbmRvdyB3aXRoIG5vbi1vdmVybGFwcGluZyByYW5nZXMgKFBSIzg1NDUpCnRlc3QgPC0gdHMoMToxNDQsIHN0YXJ0PWMoMSwxKSwgZnJlcXVlbmN5PTEyKQp3aW5kb3codGVzdCwgc3RhcnQ9YygxNSwxKSwgZW5kPWMoMTcsMSksIGV4dGVuZD1UUlVFKQojIyBmYWlsZWQgPCAyLjMuMAoKCiMjIHBiaW5vbShzaXplPTApIGdhdmUgTmFOIChQUiM4NTYwKQp4IDwtIGMoLTEsMCwxLDIpCnN0b3BpZm5vdChpZGVudGljYWwocGJpbm9tKHgsIHNpemUgPSAwLCBwID0gMC41KSwgYygwLDEsMSwxKSkpCiMjIDIuMi4xIGdhdmUgTmFOIGluIGFsbCBjYXNlcyAoZm9yY2VkIGV4cGxpY2l0bHkgaW4gQyBjb2RlKS4KCgojIyBMaW1pdHMgb24gW2RwcXJdbmJpbm9tIGFuZCBbZHFwcl1nZW9tCnN0b3BpZm5vdChpcy5uYW4oZG5iaW5vbSgwLCAxLCAwKSksIGRuYmlub20oMCwgMSwgMSkgPT0gMSwKICAgICAgICAgIHBuYmlub20oYygtMSwgMCwgMSksIDEsIDEpID09IGMoMCwgMSwgMSksCiAgICAgICAgICBpcy5uYW4ocG5iaW5vbSgwLCAxLCAwKSksCiAgICAgICAgICBxbmJpbm9tKDAuNSwgMSwgMSkgPT0gMCwKICAgICAgICAgIGlzLm5hbihxbmJpbm9tKDAuNSwgMSwgMCkpLAogICAgICAgICAgaXMuZmluaXRlKHJuYmlub20oMSwgMSwgMSkpLAogICAgICAgICAgIWlzLmZpbml0ZShybmJpbm9tKDEsIDEsIDApKSkKIyMgZCBhbGxvd2VkIHA9MCwgW3BxXSBkaXNhbGxvd2VkIHA9MSBmb3IgUiA8IDIuMy4wLCByIGdhdmUgTmFOIGZvciBwPTEuCnN0b3BpZm5vdChpcy5uYW4oZGdlb20oMCwgMCkpLCBkZ2VvbSgwLCAxKSA9PSAxLAogICAgICAgICAgcGdlb20oYygtMSwgMCwgMSksIDEpID09IGMoMCwgMSwgMSksIGlzLm5hbihwZ2VvbSgwLCAwKSksCiAgICAgICAgICBxZ2VvbSgwLjUsIDEpID09IDAsIGlzLm5hbihxZ2VvbSgwLjUsIDApKSwKICAgICAgICAgIGlzLmZpbml0ZShyZ2VvbSgxLCAxKSksCiAgICAgICAgICAhaXMuZmluaXRlKHJnZW9tKDEsIDApKSkKCgojIyBBIHJlc3BvbnNlIHRvIFBSIzg1MjggIGluY29ycmVjdGx5IGNsYWltZWQgdGhlc2UgdG8gYmUgd3JvbmcuCnN0b3BpZm5vdChhbGwuZXF1YWwoZGYoMCwgMiwgMiksIDEpKQpzdG9waWZub3QoaXMuaW5maW5pdGUoZGYoMCwgMS4zLCAyKSkpCnggPC0gMWUtMTcwCnN0b3BpZm5vdChhbGwuZXF1YWwocGJldGEoeCx4LHgpLCAwLjUpKQojIyBqdXN0IGEgcmVncmVzc2lvbiBjaGVjay4KIyMgVGhpcyB1bmRlcmZsb3dlZApzdG9waWZub3QoYWxsLmVxdWFsKGRiZXRhKHgseCx4KSwgMC41KSkKIyMgdGhpcyB3YXMgc2xvdwpzdG9waWZub3Qoc3lzdGVtLnRpbWUocW5iaW5vbSgxZS0xMCwgMWUzLCAxZS03KSlbM10gPCAwLjEpCiMjIGJ1dCB0aGlzIGZhaWxlZApxbmJpbm9tKDAuNSwgMTAwMDAwMDAwMDAsIDAuMDAwMDAwMDAyKQojIyBpbmZpbml0ZS1sb29wZWQgaW4gMi4yLjEgKGFuc3dlciBpcyBhcHByb3ggNGUxOCkKcXBvaXMoMC45LCAxZTUwKQojIyBpbmZpbml0ZS1sb29wZWQgaW4gMi4yLjEKeiA8LSAxMF5zZXEoMTAsIDMwMCwgMTApCnN0b3BpZm5vdChhbGwuZXF1YWwocHQoLXosIDEsIGxvZz1UUlVFKSwgcGNhdWNoeSgteiwgMSwgbG9nPVRSVUUpKSkKIyMgZmFpbGVkIGF0IGFib3V0IDFlMTUwIGluIDIuMi4xCnN0b3BpZm5vdChwdCgtMWUyMDAsIDAuMDAxKSA+IDApCiMjIHdhcyAwIGluIDIuMi4xLCBzaG91bGQgYmUgYWJvdXQgMzElCgoKIyMgYWxsLmVxdWFsLm51bWVyaWMgb3ZlcmZsb3dlZCBmb3IgbGFyZ2UgaW50ZWdlcnMKc2V0LnNlZWQoMSk7IHIxIDwtIC5SYW5kb20uc2VlZApzZXQuc2VlZCgyKTsgcjIgPC0gLlJhbmRvbS5zZWVkCnN0b3BpZm5vdChpcy5jaGFyYWN0ZXIoYWxsLmVxdWFsKHIxLCByMikpKQojIyBhbGwuZXF1YWwoKSBnYXZlIE5BIGluIDIuMi4xCgoKIyMgc3VwcG9ydCBmb3IgcmF3IGluZGljZXMgaW4gZm9yKCkgd2FzIGFkZGVkIGluIDIuMy4wCnh4IDwtIGFzLnJhdyg0MDo0OCkKZm9yKGkgaW4geHgpIHByaW50KGkpCiMjIHdhcyBlcnJvciA8IDIuMy4wCgoKIyMgYXMubGlzdCBvbiBhIHN5bWJvbCwgZm9yIFMtY29tcGF0aWJpbGl0eQphcy5saXN0KGFzLm5hbWUoImRhdGEuZnJhbWUiKSkKIyMgd2FzIGVycm9yIGluIDIuMi4xCgoKIyMgbWluIGlnbm9yZWQgSU5UX01BWCwgKFBSIzg3MzEpCnN0b3BpZm5vdChtaW4oLk1hY2hpbmUkaW50ZWdlci5tYXgpID09IC5NYWNoaW5lJGludGVnZXIubWF4KQpzdG9waWZub3QobWF4KC0uTWFjaGluZSRpbnRlZ2VyLm1heCkgPT0gLS5NYWNoaW5lJGludGVnZXIubWF4KQpvcCA8LSBvcHRpb25zKHdhcm49MikKbWluKEluZikKbWF4KC1JbmYpCm9wdGlvbnMob3ApCiMjIHdlcmUgKy8tSW5mIHdpdGggd2FybmluZyBpbiAyLjIuMS4KCgojIyBQUiM4NzE4OiBpbnZhbGlkIHVzYWdlIGluIFIgPj0gMi43LjAKI2EgPC0gbWF0cml4KDIsMiwyKQojYXBwbHkoYSwxLCIkIiwiYSIpCiNhcHBseShhLDEsc3VtKQojIyBmaXJzdCBhcHBseSB3YXMgY29ycnVwdGluZyBhcHBseSgpIGNvZGUgaW4gMi4yLjEKCgojIyBOVUxMIHJlc3VsdHMgaW4gYXBwbHkoKQphcHBseShhcy5tYXRyaXgoMSksIDEsIGZ1bmN0aW9uKHgpIE5VTEwpCiMjIHdhcyBlcnJvciBpbiAyLjIuMS4KCgojIyBzdW0gb24gZGF0YSBmcmFtZXMgKFBSIzgzODUpCkRGIDwtIGRhdGEuZnJhbWUobTE9MToyLCBtMj0zOjQpCnN1bShERikKc3VtKERGPURGKSAgIyBuZWVkZWQgYXJnIG5hbWVkIHgKc3VtKERGLCBERikgIyBmYWlsZWQKREZbMSwgMV0gPC0gTkEKc3RvcGlmbm90KGlzLm5hKHN1bShERikpLCBzdW0oREYsIG5hLnJtPVRSVUUpID09IDkpCiMjIGZhaWx1cmVzIDwgMi40LjAKCiMjIHBsb3QubG0KIyB3aGljaD00IGZhaWxlZCBpbiBSIDEuMC4xCnBhcihtZnJvdz1jKDEsMSksIG9tYT0gcmVwKDAsNCkpCnN1bW1hcnkobG0uZm0yIDwtIGxtKEVtcGxveWVkIH4gLiAtIFBvcHVsYXRpb24gLSBHTlAuZGVmbGF0b3IsIGRhdGEgPSBsb25nbGV5KSkKZm9yKHdoIGluIDE6NikgcGxvdChsbS5mbTIsIHdoaWNoID0gd2gpCgpvcCA8LSBwYXIobWZyb3cgPSBjKDIsMiksIG1hciA9IC4xK2MoMywzLDIsMSksIG1ncCA9IGMoMS41LCAuNiwgMCkpCnkgPC0gcnQoMjAwLCBkZj0gMykKcGxvdChsbSh5IH4gMSkpCnBhcihvcCkKIyMgNHRoIHBsb3QgKHdoaWNoID0gNTogImxldmVyYWdlcyIpIGZhaWxlZCBpbiAyLjIuMCA8PSBSIDw9IDIuMy4wCgoKIyMgUmUtZml4IFBSIzg1MDYKeiA8LSByYmluZCh4ID0gZGF0YS5mcmFtZShhID0gMSwgYiA9IDIpLCB5ID0gZGF0YS5mcmFtZShhID0gMSwgYiA9IDIpKQpzdG9waWZub3Qocm93Lm5hbWVzKHopID09IGMoIngiLCAieSIpKQojIyB3ZXJlIE5BcyAoYW5kIGZhaWxlZCB0byBwcmludCkgaW4gMi4zLjAKCmRkIDwtIGRhdGEuZnJhbWUoeCA9IDM6NCkKc3RvcGlmbm90KGlkZW50aWNhbChyb3duYW1lcyhkZCksIHJvdy5uYW1lcyhkZCkpLAogICAgICAgICAgaWRlbnRpY2FsKHJvd25hbWVzKGRkKSwgYygiMSIsICIyIikpKQojIyBvbmUgd2FzIGludGVnZXIgaW4gYW4gaW50ZXJtZWRpYXRlIHZlcnNpb24gb2YgInByZSAyLjQuMCIKCgojIyBtZWFuIG9uIGludGVnZXIgdmVjdG9yIGlnbm9yZWQgTkFzCnN0b3BpZm5vdChpcy5uYShtZWFuKE5BKSkpCiMjIGZhaWxlZCBpbiBSIDIuMy4wCgoKIyMgdGl0bGUgZXRjIGZhaWxlZCBpZiBwYXNzZWQgY29sIGV0YyBvZiBsZW5ndGggPiAxCnBsb3QoMToyKQp0aXRsZSgiZm9vIiwgY29sPTE6MykKdGl0bGUoImZvbyIsIGNleD0xOjMpCnRpdGxlKCJmb28iLCBsdHk9MTozKQp0aXRsZSgiZm9vIiwgbHdkPTE6MykKdGl0bGUoImZvbyIsIGJnPTQ6NykKIyMgdGhyZXcgZXJyb3JzIGluIFIgPD0gMi4zLjAKCgojIyBnbG0gZGlkIG5vdCBhbGxvdyBhcnJheSBvZmZzZXRzCmRmMSA8LSBkYXRhLmZyYW1lKHU9MToxMCwKICAgICAgICAgICAgICAgICAgdj1ycG9pcygxMCwxMCksCiAgICAgICAgICAgICAgICAgIHo9YXJyYXkoMSwxMCwgZGltbmFtZXM9bGlzdCgxOjEwKSkpCmdsbSh2IH4gdStvZmZzZXQobG9nKHopKSwgZGF0YT1kZjEsIGZhbWlseT1wb2lzc29uKQojIyB3YXMgZXJyb3IgaW4gUiA8PSAyLjMuMAoKCiMjIGludmFsaWQgdmFsdWVzIG9mIGEgbG9naWNhbCB2ZWN0b3IgZnJvbSBiaW5kaW5nSXNMb2NrZWQKIyMgTWFydGluIE1vcmdhbiwgUi1kZXZlbCwgMjAwNi0wNS0xNAplIDwtIG5ldy5lbnYoKQplJHggPC0gMQplJHkgPC0gMgpsb2NrQmluZGluZygieCIsIGUpCnN0b3BpZm5vdChiaW5kaW5nSXNMb2NrZWQoIngiLCBlKSwgYmluZGluZ0lzTG9ja2VkKCJ4IiwgZSk9PVRSVUUsCiAgICAgICAgICAhYmluZGluZ0lzTG9ja2VkKCJ5IiwgZSksIGJpbmRpbmdJc0xvY2tlZCgieSIsIGUpPT1GQUxTRSkKIyMgb24gc29tZSBzeXN0ZW1zIGluIFIgPD0gMi4zLjAsIGJpbmRpbmdJc0xvY2tlZCgieCIsIGUpPT1UUlVFIHdhcyBmYWxzZQoKCiMjIGNjZiBvbiBub24tYWxpZ25lZCB0aW1lIHNlcmllcwp4IDwtIHRzKHJub3JtKDEwMCksIHN0YXJ0PTEpCnkgPC0gdHMocm5vcm0oMTIwKSwgc3RhcnQ9MykKY2NmKHgsIHkpCiMjIG5lZWRlZCBuYS5hY3Rpb249bmEuY29udGlndW91cyBpbiAyLjMuMAoKCiMjIG1lcmdlLmRhdGEuZnJhbWUgd2FzIG5vdCBtYWtpbmcgY29sdW1uIG5hbWVzIHVuaXF1ZSB3aGVuCiMjIGRvaW5nIGEgQ2FydGVzaWFuIHByb2R1Y3QuCkRGIDwtIGRhdGEuZnJhbWUoY29sPTE6MykKREYyIDwtIG1lcmdlKERGLCBERiwgYnk9bnVtZXJpYygwKSkKc3RvcGlmbm90KGlkZW50aWNhbChuYW1lcyhERjIpLCBjKCJjb2wueCIsICJjb2wueSIpKSkKIyMgYm90aCB3ZXJlICdjb2wnIGluIDIuMy4wLgoKCiMjIFtwcV11bmlmIHdlcmUgbm90IGNvbnNpc3RlbnQgb24gaW5maW5pdGUgcmFuZ2VzLgpzdG9waWZub3QoaXMubmEocXVuaWYoLjUsIDAsIEluZikpKQojIyB3YXMgSW5mIGluIDIuMy4xLgpzdG9waWZub3QoaXMubmEocHVuaWYoMSwgMCwgSW5mKSkpCiMjIHdhcyAwIGluIDIuMy4xCiMjIGFuZCBmYWlsZWQgb24gemVybyByYW5nZXMgZGVzcGl0ZSB0aGUgZG9jdW1lbnRhdGlvbi4Kc3RvcGlmbm90KHB1bmlmKGMoMCwgMSwgMiksIDEsIDEpID09IGMoMCwgMSwgMSkpCnN0b3BpZm5vdChxdW5pZihjKDAsIDAuNSwgMSksIDEsIDEpID09IDEpCiMjIHdlcmUgYWxsIE5hTiBvbiAyLjMuMQoKCiMjIGNiaW5kIHNlZ2ZhdWx0ZWQgaWYgY29lcmNpb24gb2YgdGhlIHJlc3VsdCB0byBsaXN0IGZhaWxlZC4KY2JpbmQoYXMubmFtZSgiZm9vIiksIDE6MykKIyBzZWdmYXVsdGVkIGluIDIuMy4xCih4IDwtIGNiaW5kKHkgfiB4LCAxKSkKeFssMV0KIyMgbGFzdCBpcyAzIHggMiBsaXN0IG1hdHJpeAoKCiMjIGVtcHR5IHBvaW50IHNldApyIDwtIHh5LmNvb3JkcyhudW1lcmljKDApKQojIyBnYXZlIGFuIGVycm9yIHdpdGggbWlzbGVhZGluZyBtZXNzYWdlIGluIDIuMy4xCgoKIyMgWzwtIGNvdWxkIGV4dGVuZCBhIHRzIGJ1dCBub3QgY2hhbmdlIHRzcC4KeHggPC0geCA8LSB0cyhybm9ybSg2KSwgZnJlcXVlbmN5PTcpCnRyeSh4WzhdIDwtIE5BKQpzdG9waWZub3QoaWRlbnRpY2FsKHgsIHh4KSkKIyMgQWxsb3dlZCBpbiBSIDwgMi40LjAsIGJ1dCBjb3JydXB0ZWQgdHNwLgoKCiMjIFRoaXMgb25seSAid29ya3MiIGJ5IGhhdmluZyBhbiBTMyBnZW5lcmljIHVzZSB0aGUgcmVnaXN0cnkKIyMgb2YgYW5vdGhlciBTMyBnZW5lcmljLCB3aGljaCBzZWVtcyBhIHZlcnkgYmFkIGlkZWEuCiMjICMjIExvb2tpbmcgdXAgZ2VuZXJpYyBpbiBVc2VNZXRob2QKIyMgbXljb2VmIDwtIGZ1bmN0aW9uKG9iamVjdCwgLi4uLikgVXNlTWV0aG9kKCJjb2VmIikKIyMgeCA8LSBsaXN0KGNvZWZmaWNpZW50cz0xOjMpCiMjIG15Y29lZih4KQojIyAjIyBmYWlsZWQgdG8gZmluZCBkZWZhdWx0IG1ldGhvZCA8IDIuNC4wCgoKIyMgcmVncmVzc2lvbiB0ZXN0cyBvbiBjaGFuZ2VzIHRvIG1vZGVsLmZyYW1lIGFuZCBtb2RlbC5tYXRyaXgKQSA8LSBkYXRhLmZyYW1lKHkgPSAxOjEwLCB6ID0gMToxMCsxaSwKICAgICAgICAgICAgICAgIHggPSByZXAoYygiYSIsICJiIiksIGVhY2ggPSA1KSwKICAgICAgICAgICAgICAgIHIgPSBhcy5yYXcoMToxMCksCiAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCm1vZGVsLmZyYW1lKHogfiB4K3krciwgZGF0YSA9IEEpICMgaW5jbHVkZXMgY2hhcmFjdGVyLCByYXcgYW5kIGNvbXBsZXgKbG0oeiB+IHgreSwgZGF0YSA9IEEpICMgY29tcGxleCByZXNwb25zZSwgY2hhcmFjdGVyIFJIUwojIGJ1dCB3ZSBkbyBub3QgYWxsb3cgY29tcGxleCBub3IgcmF3IHZhcmlhYmxlcyBvbiB0aGUgcmhzCnN0b3BpZm5vdChpbmhlcml0cyh0cnkobW9kZWwubWF0cml4KHkgfiB4K3osIGRhdGEgPSBBKSksICJ0cnktZXJyb3IiKSkKc3RvcGlmbm90KGluaGVyaXRzKHRyeShtb2RlbC5tYXRyaXgoeSB+IHIsIGRhdGEgPSBBKSksICJ0cnktZXJyb3IiKSkKIyMgbmV3IGluIDIuNC4wCgoKIyMgdGVzdHMgb2Ygc3RyaW5nc0FzRmFjdG9ycwphIDwtIGxldHRlcnNbMTo4XQphYSA8LSBtYXRyaXgoYSwgNCwgMikKYWFhIDwtIGxpc3QoYWFhPWxldHRlcnNbMjA6MjNdKQpjb2xuYW1lcyhhYSkgPC0gcGFzdGUoImFhIiwgMToyLCBzZXA9Ii4iKQooQSA8LSBkYXRhLmZyYW1lKGE9YVsxOjRdLCBhYSwgYWFhLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpKQpzdG9waWZub3QoYWxsKHNhcHBseShBLCBjbGFzcykgPT0gImNoYXJhY3RlciIpKQpzdG9waWZub3QoY2xhc3MoYXMuZGF0YS5mcmFtZShsaXN0KGE9YSksIHN0cmluZ3NBc0ZhY3RvcnMgPSBUUlVFKSRhKQogICAgICAgICAgPT0gImZhY3RvciIpCiMjIG5ldyBpbiAyLjQuMAoKCiMjIGZhaWx1cmUgdG8gZHVwbGljYXRlIGluIGVudmlyb25tZW50PC0oKS4KIyMgVGhvbWFzIFBldHpvbGR0LCBSLWhlbHAsIDIwMDYtMDYtMjMuCmVudmZ1biA8LSBmdW5jdGlvbihMKSB7CiAgcCA8LSBwYXJlbnQuZnJhbWUoKQogIGFzc2lnbigidGVzdCIsIEwkdGVzdCwgcCkKICBlbnZpcm9ubWVudChwJHRlc3QpIDwtIHAKfQpzb2x2ZXIgPC0gZnVuY3Rpb24oTCkgZW52ZnVuKEwpCkwgPC0gbGlzdCh0ZXN0ID0gZnVuY3Rpb24oKSAxICsgMikKCmVudmlyb25tZW50KEwkdGVzdCkKc29sdmVyKEwpCihlIDwtIGVudmlyb25tZW50KEwkdGVzdCkpCnN0b3BpZm5vdChpZGVudGljYWwoZSwgLkdsb2JhbEVudikpCiMjIGZhaWxlZCB0byBsb29rIGF0IE5BTUVECgoKIyMgc29ydC5saXN0KDxhIGZhY3Rvcj4sIG1ldGhvZD0icmFkaXgiKSBzdG9wcGVkIHdvcmtpbmcgYXQgc29tZSBwb2ludAp4IDwtIGZhY3RvcihzYW1wbGUobGV0dGVycywgMTAwMCwgcmVwbGFjZT1UUlVFKSkKbyA8LSBzb3J0Lmxpc3QoeCwgbWV0aG9kID0gInJhZGl4IikKIyMgZmFpbGVkIGluIDIuMy4xCgoKIyMgcXQoKSBiaXNlY3Rpb24gc2VhcmNoOiBQUiM5MDUwCnggPC0gLTI6MgpzdG9waWZub3QoaXNUUlVFKGFsbC5lcXVhbCh4LCBxdChwdCh4LCBkZj0yMCwgbmNwPTEpLGRmPTIwLG5jcD0xKSkpKQojIyBmYWlsZWQgaW4gMi4zLjEKCgojIyBwb2x5KCkgZGlkbid0IHBhc3MgJ3JhdycgdG8gcG9seW0oKQp4IDwtIC0zOjMKeSA8LSAxMCooMTo3KQpzdG9waWZub3QoaWRlbnRpY2FsKHBvbHkgKHgseSwgZGVncmVlID0gMiwgcmF3ID0gVFJVRSksCgkJICAgIHBvbHltKHgseSwgZGVncmVlID0gMiwgcmF3ID0gVFJVRSkpKQojIyBmYWlsZWQgaW4gMi4zLjEKCgojIyBwbG90Lnh5KCB0eXBlID0gInMiIHwgIlMiICkgd2FzIG1pc3NpbmcgYW4gaW5pdGlhbCB0ZXN0OiBQUiM5MDQ2CnR5cGVzIDwtIGMoInAiLCAibCIsICJiIiwgIm8iLCAiaCIsICJzIiwgIlMiKQpwIDwtIHBhbGV0dGUoaGNsKGggPSBzZXEoMzAsMzMwLCBsZW5ndGg9IGxlbmd0aCh0eXBlcykpKSkKcGxvdChjKDEsNiksIGMoLS40LCAxLjUpLCB0eXBlPSJuIiwgYW5uID0gRkFMU0UpOyAgb2ZmIDwtIDE6NiAvIDE2CmZvcihpIGluIHNlcSh0eXBlcykpIHsKICAgIGxpbmVzKGkqb2ZmIC8tMTo0LCB0eXBlID0gdHlwZXNbaV0sIGNvbCA9IGksIHBjaCA9IHR5cGVzW2ldKQogICAgbXRleHQodHlwZXNbaV0sIDQsIGxpbmU9IC41LCBhdCA9IGkqb2ZmWzZdLzQsIGNvbCA9IGksIGxhcyA9IDEpCn0KcGFsZXR0ZShwKSMgcmVzdG9yZWQgdG8gcHJldmlvdXMKIyMgZmFpbGVkIGluIDIuMy4xCgoKIyMgcWYgZm9yIGxhcmdlIGRmMgpzdG9waWZub3QoaXNUUlVFKGFsbC5lcXVhbChxZigwLjksZGYxPTEsZGYyPTFlMTAsbmNwPTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBxZigwLjksZGYxPTEsZGYyPTFlMTApKSkpCiMjIGZhaWxlZCBpbiAyLjMuMQoKCiMjIHNvbWUgcmVncmVzc2lvbiB0ZXN0cyBvZiBhcy52ZWN0b3IoKSBhbmQgYXMubGlzdCgpCnggPC0gbGlzdChhPTEsIGI9MikKc3RvcGlmbm90KGlkZW50aWNhbCh4LCBhcy5saXN0KHgpKSkgICMgd2FzIHNhaWQgdG8gZHJvcCBuYW1lcwp4IDwtIHBhaXJsaXN0KGE9MSwgYj0yKQpzdG9waWZub3QoaXMubGlzdCh4KSkKeHggPC0gYXMudmVjdG9yKHgsICJsaXN0IikKc3RvcGlmbm90KHR5cGVvZih4eCkgPT0gImxpc3QiKQpzdG9waWZub3QoIWlkZW50aWNhbCh4LCB4eCkpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeCksIG5hbWVzKHh4KSkpCgp4IDwtIGV4cHJlc3Npb24oYT0yKzMsIGI9cGkpCnh4IDwtIGFzLnZlY3Rvcih4LCAibGlzdCIpICMgbm90IGFsbG93ZWQgaW4gMi4zLjEKc3RvcGlmbm90KGlkZW50aWNhbChuYW1lcyh4KSwgbmFtZXMoeHgpKSkKeHggPC0gYXMubGlzdCh4KSAgICAgICAgICAgIyBsb3N0IG5hbWVzIGluIDIuMy4xCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeCksIG5hbWVzKHh4KSkpCiMjIHdhcyBpbmNvcnJlY3RseSBkb2N1bWVudGVkIGluIDIuMy4xCgoKIyMgc3Vic2V0dGluZyBhcnJheXMgcHJlc2VydmVkIGF0dHJpYnV0ZXMsIGFsdGhvdWdoIGl0IGRpZCBub3QgZm9yIG1hdHJpY2VzCnggPC0gc3RydWN0dXJlKDE6OCwgbmFtZXM9bGV0dGVyc1sxOjhdLCBjb21tPSJhIGNvbW1lbnQiLCBkaW0gPSBjKDJMLDJMLDJMKSkKc3RvcGlmbm90KGlzLm51bGwoYXR0cih4WywsXSwgImNvbW0iKSkpCnggPC0gc3RydWN0dXJlKDE6OCwgbmFtZXM9bGV0dGVyc1sxOjhdLCBjb21tPSJhIGNvbW1lbnQiLCBkaW0gPSBjKDJMLDRMKSkKc3RvcGlmbm90KGlzLm51bGwoYXR0cih4WyxdLCAiY29tbSIpKSkKeCA8LSBzdHJ1Y3R1cmUoMTo4LCBuYW1lcz1sZXR0ZXJzWzE6OF0sIGNvbW09ImEgY29tbWVudCIpCnN0b3BpZm5vdCghaXMubnVsbChhdHRyKHhbXSwgImNvbW0iKSkpICAjIHRoaXMgZG9lcyBwcmVzZXJ2ZQpzdG9waWZub3QoaXMubnVsbChhdHRyKHhbMTo4XSwgImNvbW0iKSkpCiMjICAyLjMuMSBwcmVzZXJ2ZWQgdGhlIGZpcnN0LgoKCiMjIGRpZmYoKSBmb3IgUE9TSVgoY2wpdCA6CmRzMSA8LSBkaWZmKGxzZWMgPC0gLmxlYXAuc2Vjb25kc1sxOjEyXSkKKGRzMiA8LSBkaWZmKGxsc2VjIDwtIGFzLlBPU0lYbHQobHNlYykpKSAjIGluIGRheXMKc3RvcGlmbm90KGRzMSA9PSBkczIpCiMjIGdhdmUgZGlmZmVyZW50IHJlc3VsdCBmb3IgUE9TSVhsdCB1cCB0byAyLjMuMQoKCiMjIGZvcm1hdCh0cmltID0gVFJVRSwgYmlnLm1hcms9IiwiKSBkaWQgbm90IHdvcmsgY29ycmVjdGx5IChQUiM5MTE4KQooYSA8LSBmb3JtYXQoYygtMSwxLDEwLDk5OSwxZTYpLCB0cmltPVRSVUUpKQooYiA8LSBmb3JtYXQoYygtMSwxLDEwLDk5OSwxZTYpLCBiaWcubWFyaz0iLCIsIHRyaW09VFJVRSkpCnN0b3BpZm5vdChhWzE6NF0gPT0gYlsxOjRdKQojIyBubyB0cmltIGluIDIuMy4xIGlmIGJpZy5tYXJrIHdhcyB1c2VkLgoKCiMjIHJlc2lkdWFscy5nbG0gbmVlZGVkICd5ID0gVFJVRScgKFBSIzkxMjQpCiMgZXhhbXBsZSBmb3IgcG9pc3NvbiBHTE0gZnJvbSA/Z2xtCmQuQUQgPC0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBnbCgzLDMpLCBvdXRjb21lID0gZ2woMywxLDkpLAogICAgICAgICAgICAgICAgICAgY291bnRzID0gYygxOCwxNywxNSwyMCwxMCwyMCwyNSwxMywxMikpCmdsbS5EOTMgPC0gZ2xtKGNvdW50cyB+IG91dGNvbWUgKyB0cmVhdG1lbnQsIGZhbWlseSA9IHBvaXNzb24sCiAgICAgICAgICAgICAgIGRhdGEgPSBkLkFELCB5ID0gRkFMU0UpCnJlc2lkdWFscyhnbG0uRDkzLCB0eXBlID0gIndvcmtpbmciKQpyZXNpZHVhbHMoZ2xtLkQ5MywgdHlwZSA9ICJwYXJ0aWFsIikKcmVzaWR1YWxzKGdsbS5EOTMsIHR5cGUgPSAicmVzcG9uc2UiKQpyZXNpZHVhbHMoZ2xtLkQ5MywgdHlwZSA9ICJkZXZpYW5jZSIpCnJlc2lkdWFscyhnbG0uRDkzLCB0eXBlID0gInBlYXJzb24iKQojIyBhbGwgZmFpbGVkIGluIDIuMy4xCgoKIyMgYW5vdmEubWxtIGZhaWxlZApkYXQ8LW1hdHJpeCggYyg5LDcsOCw4LDEyLDExLDgsMTMsICAgICA2LDUsNiwzLDYsNywxMCw5LAogICAgICAgICAgICAgICAxMCwxMyw4LDEzLDEyLDE0LDE0LDE2LCA5LDExLDEzLDE0LDE2LDEyLDE1LDE0KSwKICAgICAgICAgICAgbmNvbCA9IDQsIGRpbW5hbWVzID0gbGlzdChzPTE6OCwgYz0xOjQpKQptbG1maXQgPC0gbG0oZGF0IH4gMSkKYW5vdmEobWxtZml0LCBYID0gfjEpCiMjIHdvcmtlZCBpbiAyLjIuMSwgZmFpbGVkIGluIDIuMy4xCgoKIyMgc3RvcGlmbm90KDxleHByPikgIGZvciBhIGxvbmcgZXhwcmVzc2lvbiAoZG8gbm90IHdyYXAgdGhlIGZvbGxvd2luZyBsaW5lISEpOgpyIDwtIHRyeShzdG9waWZub3QoYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iKSksCgkgc2lsZW50ID0gVFJVRSkKaWYobGVuZ3RoKGdyZXAoIlRSVUUuKlRSVUUiLHIpKSkKICAgIHN0b3AoInN0b3BpZm5vdCgpIGdpdmVzIGJhZCBtZXNzYWdlIGZvciBsb25nIGV4cHJlc3Npb24iKQojIyBoYXBwZW5lZCBpbiAyLjMuWzAxXQoKCiMjIHJvd25hbWVzIG9uIDAtZXh0ZW50IG1hdHJpeCAoUFIjOTEzNikKQSA8LSBtYXRyaXgoTkEsIDAsIDApCnN0b3BpZm5vdChpZGVudGljYWwocm93bmFtZXMoQSwgZG8uTlVMTCA9IEZBTFNFKSwgY2hhcmFjdGVyKDApKSkKc3RvcGlmbm90KGlkZW50aWNhbChjb2xuYW1lcyhBLCBkby5OVUxMID0gRkFMU0UpLCBjaGFyYWN0ZXIoMCkpKQojIyB3ZXJlICdyb3cnIGV0YyBpbiAyLjMuMS4KCgojIyBncmVwKHZhbHVlID0gVFJVRSkgc29tZXRpbWVzIHByZXNlcnZlZCBuYW1lcywgc29tZXRpbWVzIG5vdAp4IDwtIDE6Mwp4eCA8LSBsZXR0ZXJzWzE6M10KbmFtZXMoeCkgPC0gbmFtZXMoeHgpIDwtIHh4CnogPC0gZ3JlcCgxLCB4LCB2YWx1ZSA9IFRSVUUpCnN0b3BpZm5vdCghaXMubnVsbChuYW1lcyh6KSksIG5hbWVzKHopID09IHh4WzFdKQp6IDwtIGdyZXAoMSwgeCwgdmFsdWUgPSBUUlVFLCBwZXJsID0gVFJVRSkKc3RvcGlmbm90KCFpcy5udWxsKG5hbWVzKHopKSwgbmFtZXMoeikgPT0geHhbMV0pCnogPC0gZ3JlcCgiYSIsIHh4LCB2YWx1ZSA9IFRSVUUpCnN0b3BpZm5vdCghaXMubnVsbChuYW1lcyh6KSksIG5hbWVzKHopID09IHh4WzFdKQp6IDwtIGdyZXAoImEiLCB4eCwgdmFsdWUgPSBUUlVFLCBwZXJsID0gVFJVRSkKc3RvcGlmbm90KCFpcy5udWxsKG5hbWVzKHopKSwgbmFtZXMoeikgPT0geHhbMV0pCnogPC0gYWdyZXAoImEiLCB4eCwgdmFsdWUgPSBUUlVFKQpzdG9waWZub3QoIWlzLm51bGwobmFtZXMoeikpLCBuYW1lcyh6KSA9PSB4eFsxOjNdKQojIyBwZXJsPVRSVUUsIGFncmVwIGRpZCBub3QgaW4gMi4zLjEsIGFsbCBkaWQgbm90IGZvciBwcmUtMi40LjAKeFsyXSA8LSB4eFsyXSA8LSBOQQp6IDwtIGdyZXAoTkEsIHgsIHZhbHVlID0gVFJVRSkKc3RvcGlmbm90KGlkZW50aWNhbChuYW1lcyh6KSwgbmFtZXMoeHgpKSkKeiA8LSBncmVwKE5BLCB4LCB2YWx1ZSA9IFRSVUUsIHBlcmwgPSBUUlVFKQpzdG9waWZub3QoaWRlbnRpY2FsKG5hbWVzKHopLCBuYW1lcyh4eCkpKQp6IDwtIGdyZXAoTkEsIHh4LCB2YWx1ZSA9IFRSVUUpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeiksIG5hbWVzKHh4KSkpCnogPC0gZ3JlcChOQSwgeHgsIHZhbHVlID0gVFJVRSwgcGVybCA9IFRSVUUpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeiksIG5hbWVzKHh4KSkpCnogPC0gYWdyZXAoTkEsIHh4LCB2YWx1ZSA9IFRSVUUpCnN0b3BpZm5vdChpZGVudGljYWwobmFtZXMoeiksIG5hbWVzKHh4KSkpCiMjIGFsd2F5cyBkcm9wcGVkIG5hbWVzIG9uIE5BIG1hdGNoZXMgPCAyLjQuMAoKCm9vIDwtIG9wdGlvbnMobWF4LnByaW50ID0gMjApCmNjIDwtIGNhcHR1cmUub3V0cHV0KHdvbWVuKQpvcHRpb25zKG9vKQpjMiA8LSBjYXB0dXJlLm91dHB1dCh3b21lblsxOjEwLF0pCnN0b3BpZm5vdChsZW5ndGgoY2MpID09IDEgKyAyMC8yICsgMSwKCSAgaWRlbnRpY2FsKGNjWy0xMl0sIGMyWzE6MTFdKSkKIyMgd2FzIHdyb25nIGZvciBzb21lIGRheXMgaW4gQXVnLjIwMDYKCgojIyBlcnJvcnMgaW4gaWRlbnRpY2FsKCkKc3RvcGlmbm90KCFpZGVudGljYWwocGFpcmxpc3QoYT0xLCBiPTIpLCBwYWlybGlzdChhPTEsIGFhPTIpKSkKc3RvcGlmbm90KCFpZGVudGljYWwoc3RydWN0dXJlKHBpLCBhPTEsIGI9MiksIHN0cnVjdHVyZShwaSwgYT0xLCBhYT0yKSkpCnN0b3BpZm5vdChpZGVudGljYWwoc3RydWN0dXJlKHBpLCBhPTEsIGI9MiksIHN0cnVjdHVyZShwaSwgYj0yLCBhPTEpKSkKIyMgaWdub3JlZCBuYW1lcyBvZiBwYWlybGlzdHMsIGJ1dCB0ZXN0ZWQgb3JkZXIgb2YgYXR0cmlidXRlcyA8IDIuNC4wCgoKIyMgZmFpbGVkIHN1YmFzc2lnbiBjb3VsZCBsZWF2ZSAnKnRtcConIGFyb3VuZAojIyBQYXJsYW1pcyBGcmFua2xpbiwgUi1kZXZlbCwgMjAwNi0wOS0yMAp0ZXN0IDwtIDE6MTAKdHJ5KHRlc3RbMjo0XSA8LSBscykgIyBmYWlscwpzdG9waWZub3QoIWV4aXN0cygiKnRtcCoiLCB3aGVyZT0xKSkKIyMgd2FzIHRydWUgPCAyLjQuMAoKCiMjIG1lcmdlIG9uIHplcm8tcm93IGRhdGEgZnJhbWVzCkwzIDwtIExFVFRFUlNbMTozXQpkIDwtIGRhdGEuZnJhbWUoY2JpbmQoeD0xLCB5PTEpLCBmYWM9c2FtcGxlKEwzLCAxLCByZXBsPVRSVUUpKQplIDwtIGRbLTEsXQptZXJnZShkLCBlLCBieS54ID0gIngiLCBieS55ID0gIngiLCBhbGwueCA9IFRSVUUpCiMjIG5vdCBhbGxvd2VkIDw9IDIuNC4wCgoKIyMgUFIjOTMxMwpsaWJyYXJ5KHN0YXRzNCkKZyA8LSBmdW5jdGlvbih4LCB5KSAtY29zKHgpICsgYWJzKHkpCmZpdDEgPC0gbWxlKGcsIHN0YXJ0ID0gbGlzdCh4ID0gMCwgeSA9IDcpKQpmaXQyIDwtIG1sZShnLCBzdGFydCA9IGxpc3QoeSA9IDcsIHggPSAwKSkKc3RvcGlmbm90KGFsbC5lcXVhbChjb2VmKGZpdDEpLCBjb2VmKGZpdDIpKSkKIyMgRm91bmQgZGlmZmVyZW50IHNvbHV0aW9ucyBpbiAyLjQuMCwgYXMgbmFtZXMgd2VyZSBub3QgcmVtYXBwZWQgaW4gZml0MgoKCiMjIFBSIzk0NDYKcmJpbmQoIGRhdGEuZnJhbWUoeD0xKSwgbGlzdCh4PTIpICkKIyMgd2FzIGVycm9yIGluIDIuNC4wIGFzIGxpc3QgZ2F2ZSBkb3VibGUgcm93IG5hbWVzLgoKCiMjIGV4dHJlbWUgY2FzZQpicyA8LSBib3hwbG90LnN0YXRzKGMoMSxJbmYsSW5mLEluZikpCiMjIGdhdmUgYW4gZXJyb3IgaW4gMi40LjAKCgojIyB0LnRlc3Qgd2l0aCBvbmUgZ3JvdXAgb2Ygc2l6ZSBvbmUKeCA8LSBjKDIzLDI1LDI5LDI3LDMwLDMwKQp0LnRlc3QoeD14WzFdLCB5PXhbLTFdLCB2YXIuZXF1YWw9VFJVRSkKdC50ZXN0KHk9eFsxXSwgeD14Wy0xXSwgdmFyLmVxdWFsPVRSVUUpCiMjIGZhaWxlZCBpbiAyLjQuMAoKCiMjIGNvcnJ1cHRlZCAidHMiIG9iamVjdHMKc3RydWN0dXJlKDE6MywgY2xhc3M9InRzIikKIyMgZmFpbGVkIGluIHByaW50IG1ldGhvZCA8IDIuNC4xCgoKIyMgUFIjOTM5OQp4MSA8LSAieDIiCngyIDwtIHBpCnJtKHgxKSAjIHJlbW92ZXMgeDEsIG5vdCB4MgpzdG9waWZub3QoIWV4aXN0cygieDEiLCAuR2xvYmFsRW52KSwgZXhpc3RzKCJ4MiIsIC5HbG9iYWxFbnYpKQpybSgieDIiKQojIGluY29ycmVjdGx5IGRvY3VtZW50ZWQgPD0gMi40LjAKYSA8LSBiIDwtIGMgPC0gMQp6IDwtIHRyeShybShjKCJhIiwgImIiKSkpCnN0b3BpZm5vdChpbmhlcml0cyh6LCAidHJ5LWVycm9yIikpCiMjIHJlbW92ZWQgJ2EnLCAnYicgYW5kICdjJyBpbiAyLjQuMAoKIyMjIGVuZCBvZiB0ZXN0cyBhZGRlZCBpbiAyLjQuMSAjIyMKCgojIyB0cmFuc2xhdGlvbiBlcnJvciBpbiBvcHRpbWl6ZSAoUFIjOTQzOCkKZXgyIDwtIGZ1bmN0aW9uKHgpIGxvZygoMTgvNDEpICogeCAtIDIgKiB4XjIpICsKICAgIDE2ICogbG9nKDQgKiB4XjIgLSAoMzYvNDEpICogeCArICg5LzQxKSkgKwogICAgMjQgKiBsb2coKDIzLzgyKSArICgxOC80MSkgKiB4IC0gMiAqIHheMikKb3B0IDwtIG9wdGltaXNlKGV4MiwgbG93ZXIgPSAwLCB1cHBlciA9IDkvNDEsIG1heGltdW0gPSBUUlVFKSRtYXhpbXVtCiMgdGhlcmUgYXJlIHR3byBnbG9iYWwgbWF4aW1hCnN0b3BpZm5vdChhYnMob3B0IC0gMC4xODcpIDwgMC4wMSB8fCBhYnMob3B0IC0gMC4wMzMpIDwgMC4wMSkKIyMgY2hhbmdlZCBib3RoIGVuZHMgb2YgaW50ZXJ2YWwgYXQgdGhlIGZpcnN0IHN0ZXAsIGdhdmUgb3B0ID0gMC4xMzYKCgojIyBOZWVkbGVzc2x5IGZhaWxpbmcgc3ViYXNzaWdubWVudHMKZSA8LSAxOjEwCmVbMl0gPC0gZXhwcmVzc2lvbihlKQplIDwtIHBpCmVbMl0gPC0gZXhwcmVzc2lvbihlKQplIDwtIGxldHRlcnMKZVsyXSA8LSBleHByZXNzaW9uKGUpCmUgPC0gYXMucmF3KDE6MykKZVsyXSA8LSBsaXN0KGU9cGkpCiMjIGFsbCBmYWlsZWQgPCAyLjUuMAoKCiMjIHVuaXJvb3QgZGlkIG5vdCBhbGxvdyB6ZXJvIGF0IHRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwKZiA8LSBmdW5jdGlvbih4KSB4LTEKdW5pcm9vdChmLCBjKDAsMikpCnVuaXJvb3QoZiwgYygwLDEpKQp1bmlyb290KGYsIGMoMSwyKSkKIyMgbGFzdCB0d28gZmFpbGVkIGluIDIuNC54CgoKIyMgUFIjOTM2MCBhbmQgUFIjOTM5NAphY2YoMSwgbGFnLm1heD0wLCBwbG90PUZBTFNFKQojIyBnYXZlIGFuIGVycm9yIGluIDIuNC4wCnN0b3BpZm5vdCggYWxsLmVxdWFsKGNjZigxOjMsLSgxOjMpKSRhY2ZbMiwxLDFdLCAtMSkgKQojIyBnYXZlIHBvc2l0aXZlIGxhZyAwIGNyb3NzLWNvcnJlbGF0aW9uIGFmdGVyIHBhdGNoaW5nIFBSIzkzNjAKCgojIyByZWdyZXNzaW9uIHRlc3RzIGZvciBjb21wbGV4IHN1bS9wcm9kIChicmllZmx5IGJyb2tlbiBpbiBKYW4gMjAwNykKeiA8LSBybm9ybSgxMCkgKyBybm9ybSgxMCkqKDArMWkpCnN1bSh6KQooeCA8LSBzdW0ocGksIHopKQpzdG9waWZub3QoYWxsLmVxdWFsKHgsIHN1bShwaSxSZSh6KSkgKyBzdW0oSW0oeikpKigwKzFpKSkpCnByb2QoeikKIyMKCgojIyBwcm9ibGVtcyB3aXRoIDAtcm93IGRhdGEgZnJhbWVzIGNyZWF0ZWQgYnkgcmVhZC50YWJsZQp4IDwtIHN0cnVjdHVyZShsaXN0KG9uZSA9IE5VTEwsIHR3byA9IE5VTEwsIHRocmVlID0gTlVMTCksCiAgICAgICAgICAgICAgIC5OYW1lcyA9IGMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSwgY2xhc3MgPSAiZGF0YS5mcmFtZSIpCnkgPC0gZGF0YS5mcmFtZShvbmU9MSx0d289Mix0aHJlZT0zKQooeiA8LSByYmluZCh4LHkpKQpzdG9waWZub3QoZGltKHopID09IGMoMSwgMykpCih6IDwtIHJiaW5kKHkseCkpCnN0b3BpZm5vdChkaW0oeikgPT0gYygxLCAzKSkKKHogPC0gcmJpbmQoeCx4KSkKc3RvcGlmbm90KGRpbSh6KSA9PSBjKDAsIDMpKQojIyB2YXJpb3VzbHkgZmFpbGVkIG9yIGdhdmUgemVyby1jb2x1bW4gZGF0YSBmcmFtZSBpbiAyLjQuMQoKCiMjIHRlc3RzIG9mIHBhcnRpYWwgbWF0Y2hpbmcgb2YgYXR0cmlidXRlcwp4IDwtIDE6NAphdHRyKHgsICJhYiIpIDwtIDEKZm9yKHkgaW4gYygiYWJjIiwgImFiY2QiLCAiYWJjZGUiKSkgewogICAgYXR0cih4LCB5KSA8LSAxCiAgICBzdG9waWZub3QoaXMubnVsbChhdHRyKHgsICJhIikpKQp9CiMgc2Vjb25kIHdhcyAnMScgb24gMi40LjEuCnggPC0gMTo0Cm5hbWVzKHgpIDwtIGxldHRlcnNbeF0Kc3RvcGlmbm90KGlkZW50aWNhbChhdHRyKHgsICJuIiksIG5hbWVzKHgpKSkKeCA8LSBhcy5wYWlybGlzdCh4KQpzdG9waWZub3QoaWRlbnRpY2FsKGF0dHIoeCwgIm4iKSwgbmFtZXMoeCkpKQojIyB3b3JrZWQgZm9yIHBhaXJsaXN0cyBidXQgbm90IHZlY3RvcnMgaW4gMi40LjEKCgojIyB3aGljaChhcnIuaW5kID0gVFJVRSkgZmFpbGVkIHRvIGdpdmUgbWF0cml4IG9uIGEgMC1sZW5ndGggaW5wdXQKQyA8LSBtYXRyaXgoMToxNiwgNCkKKGluZCA8LSB3aGljaChDIDwgMCwgYXJyLmluZCA9IFRSVUUpKQpzdG9waWZub3QoaXMubWF0cml4KGluZCkpCiMjIGdhdmUgaW50ZWdlcigwKSBpbiAyLjQuMQoKCiMjIHBsbm9ybSB3cm9uZyBmb3Igb3V0LW9mLXJhbmdlIHZhbHVlcyAoUFIjOTUyMCkKc3RvcGlmbm90KHBsbm9ybSgwLCBsb3dlci50YWlsPUZBTFNFKSA9PSAxLCBwbG5vcm0oMCwgbG93ZXIudGFpbD1UUlVFKSA9PSAwKQojIyBib3RoIGxvd2VyIHRhaWwgaW4gIFIgPCAyLjUuMAoKCiMjIHN1cHNtdSB3aXRoIGFsbCBOQSB2YWx1ZXMgKFBSIzk1MTkpCnggPC0gc2VxKDAsIDEsIGxlbiA9IDEwMCkKeSA8LSB4ICsgTkEKdHJ5KHN1cHNtdSh4LHkpKQojIyBzZWdmYXVsdGVkIDwgMi41LjAKCgojIyB3aGljaC5tYXggd2hlbiBtYXggaXMgSW5mIChQUiM5NTIyKQp3aGljaC5taW4oYyhOQSwgTkEsIEluZikpCndoaWNoLm1heChjKE5BLCBOQSwgLUluZiwgLUluZikpCiMjIHdlcmUgaW50ZWdlcigwKSBpbiA8IDIuNS4wCgoKIyMgc3RyLmRlbmRyb2dyYW0gZGlkIG5vdCB3b3JrIHdpdGggJ21heC5sZXZlbD1OQScKIyMgd2hpY2ggaGFzIGJlY29tZSBkZWZhdWx0IHdoZW4gY2FsbGVkIGZyb20gc3RyLmRlZmF1bHQoKToKY20gPC0gY29yKFVTSnVkZ2VSYXRpbmdzKQpobSA8LSBoZWF0bWFwKGNtLCBzeW1tID0gVFJVRSwga2VlcC5kZW5kcm8gPSBUUlVFKQpzdHIoaG0sIG1heD0yKSAjIHJlYXNvbmFibGUKc3RyKGhtKSAgICAgICAgIyBnYXZlIGVycm9yIChsZXNzIHJlYXNvbmFibGUgdGhhbiBhYm92ZSkKCgojIyBbPC0uZGF0YS5mcmFtZSBkaWQgbm90IGFsbG93IGRlbGV0aW5nIHRoZSBsYXN0IGNvbHVtbiAoUFIjOTU2NSkKREYgPC0gZGF0YS5mcmFtZSh4ID0gMTozLCB5ID0gNDo2LCB6ID0gNzo5KQpERlssICJ6Il0gPC0gTlVMTApzdG9waWZub3QoaWRlbnRpY2FsKGRpbShERiksIGMoM0wsIDJMKSkpCiMjICdzdWJzY3JpcHQgb3V0IG9mIGJvdW5kcycgaW4gMi40LjEuCgojIyBuZXcgdHJ5Q2F0Y2goKSBiYXNlZCB0cnkoKSAgd2l0aCBhbm9ueW1vdXMgZnVuY3Rpb24KdiA8LSB0cnkoZG8uY2FsbChmdW5jdGlvbih4KSBzdG9wKCJkaWVkIiksIGxpc3QoMSkpLCBzaWxlbnQ9VFJVRSkKc3RvcGlmbm90KGluaGVyaXRzKHYsICJ0cnktZXJyb3IiKSkKIyMgZmFpbGVkIGluIHNvbWUgdmVyc2lvbiBvZiBSLWRldmVsICgyLjUuMCkKCgojIyBjaG9vc2UobixrKSBzaG91bGQgYmUgaW50ZWdlciBpZiBuIGlzCnN0b3BpZm5vdChjaG9vc2UoMTEsNikgPT0gNDYyKQojIyB3YXMgPCA0NjIgb24gc29tZSBBTUQ2NCBMaW51eAoKCiMjIGZpeCB1cCB1c2Ugb2YgJWoiIGZvcm1hdCBpbiBzdHJwdGltZSAoUFIjOTU3NykKeCA8LSBzdHJwdGltZSgzMTozMywgIiVqIikKeApzdG9waWZub3QoIWlzLm5hKHgpKQojIyBkYXkgMzIgd2FzIE5BIGluIFIgPCAyLjUuMAoKCiMjIG1vc2FpY3Bsb3QoKSBicm9rZW4gYnkgdW5kb2N1bWVudGVkICdidWcgZml4JyByMzk2NTUKeCA8LSBtYXRyaXgoMTo0LDIsMikKbW9zYWljcGxvdCh4LCBzb3J0ID0gc2VxX2xlbihkaW0oeCkpKQojIyBmYWlsZWQgaW4gMi40LjEsIGZpeGVkIGluIDIuNS4wCgoKIyMgaml0dGVyIGZhaWxlZCBpbiB3aWVyZCBjYXNlIChQUiM5NTgwKQpzdG9waWZub3QoaXMuZmluaXRlKCBqaXR0ZXIoYygtMSwgMykpICkpCiMjIHdhcyByZXBlYXRlZCBOYU4gaW4gMi40LjEKCgojIyBtYXguY29sKCkgcHJvYmxlbXMgKFBSIzk1NDIpCnggPC0gcmVwKDAsIDEwKQpkaW0oeCkgPC0gYygxLCAxMCkKIyBtYXguY29sKHgpIHNob3VsZCBiZSByYW5kb20uCmFucyA8LSBudW1lcmljKDEwMCkKZm9yKGkgaW4gMToxMDApIGFuc1tpXSA8LSBtYXguY29sKHgpCnRhYmxlKGFucykKc3RvcGlmbm90KGFueShhbnMgIT0gMTApKQojIyBhbHdheXMgZ2F2ZSBsYXN0IGluIDIuNC4xCgoKIyMgcmVwIGNvdWxkIHNlZ2ZhdWx0OiBIaXJveXVraSBLYXdha2F0c3UsIFItaGVscCwgMjAwNy0wMy0zMAp0cnkocmVwKGVhY2ggPSAwLCBsZW5ndGgub3V0ID0gMSkpCiMgc2VnZmF1bHRlZCBpbiAyLjQuMQoKCiMjIHJlYWRCaW4gY291bGQgcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiBhIHJhdyB2ZWN0b3IuCiMgSGVucmlrIEJlbmd0c3NvbiwgUmRldmVsLCAyMDA3LTA0LTA3CmJmciA8LSBhcy5yYXcoMToxMikKKHggPC0gcmVhZEJpbihjb249YmZyLCB3aGF0PSJyYXciLCBuPTIwKSkKc3RvcGlmbm90KGxlbmd0aCh4KSA9PSAxMikKKHggPC0gcmVhZEJpbihjb249YmZyLCB3aGF0PSJpbnRlZ2VyIiwgbj0yMCkpCnN0b3BpZm5vdChsZW5ndGgoeCkgPT0gMykKKHggPC0gcmVhZEJpbihjb249YmZyLCB3aGF0PSJpbnRlZ2VyIiwgc2l6ZT00LCBuPTIwKSkKc3RvcGlmbm90KGxlbmd0aCh4KSA9PSAzKQooeCA8LSByZWFkQmluKGNvbj1iZnIsIHdoYXQ9ImludGVnZXIiLCBzaXplPTIsIG49MjApKQpzdG9waWZub3QobGVuZ3RoKHgpID09IDYpCih4IDwtIHJlYWRCaW4oY29uPWJmciwgd2hhdD0iaW50ZWdlciIsIHNpemU9MSwgbj0yMCkpCnN0b3BpZm5vdChsZW5ndGgoeCkgPT0gMTIpCiMjIHJlYWQgdG9vIGZhciB3aGVyZSBzaXplLWNoYW5naW5nIHdhcyBpbnZvbHZlZCBpbiAyLjQueAoKCiMjIGRlbnNpdHkoKSBjb3VsZCBnaXZlIG5lZ2F0aXZlIHZhbHVlcyBieSByb3VuZGluZyBlcnJvciAoUFIjODg3NikKeCA8LSBjKDAuMDA2LCAwLjAwMiwgMC4wMjQsIDAuMDIsIDAuMDM0LCAwLjA5LCAwLjA3NCwgMC4wNzIsIDAuMTIyLAogICAgICAgMC4wNDgsIDAuMDQ0LCAwLjE2OCkKcmVzdWx0IDwtIGRlbnNpdHkoeCwgbiA9IDIwLCBmcm9tID0gLTEsIHRvID0gMSkKc3RvcGlmbm90KHJlc3VsdCR5ID49IDApCiMjIHNsaWdodGx5IG5lZ2F0aXZlIDwgMi41LjAKCgojIyBidy5TSigpIHVzZWQgdG9vIHNtYWxsIHNlYXJjaCBpbnRlcnZhbCBpbiByYXJlIGNhc2VzOgpidy5TSigxOjIwKSAjIGVycm9yOiAibm8gc29sdXRpb24gaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiBiYW5kd2lkdGhzIiBpbiA8IDIuNS4xCiMjIHRoaXMgaXMgbm90IG9rIHdoZW4gY2FsbGVkIGFzICBkZW5zaXR5KDE6MjAsIGJ3ID0gIlNKIikKIyMgW3RoYXQncyBhIG1hdHRlciBvZiBvcGluaW9uLCBzaW5jZSB0aGUgZXhhbXBsZSBpcyByaWRpY3Vsb3VzLl0KCgojIyBoZXhhZGVjaW1hbCBpbnRlZ2VyIGNvbnN0YW50cyBmYWlsZWQgb24gc29tZSBwbGF0Zm9ybXMgKFBSIzk2NDgpCnN0b3BpZm5vdChpZGVudGljYWwoMHgxMEwsIDE2TCkpCiMjIGZpcnN0IHdhcyAwTCBvbiBXaW5kb3dzIGluIDIuNS4wCgoKIyMgcmJpbmQgZmFpbGVkIGlmIHRoZSBvbmx5IGRhdGEgZnJhbWUgaGFkIDAgcm93cyAoUFIjOTY1NykKQSA8LSBkYXRhLmZyYW1lKGZvbz1jaGFyYWN0ZXIoMCksIGJhcj1jaGFyYWN0ZXIoMCkpCnJiaW5kKEEsIGMoZm9vPSJhIiwgYmFyPSJiIikpCiMjIGZhaWxlZCBpbiAyLjUuMAoKCiMjIGZhY3RvcigpIHdpdGggTkEgaW4gZGltbmFtZXMoKToKeCA8LSBtYXRyaXgoMToyLCAyKQpyb3duYW1lcyh4KSA8LSBmYWN0b3IoYygiQSIsIE5BKSkKIyMgc2VnZmF1bHRlZCA8PSAyLjUuMAoKCiMjIHJldHVybiB2YWx1ZSBvZiBtZWRpYW4uCnogPC0gbWVkaWFuKGludGVnZXIoMCkpCnN0b3BpZm5vdChpZGVudGljYWwoeiwgTkFfaW50ZWdlcl8pKQp6IDwtIG1lZGlhbihudW1lcmljKDApKQpzdG9waWZub3QoaWRlbnRpY2FsKHosIE5BX3JlYWxfKSkKIyMgcmV0dXJuZWQgbG9naWNhbCBOQSBpbiAyLjUuMAoKCiMjIHNlcS5pbnQgb24gc21hbGwgcmV2ZXJzZWQgJ2J5JwpzdG9waWZub3QoaW5oZXJpdHModHJ5KHNlcS5pbnQoMS4yLCAxLCBieT0xKSksICJ0cnktZXJyb3IiKSkKIyMgd2FzICcxLjInIGluIDIuNS4wCgoKIyMgc3ViYXNzaWdubWVudCBvbiBwYWlybGlzdHM6IFV3ZSBMaWdnZXMgb24gUi1oZWxwLCAyMDA3LTA1LTI5CkNhbGwgPC0gY2FsbCgicm91bmQiLCAxMC41KQp0cnkoe0NhbGxbXSA8LSBOVUxMOyBDYWxsfSkKIyMgc2VxZ2ZhdWx0ZWQgaW4gMi41LjAKCgojIyBCZXNzZWwgYnVncyBmb3IgbnUgPCAwOgp4IDwtIHNlcSgwLiwgMywgbGVuZ3RoID0gMTAxKQpudSA8LSAtMC40CnN0b3BpZm5vdChhbGwuZXF1YWwoYmVzc2VsSSh4LG51LCBUUlVFKSwKCQkgICAgZXhwKC14KSpiZXNzZWxJKHgsbnUsIEZBTFNFKSwgdG9sID0gMWUtMTMpKQojIyB3cm9uZyBpbiAyLjUuMApzdG9waWZub3QoYWxsLmVxdWFsKGJlc3NlbFkoc2VxKDAuNSwgMywgMC41KSwgbnUpLAoJCSAgICBjKDAuMzA5NTY4NTc3OTQyLCAwLjU2ODg2Njg0NDMzNywgMC42MjYwOTU2MzE5MDcsCgkJICAgICAgMC41NDQwMTM5MDYyNDgsIDAuMzY2MzIxMTUwOTQzLCAwLjE0MTUzMzE4OTI0NiksCgkJICAgIHRvbCA9IDFlLTExKSkKIyMgd3JvbmcgbnVtYmVycyBpbiAyLjUuMAoKIyMjIGVuZCBvZiB0ZXN0cyBhZGRlZCBpbiAyLjUuMSAjIyMKCgojIyByZWdyZXNzaW9uIHRlc3RzIGZvciB1bmxpbmsgYW5kIHdpbGRjYXJkcwpvd2QgPC0gc2V0d2QodGVtcGRpcigpKQpmIDwtIGMoImZ0ZXN0MSIsICJmdGVzdDIiLCAiZnRlc3Rtb3JlIiwgImZ0ZXN0Jm1vcmUiKQpmaWxlLmNyZWF0ZShmKQpzdG9waWZub3QoZmlsZS5leGlzdHMoZikpCnVubGluaygiZnRlc3Q/IikKc3RvcGlmbm90KGZpbGUuZXhpc3RzKGYpID09IGMoRkFMU0UsIEZBTFNFLCBUUlVFLCBUUlVFKSkKdW5saW5rKCJmdGVzdCoiLCByZWN1cnNpdmUgPSBUUlVFKQpzdG9waWZub3QoIWZpbGUuZXhpc3RzKGYpKQoKc3RvcGlmbm90KHVubGluaygibm9fc3VjaF9maWxlIikgPT0gMCkgIyBub3QgYW4gZXJyb3IKCmRkIDwtIGMoImRpcjEiLCAiZGlyMiIsICJkaXJzIiwgIm1vcmVkaXJzIikKZm9yKGQgaW4gZGQpIGRpci5jcmVhdGUoZCkKZGlyKCIuIikKZmlsZS5jcmVhdGUoZmlsZS5wYXRoKGRkLCAic29tZWZpbGUiKSkKZGlyKCIuIiwgcmVjdXJzaXZlPVRSVUUpCnN0b3BpZm5vdCh1bmxpbmsoImRpcj8iKSA9PSAxKSAjIG5vdCBhbiBlcnJvcgp1bmxpbmsoImRpcj8iLCByZWN1cnNpdmUgPSBUUlVFKQpzdG9waWZub3QoZmlsZS5leGlzdHMoZGQpID09IGMoRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSkpCnVubGluaygiKmRpcioiLCByZWN1cnNpdmUgPSBUUlVFKQpzdG9waWZub3QoIWZpbGUuZXhpc3RzKGRkKSkKCiMgV2luZG93cyBuZWVkcyBzaG9ydCBwYXRoIG5hbWVzIGZvciBsZWFkaW5nIHNwYWNlcwpkaXIuY3JlYXRlKCIgdGVzdCIpCmRpcigiLiIsIHJlY3Vyc2l2ZT1UUlVFKQp1bmxpbmsoIiB0ZXN0IiwgcmVjdXJzaXZlID0gVFJVRSkKc3RvcGlmbm90KCFmaWxlLmV4aXN0cygiIHRlc3QiKSkKc2V0d2Qob3dkKQojIyB3aWxkY2FyZHMgd2VyZSBicm9rZW4gaW4gMi41LjAgb24gVW5peCwgYW5kIGFsd2F5cyBvbiBXaW5kb3dzCgoKIyMgZHVwbGljYXRlZCBjb2x1bW5zIGluIGEgZGF0YSBmcmFtZQp4IDwtIG1hdHJpeChzZXEoMToxMiksbmNvbD0zKQpjb2xuYW1lcyh4KSA8LSBjKCJBIiwiQiIsIkEiKSAgICNhIHJlZHVuZGFudCBuYW1lIGZvciBjb2x1bW4gMgp4LmRmIDwtIGFzLmRhdGEuZnJhbWUoeCkKc3RvcGlmbm90KHguZGZbNCwzXSA9PSB4WzQsM10pCiMjIHdyb25nIGNvbHVtbiBpbiAyLjUuMAoKCiMjIGl0IHJlYWxseSBpcyB1bmNsZWFyIGlmIHRoaXMgc2hvdWxkIHdvcmsgYXMgdGhlIGZpdCBpcyB0byBhCiMjIG51bWVyaWMgdmFyaWFibGUgd2l0aCBsZXZlbHMsIGFuZCB0aGUgcHJlZGljdGlvbiBkb2VzIG5vdCBoYXZlCiMjIGxldmVscy4gIEJ1dCBzb21lIHBlb3BsZSBleHBlY3RlZCBpdCB0by4Kd29ybXMgPC0gZGF0YS5mcmFtZShzZXg9Z2woMiw2KSwgRG9zZT1mYWN0b3IocmVwKDJeKDA6NSksMikpLAogICAgICAgICAgICAgICAgICAgIGRlYXRocz1jKDEsNCw5LDEzLDE4LDIwLDAsMiw2LDEwLDEyLDE2KSkKd29ybXMkZG9zZWxpbiA8LSB1bmNsYXNzKHdvcm1zJERvc2UpCndvcm1zLmdsbSA8LSBnbG0oY2JpbmQoZGVhdGhzLCAoMjAtZGVhdGhzKSkgfiBzZXgrIGRvc2VsaW4sCiAgICAgICAgICAgICAgICAgZGF0YT13b3JtcywgZmFtaWx5PWJpbm9taWFsKQpwcmVkaWN0KHdvcm1zLmdsbSwgbmV3PWRhdGEuZnJhbWUoc2V4PSIxIiwgZG9zZWxpbj02KSkKIyMgZmFpbGVkIDwgMi42LjAKCgojIyByZWdyZXNzaW9uIHRlc3QgZm9yIGNoYW5nZXMgaW4gYWdncmVnYXRlLmRhdGEuZnJhbWUKeiA8LSBhZ2dyZWdhdGUoc3RhdGUueDc3LAogICAgICAgICAgICAgICBsaXN0KFJlZ2lvbiA9IHN0YXRlLnJlZ2lvbiwKICAgICAgICAgICAgICAgICAgICBDb2xkID0gc3RhdGUueDc3WywiRnJvc3QiXSA+IDEzMCksCiAgICAgICAgICAgICAgIG1lYW4pCnN0b3BpZm5vdChzYXBwbHkoeiwgY2xhc3MpWzE6Ml0gPT0gYygiZmFjdG9yIiwgImxvZ2ljYWwiKSwKICAgICAgICAgIGlkZW50aWNhbChsZXZlbHMoeltbMV1dKSwgbGV2ZWxzKHN0YXRlLnJlZ2lvbikpICkKZjEgPC0gYygiYSIsImIiLCJhIiwiYiIpCmYyIDwtIGZhY3RvcihmMSwgbGV2ZWxzPWMoImIiLCJjIiwiYSIpLCBvcmRlcmVkPVRSVUUpCnogPC0gYWdncmVnYXRlKDE6NCwgbGlzdChncm91cHM9ZjEpLCBzdW0pCnN0b3BpZm5vdChzYXBwbHkoeiwgY2xhc3MpID09IGMoImNoYXJhY3RlciIsICJpbnRlZ2VyIikpCnogPC0gYWdncmVnYXRlKDE6NCwgbGlzdChncm91cHM9ZjIpLCBzdW0pCnN0b3BpZm5vdChpZGVudGljYWwoc2FwcGx5KHosIGNsYXNzKSwgbGlzdChncm91cHM9Y2xhc3MoZjIpLCB4PSJpbnRlZ2VyIikpLAogICAgICAgICAgaWRlbnRpY2FsKGxldmVscyh6W1sxXV0pLCBsZXZlbHMoZjIpKSwKICAgICAgICAgIGlzLm9yZGVyZWQoeltbMV1dKSApCiMjIGNvbnZlcnRlZCB0byBmYWN0b3JzIDwgMi42LjAKCgojIyBmb3JtYWxzPC0gb24gZnVuY3Rpb24gd2l0aCBOVUxMIGJvZHkgKFBSIzk3NTgpCmYgPC0gZnVuY3Rpb24oKSBOVUxMCmcgPC0gYWxpc3QoYT0sIGI9NCwgYz0pCmZvcm1hbHMoZikgPC0gZwojIGlkZW50aWNhbChmb3JtYWxzKGYpLCBnKSBpcyBmYWxzZSBhcyBnIGhhcyAuTmFtZXMgYXR0cmlidXRlCnN0b3BpZm5vdChpcy5udWxsKGJvZHkoZikpLCBpZGVudGljYWwobmFtZXMoZm9ybWFscyhmKSksIG5hbWVzKGcpKSkKIyMgd2FzIGZ1bmN0aW9uKGEsIGI9NCkgIGJlZm9yZSAyLjYuMAoKCiMjIHN1YnNldHRpbmcgUi52ZXJzaW9uCnN0b3BpZm5vdChpZGVudGljYWwoInNpbXBsZS5saXN0IiwgY2xhc3MoUi52ZXJzaW9uWzE6N10pKSkKCgojIyA8ZGF0YSBmcmFtZT5bWzxjaGFyYWN0ZXI+LCBqXV0Kc3dpc3NbWyJCcm95ZSIsICJBZ3JpY3VsdHVyZSJdXQpzd2lzc1tbNywgIkFncmljdWx0dXJlIl1dCnN3aXNzW1siQnJveWUiLCAyXV0Kc3dpc3NbWzcsIDJdXQojIyBmaXJzdCBhbmQgdGhpcmQgZmFpbGVkIDwgMi42LjAKCgojIyBsb2FkIG9mIHJhdyB2ZWN0b3IgZnJvbSBBU0NJSSBzYXZlCnMxIDwtICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgMTIzIgpyMCA8LSByMSA8LSBjaGFyVG9SYXcoczEpCnNhdmUocjEsIGZpbGU9InIxLWFzY2lpLnJkYSIsIGFzY2lpPVRSVUUpCnNhdmUocjEsIGZpbGU9InIxLnJkYSIsIGFzY2lpPUZBTFNFKQpybShyMSkjIHJlYWxseSBwcm92ZS4uLgpsb2FkKCJyMS5yZGEiKQp1bmxpbmsoInIxLnJkYSIpCnN0b3BpZm5vdChpZGVudGljYWwocjEsIHIwKSkKIyB3YXMgT0ssIGJ1dCBhZGQgcmVncmVzc2lvbiB0ZXN0CmxvYWQoInIxLWFzY2lpLnJkYSIpCnVubGluaygicjEtYXNjaWkucmRhIikKc3RvcGlmbm90KGlkZW50aWNhbChyMSwgcjApKQojIyB3cm9uZyA8IDIuNS4xIHBhdGNoZWQKCgojIyBtYXRjaC5hcmcgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgKFBSIzk4NTkpCnggPC0gbGV0dGVyc1sxOjNdCnkgPC0gYygnYWEnLCdiYicpCnRyeShtYXRjaC5hcmcoeCx5KSkgIyBnYXZlIHNwdXJpb3VzIHdhcm5pbmcKcmVzIDwtIG1hdGNoLmFyZyh4LHksIHNldmVyYWwub2sgPSBUUlVFKSAjIGVycm9yCnN0b3BpZm5vdChpZGVudGljYWwocmVzLCB5KSkKIyMgZmFpbGVkIGluIDIuNS4xCgoKIyMgc3dlZXAoKSBtdXN0IHdvcmsgd2l0aCAwLWV4dGVudCBtYXRyaXgvU1RBVFMgOgptIDwtIG1hdHJpeCgxOjUsIDUsMCkKc3RvcGlmbm90KGlkZW50aWNhbChtLCBzd2VlcChtLCAyLCBhcHBseShtLDIsIG1pbikpKSkKIyMgZmFpbGVkIGluIFItZGV2ZWwgYXJvdW5kIDIwMDctMDgtMzEKCgojIyBqdWxpYW4gd2l0aCBQT1NJWGx0IG9yaWdpbiAoUFIjOTkwOCkKanVsaWFuKGFzLlBPU0lYbHQoIjE5OTktMi0xIiksIG9yaWdpbj1hcy5QT1NJWGx0KCIxOTk5LTEtMSIpKQojIyBmYWlsZWQgPCAyLjYuMAoKIyMjIGNvbnRpbnVlZCBpbiByZWctdGVzdHMtMWIuUiAjIyMKCnByb2MudGltZSgpCg==