ZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX19pbml0X18ucHkgYi9MaWIvY3R5cGVzL19faW5pdF9fLnB5CmluZGV4IGUyYTA1NzMuLmY4YjJkNzUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvX19pbml0X18ucHkKKysrIGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQpAQCAtMjM0LDcgKzIzNCw3IEBACiBfY2hlY2tfc2l6ZShjX3ZvaWRfcCkKIAogY2xhc3MgY19ib29sKF9TaW1wbGVDRGF0YSk6Ci0JX3R5cGVfID0gInQiCisgICAgX3R5cGVfID0gInQiCiAKICMgVGhpcyBjYWNoZSBtYXBzIHR5cGVzIHRvIHBvaW50ZXJzIHRvIHRoZW0uCiBfcG9pbnRlcl90eXBlX2NhY2hlID0ge30KZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5CmluZGV4IDVjZDNjOTQuLmVhZDM2MDUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weQpAQCAtNjksNyArNjksNyBAQAogICAgICAgICBmb3IgdCwgKGwsIGgpIGluIHppcChzaWduZWRfdHlwZXMsIHNpZ25lZF9yYW5nZXMpOgogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChsKS52YWx1ZSwgbCkKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoaCkudmFsdWUsIGgpCi0gICAgCisKICAgICBkZWYgdGVzdF9ib29sX3ZhbHVlcyhzZWxmKToKICAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgdHJ1dGgKICAgICAgICAgZm9yIHQsIHYgaW4gemlwKGJvb2xfdHlwZXMsIGJvb2xfdmFsdWVzKToKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiAgICAgICAgIGFbMF0gPSAnPycKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi52YWx1ZSwgYVswXSkKLSAgICAKKwogICAgICMgYXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBjX2Jvb2wgLyAndCcKICAgICAjIGRlZiB0ZXN0X2Jvb2xfZnJvbV9hZGRyZXNzKHNlbGYpOgogICAgICMgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2Jvb2wKZGlmZiAtLWdpdCBhL0xpYi9kZWNpbWFsLnB5IGIvTGliL2RlY2ltYWwucHkKaW5kZXggYzIyMTM3ZS4uZjY1MTkzNSAxMDA2NDQKLS0tIGEvTGliL2RlY2ltYWwucHkKKysrIGIvTGliL2RlY2ltYWwucHkKQEAgLTI2MzEsNyArMjYzMSw3IEBACiAgICAgICAgIDEpIGJlZm9yZSB1c2UuCiAKICAgICAgICAgSWYgdGhlIGluY3JlYXNlZCBwcmVjaXNpb24gbmVlZGVkIGZvciB0aGUgaW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotICAgICAgICBleGNlZWRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRoZW4gYW4gSW52YWxpZCAKKyAgICAgICAgZXhjZWVkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGVuIGFuIEludmFsaWQKICAgICAgICAgb3BlcmF0aW9uIGNvbmRpdGlvbiBpcyByYWlzZWQuCiAKICAgICAgICAgSWYsIHdoZW4gcmFpc2luZyB0byBhIG5lZ2F0aXZlIHBvd2VyLCBhbiB1bmRlcmZsb3cgb2NjdXJzIGR1cmluZyB0aGUKQEAgLTI3MjUsNyArMjcyNSw3IEBACiAKICAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGUgcmVzaWR1ZSBvZiB0aGUgZGl2aWRlbmQgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBvZgogICAgICAgICBjYWxjdWxhdGluZyBpbnRlZ2VyIGRpdmlzaW9uIGFzIGRlc2NyaWJlZCBmb3IgZGl2aWRlLWludGVnZXIsIHJvdW5kZWQKLSAgICAgICAgdG8gcHJlY2lzaW9uIGRpZ2l0cyBpZiBuZWNlc3NhcnkuICBUaGUgc2lnbiBvZiB0aGUgcmVzdWx0LCBpZiAKKyAgICAgICAgdG8gcHJlY2lzaW9uIGRpZ2l0cyBpZiBuZWNlc3NhcnkuICBUaGUgc2lnbiBvZiB0aGUgcmVzdWx0LCBpZgogICAgICAgICBub24temVybywgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgb3JpZ2luYWwgZGl2aWRlbmQuCiAKICAgICAgICAgVGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgaW50ZWdlciBkaXZpc2lvbgpAQCAtMjkyOSw3ICsyOTI5LDcgQEAKICAgICAgICAgaWYgbnVtZGlnaXRzID4gKG90aGVyX2xlbiArIHByZWMgKyAxIC0gdG1wX2xlbik6CiAgICAgICAgICAgICAjIElmIHRoZSBkaWZmZXJlbmNlIGluIGFkanVzdGVkIGV4cHMgaXMgPiBwcmVjKzEsIHdlIGtub3cKICAgICAgICAgICAgICMgb3RoZXIgaXMgaW5zaWduaWZpY2FudCwgc28gbWlnaHQgYXMgd2VsbCBwdXQgYSAxIGFmdGVyIHRoZQotICAgICAgICAgICAgIyBwcmVjaXNpb24gKHNpbmNlIHRoaXMgaXMgb25seSBmb3IgYWRkaXRpb24pLiAgQWxzbyBzdG9wcyAKKyAgICAgICAgICAgICMgcHJlY2lzaW9uIChzaW5jZSB0aGlzIGlzIG9ubHkgZm9yIGFkZGl0aW9uKS4gIEFsc28gc3RvcHMKICAgICAgICAgICAgICMgdXNlIG9mIG1hc3NpdmUgbG9uZ3MuCiAKICAgICAgICAgICAgIGV4dGVuZCA9IHByZWMgKyAyIC0gdG1wX2xlbgpAQCAtMzA5OCw3ICszMDk4LDcgQEAKIAogZGVmIF9zdHJpbmcyZXhhY3Qocyk6CiAgICAgIiIiUmV0dXJuIHNpZ24sIG4sIHAgcy50LgotICAgIAorCiAgICAgRmxvYXQgc3RyaW5nIHZhbHVlID09IC0xKipzaWduICogbiAqIDEwKipwIGV4YWN0bHkKICAgICAiIiIKICAgICBtID0gX3BhcnNlcihzKQpkaWZmIC0tZ2l0IGEvTGliL2Z0cGxpYi5weSBiL0xpYi9mdHBsaWIucHkKaW5kZXggMDEyNjcxYi4uZjliNjM5NiAxMDA2NDQKLS0tIGEvTGliL2Z0cGxpYi5weQorKysgYi9MaWIvZnRwbGliLnB5CkBAIC04NCw3ICs4NCw3IEBACiAgICAgbWVhbmluZyB0aGF0IG5vIHRpbWVvdXQgd2lsbCBiZSBzZXQgb24gYW55IGZ0cCBzb2NrZXQocykKICAgICBJZiBhIHRpbWVvdXQgaXMgcGFzc2VkLCB0aGVuIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGFsbCBmdHAKICAgICBzb2NrZXQgb3BlcmF0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZS4KLSAgICAKKwogICAgIFRoZW4gdXNlIHNlbGYuY29ubmVjdCgpIHdpdGggb3B0aW9uYWwgaG9zdCBhbmQgcG9ydCBhcmd1bWVudC4KIAogICAgIFRvIGRvd25sb2FkIGEgZmlsZSwgdXNlIGZ0cC5yZXRybGluZXMoJ1JFVFIgJyArIGZpbGVuYW1lKSwKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgIGlmIGhvc3Q6CiAgICAgICAgICAgICBzZWxmLmNvbm5lY3QoaG9zdCkKLSAgICAgICAgICAgIGlmIHVzZXI6IAorICAgICAgICAgICAgaWYgdXNlcjoKICAgICAgICAgICAgICAgICBzZWxmLmxvZ2luKHVzZXIsIHBhc3N3ZCwgYWNjdCkKIAogICAgIGRlZiBjb25uZWN0KHNlbGYsIGhvc3Q9JycsIHBvcnQ9MCwgdGltZW91dD1Ob25lKToKZGlmZiAtLWdpdCBhL0xpYi9wZGIucHkgYi9MaWIvcGRiLnB5CmluZGV4IDRiNWQxYjEuLjQ2OGIxZDMgMTAwNzU1Ci0tLSBhL0xpYi9wZGIucHkKKysrIGIvTGliL3BkYi5weQpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKICAgICBkZWYgX3J1bnNjcmlwdChzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgICMgVGhlIHNjcmlwdCBoYXMgdG8gcnVuIGluIF9fbWFpbl9fIG5hbWVzcGFjZSAob3IgaW1wb3J0cyBmcm9tCiAgICAgICAgICMgX19tYWluX18gd2lsbCBicmVhaykuCi0gICAgICAgICMgCisgICAgICAgICMKICAgICAgICAgIyBTbyB3ZSBjbGVhciB1cCB0aGUgX19tYWluX18gYW5kIHNldCBzZXZlcmFsIHNwZWNpYWwgdmFyaWFibGVzCiAgICAgICAgICMgKHRoaXMgZ2V0cyByaWQgb2YgcGRiJ3MgZ2xvYmFscyBhbmQgY2xlYW5zIG9sZCB2YXJpYWJsZXMgb24gcmVzdGFydHMpLgogICAgICAgICBpbXBvcnQgX19tYWluX18KQEAgLTExNTgsNyArMTE1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZmlsZV9fIiAgICA6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2J1aWx0aW5zX18iOiBfX2J1aWx0aW5zX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAKKwogICAgICAgICAjIFdoZW4gYmRiIHNldHMgdHJhY2luZywgYSBudW1iZXIgb2YgY2FsbCBhbmQgbGluZSBldmVudHMgaGFwcGVucwogICAgICAgICAjIEJFRk9SRSBkZWJ1Z2dlciBldmVuIHJlYWNoZXMgdXNlcidzIGNvZGUgKGFuZCB0aGUgZXhhY3Qgc2VxdWVuY2Ugb2YKICAgICAgICAgIyBldmVudHMgZGVwZW5kcyBvbiBweXRob24gdmVyc2lvbikuIFNvIHdlIHRha2Ugc3BlY2lhbCBtZWFzdXJlcyB0bwpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKICAgICAgICAgc2VsZi5tYWlucHlmaWxlID0gc2VsZi5jYW5vbmljKGZpbGVuYW1lKQogICAgICAgICBzZWxmLl91c2VyX3JlcXVlc3RlZF9xdWl0ID0gMAogICAgICAgICBzdGF0ZW1lbnQgPSAnZXhlY2ZpbGUoICIlcyIpJyAlIGZpbGVuYW1lCi0gICAgICAgIHNlbGYucnVuKHN0YXRlbWVudCkgCisgICAgICAgIHNlbGYucnVuKHN0YXRlbWVudCkKIAogIyBTaW1wbGlmaWVkIGludGVyZmFjZQogCmRpZmYgLS1naXQgYS9MaWIvcG9zaXhwYXRoLnB5IGIvTGliL3Bvc2l4cGF0aC5weQppbmRleCA5MTE3MjA4Li42ZjE1ZDQ4IDEwMDY0NAotLS0gYS9MaWIvcG9zaXhwYXRoLnB5CisrKyBiL0xpYi9wb3NpeHBhdGgucHkKQEAgLTM4OCwxMCArMzg4LDEwIEBACiAKICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gcGF0aCBzcGVjaWZpZWQiKQotICAgIAorCiAgICAgc3RhcnRfbGlzdCA9IGFic3BhdGgoc3RhcnQpLnNwbGl0KHNlcCkKICAgICBwYXRoX2xpc3QgPSBhYnNwYXRoKHBhdGgpLnNwbGl0KHNlcCkKLSAgICAKKwogICAgICMgV29yayBvdXQgaG93IG11Y2ggb2YgdGhlIGZpbGVwYXRoIGlzIHNoYXJlZCBieSBzdGFydCBhbmQgcGF0aC4KICAgICBpID0gbGVuKGNvbW1vbnByZWZpeChbc3RhcnRfbGlzdCwgcGF0aF9saXN0XSkpCiAKZGlmZiAtLWdpdCBhL0xpYi9zb2NrZXQucHkgYi9MaWIvc29ja2V0LnB5CmluZGV4IGMwM2U4ODQuLjQ0OTBmYzQgMTAwNjQ0Ci0tLSBhL0xpYi9zb2NrZXQucHkKKysrIGIvTGliL3NvY2tldC5weQpAQCAtMjQsNyArMjQsNyBAQAogc3NsKCkgLS0gc2VjdXJlIHNvY2tldCBsYXllciBzdXBwb3J0IChvbmx5IGF2YWlsYWJsZSBpZiBjb25maWd1cmVkKQogc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgLS0gZ2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUKIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgpIC0tIHNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlCi1jcmVhdGVfY29ubmVjdGlvbigpIC0tIGNvbm5lY3RzIHRvIGFuIGFkZHJlc3MsIHdpdGggYW4gb3B0aW9uYWwgdGltZW91dCAKK2NyZWF0ZV9jb25uZWN0aW9uKCkgLS0gY29ubmVjdHMgdG8gYW4gYWRkcmVzcywgd2l0aCBhbiBvcHRpb25hbCB0aW1lb3V0CiAKICBbKl0gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zIQogCkBAIC00MTgsMTIgKzQxOCwxMiBAQAogZGVmIGNyZWF0ZV9jb25uZWN0aW9uKGFkZHJlc3MsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgIiIiQ29ubmVjdCB0byBhZGRyZXNzIChob3N0LCBwb3J0KSB3aXRoIGFuIG9wdGlvbmFsIHRpbWVvdXQuCiAKLSAgICBQcm92aWRlcyBhY2Nlc3MgdG8gc29ja2V0b2JqZWN0IHRpbWVvdXQgZm9yIGhpZ2hlci1sZXZlbCAKLSAgICBwcm90b2NvbHMuICBQYXNzaW5nIGEgdGltZW91dCB3aWxsIHNldCB0aGUgdGltZW91dCBvbiB0aGUgCisgICAgUHJvdmlkZXMgYWNjZXNzIHRvIHNvY2tldG9iamVjdCB0aW1lb3V0IGZvciBoaWdoZXItbGV2ZWwKKyAgICBwcm90b2NvbHMuICBQYXNzaW5nIGEgdGltZW91dCB3aWxsIHNldCB0aGUgdGltZW91dCBvbiB0aGUKICAgICBzb2NrZXQgaW5zdGFuY2UgKGlmIG5vdCBwcmVzZW50LCBvciBwYXNzZWQgYXMgTm9uZSwgdGhlCiAgICAgZGVmYXVsdCBnbG9iYWwgdGltZW91dCBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuCiAgICAgIiIiCi0gICAgCisKICAgICBtc2cgPSAiZ2V0YWRkcmluZm8gcmV0dXJucyBhbiBlbXB0eSBsaXN0IgogICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzCiAgICAgZm9yIHJlcyBpbiBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAwLCBTT0NLX1NUUkVBTSk6CkBAIC00MzUsNyArNDM1LDcgQEAKICAgICAgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgIHNvY2suY29ubmVjdChzYSkKICAgICAgICAgICAgIHJldHVybiBzb2NrCi0gICAgICAgIAorCiAgICAgICAgIGV4Y2VwdCBlcnJvciwgbXNnOgogICAgICAgICAgICAgaWYgc29jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0xpYi90ZW1wZmlsZS5weSBiL0xpYi90ZW1wZmlsZS5weQppbmRleCBiYjIzNzg1Li5jMGUzNGJjIDEwMDY0NAotLS0gYS9MaWIvdGVtcGZpbGUucHkKKysrIGIvTGliL3RlbXBmaWxlLnB5CkBAIC0zOCw5ICszOCw5IEBACiAgICAgaW1wb3J0IENhcmJvbi5Gb2xkZXJzIGFzIF9Gb2xkZXJzCiAKIHRyeToKLSAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIF9TdHJpbmdJTworICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KIGV4Y2VwdDoKLSAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgX1N0cmluZ0lPCisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgX1N0cmluZ0lPCiAKIHRyeToKICAgICBpbXBvcnQgZmNudGwgYXMgX2ZjbnRsCkBAIC01MTAsNyArNTEwLDcgQEAKICAgICAgICAgbmV3ZmlsZS5zZWVrKGZpbGUudGVsbCgpLCAwKQogCiAgICAgICAgIHNlbGYuX3JvbGxlZCA9IFRydWUKLSAgICAgICAgCisKICAgICAjIGZpbGUgcHJvdG9jb2wKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLl9faXRlcl9fKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHkgYi9MaWIvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5CmluZGV4IDYyNzZjNTEuLjdjNmNkOWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHkKKysrIGIvTGliL3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weQpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaSwgbCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFwdHIsIDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhicHRyLCAwKQotIAorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3REaWZmbGliTG9uZ2VzdE1hdGNoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5IGIvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CmluZGV4IDE2MTYxZjMuLmJhYWMyNTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQorKysgYi9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKQEAgLTEwOTYsOSArMTA5Niw5IEBACiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQWJjJywgJ2FiYycsICd0cmFuc2xhdGUnLCB0YWJsZSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd4eXonLCAneHl6JywgJ3RyYW5zbGF0ZScsIHRhYmxlKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3l6JywgJ3h5eicsICd0cmFuc2xhdGUnLCB0YWJsZSwgJ3gnKQotICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3l4JywgJ3p5enp4JywgJ3RyYW5zbGF0ZScsIE5vbmUsICd6JykgICAgCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneXgnLCAnenl6engnLCAndHJhbnNsYXRlJywgTm9uZSwgJ3onKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3p5enp4JywgJ3p5enp4JywgJ3RyYW5zbGF0ZScsIE5vbmUsICcnKQotICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3p5enp4JywgJ3p5enp4JywgJ3RyYW5zbGF0ZScsIE5vbmUpICAgICAgICAKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd6eXp6eCcsICd6eXp6eCcsICd0cmFuc2xhdGUnLCBOb25lKQogICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICd4eXonLCAndHJhbnNsYXRlJywgJ3RvbyBzaG9ydCcsICdzdHJpcCcpCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ3h5eicsICd0cmFuc2xhdGUnLCAndG9vIHNob3J0JykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggMDBhMWRlYS4uNTMxODFhYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogICAgICAgICBjLmFiYyA9IDUKICAgICAgICAgdmVyZXEoYy5hYmMsIDUpCiAKLSAgICAgICAgIyBfdW5pY29kZV90b19zdHJpbmcgdXNlZCB0byBtb2RpZnkgc2xvdHMgaW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzIAorICAgICAgICAjIF91bmljb2RlX3RvX3N0cmluZyB1c2VkIHRvIG1vZGlmeSBzbG90cyBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMKICAgICAgICAgc2xvdHMgPSAodW5pY29kZSgiZm9vIiksIHVuaWNvZGUoImJhciIpKQogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBzbG90cwpAQCAtMTI2Myw3ICsxMjYzLDcgQEAKICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFVuaWNvZGVFbmNvZGVFcnJvcik6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiW3VuaWNocigxMjgpXSBzbG90cyBub3QgY2F1Z2h0IiAKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICJbdW5pY2hyKDEyOCldIHNsb3RzIG5vdCBjYXVnaHQiCiAKICAgICAjIFRlc3QgbGVha3MKICAgICBjbGFzcyBDb3VudGVkKG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IGQyMGZlOTUuLmY2NTg5YjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC0yNyw3ICsyNyw3IEBACiBkZWYgcmVtb3ZlX3RlbXBmaWxlcygqbmFtZXMpOgogICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICBzYWZlX3VubGluayhuYW1lKQotICAgICAgICAgICAgCisKIGNsYXNzIEJ1ZmZlclNpemVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2J1ZmZlcl9zaXplcyhzZWxmKToKICAgICAgICAgIyBGaXJzdCwgcnVuIHRoZSB0ZXN0cyB3aXRoIGRlZmF1bHQgYW5kIHRlZW55IGJ1ZmZlciBzaXplLgpAQCAtNDAsMTAgKzQwLDEwIEBACiAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyLCB0MywgdDQpCi0gICAgICAgICAgICAgICAgCisKICAgICBkZWYgYnVmZmVyX3NpemVfdGVzdChzZWxmLCB0MSwgdDIsIHQzLCB0NCwgYnM9MCwgcm91bmQ9MCk6CiAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidMSU5FIChcZCspIE9GIEZJTEUgKFxkKyknKQotICAgIAorCiAgICAgICAgIHN0YXJ0ID0gMSArIHJvdW5kKjYKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICclcy4gU2ltcGxlIGl0ZXJhdGlvbiAoYnM9JXMpJyAlIChzdGFydCswLCBicykKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtLCBOb25lKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobS5ncm91cCgxKSksIGZpLmZpbGVsaW5lbm8oKSkKICAgICAgICAgZmkuY2xvc2UoKQotICAgICAgICAKKwogY2xhc3MgRmlsZUlucHV0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3plcm9fYnl0ZV9maWxlcyhzZWxmKToKICAgICAgICAgdHJ5OgpAQCAtMTI2LDEzICsxMjYsMTMgQEAKICAgICAgICAgICAgIHQzID0gd3JpdGVUbXAoMywgWyJUaGUgb25seSBsaW5lIHRoZXJlIGlzLlxuIl0pCiAgICAgICAgICAgICB0NCA9IHdyaXRlVG1wKDQsIFsiIl0pCiAgICAgICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz0odDEsIHQyLCB0MywgdDQpKQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGxpbmUgPSBmaS5yZWFkbGluZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsICdUaGUgb25seSBsaW5lIHRoZXJlIGlzLlxuJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDMpCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbGluZSA9IGZpLnJlYWRsaW5lKCkKICAgICAgICAgICAgIHNlbGYuZmFpbElmKGxpbmUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmxpbmVubygpLCAxKQpAQCAtMjIwLDYgKzIyMCw2IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoQnVmZmVyU2l6ZXNUZXN0cywgRmlsZUlucHV0VGVzdHMpCi0gICAgCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKaW5kZXggMGMzODg3Ni4uOTI5OGJmNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgZXZ0LnNldCgpCiAKIGNsYXNzIEdlbmVyYWxUZXN0cyhUZXN0Q2FzZSk6Ci0gICAgCisKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIGZ0cGxpYi5GVFAucG9ydCA9IDkwOTEKICAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQpAQCAtNDEsMTMgKzQxLDEzIEBACiAgICAgICAgICMgY29ubmVjdHMKICAgICAgICAgZnRwID0gZnRwbGliLkZUUCgibG9jYWxob3N0IikKICAgICAgICAgZnRwLnNvY2suY2xvc2UoKQotICAgICAgICAKKwogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAogICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCJsb2NhbGhvc3QiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZnRwLnNvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIGZ0cC5zb2NrLmNsb3NlKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgogICAgICAgICAjIGEgdmFsdWUKICAgICAgICAgZnRwID0gZnRwbGliLkZUUCgibG9jYWxob3N0IiwgdGltZW91dD0zMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2MucHkgYi9MaWIvdGVzdC90ZXN0X2djLnB5CmluZGV4IDRjYjM0MDIuLjhkMzc1MzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nYy5weQpAQCAtNiw3ICs2LDcgQEAKIAogIyMjIFN1cHBvcnQgY29kZQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAKKwogIyBCdWcgMTA1NTgyMCBoYXMgc2V2ZXJhbCB0ZXN0cyBvZiBsb25nc3RhbmRpbmcgYnVncyBpbnZvbHZpbmcgd2Vha3JlZnMgYW5kCiAjIGN5Y2xpYyBnYy4KIApAQCAtMzIsOSArMzIsOSBAQAogICAgICAgICBzZWxmLndyID0gd2Vha3JlZi5yZWYoQzEwNTU4MjAoNjY2KSwgaXRfaGFwcGVuZWQpCiAKIAotIyMjIFRlc3RzICAgICAgICAKKyMjIyBUZXN0cwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAKKwogY2xhc3MgR0NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKICAgICAgICAgbCA9IFtdCkBAIC0yNTksNyArMjU5LDcgQEAKICAgICAgICAgICAgICAgICBPdWNoLm4gPSBPdWNoLm4gKyAxCiAgICAgICAgICAgICAgICAgaWYgT3VjaC5uICUgMTcgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgCisKICAgICAgICAgIyAidHJhc2hjYW4iIGlzIGEgaGFjayB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IHdoZW4gZGVhbGxvY2F0aW5nCiAgICAgICAgICMgdmVyeSBkZWVwbHkgbmVzdGVkIHR1cGxlcyBldGMuICBJdCB3b3JrcyBpbiBwYXJ0IGJ5IGFidXNpbmcgdGhlCiAgICAgICAgICMgdHlwZSBwb2ludGVyIGFuZCByZWZjb3VudCBmaWVsZHMsIGFuZCB0aGF0IGNhbiB5aWVsZCBob3JyaWJsZQpAQCAtMjkyLDcgKzI5Miw3IEBACiAgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgc29tZWF0dHJpYnV0ZSk6CiAgICAgICAgICAgICAgICAgZGVsIHNlbGYuYXR0cgogICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCi0gICAgCisKICAgICAgICAgYSA9IEJvb20oKQogICAgICAgICBiID0gQm9vbSgpCiAgICAgICAgIGEuYXR0ciA9IGIKQEAgLTMyMSw3ICszMjEsNyBAQAogICAgICAgICAgICAgICAgIGlmIHNlbGYueCA+IDE6CiAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgotICAgIAorCiAgICAgICAgIGEgPSBCb29tMigpCiAgICAgICAgIGIgPSBCb29tMigpCiAgICAgICAgIGEuYXR0ciA9IGIKQEAgLTM0Niw3ICszNDYsNyBAQAogICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHNvbWVhdHRyaWJ1dGUpOgogICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgotICAgIAorCiAgICAgICAgIGEgPSBCb29tX05ldygpCiAgICAgICAgIGIgPSBCb29tX05ldygpCiAgICAgICAgIGEuYXR0ciA9IGIKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICAgICAgICAgICAgIGlmIHNlbGYueCA+IDE6CiAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgotICAgIAorCiAgICAgICAgIGEgPSBCb29tMl9OZXcoKQogICAgICAgICBiID0gQm9vbTJfTmV3KCkKICAgICAgICAgYS5hdHRyID0gYgpAQCAtNDMwLDEwICs0MzAsMTAgQEAKIGNsYXNzIEdDVG9nZ2xpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBnYy5lbmFibGUoKQotICAgICAgICAKKwogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgZ2MuZGlzYWJsZSgpCi0gICAgCisKICAgICBkZWYgdGVzdF9idWcxMDU1ODIwYyhzZWxmKToKICAgICAgICAgIyBDb3JyZXNwb25kcyB0byB0ZW1wMmMucHkgaW4gdGhlIGJ1ZyByZXBvcnQuICBUaGlzIGlzIHByZXR0eQogICAgICAgICAjIGVsYWJvcmF0ZS4KQEAgLTU5MSw2ICs1OTEsNiBAQAogICAgICAgICBhc3NlcnQgZ2MuaXNlbmFibGVkKCkKICAgICAgICAgaWYgbm90IGVuYWJsZWQ6CiAgICAgICAgICAgICBnYy5kaXNhYmxlKCkKLSAgICAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkgYi9MaWIvdGVzdC90ZXN0X2dldG9wdC5weQppbmRleCAwNzJmYzc4Li5hM2E5OTQwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldG9wdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldG9wdC5weQpAQCAtMTUsMTUgKzE1LDE1IEBACiAgICAgICAgIGlmIHNlbGYub2xkX3Bvc2l4bHlfY29ycmVjdCBpcyBub3Qgc2VudGluZWw6CiAgICAgICAgICAgICBkZWwgb3MuZW52aXJvblsiUE9TSVhMWV9DT1JSRUNUIl0KIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKTogICAgICAgICAKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIGlmIHNlbGYub2xkX3Bvc2l4bHlfY29ycmVjdCBpcyBzZW50aW5lbDoKICAgICAgICAgICAgIG9zLmVudmlyb24ucG9wKCJQT1NJWExZX0NPUlJFQ1QiLCBOb25lKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb3MuZW52aXJvblsiUE9TSVhMWV9DT1JSRUNUIl0gPSBzZWxmLm9sZF9wb3NpeGx5X2NvcnJlY3QKLSAgICAgICAgICAgIAorCiAgICAgZGVmIGFzc2VydEVycm9yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGdldG9wdC5HZXRvcHRFcnJvciwgKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICAgICAgCisKICAgICBkZWYgdGVzdF9zaG9ydF9oYXNfYXJnKHNlbGYpOgogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ2V0b3B0LnNob3J0X2hhc19hcmcoJ2EnLCAnYTonKSkKICAgICAgICAgc2VsZi5mYWlsSWYoZ2V0b3B0LnNob3J0X2hhc19hcmcoJ2EnLCAnYScpKQpAQCAtMzMsMTUgKzMzLDE1IEBACiAgICAgICAgIGhhc19hcmcsIG9wdGlvbiA9IGdldG9wdC5sb25nX2hhc19hcmdzKCdhYmMnLCBbJ2FiYz0nXSkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc19hcmcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjJykKLSAgICAgICAgCisKICAgICAgICAgaGFzX2FyZywgb3B0aW9uID0gZ2V0b3B0LmxvbmdfaGFzX2FyZ3MoJ2FiYycsIFsnYWJjJ10pCiAgICAgICAgIHNlbGYuZmFpbElmKGhhc19hcmcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjJykKLSAgICAgICAgCisKICAgICAgICAgaGFzX2FyZywgb3B0aW9uID0gZ2V0b3B0LmxvbmdfaGFzX2FyZ3MoJ2FiYycsIFsnYWJjZCddKQogICAgICAgICBzZWxmLmZhaWxJZihoYXNfYXJnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbiwgJ2FiY2QnKQotICAgICAgICAKKwogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5sb25nX2hhc19hcmdzLCAnYWJjJywgWydkZWYnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQubG9uZ19oYXNfYXJncywgJ2FiYycsIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5sb25nX2hhc19hcmdzLCAnYWJjJywgWydhYmNkJywnYWJjZGUnXSkKQEAgLTUwLDIzICs1MCwyMyBAQAogICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX3Nob3J0cyhbXSwgJ2EnLCAnYScsIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJycpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKLSAgICAgICAgCisKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19zaG9ydHMoW10sICdhMScsICdhOicsIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJzEnKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCi0gICAgICAgIAorCiAgICAgICAgICNvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX3Nob3J0cyhbXSwgJ2E9MScsICdhOicsIFtdKQogICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyldKQogICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKLSAgICAgICAgCisKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19zaG9ydHMoW10sICdhJywgJ2E6JywgWycxJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLWEnLCAnMScpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKLSAgICAgICAgCisKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19zaG9ydHMoW10sICdhJywgJ2E6JywgWycxJywgJzInXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnMiddKQotICAgICAgICAKKwogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5kb19zaG9ydHMsIFtdLCAnYTEnLCAnYScsIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5kb19zaG9ydHMsIFtdLCAnYScsICdhOicsIFtdKQogCkBAIC03NCwyNiArNzQsMjYgQEAKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19sb25ncyhbXSwgJ2FiYycsIFsnYWJjJ10sIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjJywgJycpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKLSAgICAgICAgCisKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19sb25ncyhbXSwgJ2FiYz0xJywgWydhYmM9J10sIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjJywgJzEnKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCi0gICAgICAgIAorCiAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fbG9uZ3MoW10sICdhYmM9MScsIFsnYWJjZD0nXSwgW10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLS1hYmNkJywgJzEnKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCi0gICAgICAgIAorCiAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fbG9uZ3MoW10sICdhYmMnLCBbJ2FiJywgJ2FiYycsICdhYmNkJ10sIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjJywgJycpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKLSAgICAgICAgCisKICAgICAgICAgIyBNdWNoIGxpa2UgdGhlIHByZWNlZGluZywgZXhjZXB0IHdpdGggYSBub24tYWxwaGEgY2hhcmFjdGVyICgiLSIpIGluCiAgICAgICAgICMgb3B0aW9uIG5hbWUgdGhhdCBwcmVjZWRlcyAiPSI7IGZhaWxlZCBpbgogICAgICAgICAjIGh0dHA6Ly9weXRob24ub3JnL3NmLzEyNjg2MwogICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX2xvbmdzKFtdLCAnZm9vPTQyJywgWydmb28tYmFyJywgJ2Zvbz0nLF0sIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tZm9vJywgJzQyJyldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQotICAgICAgICAKKwogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5kb19sb25ncywgW10sICdhYmM9MScsIFsnYWJjJ10sIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5kb19sb25ncywgW10sICdhYmMnLCBbJ2FiYz0nXSwgW10pCiAKQEAgLTExNywxOCArMTE3LDE4IEBACiAgICAgZGVmIHRlc3RfZ251X2dldG9wdChzZWxmKToKICAgICAgICAgIyBUZXN0IGhhbmRsaW5nIG9mIEdOVSBzdHlsZSBzY2FubmluZyBtb2RlLgogICAgICAgICBjbWRsaW5lID0gWyctYScsICdhcmcxJywgJy1iJywgJzEnLCAnLS1hbHBoYScsICctLWJldGE9MiddCi0gICAgICAgIAorCiAgICAgICAgICMgR05VIHN0eWxlCiAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ251X2dldG9wdChjbWRsaW5lLCAnYWI6JywgWydhbHBoYScsICdiZXRhPSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnYXJnMSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJycpLCAoJy1iJywgJzEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCctLWFscGhhJywgJycpLCAoJy0tYmV0YScsICcyJyldKQotICAgICAgICAKKwogICAgICAgICAjIFBvc2l4IHN0eWxlIHZpYSArCiAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ251X2dldG9wdChjbWRsaW5lLCAnK2FiOicsIFsnYWxwaGEnLCAnYmV0YT0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcnKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWydhcmcxJywgJy1iJywgJzEnLCAnLS1hbHBoYScsICctLWJldGE9MiddKQotICAgICAgICAKKwogICAgICAgICAjIFBvc2l4IHN0eWxlIHZpYSBQT1NJWExZX0NPUlJFQ1QKICAgICAgICAgb3MuZW52aXJvblsiUE9TSVhMWV9DT1JSRUNUIl0gPSAiMSIKICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KGNtZGxpbmUsICdhYjonLCBbJ2FscGhhJywgJ2JldGE9J10pCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgPj4+IGFyZ3MKICAgICAgICAgWydhMScsICdhMiddCiAgICAgICAgICIiIgotICAgICAgICAKKwogICAgICAgICBpbXBvcnQgbmV3CiAgICAgICAgIG0gPSBuZXcubW9kdWxlKCJsaWJyZWZ0ZXN0IiwgcykKICAgICAgICAgcnVuX2RvY3Rlc3QobSwgdmVyYm9zZSkKQEAgLTE3NCw2ICsxNzQsNiBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KEdldG9wdFRlc3RzKQotICAgIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKaW5kZXggYzFlYzRhMC4uMDM1ZjBiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQpAQCAtMTU0LDcgKzE1NCw3IEBACiBIT1NUID0gImxvY2FsaG9zdCIKIAogY2xhc3MgVGltZW91dFRlc3QoVGVzdENhc2UpOgotICAgIAorCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHNlbGYuc2Vydi5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgIGh0dHBDb25uLmNvbm5lY3QoKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoaHR0cENvbm4uc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgaHR0cENvbm4uY2xvc2UoKQotICAgIAorCiAgICAgICAgICMgYSB2YWx1ZQogICAgICAgICBodHRwQ29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oSE9TVCwgUE9SVCwgdGltZW91dD0zMCkKICAgICAgICAgaHR0cENvbm4uY29ubmVjdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvbmdfZnV0dXJlLnB5IGIvTGliL3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weQppbmRleCBiNjIwNDhhLi45MDQ0ZGE2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmdfZnV0dXJlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHkKQEAgLTUwLDYgKzUwLDYgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUcnVlRGl2aXNpb25UZXN0cykKLSAgICAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CmluZGV4IGNhNTkyYTAuLjMwNThiMzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKQEAgLTcyLDI1ICs3MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICAjIGFyZSBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgbGVuKE5vZGUuYWxsbm9kZXMpCiAgICAgICAgICAgICBOb2RlLmFsbG5vZGVzID0ge30KLSAgICAKKwogICAgIGRlZiBjb25maXJtKHNlbGYsIHRlc3QsIHRlc3RuYW1lID0gIlRlc3QiKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3QsIHRlc3RuYW1lKQotICAgIAorCiAgICAgZGVmIGNoZWNrV2hvbGVUZXh0KHNlbGYsIG5vZGUsIHMpOgogICAgICAgICB0ID0gbm9kZS53aG9sZVRleHQKICAgICAgICAgc2VsZi5jb25maXJtKHQgPT0gcywgImxvb2tpbmcgZm9yICVzLCBmb3VuZCAlcyIgJSAocmVwcihzKSwgcmVwcih0KSkpCi0gICAgCisKICAgICBkZWYgdGVzdFBhcnNlRnJvbUZpbGUoc2VsZik6CiAgICAgICAgIGRvbSA9IHBhcnNlKFN0cmluZ0lPKG9wZW4odHN0ZmlsZSkucmVhZCgpKSkKICAgICAgICAgZG9tLnVubGluaygpCiAgICAgICAgIHNlbGYuY29uZmlybShpc2luc3RhbmNlKGRvbSxEb2N1bWVudCkpCi0gICAgCisKICAgICBkZWYgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGYpOgogICAgICAgICBkb20gPSBwYXJzZSh0c3RmaWxlKQogICAgICAgICBzZWxmLmNvbmZpcm0oZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMSSIpID09IFwKICAgICAgICAgICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMSSIpKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0SW5zZXJ0QmVmb3JlKHNlbGYpOgogICAgICAgICBkb20gPSBwYXJzZVN0cmluZygiPGRvYz48Zm9vLz48L2RvYz4iKQogICAgICAgICByb290ID0gZG9tLmRvY3VtZW50RWxlbWVudApAQCAtMTI5LDExICsxMjksMTEgQEAKICAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLml0ZW0oMykgaXMgbmVsZW0KICAgICAgICAgICAgICAgICBhbmQgbmVsZW0yLm5leHRTaWJsaW5nIGlzIG5lbGVtCiAgICAgICAgICAgICAgICAgYW5kIG5lbGVtLnByZXZpb3VzU2libGluZyBpcyBuZWxlbTIKLSAgICAgICAgICAgICAgICBhbmQgcm9vdC50b3htbCgpID09IAorICAgICAgICAgICAgICAgIGFuZCByb290LnRveG1sKCkgPT0KICAgICAgICAgICAgICAgICAiPGRvYz48ZWxlbWVudC8+PGZvby8+PGJhci8+PGVsZW1lbnQvPjwvZG9jPiIKICAgICAgICAgICAgICAgICAsICJ0ZXN0SW5zZXJ0QmVmb3JlIC0tIG5vZGUgcHJvcGVybHkgcGxhY2VkIGluIHRyZWUiKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiBfY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoc2VsZik6CiAgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgICAgICBvcmlnID0gZG9tLmNyZWF0ZVRleHROb2RlKCJvcmlnaW5hbCIpCkBAIC0xNDYsMTEgKzE0NiwxMSBAQAogICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGMyKQogICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGMzKQogICAgICAgICByZXR1cm4gZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnCi0gICAgCisKICAgICBkZWYgdGVzdEluc2VydEJlZm9yZUZyYWdtZW50KHNlbGYpOgogICAgICAgICBkb20sIG9yaWcsIGMxLCBjMiwgYzMsIGZyYWcgPSBzZWxmLl9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcygpCiAgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZyYWcsIE5vbmUpCi0gICAgICAgIHNlbGYuY29uZmlybSh0dXBsZShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpID09IAorICAgICAgICBzZWxmLmNvbmZpcm0odHVwbGUoZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKSA9PQogICAgICAgICAgICAgICAgICAgICAgKG9yaWcsIGMxLCBjMiwgYzMpLAogICAgICAgICAgICAgICAgICAgICAgImluc2VydEJlZm9yZSg8ZnJhZ21lbnQ+LCBOb25lKSIpCiAgICAgICAgIGZyYWcudW5saW5rKCkKQEAgLTE1OCwyOCArMTU4LDI4IEBACiAKICAgICAgICAgZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnID0gc2VsZi5fY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoKQogICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50Lmluc2VydEJlZm9yZShmcmFnLCBvcmlnKQotICAgICAgICBzZWxmLmNvbmZpcm0odHVwbGUoZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKSA9PSAKKyAgICAgICAgc2VsZi5jb25maXJtKHR1cGxlKGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcykgPT0KICAgICAgICAgICAgICAgICAgICAgIChjMSwgYzIsIGMzLCBvcmlnKSwKICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnRCZWZvcmUoPGZyYWdtZW50Piwgb3JpZykiKQogICAgICAgICBmcmFnLnVubGluaygpCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RBcHBlbmRDaGlsZChzZWxmKToKICAgICAgICAgZG9tID0gcGFyc2UodHN0ZmlsZSkKICAgICAgICAgZG9tLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChkb20uY3JlYXRlQ29tbWVudCh1IkhlbGxvIikpCiAgICAgICAgIHNlbGYuY29uZmlybShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXNbLTFdLm5vZGVOYW1lID09ICIjY29tbWVudCIpCiAgICAgICAgIHNlbGYuY29uZmlybShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXNbLTFdLmRhdGEgPT0gIkhlbGxvIikKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdEFwcGVuZENoaWxkRnJhZ21lbnQoc2VsZik6CiAgICAgICAgIGRvbSwgb3JpZywgYzEsIGMyLCBjMywgZnJhZyA9IHNlbGYuX2NyZWF0ZV9mcmFnbWVudF90ZXN0X25vZGVzKCkKICAgICAgICAgZG9tLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnKQotICAgICAgICBzZWxmLmNvbmZpcm0odHVwbGUoZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKSA9PSAKKyAgICAgICAgc2VsZi5jb25maXJtKHR1cGxlKGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcykgPT0KICAgICAgICAgICAgICAgICAgICAgIChvcmlnLCBjMSwgYzIsIGMzKSwKICAgICAgICAgICAgICAgICAgICAgICJhcHBlbmRDaGlsZCg8ZnJhZ21lbnQ+KSIpCiAgICAgICAgIGZyYWcudW5saW5rKCkKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdFJlcGxhY2VDaGlsZEZyYWdtZW50KHNlbGYpOgogICAgICAgICBkb20sIG9yaWcsIGMxLCBjMiwgYzMsIGZyYWcgPSBzZWxmLl9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcygpCiAgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQucmVwbGFjZUNoaWxkKGZyYWcsIG9yaWcpCkBAIC0xODgsMjggKzE4OCwyOCBAQAogICAgICAgICAgICAgICAgICJyZXBsYWNlQ2hpbGQoPGZyYWdtZW50PikiKQogICAgICAgICBmcmFnLnVubGluaygpCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RMZWdhbENoaWxkcmVuKHNlbGYpOgogICAgICAgICBkb20gPSBEb2N1bWVudCgpCiAgICAgICAgIGVsZW0gPSBkb20uY3JlYXRlRWxlbWVudCgnZWxlbWVudCcpCiAgICAgICAgIHRleHQgPSBkb20uY3JlYXRlVGV4dE5vZGUoJ3RleHQnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIGRvbS5hcHBlbmRDaGlsZCwgdGV4dCkKLSAgICAKKwogICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWxlbSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb20uaW5zZXJ0QmVmb3JlLCB0ZXh0LCAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb20uaW5zZXJ0QmVmb3JlLCB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIGRvbS5yZXBsYWNlQ2hpbGQsIHRleHQsIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIGRvbS5yZXBsYWNlQ2hpbGQsIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0pCi0gICAgCisKICAgICAgICAgbm9kZW1hcCA9IGVsZW0uYXR0cmlidXRlcwotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIG5vZGVtYXAuc2V0TmFtZWRJdGVtLCAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBub2RlbWFwLnNldE5hbWVkSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBub2RlbWFwLnNldE5hbWVkSXRlbU5TLCAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBub2RlbWFwLnNldE5hbWVkSXRlbU5TLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KQotICAgIAorCiAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQodGV4dCkKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdE5hbWVkTm9kZU1hcFNldEl0ZW0oc2VsZik6CiAgICAgICAgIGRvbSA9IERvY3VtZW50KCkKICAgICAgICAgZWxlbSA9IGRvbS5jcmVhdGVFbGVtZW50KCdlbGVtZW50JykKQEAgLTIyNiwyNCArMjI2LDI0IEBACiAgICAgICAgICAgICAgICAgIk5hbWVkTm9kZU1hcC5fX3NldGl0ZW1fXygpIHNldHMgbm9kZVZhbHVlIikKICAgICAgICAgZWxlbS51bmxpbmsoKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0Tm9uWmVybyhzZWxmKToKICAgICAgICAgZG9tID0gcGFyc2UodHN0ZmlsZSkKICAgICAgICAgc2VsZi5jb25maXJtKGRvbSkjIHNob3VsZCBub3QgYmUgemVybwogICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUNvbW1lbnQoImZvbyIpKQogICAgICAgICBzZWxmLmNvbmZpcm0obm90IGRvbS5jaGlsZE5vZGVzWy0xXS5jaGlsZE5vZGVzKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0VW5saW5rKHNlbGYpOgogICAgICAgICBkb20gPSBwYXJzZSh0c3RmaWxlKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0RWxlbWVudChzZWxmKToKICAgICAgICAgZG9tID0gRG9jdW1lbnQoKQogICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQogICAgICAgICBzZWxmLmNvbmZpcm0oZG9tLmRvY3VtZW50RWxlbWVudCkKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdEFBQShzZWxmKToKICAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoIjxhYmMvPiIpCiAgICAgICAgIGVsID0gZG9tLmRvY3VtZW50RWxlbWVudApAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAgICAgIHNlbGYuY29uZmlybShhLm93bmVyRWxlbWVudCBpcyBkb20uZG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgICAgICAgICJzZXRBdHRyaWJ1dGUoKSBzZXRzIG93bmVyRWxlbWVudCIpCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RBQUIoc2VsZik6CiAgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8YWJjLz4iKQogICAgICAgICBlbCA9IGRvbS5kb2N1bWVudEVsZW1lbnQKQEAgLTI2Myw0OSArMjYzLDQ5IEBACiAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgic3BhbSIsICJqYW0yIikKICAgICAgICAgc2VsZi5jb25maXJtKGVsLnRveG1sKCkgPT0gJzxhYmMgc3BhbT0iamFtMiIvPicsICJ0ZXN0QUFCIikKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdEFkZEF0dHIoc2VsZik6CiAgICAgICAgIGRvbSA9IERvY3VtZW50KCkKICAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQotICAgIAorCiAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgImdoaSIpCiAgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5nZXRBdHRyaWJ1dGUoImRlZiIpID09ICJnaGkiKQogICAgICAgICBzZWxmLmNvbmZpcm0oY2hpbGQuYXR0cmlidXRlc1siZGVmIl0udmFsdWUgPT0gImdoaSIpCi0gICAgCisKICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCJqa2wiLCAibW5vIikKICAgICAgICAgc2VsZi5jb25maXJtKGNoaWxkLmdldEF0dHJpYnV0ZSgiamtsIikgPT0gIm1ubyIpCiAgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5hdHRyaWJ1dGVzWyJqa2wiXS52YWx1ZSA9PSAibW5vIikKLSAgICAKKwogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDIpCi0gICAgCisKICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCJkZWYiLCAibmV3dmFsIikKICAgICAgICAgc2VsZi5jb25maXJtKGNoaWxkLmdldEF0dHJpYnV0ZSgiZGVmIikgPT0gIm5ld3ZhbCIpCiAgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5hdHRyaWJ1dGVzWyJkZWYiXS52YWx1ZSA9PSAibmV3dmFsIikKLSAgICAKKwogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDIpCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3REZWxldGVBdHRyKHNlbGYpOgogICAgICAgICBkb20gPSBEb2N1bWVudCgpCiAgICAgICAgIGNoaWxkID0gZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJhYmMiKSkKLSAgICAKKwogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDApCiAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgImdoaSIpCiAgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMSkKICAgICAgICAgZGVsIGNoaWxkLmF0dHJpYnV0ZXNbImRlZiJdCiAgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMCkKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdFJlbW92ZUF0dHIoc2VsZik6CiAgICAgICAgIGRvbSA9IERvY3VtZW50KCkKICAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQotICAgIAorCiAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgImdoaSIpCiAgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMSkKICAgICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCJkZWYiKQogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDApCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RSZW1vdmVBdHRyTlMoc2VsZik6CiAgICAgICAgIGRvbSA9IERvY3VtZW50KCkKICAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlTlMoImh0dHA6Ly93d3cucHl0aG9uLm9yZyIsICJhYmNhdHRyIikKICAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAxKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0UmVtb3ZlQXR0cmlidXRlTm9kZShzZWxmKToKICAgICAgICAgZG9tID0gRG9jdW1lbnQoKQogICAgICAgICBjaGlsZCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCgiZm9vIikpCkBAIC0zMjgsNyArMzI4LDcgQEAKICAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAwCiAgICAgICAgICAgICAgICAgYW5kIGNoaWxkLmdldEF0dHJpYnV0ZU5vZGUoInNwYW0iKSBpcyBOb25lKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0Q2hhbmdlQXR0cihzZWxmKToKICAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoIjxhYmMvPiIpCiAgICAgICAgIGVsID0gZG9tLmRvY3VtZW50RWxlbWVudApAQCAtMzY2LDI2ICszNjYsMjYgQEAKICAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbTIiXS5ub2RlVmFsdWUgPT0gImJhbTIiCiAgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbTIiKSA9PSAiYmFtMiIpCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RHZXRBdHRyTGlzdChzZWxmKToKICAgICAgICAgcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RHZXRBdHRyVmFsdWVzKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEdldEF0dHJMZW5ndGgoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0R2V0QXR0cmlidXRlKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEdldEF0dHJpYnV0ZU5TKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEdldEF0dHJpYnV0ZU5vZGUoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUyhzZWxmKToKICAgICAgICAgZD0iIiI8Zm9vIHhtbG5zOm1pbmlkb209J2h0dHA6Ly9weXhtbC5zZi5uZXQvbWluaWRvbSc+CiAgICAgICAgIDxtaW5pZG9tOm15ZWxlbS8+CiAgICAgICAgIDwvZm9vPiIiIgogICAgICAgICBkb20gPSBwYXJzZVN0cmluZyhkKQotICAgICAgICBlbGVtcyA9IGRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJodHRwOi8vcHl4bWwuc2YubmV0L21pbmlkb20iLCAKKyAgICAgICAgZWxlbXMgPSBkb20uZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiaHR0cDovL3B5eG1sLnNmLm5ldC9taW5pZG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXllbGVtIikKICAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbGVtcykgPT0gMQogICAgICAgICAgICAgICAgIGFuZCBlbGVtc1swXS5uYW1lc3BhY2VVUkkgPT0gImh0dHA6Ly9weXhtbC5zZi5uZXQvbWluaWRvbSIKQEAgLTM5NCwxMiArMzk0LDEyIEBACiAgICAgICAgICAgICAgICAgYW5kIGVsZW1zWzBdLnRhZ05hbWUgPT0gIm1pbmlkb206bXllbGVtIgogICAgICAgICAgICAgICAgIGFuZCBlbGVtc1swXS5ub2RlTmFtZSA9PSAibWluaWRvbTpteWVsZW0iKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKLSAgICBkZWYgZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoc2VsZiwgZG9jLCBuc3VyaSwgCisKKyAgICBkZWYgZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoc2VsZiwgZG9jLCBuc3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5hbWUpOgogICAgICAgICBub2RlbGlzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5zdXJpLCBsbmFtZSkKICAgICAgICAgc2VsZi5jb25maXJtKGxlbihub2RlbGlzdCkgPT0gMCkKLSAgICAKKwogICAgIGRlZiB0ZXN0R2V0RW1wdHlOb2RlTGlzdEZyb21FbGVtZW50c0J5VGFnTmFtZU5TKHNlbGYpOgogICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygnPGRvYy8+JykKICAgICAgICAgc2VsZi5nZXRfZW1wdHlfbm9kZWxpc3RfZnJvbV9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcigKQEAgLTQwOCw3ICs0MDgsNyBAQAogICAgICAgICAgICAgZG9jLCAnKicsICdzcGxhdCcpCiAgICAgICAgIHNlbGYuZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoCiAgICAgICAgICAgICBkb2MsICdodHRwOi8veG1sLnB5dGhvbi5vcmcvbmFtZXNwYWNlcy9hJywgJyonKQotICAgIAorCiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCc8ZG9jIHhtbG5zPSJodHRwOi8veG1sLnB5dGhvbi5vcmcvc3BsYXQiPjxlLz48L2RvYz4nKQogICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAogICAgICAgICAgICAgZG9jLCAiaHR0cDovL3htbC5weXRob24ub3JnL3NwbGF0IiwgIm5vdC10aGVyZSIpCkBAIC00MTYsNyArNDE2LDcgQEAKICAgICAgICAgICAgIGRvYywgIioiLCAibm90LXRoZXJlIikKICAgICAgICAgc2VsZi5nZXRfZW1wdHlfbm9kZWxpc3RfZnJvbV9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcigKICAgICAgICAgICAgIGRvYywgImh0dHA6Ly9zb21ld2hlcmUuZWxzZS5uZXQvbm90LXRoZXJlIiwgImUiKQotICAgIAorCiAgICAgZGVmIHRlc3RFbGVtZW50UmVwckFuZFN0cihzZWxmKToKICAgICAgICAgZG9tID0gRG9jdW1lbnQoKQogICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCgiYWJjIikpCkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgICAgc3RyaW5nMiA9IHN0cihlbCkKICAgICAgICAgc2VsZi5jb25maXJtKHN0cmluZzEgPT0gc3RyaW5nMikKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdEVsZW1lbnRSZXByQW5kU3RyVW5pY29kZShzZWxmKToKICAgICAgICAgZG9tID0gRG9jdW1lbnQoKQogICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCh1ImFiYyIpKQpAQCAtNDMyLDcgKzQzMiw3IEBACiAgICAgICAgIHN0cmluZzIgPSBzdHIoZWwpCiAgICAgICAgIHNlbGYuY29uZmlybShzdHJpbmcxID09IHN0cmluZzIpCiAgICAgICAgIGRvbS51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RFbGVtZW50UmVwckFuZFN0clVuaWNvZGVOUyhzZWxmKToKICAgICAgICAgZG9tID0gRG9jdW1lbnQoKQogICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZCgKQEAgLTQ0MiwzMCArNDQyLDMwIEBACiAgICAgICAgIHNlbGYuY29uZmlybShzdHJpbmcxID09IHN0cmluZzIpCiAgICAgICAgIHNlbGYuY29uZmlybShzdHJpbmcxLmZpbmQoInNsYXNoOmFiYyIpICE9IC0xKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0QXR0cmlidXRlUmVwcihzZWxmKToKICAgICAgICAgZG9tID0gRG9jdW1lbnQoKQogICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCh1ImFiYyIpKQogICAgICAgICBub2RlID0gZWwuc2V0QXR0cmlidXRlKCJhYmMiLCAiZGVmIikKICAgICAgICAgc2VsZi5jb25maXJtKHN0cihub2RlKSA9PSByZXByKG5vZGUpKQogICAgICAgICBkb20udW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0VGV4dE5vZGVSZXByKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdFdyaXRlWE1MKHNlbGYpOgogICAgICAgICBzdHIgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PjxhIGI9ImMiLz4nCiAgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKHN0cikKICAgICAgICAgZG9tc3RyID0gZG9tLnRveG1sKCkKICAgICAgICAgZG9tLnVubGluaygpCiAgICAgICAgIHNlbGYuY29uZmlybShzdHIgPT0gZG9tc3RyKQotICAgIAorCiAgICAgZGVmIHRlc3RBbHROZXdsaW5lKHNlbGYpOgogICAgICAgICBzdHIgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PlxuPGEgYj0iYyIvPlxuJwogICAgICAgICBkb20gPSBwYXJzZVN0cmluZyhzdHIpCiAgICAgICAgIGRvbXN0ciA9IGRvbS50b3ByZXR0eXhtbChuZXdsPSJcclxuIikKICAgICAgICAgZG9tLnVubGluaygpCiAgICAgICAgIHNlbGYuY29uZmlybShkb21zdHIgPT0gc3RyLnJlcGxhY2UoIlxuIiwgIlxyXG4iKSkKLSAgICAKKwogICAgIGRlZiB0ZXN0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYpOgogICAgICAgICBkb20gPSBwYXJzZVN0cmluZygnPGU+PD9teXBpIFx0XG4gZGF0YSBcdFxuID8+PC9lPicpCiAgICAgICAgIHBpID0gZG9tLmRvY3VtZW50RWxlbWVudC5maXJzdENoaWxkCkBAIC00ODAsMTUgKzQ4MCwxNSBAQAogICAgICAgICAgICAgICAgIGFuZCBwaS5sYXN0Q2hpbGQgaXMgTm9uZQogICAgICAgICAgICAgICAgIGFuZCBwaS5sb2NhbE5hbWUgaXMgTm9uZQogICAgICAgICAgICAgICAgIGFuZCBwaS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCi0gICAgCisKICAgICBkZWYgdGVzdFByb2Nlc3NpbmdJbnN0cnVjdGlvblJlcHIoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0VGV4dFJlcHIoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0V3JpdGVUZXh0KHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdERvY3VtZW50RWxlbWVudChzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RUb29NYW55RG9jdW1lbnRFbGVtZW50cyhzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCiAgICAgICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgiZXh0cmEiKQpAQCAtNDk2LDI3ICs0OTYsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb2MuYXBwZW5kQ2hpbGQsIGVsZW0pCiAgICAgICAgIGVsZW0udW5saW5rKCkKICAgICAgICAgZG9jLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdENyZWF0ZUVsZW1lbnROUyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RDcmVhdGVBdHRyaWJ1dGVOUyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RQYXJzZShzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RQYXJzZVN0cmluZyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RDb21tZW50KHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEF0dHJMaXN0SXRlbShzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RBdHRyTGlzdEl0ZW1zKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEF0dHJMaXN0SXRlbU5TKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEF0dHJMaXN0S2V5cyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RBdHRyTGlzdEtleXNOUyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RSZW1vdmVOYW1lZEl0ZW0oc2VsZik6CiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGE9JycvPiIpCiAgICAgICAgIGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50CkBAIC01MjUsNyArNTI1LDcgQEAKICAgICAgICAgYTIgPSBhdHRycy5yZW1vdmVOYW1lZEl0ZW0oImEiKQogICAgICAgICBzZWxmLmNvbmZpcm0oYTEuaXNTYW1lTm9kZShhMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90Rm91bmRFcnIsIGF0dHJzLnJlbW92ZU5hbWVkSXRlbSwgImEiKQotICAgIAorCiAgICAgZGVmIHRlc3RSZW1vdmVOYW1lZEl0ZW1OUyhzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MgeG1sbnM6YT0naHR0cDovL3htbC5weXRob24ub3JnLycgYTpiPScnLz4iKQogICAgICAgICBlID0gZG9jLmRvY3VtZW50RWxlbWVudApAQCAtNTMzLDMzICs1MzMsMzMgQEAKICAgICAgICAgYTEgPSBlLmdldEF0dHJpYnV0ZU5vZGVOUygiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKICAgICAgICAgYTIgPSBhdHRycy5yZW1vdmVOYW1lZEl0ZW1OUygiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKICAgICAgICAgc2VsZi5jb25maXJtKGExLmlzU2FtZU5vZGUoYTIpKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdEZvdW5kRXJyLCBhdHRycy5yZW1vdmVOYW1lZEl0ZW1OUywgCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90Rm91bmRFcnIsIGF0dHJzLnJlbW92ZU5hbWVkSXRlbU5TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKLSAgICAKKwogICAgIGRlZiB0ZXN0QXR0ckxpc3RWYWx1ZXMoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0QXR0ckxpc3RMZW5ndGgoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0QXR0ckxpc3RfX2dldGl0ZW1fXyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RBdHRyTGlzdF9fc2V0aXRlbV9fKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdFNldEF0dHJWYWx1ZWFuZE5vZGVWYWx1ZShzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RQYXJzZUVsZW1lbnQoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0UGFyc2VBdHRyaWJ1dGVzKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdFBhcnNlRWxlbWVudE5hbWVzcGFjZXMoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0UGFyc2VBdHRyaWJ1dGVOYW1lc3BhY2VzKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdFBhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9ucyhzZWxmKTogcGFzcwotICAgIAorCiAgICAgZGVmIHRlc3RDaGlsZE5vZGVzKHNlbGYpOiBwYXNzCi0gICAgCisKICAgICBkZWYgdGVzdEZpcnN0Q2hpbGQoc2VsZik6IHBhc3MKLSAgICAKKwogICAgIGRlZiB0ZXN0SGFzQ2hpbGROb2RlcyhzZWxmKTogcGFzcwogCiAgICAgZGVmIF90ZXN0Q2xvbmVFbGVtZW50Q29waWVzQXR0cmlidXRlcyhzZWxmLCBlMSwgZTIsIHRlc3QpOgpAQCAtNTgxLDcgKzU4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICwgImNsb25lIG9mIGF0dHJpYnV0ZSBub2RlIGhhcyBwcm9wZXIgYXR0cmlidXRlIHZhbHVlcyIpCiAgICAgICAgICAgICBzZWxmLmNvbmZpcm0oYTIub3duZXJFbGVtZW50IGlzIGUyLAogICAgICAgICAgICAgICAgICAgICAiY2xvbmUgb2YgYXR0cmlidXRlIG5vZGUgY29ycmVjdGx5IG93bmVkIikKLSAgICAKKwogICAgIGRlZiBfc2V0dXBDbG9uZUVsZW1lbnQoc2VsZiwgZGVlcCk6CiAgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8ZG9jIGF0dHI9J3ZhbHVlJz48Zm9vLz48L2RvYz4iKQogICAgICAgICByb290ID0gZG9tLmRvY3VtZW50RWxlbWVudApAQCAtNTkzLDcgKzU5Myw3IEBACiAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJhdHRyIiwgIk5FVyBWQUxVRSIpCiAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJhZGRlZCIsICJWQUxVRSIpCiAgICAgICAgIHJldHVybiBkb20sIGNsb25lCi0gICAgCisKICAgICBkZWYgdGVzdENsb25lRWxlbWVudFNoYWxsb3coc2VsZik6CiAgICAgICAgIGRvbSwgY2xvbmUgPSBzZWxmLl9zZXR1cENsb25lRWxlbWVudCgwKQogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNsb25lLmNoaWxkTm9kZXMpID09IDAKQEAgLTYwMiw3ICs2MDIsNyBAQAogICAgICAgICAgICAgICAgIGFuZCBjbG9uZS50b3htbCgpID09ICc8ZG9jIGF0dHI9InZhbHVlIi8+JwogICAgICAgICAgICAgICAgICwgInRlc3RDbG9uZUVsZW1lbnRTaGFsbG93IikKICAgICAgICAgZG9tLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdENsb25lRWxlbWVudERlZXAoc2VsZik6CiAgICAgICAgIGRvbSwgY2xvbmUgPSBzZWxmLl9zZXR1cENsb25lRWxlbWVudCgxKQogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNsb25lLmNoaWxkTm9kZXMpID09IDEKQEAgLTcxMSwyNSArNzExLDI1IEBACiAgICAgICAgIGRvYzEgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKICAgICAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdFN1cHBvcnRlZEVyciwgZG9jMS5pbXBvcnROb2RlLCBkb2MyLCBkZWVwKQotICAgIAorCiAgICAgZGVmIHRlc3RJbXBvcnREb2N1bWVudFNoYWxsb3coc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfaW1wb3J0X2RvY3VtZW50KDAsICJ0ZXN0SW1wb3J0RG9jdW1lbnRTaGFsbG93IikKLSAgICAKKwogICAgIGRlZiB0ZXN0SW1wb3J0RG9jdW1lbnREZWVwKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2ltcG9ydF9kb2N1bWVudCgxLCAidGVzdEltcG9ydERvY3VtZW50RGVlcCIpCi0gICAgCisKICAgICBkZWYgdGVzdEltcG9ydERvY3VtZW50VHlwZVNoYWxsb3coc2VsZik6CiAgICAgICAgIHNyYyA9IGNyZWF0ZV9kb2Nfd2l0aF9kb2N0eXBlKCkKICAgICAgICAgdGFyZ2V0ID0gY3JlYXRlX2RvY193aXRob3V0X2RvY3R5cGUoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdFN1cHBvcnRlZEVyciwgdGFyZ2V0LmltcG9ydE5vZGUsIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdFN1cHBvcnRlZEVyciwgdGFyZ2V0LmltcG9ydE5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5kb2N0eXBlLCAwKQotICAgIAorCiAgICAgZGVmIHRlc3RJbXBvcnREb2N1bWVudFR5cGVEZWVwKHNlbGYpOgogICAgICAgICBzcmMgPSBjcmVhdGVfZG9jX3dpdGhfZG9jdHlwZSgpCiAgICAgICAgIHRhcmdldCA9IGNyZWF0ZV9kb2Nfd2l0aG91dF9kb2N0eXBlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIsIHRhcmdldC5pbXBvcnROb2RlLCAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIsIHRhcmdldC5pbXBvcnROb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZG9jdHlwZSwgMSkKLSAgICAKKwogICAgICMgVGVzdGluZyBhdHRyaWJ1dGUgY2xvbmVzIHVzZXMgYSBoZWxwZXIsIGFuZCBzaG91bGQgYWx3YXlzIGJlIGRlZXAsCiAgICAgIyBldmVuIGlmIHRoZSBhcmd1bWVudCB0byBjbG9uZU5vZGUgaXMgZmFsc2UuCiAgICAgZGVmIGNoZWNrX2Nsb25lX2F0dHJpYnV0ZShzZWxmLCBkZWVwLCB0ZXN0TmFtZSk6CkBAIC03NDUsMTMgKzc0NSwxMyBAQAogICAgICAgICAgICAgICAgIHRlc3ROYW1lICsgIjogb3duZXJEb2N1bWVudCBkb2VzIG5vdCBtYXRjaCIpCiAgICAgICAgIHNlbGYuY29uZmlybShjbG9uZS5zcGVjaWZpZWQsCiAgICAgICAgICAgICAgICAgdGVzdE5hbWUgKyAiOiBjbG9uZWQgYXR0cmlidXRlIG11c3QgaGF2ZSBzcGVjaWZpZWQgPT0gVHJ1ZSIpCi0gICAgCisKICAgICBkZWYgdGVzdENsb25lQXR0cmlidXRlU2hhbGxvdyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19jbG9uZV9hdHRyaWJ1dGUoMCwgInRlc3RDbG9uZUF0dHJpYnV0ZVNoYWxsb3ciKQotICAgIAorCiAgICAgZGVmIHRlc3RDbG9uZUF0dHJpYnV0ZURlZXAoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfY2xvbmVfYXR0cmlidXRlKDEsICJ0ZXN0Q2xvbmVBdHRyaWJ1dGVEZWVwIikKLSAgICAKKwogICAgIGRlZiBjaGVja19jbG9uZV9waShzZWxmLCBkZWVwLCB0ZXN0TmFtZSk6CiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8P3RhcmdldCBkYXRhPz48ZG9jLz4iKQogICAgICAgICBwaSA9IGRvYy5maXJzdENoaWxkCkBAIC03NTksMTAgKzc1OSwxMCBAQAogICAgICAgICBjbG9uZSA9IHBpLmNsb25lTm9kZShkZWVwKQogICAgICAgICBzZWxmLmNvbmZpcm0oY2xvbmUudGFyZ2V0ID09IHBpLnRhcmdldAogICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5kYXRhID09IHBpLmRhdGEpCi0gICAgCisKICAgICBkZWYgdGVzdENsb25lUElTaGFsbG93KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2Nsb25lX3BpKDAsICJ0ZXN0Q2xvbmVQSVNoYWxsb3ciKQotICAgIAorCiAgICAgZGVmIHRlc3RDbG9uZVBJRGVlcChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19jbG9uZV9waSgxLCAidGVzdENsb25lUElEZWVwIikKIApAQCAtNzcyLDcgKzc3Miw3IEBACiAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJmaXJzdCIpKQogICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgic2Vjb25kIikpCiAgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAyCi0gICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMiwgCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMiwKICAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZSAtLSBwcmVwYXJhdGlvbiIpCiAgICAgICAgIGRvYy5ub3JtYWxpemUoKQogICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMQpAQCAtNzgxLDcgKzc4MSw3IEBACiAgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5kYXRhID09ICJmaXJzdHNlY29uZCIKICAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplIC0tIHJlc3VsdCIpCiAgICAgICAgIGRvYy51bmxpbmsoKQotICAgIAorCiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAogICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpCkBAIC03OTAsMjEgKzc5MCwyMSBAQAogICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDAsCiAgICAgICAgICAgICAgICAgInRlc3ROb3JtYWxpemUgLS0gc2luZ2xlIGVtcHR5IG5vZGUgcmVtb3ZlZCIpCiAgICAgICAgIGRvYy51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RTaWJsaW5ncyhzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2M+PD9waT8+dGV4dD88ZWxtLz48L2RvYz4iKQogICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAogICAgICAgICAocGksIHRleHQsIGVsbSkgPSByb290LmNoaWxkTm9kZXMKLSAgICAKKwogICAgICAgICBzZWxmLmNvbmZpcm0ocGkubmV4dFNpYmxpbmcgaXMgdGV4dCBhbmQKICAgICAgICAgICAgICAgICBwaS5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICB0ZXh0Lm5leHRTaWJsaW5nIGlzIGVsbSBhbmQKICAgICAgICAgICAgICAgICB0ZXh0LnByZXZpb3VzU2libGluZyBpcyBwaSBhbmQKICAgICAgICAgICAgICAgICBlbG0ubmV4dFNpYmxpbmcgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICBlbG0ucHJldmlvdXNTaWJsaW5nIGlzIHRleHQsICJ0ZXN0U2libGluZ3MiKQotICAgIAorCiAgICAgICAgIGRvYy51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RQYXJlbnRzKHNlbGYpOgogICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygKICAgICAgICAgICAgICI8ZG9jPjxlbG0xPjxlbG0yLz48ZWxtMj48ZWxtMy8+PC9lbG0yPjwvZWxtMT48L2RvYz4iKQpAQCAtODEyLDE0ICs4MTIsMTQgQEAKICAgICAgICAgZWxtMSA9IHJvb3QuY2hpbGROb2Rlc1swXQogICAgICAgICAoZWxtMmEsIGVsbTJiKSA9IGVsbTEuY2hpbGROb2RlcwogICAgICAgICBlbG0zID0gZWxtMmIuY2hpbGROb2Rlc1swXQotICAgIAorCiAgICAgICAgIHNlbGYuY29uZmlybShyb290LnBhcmVudE5vZGUgaXMgZG9jIGFuZAogICAgICAgICAgICAgICAgIGVsbTEucGFyZW50Tm9kZSBpcyByb290IGFuZAogICAgICAgICAgICAgICAgIGVsbTJhLnBhcmVudE5vZGUgaXMgZWxtMSBhbmQKICAgICAgICAgICAgICAgICBlbG0yYi5wYXJlbnROb2RlIGlzIGVsbTEgYW5kCiAgICAgICAgICAgICAgICAgZWxtMy5wYXJlbnROb2RlIGlzIGVsbTJiLCAidGVzdFBhcmVudHMiKQogICAgICAgICBkb2MudW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0Tm9kZUxpc3RJdGVtKHNlbGYpOgogICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYz48ZS8+PGUvPjwvZG9jPiIpCiAgICAgICAgIGNoaWxkcmVuID0gZG9jLmNoaWxkTm9kZXMKQEAgLTgzMSwxMCArODMxLDEwIEBACiAgICAgICAgICAgICAgICAgYW5kIGRvY2VsZW0uY2hpbGROb2Rlcy5pdGVtKDApLmNoaWxkTm9kZXMuaXRlbSgwKSBpcyBOb25lLAogICAgICAgICAgICAgICAgICJ0ZXN0IE5vZGVMaXN0Lml0ZW0oKSIpCiAgICAgICAgIGRvYy51bmxpbmsoKQotICAgIAorCiAgICAgZGVmIHRlc3RTQVgyRE9NKHNlbGYpOgogICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KLSAgICAKKwogICAgICAgICBzYXgyZG9tID0gcHVsbGRvbS5TQVgyRE9NKCkKICAgICAgICAgc2F4MmRvbS5zdGFydERvY3VtZW50KCkKICAgICAgICAgc2F4MmRvbS5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQpAQCAtODQ1LDEyICs4NDUsMTIgQEAKICAgICAgICAgc2F4MmRvbS5jaGFyYWN0ZXJzKCJ0ZXh0IikKICAgICAgICAgc2F4MmRvbS5lbmRFbGVtZW50KCJkb2MiKQogICAgICAgICBzYXgyZG9tLmVuZERvY3VtZW50KCkKLSAgICAKKwogICAgICAgICBkb2MgPSBzYXgyZG9tLmRvY3VtZW50CiAgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CiAgICAgICAgICh0ZXh0MSwgZWxtMSwgdGV4dDIpID0gcm9vdC5jaGlsZE5vZGVzCiAgICAgICAgIHRleHQzID0gZWxtMS5jaGlsZE5vZGVzWzBdCi0gICAgCisKICAgICAgICAgc2VsZi5jb25maXJtKHRleHQxLnByZXZpb3VzU2libGluZyBpcyBOb25lIGFuZAogICAgICAgICAgICAgICAgIHRleHQxLm5leHRTaWJsaW5nIGlzIGVsbTEgYW5kCiAgICAgICAgICAgICAgICAgZWxtMS5wcmV2aW91c1NpYmxpbmcgaXMgdGV4dDEgYW5kCkBAIC04NTksMjggKzg1OSwyOCBAQAogICAgICAgICAgICAgICAgIHRleHQyLm5leHRTaWJsaW5nIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgdGV4dDMucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgdGV4dDMubmV4dFNpYmxpbmcgaXMgTm9uZSwgInRlc3RTQVgyRE9NIC0gc2libGluZ3MiKQotICAgIAorCiAgICAgICAgIHNlbGYuY29uZmlybShyb290LnBhcmVudE5vZGUgaXMgZG9jIGFuZAogICAgICAgICAgICAgICAgIHRleHQxLnBhcmVudE5vZGUgaXMgcm9vdCBhbmQKICAgICAgICAgICAgICAgICBlbG0xLnBhcmVudE5vZGUgaXMgcm9vdCBhbmQKICAgICAgICAgICAgICAgICB0ZXh0Mi5wYXJlbnROb2RlIGlzIHJvb3QgYW5kCiAgICAgICAgICAgICAgICAgdGV4dDMucGFyZW50Tm9kZSBpcyBlbG0xLCAidGVzdFNBWDJET00gLSBwYXJlbnRzIikKICAgICAgICAgZG9jLnVubGluaygpCi0gICAgCisKICAgICBkZWYgdGVzdEVuY29kaW5ncyhzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoJzxmb28+JiN4MjBhYzs8L2Zvbz4nKQogICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLnRveG1sKCkgPT0gdSc8P3htbCB2ZXJzaW9uPSIxLjAiID8+PGZvbz5cdTIwYWM8L2Zvbz4nCi0gICAgICAgICAgICAgICAgYW5kIGRvYy50b3htbCgndXRmLTgnKSA9PSAKKyAgICAgICAgICAgICAgICBhbmQgZG9jLnRveG1sKCd1dGYtOCcpID09CiAgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGZvbz5ceGUyXHg4Mlx4YWM8L2Zvbz4nCi0gICAgICAgICAgICAgICAgYW5kIGRvYy50b3htbCgnaXNvLTg4NTktMTUnKSA9PSAKKyAgICAgICAgICAgICAgICBhbmQgZG9jLnRveG1sKCdpc28tODg1OS0xNScpID09CiAgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTE1Ij8+PGZvbz5ceGE0PC9mb28+JywKICAgICAgICAgICAgICAgICAidGVzdEVuY29kaW5ncyAtIGVuY29kaW5nIEVVUk8gU0lHTiIpCi0gICAgCi0gICAgICAgICMgVmVyaWZ5IHRoYXQgY2hhcmFjdGVyIGRlY29kaW5nIGVycm9ycyB0aHJvdyBleGNlcHRpb25zIGluc3RlYWQgCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBjaGFyYWN0ZXIgZGVjb2RpbmcgZXJyb3JzIHRocm93IGV4Y2VwdGlvbnMgaW5zdGVhZAogICAgICAgICAjIG9mIGNyYXNoaW5nCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgcGFyc2VTdHJpbmcsIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIHBhcnNlU3RyaW5nLAogICAgICAgICAgICAgICAgICc8ZnJhblx4ZTdhaXM+Q29tbWVudCBceGU3YSB2YSA/IFRyXHhlOHMgYmllbiA/PC9mcmFuXHhlN2Fpcz4nKQotICAgIAorCiAgICAgICAgIGRvYy51bmxpbmsoKQogCiAgICAgY2xhc3MgVXNlckRhdGFIYW5kbGVyOgpAQCAtODg5LDcgKzg4OSw3IEBACiAgICAgICAgICAgICBkc3Quc2V0VXNlckRhdGEoa2V5LCBkYXRhICsgMSwgc2VsZikKICAgICAgICAgICAgIHNyYy5zZXRVc2VyRGF0YShrZXksIE5vbmUsIE5vbmUpCiAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IDEKLSAgICAKKwogICAgIGRlZiB0ZXN0VXNlckRhdGEoc2VsZik6CiAgICAgICAgIGRvbSA9IERvY3VtZW50KCkKICAgICAgICAgbiA9IGRvbS5jcmVhdGVFbGVtZW50KCdlJykKQEAgLTkwMyw3ICs5MDMsNyBAQAogICAgICAgICBuLnNldFVzZXJEYXRhKCJmb28iLCBOb25lLCBOb25lKQogICAgICAgICBzZWxmLmNvbmZpcm0obi5nZXRVc2VyRGF0YSgiZm9vIikgaXMgTm9uZSkKICAgICAgICAgc2VsZi5jb25maXJtKG4uZ2V0VXNlckRhdGEoImJhciIpID09IDEzKQotICAgIAorCiAgICAgICAgIGhhbmRsZXIgPSBzZWxmLlVzZXJEYXRhSGFuZGxlcigpCiAgICAgICAgIG4uc2V0VXNlckRhdGEoImJhciIsIDEyLCBoYW5kbGVyKQogICAgICAgICBjID0gbi5jbG9uZU5vZGUoMSkKQEAgLTkxNiwxOCArOTE2LDE4IEBACiAKICAgICBkZWYgY2hlY2tSZW5hbWVOb2RlU2hhcmVkQ29uc3RyYWludHMoc2VsZiwgZG9jLCBub2RlKToKICAgICAgICAgIyBNYWtlIHN1cmUgaWxsZWdhbCBOUyB1c2FnZSBpcyBkZXRlY3RlZDoKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5OYW1lc3BhY2VFcnIsIGRvYy5yZW5hbWVOb2RlLCBub2RlLCAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5OYW1lc3BhY2VFcnIsIGRvYy5yZW5hbWVOb2RlLCBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgInhtbG5zOmZvbyIpCiAgICAgICAgIGRvYzIgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyLCBkb2MyLnJlbmFtZU5vZGUsIG5vZGUsIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIsIGRvYzIucmVuYW1lTm9kZSwgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJmb28iKQotICAgIAorCiAgICAgZGVmIHRlc3RSZW5hbWVBdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGE9J3YnLz4iKQogICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudAogICAgICAgICBhdHRybWFwID0gZWxlbS5hdHRyaWJ1dGVzCiAgICAgICAgIGF0dHIgPSBlbGVtLmF0dHJpYnV0ZXNbJ2EnXQotICAgIAorCiAgICAgICAgICMgU2ltcGxlIHJlbmFtaW5nCiAgICAgICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImIiKQogICAgICAgICBzZWxmLmNvbmZpcm0oYXR0ci5uYW1lID09ICJiIgpAQCAtOTQxLDcgKzk0MSw3IEBACiAgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbImIiXS5pc1NhbWVOb2RlKGF0dHIpCiAgICAgICAgICAgICAgICAgYW5kIGF0dHIub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykKICAgICAgICAgICAgICAgICBhbmQgYXR0ci5vd25lckVsZW1lbnQuaXNTYW1lTm9kZShlbGVtKSkKLSAgICAKKwogICAgICAgICAjIFJlbmFtZSB0byBoYXZlIGEgbmFtZXNwYWNlLCBubyBwcmVmaXgKICAgICAgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYyIpCiAgICAgICAgIHNlbGYuY29uZmlybShhdHRyLm5hbWUgPT0gImMiCkBAIC05NTcsNyArOTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJjIikuaXNTYW1lTm9kZShhdHRyKQogICAgICAgICAgICAgICAgIGFuZCBhdHRybWFwWyJjIl0uaXNTYW1lTm9kZShhdHRyKQogICAgICAgICAgICAgICAgIGFuZCBhdHRybWFwWygiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgImMiKV0uaXNTYW1lTm9kZShhdHRyKSkKLSAgICAKKwogICAgICAgICAjIFJlbmFtZSB0byBoYXZlIGEgbmFtZXNwYWNlLCB3aXRoIHByZWZpeAogICAgICAgICBhdHRyID0gZG9jLnJlbmFtZU5vZGUoYXR0ciwgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiLCAicDpkIikKICAgICAgICAgc2VsZi5jb25maXJtKGF0dHIubmFtZSA9PSAicDpkIgpAQCAtOTc2LDcgKzk3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIiwgImQiKS5pc1NhbWVOb2RlKGF0dHIpCiAgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbInA6ZCJdLmlzU2FtZU5vZGUoYXR0cikKICAgICAgICAgICAgICAgICBhbmQgYXR0cm1hcFsoImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiLCAiZCIpXS5pc1NhbWVOb2RlKGF0dHIpKQotICAgIAorCiAgICAgICAgICMgUmVuYW1lIGJhY2sgdG8gYSBzaW1wbGUgbm9uLU5TIG5vZGUKICAgICAgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZSIpCiAgICAgICAgIHNlbGYuY29uZmlybShhdHRyLm5hbWUgPT0gImUiCkBAIC05OTQsMTUgKzk5NCwxNSBAQAogICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImUiKS5pc1NhbWVOb2RlKGF0dHIpCiAgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbImUiXS5pc1NhbWVOb2RlKGF0dHIpKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTmFtZXNwYWNlRXJyLCBkb2MucmVuYW1lTm9kZSwgYXR0ciwgCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTmFtZXNwYWNlRXJyLCBkb2MucmVuYW1lTm9kZSwgYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJ4bWxucyIpCiAgICAgICAgIHNlbGYuY2hlY2tSZW5hbWVOb2RlU2hhcmVkQ29uc3RyYWludHMoZG9jLCBhdHRyKQogICAgICAgICBkb2MudW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0UmVuYW1lRWxlbWVudChzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCiAgICAgICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50Ci0gICAgCisKICAgICAgICAgIyBTaW1wbGUgcmVuYW1pbmcKICAgICAgICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYSIpCiAgICAgICAgIHNlbGYuY29uZmlybShlbGVtLnRhZ05hbWUgPT0gImEiCkBAIC0xMDExLDcgKzEwMTEsNyBAQAogICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRQogICAgICAgICAgICAgICAgIGFuZCBlbGVtLnByZWZpeCBpcyBOb25lCiAgICAgICAgICAgICAgICAgYW5kIGVsZW0ub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykpCi0gICAgCisKICAgICAgICAgIyBSZW5hbWUgdG8gaGF2ZSBhIG5hbWVzcGFjZSwgbm8gcHJlZml4CiAgICAgICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgImIiKQogICAgICAgICBzZWxmLmNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJiIgpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKICAgICAgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIKICAgICAgICAgICAgICAgICBhbmQgZWxlbS5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQotICAgIAorCiAgICAgICAgICMgUmVuYW1lIHRvIGhhdmUgYSBuYW1lc3BhY2UsIHdpdGggcHJlZml4CiAgICAgICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIsICJwOmMiKQogICAgICAgICBzZWxmLmNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJwOmMiCkBAIC0xMDI5LDcgKzEwMjksNyBAQAogICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSAiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIKICAgICAgICAgICAgICAgICBhbmQgZWxlbS5wcmVmaXggPT0gInAiCiAgICAgICAgICAgICAgICAgYW5kIGVsZW0ub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykpCi0gICAgCisKICAgICAgICAgIyBSZW5hbWUgYmFjayB0byBhIHNpbXBsZSBub24tTlMgbm9kZQogICAgICAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJkIikKICAgICAgICAgc2VsZi5jb25maXJtKGVsZW0udGFnTmFtZSA9PSAiZCIKQEAgLTEwMzgsMTcgKzEwMzgsMTcgQEAKICAgICAgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKICAgICAgICAgICAgICAgICBhbmQgZWxlbS5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQotICAgIAorCiAgICAgICAgIHNlbGYuY2hlY2tSZW5hbWVOb2RlU2hhcmVkQ29uc3RyYWludHMoZG9jLCBlbGVtKQogICAgICAgICBkb2MudW5saW5rKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0UmVuYW1lT3RoZXIoc2VsZik6CiAgICAgICAgICMgV2UgaGF2ZSB0byBjcmVhdGUgYSBjb21tZW50IG5vZGUgZXhwbGljaXRseSBzaW5jZSBub3QgYWxsIERPTQogICAgICAgICAjIGJ1aWxkZXJzIHVzZWQgd2l0aCBtaW5pZG9tIGFkZCBjb21tZW50cyB0byB0aGUgRE9NLgogICAgICAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgKICAgICAgICAgICAgIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZSIsIE5vbmUpCiAgICAgICAgIG5vZGUgPSBkb2MuY3JlYXRlQ29tbWVudCgiY29tbWVudCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90U3VwcG9ydGVkRXJyLCBkb2MucmVuYW1lTm9kZSwgbm9kZSwgCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90U3VwcG9ydGVkRXJyLCBkb2MucmVuYW1lTm9kZSwgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJmb28iKQogICAgICAgICBkb2MudW5saW5rKCkKIApAQCAtMTA1NywxMyArMTA1NywxMyBAQAogICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudAogICAgICAgICB0ZXh0ID0gZWxlbS5jaGlsZE5vZGVzWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRleHQubm9kZVR5cGUsIE5vZGUuVEVYVF9OT0RFKQotICAgIAorCiAgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dCwgImEiKQogICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiYiIpKQogICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJhYiIpCiAgICAgICAgIGVsZW0uaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oImMiKSwgdGV4dCkKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKLSAgICAKKwogICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBkb24ndCBjcm9zcyBvdGhlciBub2RlcwogICAgICAgICBzcGxpdHRlciA9IGRvYy5jcmVhdGVDb21tZW50KCJjb21tZW50IikKICAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChzcGxpdHRlcikKQEAgLTEwNzEsMjMgKzEwNzEsMjMgQEAKICAgICAgICAgZWxlbS5hcHBlbmRDaGlsZCh0ZXh0MikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQotICAgIAorCiAgICAgICAgIHggPSBkb2MuY3JlYXRlRWxlbWVudCgieCIpCiAgICAgICAgIGVsZW0ucmVwbGFjZUNoaWxkKHgsIHNwbGl0dGVyKQogICAgICAgICBzcGxpdHRlciA9IHgKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQotICAgIAorCiAgICAgICAgIHggPSBkb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ5IiwgInoiKQogICAgICAgICBlbGVtLnJlcGxhY2VDaGlsZCh4LCBzcGxpdHRlcikKICAgICAgICAgc3BsaXR0ZXIgPSB4CiAgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dCwgImNhYiIpCiAgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dDIsICJkIikKLSAgICAKKwogICAgICAgICBlbGVtLnJlbW92ZUNoaWxkKHNwbGl0dGVyKQogICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJjYWJkIikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImNhYmQiKQotICAgIAorCiAgICAgZGVmIHRlc3RQYXRjaDEwOTQxNjQoc2VsZik6CiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPjxlLz48L2RvYz4iKQogICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudApAQCAtMTA5Niw3ICsxMDk2LDcgQEAKICAgICAgICAgIyBDaGVjayB0aGF0IHJlcGxhY2luZyBhIGNoaWxkIHdpdGggaXRzZWxmIGxlYXZlcyB0aGUgdHJlZSB1bmNoYW5nZWQKICAgICAgICAgZWxlbS5yZXBsYWNlQ2hpbGQoZSwgZSkKICAgICAgICAgc2VsZi5jb25maXJtKGUucGFyZW50Tm9kZSBpcyBlbGVtLCAiQWZ0ZXIgcmVwbGFjZUNoaWxkKCkiKQotICAgIAorCiAgICAgZGVmIHRlc3RSZXBsYWNlV2hvbGVUZXh0KHNlbGYpOgogICAgICAgICBkZWYgc2V0dXAoKToKICAgICAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPmE8ZS8+ZDwvZG9jPiIpCkBAIC0xMTA3LDI1ICsxMTA3LDI1IEBACiAgICAgICAgICAgICBlbGVtLmluc2VydEJlZm9yZShkb2MuY3JlYXRlVGV4dE5vZGUoImIiKSwgc3BsaXR0ZXIpCiAgICAgICAgICAgICBlbGVtLmluc2VydEJlZm9yZShkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKCJjIiksIHRleHQxKQogICAgICAgICAgICAgcmV0dXJuIGRvYywgZWxlbSwgdGV4dDEsIHNwbGl0dGVyLCB0ZXh0MgotICAgIAorCiAgICAgICAgIGRvYywgZWxlbSwgdGV4dDEsIHNwbGl0dGVyLCB0ZXh0MiA9IHNldHVwKCkKICAgICAgICAgdGV4dCA9IHRleHQxLnJlcGxhY2VXaG9sZVRleHQoIm5ldyBjb250ZW50IikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAibmV3IGNvbnRlbnQiKQogICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQyLCAiZCIpCiAgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWxlbS5jaGlsZE5vZGVzKSA9PSAzKQotICAgIAorCiAgICAgICAgIGRvYywgZWxlbSwgdGV4dDEsIHNwbGl0dGVyLCB0ZXh0MiA9IHNldHVwKCkKICAgICAgICAgdGV4dCA9IHRleHQyLnJlcGxhY2VXaG9sZVRleHQoIm5ldyBjb250ZW50IikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAibmV3IGNvbnRlbnQiKQogICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQxLCAiY2FiIikKICAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbGVtLmNoaWxkTm9kZXMpID09IDUpCi0gICAgCisKICAgICAgICAgZG9jLCBlbGVtLCB0ZXh0MSwgc3BsaXR0ZXIsIHRleHQyID0gc2V0dXAoKQogICAgICAgICB0ZXh0ID0gdGV4dDEucmVwbGFjZVdob2xlVGV4dCgiIikKICAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQogICAgICAgICBzZWxmLmNvbmZpcm0odGV4dCBpcyBOb25lCiAgICAgICAgICAgICAgICAgYW5kIGxlbihlbGVtLmNoaWxkTm9kZXMpID09IDIpCi0gICAgCisKICAgICBkZWYgdGVzdFNjaGVtYVR5cGUoc2VsZik6CiAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKAogICAgICAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgpAQCAtMTE1OCw3ICsxMTU4LDcgQEAKICAgICAgICAgICAgIHQgPSBhLnNjaGVtYVR5cGUKICAgICAgICAgICAgIHNlbGYuY29uZmlybShoYXNhdHRyKHQsICJuYW1lIikKICAgICAgICAgICAgICAgICAgICAgYW5kIHQubmFtZXNwYWNlID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQotICAgIAorCiAgICAgZGVmIHRlc3RTZXRJZEF0dHJpYnV0ZShzZWxmKToKICAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MgYTE9J3YnIGEyPSd3Jy8+IikKICAgICAgICAgZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKQEAgLTExODksNyArMTE4OSw3IEBACiAgICAgICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKICAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKICAgICAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKLSAgICAKKwogICAgIGRlZiB0ZXN0U2V0SWRBdHRyaWJ1dGVOUyhzZWxmKToKICAgICAgICAgTlMxID0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczEiCiAgICAgICAgIE5TMiA9ICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIgpAQCAtMTMwOSw2ICsxMzA5LDYgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChNaW5pZG9tVGVzdCkKLSAgICAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tb2R1bGUucHkgYi9MaWIvdGVzdC90ZXN0X21vZHVsZS5weQppbmRleCAyYzY0ZGM5Li5jYzhiMTkyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21vZHVsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X21vZHVsZS5weQpAQCAtNTYsNiArNTYsNiBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KE1vZHVsZVRlc3RzKQotICAgIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkgYi9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKaW5kZXggMDU1YjQwMy4uYjU3MWJkYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQpAQCAtMjksNyArMjksNyBAQAogICAgICAgICBpZiB4ID4gc3lzLm1heHVuaWNvZGU6CiAgICAgICAgICAgICByYWlzZSBSYW5nZUVycm9yCiAgICAgcmV0dXJuIHUiIi5qb2luKFt1bmljaHIoeCkgZm9yIHggaW4gZGF0YV0pCi0gICAgCisKIGNsYXNzIE5vcm1hbGl6YXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9tYWluKHNlbGYpOgogICAgICAgICBwYXJ0MV9kYXRhID0ge30KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IDE4NWQ5ZGEuLmE5Mjk0YzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgICAgIGZyb20gb3MucGF0aCBpbXBvcnQgam9pbgogCiAgICAgICAgICMgQnVpbGQ6Ci0gICAgICAgICMgICAgIFRFU1RGTi8gICAgICAgICAgICAgICAKKyAgICAgICAgIyAgICAgVEVTVEZOLwogICAgICAgICAjICAgICAgIFRFU1QxLyAgICAgICAgICAgICAgYSBmaWxlIGtpZCBhbmQgdHdvIGRpcmVjdG9yeSBraWRzCiAgICAgICAgICMgICAgICAgICB0bXAxCiAgICAgICAgICMgICAgICAgICBTVUIxLyAgICAgICAgICAgICBhIGZpbGUga2lkIGFuZCBhIGRpcmVjdG9yeSBraWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKaW5kZXggMWViMDZiNC4uMzFmMjJkNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgICAgIGluc3Qud2FpdCgpCiAgICAgICAgIHBvcGVuMi5fY2xlYW51cCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9wZW4yLl9hY3RpdmUsICJfYWN0aXZlIG5vdCBlbXB0eSIpCi0gICAgICAgIHJlYXBfY2hpbGRyZW4oKSAgICAgICAgCisgICAgICAgIHJlYXBfY2hpbGRyZW4oKQogCiAgICAgZGVmIHZhbGlkYXRlX291dHB1dChzZWxmLCB0ZXN0c3RyLCBleHBlY3RlZF9vdXQsIHIsIHcsIGU9Tm9uZSk6CiAgICAgICAgIHcud3JpdGUodGVzdHN0cikKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgaWYgZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGdvdCA9IGUucmVhZCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdvdCwgInVuZXhwZWN0ZWQgJXIgb24gc3RkZXJyIiAlIGdvdCkKLSAgICAgICAgCisKICAgICBkZWYgdGVzdF9wb3BlbjIoc2VsZik6CiAgICAgICAgIHIsIHcgPSBwb3BlbjIucG9wZW4yKHNlbGYuY21kKQogICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcpCkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgIHcsIHIsIGUgPSBvcy5wb3BlbjMoc2VsZi5jbWQpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfb3V0cHV0KHNlbGYudGVzdHN0ciwgc2VsZi5leHBlY3RlZCwgciwgdywgZSkKIAotICAgICAgICAKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChQb3BlbjJUZXN0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CmluZGV4IDNmMWJlN2QuLjM1ZmY2MzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgIGV2dC5zZXQoKQogCiBjbGFzcyBHZW5lcmFsVGVzdHMoVGVzdENhc2UpOgotICAgIAorCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCiAgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlciwgYXJncz0oc2VsZi5ldnQsKSkuc3RhcnQoKQpAQCAtMzgsMTMgKzM4LDEzIEBACiAgICAgICAgICMgY29ubmVjdHMKICAgICAgICAgcG9wID0gcG9wbGliLlBPUDMoImxvY2FsaG9zdCIsIDkwOTEpCiAgICAgICAgIHBvcC5zb2NrLmNsb3NlKCkKLSAgICAgICAgCisKICAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogICAgICAgICAjIGRlZmF1bHQKICAgICAgICAgcG9wID0gcG9wbGliLlBPUDMoImxvY2FsaG9zdCIsIDkwOTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3Auc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgcG9wLnNvY2suY2xvc2UoKQotICAgIAorCiAgICAgZGVmIHRlc3RUaW1lb3V0VmFsdWUoc2VsZik6CiAgICAgICAgICMgYSB2YWx1ZQogICAgICAgICBwb3AgPSBwb3BsaWIuUE9QMygibG9jYWxob3N0IiwgOTA5MSwgdGltZW91dD0zMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weSBiL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weQppbmRleCAwYTU4ZWYxLi42OWNmMDhjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWV4cGF0LnB5CkBAIC0xOSwxMiArMTksMTIgQEAKICAgICAgICAgICAgIFsyLCAxXSwKICAgICAgICAgICAgIFswLCAwXSwKICAgICAgICAgICAgIF0KLSAgICAgICAgCisKICAgICBkZWYgdGVzdF9yZXR1cm5zX3VuaWNvZGUoc2VsZik6CiAgICAgICAgIGZvciB4LCB5IGluIHNlbGYuc2V0X2dldF9wYWlyczoKICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJldHVybnNfdW5pY29kZSA9IHgKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYucGFyc2VyLnJldHVybnNfdW5pY29kZSwgeSkKLSAgICAgICAgCisKICAgICBkZWYgdGVzdF9vcmRlcmVkX2F0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgIGZvciB4LCB5IGluIHNlbGYuc2V0X2dldF9wYWlyczoKICAgICAgICAgICAgIHNlbGYucGFyc2VyLm9yZGVyZWRfYXR0cmlidXRlcyA9IHgKQEAgLTY0LDU3ICs2NCw1NyBAQAogICAgIGNsYXNzIE91dHB1dHRlcjoKICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICAgc2VsZi5vdXQgPSBbXQotICAgICAgICAgICAgCisKICAgICAgICAgZGVmIFN0YXJ0RWxlbWVudEhhbmRsZXIoc2VsZiwgbmFtZSwgYXR0cnMpOgotICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdTdGFydCBlbGVtZW50OiAnICsgcmVwcihuYW1lKSArICcgJyArIAorICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdTdGFydCBlbGVtZW50OiAnICsgcmVwcihuYW1lKSArICcgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGRpY3QoYXR0cnMpKQotICAgIAorCiAgICAgICAgIGRlZiBFbmRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lKToKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnRW5kIGVsZW1lbnQ6ICcgKyByZXByKG5hbWUpKQotICAgIAorCiAgICAgICAgIGRlZiBDaGFyYWN0ZXJEYXRhSGFuZGxlcihzZWxmLCBkYXRhKToKICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnN0cmlwKCkKICAgICAgICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdDaGFyYWN0ZXIgZGF0YTogJyArIHJlcHIoZGF0YSkpCi0gICAgCisKICAgICAgICAgZGVmIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoc2VsZiwgdGFyZ2V0LCBkYXRhKToKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnUEk6ICcgKyByZXByKHRhcmdldCkgKyAnICcgKyByZXByKGRhdGEpKQotICAgIAorCiAgICAgICAgIGRlZiBTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHNlbGYsIHByZWZpeCwgdXJpKToKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnTlMgZGVjbDogJyArIHJlcHIocHJlZml4KSArICcgJyArIHJlcHIodXJpKSkKLSAgICAKKwogICAgICAgICBkZWYgRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoc2VsZiwgcHJlZml4KToKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnRW5kIG9mIE5TIGRlY2w6ICcgKyByZXByKHByZWZpeCkpCi0gICAgCisKICAgICAgICAgZGVmIFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihzZWxmKToKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnU3RhcnQgb2YgQ0RBVEEgc2VjdGlvbicpCi0gICAgCisKICAgICAgICAgZGVmIEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoc2VsZik6CiAgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ0VuZCBvZiBDREFUQSBzZWN0aW9uJykKLSAgICAKKwogICAgICAgICBkZWYgQ29tbWVudEhhbmRsZXIoc2VsZiwgdGV4dCk6CiAgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ0NvbW1lbnQ6ICcgKyByZXByKHRleHQpKQotICAgIAorCiAgICAgICAgIGRlZiBOb3RhdGlvbkRlY2xIYW5kbGVyKHNlbGYsICphcmdzKToKICAgICAgICAgICAgIG5hbWUsIGJhc2UsIHN5c2lkLCBwdWJpZCA9IGFyZ3MKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnTm90YXRpb24gZGVjbGFyZWQ6ICVzJyAlKGFyZ3MsKSkKLSAgICAKKwogICAgICAgICBkZWYgVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihzZWxmLCAqYXJncyk6CiAgICAgICAgICAgICBlbnRpdHlOYW1lLCBiYXNlLCBzeXN0ZW1JZCwgcHVibGljSWQsIG5vdGF0aW9uTmFtZSA9IGFyZ3MKICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnVW5wYXJzZWQgZW50aXR5IGRlY2w6ICVzJyAlKGFyZ3MsKSkKLSAgICAKKwogICAgICAgICBkZWYgTm90U3RhbmRhbG9uZUhhbmRsZXIoc2VsZiwgdXNlckRhdGEpOgogICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdOb3Qgc3RhbmRhbG9uZScpCiAgICAgICAgICAgICByZXR1cm4gMQotICAgIAorCiAgICAgICAgIGRlZiBFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoc2VsZiwgKmFyZ3MpOgogICAgICAgICAgICAgY29udGV4dCwgYmFzZSwgc3lzSWQsIHB1YklkID0gYXJncwogICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdFeHRlcm5hbCBlbnRpdHkgcmVmOiAlcycgJShhcmdzWzE6XSwpKQogICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAKKwogICAgICAgICBkZWYgRGVmYXVsdEhhbmRsZXIoc2VsZiwgdXNlckRhdGEpOgogICAgICAgICAgICAgcGFzcwotICAgIAorCiAgICAgICAgIGRlZiBEZWZhdWx0SGFuZGxlckV4cGFuZChzZWxmLCB1c2VyRGF0YSk6CiAgICAgICAgICAgICBwYXNzCiAKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICAjJ05vdFN0YW5kYWxvbmVIYW5kbGVyJywKICAgICAgICAgJ0V4dGVybmFsRW50aXR5UmVmSGFuZGxlcicKICAgICAgICAgXQotICAgIAorCiAgICAgZGVmIHRlc3RfdXRmOChzZWxmKToKIAogICAgICAgICBvdXQgPSBzZWxmLk91dHB1dHRlcigpCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICAgICAgICAgIHNldGF0dHIocGFyc2VyLCBuYW1lLCBnZXRhdHRyKG91dCwgbmFtZSkpCiAgICAgICAgIHBhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSAwCiAgICAgICAgIHBhcnNlci5QYXJzZShkYXRhLCAxKQotICAgICAgICAgICAgCisKICAgICAgICAgIyBWZXJpZnkgb3V0cHV0CiAgICAgICAgIG9wID0gb3V0Lm91dAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvcFswXSwgJ1BJOiBcJ3htbC1zdHlsZXNoZWV0XCcgXCdocmVmPSJzdHlsZXNoZWV0LmNzcyJcJycpCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgcGFyc2VyLnJldHVybnNfdW5pY29kZSA9IDEKICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5oYW5kbGVyX25hbWVzOgogICAgICAgICAgICAgc2V0YXR0cihwYXJzZXIsIG5hbWUsIGdldGF0dHIob3V0LCBuYW1lKSkKLSAgICAgICAgICAgIAorCiAgICAgICAgIHBhcnNlci5QYXJzZShkYXRhLCAxKQogCiAgICAgICAgIG9wID0gb3V0Lm91dApAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuaGFuZGxlcl9uYW1lczoKICAgICAgICAgICAgIHNldGF0dHIocGFyc2VyLCBuYW1lLCBnZXRhdHRyKG91dCwgbmFtZSkpCiAgICAgICAgIGZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQotICAgICAgICAKKwogICAgICAgICBwYXJzZXIuUGFyc2VGaWxlKGZpbGUpCiAKICAgICAgICAgb3AgPSBvdXQub3V0CkBAIC0yMjYsMTUgKzIyNiwxNSBAQAogICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUoKQogICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj1Ob25lKQogICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nICcpCi0gICAgICAgIAorCiAgICAgZGVmIHRlc3RfaWxsZWdhbChzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9NDIpCiAgICAgICAgICAgICBzZWxmLmZhaWwoKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RyKGUpLCAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0cihlKSwKICAgICAgICAgICAgICAgICAnUGFyc2VyQ3JlYXRlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0cmluZyBvciBOb25lLCBub3QgaW50JykKLSAgICAgICAgCisKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9J3RvbyBsb25nJykKICAgICAgICAgICAgIHNlbGYuZmFpbCgpCkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICAgICAgc2VsZi5wYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQogICAgICAgICBzZWxmLnBhcnNlci5idWZmZXJfdGV4dCA9IDEKICAgICAgICAgc2VsZi5wYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLkNoYXJhY3RlckRhdGFIYW5kbGVyCi0gICAgICAgIAorCiAgICAgZGVmIGNoZWNrKHNlbGYsIGV4cGVjdGVkLCBsYWJlbCk6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc3R1ZmYsIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICIlc1xuc3R1ZmYgICAgPSAlclxuZXhwZWN0ZWQgPSAlciIKQEAgLTMwNywxMiArMzA3LDEyIEBACiAgICAgZGVmIHRlc3RfZGVmYXVsdF90b19kaXNhYmxlZChzZWxmKToKICAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZXIuYnVmZmVyX3RleHQpCi0gICAgICAgIAorCiAgICAgZGVmIHRlc3RfYnVmZmVyaW5nX2VuYWJsZWQoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGJ1ZmZlcmluZyBpcyB0dXJuZWQgb24KICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmJ1ZmZlcl90ZXh0KQogICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiLz4yPGMvPjM8L2E+IiwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zdHVmZiwgWycxMjMnXSwgCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc3R1ZmYsIFsnMTIzJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJlZCB0ZXh0IG5vdCBwcm9wZXJseSBjb2xsYXBzZWQiKQogCiAgICAgZGVmIHRlc3QxKHNlbGYpOgpAQCAtMzIwLDEwICszMjAsMTAgQEAKICAgICAgICAgIyBYWFggbGlrZSwgYnV0IGl0IHRlc3RzIHdoYXQgd2UgbmVlZCB0byBjb25jaXNlbHkuCiAgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJTdGFydEVsZW1lbnRIYW5kbGVyIl0pCiAgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIgYnVmZmVyLXRleHQ9J25vJy8+MlxuMzxjIGJ1ZmZlci10ZXh0PSd5ZXMnLz40XG41PC9hPiIsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc3R1ZmYsIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnN0dWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICIyIiwgIlxuIiwgIjMiLCAiPGM+IiwgIjRcbjUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcmluZyBjb250cm9sIG5vdCByZWFjdGluZyBhcyBleHBlY3RlZCIpCi0gICAgCisKICAgICBkZWYgdGVzdDIoc2VsZik6CiAgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPiZsdDsyJmd0OzxjLz4mIzMyO1xuJiN4MjA7MzwvYT4iLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnN0dWZmLCBbIjE8Mj4gXG4gMyJdLApAQCAtMzM5LDcgKzMzOSw3IEBACiAgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJTdGFydEVsZW1lbnRIYW5kbGVyIiwgIkVuZEVsZW1lbnRIYW5kbGVyIl0pCiAgICAgICAgIHNlbGYucGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gTm9uZQogICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiLz4yPGMvPjM8L2E+IiwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zdHVmZiwgCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiPGE+IiwgIjxiPiIsICI8L2I+IiwgIjxjPiIsICI8L2M+IiwgIjwvYT4iXSkKIAogICAgIGRlZiB0ZXN0NShzZWxmKToKQEAgLTM0OSwxMSArMzQ5LDExIEBACiAgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICI8L2I+IiwgIjIiLCAiPGM+IiwgIjwvYz4iLCAiMyIsICI8L2E+Il0pCiAKICAgICBkZWYgdGVzdDYoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJDb21tZW50SGFuZGxlciIsICJFbmRFbGVtZW50SGFuZGxlciIsIAorICAgICAgICBzZWxmLnNldEhhbmRsZXJzKFsiQ29tbWVudEhhbmRsZXIiLCAiRW5kRWxlbWVudEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAiU3RhcnRFbGVtZW50SGFuZGxlciJdKQogICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiLz4yPGM+PC9jPjM0NTwvYT4gIiwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zdHVmZiwgCi0gICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICI8L2I+IiwgIjIiLCAiPGM+IiwgIjwvYz4iLCAiMzQ1IiwgIjwvYT4iXSwgCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc3R1ZmYsCisgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICI8L2I+IiwgIjIiLCAiPGM+IiwgIjwvYz4iLCAiMzQ1IiwgIjwvYT4iXSwKICAgICAgICAgICAgICJidWZmZXJlZCB0ZXh0IG5vdCBwcm9wZXJseSBzcGxpdCIpCiAKICAgICBkZWYgdGVzdDcoc2VsZik6CkBAIC0zOTksNyArMzk5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudXB0byA8IGxlbihzZWxmLmV4cGVjdGVkX2xpc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3RvbyBtYW55IHBhcnNlciBldmVudHMnKQogICAgICAgICBleHBlY3RlZCA9IHNlbGYuZXhwZWN0ZWRfbGlzdFtzZWxmLnVwdG9dCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBvcywgZXhwZWN0ZWQsIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwb3MsIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICdFeHBlY3RlZCBwb3NpdGlvbiAlcywgZ290IHBvc2l0aW9uICVzJyAlKHBvcywgZXhwZWN0ZWQpKQogICAgICAgICBzZWxmLnVwdG8gKz0gMQogCkBAIC00MjIsMTYgKzQyMiwxNiBAQAogICAgICAgICB4bWwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvODg1OSc/PjxzPiVzPC9zPiIgJSAoJ2EnICogMTAyNSkKICAgICAgICAgIyB0aGlzIG9uZSBkb2Vzbid0IGNyYXNoCiAgICAgICAgICN4bWwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJz8+PHM+JXM8L3M+IiAlICgnYScgKiAxMDAwMCkKLSAgICAKKwogICAgICAgICBjbGFzcyBTcGVjaWZpY0V4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgICAgICAgICAgcGFzcwotICAgICAgICAKKwogICAgICAgICBkZWYgaGFuZGxlcih0ZXh0KToKICAgICAgICAgICAgIHJhaXNlIFNwZWNpZmljRXhjZXB0aW9uCi0gICAgCisKICAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKICAgICAgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcgotICAgIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgcGFyc2VyLlBhcnNlLCB4bWwpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKaW5kZXggYjE4N2VhMS4uZWNhNWZiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CkBAIC02MDcsNyArNjA3LDcgQEAKICAgICAgICAgZm9yIHR5cGVjb2RlIGluICdjYkJ1aEhpSWxMZmQnOgogICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KHR5cGVjb2RlKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5jb21waWxlKCJibGEiKS5tYXRjaChhKSwgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuY29tcGlsZSgiIikubWF0Y2goYSkuZ3JvdXBzKCksICgpKSAgICAgICAgICAgIAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5jb21waWxlKCIiKS5tYXRjaChhKS5ncm91cHMoKSwgKCkpCiAKIGRlZiBydW5fcmVfdGVzdHMoKToKICAgICBmcm9tIHRlc3QucmVfdGVzdHMgaW1wb3J0IGJlbmNobWFya3MsIHRlc3RzLCBTVUNDRUVELCBGQUlMLCBTWU5UQVhfRVJST1IKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5IGIvTGliL3Rlc3QvdGVzdF9zYXgucHkKaW5kZXggNTI5ODE1NS4uYmZkZDcxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zYXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zYXgucHkKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0KCJhdHRycyIsIDI1KSwgMjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLml0ZW1zKCksIFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy52YWx1ZXMoKSwgW10pCi0gICAgCisKICAgICBkZWYgdmVyaWZ5X2VtcHR5X25zYXR0cnMoc2VsZiwgYXR0cnMpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0VmFsdWUsIChuc191cmksICJhdHRyIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUsICJuczphdHRyIikKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKSwgImF0dHIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRyc1siYXR0ciJdLCAidmFsIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKSwgImF0dHIiKQotICAgIAorCiBjbGFzcyBNYWtlUGFyc2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfbWFrZV9wYXJzZXIyKHNlbGYpOgogICAgICAgICAjIENyZWF0aW5nIHBhcnNlcnMgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdyBzaG91bGQgc3VjY2VlZC4KQEAgLTEwMCwxMSArMTAwLDExIEBACiAgICAgIyA9PT09PSBlc2NhcGUKICAgICBkZWYgdGVzdF9lc2NhcGVfYmFzaWMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVzY2FwZSgiRG9uYWxkIER1Y2sgJiBDbyIpLCAiRG9uYWxkIER1Y2sgJmFtcDsgQ28iKQotICAgIAorCiAgICAgZGVmIHRlc3RfZXNjYXBlX2FsbChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXNjYXBlKCI8RG9uYWxkIER1Y2sgJiBDbz4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtEb25hbGQgRHVjayAmYW1wOyBDbyZndDsiKQotICAgIAorCiAgICAgZGVmIHRlc3RfZXNjYXBlX2V4dHJhKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlc2NhcGUoIkhlaSBw5SBkZWciLCB7IuUiIDogIiZhcmluZzsifSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWkgcCZhcmluZzsgZGVnIikKQEAgLTExMiwzNSArMTEyLDM1IEBACiAgICAgIyA9PT09PSB1bmVzY2FwZQogICAgIGRlZiB0ZXN0X3VuZXNjYXBlX2Jhc2ljKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiRG9uYWxkIER1Y2sgJmFtcDsgQ28iKSwgIkRvbmFsZCBEdWNrICYgQ28iKQotICAgIAorCiAgICAgZGVmIHRlc3RfdW5lc2NhcGVfYWxsKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiJmx0O0RvbmFsZCBEdWNrICZhbXA7IENvJmd0OyIpLCAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModW5lc2NhcGUoIiZsdDtEb25hbGQgRHVjayAmYW1wOyBDbyZndDsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxEb25hbGQgRHVjayAmIENvPiIpCi0gICAgCisKICAgICBkZWYgdGVzdF91bmVzY2FwZV9leHRyYShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModW5lc2NhcGUoIkhlaSBw5SBkZWciLCB7IuUiIDogIiZhcmluZzsifSksIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiSGVpIHDlIGRlZyIsIHsi5SIgOiAiJmFyaW5nOyJ9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaSBwJmFyaW5nOyBkZWciKQotICAgIAorCiAgICAgZGVmIHRlc3RfdW5lc2NhcGVfYW1wX2V4dHJhKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiJmFtcDtmb287IiwgeyImZm9vOyI6ICJzcGxhdCJ9KSwgIiZmb287IikKIAogICAgICMgPT09PT0gcXVvdGVhdHRyCiAgICAgZGVmIHRlc3RfcXVvdGVhdHRyX2Jhc2ljKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhxdW90ZWF0dHIoIkRvbmFsZCBEdWNrICYgQ28iKSwgCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHF1b3RlYXR0cigiRG9uYWxkIER1Y2sgJiBDbyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnIkRvbmFsZCBEdWNrICZhbXA7IENvIicpCi0gICAgCisKICAgICBkZWYgdGVzdF9zaW5nbGVfcXVvdGVhdHRyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhxdW90ZWF0dHIoJ0luY2x1ZGVzICJkb3VibGUiIHF1b3RlcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCdJbmNsdWRlcyAiZG91YmxlIiBxdW90ZXNcJycpCi0gICAgCisKICAgICBkZWYgdGVzdF9kb3VibGVfcXVvdGVhdHRyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhxdW90ZWF0dHIoIkluY2x1ZGVzICdzaW5nbGUnIHF1b3RlcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbmNsdWRlcyAnc2luZ2xlJyBxdW90ZXNcIiIpCi0gICAgCisKICAgICBkZWYgdGVzdF9zaW5nbGVfZG91YmxlX3F1b3RlYXR0cihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocXVvdGVhdHRyKCJJbmNsdWRlcyAnc2luZ2xlJyBhbmQgXCJkb3VibGVcIiBxdW90ZXMiKSwKICAgICAgICAgICAgICAgICAgICAgIlwiSW5jbHVkZXMgJ3NpbmdsZScgYW5kICZxdW90O2RvdWJsZSZxdW90OyBxdW90ZXNcIiIpCi0gICAgCisKICAgICAjID09PT09IG1ha2VfcGFyc2VyCiAgICAgZGVmIHRlc3RfbWFrZV9wYXJzZXIoc2VsZik6CiAgICAgICAgICMgQ3JlYXRpbmcgYSBwYXJzZXIgc2hvdWxkIHN1Y2NlZWQgLSBpdCBzaG91bGQgZmFsbCBiYWNrCkBAIC0xNjAsMTkgKzE2MCwxOSBAQAogICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKICAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCiAgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCi0gICAgCisKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+PC9kb2M+IikKLSAgICAKKwogICAgIGRlZiB0ZXN0X3htbGdlbl9jb250ZW50KHNlbGYpOgogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCi0gICAgCisKICAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQogICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKICAgICAgICAgZ2VuLmNoYXJhY3RlcnMoImh1aGVpIikKICAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCiAgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCi0gICAgCisKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+aHVoZWk8L2RvYz4iKQogCiAgICAgZGVmIHRlc3RfeG1sZ2VuX3BpKHNlbGYpOgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksCiAgICAgICAgICAgICBzdGFydCArICI8ZG9jPiZsdDtodWhlaSZhbXA7PC9kb2M+IikKIAogICAgIGRlZiB0ZXN0X3htbGdlbl9hdHRyX2VzY2FwZShzZWxmKToKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKICAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsKICAgICAgICAgICAgICgiPGRvYyBhPSdcIic+PGUgYT1cIidcIj48L2U+IgogICAgICAgICAgICAgICI8ZSBhPVwiJyZxdW90O1wiPjwvZT4iCiAgICAgICAgICAgICAgIjxlIGE9XCImIzEwOyYjMTM7JiM5O1wiPjwvZT48L2RvYz4iKSkKQEAgLTI4NSw3ICsyODUsNyBAQAogICAgICAgICBnZW4uZW5kUHJlZml4TWFwcGluZygnbXknKQogICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksCiAgICAgICAgICAgICBzdGFydCsnPG15OmEgeG1sbnM6bXk9InF1eCIgYj0iYyI+PC9teTphPicpCiAKIApAQCAtMzE0LDcgKzMxNCw3IEBACiB4bWxfdGVzdF9vdXQgPSBvcGVuKGZpbmRmaWxlKCJ0ZXN0Iitvcy5leHRzZXArInhtbCIrb3MuZXh0c2VwKyJvdXQiKSkucmVhZCgpCiAKIGNsYXNzIEV4cGF0UmVhZGVyVGVzdChYbWxUZXN0QmFzZSk6Ci0gICAgCisKICAgICAjID09PT09IFhNTFJlYWRlciBzdXBwb3J0CiAKICAgICBkZWYgdGVzdF9leHBhdF9maWxlKHNlbGYpOgpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAgICAgIHBhcnNlci5mZWVkKCc8ZG9jPjwvZG9jPicpCiAgICAgICAgIHBhcnNlci5jbG9zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGFuZGxlci5fbm90YXRpb25zLCAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGFuZGxlci5fbm90YXRpb25zLAogICAgICAgICAgICAgWygiR0lGIiwgIi0vL0NvbXB1U2VydmUvL05PVEFUSU9OIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCA4OWEvL0VOIiwgTm9uZSldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoYW5kbGVyLl9lbnRpdGllcywgWygiaW1nIiwgTm9uZSwgImV4cGF0LmdpZiIsICJHSUYiKV0pCiAKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAgICBwYXJzZXIuZmVlZCgnPGRvYz4mdGVzdDs8L2RvYz4nKQogICAgICAgICBwYXJzZXIuY2xvc2UoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRvYz48ZW50aXR5PjwvZW50aXR5PjwvZG9jPiIpCiAKICAgICAjID09PT09IEF0dHJpYnV0ZXMgc3VwcG9ydApAQCAtNDMzLDcgKzQzMyw3IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldE5hbWVzKCksIFsobnNfdXJpLCAiYXR0ciIpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhdHRycy5nZXRRTmFtZXMoKSA9PSBbXSBvciAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhdHRycy5nZXRRTmFtZXMoKSA9PSBbXSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFsibnM6YXR0ciJdKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGF0dHJzKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGF0dHJzLmhhc19rZXkoKG5zX3VyaSwgImF0dHIiKSkpCkBAIC00NDUsMTAxICs0NDUsMTAxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzWyhuc191cmksICJhdHRyIildLCAidmFsIikKIAogICAgICMgPT09PT0gSW5wdXRTb3VyY2Ugc3VwcG9ydAotICAgIAorCiAgICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQotICAgIAorCiAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCiAgICAgICAgIHBhcnNlci5wYXJzZShmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiKSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQotICAgIAorCiAgICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX3N5c2lkKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQotICAgIAorCiAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCiAgICAgICAgIHBhcnNlci5wYXJzZShJbnB1dFNvdXJjZShmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiKSkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKLSAgICAKKwogICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zdHJlYW0oc2VsZik6CiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCi0gICAgCisKICAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgICAgICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQogICAgICAgICBpbnBzcmMuc2V0Qnl0ZVN0cmVhbShvcGVuKGZpbmRmaWxlKCJ0ZXN0Iitvcy5leHRzZXArInhtbCIpKSkKICAgICAgICAgcGFyc2VyLnBhcnNlKGlucHNyYykKLSAgICAKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQotICAgIAorCiAgICAgIyA9PT09PSBJbmNyZW1lbnRhbFBhcnNlciBzdXBwb3J0Ci0gICAgCisKICAgICBkZWYgdGVzdF9leHBhdF9pbmNyZW1lbnRhbChzZWxmKToKICAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKLSAgICAKKwogICAgICAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQogICAgICAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKICAgICAgICAgcGFyc2VyLmNsb3NlKCkKLSAgICAKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz48L2RvYz4iKQotICAgIAorCiAgICAgZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWxfcmVzZXQoc2VsZik6CiAgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCi0gICAgCisKICAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKICAgICAgICAgcGFyc2VyLmZlZWQoInRleHQiKQotICAgIAorCiAgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgICAgICAgcGFyc2VyLnJlc2V0KCkKLSAgICAKKwogICAgICAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQogICAgICAgICBwYXJzZXIuZmVlZCgidGV4dCIpCiAgICAgICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQogICAgICAgICBwYXJzZXIuY2xvc2UoKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArICI8ZG9jPnRleHQ8L2RvYz4iKQotICAgIAorCiAgICAgIyA9PT09PSBMb2NhdG9yIHN1cHBvcnQKLSAgICAKKwogICAgIGRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfbm9pbmZvKHNlbGYpOgogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQotICAgIAorCiAgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCiAgICAgICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQogICAgICAgICBwYXJzZXIuY2xvc2UoKQotICAgIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlci5nZXRTeXN0ZW1JZCgpLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZXIuZ2V0UHVibGljSWQoKSwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VyLmdldExpbmVOdW1iZXIoKSwgMSkKLSAgICAKKwogICAgIGRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfd2l0aGluZm8oc2VsZik6CiAgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCiAgICAgICAgIHBhcnNlci5wYXJzZShmaW5kZmlsZSgidGVzdC54bWwiKSkKLSAgICAKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZXIuZ2V0U3lzdGVtSWQoKSwgZmluZGZpbGUoInRlc3QueG1sIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlci5nZXRQdWJsaWNJZCgpLCBOb25lKQotICAgIAotICAgIAorCisKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjICAgZXJyb3IgcmVwb3J0aW5nCkBAIC01NTksMTIgKzU1OSwxMiBAQAogICAgICAgICAgICAgc2VsZi5mYWlsKCkKICAgICAgICAgZXhjZXB0IFNBWEV4Y2VwdGlvbiwgZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGUuZ2V0U3lzdGVtSWQoKSwgbmFtZSkKLSAgICAKKwogICAgIGRlZiB0ZXN0X2V4cGF0X2luY29tcGxldGUoc2VsZik6CiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIoKSkgIyBkbyBub3RoaW5nCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFNBWFBhcnNlRXhjZXB0aW9uLCBwYXJzZXIucGFyc2UsIFN0cmluZ0lPKCI8Zm9vPiIpKQotICAgIAorCiAgICAgZGVmIHRlc3Rfc2F4X3BhcnNlX2V4Y2VwdGlvbl9zdHIoc2VsZik6CiAgICAgICAgICMgcGFzcyB2YXJpb3VzIHZhbHVlcyBmcm9tIGEgbG9jYXRvciB0byB0aGUgU0FYUGFyc2VFeGNlcHRpb24gdG8KICAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCB0aGUgX19zdHJfXygpIGRvZXNuJ3QgZmFsbCBhcGFydCB3aGVuIE5vbmUgaXMKQEAgLTU4MiwyMSArNTgyLDIxIEBACiAgICAgICAgICMgdXNlIE5vbmUgZm9yIGJvdGg6CiAgICAgICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkR1bW15TG9jYXRvcihOb25lLCBOb25lKSkpCi0gICAgCisKICAgICBjbGFzcyBEdW1teUxvY2F0b3I6CiAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm8sIGNvbG5vKToKICAgICAgICAgICAgIHNlbGYuX2xpbmVubyA9IGxpbmVubwogICAgICAgICAgICAgc2VsZi5fY29sbm8gPSBjb2xubwotICAgIAorCiAgICAgICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKICAgICAgICAgICAgIHJldHVybiAicHViaWQiCi0gICAgCisKICAgICAgICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgogICAgICAgICAgICAgcmV0dXJuICJzeXNpZCIKLSAgICAKKwogICAgICAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9saW5lbm8KLSAgICAKKwogICAgICAgICBkZWYgZ2V0Q29sdW1uTnVtYmVyKHNlbGYpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG5vCiAKQEAgLTYwNywyMSArNjA3LDIxIEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBjbGFzcyBYbWxSZWFkZXJUZXN0KFhtbFRlc3RCYXNlKToKLSAgICAgICAgCisKICAgICAjID09PT09IEF0dHJpYnV0ZXNJbXBsCiAgICAgZGVmIHRlc3RfYXR0cnNfZW1wdHkoc2VsZik6CiAgICAgICAgIHNlbGYudmVyaWZ5X2VtcHR5X2F0dHJzKEF0dHJpYnV0ZXNJbXBsKHt9KSkKLSAgICAKKwogICAgIGRlZiB0ZXN0X2F0dHJzX3dhdHRyKHNlbGYpOgogICAgICAgICBzZWxmLnZlcmlmeV9hdHRyc193YXR0cihBdHRyaWJ1dGVzSW1wbCh7ImF0dHIiIDogInZhbCJ9KSkKLSAgICAKKwogICAgIGRlZiB0ZXN0X25zYXR0cnNfZW1wdHkoc2VsZik6CiAgICAgICAgIHNlbGYudmVyaWZ5X2VtcHR5X25zYXR0cnMoQXR0cmlidXRlc05TSW1wbCh7fSwge30pKQotICAgIAorCiAgICAgZGVmIHRlc3RfbnNhdHRyc193YXR0cihzZWxmKToKICAgICAgICAgYXR0cnMgPSBBdHRyaWJ1dGVzTlNJbXBsKHsobnNfdXJpLCAiYXR0ciIpIDogInZhbCJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhuc191cmksICJhdHRyIikgOiAibnM6YXR0ciJ9KQotICAgIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXROYW1lcygpLCBbKG5zX3VyaSwgImF0dHIiKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldFFOYW1lcygpLCBbIm5zOmF0dHIiXSkKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgICMgYXR0ZW1wdC4gIEtlZXBpbmcgdGhlc2UgdGVzdHMgYXJvdW5kIHdpbGwgaGVscCBkZXRlY3QgcHJvYmxlbXMgd2l0aAogICAgICMgb3RoZXIgYXR0ZW1wdHMgdG8gcHJvdmlkZSByZWxpYWJsZSBhY2Nlc3MgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkncwogICAgICMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBzdXBwb3J0LgotICAgIAorCiAgICAgZGVmIHRlc3Rfc2ZfMTUxMTQ5NyhzZWxmKToKICAgICAgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMTQ5NwogICAgICAgICBpbXBvcnQgc3lzCkBAIC02NzUsNyArNjc1LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZHVsZS5fX25hbWVfXywgInhtbC5zYXguZXhwYXRyZWFkZXIiKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQotICAgIAorCiAgICAgZGVmIHRlc3Rfc2ZfMTUxMzYxMShzZWxmKToKICAgICAgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMzYxMQogICAgICAgICBzaW8gPSBTdHJpbmdJTygiaW52YWxpZCIpCkBAIC02OTMsNCArNjkzLDQgQEAKICAgICAgICAgICAgICAgICAgWG1sUmVhZGVyVGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICAgdW5pdHRlc3RfbWFpbigpCisgICAgdW5pdHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IGY1MjhhZDguLjg3MmE0NjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0yODgsNyArMjg4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oZWxlbS5oYXNoX2NvdW50IGZvciBlbGVtIGluIGQpLCBuKQogICAgICAgICBpZiBoYXNhdHRyKHMsICdzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUnKToKICAgICAgICAgICAgIHMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGVsZW0uaGFzaF9jb3VudCBmb3IgZWxlbSBpbiBkKSwgbikgICAgIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCiAgICAgICAgIGQyID0gZGljdC5mcm9ta2V5cyhzZXQoZCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGVsZW0uaGFzaF9jb3VudCBmb3IgZWxlbSBpbiBkKSwgbikKICAgICAgICAgZDMgPSBkaWN0LmZyb21rZXlzKGZyb3plbnNldChkKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc210cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3Rfc210cGxpYi5weQppbmRleCAwOWMxZDk2Li4zNTQyZGRiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NtdHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zbXRwbGliLnB5CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgIGV2dC5zZXQoKQogCiBjbGFzcyBHZW5lcmFsVGVzdHMoVGVzdENhc2UpOgotICAgIAorCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCiAgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlciwgYXJncz0oc2VsZi5ldnQsKSkuc3RhcnQoKQpAQCAtMzgsMTMgKzM4LDEzIEBACiAgICAgICAgICMgY29ubmVjdHMKICAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUCgibG9jYWxob3N0IiwgOTA5MSkKICAgICAgICAgc210cC5zb2NrLmNsb3NlKCkKLSAgICAgICAgCisKICAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogICAgICAgICAjIGRlZmF1bHQKICAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUCgibG9jYWxob3N0IiwgOTA5MSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNtdHAuc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgc210cC5zb2NrLmNsb3NlKCkKLSAgICAKKwogICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgogICAgICAgICAjIGEgdmFsdWUKICAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUCgibG9jYWxob3N0IiwgOTA5MSwgdGltZW91dD0zMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKaW5kZXggMjRkMWE1ZC4uOGRkZGY1ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKQEAgLTgyMiw3ICs4MjIsNyBAQAogICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIFBPUlQpKQogICAgICAgICBzZWxmLnNlcnZfY29ubiA9IHNlbGYuY2xpCi0gICAgCisKIGNsYXNzIEJhc2ljVENQVGVzdDIoTmV0d29ya0Nvbm5lY3Rpb25UZXN0LCBCYXNpY1RDUFRlc3QpOgogICAgICIiIlRlc3RzIHRoYXQgTmV0d29ya0Nvbm5lY3Rpb24gZG9lcyBub3QgYnJlYWsgZXhpc3RpbmcgVENQIGZ1bmN0aW9uYWxpdHkuCiAgICAgIiIiCkBAIC04NTMsMjIgKzg1MywyMiBAQAogICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgUE9SVCksIHRpbWVvdXQ9MzApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZmFtaWx5LCAyKQogCi0gICAgdGVzdFRpbWVvdXREZWZhdWx0ID0gX2p1c3RBY2NlcHQgCisgICAgdGVzdFRpbWVvdXREZWZhdWx0ID0gX2p1c3RBY2NlcHQKICAgICBkZWYgX3Rlc3RUaW1lb3V0RGVmYXVsdChzZWxmKToKICAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIFBPUlQpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jbGkuZ2V0dGltZW91dCgpIGlzIE5vbmUpCi0gICAgCi0gICAgdGVzdFRpbWVvdXRWYWx1ZU5hbWVkID0gX2p1c3RBY2NlcHQgCisKKyAgICB0ZXN0VGltZW91dFZhbHVlTmFtZWQgPSBfanVzdEFjY2VwdAogICAgIGRlZiBfdGVzdFRpbWVvdXRWYWx1ZU5hbWVkKHNlbGYpOgogICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgUE9SVCksIHRpbWVvdXQ9MzApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZ2V0dGltZW91dCgpLCAzMCkKIAotICAgIHRlc3RUaW1lb3V0VmFsdWVOb25hbWVkID0gX2p1c3RBY2NlcHQgCisgICAgdGVzdFRpbWVvdXRWYWx1ZU5vbmFtZWQgPSBfanVzdEFjY2VwdAogICAgIGRlZiBfdGVzdFRpbWVvdXRWYWx1ZU5vbmFtZWQoc2VsZik6CiAgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBQT1JUKSwgMzApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZ2V0dGltZW91dCgpLCAzMCkKIAotICAgIHRlc3RUaW1lb3V0Tm9uZSA9IF9qdXN0QWNjZXB0IAorICAgIHRlc3RUaW1lb3V0Tm9uZSA9IF9qdXN0QWNjZXB0CiAgICAgZGVmIF90ZXN0VGltZW91dE5vbmUoc2VsZik6CiAgICAgICAgIHByZXZpb3VzID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CmluZGV4IGFhYjJiNzUuLmRmZmEyYzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKQEAgLTI1LDEyICsyNSwxMiBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcHJpbnQgImRpZG4ndCByYWlzZSBUeXBlRXJyb3IiCiAgICAgICAgIHNvY2tldC5SQU5EX2FkZCgidGhpcyBpcyBhIHJhbmRvbSBzdHJpbmciLCA3NS4wKQotICAgIAorCiAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgpOgogICAgICAgICAgICAgZiA9IHVybGxpYi51cmxvcGVuKCdodHRwczovL3NmLm5ldCcpCiAgICAgICAgIGJ1ZiA9IGYucmVhZCgpCiAgICAgICAgIGYuY2xvc2UoKQotICAgIAorCiAgICAgZGVmIHRlc3RUaW1lb3V0KHNlbGYpOgogICAgICAgICBkZWYgZXJyb3JfbXNnKGV4dHJhX21zZyk6CiAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiIiJcCkBAIC0zOCwxNCArMzgsMTQgQEAKICAgICAgICAgdGVzdF90aW1lb3V0LiAgVGhhdCBtYXkgYmUgbGVnaXRpbWF0ZSwgYnV0IGlzIG5vdCB0aGUgb3V0Y29tZSB3ZQogICAgICAgICBob3BlZCBmb3IuICBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VlbiBvZnRlbiwgdGVzdF90aW1lb3V0IHNob3VsZCBiZQogICAgICAgICBjaGFuZ2VkIHRvIHVzZSBhIG1vcmUgcmVsaWFibGUgYWRkcmVzcy4iIiIgJSAoQUREUiwgZXh0cmFfbXNnKQotICAgIAorCiAgICAgICAgICMgQSBzZXJ2aWNlIHdoaWNoIGlzc3VlcyBhIHdlbGNvbWUgYmFubmVyICh3aXRob3V0IG5lZWQgdG8gd3JpdGUKICAgICAgICAgIyBhbnl0aGluZykuCiAgICAgICAgICMgWFhYICgiZ21haWwub3JnIiwgOTk1KSBoYXMgYmVlbiB1bnJlbGlhYmxlIHNvIGZhciwgZnJvbSB0aW1lIHRvCi0gICAgICAgICMgWFhYIHRpbWUgbm9uLXJlc3BvbnNpdmUgZm9yIGhvdXJzIG9uIGVuZCAoJiBhY3Jvc3MgYWxsIGJ1aWxkYm90IAorICAgICAgICAjIFhYWCB0aW1lIG5vbi1yZXNwb25zaXZlIGZvciBob3VycyBvbiBlbmQgKCYgYWNyb3NzIGFsbCBidWlsZGJvdAogICAgICAgICAjIFhYWCBzbGF2ZXMsIHNvIHRoYXQncyBub3QganVzdCBhIGxvY2FsIHRoaW5nKS4KICAgICAgICAgQUREUiA9ICJnbWFpbC5vcmciLCA5OTUKLSAgICAKKwogICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCiAgICAgICAgIHMuc2V0dGltZW91dCgzMC4wKQogICAgICAgICB0cnk6CkBAIC01OSw3ICs1OSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJhaXNlCi0gICAgCisKICAgICAgICAgc3MgPSBzb2NrZXQuc3NsKHMpCiAgICAgICAgICMgUmVhZCBwYXJ0IG9mIHJldHVybiB3ZWxjb21lIGJhbm5lciB0d2ljZS4KICAgICAgICAgc3MucmVhZCgxKQpAQCAtNzEsMTEgKzcxLDExIEBACiAgICAgZGVmIHRlc3RSdWRlU2h1dGRvd24oc2VsZik6CiAgICAgICAgICMgU29tZSByYW5kb20gcG9ydCB0byBjb25uZWN0IHRvLgogICAgICAgICBQT1JUID0gWzk5MzRdCi0gICAgCisKICAgICAgICAgbGlzdGVuZXJfcmVhZHkgPSB0aHJlYWRpbmcuRXZlbnQoKQogICAgICAgICBsaXN0ZW5lcl9nb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKLSAgICAKLSAgICAgICAgIyBgbGlzdGVuZXJgIHJ1bnMgaW4gYSB0aHJlYWQuICBJdCBvcGVucyBhIHNvY2tldCBsaXN0ZW5pbmcgb24gCisKKyAgICAgICAgIyBgbGlzdGVuZXJgIHJ1bnMgaW4gYSB0aHJlYWQuICBJdCBvcGVucyBhIHNvY2tldCBsaXN0ZW5pbmcgb24KICAgICAgICAgIyBQT1JULCBhbmQgc2l0cyBpbiBhbiBhY2NlcHQoKSB1bnRpbCB0aGUgbWFpbiB0aHJlYWQgY29ubmVjdHMuCiAgICAgICAgICMgVGhlbiBpdCBydWRlbHkgY2xvc2VzIHRoZSBzb2NrZXQsIGFuZCBzZXRzIEV2ZW50IGBsaXN0ZW5lcl9nb25lYAogICAgICAgICAjIHRvIGxldCB0aGUgbWFpbiB0aHJlYWQga25vdyB0aGUgc29ja2V0IGlzIGdvbmUuCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgICAgICBzLmFjY2VwdCgpCiAgICAgICAgICAgICBzID0gTm9uZSAjIHJlY2xhaW0gdGhlIHNvY2tldCBvYmplY3QsIHdoaWNoIGFsc28gY2xvc2VzIGl0CiAgICAgICAgICAgICBsaXN0ZW5lcl9nb25lLnNldCgpCi0gICAgCisKICAgICAgICAgZGVmIGNvbm5lY3RvcigpOgogICAgICAgICAgICAgbGlzdGVuZXJfcmVhZHkud2FpdCgpCiAgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQoCiAgICAgICAgICAgICAgICAgICAgICAgJ2Nvbm5lY3RpbmcgdG8gY2xvc2VkIFNTTCBzb2NrZXQgc2hvdWxkIGhhdmUgZmFpbGVkJykKLSAgICAKKwogICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bGlzdGVuZXIpCiAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICBjb25uZWN0b3IoKQpAQCAtMTUzLDggKzE1Myw4IEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgY21kID0gIm9wZW5zc2wgc19zZXJ2ZXIgLWNlcnQgJXMgLWtleSAlcyAtcXVpZXQiICUgKGNlcnRfZmlsZSwga2V5X2ZpbGUpCi0gICAgICAgICAgICBzZWxmLnMgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZC5zcGxpdCgpLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgCisgICAgICAgICAgICBzZWxmLnMgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZC5zcGxpdCgpLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQogICAgICAgICAgICAgdGltZS5zbGVlcCgxKQogICAgICAgICBleGNlcHQ6CkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmhhdmVTZXJ2ZXIgPSBGYWxzZQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmhhdmVTZXJ2ZXIgPSBUcnVlCi0gICAgICAgICAgICAgICAgCisKICAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICB3aGlsZSBzZWxmLmtlZXBTZXJ2aW5nOgogICAgICAgICAgICAgdGltZS5zbGVlcCguNSkKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICAgICAgc3VicHJvY2Vzcy5UZXJtaW5hdGVQcm9jZXNzKGludChzZWxmLnMuX2hhbmRsZSksIC0xKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb3Mua2lsbChzZWxmLnMucGlkLCAxNSkKLSAKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgInNzbCIpOgogICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdFNraXBwZWQoInNvY2tldCBtb2R1bGUgaGFzIG5vIHNzbCBzdXBwb3J0IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHkKaW5kZXggYWFmNmYwZi4uNzE5YTAzNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHkKQEAgLTE1LDkgKzE1LDkgQEAKICAgICAgICAgcHJpbnQgPj4gZiwgJ2YnLCAnZycKICAgICAgICAgIyBJbiAyLjIgJiBlYXJsaWVyLCB0aGlzIHByaW50ZWQgJyBhXG5iYyAgZFx0ZVxuZiBnXG4nCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXR2YWx1ZSgpLCAnYVxuYiBjICBkXHRlXG5mIGdcbicpCi0gICAgICAgIAorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KFNvZnRzcGFjZVRlc3RzKQotICAgIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkgYi9MaWIvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkKaW5kZXggMWY1NjI3YS4uNjA0MjVkZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weQpAQCAtOTEsNiArOTEsNiBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJpbmdwcmVwVGVzdHMpCi0gICAgCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggYTZmZmVjMy4uZDA0MzMwMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTM3Niw3ICszNzYsNyBAQAogICAgLi4uIGVsaWYgMToKICAgIC4uLiAgIHBhc3MKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAgLi4uIAorICAgICAuLi4KICAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbCAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0NF0+LCBsaW5lIDIpCiAKICAgID4+PiBpZiAxOgpAQCAtMzg0LDcgKzM4NCw3IEBACiAgICAuLi4gZWxpZiAxOgogICAgLi4uICAgeCgpID0gMQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAuLi4gCisgICAgIC4uLgogICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ1XT4sIGxpbmUgNCkKIAogICAgPj4+IGlmIDE6CkBAIC0zOTQsNyArMzk0LDcgQEAKICAgIC4uLiBlbHNlOgogICAgLi4uICAgcGFzcwogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAuLi4gCisgICAgIC4uLgogICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ2XT4sIGxpbmUgMikKIAogICAgPj4+IGlmIDE6CkBAIC00MDQsNyArNDA0LDcgQEAKICAgIC4uLiBlbHNlOgogICAgLi4uICAgcGFzcwogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAuLi4gCisgICAgIC4uLgogICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ3XT4sIGxpbmUgNCkKIAogICAgPj4+IGlmIDE6CkBAIC00MTQsNyArNDE0LDcgQEAKICAgIC4uLiBlbHNlOgogICAgLi4uICAgeCgpID0gMQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAuLi4gCisgICAgIC4uLgogICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ4XT4sIGxpbmUgNikKIAogIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKaW5kZXggMGZmMDVjMS4uZjBmYjZiMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQpAQCAtOTg3LDQgKzk4NywzIEBACiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQppbmRleCA0MmFkMjBjLi4wYTM2MDRlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQpAQCAtMjIsNyArMjIsNyBAQAogICAgICAgICBldnQuc2V0KCkKIAogY2xhc3MgR2VuZXJhbFRlc3RzKFRlc3RDYXNlKToKLSAgICAKKwogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQogICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LCkpLnN0YXJ0KCkKQEAgLTM1LDEzICszNSwxMyBAQAogICAgICAgICAjIGNvbm5lY3RzCiAgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoImxvY2FsaG9zdCIsIDkwOTEpCiAgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKLSAgICAgICAgCisKICAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogICAgICAgICAjIGRlZmF1bHQKICAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldCgibG9jYWxob3N0IiwgOTA5MSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlbG5ldC5zb2NrLmdldHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICB0ZWxuZXQuc29jay5jbG9zZSgpCi0gICAgCisKICAgICBkZWYgdGVzdFRpbWVvdXRWYWx1ZShzZWxmKToKICAgICAgICAgIyBhIHZhbHVlCiAgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoImxvY2FsaG9zdCIsIDkwOTEsIHRpbWVvdXQ9MzApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKaW5kZXggNDU1MjBiNS4uZWM1MTlmNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQpAQCAtNTE0LDcgKzUxNCw3IEBACiAgICAgICAgICMgdmVyc2lvbiBvZiAudGVzdHppcCB3b3VsZCBzd2FsbG93IHRoaXMgZXhjZXB0aW9uIChhbmQgYW55IG90aGVyKQogICAgICAgICAjIGFuZCByZXBvcnQgdGhhdCB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSB3YXMgY29ycnVwdC4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLnRlc3R6aXApCi0gICAgICAgIAorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCiAgICAgICAgIHN1cHBvcnQudW5saW5rKFRFU1RGTjIpCkBAIC01NjgsNyArNTY4LDcgQEAKICAgICAgICAgZnAgPSBvcGVuKFRFU1RGTiwgIndiIikKICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQogICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgIAorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCiAgICAgICAgIHN1cHBvcnQudW5saW5rKFRFU1RGTjIpCmRpZmYgLS1naXQgYS9MaWIvdGltZWl0LnB5IGIvTGliL3RpbWVpdC5weQppbmRleCAwOTk0MmYzLi5jMGIwODU2IDEwMDY0NAotLS0gYS9MaWIvdGltZWl0LnB5CisrKyBiL0xpYi90aW1laXQucHkKQEAgLTIyMywxMyArMjIzLDEzIEBACiAKIGRlZiB0aW1laXQoc3RtdD0icGFzcyIsIHNldHVwPSJwYXNzIiwgdGltZXI9ZGVmYXVsdF90aW1lciwKICAgICAgICAgICAgbnVtYmVyPWRlZmF1bHRfbnVtYmVyKToKLSAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIFRpbWVyIG9iamVjdCBhbmQgY2FsbCB0aW1laXQgbWV0aG9kLiIiIgotICByZXR1cm4gVGltZXIoc3RtdCwgc2V0dXAsIHRpbWVyKS50aW1laXQobnVtYmVyKQorICAgICIiIkNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBUaW1lciBvYmplY3QgYW5kIGNhbGwgdGltZWl0IG1ldGhvZC4iIiIKKyAgICByZXR1cm4gVGltZXIoc3RtdCwgc2V0dXAsIHRpbWVyKS50aW1laXQobnVtYmVyKQogCiBkZWYgcmVwZWF0KHN0bXQ9InBhc3MiLCBzZXR1cD0icGFzcyIsIHRpbWVyPWRlZmF1bHRfdGltZXIsCiAgICAgICAgICAgIHJlcGVhdD1kZWZhdWx0X3JlcGVhdCwgbnVtYmVyPWRlZmF1bHRfbnVtYmVyKToKLSAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIFRpbWVyIG9iamVjdCBhbmQgY2FsbCByZXBlYXQgbWV0aG9kLiIiIgotICByZXR1cm4gVGltZXIoc3RtdCwgc2V0dXAsIHRpbWVyKS5yZXBlYXQocmVwZWF0LCBudW1iZXIpCisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIFRpbWVyIG9iamVjdCBhbmQgY2FsbCByZXBlYXQgbWV0aG9kLiIiIgorICAgIHJldHVybiBUaW1lcihzdG10LCBzZXR1cCwgdGltZXIpLnJlcGVhdChyZXBlYXQsIG51bWJlcikKIAogZGVmIG1haW4oYXJncz1Ob25lKToKICAgICAiIiJNYWluIHByb2dyYW0sIHVzZWQgd2hlbiBydW4gYXMgYSBzY3JpcHQuCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliMi5weSBiL0xpYi91cmxsaWIyLnB5CmluZGV4IDhhMWI2MWIuLjZiZmJjMjkgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIyLnB5CisrKyBiL0xpYi91cmxsaWIyLnB5CkBAIC00OTAsNyArNDkwLDcgQEAKICAgICBkZWYgaHR0cF9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSk6CiAgICAgICAgIGNvZGUsIG1zZywgaGRycyA9IHJlc3BvbnNlLmNvZGUsIHJlc3BvbnNlLm1zZywgcmVzcG9uc2UuaW5mbygpCiAKLSAgICAgICAgIyBBY2NvcmRpbmcgdG8gUkZDIDI2MTYsICIyeHgiIGNvZGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCdzIAorICAgICAgICAjIEFjY29yZGluZyB0byBSRkMgMjYxNiwgIjJ4eCIgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50J3MKICAgICAgICAgIyByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQsIHVuZGVyc3Rvb2QsIGFuZCBhY2NlcHRlZC4KICAgICAgICAgaWYgbm90ICgyMDAgPD0gY29kZSA8IDMwMCk6CiAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucGFyZW50LmVycm9yKAo=