IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KCmZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CmltcG9ydCBtYXJzaGFsCmltcG9ydCBzeXMKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBvcwoKY2xhc3MgSW50VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfaW50cyhzZWxmKToKICAgICAgICAjIFRlc3QgdGhlIGZ1bGwgcmFuZ2Ugb2YgUHl0aG9uIGludHMuCiAgICAgICAgbiA9IHN5cy5tYXhpbnQKICAgICAgICB3aGlsZSBuOgogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToKICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGV4cGVjdGVkKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQogICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGV4cGVjdGVkLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCiAgICAgICAgICAgIG4gPSBuID4+IDEKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9pbnQ2NChzZWxmKToKICAgICAgICAjIFNpbXVsYXRlIGludCBtYXJzaGFsaW5nIG9uIGEgNjQtYml0IGJveC4gIFRoaXMgaXMgbW9zdCBpbnRlcmVzdGluZyBpZgogICAgICAgICMgd2UncmUgcnVubmluZyB0aGUgdGVzdCBvbiBhIDMyLWJpdCBib3gsIG9mIGNvdXJzZS4KCiAgICAgICAgZGVmIHRvX2xpdHRsZV9lbmRpYW5fc3RyaW5nKHZhbHVlLCBuYnl0ZXMpOgogICAgICAgICAgICBieXRlcyA9IFtdCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5ieXRlcyk6CiAgICAgICAgICAgICAgICBieXRlcy5hcHBlbmQoY2hyKHZhbHVlICYgMHhmZikpCiAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gOAogICAgICAgICAgICByZXR1cm4gJycuam9pbihieXRlcykKCiAgICAgICAgbWF4aW50NjQgPSAoMUwgPDwgNjMpIC0gMQogICAgICAgIG1pbmludDY0ID0gLW1heGludDY0LTEKCiAgICAgICAgZm9yIGJhc2UgaW4gbWF4aW50NjQsIG1pbmludDY0LCAtbWF4aW50NjQsIC0obWluaW50NjQgPj4gMSk6CiAgICAgICAgICAgIHdoaWxlIGJhc2U6CiAgICAgICAgICAgICAgICBzID0gJ0knICsgdG9fbGl0dGxlX2VuZGlhbl9zdHJpbmcoYmFzZSwgOCkKICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgZ290KQogICAgICAgICAgICAgICAgaWYgYmFzZSA9PSAtMTogICMgYSBmaXhlZC1wb2ludCBmb3Igc2hpZnRpbmcgcmlnaHQgMQogICAgICAgICAgICAgICAgICAgIGJhc2UgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJhc2UgPj49IDEKCiAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgogICAgICAgIGZvciBiIGluIChUcnVlLCBGYWxzZSk6CiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBuZXcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShiKSwgdHlwZShuZXcpKQogICAgICAgICAgICBtYXJzaGFsLmR1bXAoYiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgbmV3KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYiksIHR5cGUobmV3KSkKCmNsYXNzIEZsb2F0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgogICAgICAgICMgVGVzdCBhIGZldyBmbG9hdHMKICAgICAgICBzbWFsbCA9IDFlLTI1CiAgICAgICAgbiA9IHN5cy5tYXhpbnQgKiAzLjdlMjUwCiAgICAgICAgd2hpbGUgbiA+IHNtYWxsOgogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToKICAgICAgICAgICAgICAgIGYgPSBmbG9hdChleHBlY3RlZCkKICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKICAgICAgICAgICAgbiAvPSAxMjMuNDU2NwoKICAgICAgICBmID0gMC4wCiAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMikKICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCiAgICAgICAgIyBhbmQgd2l0aCB2ZXJzaW9uIDw9IDEgKGZsb2F0cyBtYXJzaGFsbGVkIGRpZmZlcmVudGx5IHRoZW4pCiAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMSkKICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCgogICAgICAgIG4gPSBzeXMubWF4aW50ICogMy43ZS0yNTAKICAgICAgICB3aGlsZSBuIDwgc21hbGw6CiAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgogICAgICAgICAgICAgICAgZiA9IGZsb2F0KGV4cGVjdGVkKQoKICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKCiAgICAgICAgICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmLCAxKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCgogICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGYsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQoKICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpLCAxKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKICAgICAgICAgICAgbiAqPSAxMjMuNDU2NwogICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQoKY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKICAgICAgICBmb3IgcyBpbiBbdSIiLCB1IkFuZHLoIFByZXZpbiIsIHUiYWJjIiwgdSIgIioxMDAwMF06CiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQogICAgICAgICAgICBtYXJzaGFsLmR1bXAocywgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CiAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQogICAgICAgICAgICBtYXJzaGFsLmR1bXAocywgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CiAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CiAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKICAgICAgICAgICAgICAgIGIgPSBidWZmZXIocykKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGIpKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCmNsYXNzIEV4Y2VwdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKFN0b3BJdGVyYXRpb24pKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU3RvcEl0ZXJhdGlvbiwgbmV3KQoKY2xhc3MgQ29kZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2NvZGUoc2VsZik6CiAgICAgICAgY28gPSBFeGNlcHRpb25UZXN0Q2FzZS50ZXN0X2V4Y2VwdGlvbnMuZnVuY19jb2RlCiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGNvKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLCBuZXcpCgpjbGFzcyBDb250YWluZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkID0geydhc3RyaW5nJzogJ2Zvb0BiYXIuYmF6LnNwYW0nLAogICAgICAgICAnYWZsb2F0JzogNzI4My40MywKICAgICAgICAgJ2FuaW50JzogMioqMjAsCiAgICAgICAgICdhc2hvcnRsb25nJzogMkwsCiAgICAgICAgICdhbGlzdCc6IFsnLnp5eC40MSddLAogICAgICAgICAnYXR1cGxlJzogKCcuenl4LjQxJywpKjEwLAogICAgICAgICAnYWJvb2xlYW4nOiBGYWxzZSwKICAgICAgICAgJ2F1bmljb2RlJzogdSJBbmRy6CBQcmV2aW4iCiAgICAgICAgIH0KICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHNlbGYuZCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQsIG5ldykKICAgICAgICBtYXJzaGFsLmR1bXAoc2VsZi5kLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLCBuZXcpCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCgogICAgZGVmIHRlc3RfbGlzdChzZWxmKToKICAgICAgICBsc3QgPSBzZWxmLmQuaXRlbXMoKQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhsc3QpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBuZXcpCiAgICAgICAgbWFyc2hhbC5kdW1wKGxzdCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgbmV3KQogICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQoKICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgogICAgICAgIHQgPSB0dXBsZShzZWxmLmQua2V5cygpKQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyh0KSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKICAgICAgICBtYXJzaGFsLmR1bXAodCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9zZXRzKHNlbGYpOgogICAgICAgIGZvciBjb25zdHJ1Y3RvciBpbiAoc2V0LCBmcm96ZW5zZXQpOgogICAgICAgICAgICB0ID0gY29uc3RydWN0b3Ioc2VsZi5kLmtleXMoKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobmV3LCBjb25zdHJ1Y3RvcikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQodCksIGlkKG5ldykpCiAgICAgICAgICAgIG1hcnNoYWwuZHVtcCh0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCiAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQoKY2xhc3MgQnVnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2J1Z181ODg4NDUyKHNlbGYpOgogICAgICAgICMgU2ltcGxlLW1pbmRlZCBjaGVjayBmb3IgU0YgNTg4NDUyOiBEZWJ1ZyBidWlsZCBjcmFzaGVzCiAgICAgICAgbWFyc2hhbC5kdW1wcyhbMTI4XSAqIDEwMDApCgogICAgZGVmIHRlc3RfcGF0Y2hfODczMjI0KHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgJzAnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgJ2YnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgbWFyc2hhbC5kdW1wcyg1TClbOi0xXSkKCiAgICBkZWYgdGVzdF92ZXJzaW9uX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICMgUHl0aG9uIDIuNC4wIGNyYXNoZXMgZm9yIGFueSBjYWxsIHRvIG1hcnNoYWwuZHVtcHMoeCwgeSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyg1LCAwKSksIDUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoNSwgMSkpLCA1KQoKICAgIGRlZiB0ZXN0X2Z1enooc2VsZik6CiAgICAgICAgIyBzaW1wbGUgdGVzdCB0aGF0IGl0J3MgYXQgbGVhc3Qgbm90ICp0b3RhbGx5KiB0cml2aWFsIHRvCiAgICAgICAgIyBjcmFzaCBmcm9tIGJhZCBtYXJzaGFsIGRhdGEKICAgICAgICBmb3IgYyBpbiBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtYXJzaGFsLmxvYWRzKGMpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCgogICAgZGVmIHRlc3RfbG9hZHNfcmVjdXJzaW9uKHNlbGYpOgogICAgICAgIHMgPSAnYycgKyAoJ1gnICogNCo0KSArICd7JyAqIDIqKjIwCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5sb2FkcywgcykKCiAgICBkZWYgdGVzdF9yZWN1cnNpb25fbGltaXQoc2VsZik6CiAgICAgICAgIyBDcmVhdGUgYSBkZWVwbHkgbmVzdGVkIHN0cnVjdHVyZS4KICAgICAgICBoZWFkID0gbGFzdCA9IFtdCiAgICAgICAgIyBUaGUgbWF4IHN0YWNrIGRlcHRoIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUgaW4gUHl0aG9uL21hcnNoYWwuYy4KICAgICAgICBNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCA9IDIwMDAKICAgICAgICBmb3IgaSBpbiByYW5nZShNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCAtIDIpOgogICAgICAgICAgICBsYXN0LmFwcGVuZChbMF0pCiAgICAgICAgICAgIGxhc3QgPSBsYXN0Wy0xXQoKICAgICAgICAjIFZlcmlmeSB3ZSBkb24ndCBibG93IG91dCB0aGUgc3RhY2sgd2l0aCBkdW1wcy9sb2FkLgogICAgICAgIGRhdGEgPSBtYXJzaGFsLmR1bXBzKGhlYWQpCiAgICAgICAgbmV3X2hlYWQgPSBtYXJzaGFsLmxvYWRzKGRhdGEpCiAgICAgICAgIyBEb24ndCB1c2UgPT0gdG8gY29tcGFyZSBvYmplY3RzLCBpdCBjYW4gZXhjZWVkIHRoZSByZWN1cnNpb24gbGltaXQuCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2hlYWQpLCBsZW4oaGVhZCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2hlYWRbMF0pLCBsZW4oaGVhZFswXSkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2hlYWRbLTFdKSwgbGVuKGhlYWRbLTFdKSkKCiAgICAgICAgbGFzdC5hcHBlbmQoWzBdKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwuZHVtcHMsIGhlYWQpCgogICAgZGVmIHRlc3RfZXhhY3RfdHlwZV9tYXRjaChzZWxmKToKICAgICAgICAjIEZvcm1lciBidWc6CiAgICAgICAgIyAgID4+PiBjbGFzcyBJbnQoaW50KTogcGFzcwogICAgICAgICMgICA+Pj4gdHlwZShsb2FkcyhkdW1wcyhJbnQoKSkpKQogICAgICAgICMgICA8dHlwZSAnaW50Jz4KICAgICAgICBmb3IgdHlwIGluIChpbnQsIGxvbmcsIGZsb2F0LCBjb21wbGV4LCB0dXBsZSwgbGlzdCwgZGljdCwgc2V0LCBmcm96ZW5zZXQpOgogICAgICAgICAgICAjIE5vdGU6IHN0ciBhbmQgdW5pY29kZSBzdWJjbGFzc2VzIGFyZSBub3QgdGVzdGVkIGJlY2F1c2UgdGhleSBnZXQgaGFuZGxlZAogICAgICAgICAgICAjIGJ5IG1hcnNoYWwncyByb3V0aW5lcyBmb3Igb2JqZWN0cyBzdXBwb3J0aW5nIHRoZSBidWZmZXIgQVBJLgogICAgICAgICAgICBzdWJ0eXAgPSB0eXBlKCdzdWJ0eXAnLCAodHlwLCksIHt9KQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmR1bXBzLCBzdWJ0eXAoKSkKCiAgICAjIElzc3VlICMxNzkyIGludHJvZHVjZWQgYSBjaGFuZ2UgaW4gaG93IG1hcnNoYWwgaW5jcmVhc2VzIHRoZSBzaXplIG9mIGl0cwogICAgIyBpbnRlcm5hbCBidWZmZXI7IHRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgdGhlIG5ldyBjb2RlIGlzIGV4ZXJjaXNlZC4KICAgIGRlZiB0ZXN0X2xhcmdlX21hcnNoYWwoc2VsZik6CiAgICAgICAgc2l6ZSA9IGludCgxZTYpCiAgICAgICAgdGVzdFN0cmluZyA9ICdhYmMnICogc2l6ZQogICAgICAgIG1hcnNoYWwuZHVtcHModGVzdFN0cmluZykKCiAgICBkZWYgdGVzdF9pbnZhbGlkX2xvbmdzKHNlbGYpOgogICAgICAgICMgSXNzdWUgIzcwMTk6IG1hcnNoYWwubG9hZHMgc2hvdWxkbid0IHByb2R1Y2UgdW5ub3JtYWxpemVkIFB5TG9uZ3MKICAgICAgICBpbnZhbGlkX3N0cmluZyA9ICdsXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5sb2FkcywgaW52YWxpZF9zdHJpbmcpCgpMQVJHRV9TSVpFID0gMioqMzEKY2hhcmFjdGVyX3NpemUgPSA0IGlmIHN5cy5tYXh1bmljb2RlID4gMHhGRkZGIGVsc2UgMgpwb2ludGVyX3NpemUgPSA4IGlmIHN5cy5tYXhzaXplID4gMHhGRkZGRkZGRiBlbHNlIDQKCkB1bml0dGVzdC5za2lwSWYoTEFSR0VfU0laRSA+IHN5cy5tYXhzaXplLCAidGVzdCBjYW5ub3QgcnVuIG9uIDMyLWJpdCBzeXN0ZW1zIikKY2xhc3MgTGFyZ2VWYWx1ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgY2hlY2tfdW5tYXJzaGFsbGFibGUoc2VsZiwgZGF0YSk6CiAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdF9zdXBwb3J0LnVubGluaywgdGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICB3aXRoIGY6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwuZHVtcCwgZGF0YSwgZikKCiAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmLCBzaXplKToKICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKCd4JyAqIHNpemUpCgogICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKICAgICAgICAgICAgbWVtdXNlPWNoYXJhY3Rlcl9zaXplLCBkcnlfcnVuPUZhbHNlKQogICAgZGVmIHRlc3RfdW5pY29kZShzZWxmLCBzaXplKToKICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKHUneCcgKiBzaXplKQoKICAgIEB0ZXN0X3N1cHBvcnQucHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPUxBUkdFX1NJWkUsCiAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUsIGRyeV9ydW49RmFsc2UpCiAgICBkZWYgdGVzdF90dXBsZShzZWxmLCBzaXplKToKICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKChOb25lLCkgKiBzaXplKQoKICAgIEB0ZXN0X3N1cHBvcnQucHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPUxBUkdFX1NJWkUsCiAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUsIGRyeV9ydW49RmFsc2UpCiAgICBkZWYgdGVzdF9saXN0KHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoW05vbmVdICogc2l6ZSkKCiAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAogICAgICAgICAgICBtZW11c2U9cG9pbnRlcl9zaXplKjEyICsgc3lzLmdldHNpemVvZihMQVJHRV9TSVpFLTEpLAogICAgICAgICAgICBkcnlfcnVuPUZhbHNlKQogICAgZGVmIHRlc3Rfc2V0KHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoc2V0KHJhbmdlKHNpemUpKSkKCiAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAogICAgICAgICAgICBtZW11c2U9cG9pbnRlcl9zaXplKjEyICsgc3lzLmdldHNpemVvZihMQVJHRV9TSVpFLTEpLAogICAgICAgICAgICBkcnlfcnVuPUZhbHNlKQogICAgZGVmIHRlc3RfZnJvemVuc2V0KHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoZnJvemVuc2V0KHJhbmdlKHNpemUpKSkKCiAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKICAgIGRlZiB0ZXN0X2J5dGVhcnJheShzZWxmLCBzaXplKToKICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKGJ5dGVhcnJheShzaXplKSkKCgpkZWYgdGVzdF9tYWluKCk6CiAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEludFRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdENhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z3NUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFyZ2VWYWx1ZXNUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdF9tYWluKCkK