ZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5CmluZGV4IDk5ZTAyY2IuLmQ4OTJiNTkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weQpAQCAtMTQsMjIgKzE0LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2ludCldCiAgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWS5hLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWS5iLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYi5vZmZzZXQsIHNpemVvZihjX2ludCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQU5PTi5hLm9mZnNldCwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQU5PTi5iLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBTk9OLmEub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEFOT04uYi5vZmZzZXQsIDApCiAKICAgICBkZWYgdGVzdF9hbm9uX25vbnNlcShzZWxmKToKICAgICAgICAgIyBUeXBlRXJyb3I6IF9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sICJfYW5vbnltb3VzXyI6IDQyfSkpCiAKICAgICBkZWYgdGVzdF9hbm9uX25vbm1lbWJlcihzZWxmKToKICAgICAgICAgIyBBdHRyaWJ1dGVFcnJvcjogdHlwZSBvYmplY3QgJ05hbWUnIGhhcyBubyBhdHRyaWJ1dGUgJ3gnCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sCkBAIC01MCwxMSArNTAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KICAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLngub2Zmc2V0LCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYS5vZmZzZXQsIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS5iLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkueS5vZmZzZXQsIHNpemVvZihjX2ludCkgKiAyKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkKaW5kZXggM2VkMzEwYy4uYzMxM2FhNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheV9pbl9wb2ludGVyLnB5CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgIGMucHZhbHVlcyA9IHZhbF9hcnJheQogCiAgICAgICAgICMgbWVtb3J5IGNvbnRhaW5zIDQgTlVMIGJ5dGVzIG5vdywgdGhhdCdzIGNvcnJlY3QKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjAwLTAwLTAwLTAwIiwgZHVtcCh2YWxfYXJyYXkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIwMC0wMC0wMC0wMCIsIGR1bXAodmFsX2FycmF5KSkKIAogICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgogICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgdmFsdWVzID0gW2MucHZhbHVlc1tpXS52YWwgZm9yIGkgaW4gcmFuZ2UoNCldCiAKICAgICAgICAgIyBUaGVzZSBhcmUgdGhlIGV4cGVjdGVkIHJlc3VsdHM6IGhlcmUgcyB0aGUgYnVnIQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICh2YWx1ZXMsIGR1bXAodmFsX2FycmF5KSksCiAgICAgICAgICAgICAoWzEsIDIsIDMsIDRdLCAiMDEtMDItMDMtMDQiKQogICAgICAgICApCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgIHZhbF9hcnJheSA9IChWYWx1ZSAqIDQpKCkKIAogICAgICAgICAjIG1lbW9yeSBjb250YWlucyA0IE5VTCBieXRlcyBub3csIHRoYXQncyBjb3JyZWN0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIwMC0wMC0wMC0wMCIsIGR1bXAodmFsX2FycmF5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMDAtMDAtMDAtMDAiLCBkdW1wKHZhbF9hcnJheSkpCiAKICAgICAgICAgcHRyID0gY2FzdCh2YWxfYXJyYXksIFBPSU5URVIoVmFsdWUpKQogICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICB2YWx1ZXMgPSBbcHRyW2ldLnZhbCBmb3IgaSBpbiByYW5nZSg0KV0KIAogICAgICAgICAjIFRoZXNlIGFyZSB0aGUgZXhwZWN0ZWQgcmVzdWx0czogaGVyZSBzIHRoZSBidWchCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgKHZhbHVlcywgZHVtcCh2YWxfYXJyYXkpKSwKICAgICAgICAgICAgIChbMSwgMiwgMywgNF0sICIwMS0wMi0wMy0wNCIpCiAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weQppbmRleCA3ZWUxNmMxLi40MzNhMWZmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5CkBAIC0xOSwyMyArMTksMjMgQEAKIAogICAgICAgICAgICAgaWEgPSBpbnRfYXJyYXkoKmluaXQpCiAgICAgICAgICAgICAjIGxlbmd0aCBvZiBpbnN0YW5jZSBvaz8KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihpYSksIGFsZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpYSksIGFsZW4pCiAKICAgICAgICAgICAgICMgc2xvdCB2YWx1ZXMgb2s/CiAgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgaW5pdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBpbml0KQogCiAgICAgICAgICAgICAjIGNoYW5nZSB0aGUgaXRlbXMKICAgICAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHNldGl0ZW0KICAgICAgICAgICAgIG5ld192YWx1ZXMgPSByYW5nZSg0MiwgNDIrYWxlbikKICAgICAgICAgICAgIFtzZXRpdGVtKGlhLCBuLCBuZXdfdmFsdWVzW25dKSBmb3IgbiBpbiByYW5nZShhbGVuKV0KICAgICAgICAgICAgIHZhbHVlcyA9IFtpYVtpXSBmb3IgaSBpbiByYW5nZShsZW4oaW5pdCkpXQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsdWVzLCBuZXdfdmFsdWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIG5ld192YWx1ZXMpCiAKICAgICAgICAgICAgICMgYXJlIHRoZSBpdGVtcyBpbml0aWFsaXplZCB0byAwPwogICAgICAgICAgICAgaWEgPSBpbnRfYXJyYXkoKQogICAgICAgICAgICAgdmFsdWVzID0gW2lhW2ldIGZvciBpIGluIHJhbmdlKGxlbihpbml0KSldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZXMsIFswXSAqIGxlbihpbml0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMF0gKiBsZW4oaW5pdCkpCiAKICAgICAgICAgICAgICMgVG9vIG1hbnkgaW4gaXRpYWxpemVycyBzaG91bGQgYmUgY2F1Z2h0CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBpbnRfYXJyYXksICpyYW5nZShhbGVuKjIpKQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgICAgICMgQ2hhckFycmF5KCJhYmMiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIENoYXJBcnJheSwgImFiYyIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMF0sICJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMV0sICJiIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMl0sICJjIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbLTNdLCAiYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhWy0yXSwgImIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYVstMV0sICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVswXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWzFdLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FbMl0sICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstM10sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstMl0sICJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstMV0sICJjIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oY2EpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjYSksIDMpCiAKICAgICAgICAgIyBzbGljaW5nIGlzIG5vdyBzdXBwb3J0ZWQsIGJ1dCBub3QgZXh0ZW5kZWQgc2xpY2luZyAoMy1hcmd1bWVudCkhCiAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGdldHNsaWNlLCBkZWxpdGVtCkBAIC03MiwzNCArNzIsMzQgQEAKIAogICAgICAgICBuYSA9IG51bWFycmF5KCkKICAgICAgICAgdmFsdWVzID0gW25hW2ldIGZvciBpIGluIHJhbmdlKGFsZW4pXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZXMsIFswXSAqIGFsZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMF0gKiBhbGVuKQogCiAgICAgICAgIG5hID0gbnVtYXJyYXkoKltjX2ludCgpXSAqIGFsZW4pCiAgICAgICAgIHZhbHVlcyA9IFtuYVtpXSBmb3IgaSBpbiByYW5nZShhbGVuKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsdWVzLCBbMF0qYWxlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIFswXSphbGVuKQogCiAgICAgICAgIG5hID0gbnVtYXJyYXkoMSwgMiwgMywgNCwgNSkKICAgICAgICAgdmFsdWVzID0gW2kgZm9yIGkgaW4gbmFdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQogCiAgICAgICAgIG5hID0gbnVtYXJyYXkoKm1hcChjX2ludCwgKDEsIDIsIDMsIDQsIDUpKSkKICAgICAgICAgdmFsdWVzID0gW2kgZm9yIGkgaW4gbmFdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQogCiAgICAgZGVmIHRlc3RfY2xhc3NjYWNoZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBBUlJBWShjX2ludCwgMykgaXMgQVJSQVkoY19pbnQsIDQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBBUlJBWShjX2ludCwgMykgaXMgQVJSQVkoY19pbnQsIDQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCAzKSkKIAogICAgIGRlZiB0ZXN0X2Zyb21fYWRkcmVzcyhzZWxmKToKICAgICAgICAgIyBGYWlsZWQgd2l0aCAwLjkuOCwgcmVwb3J0ZWQgYnkgSlVybmVyCiAgICAgICAgIHAgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcigiZm9vIikKICAgICAgICAgc3ogPSAoY19jaGFyICogMykuZnJvbV9hZGRyZXNzKGFkZHJlc3NvZihwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbOl0sICJmb28iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzels6Ol0sICJmb28iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzels6Oi0xXSwgIm9vZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6Wzo6M10sICJmIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbMTo0OjJdLCAibyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6LnZhbHVlLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6XSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjpdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Oi0xXSwgIm9vZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjozXSwgImYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzE6NDoyXSwgIm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6LnZhbHVlLCAiZm9vIikKIAogICAgIHRyeToKICAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyCkBAIC0xMDksMTIgKzEwOSwxMiBAQAogICAgICAgICBkZWYgdGVzdF9mcm9tX2FkZHJlc3NXKHNlbGYpOgogICAgICAgICAgICAgcCA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiZm9vIikKICAgICAgICAgICAgIHN6ID0gKGNfd2NoYXIgKiAzKS5mcm9tX2FkZHJlc3MoYWRkcmVzc29mKHApKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbOl0sICJmb28iKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbOjpdLCAiZm9vIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6Wzo6LTFdLCAib29mIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6Wzo6M10sICJmIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6WzE6NDoyXSwgIm8iKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3oudmFsdWUsICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6XSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6XSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6LTFdLCAib29mIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjozXSwgImYiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzelsxOjQ6Ml0sICJvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3oudmFsdWUsICJmb28iKQogCiAgICAgZGVmIHRlc3RfY2FjaGUoc2VsZik6CiAgICAgICAgICMgQXJyYXkgdHlwZXMgYXJlIGNhY2hlZCBpbnRlcm5hbGx5IGluIHRoZSBfY3R5cGVzIGV4dGVuc2lvbiwKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAgICAjIENyZWF0ZSBhIG5ldyBhcnJheSB0eXBlIGJhc2VkIG9uIGl0OgogICAgICAgICB0MSA9IG15X2ludCAqIDEKICAgICAgICAgdDIgPSBteV9pbnQgKiAxCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSBpcyB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIGlzIHQyKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5CmluZGV4IDA1ODEwNTkuLmYyNTM5YjEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkKQEAgLTI1LDggKzI1LDggQEAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgxKSwgc2VsZi53cmFwKHUieCIpLCBzZWxmLndyYXAoMyksIHNlbGYud3JhcCg0KSwgc2VsZi53cmFwKDUuMCksIHNlbGYud3JhcCg2LjApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDEzOSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocmVzdWx0KSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMTM5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICBkZWYgdGVzdF9wb2ludGVycyhzZWxmKToKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCkBAIC0zOSwxOCArMzksMTggQEAKIAogICAgICAgICB2ID0gY19pbnQoNDIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocG9pbnRlcih2KS5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9pbnRlcih2KS5jb250ZW50cy52YWx1ZSwgNDIpCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKHBvaW50ZXIodikpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIFBPSU5URVIoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA0MikKIAogICAgICAgICAjIFRoaXMgb24gd29ya3MuLi4KICAgICAgICAgcmVzdWx0ID0gZihzZWxmLndyYXAocG9pbnRlcih2KSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIHYudmFsdWUpCiAKICAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoOTkpKQogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcChwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDk5KQogCiAgICAgZGVmIHRlc3Rfc2hvcnRzKHNlbGYpOgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICAgICAgY2IgPSBDYWxsQmFjayhjYWxsYmFjaykKICAgICAgICAgZihzZWxmLndyYXAoMioqMTgpLCBzZWxmLndyYXAoY2IpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhcmdzLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBleHBlY3RlZCkKIAogICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtODQsMTcgKzg0LDE3IEBACiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKIAogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgtMTApLCBzZWxmLndyYXAoY2IpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKIAogICAgICAgICAjIHRlc3Qgd2l0aCBwcm90b3R5cGUKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2ludCwgTXlDYWxsYmFja10KICAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQogCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgICAgIEFub3RoZXJDYWxsYmFjayA9IENBTExCQUNLX0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKIApAQCAtMTE2LDEyICsxMTYsMTIgQEAKIAogICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgogICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBpbnQpCiAgICAgICAgICAgICByZXR1cm4gdmFsdWUKIAogICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgZGVmIHRlc3RfbG9uZ2xvbmdfY2FsbGJhY2tzKHNlbGYpOgogCkBAIC0xMzMsMTIgKzEzMywxMiBAQAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfbG9uZ2xvbmcsIE15Q2FsbGJhY2tdCiAKICAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpKQogICAgICAgICAgICAgcmV0dXJuIHZhbHVlICYgMHg3RkZGRkZGRgogCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMzU3NzYyNTU4NywgaW50KGYoc2VsZi53cmFwKDEwMDAwMDAwMDAwMDApLCBzZWxmLndyYXAoY2IpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTM1Nzc2MjU1ODcsIGludChmKHNlbGYud3JhcCgxMDAwMDAwMDAwMDAwKSwgc2VsZi53cmFwKGNiKSkpKQogCiAgICAgZGVmIHRlc3RfYnl2YWwoc2VsZik6CiAgICAgICAgICMgd2l0aG91dCBwcm90b3R5cGUKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKICAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CiAgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyB3aXRoIHByb3RvdHlwZQogICAgICAgICBwdGluID0gUE9JTlQoMTAxLCAxMDIpCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChzZWxmLndyYXAocHRpbiksIGJ5cmVmKHB0b3V0KSkKICAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CiAgICAgICAgIGV4cGVjdGVkID0gMjAzLCAxMDEsIDEwMgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzJIKHNlbGYpOgogICAgICAgICBjbGFzcyBTMkgoU3RydWN0dXJlKToKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgICAgICBkbGwucmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQogICAgICAgICBpbnAgPSBTMkgoOTksIDg4KQogICAgICAgICBzMmggPSBkbGwucmV0XzJoX2Z1bmMoc2VsZi53cmFwKGlucCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzMmgueCwgczJoLnkpLCAoOTkqMiwgODgqMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKIAogICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEgoc2VsZik6CiAgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGRsbC5yZXRfOGlfZnVuYy5hcmd0eXBlcyA9IFtTOEldCiAgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQogICAgICAgICBzOGkgPSBkbGwucmV0XzhpX2Z1bmMoc2VsZi53cmFwKGlucCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQogCiAjfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CmluZGV4IDk2Y2Q3YzYuLmU5YzQ2YzIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKQEAgLTM3LDE0ICszNywxNCBAQAogICAgICAgICAgICAgZm9yIG5hbWUgaW4gIkFCQ0RFRkdISSI6CiAgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQogICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCiAKICAgICBkZWYgdGVzdF9zaG9ydHMoc2VsZik6CiAgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CiAgICAgICAgICAgICBmb3IgbmFtZSBpbiAiTU5PUFFSUyI6CiAgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQogICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCiAKIHNpZ25lZF9pbnRfdHlwZXMgPSAoY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nKQogdW5zaWduZWRfaW50X3R5cGVzID0gKGNfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nKQpAQCAtNTgsMTAgKzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nLCA2MiksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2xvbmdsb25nLCAxKV0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2xvbmdsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2xvbmdsb25nKSkKICAgICAgICAgeCA9IFgoKQogICAgICAgICB4LmEsIHguYiwgeC5jID0gLTEsIDcsIC0xCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4LmEsIHguYiwgeC5jKSwgKC0xLCA3LCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguYSwgeC5iLCB4LmMpLCAoLTEsIDcsIC0xKSkKIAogICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgpAQCAtNjksMTEgKzY5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Vsb25nbG9uZywgNjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY191bG9uZ2xvbmcsIDEpXQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfbG9uZ2xvbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfbG9uZ2xvbmcpKQogICAgICAgICB4ID0gWCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDAsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDAsIDAsIDApKQogICAgICAgICB4LmEsIHguYiwgeC5jID0gNywgNywgNwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5hLCB4LmIsIHguYyksICgxLCA3LCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeC5hLCB4LmIsIHguYyksICgxLCA3LCAxKSkKIAogICAgIGRlZiB0ZXN0X3NpZ25lZChzZWxmKToKICAgICAgICAgZm9yIGNfdHlwIGluIHNpZ25lZF9pbnRfdHlwZXM6CkBAIC04MiwxNCArODIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImEiLCBjX3R5cCwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY190eXAsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfdHlwLCAxKV0KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSoyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkqMikKIAogICAgICAgICAgICAgeCA9IFgoKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKICAgICAgICAgICAgIHguYSA9IC0xCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIC0xLCAwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAtMSwgMCwgMCkpCiAgICAgICAgICAgICB4LmEsIHguYiA9IDAsIC0xCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIC0xLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAtMSwgMCkpCiAKIAogICAgIGRlZiB0ZXN0X3Vuc2lnbmVkKHNlbGYpOgpAQCAtOTgsMTQgKzk4LDE0IEBACiAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY190eXAsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdHlwLCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3R5cCwgMSldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSkKIAogICAgICAgICAgICAgeCA9IFgoKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKICAgICAgICAgICAgIHguYSA9IC0xCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDcsIDAsIDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDcsIDAsIDApKQogICAgICAgICAgICAgeC5hLCB4LmIgPSAwLCAtMQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCA3LCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCA3LCAwKSkKIAogCiAgICAgZGVmIGZhaWxfZmllbGRzKHNlbGYsICpmaWVsZHMpOgpAQCAtMTE1LDE3ICsxMTUsMTcgQEAKICAgICBkZWYgdGVzdF9ub25pbnRfdHlwZXMoc2VsZik6CiAgICAgICAgICMgYml0IGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgb24gbm9uLWludGVnZXIgdHlwZXMuCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY19jaGFyX3AsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcl9wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX2NoYXJfcCcpKQogCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY192b2lkX3AsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfdm9pZF9wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3ZvaWRfcCcpKQogCiAgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgUE9JTlRFUihjX2ludCksIDEpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBMUF9jX2ludCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIExQX2NfaW50JykpCiAKICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX2NoYXIsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgY19jaGFyJykpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgY193Y2hhcgpAQCAtMTMzLDU5ICsxMzMsNTkgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY193Y2hhciwgMSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfd2NoYXInKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3djaGFyJykpCiAKICAgICAgICAgY2xhc3MgRHVtbXkoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gW10KIAogICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIER1bW15LCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBEdW1teScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgRHVtbXknKSkKIAogICAgIGRlZiB0ZXN0X3NpbmdsZV9iaXRmaWVsZF9zaXplKHNlbGYpOgogICAgICAgICBmb3IgY190eXAgaW4gaW50X3R5cGVzOgogICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3R5cCwgLTEpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCiAKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIDApKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCiAKICAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgMSldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSkKIAogICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdHlwLCBzaXplb2YoY190eXApKjgpXQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY190eXApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCiAKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIHNpemVvZihjX3R5cCkqOCArIDEpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCiAKICAgICBkZWYgdGVzdF9tdWx0aV9iaXRmaWVsZHNfc2l6ZShzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkpCiAKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImExIiwgY19zaG9ydCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkqMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5hLm9mZnNldCwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5hMS5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfc2hvcnQpKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmExLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQogCiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfc2hvcnQsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19zaG9ydCwgMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19zaG9ydCwgMTQpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3Nob3J0KSozKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmEub2Zmc2V0LCBzaXplb2YoY19zaG9ydCkqMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfc2hvcnQpKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5jLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3KToKQEAgLTE5OSwyMSArMTk5LDIxIEBACiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQsIDQpXQogICAgICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkqMikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpKQogCiAgICAgZGVmIHRlc3RfbWl4ZWRfMihzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50LCAzMildCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQogCiAgICAgZGVmIHRlc3RfbWl4ZWRfMyhzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWJ5dGUsIDQpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2J5dGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfYnl0ZSkpCiAKICAgICBkZWYgdGVzdF9taXhlZF80KHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CkBAIC0yMjcsOSArMjI3LDkgQEAKICAgICAgICAgIyBkb2VzICh1bmxlc3MgR0NDIGlzIHJ1biB3aXRoICctbW1zLWJpdGZpZWxkcycgd2hpY2gKICAgICAgICAgIyBwcm9kdWNlcyBjb2RlIGNvbXBhdGlibGUgd2l0aCBNU1ZDKS4KICAgICAgICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKIAogICAgIGRlZiB0ZXN0X2Fub25fYml0ZmllbGRzKHNlbGYpOgogICAgICAgICAjIGFub255bW91cyBiaXQtZmllbGRzIGdhdmUgYSBzdHJhbmdlIGVycm9yIG1lc3NhZ2UKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5CmluZGV4IDViOTZkMTIuLmJmOTMxYWIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weQpAQCAtNSwzMiArNSwzMiBAQAogCiAgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgogICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMzIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgMzIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihiKSwgMzIgKiBzaXplb2YoY19jaGFyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCAzMiAqIHNpemVvZihjX2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyBzdHIpCiAKICAgICAgICAgYiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJhYmMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfY2hhcikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGJbMF0pIGlzIHN0cikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYlswXSwgImEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzpdLCAiYWJjXDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6OjJdLCAiYWMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6NV0sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5nX2NvbnZlcnNpb24oc2VsZik6CiAgICAgICAgIGIgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY19jaGFyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgc3RyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzBdLCAiYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOl0sICJhYmNcMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjpdLCAiYWJjXDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6Ml0sICJhYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjo1XSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCiAKICAgICB0cnk6CiAgICAgICAgIGNfd2NoYXIKQEAgLTM5LDMyICszOSwzMiBAQAogICAgIGVsc2U6CiAgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfYnVmZmVyKHNlbGYpOgogICAgICAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigzMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgMzIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfd2NoYXIpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCAzMiAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCiAKICAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIodSJhYmMiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShiWzBdKSBpcyB1bmljb2RlKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYlswXSwgdSJhIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOl0sICJhYmNcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjotMV0sICJcMGNiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6Ml0sICJhYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6NV0sICJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIHUiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCiAgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udmVyc2lvbihzZWxmKToKICAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX3djaGFyKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzBdLCB1ImEiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjpdLCAiYWJjXDAiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjoyXSwgImFjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjo1XSwgImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgdSJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgImFiY1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjoyXSwgImFjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CmluZGV4IDFmNjg5OTIuLmU2NGZkNDUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CkBAIC0yMywxMzEgKzIzLDEzMSBAQAogCiAgICAgZGVmIHRlc3RfZW5kaWFuX3Nob3J0KHNlbGYpOgogICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc2hvcnQuX19jdHlwZV9sZV9fIGlzIGNfc2hvcnQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zaG9ydC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3Nob3J0Ll9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc2hvcnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc2hvcnQuX19jdHlwZV9iZV9fIGlzIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfc2hvcnQpCiAgICAgICAgIHMgPSBjX3Nob3J0Ll9fY3R5cGVfYmVfXygweDEyMzQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIxMjM0IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKIAogICAgICAgICBzID0gY19zaG9ydC5fX2N0eXBlX2xlX18oMHgxMjM0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIjxoIiwgMHgxMjM0KSksICIzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMzQxMiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxoIiwgMHgxMjM0KSksICIzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQpCiAKICAgICAgICAgcyA9IGNfdXNob3J0Ll9fY3R5cGVfYmVfXygweDEyMzQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIxMjM0IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKIAogICAgICAgICBzID0gY191c2hvcnQuX19jdHlwZV9sZV9fKDB4MTIzNCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aCIsIDB4MTIzNCkpLCAiMzQxMiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aCIsIDB4MTIzNCkpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0KQogCiAgICAgZGVmIHRlc3RfZW5kaWFuX2ludChzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2ludC5fX2N0eXBlX2xlX18gaXMgY19pbnQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19pbnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2xlX18gaXMgY19pbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2ludCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2ludC5fX2N0eXBlX2JlX18gaXMgY19pbnQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2JlX18gaXMgY19pbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2ludCkKIAogICAgICAgICBzID0gY19pbnQuX19jdHlwZV9iZV9fKDB4MTIzNDU2NzgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIjEyMzQ1Njc4IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5pIiwgMHgxMjM0NTY3OCkpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQ1Njc4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQogCiAgICAgICAgIHMgPSBjX2ludC5fX2N0eXBlX2xlX18oMHgxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGkiLCAweDEyMzQ1Njc4KSksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCiAKICAgICAgICAgcyA9IGNfdWludC5fX2N0eXBlX2JlX18oMHgxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+SSIsIDB4MTIzNDU2NzgpKSwgIjEyMzQ1Njc4IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPkkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCiAKICAgICAgICAgcyA9IGNfdWludC5fX2N0eXBlX2xlX18oMHgxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8SSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPEkiLCAweDEyMzQ1Njc4KSksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCiAKICAgICBkZWYgdGVzdF9lbmRpYW5fbG9uZ2xvbmcoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19sb25nbG9uZy5fX2N0eXBlX2xlX18gaXMgY19sb25nbG9uZykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2xvbmdsb25nLl9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19sb25nbG9uZy5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19sb25nbG9uZy5fX2N0eXBlX2JlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19sb25nbG9uZykKIAogICAgICAgICBzID0gY19sb25nbG9uZy5fX2N0eXBlX2JlX18oMHgxMjM0NTY3ODkwQUJDREVGKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIj5xIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5xIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCiAKICAgICAgICAgcyA9IGNfbG9uZ2xvbmcuX19jdHlwZV9sZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8cSIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiRUZDREFCOTA3ODU2MzQxMiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8cSIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQogCiAgICAgICAgIHMgPSBjX3Vsb25nbG9uZy5fX2N0eXBlX2JlX18oMHgxMjM0NTY3ODkwQUJDREVGKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIj5RIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5RIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCiAKICAgICAgICAgcyA9IGNfdWxvbmdsb25nLl9fY3R5cGVfbGVfXygweDEyMzQ1Njc4OTBBQkNERUYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPFEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICJFRkNEQUI5MDc4NTYzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPFEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKIAogICAgIGRlZiB0ZXN0X2VuZGlhbl9mbG9hdChzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2Zsb2F0Ll9fY3R5cGVfbGVfXyBpcyBjX2Zsb2F0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfZmxvYXQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9sZV9fIGlzIGNfZmxvYXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19mbG9hdC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfZmxvYXQpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19mbG9hdC5fX2N0eXBlX2JlX18gaXMgY19mbG9hdCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2Zsb2F0Ll9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19mbG9hdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2Zsb2F0Ll9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQogICAgICAgICBzID0gY19mbG9hdChtYXRoLnBpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soImYiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soImYiLCBtYXRoLnBpKSksIGJpbihzKSkKICAgICAgICAgIyBIbSwgd2hhdCdzIHRoZSBwcmVjaXNpb24gb2YgYSBmbG9hdCBjb21wYXJlZCB0byBhIGRvdWJsZT8KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzLnZhbHVlLCBtYXRoLnBpLCA2KQogICAgICAgICBzID0gY19mbG9hdC5fX2N0eXBlX2xlX18obWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZiIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZiIsIG1hdGgucGkpKSwgYmluKHMpKQogICAgICAgICBzID0gY19mbG9hdC5fX2N0eXBlX2JlX18obWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZiIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZiIsIG1hdGgucGkpKSwgYmluKHMpKQogCiAgICAgZGVmIHRlc3RfZW5kaWFuX2RvdWJsZShzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2RvdWJsZS5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19kb3VibGUuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2RvdWJsZSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2RvdWJsZS5fX2N0eXBlX2JlX18gaXMgY19kb3VibGUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19kb3VibGUuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2JlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKICAgICAgICAgcyA9IGNfZG91YmxlKG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiZCIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCJkIiwgbWF0aC5waSkpLCBiaW4ocykpCiAgICAgICAgIHMgPSBjX2RvdWJsZS5fX2N0eXBlX2xlX18obWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgbWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZCIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZCIsIG1hdGgucGkpKSwgYmluKHMpKQogICAgICAgICBzID0gY19kb3VibGUuX19jdHlwZV9iZV9fKG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmQiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmQiLCBtYXRoLnBpKSksIGJpbihzKSkKIAogICAgIGRlZiB0ZXN0X2VuZGlhbl9vdGhlcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfYnl0ZS5fX2N0eXBlX2xlX18gaXMgY19ieXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19ieXRlLl9fY3R5cGVfYmVfXyBpcyBjX2J5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2J5dGUuX19jdHlwZV9sZV9fIGlzIGNfYnl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfYnl0ZS5fX2N0eXBlX2JlX18gaXMgY19ieXRlKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3VieXRlLl9fY3R5cGVfbGVfXyBpcyBjX3VieXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY191Ynl0ZS5fX2N0eXBlX2JlX18gaXMgY191Ynl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfdWJ5dGUuX19jdHlwZV9sZV9fIGlzIGNfdWJ5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3VieXRlLl9fY3R5cGVfYmVfXyBpcyBjX3VieXRlKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2NoYXIuX19jdHlwZV9sZV9fIGlzIGNfY2hhcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhci5fX2N0eXBlX2JlX18gaXMgY19jaGFyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyLl9fY3R5cGVfbGVfXyBpcyBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXIuX19jdHlwZV9iZV9fIGlzIGNfY2hhcikKIAogICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHNfMShzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKQEAgLTIxOSw3ICsyMTksNyBAQAogCiAgICAgICAgIHMxID0gUygweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCiAgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzMSksIGJpbihzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMxKSwgYmluKHMyKSkKIAogICAgIGRlZiB0ZXN0X3VuYWxpZ25lZF9ub25uYXRpdmVfc3RydWN0X2ZpZWxkcyhzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgICAgICBzMS5pID0gMHgxMjM0NTY3OAogICAgICAgICBzMS5kID0gMy4xNAogICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oczEpLCBiaW4oczIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzMSksIGJpbihzMikpCiAKICAgICBkZWYgdGVzdF91bmFsaWduZWRfbmF0aXZlX3N0cnVjdF9maWVsZHMoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAgICAgczEuaSA9IDB4MTIzNDU2NzgKICAgICAgICAgczEuZCA9IDMuMTQKICAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMxKSwgYmluKHMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oczEpLCBiaW4oczIpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5CmluZGV4IGUzZTRiZTguLmI5ZTY2MjggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKQEAgLTE3LDE4ICsxNywxOCBAQAogICAgICAgICBQUk9UTyA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyh0eXAsIHR5cCkKICAgICAgICAgcmVzdWx0ID0gUFJPVE8oc2VsZi5jYWxsYmFjaykoYXJnKQogICAgICAgICBpZiB0eXAgPT0gY19mbG9hdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0FsbW9zdEVxdWFsKHJlc3VsdCwgYXJnLCBwbGFjZXM9NSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocmVzdWx0LCBhcmcsIHBsYWNlcz01KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5nb3RfYXJncywgKGFyZywpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X2FyZ3MsIChhcmcsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBhcmcpCiAKICAgICAgICAgUFJPVE8gPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmModHlwLCBjX2J5dGUsIHR5cCkKICAgICAgICAgcmVzdWx0ID0gUFJPVE8oc2VsZi5jYWxsYmFjaykoLTMsIGFyZykKICAgICAgICAgaWYgdHlwID09IGNfZmxvYXQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NBbG1vc3RFcXVhbChyZXN1bHQsIGFyZywgcGxhY2VzPTUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJlc3VsdCwgYXJnLCBwbGFjZXM9NSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZ290X2FyZ3MsICgtMywgYXJnKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9hcmdzLCAoLTMsIGFyZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgYXJnKQogCiAgICAgIyMjIyMjIyMjIyMjIyMjIwogCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAgICAgICMgLi4uYnV0IHRoaXMgY2FsbCBkb2Vzbid0IGxlYWsgYW55IG1vcmUuICBXaGVyZSBpcyB0aGUgcmVmY291bnQ/CiAgICAgICAgICAgICBzZWxmLmNoZWNrX3R5cGUocHlfb2JqZWN0LCBvKQogICAgICAgICAgICAgYWZ0ZXIgPSBncmMobykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChhZnRlciwgbyksIChiZWZvcmUsIG8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYWZ0ZXIsIG8pLCAoYmVmb3JlLCBvKSkKIAogICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX3Jlc3R5cGVfMShzZWxmKToKICAgICAgICAgIyBPbmx5ICJmdW5kYW1lbnRhbCIgcmVzdWx0IHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGNhbGxiYWNrCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICAgICAgcmVzdWx0ID0gaW50ZWdyYXRlKDAuMCwgMS4wLCBDQUxMQkFDSyhmdW5jKSwgMTApCiAgICAgICAgIGRpZmYgPSBhYnMocmVzdWx0IC0gMS4vMy4pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRpZmYgPCAwLjAxLCAiJXMgbm90IGxlc3MgdGhhbiAwLjAxIiAlIGRpZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWZmIDwgMC4wMSwgIiVzIG5vdCBsZXNzIHRoYW4gMC4wMSIgJSBkaWZmKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDIyYzY0NzUuLjkwNmZmZmMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtOSwxNSArOSwxNSBAQAogCiAgICAgICAgICMgY2FzdGluZyBhbiBhcnJheSB0byBhIHBvaW50ZXIgd29ya3MuCiAgICAgICAgIHB0ciA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzQyLCAxNywgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQogCiAgICAgICAgIGlmIDIqc2l6ZW9mKGNfc2hvcnQpID09IHNpemVvZihjX2ludCk6CiAgICAgICAgICAgICBwdHIgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfc2hvcnQpKQogICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoNildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0MiwgMCwgMTcsIDAsIDIsIDBdKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoNildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCA0MiwgMCwgMTcsIDAsIDJdKQogCiAgICAgZGVmIHRlc3RfYWRkcmVzczJwb2ludGVyKHNlbGYpOgpAQCAtMjUsNTQgKzI1LDU0IEBACiAKICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3NvZihhcnJheSkKICAgICAgICAgcHRyID0gY2FzdChjX3ZvaWRfcChhZGRyZXNzKSwgUE9JTlRFUihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzQyLCAxNywgMl0pCiAKICAgICAgICAgcHRyID0gY2FzdChhZGRyZXNzLCBQT0lOVEVSKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKIAogICAgIGRlZiB0ZXN0X3AyYV9vYmplY3RzKHNlbGYpOgogICAgICAgICBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCiAgICAgICAgIGFycmF5WzBdID0gImZvbyBiYXIiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQogCiAgICAgICAgIHAgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfY2hhcl9wKSkKICAgICAgICAgIyBhcnJheSBhbmQgcCBzaGFyZSBhIGNvbW1vbiBfb2JqZWN0cyBhdHRyaWJ1dGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHAuX29iamVjdHMgaXMgYXJyYXkuX29iamVjdHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocC5fb2JqZWN0cyBpcyBhcnJheS5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcnJheS5fb2JqZWN0cywgeycwJzogImZvbyBiYXIiLCBpZChhcnJheSk6IGFycmF5fSkKICAgICAgICAgcFswXSA9ICJzcGFtIHNwYW0iCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuX29iamVjdHMsIHsnMCc6ICJzcGFtIHNwYW0iLCBpZChhcnJheSk6IGFycmF5fSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFycmF5Ll9vYmplY3RzIGlzIHAuX29iamVjdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fb2JqZWN0cywgeycwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKICAgICAgICAgcFsxXSA9ICJmb28gYmFyIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLl9vYmplY3RzLCB7JzEnOiAnZm9vIGJhcicsICcwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLl9vYmplY3RzLCB7JzEnOiAnZm9vIGJhcicsICcwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKIAogICAgIGRlZiB0ZXN0X290aGVyKHNlbGYpOgogICAgICAgICBwID0gY2FzdCgoY19pbnQgKiA0KSgxLCAyLCAzLCA0KSwgUE9JTlRFUihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NDpdLCBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMzotMTotMV0sIFs0LCAzLCAyLCAxXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NDozXSwgWzEsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzM6LTE6LTFdLCBbNCwgMywgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDozXSwgWzEsIDRdKQogICAgICAgICBjX2ludCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjQ6XSwgWzEsIDIsIDMsIDRdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzM6LTE6LTFdLCBbNCwgMywgMiwgMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjQ6M10sIFsxLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMzotMTotMV0sIFs0LCAzLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCiAgICAgICAgIHBbMl0gPSA5NgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NDpdLCBbMSwgMiwgOTYsIDRdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzM6LTE6LTFdLCBbNCwgOTYsIDIsIDFdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0OjNdLCBbMSwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDpdLCBbMSwgMiwgOTYsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMzotMTotMV0sIFs0LCA5NiwgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDozXSwgWzEsIDRdKQogICAgICAgICBjX2ludCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwgMiwgOTYsIDRdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0Ol0sIFsxLCAyLCA5NiwgNF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMzotMTotMV0sIFs0LCA5NiwgMiwgMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjQ6M10sIFsxLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFszOi0xOi0xXSwgWzQsIDk2LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCiAKICAgICBkZWYgdGVzdF9jaGFyX3Aoc2VsZik6CiAgICAgICAgICMgVGhpcyBkaWRuJ3Qgd29yazogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uCiAgICAgICAgIHMgPSBjX2NoYXJfcCgiaGlobyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoY2FzdChzLCBjX3ZvaWRfcCksIGNfY2hhcl9wKS52YWx1ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX2NoYXJfcCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWhvIikKIAogICAgIHRyeToKQEAgLTgyLDcgKzgyLDcgQEAKICAgICBlbHNlOgogICAgICAgICBkZWYgdGVzdF93Y2hhcl9wKHNlbGYpOgogICAgICAgICAgICAgcyA9IGNfd2NoYXJfcCgiaGlobyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpaG8iKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CmluZGV4IDhmOTdmYzQuLjQ5M2NiZTkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKQEAgLTE3LDE3NiArMTcsMTc2IEBACiAgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2IucmVzdHlwZSA9IGNfYnl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfYi5hcmd0eXBlcyA9IChjX2J5dGUsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYigtMTI2KSwgLTQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTEyNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYigtMTI2KSwgLTQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMTI2KQogCiAgICAgZGVmIHRlc3RfYnl0ZV9wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYmIucmVzdHlwZSA9IGNfYnl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfYmIuYXJndHlwZXMgPSAoY19ieXRlLCBjX2J5dGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iYigwLCAtMTI2KSwgLTQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTEyNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmIoMCwgLTEyNiksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTEyNikKIAogICAgIGRlZiB0ZXN0X3VieXRlKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfQi5yZXN0eXBlID0gY191Ynl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfQi5hcmd0eXBlcyA9IChjX3VieXRlLCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0IoMjU1KSwgODUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX0IoMjU1KSwgODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDI1NSkKIAogICAgIGRlZiB0ZXN0X3VieXRlX3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iQi5yZXN0eXBlID0gY191Ynl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfYkIuYXJndHlwZXMgPSAoY19ieXRlLCBjX3VieXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYkIoMCwgMjU1KSwgODUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JCKDAsIDI1NSksIDg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCAyNTUpCiAKICAgICBkZWYgdGVzdF9zaG9ydChzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2gucmVzdHlwZSA9IGNfc2hvcnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2guYXJndHlwZXMgPSAoY19zaG9ydCwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9oKC0zMjc2NiksIC0xMDkyMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC0zMjc2NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfaCgtMzI3NjYpLCAtMTA5MjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0zMjc2NikKIAogICAgIGRlZiB0ZXN0X3Nob3J0X3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iaC5yZXN0eXBlID0gY19zaG9ydAogICAgICAgICBzZWxmLl9kbGwudGZfYmguYXJndHlwZXMgPSAoY19ieXRlLCBjX3Nob3J0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYmgoMCwgLTMyNzY2KSwgLTEwOTIyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTMyNzY2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iaCgwLCAtMzI3NjYpLCAtMTA5MjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0zMjc2NikKIAogICAgIGRlZiB0ZXN0X3VzaG9ydChzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX0gucmVzdHlwZSA9IGNfdXNob3J0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9ILmFyZ3R5cGVzID0gKGNfdXNob3J0LCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0goNjU1MzUpLCAyMTg0NSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDY1NTM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9IKDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDY1NTM1KQogCiAgICAgZGVmIHRlc3RfdXNob3J0X3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iSC5yZXN0eXBlID0gY191c2hvcnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2JILmFyZ3R5cGVzID0gKGNfYnl0ZSwgY191c2hvcnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iSCgwLCA2NTUzNSksIDIxODQ1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgNjU1MzUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JIKDAsIDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDY1NTM1KQogCiAgICAgZGVmIHRlc3RfaW50KHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfaS5yZXN0eXBlID0gY19pbnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2kuYXJndHlwZXMgPSAoY19pbnQsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfaSgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfaSgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQogCiAgICAgZGVmIHRlc3RfaW50X3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iaS5yZXN0eXBlID0gY19pbnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2JpLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19pbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iaSgwLCAtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmkoMCwgLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKIAogICAgIGRlZiB0ZXN0X3VpbnQoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9JLnJlc3R5cGUgPSBjX3VpbnQKICAgICAgICAgc2VsZi5fZGxsLnRmX0kuYXJndHlwZXMgPSAoY191aW50LCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0koNDI5NDk2NzI5NSksIDE0MzE2NTU3NjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9JKDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQogCiAgICAgZGVmIHRlc3RfdWludF9wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYkkucmVzdHlwZSA9IGNfdWludAogICAgICAgICBzZWxmLl9kbGwudGZfYkkuYXJndHlwZXMgPSAoY19ieXRlLCBjX3VpbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iSSgwLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDQyOTQ5NjcyOTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JJKDAsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQogCiAgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2wucmVzdHlwZSA9IGNfbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfbC5hcmd0eXBlcyA9IChjX2xvbmcsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfbCgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfbCgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQogCiAgICAgZGVmIHRlc3RfbG9uZ19wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYmwucmVzdHlwZSA9IGNfbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfYmwuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9ibCgwLCAtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmwoMCwgLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKIAogICAgIGRlZiB0ZXN0X3Vsb25nKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfTC5yZXN0eXBlID0gY191bG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfTC5hcmd0eXBlcyA9IChjX3Vsb25nLCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0woNDI5NDk2NzI5NSksIDE0MzE2NTU3NjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9MKDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQogCiAgICAgZGVmIHRlc3RfdWxvbmdfcGx1cyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2JMLnJlc3R5cGUgPSBjX3Vsb25nCiAgICAgICAgIHNlbGYuX2RsbC50Zl9iTC5hcmd0eXBlcyA9IChjX2NoYXIsIGNfdWxvbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iTCgnICcsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYkwoJyAnLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKIAogICAgIGRlZiB0ZXN0X2xvbmdsb25nKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfcS5yZXN0eXBlID0gY19sb25nbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfcS5hcmd0eXBlcyA9IChjX2xvbmdsb25nLCApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9xKC05MjIzMzcyMDM2ODU0Nzc1ODA2KSwgLTMwNzQ0NTczNDU2MTgyNTg2MDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfcSgtOTIyMzM3MjAzNjg1NDc3NTgwNiksIC0zMDc0NDU3MzQ1NjE4MjU4NjAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKIAogICAgIGRlZiB0ZXN0X2xvbmdsb25nX3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9icS5yZXN0eXBlID0gY19sb25nbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfYnEuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmdsb25nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYnEoMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDYpLCAtMzA3NDQ1NzM0NTYxODI1ODYwMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC05MjIzMzcyMDM2ODU0Nzc1ODA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9icSgwLCAtOTIyMzM3MjAzNjg1NDc3NTgwNiksIC0zMDc0NDU3MzQ1NjE4MjU4NjAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKIAogICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX1EucmVzdHlwZSA9IGNfdWxvbmdsb25nCiAgICAgICAgIHNlbGYuX2RsbC50Zl9RLmFyZ3R5cGVzID0gKGNfdWxvbmdsb25nLCApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9RKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9RKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUpCiAKICAgICBkZWYgdGVzdF91bG9uZ2xvbmdfcGx1cyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2JRLnJlc3R5cGUgPSBjX3Vsb25nbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfYlEuYXJndHlwZXMgPSAoY19ieXRlLCBjX3Vsb25nbG9uZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JRKDAsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iUSgwLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSksIDYxNDg5MTQ2OTEyMzY1MTcyMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQogCiAgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9mLnJlc3R5cGUgPSBjX2Zsb2F0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9mLmFyZ3R5cGVzID0gKGNfZmxvYXQsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfZigtNDIuKSwgLTE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfZigtNDIuKSwgLTE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTQyKQogCiAgICAgZGVmIHRlc3RfZmxvYXRfcGx1cyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2JmLnJlc3R5cGUgPSBjX2Zsb2F0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iZi5hcmd0eXBlcyA9IChjX2J5dGUsIGNfZmxvYXQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iZigwLCAtNDIuKSwgLTE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmYoMCwgLTQyLiksIC0xNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC00MikKIAogICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2QucmVzdHlwZSA9IGNfZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9kLmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2QoNDIuKSwgMTQuKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2QoNDIuKSwgMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKIAogICAgIGRlZiB0ZXN0X2RvdWJsZV9wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYmQucmVzdHlwZSA9IGNfZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9iZC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfZG91YmxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYmQoMCwgNDIuKSwgMTQuKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JkKDAsIDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCiAKICAgICBkZWYgdGVzdF9sb25nZG91YmxlKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfRC5yZXN0eXBlID0gY19sb25nZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9ELmFyZ3R5cGVzID0gKGNfbG9uZ2RvdWJsZSwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9EKDQyLiksIDE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9EKDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCiAKICAgICBkZWYgdGVzdF9sb25nZG91YmxlX3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iRC5yZXN0eXBlID0gY19sb25nZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9iRC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfbG9uZ2RvdWJsZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JEKDAsIDQyLiksIDE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iRCgwLCA0Mi4pLCAxNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIDQyKQogCiAgICAgZGVmIHRlc3RfY2FsbHdpdGhyZXN1bHQoc2VsZik6CiAgICAgICAgIGRlZiBwcm9jZXNzX3Jlc3VsdChyZXN1bHQpOgogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIDIKICAgICAgICAgc2VsZi5fZGxsLnRmX2kucmVzdHlwZSA9IHByb2Nlc3NfcmVzdWx0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9pLmFyZ3R5cGVzID0gKGNfaW50LCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2koNDIpLCAyOCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfaSgtNDIpLCAtMjgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koNDIpLCAyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koLTQyKSwgLTI4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtNDIpCiAKICAgICBkZWYgdGVzdF92b2lkKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudHZfaS5yZXN0eXBlID0gTm9uZQogICAgICAgICBzZWxmLl9kbGwudHZfaS5hcmd0eXBlcyA9IChjX2ludCwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50dl9pKDQyKSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudHZfaSgtNDIpLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50dl9pKDQyKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnR2X2koLTQyKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTQyKQogCiAjIFRoZSBmb2xsb3dpbmcgcmVwZWF0ZXMgdGhlIGFib3ZlIHRlc3RzIHdpdGggc3RkY2FsbCBmdW5jdGlvbnMgKHdoZXJlCiAjIHRoZXkgYXJlIGF2YWlsYWJsZSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKaW5kZXggZDE1YmQyZS4uMDFjY2M1NyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKQEAgLTE0LDE2ICsxNCwxNiBAQAogCiAgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKIAogICAgICAgICBkbGwuX3Rlc3RmdW5jX3BfcC5yZXN0eXBlID0gQ0hFQ0tFRAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiNDIiLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjQyIiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQogCiAgICAgICAgIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUgPSBOb25lCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCiAKICAgICAgICAgZGVsIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQogCiAgICAgdHJ5OgogICAgICAgICBvbGVkbGwKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIGRlZiB0ZXN0X29sZWRsbChzZWxmKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhXaW5kb3dzRXJyb3IsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xlZGxsLm9sZWF1dDMyLkNyZWF0ZVR5cGVMaWIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5vbmUsIE5vbmUpCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKaW5kZXggYjgwNjU2Yi4uMDI1NGMzYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKQEAgLTE1LDExICsxNSwxMSBAQAogCiAgICAgICAgICAgICBsaWJjX29wZW4uYXJndHlwZXMgPSBjX2NoYXJfcCwgY19pbnQKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliY19vcGVuKCIiLCAwKSwgLTEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRfZXJybm8oKSwgZXJybm8uRU5PRU5UKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWJjX29wZW4oIiIsIDApLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm5vKCksIGVycm5vLkVOT0VOVCkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2V0X2Vycm5vKDMyKSwgZXJybm8uRU5PRU5UKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2Vycm5vKCksIDMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXRfZXJybm8oMzIpLCBlcnJuby5FTk9FTlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJubygpLCAzMikKIAogCiAgICAgICAgICAgICBkZWYgX3dvcmtlcigpOgpAQCAtMzEsMTQgKzMxLDE0IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgbGliY19vcGVuID0gbGliYy5vcGVuCiAgICAgICAgICAgICAgICAgbGliY19vcGVuLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfaW50Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliY19vcGVuKCIiLCAwKSwgLTEpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2Vycm5vKCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWJjX29wZW4oIiIsIDApLCAtMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJubygpLCAwKQogCiAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dvcmtlcikKICAgICAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICAgICAgdC5qb2luKCkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2Vycm5vKCksIDMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJybm8oKSwgMzIpCiAgICAgICAgICAgICBzZXRfZXJybm8oMCkKIAogICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKQEAgLTQ4LDExICs0OCwxMSBAQAogICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlID0gZGxsLkdldE1vZHVsZUhhbmRsZUEKICAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZS5hcmd0eXBlcyA9IFtjX3djaGFyX3BdCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIEdldE1vZHVsZUhhbmRsZSgiZm9vIikpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAxMjYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIEdldE1vZHVsZUhhbmRsZSgiZm9vIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDEyNikKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2V0X2xhc3RfZXJyb3IoMzIpLCAxMjYpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0X2xhc3RfZXJyb3IoMzIpLCAxMjYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDMyKQogCiAgICAgICAgICAgICBkZWYgX3dvcmtlcigpOgogICAgICAgICAgICAgICAgIHNldF9sYXN0X2Vycm9yKDApCkBAIC02MiwxMyArNjIsMTMgQEAKICAgICAgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUuYXJndHlwZXMgPSBbY193Y2hhcl9wXQogICAgICAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSgiYmFyIikKIAotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdldF9sYXN0X2Vycm9yKCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAwKQogCiAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dvcmtlcikKICAgICAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICAgICAgdC5qb2luKCkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2xhc3RfZXJyb3IoKSwgMzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDMyKQogCiAgICAgICAgICAgICBzZXRfbGFzdF9lcnJvcigwKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQppbmRleCBlZDEyOTdkLi43N2U3ODlmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKQEAgLTc2LDcgKzc2LDcgQEAKICMjICAgICAgICAgICAgc3FydCA9IGxpYm0uc3FydAogIyMgICAgICAgICAgICBzcXJ0LmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKICMjICAgICAgICAgICAgc3FydC5yZXN0eXBlID0gY19kb3VibGUKLSMjICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3FydCgyKSwgbWF0aC5zcXJ0KDIpKQorIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxcnQoMiksIG1hdGguc3FydCgyKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5CmluZGV4IDQyODVlNDAuLjYyNGZiNzAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weQpAQCAtMTYsMTQgKzE2LDE0IEBACiAKICAgICAgICAgeSA9IFguZnJvbV9idWZmZXIoYSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmNfaW50LCBhWzBdKQotICAgICAgICBzZWxmLmZhaWxJZih5LmluaXRfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHkuaW5pdF9jYWxsZWQpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBhLnRvbGlzdCgpKQogCiAgICAgICAgIGFbMF0sIGFbLTFdID0gMjAwLCAtMjAwCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgYS50b2xpc3QoKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8oYSBpbiB4Ll9vYmplY3RzLnZhbHVlcygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpbiB4Ll9vYmplY3RzLnZhbHVlcygpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50LmZyb21fYnVmZmVyLCBhLCAtMSkKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICAgICB5ID0gWC5mcm9tX2J1ZmZlcl9jb3B5KGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5jX2ludCwgYVswXSkKLSAgICAgICAgc2VsZi5mYWlsSWYoeS5pbml0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh5LmluaXRfY2FsbGVkKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgcmFuZ2UoMTYpKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQppbmRleCA3ZWE4NzNmLi45OWFmNWVkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKQEAgLTE4LDEwICsxOCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbihhcmdzKQogCiAgICAgICAgIHggPSBYKGZ1bmMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgucmVzdHlwZSwgY19pbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguYXJndHlwZXMsIChjX2ludCwgY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoeCksIHNpemVvZihjX3ZvaWRwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY192b2lkcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5yZXN0eXBlLCBjX2ludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmFyZ3R5cGVzLCAoY19pbnQsIGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIHNpemVvZihjX3ZvaWRwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3ZvaWRwKSkKIAogICAgIGRlZiB0ZXN0X2ZpcnN0KHNlbGYpOgogICAgICAgICBTdGRDYWxsYmFjayA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCkBAIC0zMywxMiArMzMsMTIgQEAKICAgICAgICAgcyA9IFN0ZENhbGxiYWNrKGZ1bmMpCiAgICAgICAgIGMgPSBDZGVjbENhbGxiYWNrKGZ1bmMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocygxLCAyKSwgMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYygxLCAyKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzKDEsIDIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMoMSwgMiksIDMpCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyBubyBsb25nZXIgcmFpc2VzIGEgVHlwZUVycm9yIC0gaXQgaXMgbm93CiAgICAgICAgICMgcG9zc2libGUsIGFzIGluIEMsIHRvIGNhbGwgY2RlY2wgZnVuY3Rpb25zIHdpdGggbW9yZSBwYXJhbWV0ZXJzLgogICAgICAgICAjc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLCAxLCAyLCAzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjKDEsIDIsIDMsIDQsIDUsIDYpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMoMSwgMiwgMywgNCwgNSwgNiksIDMpCiAgICAgICAgIGlmIG5vdCBXSU5GVU5DVFlQRSBpcyBDRlVOQ1RZUEUgYW5kIG9zLm5hbWUgIT0gImNlIjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcywgMSwgMiwgMykKIApAQCAtNzUsOSArNzUsOSBAQAogICAgICAgICAjIyAgICAgICAgICAgICAgICAgICJscGZuV25kUHJvYyIsIFdORFBST0NfMih3bmRwcm9jKSkKICAgICAgICAgIyBpbnN0ZWFkOgogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhXTkRQUk9DIGlzIFdORFBST0NfMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFdORFBST0MgaXMgV05EUFJPQ18yKQogICAgICAgICAjICd3bmRjbGFzcy5scGZuV25kUHJvYycgbGVha3MgOTQgcmVmZXJlbmNlcy4gIFdoeT8KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod25kY2xhc3MubHBmblduZFByb2MoMSwgMiwgMywgNCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHduZGNsYXNzLmxwZm5XbmRQcm9jKDEsIDIsIDMsIDQpLCAxMCkKIAogCiAgICAgICAgIGYgPSB3bmRjbGFzcy5scGZuV25kUHJvYwpAQCAtODUsNyArODUsNyBAQAogICAgICAgICBkZWwgd25kY2xhc3MKICAgICAgICAgZGVsIHduZHByb2MKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmKDEwLCAxMSwgMTIsIDEzKSwgNDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigxMCwgMTEsIDEyLCAxMyksIDQ2KQogCiAgICAgZGVmIHRlc3RfZGxsZnVuY3Rpb25zKHNlbGYpOgogCkBAIC05Nyw4ICs5Nyw4IEBACiAgICAgICAgIHN0cmNociA9IGxpYi5teV9zdHJjaHIKICAgICAgICAgc3RyY2hyLnJlc3R5cGUgPSBjX2NoYXJfcAogICAgICAgICBzdHJjaHIuYXJndHlwZXMgPSAoY19jaGFyX3AsIGNfY2hhcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWZnaGkiLCAiYiIpLCAiYmNkZWZnaGkiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZmdoaSIsICJ4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWZnaGkiLCAiYiIpLCAiYmNkZWZnaGkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmZ2hpIiwgIngiKSwgTm9uZSkKIAogCiAgICAgICAgIHN0cnRvayA9IGxpYi5teV9zdHJ0b2sKQEAgLTExOCwxMCArMTE4LDEwIEBACiAjIyAgICAgICAgYi52YWx1ZSA9IHMKIAogIyMgICAgICAgIGIgPSBjX3N0cmluZyhzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJ0b2soYiwgIlxuIiksICJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cnRvayhOb25lLCAiXG4iKSwgImMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJ0b2soTm9uZSwgIlxuIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKGIsICJcbiIpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCBOb25lKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5CmluZGV4IDkzZDg5NWIuLjQ1MzQ4MTUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTcxLDggKzcxLDggQEAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKDEsIHUieCIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDEzOSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAxMzkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICBkZWYgdGVzdF93Y2hhcl9yZXN1bHQoc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTgzLDM4ICs4MywzOCBAQAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCiAgICAgICAgIGYucmVzdHlwZSA9IGNfd2NoYXIKICAgICAgICAgcmVzdWx0ID0gZigwLCAwLCAwLCAwLCAwLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIHUnXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB1J1x4MDAnKQogCiAgICAgZGVmIHRlc3Rfdm9pZHJlc3VsdChzZWxmKToKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfdgogICAgICAgICBmLnJlc3R5cGUgPSBOb25lCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfaW50KV0KICAgICAgICAgcmVzdWx0ID0gY19pbnQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmKDEsIDIsIGJ5cmVmKHJlc3VsdCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQudmFsdWUsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZigxLCAyLCBieXJlZihyZXN1bHQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudmFsdWUsIDMpCiAKICAgICBkZWYgdGVzdF9pbnRyZXN1bHQoc2VsZik6CiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2lfYmhpbGZkCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KICAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKICAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKIAogICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0yMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICAgICAgIyBJZiB3ZSBkZWNsYXJlIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYSBzaG9ydCwKICAgICAgICAgIyBpcyB0aGUgaGlnaCBwYXJ0IHNwbGl0IG9mZj8KICAgICAgICAgZi5yZXN0eXBlID0gY19zaG9ydAogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgaW50KQogCiAgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgMHgxMDAwNCwgNS4wLCA2LjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICAgICAgIyBZb3UgY2Fubm90IGFzc2luZyBjaGFyYWN0ZXIgZm9ybWF0IGNvZGVzIGFzIHJlc3R5cGUgYW55IGxvbmdlcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGYsICJyZXN0eXBlIiwgImkiKQpAQCAtMTI0LDM2ICsxMjQsMzYgQEAKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICBmLnJlc3R5cGUgPSBjX2Zsb2F0CiAgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQogCiAgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTIxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCiAKICAgICBkZWYgdGVzdF9kb3VibGVyZXN1bHQoc2VsZik6CiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2RfYmhpbGZkCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KICAgICAgICAgZi5yZXN0eXBlID0gY19kb3VibGUKICAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCiAKICAgICAgICAgcmVzdWx0ID0gZigtMSwgLTIsIC0zLCAtNCwgLTUuMCwgLTYuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAtMjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKIAogICAgIGRlZiB0ZXN0X2xvbmdkb3VibGVyZXN1bHQoc2VsZik6CiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX0RfYmhpbGZECiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2xvbmdkb3VibGVdCiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2RvdWJsZQogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKIAogICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0yMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0yMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQogCiAgICAgZGVmIHRlc3RfbG9uZ2xvbmdyZXN1bHQoc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTE2NCwyMyArMTY0LDIzIEBACiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCiAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcV9iaGlsZmRxCiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlLCBjX2xvbmdsb25nXQogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wLCAyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDQyKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5ncmVzdWx0KHNlbGYpOgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKICAgICAgICAgZi5hcmd0eXBlcyA9IE5vbmUKICAgICAgICAgZi5yZXN0eXBlID0gY19jaGFyX3AKICAgICAgICAgcmVzdWx0ID0gZigiMTIzIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAiMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICIxMjMiKQogCiAgICAgICAgIHJlc3VsdCA9IGYoTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgTm9uZSkKIAogICAgIGRlZiB0ZXN0X3BvaW50ZXJzKHNlbGYpOgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKQEAgLTE5MywyOSArMTkzLDI5IEBACiAKICAgICAgICAgdiA9IGNfaW50KDQyKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBvaW50ZXIodikuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvaW50ZXIodikuY29udGVudHMudmFsdWUsIDQyKQogICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgUE9JTlRFUihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBQT0lOVEVSKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQogCiAgICAgICAgICMgVGhpcyBvbiB3b3Jrcy4uLgogICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIHYudmFsdWUpCiAKICAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoOTkpKQogICAgICAgICByZXN1bHQgPSBmKHApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA5OSkKIAogICAgICAgICBhcmcgPSBieXJlZih2KQogICAgICAgICByZXN1bHQgPSBmKGFyZykKLSAgICAgICAgc2VsZi5mYWlsSWZFcXVhbChyZXN1bHQuY29udGVudHMsIHYudmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzdWx0LmNvbnRlbnRzLCB2LnZhbHVlKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGYsIGJ5cmVmKGNfc2hvcnQoMjIpKSkKIAogICAgICAgICAjIEl0IGlzIGRhbmdlcm91cywgaG93ZXZlciwgYmVjYXVzZSB5b3UgZG9uJ3QgY29udHJvbCB0aGUgbGlmZXRpbWUKICAgICAgICAgIyBvZiB0aGUgcG9pbnRlcjoKICAgICAgICAgcmVzdWx0ID0gZihieXJlZihjX2ludCg5OSkpKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKHJlc3VsdC5jb250ZW50cywgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzdWx0LmNvbnRlbnRzLCA5OSkKIAogICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCkBAIC0yNDIsNyArMjQyLDcgQEAKIAogICAgICAgICBjYiA9IENhbGxCYWNrKGNhbGxiYWNrKQogICAgICAgICBmKDIqKjE4LCBjYikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJncywgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgZXhwZWN0ZWQpCiAKICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTI1OSwxMyArMjU5LDEzIEBACiAKICAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQogICAgICAgICByZXN1bHQgPSBmKC0xMCwgY2IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgICAgICMgdGVzdCB3aXRoIHByb3RvdHlwZQogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQogICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCiAgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAtMTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCiAKICAgICAgICAgQW5vdGhlckNhbGxiYWNrID0gV0lORlVOQ1RZUEUoY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50KQogCkBAIC0yODgsMTIgKzI4OCwxMiBAQAogCiAgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CiAgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGludCkKICAgICAgICAgICAgIHJldHVybiB2YWx1ZQogCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKICAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKIAogICAgIGRlZiB0ZXN0X2xvbmdsb25nX2NhbGxiYWNrcyhzZWxmKToKIApAQCAtMzA1LDEyICszMDUsMTIgQEAKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2xvbmdsb25nLCBNeUNhbGxiYWNrXQogCiAgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKSkKICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmIDB4N0ZGRkZGRkYKIAogICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTM1Nzc2MjU1ODcsIGYoMTAwMDAwMDAwMDAwMCwgY2IpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzNTc3NjI1NTg3LCBmKDEwMDAwMDAwMDAwMDAsIGNiKSkKIAogICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIGRsbCwgIl94eHhfeXl5IikKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKICAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CiAgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyB3aXRoIHByb3RvdHlwZQogICAgICAgICBwdGluID0gUE9JTlQoMTAxLCAxMDIpCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChwdGluLCBieXJlZihwdG91dCkpCiAgICAgICAgIGdvdCA9IHJlc3VsdCwgcHRvdXQueCwgcHRvdXQueQogICAgICAgICBleHBlY3RlZCA9IDIwMywgMTAxLCAxMDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ290LCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl8ySChzZWxmKToKICAgICAgICAgY2xhc3MgUzJIKFN0cnVjdHVyZSk6CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICAgICAgZGxsLnJldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KICAgICAgICAgaW5wID0gUzJIKDk5LCA4OCkKICAgICAgICAgczJoID0gZGxsLnJldF8yaF9mdW5jKGlucCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQogCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fMkhfc3RkY2FsbChzZWxmKToKQEAgLTM1Niw3ICszNTYsNyBAQAogICAgICAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMucmVzdHlwZSA9IFMySAogICAgICAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQogICAgICAgICAgICAgczJoID0gd2luZGxsLnNfcmV0XzJoX2Z1bmMoUzJIKDk5LCA4OCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SChzZWxmKToKICAgICAgICAgY2xhc3MgUzhJKFN0cnVjdHVyZSk6CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICAgICAgZGxsLnJldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KICAgICAgICAgaW5wID0gUzhJKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIpCiAgICAgICAgIHM4aSA9IGRsbC5yZXRfOGlfZnVuYyhpbnApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQogCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CkBAIC0zOTAsNyArMzkwLDcgQEAKICAgICAgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KICAgICAgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQogICAgICAgICAgICAgczhpID0gd2luZGxsLnNfcmV0XzhpX2Z1bmMoaW5wKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkqMiwgOCozLCA3KjQsIDYqNSwgNSo2LCA0KjcsIDMqOCwgMio5KSkKIAogICAgIGRlZiB0ZXN0X3NmMTY1MTIzNShzZWxmKToKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIDAKIAogICAgICAgICBjYWxsYmFjayA9IHByb3RvKGNhbGxiYWNrKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXJndW1lbnRFcnJvciwgbGFtYmRhOiBjYWxsYmFjaygoMSwgMiwgMywgNCksIFBPSU5UKCkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBsYW1iZGE6IGNhbGxiYWNrKCgxLCAyLCAzLCA0KSwgUE9JTlQoKSkpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weQppbmRleCBhZjlmNTA0Li4xZTAzZTlmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHkKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHAubmFtZSkKICAgICAgICAgICAgIHAgPSBwLm5leHRbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBbImZvbyIsICJiYXIiXSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbImZvbyIsICJiYXIiXSAqIDQpCiAKICAgICAgICAgIyB0byBub3QgbGVhayByZWZlcmVuY2VzLCB3ZSBtdXN0IGNsZWFuIF9wb2ludGVyX3R5cGVfY2FjaGUKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5CmluZGV4IDNkOWRjOTIuLjk1M2ExNDUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weQpAQCAtMjQsMTcgKzI0LDE3IEBACiAgICAgICAgICMgbWFrZSBzdXJlIHRoZSBvbmx5IGFjY2Vzc2luZyBhIG5lc3RlZCBzdHJ1Y3R1cmUKICAgICAgICAgIyBkb2Vzbid0IGNhbGwgdGhlIHN0cnVjdHVyZSdzIF9fbmV3X18gYW5kIF9faW5pdF9fCiAgICAgICAgIHkgPSBZKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHkueC5hLCB5LnguYiksICgwLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeS54Lm5ld193YXNfY2FsbGVkLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeS54LmEsIHkueC5iKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkueC5uZXdfd2FzX2NhbGxlZCwgRmFsc2UpCiAKICAgICAgICAgIyBCdXQgZXhwbGljaXRlbHkgY3JlYXRpbmcgYW4gWCBzdHJ1Y3R1cmUgY2FsbHMgX19uZXdfXyBhbmQgX19pbml0X18sIG9mIGNvdXJzZS4KICAgICAgICAgeCA9IFgoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5hLCB4LmIpLCAoOSwgMTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Lm5ld193YXNfY2FsbGVkLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiksICg5LCAxMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5uZXdfd2FzX2NhbGxlZCwgVHJ1ZSkKIAogICAgICAgICB5LnggPSB4Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh5LnguYSwgeS54LmIpLCAoOSwgMTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh5LngubmV3X3dhc19jYWxsZWQsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh5LnguYSwgeS54LmIpLCAoOSwgMTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkueC5uZXdfd2FzX2NhbGxlZCwgRmFsc2UpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkKaW5kZXggMDRiMjA0MC4uMDcwZGE0NiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weQpAQCAtMTgsMjIgKzE4LDIyIEBACiAiIiIKIAogY2xhc3MgT2JqZWN0c1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgZmFpbFVubGVzc1NhbWUoc2VsZiwgYSwgYik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGlkKGEpLCBpZChiKSkKKyAgICBkZWYgYXNzZXJ0VHJ1ZVNhbWUoc2VsZiwgYSwgYik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoYSksIGlkKGIpKQogCiAgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKICAgICAgICAgaSA9IDQyMDAwMTIzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdyYyhpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBncmMoaSkpCiAgICAgICAgIGNpID0gY19pbnQoaSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ3JjKGkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjaS5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBncmMoaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2kuX29iamVjdHMsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9jX2NoYXJfcChzZWxmKToKICAgICAgICAgcyA9ICJIZWxsbywgV29ybGQiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdyYyhzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBncmMocykpCiAgICAgICAgIGNzID0gY19jaGFyX3AocykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNCwgZ3JjKHMpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NTYW1lKGNzLl9vYmplY3RzLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGdyYyhzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlU2FtZShjcy5fb2JqZWN0cywgcykKIAogICAgIGRlZiB0ZXN0X3NpbXBsZV9zdHJ1Y3Qoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKQEAgLTQyLDEwICs0MiwxMCBAQAogICAgICAgICBhID0gNDIxMjM0CiAgICAgICAgIGIgPSA0MjEyMzUKICAgICAgICAgeCA9IFgoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCiAgICAgICAgIHguYSA9IGEKICAgICAgICAgeC5iID0gYgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9lbWJlZGRlZF9zdHJ1Y3RzKHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CkBAIC01NSwxMyArNTUsMTMgQEAKICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIFgpLCAoInkiLCBYKV0KIAogICAgICAgICB5ID0gWSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgTm9uZSkKIAogICAgICAgICB4MSwgeDIgPSBYKCksIFgoKQogICAgICAgICB5LngsIHkueSA9IHgxLCB4MgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh5Ll9vYmplY3RzLCB7IjAiOiB7fSwgIjEiOiB7fX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjoge30sICIxIjoge319KQogICAgICAgICB4MS5hLCB4Mi5iID0gNDIsIDkzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIHsiMCI6IHt9LCAiMSI6IHt9fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9vYmplY3RzLCB7IjAiOiB7fSwgIjEiOiB7fX0pCiAKICAgICBkZWYgdGVzdF94eHgoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKQEAgLTc2LDExICs3NiwxMSBAQAogICAgICAgICB4ID0gWCgpCiAgICAgICAgIHguYSA9IHMxCiAgICAgICAgIHguYiA9IHMyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguX29iamVjdHMsIHsiMCI6IHMxLCAiMSI6IHMyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCB7IjAiOiBzMSwgIjEiOiBzMn0pCiAKICAgICAgICAgeSA9IFkoKQogICAgICAgICB5LnggPSB4Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIHsiMCI6IHsiMCI6IHMxLCAiMSI6IHMyfX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjogeyIwIjogczEsICIxIjogczJ9fSkKICMjICAgICAgICB4ID0geS54CiAjIyAgICAgICAgZGVsIHkKICMjICAgICAgICBwcmludCB4Ll9iX2Jhc2VfLl9vYmplY3RzCkBAIC05MSw3ICs5MSw3IEBACiAKICAgICAgICAgQSA9IGNfaW50KjQKICAgICAgICAgYSA9IEEoMTEsIDIyLCAzMywgNDQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGEuX29iamVjdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fb2JqZWN0cywgTm9uZSkKIAogICAgICAgICB4ID0gWCgpCiAgICAgICAgIHguZGF0YSA9IGEKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKaW5kZXggODBiNmNhMi4uMDk1NWU3NiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBkZWYgdGVzdF9wX2NpbnQoc2VsZik6CiAgICAgICAgIGkgPSBjX2ludCg0MikKICAgICAgICAgeCA9IHBvaW50ZXIoaSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCiAKIGNsYXNzIERlbGV0ZVBvaW50ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIFhfdGVzdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5CmluZGV4IDhkNTlmOTAuLjNkYzQ2M2YgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weQpAQCAtOSw5ICs5LDkgQEAKICAgICBkZWYgdGVzdF9zcXJ0KHNlbGYpOgogICAgICAgICBsaWIubXlfc3FydC5hcmd0eXBlcyA9IGNfZG91YmxlLAogICAgICAgICBsaWIubXlfc3FydC5yZXN0eXBlID0gY19kb3VibGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliLm15X3NxcnQoNC4wKSwgMi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpYi5teV9zcXJ0KDQuMCksIDIuMCkKICAgICAgICAgaW1wb3J0IG1hdGgKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliLm15X3NxcnQoMi4wKSwgbWF0aC5zcXJ0KDIuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGliLm15X3NxcnQoMi4wKSwgbWF0aC5zcXJ0KDIuMCkpCiAKICAgICBkZWYgdGVzdF9xc29ydChzZWxmKToKICAgICAgICAgY29tcGFyZWZ1bmMgPSBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoY19jaGFyKSwgUE9JTlRFUihjX2NoYXIpKQpAQCAtMjMsNyArMjMsNyBAQAogCiAgICAgICAgIGNoYXJzID0gY3JlYXRlX3N0cmluZ19idWZmZXIoInNwYW0sIHNwYW0sIGFuZCBzcGFtIikKICAgICAgICAgbGliLm15X3Fzb3J0KGNoYXJzLCBsZW4oY2hhcnMpLTEsIHNpemVvZihjX2NoYXIpLCBjb21wYXJlZnVuYyhzb3J0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2hhcnMucmF3LCAiICAgLCxhYWFhZG1tbW5wcHBzc3NceDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFycy5yYXcsICIgICAsLGFhYWFkbW1tbnBwcHNzc1x4MDAiKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKaW5kZXggNzEyYjY1MC4uMjY2ODNkOCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CkBAIC00Myw3ICs0Myw3IEBACiAKICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKICAgICAgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYobGliY19uYW1lIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxpYmNfbmFtZSBpcyBOb25lKQogICAgICAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgicHJpbnRpbmciKToKICAgICAgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImtlcm5lbDMyIikKICAgICAgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoInVzZXIzMiIpCkBAIC03MCw5ICs3MCw5IEBACiAgICAgICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQogICAgICAgICAgICAgZl9vcmRfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX29yZCkudmFsdWUKICAgICAgICAgICAgIGZfbmFtZV9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfbmFtZSkudmFsdWUKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGhleChmX29yZF9hZGRyKSwgaGV4KGZfbmFtZV9hZGRyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGRsbC5fX2dldGl0ZW1fXywgMTIzNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBkbGwuX19nZXRpdGVtX18sIDEyMzQpCiAKICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgIGRlZiB0ZXN0XzE3MDMyODZfQShzZWxmKToKQEAgLTk0LDEzICs5NCwxMyBAQAogICAgICAgICAgICAgYWR2YXBpMzIgPSB3aW5kbGwuYWR2YXBpMzIKICAgICAgICAgICAgICMgQ2FsbGluZyBDbG9zZUV2ZW50TG9nIHdpdGggYSBOVUxMIGFyZ3VtZW50IHNob3VsZCBmYWlsLAogICAgICAgICAgICAgIyBidXQgdGhlIGNhbGwgc2hvdWxkIG5vdCBzZWdmYXVsdCBvciBzby4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGFkdmFwaTMyLkNsb3NlRXZlbnRMb2coTm9uZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGFkdmFwaTMyLkNsb3NlRXZlbnRMb2coTm9uZSkpCiAgICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5yZXN0eXBlID0gY192b2lkX3AKICAgICAgICAgICAgIHByb2MgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoYWR2YXBpMzIuX2hhbmRsZSwgIkNsb3NlRXZlbnRMb2ciKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByb2MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvYykKICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgcmVhbCB0ZXN0OiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgJ2NhbGxfZnVuY3Rpb24nCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQppbmRleCBmMmVlMDM1Li5lZGE4NDZkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaW5kX2xpYigncHRocmVhZCcpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX2xpYigncHRocmVhZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliJykKIAogICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9saWIoJ3onKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdC5zdGFydHN3aXRoKCcvdXNyL2xpYi9saWJ6LjEnKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXN1bHQuZW5kc3dpdGgoJy5keWxpYicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zdGFydHN3aXRoKCcvdXNyL2xpYi9saWJ6LjEnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuZW5kc3dpdGgoJy5keWxpYicpKQogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaW5kX2xpYignSU9LaXQnKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWIoJ0lPS2l0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSU9LaXQuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSU9LaXQnKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5CmluZGV4IGNiOTA5OWQuLmQwNzI2MDMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkKQEAgLTE5LDQ1ICsxOSw0NSBAQAogICAgICAgICBhID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMTAwMDAwMCkKICAgICAgICAgcCA9ICJIZWxsbywgV29ybGQiCiAgICAgICAgIHJlc3VsdCA9IG1lbW1vdmUoYSwgcCwgbGVuKHApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQocmVzdWx0KSwgIkhlbGxvLCBXb3JsZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChyZXN1bHQsIDUpLCAiSGVsbG8iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQocmVzdWx0LCAxNiksICJIZWxsbywgV29ybGRcMFwwXDBcMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChyZXN1bHQsIDApLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQocmVzdWx0KSwgIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgNSksICJIZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChyZXN1bHQsIDApLCAiIikKIAogICAgIGRlZiB0ZXN0X21lbXNldChzZWxmKToKICAgICAgICAgYSA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDEwMDAwMDApCiAgICAgICAgIHJlc3VsdCA9IG1lbXNldChhLCBvcmQoJ3gnKSwgMTYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGEudmFsdWUsICJ4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnZhbHVlLCAieHh4eHh4eHh4eHh4eHh4eCIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KHJlc3VsdCksICJ4eHh4eHh4eHh4eHh4eHh4IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KGEpLCAieHh4eHh4eHh4eHh4eHh4eCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChhLCAyMCksICJ4eHh4eHh4eHh4eHh4eHh4XDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChyZXN1bHQpLCAieHh4eHh4eHh4eHh4eHh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KGEpLCAieHh4eHh4eHh4eHh4eHh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KGEsIDIwKSwgInh4eHh4eHh4eHh4eHh4eHhcMFwwXDBcMCIpCiAKICAgICBkZWYgdGVzdF9jYXN0KHNlbGYpOgogICAgICAgICBhID0gKGNfdWJ5dGUgKiAzMikoKm1hcChvcmQsICJhYmNkZWYiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChhLCBjX2NoYXJfcCkudmFsdWUsICJhYmNkZWYiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjddLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgY19jaGFyX3ApLnZhbHVlLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzpdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzpdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs2Oi0xOi0xXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbNjotMTotMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAxMDIsIDEwMSwgMTAwLCA5OSwgOTgsIDk3XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChhLCBQT0lOVEVSKGNfYnl0ZSkpWzo3OjJdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk3LCA5OSwgMTAxLCAwXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChhLCBQT0lOVEVSKGNfYnl0ZSkpWzo3OjddLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6Nzo3XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk3XSkKIAogICAgIGRlZiB0ZXN0X3N0cmluZ19hdChzZWxmKToKICAgICAgICAgcyA9IHN0cmluZ19hdCgiZm9vIGJhciIpCiAgICAgICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgbWF5IGJlIHdyb25nLCBkZXBlbmRpbmcgb24gaG93IFB5dGhvbgogICAgICAgICAjIG1hbmFnZXMgc3RyaW5nIGluc3RhbmNlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgyLCBzeXMuZ2V0cmVmY291bnQocykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLCAiZm9vIGJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc3lzLmdldHJlZmNvdW50KHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocywgImZvbyBiYXIiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdCgiZm9vIGJhciIsIDgpLCAiZm9vIGJhclwwIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgMyksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdCgiZm9vIGJhciIsIDgpLCAiZm9vIGJhclwwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoImZvbyBiYXIiLCAzKSwgImZvbyIpCiAKICAgICB0cnk6CiAgICAgICAgIGNyZWF0ZV91bmljb2RlX2J1ZmZlcgpAQCAtNjgsMTIgKzY4LDEyIEBACiAgICAgICAgICAgICBwID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJIZWxsbywgV29ybGQiKQogICAgICAgICAgICAgYSA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDAwMDAwKQogICAgICAgICAgICAgcmVzdWx0ID0gbWVtbW92ZShhLCBwLCBsZW4ocCkgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdzdHJpbmdfYXQoYSksICJIZWxsbywgV29ybGQiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod3N0cmluZ19hdChhLCA1KSwgIkhlbGxvIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod3N0cmluZ19hdChhLCAwKSwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSksICJIZWxsbywgV29ybGQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDUpLCAiSGVsbG8iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDE2KSwgIkhlbGxvLCBXb3JsZFwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3N0cmluZ19hdChhLCAwKSwgIiIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weQppbmRleCBkZmQ4NGVlLi5iNTE4NWJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKQEAgLTU1LDI1ICs1NSwyNSBAQAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfaW5pdChzZWxmKToKICAgICAgICAgIyBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IHRvIHplcm8KICAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoKS52YWx1ZSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgpLnZhbHVlLCAwKQogCiAgICAgZGVmIHRlc3RfdW5zaWduZWRfdmFsdWVzKHNlbGYpOgogICAgICAgICAjIHRoZSB2YWx1ZSBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IgaXMgYXZhaWxhYmxlCiAgICAgICAgICMgYXMgdGhlICd2YWx1ZScgYXR0cmlidXRlCiAgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChsKS52YWx1ZSwgbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoaCkudmFsdWUsIGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQobCkudmFsdWUsIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoaCkudmFsdWUsIGgpCiAKICAgICBkZWYgdGVzdF9zaWduZWRfdmFsdWVzKHNlbGYpOgogICAgICAgICAjIHNlZSBhYm92ZQogICAgICAgICBmb3IgdCwgKGwsIGgpIGluIHppcChzaWduZWRfdHlwZXMsIHNpZ25lZF9yYW5nZXMpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChsKS52YWx1ZSwgbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoaCkudmFsdWUsIGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQobCkudmFsdWUsIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoaCkudmFsdWUsIGgpCiAKICAgICBkZWYgdGVzdF9ib29sX3ZhbHVlcyhzZWxmKToKICAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgdHJ1dGgKICAgICAgICAgZm9yIHQsIHYgaW4gemlwKGJvb2xfdHlwZXMsIGJvb2xfdmFsdWVzKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQodikudmFsdWUsIHRydXRoKHYpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KHYpLnZhbHVlLCB0cnV0aCh2KSkKIAogICAgIGRlZiB0ZXN0X3R5cGVlcnJvcihzZWxmKToKICAgICAgICAgIyBPbmx5IG51bWJlcnMgYXJlIGFsbG93ZWQgaW4gdGhlIGNvbnRydWN0b3IsCkBAIC05MywxMyArOTMsMTMgQEAKICAgICAgICAgIyB0aGUgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2QgYXR0cmlidXRlIGFsd2F5cwogICAgICAgICAjIHJldHVybnMgUHlDQXJnT2JqZWN0IGluc3RhbmNlcwogICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQXJnVHlwZSwgdHlwZSh0LmZyb21fcGFyYW0oMCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBcmdUeXBlLCB0eXBlKHQuZnJvbV9wYXJhbSgwKSkpCiAKICAgICBkZWYgdGVzdF9ieXJlZihzZWxmKToKICAgICAgICAgIyBjYWxsaW5nIGJ5cmVmIHJldHVybnMgYWxzbyBhIFB5Q0FyZ09iamVjdCBpbnN0YW5jZQogICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzICsgYm9vbF90eXBlczoKICAgICAgICAgICAgIHBhcm0gPSBieXJlZih0KCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChBcmdUeXBlLCB0eXBlKHBhcm0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBcmdUeXBlLCB0eXBlKHBhcm0pKQogCiAKICAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CkBAIC0xMTAsMTAgKzExMCwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAyLjAKICAgICAgICAgZiA9IEZsb2F0TGlrZSgpCiAgICAgICAgIGZvciB0IGluIGZsb2F0X3R5cGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodCgyLjApLnZhbHVlLCAyLjApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KDIpLnZhbHVlLCAyLjApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KDJMKS52YWx1ZSwgMi4wKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChmKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KDIuMCkudmFsdWUsIDIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgyKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KDJMKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGYpLnZhbHVlLCAyLjApCiAKICAgICBkZWYgdGVzdF9pbnRlZ2VycyhzZWxmKToKICAgICAgICAgY2xhc3MgRmxvYXRMaWtlKG9iamVjdCk6CkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIDMuMTQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIGYpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KGkpLnZhbHVlLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGkpLnZhbHVlLCAyKQogCiAgICAgZGVmIHRlc3Rfc2l6ZXMoc2VsZik6CiAgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXMgKyBib29sX3R5cGVzOgpAQCAtMTM4LDkgKzEzOCw5IEBACiAgICAgICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAjIHNpemVvZiBvZiB0aGUgdHlwZS4uLgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHQpLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YodCksIHNpemUpCiAgICAgICAgICAgICAjIGFuZCBzaXplb2Ygb2YgYW4gaW5zdGFuY2UKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih0KCkpLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YodCgpKSwgc2l6ZSkKIAogICAgIGRlZiB0ZXN0X2FsaWdubWVudHMoc2VsZik6CiAgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXM6CkBAIC0xNDgsMTAgKzE0OCwxMCBAQAogICAgICAgICAgICAgYWxpZ24gPSBzdHJ1Y3QuY2FsY3NpemUoImMlYyIgJSBjb2RlKSAtIHN0cnVjdC5jYWxjc2l6ZShjb2RlKQogCiAgICAgICAgICAgICAjIGFsaWdubWVudCBvZiB0aGUgdHlwZS4uLgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KSksCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjb2RlLCBhbGlnbm1lbnQodCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsIGFsaWduKSkKICAgICAgICAgICAgICMgYW5kIGFsaWdubWVudCBvZiBhbiBpbnN0YW5jZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KCkpKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlLCBhbGlnbikpCiAKICAgICBkZWYgdGVzdF9pbnRfZnJvbV9hZGRyZXNzKHNlbGYpOgpAQCAtMTY3LDEyICsxNjcsMTIgQEAKIAogICAgICAgICAgICAgIyB2IG5vdyBpcyBhbiBpbnRlZ2VyIGF0IGFuICdleHRlcm5hbCcgbWVtb3J5IGxvY2F0aW9uCiAgICAgICAgICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi52YWx1ZSwgYVswXSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodiksIHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodiksIHQpCiAKICAgICAgICAgICAgICMgY2hhbmdpbmcgdGhlIHZhbHVlIGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gY2hhbmdlcyB2J3MgdmFsdWUgYWxzbwogICAgICAgICAgICAgYVswXSA9IDQyCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQogCiAKICAgICBkZWYgdGVzdF9mbG9hdF9mcm9tX2FkZHJlc3Moc2VsZik6CkBAIC0xODAsMTEgKzE4MCwxMSBAQAogICAgICAgICBmb3IgdCBpbiBmbG9hdF90eXBlczoKICAgICAgICAgICAgIGEgPSBhcnJheSh0Ll90eXBlXywgWzMuMTRdKQogICAgICAgICAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyB0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgdCkKICAgICAgICAgICAgIGFbMF0gPSAyLjM0NTZlMTcKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyB0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgdCkKIAogICAgIGRlZiB0ZXN0X2NoYXJfZnJvbV9hZGRyZXNzKHNlbGYpOgogICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyCkBAIC0xOTIsMTEgKzE5MiwxMSBAQAogCiAgICAgICAgIGEgPSBhcnJheSgnYycsICd4JykKICAgICAgICAgdiA9IGNfY2hhci5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgY19jaGFyKQogCiAgICAgICAgIGFbMF0gPSAnPycKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQogCiAgICAgIyBhcnJheSBkb2VzIG5vdCBzdXBwb3J0IGNfYm9vbCAvICd0JwogICAgICMgZGVmIHRlc3RfYm9vbF9mcm9tX2FkZHJlc3Moc2VsZik6CkBAIC0yMDQsMTEgKzIwNCwxMSBAQAogICAgICMgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CiAgICAgIyAgICAgYSA9IGFycmF5KGNfYm9vbC5fdHlwZV8sIFtUcnVlXSkKICAgICAjICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQotICAgICMgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgIyAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2KSBpcyB0KQorICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodikgaXMgdCkKICAgICAjICAgICBhWzBdID0gRmFsc2UKLSAgICAjICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICMgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodikgaXMgdCkKKyAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHYpIGlzIHQpCiAKICAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgogICAgICAgICAjIGNfaW50KCkgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gUHl0aG9uJ3MgaW50LCBhbmQgY19pbnQuCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCAxYjdmMGRjLi42OWRiMTRmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTMzLDggKzMzLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiA0CiAgICAgICAgICAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChDVk9JRFAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChDQ0hBUlAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmNhYmNhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENWT0lEUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ0NIQVJQLmZyb21fcGFyYW0oImFiYyIpLCAiYWJjYWJjYWJjYWJjIikKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogMwogICAgICAgICAgICAgZnJvbV9wYXJhbSA9IGNsYXNzbWV0aG9kKGZyb21fcGFyYW0pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQ1dDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1dDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiYyIpCiAKICAgICAjIFhYWCBSZXBsYWNlIGJ5IGNfY2hhcl9wIHRlc3RzCiAgICAgZGVmIHRlc3RfY3N0cmluZ3Moc2VsZik6CkBAIC01NSwxMCArNTUsMTAgQEAKICAgICAgICAgIyBjX2NoYXJfcC5mcm9tX3BhcmFtIG9uIGEgUHl0aG9uIFN0cmluZyBwYWNrcyB0aGUgc3RyaW5nCiAgICAgICAgICMgaW50byBhIGNwYXJhbSBvYmplY3QKICAgICAgICAgcyA9ICIxMjMiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmogaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfY2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQogCiAgICAgICAgICMgbmV3IGluIDAuOS4xOiBjb252ZXJ0IChlbmNvZGUpIHVuaWNvZGUgdG8gYXNjaWkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19jaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpLl9vYmosICIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfY2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKS5fb2JqLCAiMTIzIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBjX2NoYXJfcC5mcm9tX3BhcmFtLCB1IjEyM1wzNzciKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19jaGFyX3AuZnJvbV9wYXJhbSwgNDIpCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgICMgY2FsbGluZyBjX2NoYXJfcC5mcm9tX3BhcmFtIHdpdGggYSBjX2NoYXJfcCBpbnN0YW5jZQogICAgICAgICAjIHJldHVybnMgdGhlIGFyZ3VtZW50IGl0c2VsZjoKICAgICAgICAgYSA9IGNfY2hhcl9wKCIxMjMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19jaGFyX3AuZnJvbV9wYXJhbShhKSBpcyBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyX3AuZnJvbV9wYXJhbShhKSBpcyBhKQogCiAgICAgZGVmIHRlc3RfY3dfc3RyaW5ncyhzZWxmKToKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmCkBAIC03NywxNSArNzcsMTUgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzID0gdSIxMjMiCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfd2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmogaXMgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3djaGFyX3AuZnJvbV9wYXJhbShzKS5fb2JqIGlzIHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd2NoYXJfcC5mcm9tX3BhcmFtLCA0MikKIAogICAgICAgICAgICAgIyBuZXcgaW4gMC45LjE6IGNvbnZlcnQgKGRlY29kZSkgYXNjaWkgdG8gdW5pY29kZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY193Y2hhcl9wLmZyb21fcGFyYW0oIjEyMyIpLl9vYmosIHUiMTIzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY193Y2hhcl9wLmZyb21fcGFyYW0oIjEyMyIpLl9vYmosIHUiMTIzIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjX3djaGFyX3AuZnJvbV9wYXJhbSwgIjEyM1wzNzciKQogCiAgICAgICAgIHBhID0gY193Y2hhcl9wLmZyb21fcGFyYW0oY193Y2hhcl9wKHUiMTIzIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocGEpLCBjX3djaGFyX3ApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwYSksIGNfd2NoYXJfcCkKIAogICAgIGRlZiB0ZXN0X2ludF9wb2ludGVycyhzZWxmKToKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgcG9pbnRlcgpAQCAtOTQsMTAgKzk0LDEwIEBACiAjIyAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoNDIpKQogIyMgICAgICAgIHggPSBMUElOVC5mcm9tX3BhcmFtKHApCiAgICAgICAgIHggPSBMUElOVC5mcm9tX3BhcmFtKHBvaW50ZXIoY19pbnQoNDIpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5jb250ZW50cy52YWx1ZSwgNDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExQSU5UKGNfaW50KDQyKSkuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExQSU5UKGNfaW50KDQyKSkuY29udGVudHMudmFsdWUsIDQyKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExQSU5ULmZyb21fcGFyYW0oTm9uZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTFBJTlQuZnJvbV9wYXJhbShOb25lKSwgMCkKIAogICAgICAgICBpZiBjX2ludCAhPSBjX2xvbmc6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIHBvaW50ZXIoY19sb25nKDQyKSkpCkBAIC0xMzMsOCArMTMzLDggQEAKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUgogICAgICAgICBJTlRBUlJBWSA9IGNfaW50ICogMwogICAgICAgICBpYSA9IElOVEFSUkFZKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGlhKSwgMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW2lhW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzAsIDAsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpYSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2lhW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzAsIDAsIDBdKQogCiAgICAgICAgICMgUG9pbnRlcnMgYXJlIG9ubHkgY29tcGF0aWJsZSB3aXRoIGFycmF5cyBjb250YWluaW5nIGl0ZW1zIG9mCiAgICAgICAgICMgdGhlIHNhbWUgdHlwZSEKQEAgLTE2MSw4ICsxNjEsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKE5vbmUpLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKG9iamVjdCgpKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMob2JqZWN0KCkpLCBOb25lKQogCiAgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKQEAgLTE3MSw3ICsxNzEsNyBAQAogICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCiAgICAgICAgICMgZG9uJ3Qga25vdyBob3cgdG8gY29udmVydCBwYXJhbWV0ZXIgMQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBvYmplY3QoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYyhjX3ZvaWRfcCg0MikpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKGNfdm9pZF9wKDQyKSksIDQyKQogCiAgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDRmZjJjM2UuLmEwMTViNzQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtNDUsMjAgKzQ1LDIwIEBACiAgICAgICAgICAgICBvYiA9IHRwKCkKICAgICAgICAgICAgIHYgPSBtZW1vcnl2aWV3KG9iKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG5vcm1hbGl6ZSh2LmZvcm1hdCksIG5vcm1hbGl6ZShmbXQpKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYuc2l6ZSwgc2l6ZW9mKG9iKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnNoYXBlLCBzaGFwZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm1hbGl6ZSh2LmZvcm1hdCksIG5vcm1hbGl6ZShmbXQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5zaXplLCBzaXplb2Yob2IpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5pdGVtc2l6ZSwgc2l6ZW9mKGl0ZW10cCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnNoYXBlLCBzaGFwZSkKICAgICAgICAgICAgICAgICAjIGN0eXBlcyBvYmplY3QgYWx3YXlzIGhhdmUgYSBub24tc3RyaWRlZCBtZW1vcnkgYmxvY2sKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnN0cmlkZXMsIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnN0cmlkZXMsIE5vbmUpCiAgICAgICAgICAgICAgICAgIyB0aGV5IGFyZSBhbHdheXMgcmVhZC93cml0ZQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHYucmVhZG9ubHkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2LnJlYWRvbmx5KQogCiAgICAgICAgICAgICAgICAgaWYgdi5zaGFwZToKICAgICAgICAgICAgICAgICAgICAgbiA9IDEKICAgICAgICAgICAgICAgICAgICAgZm9yIGRpbSBpbiB2LnNoYXBlOgogICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4gKiBkaW0KLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi5pdGVtc2l6ZSAqIG4sIHYuc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Lml0ZW1zaXplICogbiwgdi5zaXplKQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gc2VlIHRoZSBmYWlsaW5nIHR5cGUKICAgICAgICAgICAgICAgICBwcmludCh0cCkKQEAgLTY5LDIwICs2OSwyMCBAQAogICAgICAgICAgICAgb2IgPSB0cCgpCiAgICAgICAgICAgICB2ID0gbWVtb3J5dmlldyhvYikKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LmZvcm1hdCwgZm10KQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYuc2l6ZSwgc2l6ZW9mKG9iKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnNoYXBlLCBzaGFwZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuZm9ybWF0LCBmbXQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnNpemUsIHNpemVvZihvYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc2hhcGUsIHNoYXBlKQogICAgICAgICAgICAgICAgICMgY3R5cGVzIG9iamVjdCBhbHdheXMgaGF2ZSBhIG5vbi1zdHJpZGVkIG1lbW9yeSBibG9jawotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYuc3RyaWRlcywgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc3RyaWRlcywgTm9uZSkKICAgICAgICAgICAgICAgICAjIHRoZXkgYXJlIGFsd2F5cyByZWFkL3dyaXRlCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYodi5yZWFkb25seSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHYucmVhZG9ubHkpCiAKICAgICAgICAgICAgICAgICBpZiB2LnNoYXBlOgogICAgICAgICAgICAgICAgICAgICBuID0gMQogICAgICAgICAgICAgICAgICAgICBmb3IgZGltIGluIHYuc2hhcGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiAqIGRpbQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2Lml0ZW1zaXplICogbiwgdi5zaXplKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuaXRlbXNpemUgKiBuLCB2LnNpemUpCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlIGZhaWxpbmcgdHlwZQogICAgICAgICAgICAgICAgIHByaW50KHRwKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQppbmRleCAyODg2OGY0Li5kZWUyMDYwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQpAQCAtMjcsOCArMjcsOCBAQAogICAgICAgICAgICAgY19kb3VibGUoMy4xNCksCiAgICAgICAgICAgICBdOgogICAgICAgICAgICAgZHN0ID0gc2VsZi5sb2FkcyhzZWxmLmR1bXBzKHNyYykpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzcmMuX19kaWN0X18sIGRzdC5fX2RpY3RfXykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1ZmZlcihzcmMpWzpdLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmMuX19kaWN0X18sIGRzdC5fX2RpY3RfXykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmZmVyKHNyYylbOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIoZHN0KVs6XSkKIAogICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKQEAgLTM2LDE3ICszNiwxNyBAQAogCiAgICAgICAgIHggPSBYKCkKICAgICAgICAgeC5hID0gNDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5pbml0X2NhbGxlZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmluaXRfY2FsbGVkLCAxKQogCiAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHNlbGYuZHVtcHMoeCkpCiAKICAgICAgICAgIyBsb2FkcyBtdXN0IE5PVCBjYWxsIF9faW5pdF9fCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguaW5pdF9jYWxsZWQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5pbml0X2NhbGxlZCwgMSkKIAogICAgICAgICAjIGN0eXBlcyBpbnN0YW5jZXMgYXJlIGlkZW50aWNhbCB3aGVuIHRoZSBpbnN0YW5jZSBfX2RpY3RfXwogICAgICAgICAjIGFuZCB0aGUgbWVtb3J5IGJ1ZmZlciBhcmUgaWRlbnRpY2FsCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX19kaWN0X18sIHguX19kaWN0X18pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1ZmZlcih5KVs6XSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9fZGljdF9fLCB4Ll9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmZlcih5KVs6XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKHgpWzpdKQogCiAgICAgZGVmIHRlc3RfdW5waWNrYWJsZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKaW5kZXggMDc2Y2Q4Yi4uOTJiOGNlNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKQEAgLTE3LDcgKzE3LDcgQEAKIAogICAgICAgICBQT0lOVEVSKGNfdWxvbmcpKGNfdWxvbmcoMjIpKQogICAgICAgICAjIFBvaW50ZXIgY2FuJ3Qgc2V0IGNvbnRlbnRzOiBoYXMgbm8gX3R5cGVfCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIEEsIGNfdWxvbmcoMzMpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEEsIGNfdWxvbmcoMzMpKQogCiAgICAgZGVmIHRlc3RfcGFzc19wb2ludGVycyhzZWxmKToKICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCkBAIC0yNywxMiArMjcsMTIgQEAKICAgICAgICAgaSA9IGNfaW50KDEyMzQ1Njc4KQogIyMgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQogICAgICAgICBhZGRyZXNzID0gZnVuYyhieXJlZihpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19pbnQuZnJvbV9hZGRyZXNzKGFkZHJlc3MpLnZhbHVlLCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX2ludC5mcm9tX2FkZHJlc3MoYWRkcmVzcykudmFsdWUsIDEyMzQ1Njc4KQogCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCiAgICAgICAgIHJlcyA9IGZ1bmMocG9pbnRlcihpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLmNvbnRlbnRzLnZhbHVlLCAxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdLCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuY29udGVudHMudmFsdWUsIDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1swXSwgMTIzNDU2NzgpCiAKICAgICBkZWYgdGVzdF9jaGFuZ2VfcG9pbnRlcnMoc2VsZik6CiAgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQpAQCAtNDMsMTggKzQzLDE4IEBACiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQogCiAgICAgICAgIHJlcyA9IGZ1bmMocG9pbnRlcihpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdLCA4NzY1NCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLmNvbnRlbnRzLnZhbHVlLCA4NzY1NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF0sIDg3NjU0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5jb250ZW50cy52YWx1ZSwgODc2NTQpCiAKICAgICAgICAgIyBDIGNvZGU6ICpyZXMgPSA1NDM0NQogICAgICAgICByZXNbMF0gPSA1NDM0NQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpLnZhbHVlLCA1NDM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLnZhbHVlLCA1NDM0NSkKIAogICAgICAgICAjIEMgY29kZToKICAgICAgICAgIyAgIGludCB4ID0gMTIzMjE7CiAgICAgICAgICMgICByZXMgPSAmeAogICAgICAgICByZXMuY29udGVudHMgPSBjX2ludCgxMjMyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaS52YWx1ZSwgNTQzNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS52YWx1ZSwgNTQzNDUpCiAKICAgICBkZWYgdGVzdF9jYWxsYmFja3Nfd2l0aF9wb2ludGVycyhzZWxmKToKICAgICAgICAgIyBhIGZ1bmN0aW9uIHR5cGUgcmVjZWl2aW5nIGEgcG9pbnRlcgpAQCAtNzgsNyArNzgsNyBAQAogCiAjIyAgICAgICAgaSA9IGNfaW50KDQyKQogIyMgICAgICAgIGNhbGxiYWNrKGJ5cmVmKGkpKQotIyMgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpLnZhbHVlID09IDg0KQorIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpLnZhbHVlID09IDg0KQogCiAgICAgICAgIGRvaXQoY2FsbGJhY2spCiAjIyAgICAgICAgcHJpbnQgc2VsZi5yZXN1bHQKQEAgLTkxLDExICs5MSwxMSBAQAogICAgICAgICAgICAgaSA9IGN0KDQyKQogICAgICAgICAgICAgcCA9IHBvaW50ZXIoaSkKICMjICAgICAgICAgICAgcHJpbnQgdHlwZShwLmNvbnRlbnRzKSwgY3QKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHAuY29udGVudHMpIGlzIGN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocC5jb250ZW50cykgaXMgY3QpCiAgICAgICAgICAgICAjIHAuY29udGVudHMgaXMgdGhlIHNhbWUgYXMgcFswXQogIyMgICAgICAgICAgICBwcmludCBwLmNvbnRlbnRzCi0jIyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhwLmNvbnRlbnRzID09IDQyKQotIyMgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocFswXSA9PSA0MikKKyMjICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAuY29udGVudHMgPT0gNDIpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwWzBdID09IDQyKQogCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGl0ZW0sIHAsIDApCiAKQEAgLTExNyw5ICsxMTcsOSBAQAogCiAgICAgICAgIHB0ID0gcG9pbnRlcihUYWJsZSgxLCAyLCAzKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwdC5jb250ZW50cy5hLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwdC5jb250ZW50cy5iLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwdC5jb250ZW50cy5jLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB0LmNvbnRlbnRzLmEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHQuY29udGVudHMuYiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwdC5jb250ZW50cy5jLCAzKQogCiAgICAgICAgIHB0LmNvbnRlbnRzLmMgPSAzMwogCkBAIC0xMzAsOCArMTMwLDggQEAKICAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoNDIpKQogICAgICAgICAjIEFsdGhvdWdoIGEgcG9pbnRlciBjYW4gYmUgaW5kZXhlZCwgaXQgaGEgbm8gbGVuZ3RoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCBwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCiAKICAgICBkZWYgdGVzdF9jaGFycHAoc2VsZik6CiAgICAgICAgICIiIlRlc3QgdGhhdCBhIGNoYXJhY3RlciBwb2ludGVyLXRvLXBvaW50ZXIgaXMgY29ycmVjdGx5IHBhc3NlZCIiIgpAQCAtMTU2LDIwICsxNTYsMjAgQEAKICAgICAgICAgcHAgPSBwb2ludGVyKHApCiAgICAgICAgIHEgPSBwb2ludGVyKHkpCiAgICAgICAgIHBwWzBdID0gcSAgICAgICAgICMgPD09Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMF0sIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNikKICAgICBkZWYgdGVzdF9jX3ZvaWRfcChzZWxmKToKICAgICAgICAgIyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmFpZD0xNTE4MTkwJmdyb3VwX2lkPTU0NzAmYXRpZD0xMDU0NzAKICAgICAgICAgaWYgc2l6ZW9mKGNfdm9pZF9wKSA9PSA0OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCiAgICAgICAgIGVsaWYgc2l6ZW9mKGNfdm9pZF9wKSA9PSA4OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGTCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3ZvaWRfcCwgMy4xNCkgIyBtYWtlIHN1cmUgZmxvYXRzIGFyZSBOT1QgYWNjZXB0ZWQKQEAgLTE3NywxNiArMTc3LDE2IEBACiAKICAgICBkZWYgdGVzdF9wb2ludGVyc19ib29sKHNlbGYpOgogICAgICAgICAjIE5VTEwgcG9pbnRlcnMgaGF2ZSBhIGJvb2xlYW4gRmFsc2UgdmFsdWUsIG5vbi1OVUxMIHBvaW50ZXJzIFRydWUuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJvb2woUE9JTlRFUihjX2ludCkoKSksIEZhbHNlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChib29sKHBvaW50ZXIoY19pbnQoKSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woUE9JTlRFUihjX2ludCkoKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2wocG9pbnRlcihjX2ludCgpKSksIFRydWUpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYm9vbChDRlVOQ1RZUEUoTm9uZSkoMCkpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYm9vbChDRlVOQ1RZUEUoTm9uZSkoNDIpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKENGVU5DVFlQRShOb25lKSgwKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woQ0ZVTkNUWVBFKE5vbmUpKDQyKSksIFRydWUpCiAKICAgICAgICAgIyBDT00gbWV0aG9kcyBhcmUgYm9vbGVhbiBUcnVlOgogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICAgICAgIG10aCA9IFdJTkZVTkNUWVBFKE5vbmUpKDQyLCAibmFtZSIsICgpLCBOb25lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYm9vbChtdGgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKG10aCksIFRydWUpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQppbmRleCAzM2RlYWUzLi4wOWJhNjU1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKQEAgLTU4LDIzICs1OCwyMyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmdW5jKCkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZGV0YWlsczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cihkZXRhaWxzKSwgInJlcXVpcmVkIGFyZ3VtZW50ICdpbnB1dCcgbWlzc2luZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkZXRhaWxzKSwgInJlcXVpcmVkIGFyZ3VtZW50ICdpbnB1dCcgbWlzc2luZyIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBub3QgcmFpc2VkIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKE5vbmUpLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKGlucHV0PU5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhpbnB1dD1Ob25lKSwgTm9uZSkKIAogCiAgICAgZGVmIHRlc3RfaW50X3BvaW50ZXJfYXJnKHNlbGYpOgogICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfbG9uZwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBmdW5jKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGZ1bmMoMCkpCiAKICAgICAgICAgY2kgPSBjX2ludCgwKQogCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfaW50KSwKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocG9zaXRpdmVfYWRkcmVzcyhhZGRyZXNzb2YoY2kpKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpdGl2ZV9hZGRyZXNzKGFkZHJlc3NvZihjaSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9hZGRyZXNzKGZ1bmMoYnlyZWYoY2kpKSkpCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfY2hhcl9wLApAQCAtOTEsNDUgKzkxLDQ1IEBACiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfY2hhciksCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoIjEyMyIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKICAgICAgICAgY2EgPSBjX2NoYXIoImEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQogCiAgICAgZGVmIHRlc3RfY19jaGFyX3BfYXJnKHNlbGYpOgogICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX2NoYXJfcCwKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKE5vbmUpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoIjEyMyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfY2hhcl9wKCIxMjMiKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2J1ZmZlcigiMTIzIikpKQogICAgICAgICBjYSA9IGNfY2hhcigiYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCiAKICAgICBkZWYgdGVzdF9jX3ZvaWRfcF9hcmcoc2VsZik6CiAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKICAgICAgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX2NoYXJfcChOb25lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyhjX2J1ZmZlcigiMTIzIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCiAgICAgICAgIGNhID0gY19jaGFyKCJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKIAogICAgICAgICBmdW5jKGJ5cmVmKGNfaW50KCkpKQogICAgICAgICBmdW5jKHBvaW50ZXIoY19pbnQoKSkpCkBAIC0xNDAsOCArMTQwLDggQEAKICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKIAogICAgIGRlZiB0ZXN0X2luc3RhbmNlKHNlbGYpOgogICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCkBAIC0xNTEsMTAgKzE1MSwxMCBAQAogICAgICAgICAgICAgX2FzX3BhcmFtZXRlcl8gPSBOb25lCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKFgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhYKCkpKQogCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoWCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKFgoKSkpCiAKIHRyeToKICAgICBjX3djaGFyCkBAIC0xNzQsMTUgKzE3NCwxNSBAQAogICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY193Y2hhcl9wCiAgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiMTIzIiwgZnVuYyh1IjEyMyIpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKHUiMTIzIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodSIxMjMiLCBmdW5jKGNfd2J1ZmZlcih1IjEyMyIpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2J1ZmZlcih1IjEyMyIpKSkKICAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh1ImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKIAogICAgICAgICBkZWYgdGVzdF9jX3djaGFyX3BfYXJnKHNlbGYpOgogICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcApAQCAtMTkxLDE2ICsxOTEsMTYgQEAKIAogICAgICAgICAgICAgY193Y2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKQogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKE5vbmUpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmModSIxMjMiKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQogCiAgICAgICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY193YnVmZmVyKCIxMjMiKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2J1ZmZlcigiMTIzIikpKQogICAgICAgICAgICAgY2EgPSBjX3djaGFyKCJhIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCiAKIGNsYXNzIEFycmF5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Qoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weQppbmRleCAyNjVlZTU1Li42OTgxNzBmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUucmVzdHlwZSA9IHB5X29iamVjdAogICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZS5hcmd0eXBlcyA9IGNfY2hhcl9wLCBjX3B5X3NzaXplX3QKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiYWJjZGVmZ2hpIiwgMyksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCJhYmNkZWZnaGkiLCAzKSwgImFiYyIpCiAKICAgICBkZWYgdGVzdF9QeVN0cmluZ19Gcm9tU3RyaW5nKHNlbGYpOgogICAgICAgICBweXRob25hcGkuUHlTdHJpbmdfRnJvbVN0cmluZy5yZXN0eXBlID0gcHlfb2JqZWN0CkBAIC0zMiwxMCArMzIsMTAgQEAKICAgICAgICAgcyA9ICJhYmMiCiAgICAgICAgIHJlZmNudCA9IGdyYyhzKQogICAgICAgICBweW9iID0gcHl0aG9uYXBpLlB5U3RyaW5nX0Zyb21TdHJpbmcocykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWZjbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMsIHB5b2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcHlvYikKICAgICAgICAgZGVsIHB5b2IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWZjbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCiAKICAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJyZWZjb3VudCIpOgogICAgICAgICAjIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgY29kZSBpbgpAQCAtNDQsMjggKzQ0LDI4IEBACiAgICAgICAgIGRlZiB0ZXN0X1B5SW50X0xvbmcoc2VsZik6CiAgICAgICAgICAgICByZWY0MiA9IGdyYyg0MikKICAgICAgICAgICAgIHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZy5yZXN0eXBlID0gcHlfb2JqZWN0Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nKDQyKSwgNDIpCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyg0MiksIHJlZjQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKIAogICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5hcmd0eXBlcyA9IChweV9vYmplY3QsKQogICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCiAKICAgICAgICAgICAgIHJlcyA9IHB5dGhvbmFwaS5QeUludF9Bc0xvbmcoNDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQogICAgICAgICAgICAgZGVsIHJlcwotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKDQyKSwgcmVmNDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyg0MiksIHJlZjQyKQogCiAgICAgZGVmIHRlc3RfUHlPYmpfRnJvbVB0cihzZWxmKToKICAgICAgICAgcyA9ICJhYmMgZGVmIGdoaSBqa2wiCiAgICAgICAgIHJlZiA9IGdyYyhzKQogICAgICAgICAjIGlkKHB5dGhvbi1vYmplY3QpIGlzIHRoZSBhZGRyZXNzCiAgICAgICAgIHB5b2JqID0gUHlPYmpfRnJvbVB0cihpZChzKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMgaXMgcHlvYmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIGlzIHB5b2JqKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhzKSwgcmVmICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZiArIDEpCiAgICAgICAgIGRlbCBweW9iagotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocyksIHJlZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZikKIAogICAgIGRlZiB0ZXN0X1B5T1Nfc25wcmludGYoc2VsZik6CiAgICAgICAgIFB5T1Nfc25wcmludGYgPSBweXRob25hcGkuUHlPU19zbnByaW50ZgpAQCAtNzMsMTggKzczLDE4IEBACiAKICAgICAgICAgYnVmID0gY19idWZmZXIoMjU2KQogICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJIZWxsbyBmcm9tICVzIiwgImN0eXBlcyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvIGZyb20gY3R5cGVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbyBmcm9tIGN0eXBlcyIpCiAKICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiSGVsbG8gZnJvbSAlcyIsICJjdHlwZXMiLCAxLCAyLCAzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJIZWxsbyBmcm9tIGN0eXBlcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8gZnJvbSBjdHlwZXMiKQogCiAgICAgICAgICMgbm90IGVub3VnaCBhcmd1bWVudHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgUHlPU19zbnByaW50ZiwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFB5T1Nfc25wcmludGYsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X3B5b2JqZWN0X3JlcHIoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcHIocHlfb2JqZWN0KCkpLCAicHlfb2JqZWN0KDxOVUxMPikiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXByKHB5X29iamVjdCg0MikpLCAicHlfb2JqZWN0KDQyKSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcHIocHlfb2JqZWN0KG9iamVjdCkpLCAicHlfb2JqZWN0KCVyKSIgJSBvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3QoKSksICJweV9vYmplY3QoPE5VTEw+KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3QoNDIpKSwgInB5X29iamVjdCg0MikiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocHlfb2JqZWN0KG9iamVjdCkpLCAicHlfb2JqZWN0KCVyKSIgJSBvYmplY3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQppbmRleCAxODNiMWQ2Li5kZGI1OTdkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKQEAgLTIwLDcgKzIwLDcgQEAKICAgICAgICAgICAgIGhkbGwgPSB3aW5kbGwua2VybmVsMzIuTG9hZExpYnJhcnlBKCJrZXJuZWwzMiIpCiAgICAgICAgICAgICBmdW5jYWRkciA9IHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcyhoZGxsLCAiR2V0TW9kdWxlSGFuZGxlQSIpCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhbGxfZnVuY3Rpb24oZnVuY2FkZHIsIChOb25lLCkpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxsX2Z1bmN0aW9uKGZ1bmNhZGRyLCAoTm9uZSwpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKE5vbmUpKQogCiBjbGFzcyBDYWxsYmFja1RyYWNiYWNrVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNDksMjUgKzQ5LDI1IEBACiAgICAgZGVmIHRlc3RfVmFsdWVFcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZUVycm9yOiA0MiIpCiAKICAgICBkZWYgdGVzdF9JbnRlZ2VyRGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXVs6MTldLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIikKIAogICAgIGRlZiB0ZXN0X0Zsb2F0RGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfZG91YmxlKShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwLjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV1bOjE5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiKQogCiAgICAgZGVmIHRlc3RfVHlwZUVycm9yRGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfY2hhcl9wKShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAic3BhbSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZUVycm9yOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIC86ICdpbnQnIGFuZCAnc3RyJyIpCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQppbmRleCA0NDhmMjkyLi4zNWE4MWFhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5CkBAIC0yMSwxNyArMjEsMTcgQEAKICAgICAgICAgICAgICNwcmludCAiY2FsbGVkIGJhY2sgd2l0aCIsIHZhbHVlCiAgICAgICAgICAgICByZXR1cm4gdmFsdWUKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMoY2FsbGJhY2spLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhjYWxsYmFjayksIDIpCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGNhbGxiYWNrKSA+IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoY2FsbGJhY2spID4gMikKICAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKICAgICAgICAgY2IgPSBOb25lCiAKICAgICAgICAgZ2MuY29sbGVjdCgpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGNhbGxiYWNrKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoY2FsbGJhY2spLCAyKQogCiAKICAgICBkZWYgdGVzdF9yZWZjb3VudChzZWxmKToKQEAgLTM5LDE5ICszOSwxOSBAQAogICAgICAgICBkZWYgZnVuYygqYXJncyk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMgdGhpcyBpcyB0aGUgc3RhbmRhcmQgcmVmY291bnQgZm9yIGZ1bmMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGZ1bmMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhmdW5jKSwgMikKIAogICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CiAgICAgICAgIGYgPSBPdGhlckNhbGxiYWNrKGZ1bmMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPiAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKIAogICAgICAgICAjIGFuZCBtYXkgcmVsZWFzZSBpdCBhZ2FpbgogICAgICAgICBkZWwgZgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGZ1bmMpID49IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPj0gMikKIAogICAgICAgICAjIGJ1dCBub3cgaXQgbXVzdCBiZSBnb25lCiAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGZ1bmMpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPT0gMikKIAogICAgICAgICBjbGFzcyBYKGN0eXBlcy5TdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgT3RoZXJDYWxsYmFjayldCkBAIC01OSwyNyArNTksMjcgQEAKICAgICAgICAgeC5hID0gT3RoZXJDYWxsYmFjayhmdW5jKQogCiAgICAgICAgICMgdGhlIENGdW5jUHRyIGluc3RhbmNlIGhvbGRzIGF0ciBsZWFzdCBvbmUgcmVmY291bnQgb24gZnVuYzoKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGdyYyhmdW5jKSA+IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPiAyKQogCiAgICAgICAgICMgYW5kIG1heSByZWxlYXNlIGl0IGFnYWluCiAgICAgICAgIGRlbCB4Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPj0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyYyhmdW5jKSA+PSAyKQogCiAgICAgICAgICMgYW5kIG5vdyBpdCBtdXN0IGJlIGdvbmUgYWdhaW4KICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhmdW5jKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCiAKICAgICAgICAgZiA9IE90aGVyQ2FsbGJhY2soZnVuYykKIAogICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPiAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKIAogICAgICAgICAjIGNyZWF0ZSBhIGN5Y2xlCiAgICAgICAgIGYuY3ljbGUgPSBmCiAKICAgICAgICAgZGVsIGYKICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhmdW5jKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCiAKIGNsYXNzIEFub3RoZXJMZWFrKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jYWxsYmFjayhzZWxmKToKQEAgLTkyLDcgKzkyLDcgQEAKIAogICAgICAgICBhID0gc3lzLmdldHJlZmNvdW50KGN0eXBlcy5jX2ludCkKICAgICAgICAgZigxLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzeXMuZ2V0cmVmY291bnQoY3R5cGVzLmNfaW50KSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoY3R5cGVzLmNfaW50KSwgYSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5CmluZGV4IDlmZWYyMWYuLjk5Y2M1NTYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weQpAQCAtMTgsMTIgKzE4LDEyIEBACiAgICAgZGVmIHRlc3RfbnVtYmVycyhzZWxmKToKICAgICAgICAgZm9yIHR5cCBpbiBzdWJjbGFzc2VzOgogICAgICAgICAgICAgYmFzZSA9IHR5cC5fX2Jhc2VzX19bMF0KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKGJhc2UoNDIpKS5zdGFydHN3aXRoKGJhc2UuX19uYW1lX18pKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjxYIG9iamVjdCBhdCIsIHJlcHIodHlwKDQyKSlbOjEyXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGJhc2UoNDIpKS5zdGFydHN3aXRoKGJhc2UuX19uYW1lX18pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcih0eXAoNDIpKVs6MTJdKQogCiAgICAgZGVmIHRlc3RfY2hhcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImNfY2hhcigneCcpIiwgcmVwcihjX2NoYXIoJ3gnKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCI8WCBvYmplY3QgYXQiLCByZXByKFgoJ3gnKSlbOjEyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiY19jaGFyKCd4JykiLCByZXByKGNfY2hhcigneCcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcihYKCd4JykpWzoxMl0pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CmluZGV4IDg4ZGNjZjIuLmY3NjYxODkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CkBAIC0xMiw4ICsxMiw4IEBACiAgICAgICAgIGdldF9zdHJjaHIgPSBkbGwuZ2V0X3N0cmNocgogICAgICAgICBnZXRfc3RyY2hyLnJlc3R5cGUgPSBDRlVOQ1RZUEUoY19jaGFyX3AsIGNfY2hhcl9wLCBjX2NoYXIpCiAgICAgICAgIHN0cmNociA9IGdldF9zdHJjaHIoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBzdHJjaHIsICJhYmNkZWYiLCAzKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0cmNociwgImFiY2RlZiIpCiAKQEAgLTI2LDggKzI2LDggQEAKICAgICAgICAgIyBfQ0Z1bmNQdHIgaW5zdGFuY2VzIGFyZSBub3cgY2FsbGFibGUgd2l0aCBhbiBpbnRlZ2VyIGFyZ3VtZW50CiAgICAgICAgICMgd2hpY2ggZGVub3RlcyBhIGZ1bmN0aW9uIGFkZHJlc3M6CiAgICAgICAgIHN0cmNociA9IENGVU5DVFlQRShjX2NoYXJfcCwgY19jaGFyX3AsIGNfY2hhcikoYWRkcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmNocigiYWJjZGVmIiwgImIiKSwgImJjZGVmIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyY2hyKCJhYmNkZWYiLCAiYiIpLCAiYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCAiYWJjZGVmIiwgMykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsICJhYmNkZWYiKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weQppbmRleCA1NjcxY2NlLi4xYjczZmIzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHkKQEAgLTEyLDggKzEyLDggQEAKIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTXlJbnQoMyksIE15SW50KDMpKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKE15SW50KDQyKSwgTXlJbnQoNDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE15SW50KDMpLCBNeUludCgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChNeUludCg0MiksIE15SW50KDQzKSkKIAogICAgIGRlZiB0ZXN0X2lnbm9yZV9yZXR2YWwoc2VsZik6CiAgICAgICAgICMgVGVzdCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgY2FsbGJhY2sgaXMgaWdub3JlZApAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuICgxLCAiYWJjIiwgTm9uZSkKIAogICAgICAgICBjYiA9IHByb3RvKGZ1bmMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGNiKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgY2IoKSkKIAogCiAgICAgZGVmIHRlc3RfaW50X2NhbGxiYWNrKHNlbGYpOgpAQCAtMzQsMjQgKzM0LDI0IEBACiAKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoTm9uZSwgTXlJbnQpKGZ1bmMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgY2IoNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKGFyZ3NbLTFdKSwgTXlJbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgY2IoNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXJnc1stMV0pLCBNeUludCkKIAogICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpKGZ1bmMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGNiKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShhcmdzWy0xXSksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgY2IoNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXJnc1stMV0pLCBpbnQpCiAKICAgICBkZWYgdGVzdF9pbnRfc3RydWN0KHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBNeUludCldCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWCgpLngsIE15SW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpLngsIE15SW50KCkpCiAKICAgICAgICAgcyA9IFgoKQogICAgICAgICBzLnggPSBNeUludCg0MikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLngsIE15SW50KDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLngsIE15SW50KDQyKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKaW5kZXggMjA4YzAwZS4uMDUwOWNiYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKQEAgLTUsMjMgKzUsMjMgQEAKIAogY2xhc3MgU2l6ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfOChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMSwgc2l6ZW9mKGNfaW50OCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEsIHNpemVvZihjX3VpbnQ4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBzaXplb2YoY19pbnQ4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBzaXplb2YoY191aW50OCkpCiAKICAgICBkZWYgdGVzdF8xNihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMiwgc2l6ZW9mKGNfaW50MTYpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgyLCBzaXplb2YoY191aW50MTYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNpemVvZihjX2ludDE2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzaXplb2YoY191aW50MTYpKQogCiAgICAgZGVmIHRlc3RfMzIoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQsIHNpemVvZihjX2ludDMyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNCwgc2l6ZW9mKGNfdWludDMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzaXplb2YoY19pbnQzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2l6ZW9mKGNfdWludDMyKSkKIAogICAgIGRlZiB0ZXN0XzY0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg4LCBzaXplb2YoY19pbnQ2NCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCwgc2l6ZW9mKGNfaW50NjQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCiAKICAgICBkZWYgdGVzdF9zaXplX3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihjX3ZvaWRfcCksIHNpemVvZihjX3NpemVfdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNfdm9pZF9wKSwgc2l6ZW9mKGNfc2l6ZV90KSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CmluZGV4IDI1YmQ4MDEuLmE1NjMyZWMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQpAQCAtNyw0MyArNyw0MyBAQAogICAgIGRlZiB0ZXN0X2dldHNsaWNlX2NpbnQoc2VsZik6CiAgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCiAgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzA6Ml0sIGJbMDoyXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVswOjI6XSwgYlswOjI6XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGEpLCBsZW4oYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbNTo3XSwgYls1OjddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzU6NzpdLCBiWzU6NzpdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWy0xXSwgYlstMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOl0sIGJbOl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOjpdLCBiWzo6XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVsxMDo6LTFdLCBiWzEwOjotMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMzA6MjA6LTFdLCBiWzMwOjIwOi0xXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVs6MTI6Nl0sIGJbOjEyOjZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzI6Njo0XSwgYlsyOjY6NF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjJdLCBiWzA6Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjI6XSwgYlswOjI6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIGxlbihiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6N10sIGJbNTo3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6NzpdLCBiWzU6NzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTFdLCBiWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiWzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBiWzo6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwOjotMV0sIGJbMTA6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMwOjIwOi0xXSwgYlszMDoyMDotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6MTI6Nl0sIGJbOjEyOjZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMjo2OjRdLCBiWzI6Njo0XSkKIAogICAgICAgICBhWzA6NV0gPSByYW5nZSg1LCAxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVswOjVdLCByYW5nZSg1LCAxMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMDo1Ol0sIHJhbmdlKDUsIDEwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVs0OjotMV0sIHJhbmdlKDksIDQsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzA6NV0sIHJhbmdlKDUsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzA6NTpdLCByYW5nZSg1LCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs0OjotMV0sIHJhbmdlKDksIDQsIC0xKSkKIAogICAgIGRlZiB0ZXN0X3NldHNsaWNlX2NpbnQoc2VsZik6CiAgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCiAgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQogCiAgICAgICAgIGFbMzI6NDddID0gcmFuZ2UoMzIsIDQ3KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzMyOjQ3XSwgcmFuZ2UoMzIsIDQ3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMyOjQ3XSwgcmFuZ2UoMzIsIDQ3KSkKICAgICAgICAgYVszMjo0N10gPSByYW5nZSgxMzIsIDE0NykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVszMjo0NzpdLCByYW5nZSgxMzIsIDE0NykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszMjo0NzpdLCByYW5nZSgxMzIsIDE0NykpCiAgICAgICAgIGFbNDY6MzE6LTFdID0gcmFuZ2UoMjMyLCAyNDcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMzI6NDc6MV0sIHJhbmdlKDI0NiwgMjMxLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszMjo0NzoxXSwgcmFuZ2UoMjQ2LCAyMzEsIC0xKSkKIAogICAgICAgICBhWzMyOjQ3XSA9IHJhbmdlKDExMzIsIDExNDcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOl0sIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgYikKICAgICAgICAgYVszMjo0Nzo3XSA9IHJhbmdlKDMpCiAgICAgICAgIGJbMzI6NDc6N10gPSByYW5nZSgzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzpdLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOl0sIGIpCiAgICAgICAgIGFbMzM6Oi0zXSA9IHJhbmdlKDEyKQogICAgICAgICBiWzMzOjotM10gPSByYW5nZSgxMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVs6XSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiKQogCiAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHNldHNsaWNlLCBzZXRpdGVtCiAKQEAgLTY5LDEyICs2OSwxMiBAQAogICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfY2hhcikKICAgICAgICAgZGxsLm15X2ZyZWUucmVzdHlwZSA9IE5vbmUKICAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKV0sIHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6M10sIHNbOjNdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKTpdLCBzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTE6LTE6LTFdLCBzWzo6LTFdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbMDotMTotMV0sIHNbMDo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpXSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOjNdLCBzWzozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKTpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOjU6LTddLCBzWzo1Oi03XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMDotMTotMV0sIHNbMDo6LTFdKQogCiAgICAgICAgIGltcG9ydCBvcGVyYXRvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLApAQCAtOTQsOCArOTQsOCBAQAogCiAgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19ieXRlKQogICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpXSwgcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKTpdLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyldLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyk6XSwgcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQogICAgICAgICBkbGwubXlfZnJlZShyZXMpCiAKICAgICBkZWYgdGVzdF9jaGFyX3B0cl93aXRoX2ZyZWUoc2VsZik6CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgZGxsLm15X3N0cmR1cC5lcnJjaGVjayA9IGVycmNoZWNrCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZGVsIGRsbC5teV9zdHJkdXAuZXJyY2hlY2sKIApAQCAtMTI0LDExICsxMjQsMTEgQEAKICAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgogCiAgICAgICAgIHAgPSAoY19jaGFyICogMjcpKCpzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzpdLCBzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo6XSwgcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6Oi0xXSwgc1s6Oi0xXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs1OjotMl0sIHNbNTo6LTJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzI6NTotM10sIHNbMjo1Oi0zXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjotMV0sIHNbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs1OjotMl0sIHNbNTo6LTJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMjo1Oi0zXSwgc1syOjU6LTNdKQogCiAKICAgICB0cnk6CkBAIC0xNDQsMTAgKzE0NCwxMCBAQAogICAgICAgICAgICAgZGxsLm15X3djc2R1cC5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCiAgICAgICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQogICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyldLCBzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyk6XSwgcykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKV0sIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpOl0sIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTo1Oi03XSwgc1s6NTotN10pCiAKICAgICAgICAgICAgIGltcG9ydCBvcGVyYXRvcgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKQEAgLTE2NiwxMCArMTY2LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCiAgICAgICAgICAgICB0bXBsID0gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpLTE6XSwgdG1wbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1tsZW4ocyktMjotMTotMV0sIHRtcGxbOjotMV0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyktMTpdLCB0bXBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6LTE6LTFdLCB0bXBsWzo6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQogICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkKaW5kZXggNmVlNmFlMC4uYWJlZDU4YiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weQpAQCAtMTYsMTQgKzE2LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGF0dHIsIHguc3RyLCAiY29udGVudHMiKQogICAgICAgICBiID0gY19idWZmZXIoIkhlbGxvLCBXb3JsZCIpCiAgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhiKSwgMikKICAgICAgICAgeC5zdHIgPSBiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoYiksIDMpCiAKICAgICAgICAgIyBQT0lOVEVSKGNfY2hhcikgYW5kIFB5dGhvbiBzdHJpbmcgaXMgTk9UIGNvbXBhdGlibGUKICAgICAgICAgIyBQT0lOVEVSKGNfY2hhcikgYW5kIGNfYnVmZmVyKCkgaXMgY29tcGF0aWJsZQogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYikpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYltpXSwgeC5zdHJbaV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbaV0sIHguc3RyW2ldKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgeCwgInN0ciIsICJIZWxsbywgV29ybGQiKQogCkBAIC0zNCwxMSArMzQsMTEgQEAKIAogICAgICAgICAjIGNfY2hhcl9wIGFuZCBQeXRob24gc3RyaW5nIGlzIGNvbXBhdGlibGUKICAgICAgICAgIyBjX2NoYXJfcCBhbmQgY19idWZmZXIgaXMgTk9UIGNvbXBhdGlibGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zdHIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHIsIE5vbmUpCiAgICAgICAgIHguc3RyID0gIkhlbGxvLCBXb3JsZCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zdHIsICJIZWxsbywgV29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyLCAiSGVsbG8sIFdvcmxkIikKICAgICAgICAgYiA9IGNfYnVmZmVyKCJIZWxsbywgV29ybGQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCB4LCAic3RyIiwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCB4LCAic3RyIiwgYikKIAogCiAgICAgZGVmIHRlc3RfZnVuY3Rpb25zKHNlbGYpOgpAQCAtNDgsMTUgKzQ4LDE1IEBACiAgICAgICAgICMgY19jaGFyX3AgYW5kIFB5dGhvbiBzdHJpbmcgaXMgY29tcGF0aWJsZQogICAgICAgICAjIGNfY2hhcl9wIGFuZCBjX2J1ZmZlciBhcmUgbm93IGNvbXBhdGlibGUKICAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfY2hhcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZiIsICJjIiksICJjZGVmIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKGNfYnVmZmVyKCJhYmNkZWYiKSwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocihjX2J1ZmZlcigiYWJjZGVmIiksICJjIiksICJjZGVmIikKIAogICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgUHl0aG9uIHN0cmluZyBpcyBOT1QgY29tcGF0aWJsZQogICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgY19idWZmZXIoKSBpcyBjb21wYXRpYmxlCiAgICAgICAgIHN0cmNoci5hcmd0eXBlcyA9IFBPSU5URVIoY19jaGFyKSwgY19jaGFyCiAgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKCJhYmNkZWYiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoYnVmLCAiYyIpLCAiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocigiYWJjZGVmIiwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocihidWYsICJjIiksICJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZiIsICJjIiksICJjZGVmIikKIAogICAgICAgICAjIFhYWCBUaGVzZSBjYWxscyBhcmUgZGFuZ2Vyb3VzLCBiZWNhdXNlIHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICAjIHRvIHN0cmNociBpcyBubyBsb25nZXIgdmFsaWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHJldHVybnMhCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKCJhYmNkZWYiKQogICAgICAgICByID0gc3RyY2hyKGJ1ZiwgImMiKQogICAgICAgICB4ID0gclswXSwgclsxXSwgclsyXSwgclszXSwgcls0XQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LCAoImMiLCAiZCIsICJlIiwgImYiLCAiXDAwMCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsICgiYyIsICJkIiwgImUiLCAiZiIsICJcMDAwIikpCiAgICAgICAgIGRlbCBidWYKICAgICAgICAgIyB4MSB3aWxsIE5PVCBiZSB0aGUgc2FtZSBhcyB4LCB1c3VhbGx5OgogICAgICAgICB4MSA9IHJbMF0sIHJbMV0sIHJbMl0sIHJbM10sIHJbNF0KZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5CmluZGV4IDcyMjQ4ZTEuLmJjODAzZGIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQpAQCAtNiwyMCArNiwyMCBAQAogICAgICAgICBCVUYgPSBjX2NoYXIgKiA0CiAKICAgICAgICAgYnVmID0gQlVGKCJhIiwgImIiLCAiYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgImFiYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi5yYXcsICJhYmNcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJhYmNcMDAwIikKIAogICAgICAgICBidWYudmFsdWUgPSAiQUJDRCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCAiQUJDRCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi5yYXcsICJBQkNEIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJBQkNEIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYucmF3LCAiQUJDRCIpCiAKICAgICAgICAgYnVmLnZhbHVlID0gIngiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIngiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYucmF3LCAieFwwMDBDRCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnJhdywgInhcMDAwQ0QiKQogCiAgICAgICAgIGJ1ZlsxXSA9ICJaIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJ4WkNEIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnJhdywgInhaQ0QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgInhaQ0QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJ4WkNEIikKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsICJhYWFhYWFhYSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCA0MikKQEAgLTI4LDkgKzI4LDkgQEAKICAgICAgICAgYnVmID0gY19idWZmZXIoMzIpCiAKICAgICAgICAgYnVmLnZhbHVlID0gIkhlbGxvLCBXb3JsZCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbywgV29ybGQiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGJ1ZiwgInZhbHVlIiwgYnVmZmVyKCJIZWxsbywgV29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIGJ1ZmZlcigiSGVsbG8sIFdvcmxkIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBidWZmZXIoImFiYyIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBidWZmZXIoIngiICogMTAwKSkKIApAQCAtMzgsNyArMzgsNyBAQAogICAgICAgICBidWYgPSBjX2J1ZmZlcigzMikKIAogICAgICAgICBidWYucmF3ID0gYnVmZmVyKCJIZWxsbywgV29ybGQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJIZWxsbywgV29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBidWZmZXIoImFiYyIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBidWZmZXIoIngiICogMTAwKSkKIApAQCAtNjMsMTYgKzYzLDE2IEBACiAgICAgICAgICAgICBCVUYgPSBjX3djaGFyICogNAogCiAgICAgICAgICAgICBidWYgPSBCVUYodSJhIiwgdSJiIiwgdSJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgdSJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiYWJjIikKIAogICAgICAgICAgICAgYnVmLnZhbHVlID0gdSJBQkNEIgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCB1IkFCQ0QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiQUJDRCIpCiAKICAgICAgICAgICAgIGJ1Zi52YWx1ZSA9IHUieCIKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgdSJ4IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IngiKQogCiAgICAgICAgICAgICBidWZbMV0gPSB1IloiCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsIHUieFpDRCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4WkNEIikKIAogY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBYWF90ZXN0X2Jhc2ljX3N0cmluZ3Moc2VsZik6CkBAIC04MCwyNCArODAsMjQgQEAKIAogICAgICAgICAjIENhbm5vdCBjYWxsIGxlbiBvbiBhIGNfc3RyaW5nIGFueSBsb25nZXIKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIGNzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoY3MpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihjcyksIDcpCiAKICAgICAgICAgIyBUaGUgdmFsdWUgcHJvcGVydHkgaXMgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgdGVybWluYXRpbmcgTlVMLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjcy52YWx1ZSwgImFiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikudmFsdWUsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnZhbHVlLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWJjXDAwMGRlZiIpLnZhbHVlLCAiYWJjIikKIAogICAgICAgICAjIFRoZSByYXcgcHJvcGVydHkgaXMgdGhlIHRvdGFsIGJ1ZmZlciBjb250ZW50czoKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MucmF3LCAiYWJjZGVmXDAwMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikucmF3LCAiYWJjXDAwMGRlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgImFiY2RlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikucmF3LCAiYWJjXDAwMGRlZlwwMDAiKQogCiAgICAgICAgICMgV2UgY2FuIGNoYW5nZSB0aGUgdmFsdWU6CiAgICAgICAgIGNzLnZhbHVlID0gImFiIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjcy52YWx1ZSwgImFiIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MucmF3LCAiYWJcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCAiYWJcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCiAKICAgICAgICAgY3MucmF3ID0gIlhZIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjcy52YWx1ZSwgIlhZIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MucmF3LCAiWFlcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsICJYWSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCAiWFlcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3N0cmluZywgdSIxMjMiKQogCkBAIC0xMDgsMjQgKzEwOCwyNCBAQAogCiAgICAgICAgICMgTmV3IGluIHJlbGVhc2VzIGxhdGVyIHRoYW4gMC40LjA6CiAgICAgICAgICMgY19zdHJpbmcobnVtYmVyKSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvZiBzaXplIG51bWJlcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKGNfc3RyaW5nKDMyKS5yYXcpID09IDMyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNfc3RyaW5nKDMyKS5yYXcpID09IDMyKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3N0cmluZywgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfc3RyaW5nLCAwKQogCiAgICAgICAgICMgVGhlc2UgdGVzdHMgZmFpbCwgYmVjYXVzZSBpdCBpcyBubyBsb25nZXIgaW5pdGlhbGl6ZWQKLSMjICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoMikudmFsdWUgPT0gIiIpCi0jIyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKDIpLnJhdyA9PSAiXDAwMFwwMDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoMikucmF3Wy0xXSA9PSAiXDAwMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4oY19zdHJpbmcoMikucmF3KSA9PSAyKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS52YWx1ZSA9PSAiIikKKyMjICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoMikucmF3ID09ICJcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS5yYXdbLTFdID09ICJcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjX3N0cmluZygyKS5yYXcpID09IDIpCiAKICAgICBkZWYgWFhfdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3N0cmluZygiYWIiLCA0KS5yYXdbOjJdID09ICJhYiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSA9PSAiYWIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOi0xXSA9PSAiYmEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOjJdID09ICJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjJdID09ICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSA9PSAiYWIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOi0xXSA9PSAiYmEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOjJdID09ICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCiAKICAgICBkZWYgWFhfdGVzdF90b29sb25nKHNlbGYpOgogICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQpAQCAtMTU2LDIyICsxNTYsMjIgQEAKICAgICAgICAgICAgICMgWFhYIFRoaXMgYmVoYXZpb3VyIGlzIGFib3V0IHRvIGNoYW5nZToKICAgICAgICAgICAgICMgbGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbiBieXRlcy4KICAgICAgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzaXplb2YoY3MpID09IDE0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpemVvZihjcykgPT0gMTQpCiAKICAgICAgICAgICAgICMgVGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IHRlcm1pbmF0aW5nIE5VTC4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjcy52YWx1ZSA9PSB1ImFiY2RlZiIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy52YWx1ZSA9PSB1ImFiY2RlZiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSA9PSB1ImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKIAogICAgICAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY3MucmF3ID09IHUiYWJjZGVmXDAwMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnJhdyA9PSB1ImFiY1wwMDBkZWZcMDAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy5yYXcgPT0gdSJhYmNkZWZcMDAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikucmF3ID09IHUiYWJjXDAwMGRlZlwwMDAiKQogCiAgICAgICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgogICAgICAgICAgICAgY3MudmFsdWUgPSB1ImFiIgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzLnZhbHVlID09IHUiYWIiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzLnJhdyA9PSB1ImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnZhbHVlID09IHUiYWIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnJhdyA9PSB1ImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQogCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd3N0cmluZywgIjEyMyIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3dzdHJpbmcsIDApCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weQppbmRleCBlZjVmYjUwLi4yMmViM2IwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHkKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBkZWYgdGVzdF8xX0Eoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCAwKSAjIG5vdCBmaW5hbGl6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDApICMgbm90IGZpbmFsaXplZAogICAgICAgICBYLl9maWVsZHNfID0gW10gIyBmaW5hbGl6ZWQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCAwYzVhMzQ3Li4xNjhjM2NkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTEzLDMzICsxMywzMyBAQAogICAgICAgICBjbGFzcyBaKFgpOgogICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihaKSwgc2l6ZW9mKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChaLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFopLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFouX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGVsYXllZChzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCAwKQogICAgICAgICBYLl9maWVsZHNfID0gWygiYSIsIGNfaW50KV0KIAogICAgICAgICBjbGFzcyBZKFgpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWSksIHNpemVvZihYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWSksIHNpemVvZihYKSkKICAgICAgICAgWS5fZmllbGRzXyA9IFsoImIiLCBjX2ludCldCiAKICAgICAgICAgY2xhc3MgWihYKToKICAgICAgICAgICAgIHBhc3MKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihZKSwgc2l6ZW9mKGNfaW50KSoyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWiksIHNpemVvZihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl9maWVsZHNfLCBbKCJiIiwgY19pbnQpXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWi5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihZKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihaKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLl9maWVsZHNfLCBbKCJiIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChaLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKIAogY2xhc3MgU3RydWN0dXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGZvcm1hdHMgPSB7ImMiOiBjX2NoYXIsCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCB0cCldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNpemVvZihYKSwgY29kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3NpemUoImMlYzAlYyIgJSAoY29kZSwgY29kZSkpLCBjb2RlKSkKIAogICAgIGRlZiB0ZXN0X3VuaW9ucyhzZWxmKToKQEAgLTcwLDM5ICs3MCwzOSBAQAogICAgICAgICAgICAgY2xhc3MgWChVbmlvbik6CiAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCB0cCldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNpemVvZihYKSwgY29kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3NpemUoIiVjIiAlIChjb2RlKSksIGNvZGUpKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X2FsaWdubWVudChzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyICogMyldCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChYKSwgY2FsY3NpemUoInMiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBjYWxjc2l6ZSgiM3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWCksIGNhbGNzaXplKCJzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBjYWxjc2l6ZSgiM3MiKSkKIAogICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2NoYXIgKiAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWxpZ25tZW50KFkpLCBjYWxjc2l6ZSgiaSIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWSksIGNhbGNzaXplKCIzc2kiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWSksIGNhbGNzaXplKCJpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBjYWxjc2l6ZSgiM3NpIikpCiAKICAgICAgICAgY2xhc3MgU0koU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIFgpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgWSldCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWSksIGFsaWdubWVudChYKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihTSSksIGNhbGNzaXplKCIzczBpIDNzaSAwaSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWSksIGFsaWdubWVudChYKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFNJKSwgY2FsY3NpemUoIjNzMGkgM3NpIDBpIikpCiAKICAgICAgICAgY2xhc3MgSVMoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIFkpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhIiwgWCldCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWxpZ25tZW50KFNJKSwgbWF4KGFsaWdubWVudChYKSwgYWxpZ25tZW50KFkpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKElTKSwgY2FsY3NpemUoIjNzaSAzcyAwaSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWCksIGFsaWdubWVudChZKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKElTKSwgY2FsY3NpemUoIjNzaSAzcyAwaSIpKQogCiAgICAgICAgIGNsYXNzIFhYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFgpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhbGlnbm1lbnQoWFgpLCBhbGlnbm1lbnQoWCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYWCksIGNhbGNzaXplKCIzcyAzcyAwcyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChYWCksIGFsaWdubWVudChYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWFgpLCBjYWxjc2l6ZSgiM3MgM3MgMHMiKSkKIAogICAgIGRlZiB0ZXN0X2VtdHB5KHNlbGYpOgogICAgICAgICAjIEkgaGFkIHByb2JsZW1zIHdpdGggdGhlc2UKQEAgLTExNSwxNSArMTE1LDE1IEBACiAgICAgICAgICAgICBfZmllbGRzXyA9IFtdCiAKICAgICAgICAgIyBJcyB0aGlzIHJlYWxseSB0aGUgY29ycmVjdCBhbGlnbm1lbnQsIG9yIHNob3VsZCBpdCBiZSAwPwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYWxpZ25tZW50KFgpID09IGFsaWdubWVudChZKSA9PSAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2l6ZW9mKFgpID09IHNpemVvZihZKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxpZ25tZW50KFgpID09IGFsaWdubWVudChZKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l6ZW9mKFgpID09IHNpemVvZihZKSA9PSAwKQogCiAgICAgICAgIGNsYXNzIFhYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFgpXQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChYWCksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYWCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpZ25tZW50KFhYKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWFgpLCAwKQogCiAgICAgZGVmIHRlc3RfZmllbGRzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhlIG9mZnNldCBhbmQgc2l6ZSBhdHRyaWJ1dGVzIG9mIFN0cnVjdHVyZS9Vbm9pbiBmaWVsZHMuCkBAIC0xMzEsMTEgKzEzMSwxMSBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19jaGFyKV0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLngub2Zmc2V0LCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLnguc2l6ZSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueC5zaXplLCBzaXplb2YoY19pbnQpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5vZmZzZXQsIHNpemVvZihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19jaGFyKV0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLngub2Zmc2V0LCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLnguc2l6ZSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueC5zaXplLCBzaXplb2YoY19pbnQpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5vZmZzZXQsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnkub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCkBAIC0xNjQsMjIgKzE2NCwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZyldCiAgICAgICAgICAgICBfcGFja18gPSAxCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCA5KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmIub2Zmc2V0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCAxKQogCiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KICAgICAgICAgICAgIF9wYWNrXyA9IDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCAxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIDIpCiAKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQogICAgICAgICAgICAgX3BhY2tfID0gNAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIDEyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmIub2Zmc2V0LCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgNCkKIAogICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgIGxvbmdsb25nX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoInEiKQpAQCAtMTkwLDggKzE5MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KICAgICAgICAgICAgIF9wYWNrXyA9IDgKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIGxvbmdsb25nX2FsaWduICsgbG9uZ2xvbmdfc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgbWluKDgsIGxvbmdsb25nX2FsaWduKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIGxvbmdsb25nX2FsaWduICsgbG9uZ2xvbmdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCBtaW4oOCwgbG9uZ2xvbmdfYWxpZ24pKQogCiAKICAgICAgICAgZCA9IHsiX2ZpZWxkc18iOiBbKCJhIiwgImIiKSwKQEAgLTIwOSw5ICsyMDksOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBlcnNvbiwgIk5hbWUiLCAiSEkiKQogCiAgICAgICAgICMgc2hvcnQgZW5vdWdoCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvbigiMTIzNDUiLCA1KS5uYW1lLCAiMTIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlcnNvbigiMTIzNDUiLCA1KS5uYW1lLCAiMTIzNDUiKQogICAgICAgICAjIGV4YWN0IGZpdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQZXJzb24oIjEyMzQ1NiIsIDUpLm5hbWUsICIxMjM0NTYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlcnNvbigiMTIzNDU2IiwgNSkubmFtZSwgIjEyMzQ1NiIpCiAgICAgICAgICMgdG9vIGxvbmcKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgUGVyc29uLCAiMTIzNDU2NyIsIDUpCiAKQEAgLTIyOSwxMCArMjI5LDEwIEBACiAgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KICAgICAgICAgcHQgPSBQT0lOVCgxLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKIAogICAgICAgICBwdCA9IFBPSU5UKHk9MiwgeD0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKIAogICAgIGRlZiB0ZXN0X2ludmFsaWRfZmllbGRfdHlwZXMoc2VsZik6CiAgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CkBAIC0yNDQsMTQgKzI0NCwxNCBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQgKiA0KV0KIAogICAgICAgICAjIGNhbiB1c2UgdHVwbGUgdG8gaW5pdGlhbGl6ZSBhcnJheSAoYnV0IG5vdCBsaXN0ISkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzpdLCBbMSwgMiwgMCwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6Ol0sIFsxLCAyLCAwLCAwXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzo6LTFdLCBbMCwgMCwgMiwgMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6OjJdLCBbMSwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVsxOjU6Nl0sIFsyXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzY6NDotMV0sIFtdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChTb21lSW50cygoMSwgMiwgMywgNCkpLmFbOl0sIFsxLCAyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzo6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6XSwgWzEsIDIsIDAsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6Ol0sIFsxLCAyLCAwLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjotMV0sIFswLCAwLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjoyXSwgWzEsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVsxOjU6Nl0sIFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbNjo0Oi0xXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzpdLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzo6XSwgWzEsIDIsIDMsIDRdKQogICAgICAgICAjIHRvbyBsb25nCiAgICAgICAgICMgWFhYIFNob3VsZCByYWlzZSBWYWx1ZUVycm9yPywgbm90IFJ1bnRpbWVFcnJvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIFNvbWVJbnRzLCAoMSwgMiwgMywgNCwgNSkpCkBAIC0yNjksMTAgKzI2OSwxMCBAQAogCiAgICAgICAgIHAgPSBQZXJzb24oIlNvbWVvbmUiLCAoIjEyMzQiLCAiNTY3OCIpLCA1KQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLnBob25lLmFyZWFjb2RlLCAiMTIzNCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAucGhvbmUubnVtYmVyLCAiNTY3OCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuYWdlLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGhvbmUuYXJlYWNvZGUsICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBob25lLm51bWJlciwgIjU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYWdlLCA1KQogCiAgICAgZGVmIHRlc3Rfc3RydWN0dXJlc193aXRoX3djaGFyKHNlbGYpOgogICAgICAgICB0cnk6CkBAIC0yODUsMTIgKzI4NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCiAKICAgICAgICAgcCA9IFBlcnNvblcodSJTb21lb25lIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocC5uYW1lLCAiU29tZW9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uYW1lLCAiU29tZW9uZSIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAiKS5uYW1lLCB1IjEyMzQ1Njc4OTAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MDEiKS5uYW1lLCB1IjEyMzQ1Njc4OTAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MCIpLm5hbWUsIHUiMTIzNDU2Nzg5MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxIikubmFtZSwgdSIxMjM0NTY3ODkwMSIpCiAgICAgICAgICMgZXhhY3QgZml0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvblcodSIxMjM0NTY3ODkwMTIiKS5uYW1lLCB1IjEyMzQ1Njc4OTAxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxMiIpLm5hbWUsIHUiMTIzNDU2Nzg5MDEyIikKICAgICAgICAgI3RvbyBsb25nCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFBlcnNvblcsIHUiMTIzNDU2Nzg5MDEyMyIpCiAKQEAgLTMwNSwyNCArMzA1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImFnZSIsIGNfaW50KV0KIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKICAgICAgICAgIyBJbiBQeXRob24gMi41LCBFeGNlcHRpb24gaXMgYSBuZXctc3R5bGUgY2xhc3MsIGFuZCB0aGUgcmVwciBjaGFuZ2VkCiAgICAgICAgIGlmIGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8dHlwZSAnZXhjZXB0aW9ucy5UeXBlRXJyb3InPjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1zZywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGludCBmb3VuZCIpCiAKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCAiU29tZW9uZSIsICgiYSIsICJiIiwgImMiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2xzLCBSdW50aW1lRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xzLCBSdW50aW1lRXJyb3IpCiAgICAgICAgIGlmIGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8dHlwZSAnZXhjZXB0aW9ucy5UeXBlRXJyb3InPjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1zZywgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKQEAgLTMzNyw3ICszMzcsNyBAQAogIyMgICAgICAgICMgc2FtZSBhcyAnY2xhc3MgWChTdHJ1Y3R1cmUpOiBwYXNzJwogIyMgICAgICAgICMgZmFpbHMsIHNpbmNlIHdlIG5lZWQgZWl0aGVyIGEgX2ZpZWxkc18gb3IgYSBfYWJzdHJhY3RfIGF0dHJpYnV0ZQogIyMgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KG1ldGEsICJYIiwgKFN0cnVjdHVyZSwpLCB7fSkKLSMjICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY2xzLCBtc2cpLAorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNscywgbXNnKSwKICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXR0cmlidXRlRXJyb3IsICJjbGFzcyBtdXN0IGRlZmluZSBhICdfZmllbGRzXycgYXR0cmlidXRlIikpCiAKICAgICBkZWYgdGVzdF9hYnN0cmFjdF9jbGFzcyhzZWxmKToKQEAgLTM0NSwxNSArMzQ1LDE1IEBACiAgICAgICAgICAgICBfYWJzdHJhY3RfID0gInNvbWV0aGluZyIKICAgICAgICAgIyB0cnkgJ1goKScKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoZXZhbCwgIlgoKSIsIGxvY2FscygpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY2xzLCBtc2cpLCAoVHlwZUVycm9yLCAiYWJzdHJhY3QgY2xhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY2xzLCBtc2cpLCAoVHlwZUVycm9yLCAiYWJzdHJhY3QgY2xhc3MiKSkKIAogICAgIGRlZiB0ZXN0X21ldGhvZHMoc2VsZik6CiAjIyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogIyMgICAgICAgICAgICBfZmllbGRzXyA9IFtdCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJpbl9kbGwiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoImZyb21fYWRkcmVzcyIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJpbl9kbGwiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZyb21fYWRkcmVzcyIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKIAogY2xhc3MgUG9pbnRlck1lbWJlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICAgICMgV2UgY2FuIGFzc2lnbiBhcnJheXMgb2YgdGhlIGNvcnJlY3QgdHlwZQogICAgICAgICBzLmFycmF5ID0gKGNfaW50ICogMykoMSwgMiwgMykKICAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgWzEsIDIsIDNdKQogCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcmUgYnVncywgYnV0IGFyZSBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaXR0ZXN0cwogICAgICAgICAjIGFsc28gZGVzY3JpYmUgdGhlIGN1cnJlbnQgYmVoYXZpb3VyLgpAQCAtMzc3LDE0ICszNzcsMTQgQEAKICAgICAgICAgcy5hcnJheVswXSA9IDQyCiAKICAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIFs0MiwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFs0MiwgMiwgM10pCiAKICAgICAgICAgcy5hcnJheVswXSA9IDEKIAogIyMgICAgICAgIHMuYXJyYXlbMV0gPSA0MgogCiAgICAgICAgIGl0ZW1zID0gW3MuYXJyYXlbaV0gZm9yIGkgaW4gcmFuZ2UoMyldCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGl0ZW1zLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKIAogICAgIGRlZiB0ZXN0X25vbmVfdG9fcG9pbnRlcl9maWVsZHMoc2VsZik6CiAgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgICAgICBzID0gUygpCiAgICAgICAgIHMueCA9IDEyMzQ1Njc4CiAgICAgICAgIHMucCA9IE5vbmUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy54LCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLngsIDEyMzQ1Njc4KQogCiBjbGFzcyBUZXN0UmVjdXJzaXZlU3RydWN0dXJlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jb250YWluc19pdHNlbGYoc2VsZik6CkBAIC00MDQsNyArNDA0LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgUmVjdXJzaXZlLl9maWVsZHNfID0gWygibmV4dCIsIFJlY3Vyc2l2ZSldCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZGV0YWlsczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygiU3RydWN0dXJlIG9yIHVuaW9uIGNhbm5vdCBjb250YWluIGl0c2VsZiIgaW4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiU3RydWN0dXJlIG9yIHVuaW9uIGNhbm5vdCBjb250YWluIGl0c2VsZiIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKQpAQCAtNDIxLDcgKzQyMSw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIFNlY29uZC5fZmllbGRzXyA9IFsoImZpcnN0IiwgRmlyc3QpXQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGRldGFpbHM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoIl9maWVsZHNfIGlzIGZpbmFsIiBpbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfZmllbGRzXyBpcyBmaW5hbCIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkF0dHJpYnV0ZUVycm9yIG5vdCByYWlzZWQiKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQppbmRleCA4OTM0M2JhLi5iY2FjZmM4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQpAQCAtMjgsMTggKzI4LDE4IEBACiAgICAgZGVmIHRlc3RfbmF0aXZlKHNlbGYpOgogICAgICAgICBmb3IgdHlwIGluIHN0cnVjdHVyZXM6CiAjIyAgICAgICAgICAgIHByaW50IHR5cC52YWx1ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKICAgICAgICAgICAgIG8gPSB0eXAoKQogICAgICAgICAgICAgby52YWx1ZSA9IDQKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG8udmFsdWUsIDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8udmFsdWUsIDQpCiAKICAgICBkZWYgdGVzdF9zd2FwcGVkKHNlbGYpOgogICAgICAgICBmb3IgdHlwIGluIGJ5dGVzd2FwcGVkX3N0cnVjdHVyZXM6CiAjIyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHR5cC52YWx1ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKICAgICAgICAgICAgIG8gPSB0eXAoKQogICAgICAgICAgICAgby52YWx1ZSA9IDQKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG8udmFsdWUsIDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8udmFsdWUsIDQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCA4OGQwNzczLi42NTU3NDc5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTIzLDU1ICsyMyw1NSBAQAogICAgICAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgICMgbm8gY29udmVyc2lvbnMgdGFrZSBwbGFjZSB3aXRoIHVuaWNvZGUgYXJndW1lbnRzCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQogICAgICAgICAgICAgIyBzdHJpbmcgYXJncyBhcmUgY29udmVydGVkCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCB3Y3NsZW4sICJhYuQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIHdjc2xlbiwgImFi5CIpCiAKICAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFi5CIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYuQiKSwgMykKIAogICAgICAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCiAgICAgICAgICAgICAjIGlnbm9yZSBlcnJvciBtb2RlIHNraXBzIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKCLk9vzfIiksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCAwKQogCiAgICAgICAgIGRlZiB0ZXN0X2xhdGluMV9zdHJpY3Qoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgibGF0aW4tMSIsICJzdHJpY3QiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKCJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCLk9vzfIiksIDQpCiAKICAgICAgICAgZGVmIHRlc3RfYnVmZmVycyhzZWxmKToKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihidWYpLCAzKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCiAKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKICAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjotMV0sIHUiXDBcdUZGRkRcdUZGRkRcdUZGRkRiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjoyXSwgdSJhXHVGRkZEXHVGRkZEIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgdSJhXHVGRkZEXHVGRkZEIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKIAogICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCiAgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCiAgICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6XSwgdSJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjotMV0sIHUiXDBcMFwwXDBiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjoyXSwgdSJhXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgdSJcMFwwXDBcMGJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQogCiAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAogICAgIGZ1bmMgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLl90ZXN0ZnVuY19wX3AKQEAgLTg5LDQxICs4OSw0MSBAQAogCiAgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCBmdW5jLCB1ImFi5CIpCiAKICAgICAgICAgZGVmIHRlc3RfYXNjaWlfaWdub3JlKHNlbGYpOgogICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYyh1IuT2/N8iKSwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIiIpCiAKICAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKHUi5Pb83yIpLCAiPz8/PyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQogCiAgICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYnVmKSwgMysxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQogCiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCiAgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sICJhYj8/P1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sICJhYj8/P1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Oi0xXSwgIlwwPz8/YmEiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmWzo6Ml0sICJhPz8iKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmWzY6NTotMV0sICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYj8/P1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiPz8/XDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMD8/P2JhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sICJhPz8iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgIiIpCiAKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQogICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWLk9vwiKQogICAgICAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sICJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Oi0xXSwgIlwwXDBcMFwwYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiXDBcMFwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMFwwXDBcMGJhIikKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQppbmRleCA3YmEzZTIxLi40Y2JmZDRiIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CkBAIC0xMyw5ICsxMyw5IEBACiAgICAgICAgIGN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIGFuX2ludGVnZXIgPSBjX2ludC5pbl9kbGwoY3RkbGwsICJhbl9pbnRlZ2VyIikKICAgICAgICAgeCA9IGFuX2ludGVnZXIudmFsdWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeCwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBjdGRsbC5nZXRfYW5faW50ZWdlcigpKQogICAgICAgICBhbl9pbnRlZ2VyLnZhbHVlICo9IDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeCoyLCBjdGRsbC5nZXRfYW5faW50ZWdlcigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgqMiwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKIAogICAgIGRlZiB0ZXN0X3VuZGVmaW5lZChzZWxmKToKICAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKQEAgLTM0LDExICszNCwxMSBAQAogICAgICAgICAgICAgIyBkb2NzdHJpbmdzIGFyZSBhbHNvIHJlbW92ZWQgaW4gdGhlIGxhdHRlciBjYXNlLgogICAgICAgICAgICAgb3B0ID0gY19pbnQuaW5fZGxsKHB5ZGxsLCAiUHlfT3B0aW1pemVGbGFnIikudmFsdWUKICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDApCiAgICAgICAgICAgICBlbGlmIFZhbHVlc1Rlc3RDYXNlLl9fZG9jX18gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0LCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAxKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHQsIDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDIpCiAKICAgICAgICAgZGVmIHRlc3RfZnJvemVudGFibGUoc2VsZik6CiAgICAgICAgICAgICAjIFB5dGhvbiBleHBvcnRzIGEgUHlJbXBvcnRfRnJvemVuTW9kdWxlcyBzeW1ib2wuIFRoaXMgaXMgYQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTA0KSwgKCJfX3BoZWxsb19fIiwgLTEwNCksICgiX19waGVsbG9fXy5zcGFtIiwgMTA0KV0KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMDApLCAoIl9fcGhlbGxvX18iLCAtMTAwKSwgKCJfX3BoZWxsb19fLnNwYW0iLCAxMDApXQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQpCiAKICAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBfcG9pbnRlcl90eXBlX2NhY2hlCiAgICAgICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtzdHJ1Y3RfZnJvemVuXQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQppbmRleCAwNmQyMzIzLi5mNDA5NTAwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQpAQCAtNyw0NCArNyw0NCBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJpdGVtIiwgY19pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhcnJheSIsIGNfaW50ICogMSldCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiAyKQogICAgICAgICB4ID0gWCgpCiAgICAgICAgIHguaXRlbSA9IDQyCiAgICAgICAgIHguYXJyYXlbMF0gPSAxMDAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIHNpemVvZihjX2ludCkgKiAyKQogCiAgICAgICAgICMgbWFrZSByb29tIGZvciBvbmUgYWRkaXRpb25hbCBpdGVtCiAgICAgICAgIG5ld19zaXplID0gc2l6ZW9mKFgpICsgc2l6ZW9mKGNfaW50KSAqIDEKICAgICAgICAgcmVzaXplKHgsIG5ld19zaXplKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoeCksIG5ld19zaXplKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5pdGVtLCB4LmFycmF5WzBdKSwgKDQyLCAxMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKIAogICAgICAgICAjIG1ha2Ugcm9vbSBmb3IgMTAgYWRkaXRpb25hbCBpdGVtcwogICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiA5CiAgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIG5ld19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCiAKICAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KICAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQogICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeC5pdGVtLCB4LmFycmF5WzBdKSwgKDQyLCAxMDApKQogCiAgICAgZGVmIHRlc3RfYXJyYXlfaW52YWxpZF9sZW5ndGgoc2VsZik6CiAgICAgICAgICMgY2Fubm90IGNyZWF0ZSBhcnJheXMgd2l0aCBub24tcG9zaXRpdmUgc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBjX2ludCAqIC0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBjX2ludCAqIC0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogY19pbnQgKiAtMykKIAogICAgIGRlZiB0ZXN0X3plcm9zaXplZF9hcnJheShzZWxmKToKICAgICAgICAgYXJyYXkgPSAoY19pbnQgKiAwKSgpCiAgICAgICAgICMgYWNjZXNzaW5nIGVsZW1lbnRzIG9mIHplcm8tc2l6ZWQgYXJyYXlzIHJhaXNlIEluZGV4RXJyb3IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAwLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIC0xLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAxLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIC0xLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgLTEpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CmluZGV4IDUwNjdiNjAuLjVkZWRkOWYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CkBAIC0xOCw3ICsxOCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdykKIAogICAgICAgICAgICAgIyBUaGlzIG9uZSBzaG91bGQgc3VjY2VlZWQuLi4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIElzV2luZG93KDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBJc1dpbmRvdygwKSkKIAogICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzICg4IGJ5dGVzIGluIGV4Y2VzcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCAwLCAwLCAwKQpAQCAtNDksMTMgKzQ5LDEzIEBACiAgICAgY2xhc3MgVGVzdFdpbnR5cGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgZGVmIHRlc3RfSFdORChzZWxmKToKICAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcwotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkhXTkQpLCBzaXplb2YoY192b2lkX3ApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuSFdORCksIHNpemVvZihjX3ZvaWRfcCkpCiAKICAgICAgICAgZGVmIHRlc3RfUEFSQU0oc2VsZik6CiAgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih3aW50eXBlcy5XUEFSQU0pLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuV1BBUkFNKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2Yod2ludHlwZXMuTFBBUkFNKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkxQQVJBTSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY192b2lkX3ApKQogCiAgICAgICAgIGRlZiB0ZXN0X0NPTUVycm9yKHNlbGYpOgpAQCAtODQsNyArODQsNyBAQAogCiAgICAgICAgIHB0ID0gUE9JTlQoMTAsIDEwKQogICAgICAgICByZWN0ID0gUkVDVCgwLCAwLCAyMCwgMjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEsIGRsbC5Qb2ludEluUmVjdChieXJlZihyZWN0KSwgcHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGRsbC5Qb2ludEluUmVjdChieXJlZihyZWN0KSwgcHQpKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHkKaW5kZXggMjljZDI3MS4uOTFiYzRlMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5CkBAIC00Nyw3ICs0Nyw3IEBACiAKICAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhci5neicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyB0cnlpbmcgYW4gdW5jb21wcmVzc2VkIG9uZQogICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQpAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKICAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJwotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKIAogICAgIGRlZiBfdGFyaW5mbyhzZWxmLCBwYXRoKToKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHBhdGgpCkBAIC05Niw3ICs5Niw3IEBACiAKICAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhci5neicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyBub3cgY3JlYXRlIGFub3RoZXIgdGFyYmFsbCB1c2luZyBgdGFyYAogICAgICAgICB0YXJiYWxsMiA9IG9zLnBhdGguam9pbih0bXBkaXIsICdhcmNoaXZlMi50YXIuZ3onKQpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyh0YXJiYWxsMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsMikpCiAgICAgICAgICMgbGV0J3MgY29tcGFyZSBib3RoIHRhcmJhbGxzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuX3RhcmluZm8odGFyYmFsbCksIHNlbGYuX3RhcmluZm8odGFyYmFsbDIpKQogCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhcicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyBub3cgZm9yIGEgZHJ5X3J1bgogICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQogICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXInCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmluZF9leGVjdXRhYmxlKCdjb21wcmVzcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgY29tcHJlc3MgcHJvZ3JhbSBpcyByZXF1aXJlZCcpCkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhci5aJwotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHcud2FybmluZ3MpLCAxKQogCiAgICAgICAgICMgc2FtZSB0ZXN0IHdpdGggZHJ5X3J1bgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49VHJ1ZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih3Lndhcm5pbmdzKSwgMSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFpJUF9TVVBQT1JULCAnTmVlZCB6aXAgc3VwcG9ydCB0byBydW4nKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKaW5kZXggMmQ4NDAwNy4uYzI3MTU2NyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgIGNtZC5ydW4oKQogCiAgICAgICAgIGRpc3RfY3JlYXRlZCA9IG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZm9vLTAuMS0xLm5vYXJjaC5ycG0nIGluIGRpc3RfY3JlYXRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdmb28tMC4xLTEubm9hcmNoLnJwbScgaW4gZGlzdF9jcmVhdGVkKQogCiAgICAgZGVmIHRlc3Rfbm9fb3B0aW1pemVfZmxhZyhzZWxmKToKIApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIGNtZC5ydW4oKQogCiAgICAgICAgIGRpc3RfY3JlYXRlZCA9IG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZm9vLTAuMS0xLm5vYXJjaC5ycG0nIGluIGRpc3RfY3JlYXRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdmb28tMC4xLTEubm9hcmNoLnJwbScgaW4gZGlzdF9jcmVhdGVkKQogICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JywgJ2Zvby0wLjEtMS5ub2FyY2gucnBtJykpCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3Rfd2luaW5zdC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5CmluZGV4IGYyY2I0ZmQuLjliMWJhNmQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5CkBAIC0yMSw3ICsyMSw3IEBACiAgICAgICAgICMgYW5kIG1ha2Ugc3VyZSBpdCBmaW5kcyBpdCBhbmQgcmV0dXJucyBpdHMgY29udGVudAogICAgICAgICAjIG5vIG1hdHRlciB3aGF0IHBsYXRmb3JtIHdlIGhhdmUKICAgICAgICAgZXhlX2ZpbGUgPSBjbWQuZ2V0X2V4ZV9ieXRlcygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXhlX2ZpbGUpID4gMTApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXhlX2ZpbGUpID4gMTApCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZFdpbkluc3RUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKaW5kZXggNDdkODVjZC4uNTM2Y2Q2NyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgICBjbWQucnVuKCkKIAogICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdsaWJmb28uYScgaW4gb3MubGlzdGRpcihidWlsZF90ZW1wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdsaWJmb28uYScgaW4gb3MubGlzdGRpcihidWlsZF90ZW1wKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkQ0xpYlRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKaW5kZXggNWYyOGI3OS4uNDY3ZTkwZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CkBAIC03MywxNSArNzMsMTUgQEAKICAgICAgICAgaW1wb3J0IHh4CiAKICAgICAgICAgZm9yIGF0dHIgaW4gKCdlcnJvcicsICdmb28nLCAnbmV3JywgJ3JvaicpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoeHgsIGF0dHIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoeHgsIGF0dHIpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHh4LmZvbygyLCA1KSwgNykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeHguZm9vKDEzLDE1KSwgMjgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHh4Lm5ldygpLmRlbW8oKSwgTm9uZSkKICAgICAgICAgZG9jID0gJ1RoaXMgaXMgYSB0ZW1wbGF0ZSBtb2R1bGUganVzdCBmb3IgaW5zdHJ1Y3Rpb24uJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4eC5fX2RvY19fLCBkb2MpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHh4Lk51bGwoKSwgeHguTnVsbCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHh4LlN0cigpLCB4eC5TdHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4eC5OdWxsKCksIHh4Lk51bGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4eC5TdHIoKSwgeHguU3RyKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgIyBHZXQgZXZlcnl0aGluZyBiYWNrIHRvIG5vcm1hbApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydQeV9FTkFCTEVfU0hBUkVEJ10gPSBvbGRfdmFyCiAKICAgICAgICAgIyBtYWtlIHN1cmUgd2UgZ2V0IHNvbWUgbGlicmFyeSBkaXJzIHVuZGVyIHNvbGFyaXMKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihjbWQubGlicmFyeV9kaXJzKSA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY21kLmxpYnJhcnlfZGlycykgPiAwKQogCiAgICAgZGVmIHRlc3RfdXNlcl9zaXRlKHNlbGYpOgogICAgICAgICAjIHNpdGUuVVNFUl9TSVRFIHdhcyBpbnRyb2R1Y2VkIGluIDIuNgpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgICMgbWFraW5nIHN1cmUgdGhlIHVzZXIgb3B0aW9uIGlzIHRoZXJlCiAgICAgICAgIG9wdGlvbnMgPSBbbmFtZSBmb3IgbmFtZSwgc2hvcnQsIGxhYmxlIGluCiAgICAgICAgICAgICAgICAgICAgY21kLnVzZXJfb3B0aW9uc10KLSAgICAgICAgc2VsZi5hc3NlcnRfKCd1c2VyJyBpbiBvcHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3VzZXInIGluIG9wdGlvbnMpCiAKICAgICAgICAgIyBzZXR0aW5nIGEgdmFsdWUKICAgICAgICAgY21kLnVzZXIgPSAxCkBAIC0xNDQsOSArMTQ0LDkgQEAKIAogICAgICAgICAjIHNlZSBpZiBpbmNsdWRlX2RpcnMgYW5kIGxpYnJhcnlfZGlycwogICAgICAgICAjIHdlcmUgc2V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhsaWIgaW4gY21kLmxpYnJhcnlfZGlycykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxpYiBpbiBjbWQucnBhdGgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpbmNsIGluIGNtZC5pbmNsdWRlX2RpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaWIgaW4gY21kLmxpYnJhcnlfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpYiBpbiBjbWQucnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbmNsIGluIGNtZC5pbmNsdWRlX2RpcnMpCiAKICAgICBkZWYgdGVzdF9vcHRpb25hbF9leHRlbnNpb24oc2VsZik6CiAKQEAgLTE3NSwxMCArMTc1LDEwIEBACiAKICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwogICAgICAgICBweV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHB5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKIAogICAgICAgICBwbGF0X3B5X2luY2x1ZGUgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0xKQotICAgICAgICBzZWxmLmFzc2VydF8ocGxhdF9weV9pbmNsdWRlIGluIGNtZC5pbmNsdWRlX2RpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbGF0X3B5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKIAogICAgICAgICAjIG1ha2Ugc3VyZSBjbWQubGlicmFyaWVzIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAogICAgICAgICAjIGlmIGl0J3MgYSBzdHJpbmcKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9ICdteV9saWJfZGlyJwogICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnbXlfbGliX2RpcicgaW4gY21kLmxpYnJhcnlfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdteV9saWJfZGlyJyBpbiBjbWQubGlicmFyeV9kaXJzKQogCiAgICAgICAgICMgbWFrZSBzdXJlIHJwYXRoIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAogICAgICAgICAjIGlmIGl0J3MgYSBsaXN0IG9mIG9zLnBhdGhzZXAncyBwYXRocwpAQCAtMjU3LDEzICsyNTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWUnOiAnYmFyJ30pXQogICAgICAgICBjbWQuY2hlY2tfZXh0ZW5zaW9uc19saXN0KGV4dHMpCiAgICAgICAgIGV4dCA9IGV4dHNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShleHQsIEV4dGVuc2lvbikpCiAKICAgICAgICAgIyBjaGVja19leHRlbnNpb25zX2xpc3QgYWRkcyBpbiBleHQgdGhlIHZhbHVlcyBwYXNzZWQKICAgICAgICAgIyB3aGVuIHRoZXkgYXJlIGluICgnaW5jbHVkZV9kaXJzJywgJ2xpYnJhcnlfZGlycycsICdsaWJyYXJpZXMnCiAgICAgICAgICMgJ2V4dHJhX29iamVjdHMnLCAnZXh0cmFfY29tcGlsZV9hcmdzJywgJ2V4dHJhX2xpbmtfYXJncycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4dC5saWJyYXJpZXMsICdmb28nKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIoZXh0LCAnc29tZScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoZXh0LCAnc29tZScpKQogCiAgICAgICAgICMgJ21hY3JvcycgZWxlbWVudCBvZiBidWlsZCBpbmZvIGRpY3QgbXVzdCBiZSAxLSBvciAyLXR1cGxlCiAgICAgICAgIGV4dHMgPSBbKCdmb28uYmFyJywgeydzb3VyY2VzJzogWycnXSwgJ2xpYnJhcmllcyc6ICdmb28nLApAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgICAgICAgICBzb19maWxlID0gY21kLmdldF9vdXRwdXRzKClbMF0KICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF93ZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNvX2ZpbGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc29fZmlsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9zLnBhdGguc3BsaXRleHQoc29fZmlsZSlbLTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPJykpCiAgICAgICAgIHNvX2RpciA9IG9zLnBhdGguZGlybmFtZShzb19maWxlKQpAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgICAgIGNtZC5pbnBsYWNlID0gMAogICAgICAgICBjbWQucnVuKCkKICAgICAgICAgc29fZmlsZSA9IGNtZC5nZXRfb3V0cHV0cygpWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzb19maWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNvX2ZpbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvcy5wYXRoLnNwbGl0ZXh0KHNvX2ZpbGUpWy0xXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdTTycpKQogICAgICAgICBzb19kaXIgPSBvcy5wYXRoLmRpcm5hbWUoc29fZmlsZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQppbmRleCA1NGE0ZWQ4Li5jODE1ZDgxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5CkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMykKICAgICAgICAgcGtnZGVzdCA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgInBrZyIpCiAgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihwa2dkZXN0KQotICAgICAgICBzZWxmLmFzc2VydF8oIl9faW5pdF9fLnB5IiBpbiBmaWxlcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX2luaXRfXy5weWMiIGluIGZpbGVzKQotICAgICAgICBzZWxmLmFzc2VydF8oIlJFQURNRS50eHQiIGluIGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9faW5pdF9fLnB5IiBpbiBmaWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfX2luaXRfXy5weWMiIGluIGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlJFQURNRS50eHQiIGluIGZpbGVzKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfcGFja2FnZV9kaXIgKHNlbGYpOgogICAgICAgICAjIFNlZSBTRiAxNjY4NTk2LzE3MjA4OTcuCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CmluZGV4IGI1NWViNTguLmIxZDJkMDcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CkBAIC0xNiwxMiArMTYsMTIgQEAKIAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfc2V0dGluZ3Moc2VsZik6CiAgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2J1aWxkX3NjcmlwdHNfY21kKCIvZm9vL2JhciIsIFtdKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNtZC5mb3JjZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtZC5idWlsZF9kaXIgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfZGlyIGlzIE5vbmUpCiAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuZm9yY2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX2RpciwgIi9mb28vYmFyIikKIAogICAgIGRlZiB0ZXN0X2J1aWxkKHNlbGYpOgpAQCAtMzcsNyArMzcsNyBAQAogCiAgICAgICAgIGJ1aWx0ID0gb3MubGlzdGRpcih0YXJnZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgaW4gYnVpbHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobmFtZSBpbiBidWlsdCkKIAogICAgIGRlZiBnZXRfYnVpbGRfc2NyaXB0c19jbWQoc2VsZiwgdGFyZ2V0LCBzY3JpcHRzKToKICAgICAgICAgaW1wb3J0IHN5cwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKICAgICAgICAgYnVpbHQgPSBvcy5saXN0ZGlyKHRhcmdldCkKICAgICAgICAgZm9yIG5hbWUgaW4gZXhwZWN0ZWQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obmFtZSBpbiBidWlsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIGJ1aWx0KQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRTY3JpcHRzVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKaW5kZXggMzAyNjAzMi4uZGJjNGVlMiAxMDA3NTUKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQpAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgICAgICMgbWFrZSBzdXJlIHRoZSBmaWxlcyB3aGVyZSByZW1vdmVkCiAgICAgICAgIGZvciBuYW1lLCBwYXRoIGluIGRpcnM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHBhdGgpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMgd2FzIG5vdCByZW1vdmVkJyAlIHBhdGgpCiAKICAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQgYWdhaW4gKHNob3VsZCBzcGl0IHdhcm5pbmdzIGJ1dCBzdWNlZWQpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weQppbmRleCA4ZjJiMzZmLi5kNjQzOGI1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbWQucHkKQEAgLTcwLDcgKzcwLDcgQEAKIAogICAgICAgICBjbWQub3B0aW9uMiA9IE5vbmUKICAgICAgICAgY21kLmVuc3VyZV9zdHJpbmcoJ29wdGlvbjInLCAneHh4JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoY21kLCAnb3B0aW9uMicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihjbWQsICdvcHRpb24yJykpCiAKICAgICAgICAgY21kLm9wdGlvbjMgPSAxCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZW5zdXJlX3N0cmluZywgJ29wdGlvbjMnKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKaW5kZXggZmQ3NzhkMS4uNjk0NzI3NSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CkBAIC0xMDUsOSArMTA1LDkgQEAKICAgICBkZWYgdGVzdF9zZXJ2ZXJfZW1wdHlfcmVnaXN0cmF0aW9uKHNlbGYpOgogICAgICAgICBjbWQgPSBzZWxmLl9jbWQoc2VsZi5kaXN0KQogICAgICAgICByYyA9IGNtZC5fZ2V0X3JjX2ZpbGUoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHJjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhyYykpCiAgICAgICAgIGNtZC5fc3RvcmVfcHlwaXJjKCd0YXJlaycsICd4eHgnKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMocmMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocmMpKQogICAgICAgICBjb250ZW50ID0gb3BlbihyYykucmVhZCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIFdBTlRFRCkKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZ19jbWQucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQppbmRleCBiYWNmMTNhLi5lZjJlN2JjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQpAQCAtNzMsMTQgKzczLDE0IEBACiAgICAgICAgIHNlbGYud3JpdGVfZmlsZShmMiwgJ3h4eCcpCiAKICAgICAgICAgZm9yIGYgaW4gKGYxLCBmMik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoZikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZikpCiAKICAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQogICAgICAgICBjbWQgPSBjb25maWcoZGlzdCkKICAgICAgICAgY21kLl9jbGVhbihmMSwgZjIpCiAKICAgICAgICAgZm9yIGYgaW4gKGYxLCBmMik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKGYpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKENvbmZpZ1Rlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpc3QucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQppbmRleCA3Y2NkZDUzLi4wN2YzOTJjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQpAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbImRpc3R1dGlscy5jb21tYW5kIiwgImZvby5iYXIiLCAiZGlzdHV0aWxzLnRlc3RzIl0pCiAgICAgICAgIGNtZCA9IGQuZ2V0X2NvbW1hbmRfb2JqKCJ0ZXN0X2Rpc3QiKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjbWQsIHRlc3RfZGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGNtZCwgdGVzdF9kaXN0KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuc2FtcGxlX29wdGlvbiwgInNvbWV0ZXh0IikKIAogICAgIGRlZiB0ZXN0X2NvbW1hbmRfcGFja2FnZXNfY29uZmlnZmlsZShzZWxmKToKQEAgLTIwNCwxMCArMjA0LDEwIEBACiAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCJ9CiAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnMpCiAgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQotICAgICAgICBzZWxmLmFzc2VydF8oIk1ldGFkYXRhLVZlcnNpb246IDEuMCIgaW4gbWV0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJwcm92aWRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygicmVxdWlyZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQotICAgICAgICBzZWxmLmFzc2VydF8oIm9ic29sZXRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiTWV0YWRhdGEtVmVyc2lvbjogMS4wIiBpbiBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInByb3ZpZGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJyZXF1aXJlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgib2Jzb2xldGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKIAogICAgIGRlZiB0ZXN0X3Byb3ZpZGVzKHNlbGYpOgogICAgICAgICBhdHRycyA9IHsibmFtZSI6ICJwYWNrYWdlIiwKQEAgLTIxOSw5ICsyMTksOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X3Byb3ZpZGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyJwYWNrYWdlIiwgInBhY2thZ2Uuc3ViIl0pCiAgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQotICAgICAgICBzZWxmLmFzc2VydF8oIk1ldGFkYXRhLVZlcnNpb246IDEuMSIgaW4gbWV0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJyZXF1aXJlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygib2Jzb2xldGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJNZXRhZGF0YS1WZXJzaW9uOiAxLjEiIGluIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicmVxdWlyZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIm9ic29sZXRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCiAKICAgICBkZWYgdGVzdF9wcm92aWRlc19pbGxlZ2FsKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEaXN0cmlidXRpb24sCkBAIC0yMzksMTEgKzIzOSwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X3JlcXVpcmVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg9PTEuMCkiXSkKICAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiTWV0YWRhdGEtVmVyc2lvbjogMS4xIiBpbiBtZXRhKQotICAgICAgICBzZWxmLmFzc2VydF8oInByb3ZpZGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJSZXF1aXJlczogb3RoZXIiIGluIG1ldGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiUmVxdWlyZXM6IGFub3RoZXIgKD09MS4wKSIgaW4gbWV0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJvYnNvbGV0ZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIk1ldGFkYXRhLVZlcnNpb246IDEuMSIgaW4gbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJwcm92aWRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiUmVxdWlyZXM6IG90aGVyIiBpbiBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlJlcXVpcmVzOiBhbm90aGVyICg9PTEuMCkiIGluIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgib2Jzb2xldGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKIAogICAgIGRlZiB0ZXN0X3JlcXVpcmVzX2lsbGVnYWwoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERpc3RyaWJ1dGlvbiwKQEAgLTI2MSwxMSArMjYxLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5nZXRfb2Jzb2xldGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg8MS4wKSJdKQogICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJNZXRhZGF0YS1WZXJzaW9uOiAxLjEiIGluIG1ldGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygicHJvdmlkZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQotICAgICAgICBzZWxmLmFzc2VydF8oInJlcXVpcmVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJPYnNvbGV0ZXM6IG90aGVyIiBpbiBtZXRhKQotICAgICAgICBzZWxmLmFzc2VydF8oIk9ic29sZXRlczogYW5vdGhlciAoPDEuMCkiIGluIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiTWV0YWRhdGEtVmVyc2lvbjogMS4xIiBpbiBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInByb3ZpZGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJyZXF1aXJlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiT2Jzb2xldGVzOiBvdGhlciIgaW4gbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJPYnNvbGV0ZXM6IGFub3RoZXIgKDwxLjApIiBpbiBtZXRhKQogCiAgICAgZGVmIHRlc3Rfb2Jzb2xldGVzX2lsbGVnYWwoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERpc3RyaWJ1dGlvbiwKQEAgLTI5OSwxNCArMjk5LDE0IEBACiAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdsaW51eCcsICdkYXJ3aW4nKToKICAgICAgICAgICAgICAgICBzZWxmLmVudmlyb25bJ0hPTUUnXSA9IHRlbXBfZGlyCiAgICAgICAgICAgICAgICAgZmlsZXMgPSBkaXN0LmZpbmRfY29uZmlnX2ZpbGVzKCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9maWxlbmFtZSBpbiBmaWxlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9maWxlbmFtZSBpbiBmaWxlcykKIAogICAgICAgICAgICAgIyB3aW4zMi1zdHlsZQogICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CiAgICAgICAgICAgICAgICAgIyBob21lIGRyaXZlIHNob3VsZCBiZSBmb3VuZAogICAgICAgICAgICAgICAgIHNlbGYuZW52aXJvblsnSE9NRSddID0gdGVtcF9kaXIKICAgICAgICAgICAgICAgICBmaWxlcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2ZpbGVuYW1lIGluIGZpbGVzLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2ZpbGVuYW1lIGluIGZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgbm90IGZvdW5kIGluICVyJyAlICh1c2VyX2ZpbGVuYW1lLCBmaWxlcykpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5yZW1vdmUodXNlcl9maWxlbmFtZSkKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAgICAgICAgIG91dHB1dCA9IFtsaW5lIGZvciBsaW5lIGluIHMuZ2V0dmFsdWUoKS5zcGxpdCgnXG4nKQogICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpICE9ICcnXQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKG91dHB1dCkgPiAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG91dHB1dCkgPiAwKQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKaW5kZXggOGQ3ZTk3Mi4uZDBhZDVjZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKQEAgLTg4LDcgKzg4LDcgQEAKIAogICAgIGRlZiBfdGVzdF91c2VyX3NpdGUoc2VsZik6CiAgICAgICAgIGZvciBrZXkgaW4gKCdudF91c2VyJywgJ3VuaXhfdXNlcicsICdvczJfaG9tZScpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGtleSBpbiBJTlNUQUxMX1NDSEVNRVMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIElOU1RBTExfU0NIRU1FUykKIAogICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQogICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCkBAIC05NiwyNCArOTYsMjQgQEAKICAgICAgICAgIyBtYWtpbmcgc3VyZSB0aGUgdXNlciBvcHRpb24gaXMgdGhlcmUKICAgICAgICAgb3B0aW9ucyA9IFtuYW1lIGZvciBuYW1lLCBzaG9ydCwgbGFibGUgaW4KICAgICAgICAgICAgICAgICAgICBjbWQudXNlcl9vcHRpb25zXQotICAgICAgICBzZWxmLmFzc2VydF8oJ3VzZXInIGluIG9wdGlvbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndXNlcicgaW4gb3B0aW9ucykKIAogICAgICAgICAjIHNldHRpbmcgYSB2YWx1ZQogICAgICAgICBjbWQudXNlciA9IDEKIAogICAgICAgICAjIHVzZXIgYmFzZSBhbmQgc2l0ZSBzaG91bGRuJ3QgYmUgY3JlYXRlZCB5ZXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2VsZi51c2VyX3NpdGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9iYXNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCiAKICAgICAgICAgIyBsZXQncyBydW4gZmluYWxpemUKICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQogCiAgICAgICAgICMgbm93IHRoZXkgc2hvdWxkCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCd1c2VyYmFzZScgaW4gY21kLmNvbmZpZ192YXJzKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3VzZXJzaXRlJyBpbiBjbWQuY29uZmlnX3ZhcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndXNlcmJhc2UnIGluIGNtZC5jb25maWdfdmFycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd1c2Vyc2l0ZScgaW4gY21kLmNvbmZpZ192YXJzKQogCiAgICAgZGVmIHRlc3RfaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CiAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dHJhX3BhdGgnOiAncGF0aCxkaXJzJ30pCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQppbmRleCA3M2M0MDM3Li43MDcyMTM2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKQEAgLTM1LDkgKzM1LDkgQEAKICAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDIpCiAgICAgICAgIHJ0d28gPSBvcy5wYXRoLnNwbGl0KHR3bylbLTFdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5zdDIsIHJ0d28pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQogICAgICAgICByb25lID0gb3MucGF0aC5zcGxpdChvbmUpWy0xXQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0LCByb25lKSkpCiAgICAgICAgIGNtZC5vdXRmaWxlcyA9IFtdCiAKICAgICAgICAgIyBsZXQncyB0cnkgd2l0aCB3YXJuX2RpciBvbmUKQEAgLTQ3LDggKzQ3LDggQEAKIAogICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKICAgICAgICAgY21kLm91dGZpbGVzID0gW10KIAogICAgICAgICAjIG5vdyB1c2luZyByb290IGFuZCBlbXB0eSBkaXIKQEAgLTY1LDggKzY1LDggQEAKIAogICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEluc3RhbGxEYXRhVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkKaW5kZXggZDc2ODE2Ni4uNzkzYjk1YyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQpAQCAtMzksOCArMzksOCBAQAogICAgICAgICBmID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHknKQogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZiwgJyMgcHl0aG9uIGZpbGUnKQogICAgICAgICBjbWQuYnl0ZV9jb21waWxlKFtmXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5YycpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5bycpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5YycpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5bycpKSkKIAogICAgIGRlZiB0ZXN0X2dldF9vdXRwdXRzKHNlbGYpOgogICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgIGNtZC5kaXN0cmlidXRpb24uc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCiAKICAgICAgICAgIyBnZXRfb3V0cHV0IHNob3VsZCByZXR1cm4gNCBlbGVtZW50cwotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGNtZC5nZXRfb3V0cHV0cygpKSA+PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNtZC5nZXRfb3V0cHV0cygpKSA+PSAyKQogCiAgICAgZGVmIHRlc3RfZ2V0X2lucHV0cyhzZWxmKToKICAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHkKaW5kZXggZmZmYTZlZi4uYjdlYjYyNSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5CkBAIC0yMywxNSArMjMsMTUgQEAKICAgICAgICAgICAgIHNraXBfYnVpbGQ9MSwKICAgICAgICAgICAgICkKICAgICAgICAgY21kID0gaW5zdGFsbF9zY3JpcHRzKGRpc3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY21kLmZvcmNlKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNtZC5za2lwX2J1aWxkKQotICAgICAgICBzZWxmLmFzc2VydF8oY21kLmJ1aWxkX2RpciBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oY21kLmluc3RhbGxfZGlyIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY21kLmZvcmNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNtZC5za2lwX2J1aWxkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX2RpciBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmluc3RhbGxfZGlyIGlzIE5vbmUpCiAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWQuZm9yY2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWQuc2tpcF9idWlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5mb3JjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5za2lwX2J1aWxkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9kaXIsICIvZm9vL2JhciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluc3RhbGxfZGlyLCAiL3NwbGF0L2Z1bmsiKQogCkBAIC02OSw3ICs2OSw3IEBACiAKICAgICAgICAgaW5zdGFsbGVkID0gb3MubGlzdGRpcih0YXJnZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgaW4gaW5zdGFsbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gaW5zdGFsbGVkKQogCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5CmluZGV4IDc4Y2UzYjcuLjIxMjQyYTggMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICMgd2luZG93cyByZWdpc3RlcmllcyB2ZXJzaW9ucy4KICAgICAgICAgcGF0aCA9IHInU29mdHdhcmVcTWljcm9zb2Z0XE5vdGVwYWQnCiAgICAgICAgIHYgPSBSZWcuZ2V0X3ZhbHVlKHBhdGgsIHUibGZpdGFsaWMiKQotICAgICAgICBzZWxmLmFzc2VydF8odiBpbiAoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluICgwLCAxKSkKIAogICAgICAgICBpbXBvcnQgX3dpbnJlZwogICAgICAgICBIS0NVID0gX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUgpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhrZXlzLCBOb25lKQogCiAgICAgICAgIGtleXMgPSBSZWcucmVhZF9rZXlzKEhLQ1UsIHInU29mdHdhcmVcTWljcm9zb2Z0JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdOb3RlcGFkJyBpbiBrZXlzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ05vdGVwYWQnIGluIGtleXMpCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShtc3ZjOWNvbXBpbGVyVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkKaW5kZXggMGM2YmY2Ni4uYWRhNzdhMCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9yZWdpc3Rlci5weQpAQCAtOTYsNyArOTYsNyBAQAogICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKCkKIAogICAgICAgICAjIHdlIHNob3VsZG4ndCBoYXZlIGEgLnB5cGlyYyBmaWxlIHlldAotICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQogCiAgICAgICAgICMgcGF0Y2hpbmcgcmF3X2lucHV0IGFuZCBnZXRwYXNzLmdldHBhc3MKICAgICAgICAgIyBzbyByZWdpc3RlciBnZXRzIGhhcHB5CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgICAgIGRlbCByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0CiAKICAgICAgICAgIyB3ZSBzaG91bGQgaGF2ZSBhIGJyYW5kIG5ldyAucHlwaXJjIGZpbGUKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi5yYykpCiAKICAgICAgICAgIyB3aXRoIHRoZSBjb250ZW50IHNpbWlsYXIgdG8gV0FOVEVEX1BZUElSQwogICAgICAgICBjb250ZW50ID0gb3BlbihzZWxmLnJjKS5yZWFkKCkKQEAgLTEzMywxMyArMTMzLDEzIEBACiAKICAgICAgICAgIyBsZXQncyBzZWUgd2hhdCB0aGUgc2VydmVyIHJlY2VpdmVkIDogd2Ugc2hvdWxkCiAgICAgICAgICMgaGF2ZSAyIHNpbWlsYXIgcmVxdWVzdHMKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY29ubi5yZXFzLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jb25uLnJlcXMsIDIpCiAgICAgICAgIHJlcTEgPSBkaWN0KHNlbGYuY29ubi5yZXFzWzBdLmhlYWRlcnMpCiAgICAgICAgIHJlcTIgPSBkaWN0KHNlbGYuY29ubi5yZXFzWzFdLmhlYWRlcnMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxMVsnQ29udGVudC1sZW5ndGgnXSwgJzEzNzQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEyWydDb250ZW50LWxlbmd0aCddLCAnMTM3NCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygneHh4JyBpbiBzZWxmLmNvbm4ucmVxc1sxXS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3h4eCcgaW4gc2VsZi5jb25uLnJlcXNbMV0uZGF0YSkKIAogICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX25vdF9pbl9maWxlKHNlbGYpOgogCkBAIC0xNjUsMTEgKzE2NSwxMSBAQAogICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKIAogICAgICAgICAjIHdlIHNob3VsZCBoYXZlIHNlbmQgYSByZXF1ZXN0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmNvbm4ucmVxcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY29ubi5yZXFzLCAxKQogICAgICAgICByZXEgPSBzZWxmLmNvbm4ucmVxc1swXQogICAgICAgICBoZWFkZXJzID0gZGljdChyZXEuaGVhZGVycykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzYwOCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygndGFyZWsnIGluIHJlcS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RhcmVrJyBpbiByZXEuZGF0YSkKIAogICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX3Jlc2V0KHNlbGYpOgogICAgICAgICAjIHRoaXMgdGVzdCBydW5zIGNob2ljZSAzCkBAIC0xODMsMTEgKzE4MywxMSBAQAogICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKIAogICAgICAgICAjIHdlIHNob3VsZCBoYXZlIHNlbmQgYSByZXF1ZXN0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmNvbm4ucmVxcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY29ubi5yZXFzLCAxKQogICAgICAgICByZXEgPSBzZWxmLmNvbm4ucmVxc1swXQogICAgICAgICBoZWFkZXJzID0gZGljdChyZXEuaGVhZGVycykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzI5MCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygndGFyZWsnIGluIHJlcS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RhcmVrJyBpbiByZXEuZGF0YSkKIAogICAgIGRlZiB0ZXN0X3N0cmljdChzZWxmKToKICAgICAgICAgIyB0ZXN0aW5nIHRoZSBzY3JpcHQgb3B0aW9uCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3N5c2NvbmZpZy5weQppbmRleCA4NTM0ODgxLi5lZGM4ZmQ4IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkKQEAgLTIxLDEyICsyMSwxMiBAQAogCiAgICAgZGVmIHRlc3RfZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICBjb25maWdfaCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX2hfZmlsZW5hbWUoKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUoY29uZmlnX2gpLCBjb25maWdfaCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGNvbmZpZ19oKSwgY29uZmlnX2gpCiAKICAgICBkZWYgdGVzdF9nZXRfcHl0aG9uX2xpYihzZWxmKToKICAgICAgICAgbGliX2RpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpCiAgICAgICAgICMgWFhYIGRvZXNuJ3Qgd29yayBvbiBMaW51eCB3aGVuIFB5dGhvbiB3YXMgbmV2ZXIgaW5zdGFsbGVkIGJlZm9yZQotICAgICAgICAjc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIobGliX2RpciksIGxpYl9kaXIpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2RpcihsaWJfZGlyKSwgbGliX2RpcikKICAgICAgICAgIyB0ZXN0IGZvciBweXRob254eC5saWI/CiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3lzY29uZmlnLmdldF9weXRob25fbGliKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9weXRob25fbGliKHByZWZpeD1URVNURk4pKQpAQCAtMzYsMTQgKzM2LDE0IEBACiAgICAgICAgICMgVGhpcyBpcyBub3QgbXVjaCBvZiBhIHRlc3QuICBXZSBtYWtlIHN1cmUgUHl0aG9uLmggZXhpc3RzCiAgICAgICAgICMgaW4gdGhlIGRpcmVjdG9yeSByZXR1cm5lZCBieSBnZXRfcHl0aG9uX2luYygpIGJ1dCB3ZSBkb24ndCBrbm93CiAgICAgICAgICMgaXQgaXMgdGhlIGNvcnJlY3QgZmlsZS4KLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIoaW5jX2RpciksIGluY19kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKGluY19kaXIpLCBpbmNfZGlyKQogICAgICAgICBweXRob25faCA9IG9zLnBhdGguam9pbihpbmNfZGlyLCAiUHl0aG9uLmgiKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUocHl0aG9uX2gpLCBweXRob25faCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHB5dGhvbl9oKSwgcHl0aG9uX2gpCiAKICAgICBkZWYgdGVzdF9nZXRfY29uZmlnX3ZhcnMoc2VsZik6CiAgICAgICAgIGN2YXJzID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFycygpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGN2YXJzLCBkaWN0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGN2YXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjdmFycywgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjdmFycykKIAogICAgIGRlZiB0ZXN0X2N1c3RvbWl6ZV9jb21waWxlcihzZWxmKToKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHkKaW5kZXggYmJjZDgwZC4uMGQ5NWEwOSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXBsb2FkLnB5CkBAIC05NiwxMSArOTYsMTEgQEAKICAgICAgICAgIyB3aGF0IGRpZCB3ZSBzZW5kID8KICAgICAgICAgaGVhZGVycyA9IGRpY3Qoc2VsZi5sYXN0X29wZW4ucmVxLmhlYWRlcnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGhlYWRlcnNbJ0NvbnRlbnQtbGVuZ3RoJ10sICcyMDg2JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddLnN0YXJ0c3dpdGgoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddLnN0YXJ0c3dpdGgoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5sYXN0X29wZW4ucmVxLmdldF9tZXRob2QoKSwgJ1BPU1QnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmxhc3Rfb3Blbi5yZXEuZ2V0X2Z1bGxfdXJsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGknKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3h4eCcgaW4gc2VsZi5sYXN0X29wZW4ucmVxLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgneHh4JyBpbiBzZWxmLmxhc3Rfb3Blbi5yZXEuZGF0YSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKHVwbG9hZFRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCBjZWU3ZDUyLi5jMGFjZjVmIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMjI1LDEwICsyMjUsMTAgQEAKICAgICAgICAgbm8gPSAoJ24nLCAnbm8nLCAnZicsICdmYWxzZScsICdvZmYnLCAnMCcsICdPZmYnLCAnTm8nLCAnTicpCiAKICAgICAgICAgZm9yIHkgaW4geWVzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHN0cnRvYm9vbCh5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJ0b2Jvb2woeSkpCiAKICAgICAgICAgZm9yIG4gaW4gbm86Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IHN0cnRvYm9vbChuKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc3RydG9ib29sKG4pKQogCiAgICAgZGVmIHRlc3RfcmZjODIyX2VzY2FwZShzZWxmKToKICAgICAgICAgaGVhZGVyID0gJ0kgYW0gYVxucG9vclxubG9uZXNvbWVcbmhlYWRlclxuJwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKaW5kZXggZjljYzZmMC4uNTBkM2ZiNiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC01MCw3ICs1MCw3IEBACiAjIEJhc2UgdGVzdCBjbGFzcwogY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6Ci0gICAgICAgICIiIkxpa2UgZmFpbFVubGVzc0VxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKKyAgICAgICAgIiIiTGlrZSBhc3NlcnRFcXVhbCBleGNlcHQgdXNlIG5kaWZmIGZvciByZWFkYWJsZSBvdXRwdXQuIiIiCiAgICAgICAgIGlmIGZpcnN0IDw+IHNlY29uZDoKICAgICAgICAgICAgIHNmaXJzdCA9IHN0cihmaXJzdCkKICAgICAgICAgICAgIHNzZWNvbmQgPSBzdHIoc2Vjb25kKQpAQCAtMjM5LDEyICsyMzksMTIgQEAKICAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCiAgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCiAgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ2Zyb20nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGcm9tJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnRlJPTScgaW4gbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3RvJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnVG8nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUTycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUTycgaW4gbXNnKQogCiAgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgICAgICBlcSh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCiAgICAgICAgIGZ1bGxyZXByID0gc3RyKG1zZykKICAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCiAgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKIAogICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKQEAgLTMzNywxMCArMzM3LDEwIEBACiAKICAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnaGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSEVBREVSJykpCi0gICAgICAgIHNlbGYuZmFpbElmKG1zZy5oYXNfa2V5KCdoZWFkZXJpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmhhc19rZXkoJ2hlYWRlcmknKSkKIAogICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC05MzEsNyArOTMxLDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC05NzQsNyArOTc0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKICAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAKICAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCiAgICAgICAgIG1pc3NpbmcgPSBbXQpAQCAtMTAxMSw3ICsxMDExLDcgQEAKIAogICAgIGRlZiB0ZXN0X3BheWxvYWQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB0aGVyZScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5fbXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKIAogICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTA2Niw3ICsxMDY2LDcgQEAKICAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CiAgICAgICAgICMgY29udmVuaWVuY2UKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKICAgICAgICAgIyB0ZXN0cwogICAgICAgICBtID0gc2VsZi5fbXNnCkBAIC0xMzgwLDcgKzEzODAsNyBAQAogCiAtLSAgICBYWFhYLS0KICcnJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKICAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnICAgIFhYWFgnKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQogCkBAIC0xNDEwLDcgKzE0MTAsNyBAQAogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQogCiAgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNS50eHQnKQogICAgICAgICAjIFhYWCBXZSBjYW4gcHJvYmFibHkgZXZlbnR1YWxseSBkbyBiZXR0ZXIKICAgICAgICAgaW5uZXIgPSBtc2cuZ2V0X3BheWxvYWQoMCkKQEAgLTE0MjAsNyArMTQyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQogCiAgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI1LnR4dCcpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCkBAIC0xNDc4LDcgKzE0NzgsNyBAQAogIiIiKQogCiAgICAgZGVmIHRlc3RfbHlpbmdfbXVsdGlwYXJ0KHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQxLnR4dCcpCiAgICAgICAgIHVubGVzcyhoYXNhdHRyKG1zZywgJ2RlZmVjdHMnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQpAQCAtMTQ5OCw3ICsxNDk4LDcgQEAKICAgICAgICAgIyBbKl0gVGhpcyBtZXNzYWdlIGlzIG1pc3NpbmcgaXRzIHN0YXJ0IGJvdW5kYXJ5CiAgICAgICAgIGJhZCA9IG91dGVyLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJhZC5kZWZlY3RzKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoYmFkLmRlZmVjdHNbMF0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKIAogICAgIGRlZiB0ZXN0X2ZpcnN0X2xpbmVfaXNfY29udGludWF0aW9uX2hlYWRlcihzZWxmKToKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAgICAgICAgIGVxKG1zZy5rZXlzKCksIFtdKQogICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ0xpbmUgMlxuTGluZSAzJykKICAgICAgICAgZXEobGVuKG1zZy5kZWZlY3RzKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QpKQogICAgICAgICBlcShtc2cuZGVmZWN0c1swXS5saW5lLCAnIExpbmUgMVxuJykKIApAQCAtMTU3Niw3ICsxNTc2LDcgQEAKIAogICAgIGRlZiB0ZXN0X3ZhbGlkX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCiAgICAgICAgIG0gPSBNZXNzYWdlKCkKICAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdApAQCAtMTYyMCwyMCArMTYyMCwyMCBAQAogCiAgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzExLnR4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBzdWJtc2cgPSBwYXlsb2FkWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHN1Ym1zZywgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN1Ym1zZywgTWVzc2FnZSkpCiAgICAgICAgIGVxKHN1Ym1zZ1snc3ViamVjdCddLCAnQW4gZW5jbG9zZWQgbWVzc2FnZScpCiAgICAgICAgIGVxKHN1Ym1zZy5nZXRfcGF5bG9hZCgpLCAnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCiAKICAgICBkZWYgdGVzdF9kc24oc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKQEAgLTE5ODMsNyArMTk4Myw3IEBACiAKICAgICBkZWYgdGVzdF9jb250ZW50X3R5cGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCkBAIC0yMDA1LDcgKzIwMDUsNyBAQAogICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKICAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQogICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQogICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCkBAIC0yMDE1LDcgKzIwMTUsNyBAQAogCiAgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKICAgICAgICAgIyBDaGVjayBzb21lIG9mIHRoZSBvdXRlciBoZWFkZXJzCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCkBAIC0yMDI1LDkgKzIwMjUsOSBAQAogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBtc2cxID0gcGF5bG9hZFswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCiAgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCiAKIApAQCAtMjA2NCw3ICsyMDY0LDcgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmdfd2l0aF9jbGFzcyhzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQpAQCAtMjA4Nyw3ICsyMDg3LDcgQEAKICAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICMgQ3JlYXRlIGEgc3ViY2xhc3MKICAgICAgICAgY2xhc3MgTXlNZXNzYWdlKE1lc3NhZ2UpOgogICAgICAgICAgICAgcGFzcwpAQCAtMjIyOSw3ICsyMjI5LDcgQEAKIAogICAgIGRlZiB0ZXN0X2NoYXJzZXRfcmljaGNvbXBhcmlzb25zKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgbmUgPSBzZWxmLmZhaWxJZkVxdWFsCisgICAgICAgIG5lID0gc2VsZi5hc3NlcnROb3RFcXVhbAogICAgICAgICBjc2V0MSA9IENoYXJzZXQoKQogICAgICAgICBjc2V0MiA9IENoYXJzZXQoKQogICAgICAgICBlcShjc2V0MSwgJ3VzLWFzY2lpJykKQEAgLTI0MjgsOCArMjQyOCw4IEBACiAgICAgICAgIGVxKG1zZ1snZnJvbSddLCAncHBwLXJlcXVlc3RAenp6Lm9yZycpCiAgICAgICAgIGVxKG1zZ1sndG8nXSwgJ3BwcEB6enoub3JnJykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCi0gICAgICAgIHNlbGYuZmFpbElmKG1zZy5pc19tdWx0aXBhcnQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKIAogICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI2NDgsMTUgKzI2NDgsMTUgQEAKIAogICAgIGRlZiB0ZXN0X2hlYWRlcl9xdW9wcmlfY2hlY2soc2VsZik6CiAgICAgICAgIGZvciBjIGluIHNlbGYuaGxpdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKHF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQogICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKIAogICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2NoZWNrKHNlbGYpOgogICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQogICAgICAgICBmb3IgYyBpbiBzZWxmLmJub246Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpTUlNRS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQogCiAgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMjgyNSw3ICsyODI1LDcgQEAKICAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKICAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQogICAgICAgICBmb3IgbCBpbiBoLmVuY29kZShzcGxpdGNoYXJzPScgJykuc3BsaXQoJ1xuICcpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxlbihsKSA8PSA3NikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obCkgPD0gNzYpCiAKICAgICBkZWYgdGVzdF9tdWx0aWxpbmd1YWwoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCkBAIC0zMDU1LDcgKzMwNTUsNyBAQAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKICAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCdOQU1FJykKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHBhcmFtLAogICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKQEAgLTMyMDgsNyArMzIwOCw3IEBACiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQotICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAiRnJhbmsncyBEb2N1bWVudCIpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrX2V4dGVuZGVkKHNlbGYpOgpAQCAtMzIzMiw3ICszMjMyLDcgQEAKICIiIgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCiAgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJ1cy1hc2NpaSdlbi11cydGcmFuaydzIERvY3VtZW50IikKIAogICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fZXh0ZW5kZWRfdmFsdWVzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CmluZGV4IDYxZmUyNmUuLjkyOGQyNTEgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTUxLDcgKzUxLDcgQEAKICMgQmFzZSB0ZXN0IGNsYXNzCiBjbGFzcyBUZXN0RW1haWxCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgbmRpZmZBc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kKToKLSAgICAgICAgIiIiTGlrZSBmYWlsVW5sZXNzRXF1YWwgZXhjZXB0IHVzZSBuZGlmZiBmb3IgcmVhZGFibGUgb3V0cHV0LiIiIgorICAgICAgICAiIiJMaWtlIGFzc2VydEVxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKICAgICAgICAgaWYgZmlyc3QgPD4gc2Vjb25kOgogICAgICAgICAgICAgc2ZpcnN0ID0gc3RyKGZpcnN0KQogICAgICAgICAgICAgc3NlY29uZCA9IHN0cihzZWNvbmQpCkBAIC0yMjcsMTIgKzIyNywxMiBAQAogICAgICAgICBtc2dbJ0Zyb20nXSA9ICdNZScKICAgICAgICAgbXNnWyd0byddID0gJ1lvdScKICAgICAgICAgIyBDaGVjayBmb3IgY2FzZSBpbnNlbnNpdGl2aXR5Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnZnJvbScgaW4gbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ0Zyb20nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGUk9NJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygndG8nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUbycgaW4gbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ1RPJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZnJvbScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGUk9NJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUbycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1RPJyBpbiBtc2cpCiAKICAgICBkZWYgdGVzdF9hc19zdHJpbmcoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbCh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCiAgICAgICAgIGZ1bGxyZXByID0gc3RyKG1zZykKICAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCiAgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKIAogICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKQEAgLTMyNSwxMCArMzI1LDEwIEBACiAKICAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnaGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSEVBREVSJykpCi0gICAgICAgIHNlbGYuZmFpbElmKG1zZy5oYXNfa2V5KCdoZWFkZXJpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmhhc19rZXkoJ2hlYWRlcmknKSkKIAogICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC05MTIsNyArOTEyLDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC05NTUsNyArOTU1LDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKICAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKQEAgLTk5OSw3ICs5OTksNyBAQAogCiAgICAgZGVmIHRlc3RfdHlwZXMoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQogICAgICAgICBtaXNzaW5nID0gW10KQEAgLTEwMDksNyArMTAwOSw3IEBACiAKICAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9tc2cuaXNfbXVsdGlwYXJ0KCkpCiAKICAgICBkZWYgdGVzdF9jaGFyc2V0KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTEwNjQsNyArMTA2NCw3IEBACiAgICAgZGVmIHRlc3RfaGllcmFyY2h5KHNlbGYpOgogICAgICAgICAjIGNvbnZlbmllbmNlCiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCiAgICAgICAgICMgdGVzdHMKICAgICAgICAgbSA9IHNlbGYuX21zZwpAQCAtMTM3OCw3ICsxMzc4LDcgQEAKIAogLS0gICAgWFhYWC0tCiAnJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCiAgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJyAgICBYWFhYJykKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKIApAQCAtMTQwOCw3ICsxNDA4LDcgQEAKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKIAogICAgIGRlZiB0ZXN0X3NhbWVfYm91bmRhcnlfaW5uZXJfb3V0ZXIoc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTUudHh0JykKICAgICAgICAgIyBYWFggV2UgY2FuIHByb2JhYmx5IGV2ZW50dWFsbHkgZG8gYmV0dGVyCiAgICAgICAgIGlubmVyID0gbXNnLmdldF9wYXlsb2FkKDApCkBAIC0xNDE4LDcgKzE0MTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKIAogICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19ib3VuZGFyeShzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yNS50eHQnKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQpAQCAtMTQ3Niw3ICsxNDc2LDcgQEAKICIiIikKIAogICAgIGRlZiB0ZXN0X2x5aW5nX211bHRpcGFydChzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQogICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAgICAgICAgICMgWypdIFRoaXMgbWVzc2FnZSBpcyBtaXNzaW5nIGl0cyBzdGFydCBib3VuZGFyeQogICAgICAgICBiYWQgPSBvdXRlci5nZXRfcGF5bG9hZCgxKS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiYWQuZGVmZWN0cyksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCiAKICAgICBkZWYgdGVzdF9maXJzdF9saW5lX2lzX2NvbnRpbnVhdGlvbl9oZWFkZXIoc2VsZik6CkBAIC0xNTA2LDcgKzE1MDYsNyBAQAogICAgICAgICBlcShtc2cua2V5cygpLCBbXSkKICAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdMaW5lIDJcbkxpbmUgMycpCiAgICAgICAgIGVxKGxlbihtc2cuZGVmZWN0cyksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KSkKICAgICAgICAgZXEobXNnLmRlZmVjdHNbMF0ubGluZSwgJyBMaW5lIDFcbicpCiAKQEAgLTE1NzMsNyArMTU3Myw3IEBACiAKICAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgc3ViamVjdCA9ICdBIHN1Yi1tZXNzYWdlJwogICAgICAgICBtID0gTWVzc2FnZSgpCiAgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKQEAgLTE2MTcsMjAgKzE2MTcsMjAgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnNlX21lc3NhZ2VfcmZjODIyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMS50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQogICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQogICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQogCiAgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIG1zZyAxNiBpcyBhIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb24sIHNlZSBSRkMgMTg5NAogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCkBAIC0xOTc3LDcgKzE5NzcsNyBAQAogCiAgICAgZGVmIHRlc3RfY29udGVudF90eXBlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgIyBHZXQgYSBtZXNzYWdlIG9iamVjdCBhbmQgcmVzZXQgdGhlIHNlZWsgcG9pbnRlciBmb3Igb3RoZXIgdGVzdHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQpAQCAtMTk5OSw3ICsxOTk5LDcgQEAKICAgICAgICAgZXEobXNnMi5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCiAgICAgICAgIG1zZzMgPSBtc2cuZ2V0X3BheWxvYWQoMikKICAgICAgICAgZXEobXNnMy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2czLCBNZXNzYWdlKSkKICAgICAgICAgcGF5bG9hZCA9IG1zZzMuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQpAQCAtMjAwOSw3ICsyMDA5LDcgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscwotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCiAgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycwogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQpAQCAtMjAxOSw5ICsyMDE5LDkgQEAKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgbXNnMSA9IHBheWxvYWRbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQogICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKICAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnXG4nKQogCiAKQEAgLTIwNTgsNyArMjA1OCw3IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKQEAgLTIwODEsNyArMjA4MSw3IEBACiAgICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQogCiAgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX2ZpbGVfd2l0aF9jbGFzcyhzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCiAgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKICAgICAgICAgICAgIHBhc3MKQEAgLTIyMjQsNyArMjIyNCw3IEBACiAKICAgICBkZWYgdGVzdF9jaGFyc2V0X3JpY2hjb21wYXJpc29ucyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIG5lID0gc2VsZi5mYWlsSWZFcXVhbAorICAgICAgICBuZSA9IHNlbGYuYXNzZXJ0Tm90RXF1YWwKICAgICAgICAgY3NldDEgPSBDaGFyc2V0KCkKICAgICAgICAgY3NldDIgPSBDaGFyc2V0KCkKICAgICAgICAgZXEoY3NldDEsICd1cy1hc2NpaScpCkBAIC0yNDIzLDggKzI0MjMsOCBAQAogICAgICAgICBlcShtc2dbJ2Zyb20nXSwgJ3BwcC1yZXF1ZXN0QHp6ei5vcmcnKQogICAgICAgICBlcShtc2dbJ3RvJ10sICdwcHBAenp6Lm9yZycpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQotICAgICAgICBzZWxmLmZhaWxJZihtc2cuaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCiAKICAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdGlvbihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yNjQzLDE1ICsyNjQzLDE1IEBACiAKICAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2NoZWNrKHNlbGYpOgogICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKICAgICAgICAgZm9yIGMgaW4gc2VsZi5obm9uOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCiAKICAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9jaGVjayhzZWxmKToKICAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgotICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKICAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKIAogICAgIGRlZiB0ZXN0X2hlYWRlcl9xdW9wcmlfbGVuKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI4MjAsNyArMjgyMCw3IEBACiAgICAgICAgIGggPSBIZWFkZXIoIkkgYW0gdGhlIHZlcnkgbW9kZWwgb2YgYSBtb2Rlcm4gTWFqb3ItR2VuZXJhbDsgSSd2ZSBpbmZvcm1hdGlvbiB2ZWdldGFibGUsIGFuaW1hbCwgYW5kIG1pbmVyYWw7IEkga25vdyB0aGUga2luZ3Mgb2YgRW5nbGFuZCwgYW5kIEkgcXVvdGUgdGhlIGZpZ2h0cyBoaXN0b3JpY2FsIGZyb20gTWFyYXRob24gdG8gV2F0ZXJsb28sIGluIG9yZGVyIGNhdGVnb3JpY2FsOyBJJ20gdmVyeSB3ZWxsIGFjcXVhaW50ZWQsIHRvbywgd2l0aCBtYXR0ZXJzIG1hdGhlbWF0aWNhbDsgSSB1bmRlcnN0YW5kIGVxdWF0aW9ucywgYm90aCB0aGUgc2ltcGxlIGFuZCBxdWFkcmF0aWNhbDsgYWJvdXQgYmlub21pYWwgdGhlb3JlbSBJJ20gdGVlbWluZyB3aXRoIGEgbG90IG8nIG5ld3MsIHdpdGggbWFueSBjaGVlcmZ1bCBmYWN0cyBhYm91dCB0aGUgc3F1YXJlIG9mIHRoZSBoeXBvdGVudXNlLiIsCiAgICAgICAgICAgICAgICAgICAgbWF4bGluZWxlbj03NikKICAgICAgICAgZm9yIGwgaW4gaC5lbmNvZGUoc3BsaXRjaGFycz0nICcpLnNwbGl0KCdcbiAnKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4obCkgPD0gNzYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGwpIDw9IDc2KQogCiAgICAgZGVmIHRlc3RfbXVsdGlsaW5ndWFsKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbApAQCAtMzA1MCw3ICszMDUwLDcgQEAKICcnJwogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCiAgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnTkFNRScpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBwYXJhbSwKICAgICAgICAgICAgICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpCkBAIC0zMjAzLDcgKzMyMDMsNyBAQAogIiIiCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKICAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKQEAgLTMyMjcsNyArMzIyNyw3IEBACiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQotICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAidXMtYXNjaWknZW4tdXMnRnJhbmsncyBEb2N1bWVudCIpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2V4dGVuZGVkX3ZhbHVlcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKaW5kZXggNzEwOTUyNy4uY2E4ZjdiMyAxMDA2NDQKLS0tIGEvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKQEAgLTgsMTIgKzgsMTIgQEAKIGNsYXNzIFRlc3REZWNvZGUoVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CiAgICAgICAgIHJ2YWwgPSBqc29uLmxvYWRzKCcxLjEnLCBwYXJzZV9mbG9hdD1kZWNpbWFsLkRlY2ltYWwpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCgnMS4xJykpCiAKICAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKICAgICAgICAgcnZhbCA9IGpzb24ubG9hZHMoJzEnLCBwYXJzZV9pbnQ9ZmxvYXQpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJ2YWwsIGZsb2F0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocnZhbCwgZmxvYXQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhydmFsLCAxLjApCiAKICAgICBkZWYgdGVzdF9kZWNvZGVyX29wdGltaXphdGlvbnMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weQppbmRleCA4ZmY5YTM4Li4zYTg0ZGRmIDEwMDY0NAotLS0gYS9MaWIvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5CisrKyBiL0xpYi9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHkKQEAgLTcsOSArNyw5IEBACiBjbGFzcyBUZXN0U3BlZWR1cHMoVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3NjYW5zdHJpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuc2NhbnN0cmluZy5fX21vZHVsZV9fLCAiX2pzb24iKQotICAgICAgICBzZWxmLmFzc2VydF8oZGVjb2Rlci5zY2Fuc3RyaW5nIGlzIGRlY29kZXIuY19zY2Fuc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVjb2Rlci5zY2Fuc3RyaW5nIGlzIGRlY29kZXIuY19zY2Fuc3RyaW5nKQogCiAgICAgZGVmIHRlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkuX19tb2R1bGVfXywgIl9qc29uIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgaXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5jX2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQppbmRleCAwMDliOGRlLi5lNmMwOGJlIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQorKysgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQpAQCAtMTksMTggKzE5LDE4IEBACiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKIAogICAgICAgICAjIHBhdHRlcm4gYW5kIGluZGV4IGFyZSBvYmxpZ2F0b3J5IGFyZ3VtZW50cy4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCBOb25lLCAnMS4wJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCAnYScsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdGV4dC5zZWFyY2gsIE5vbmUsICcxLjAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgJ2EnLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgTm9uZSwgTm9uZSkKIAogICAgICAgICAjIEludmFsaWQgdGV4dCBpbmRleC4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCAnJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdGV4dC5zZWFyY2gsICcnLCAwKQogCiAgICAgICAgICMgQ2hlY2sgaWYgd2UgYXJlIGdldHRpbmcgdGhlIGluZGljZXMgYXMgc3RyaW5ncyAtLSB5b3UgYXJlIGxpa2VseQogICAgICAgICAjIHRvIGdldCBUY2xfT2JqIHVuZGVyIFRrIDguNSBpZiBUa2ludGVyIGRvZXNuJ3QgY29udmVydCBpdC4KICAgICAgICAgdGV4dC5pbnNlcnQoJzEuMCcsICdoaS10ZXN0JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGV4dC5zZWFyY2goJy10ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRleHQuc2VhcmNoKCd0ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zZWFyY2goJy10ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zZWFyY2goJ3Rlc3QnLCAnMS4wJywgJ2VuZCcpLCAnMS4zJykKIAogCiB0ZXN0c19ndWkgPSAoVGV4dFRlc3QsICkKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5CmluZGV4IDQxM2QyMjUuLjZlNDZjYmMgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weQpAQCAtMjIsMTYgKzIyLDE2IEBACiAgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKCkKICAgICAgICAgdmFyID0geC5fdmFyaWFibGUuX25hbWUKICAgICAgICAgeC5kZXN0cm95KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCB2YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCB2YXIpCiAKICAgICAgICAgIyBtYW51YWxseSBjcmVhdGVkIHZhcmlhYmxlCiAgICAgICAgIG15dmFyID0gVGtpbnRlci5Eb3VibGVWYXIoKQogICAgICAgICBuYW1lID0gbXl2YXIuX25hbWUKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCiAgICAgICAgIHguZGVzdHJveSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgudGsuZ2xvYmFsZ2V0dmFyKG5hbWUpLCBteXZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgbXl2YXIuZ2V0KCkpCiAgICAgICAgIGRlbCBteXZhcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgeC50ay5nbG9iYWxnZXR2YXIsIG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCBuYW1lKQogCiAgICAgICAgICMgY2hlY2tpbmcgdGhhdCB0aGUgdHJhY2luZyBjYWxsYmFjayBpcyBwcm9wZXJseSByZW1vdmVkCiAgICAgICAgIG15dmFyID0gVGtpbnRlci5JbnRWYXIoKQpAQCAtNDUsMTcgKzQ1LDE3IEBACiAgICAgICAgICMgaXQgdHJpZXMgY2FsbGluZyBpbnN0YW5jZSBhdHRyaWJ1dGVzIG5vdCB5ZXQgZGVmaW5lZC4KICAgICAgICAgdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhcikKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdsYXN0X3R5cGUnKToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKHN5cy5sYXN0X3R5cGUgPT0gVGtpbnRlci5UY2xFcnJvcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3lzLmxhc3RfdHlwZSA9PSBUa2ludGVyLlRjbEVycm9yKQogCiAKICAgICBkZWYgdGVzdF9pbml0aWFsaXphdGlvbihzZWxmKToKICAgICAgICAgIyBtYXN0ZXIgcGFzc2luZwogICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgubWFzdGVyLCBUa2ludGVyLl9kZWZhdWx0X3Jvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tYXN0ZXIsIFRraW50ZXIuX2RlZmF1bHRfcm9vdCkKICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgbWFzdGVyID0gVGtpbnRlci5GcmFtZSgpCiAgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKG1hc3RlcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5tYXN0ZXIsIG1hc3RlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1hc3RlciwgbWFzdGVyKQogICAgICAgICB4LmRlc3Ryb3koKQogCiAgICAgICAgICMgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24vcGFzc2luZwpAQCAtNjMsMjkgKzYzLDI5IEBACiAgICAgICAgICAgICAoLTEsIC0xKSwgKHN5cy5tYXhpbnQgKyAxLCBzeXMubWF4aW50ICsgMSkpCiAgICAgICAgIGZvciBwYWlyIGluIHBhc3NlZF9leHBlY3RlZDoKICAgICAgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKGZyb21fPXBhaXJbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LnZhbHVlLCBwYWlyWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCBwYWlyWzFdKQogICAgICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89JzIuNScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB4Ll92YXJpYWJsZS5nZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHguX3ZhcmlhYmxlLmdldCkKICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89Tm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHguX3ZhcmlhYmxlLmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgeC5fdmFyaWFibGUuZ2V0KQogICAgICAgICB4LmRlc3Ryb3koKQogICAgICAgICAjIHZhcmlhYmxlIHNob3VsZCBoYXZlIGl0cyBkZWZhdWx0IHZhbHVlIHNldCB0byB0aGUgZnJvbV8gdmFsdWUKICAgICAgICAgbXl2YXIgPSBUa2ludGVyLkRvdWJsZVZhcih2YWx1ZT0yMCkKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgudmFsdWUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWx1ZSwgMCkKICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgIyBjaGVjayB0aGF0IGl0IGlzIHJlYWxseSB1c2luZyBhIERvdWJsZVZhcgogICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhciwgZnJvbV89MC41KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LnZhbHVlLCAwLjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguX3ZhcmlhYmxlLl9uYW1lLCBteXZhci5fbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fdmFyaWFibGUuX25hbWUsIG15dmFyLl9uYW1lKQogICAgICAgICB4LmRlc3Ryb3koKQogCiAgICAgICAgICMgd2lkZ2V0IHBvc2l0aW9ubWVudAogICAgICAgICBkZWYgY2hlY2tfcG9zaXRpb25zKHNjYWxlLCBzY2FsZV9wb3MsIGxhYmVsLCBsYWJlbF9wb3MpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2NhbGUucGFja19pbmZvKClbJ3NpZGUnXSwgc2NhbGVfcG9zKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGFiZWwucGxhY2VfaW5mbygpWydhbmNob3InXSwgbGFiZWxfcG9zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzY2FsZS5wYWNrX2luZm8oKVsnc2lkZSddLCBzY2FsZV9wb3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhYmVsLnBsYWNlX2luZm8oKVsnYW5jaG9yJ10sIGxhYmVsX3BvcykKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoY29tcG91bmQ9J3RvcCcpCiAgICAgICAgIGNoZWNrX3Bvc2l0aW9ucyh4LnNjYWxlLCAnYm90dG9tJywgeC5sYWJlbCwgJ24nKQogICAgICAgICB4LmRlc3Ryb3koKQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIHguZGVzdHJveSgpCiAKICAgICAgICAgIyBleHRyYSwgYW5kIGludmFsaWQsIGt3YXJncwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdHRrLkxhYmVsZWRTY2FsZSwgYT0nYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHR0ay5MYWJlbGVkU2NhbGUsIGE9J2InKQogCiAKICAgICBkZWYgdGVzdF9ob3Jpem9udGFsX3JhbmdlKHNlbGYpOgpAQCAtMTExLDcgKzExMSw3IEBACiAKICAgICAgICAgbGluZm9fMSA9IGxzY2FsZS5sYWJlbC5wbGFjZV9pbmZvKCkKICAgICAgICAgcHJldl94Y29vcmQgPSBsc2NhbGUuc2NhbGUuY29vcmRzKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocHJldl94Y29vcmQsIGludChsaW5mb18xWyd4J10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXZfeGNvb3JkLCBpbnQobGluZm9fMVsneCddKSkKICAgICAgICAgIyBjaGFuZ2UgcmFuZ2UgdG86IGZyb20gLTUgdG8gNS4gVGhpcyBzaG91bGQgY2hhbmdlIHRoZSB4IGNvb3JkIG9mCiAgICAgICAgICMgdGhlIHNjYWxlIHdpZGdldCwgc2luY2UgMCBpcyBhdCB0aGUgbWlkZGxlIG9mIHRoZSBuZXcKICAgICAgICAgIyByYW5nZS4KQEAgLTEyMCwxNSArMTIwLDE1IEBACiAgICAgICAgICMgYXQgdGhlIHNhbWUgdGltZSB0aGlzIHNob3VsZG4ndCBhZmZlY3QgdGVzdCBvdXRjb21lCiAgICAgICAgIGxzY2FsZS51cGRhdGUoKQogICAgICAgICBjdXJyX3hjb29yZCA9IGxzY2FsZS5zY2FsZS5jb29yZHMoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHJldl94Y29vcmQgIT0gY3Vycl94Y29vcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmV2X3hjb29yZCAhPSBjdXJyX3hjb29yZCkKICAgICAgICAgIyB0aGUgbGFiZWwgd2lkZ2V0IHNob3VsZCBoYXZlIGJlZW4gcmVwb3NpdGlvbmVkIHRvbwogICAgICAgICBsaW5mb18yID0gbHNjYWxlLmxhYmVsLnBsYWNlX2luZm8oKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsc2NhbGUubGFiZWxbJ3RleHQnXSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3Vycl94Y29vcmQsIGludChsaW5mb18yWyd4J10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzY2FsZS5sYWJlbFsndGV4dCddLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJfeGNvb3JkLCBpbnQobGluZm9fMlsneCddKSkKICAgICAgICAgIyBjaGFuZ2UgdGhlIHJhbmdlIGJhY2sKICAgICAgICAgbHNjYWxlLnNjYWxlLmNvbmZpZ3VyZShmcm9tXz0wLCB0bz0xMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByZXZfeGNvb3JkICE9IGN1cnJfeGNvb3JkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwcmV2X3hjb29yZCwgaW50KGxpbmZvXzFbJ3gnXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmV2X3hjb29yZCAhPSBjdXJyX3hjb29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcmV2X3hjb29yZCwgaW50KGxpbmZvXzFbJ3gnXSkpCiAKICAgICAgICAgbHNjYWxlLmRlc3Ryb3koKQogCkBAIC0xNDUsMTYgKzE0NSwxNiBAQAogICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdXBkYXRlIGlzIG5lZWRlZCBzaW5jZSB0aGUgdGVzdCBkb2Vzbid0IHVzZSBtYWlubG9vcCwKICAgICAgICAgIyBhdCB0aGUgc2FtZSB0aW1lIHRoaXMgc2hvdWxkbid0IGFmZmVjdCB0ZXN0IG91dGNvbWUKICAgICAgICAgeC51cGRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHguc2NhbGUuY29vcmRzKClbMF0gPiBjdXJyX3hjb29yZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc2NhbGUuY29vcmRzKClbMF0gPiBjdXJyX3hjb29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNjYWxlLmNvb3JkcygpWzBdLAogICAgICAgICAgICAgaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pKQogCiAgICAgICAgICMgdmFsdWUgb3V0c2lkZSByYW5nZQogICAgICAgICB4LnZhbHVlID0geC5zY2FsZVsndG8nXSArIDEgIyBubyBjaGFuZ2VzIHNob3VsZG4ndCBoYXBwZW4KICAgICAgICAgeC51cGRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNjYWxlLmNvb3JkcygpWzBdLAogICAgICAgICAgICAgaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pKQogCiAgICAgICAgIHguZGVzdHJveSgpCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgeC52YWx1ZSA9IDMKICAgICAgICAgeC51cGRhdGUoKQogICAgICAgICB4Lm1hc3Rlci53bV9nZW9tZXRyeSgiJWR4JWQiICUgKHdpZHRoX25ldywgaGVpZ2h0X25ldykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGludCh4LmxhYmVsLnBsYWNlX2luZm8oKVsneCddKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoeC5sYWJlbC5wbGFjZV9pbmZvKClbJ3gnXSksCiAgICAgICAgICAgICB4LnNjYWxlLmNvb3JkcygpWzBdKQogCiAgICAgICAgICMgUmVzZXQgZ2VvbWV0cnkKQEAgLTE5NywyMCArMTk3LDIwIEBACiAgICAgICAgIG5hbWUgPSB2YXIuX25hbWUKICAgICAgICAgb3B0bWVudS51cGRhdGVfaWRsZXRhc2tzKCkKICAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0bWVudS50ay5nbG9iYWxnZXR2YXIobmFtZSksIHZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRtZW51LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgdmFyLmdldCgpKQogICAgICAgICBkZWwgdmFyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBvcHRtZW51LnRrLmdsb2JhbGdldHZhciwgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgb3B0bWVudS50ay5nbG9iYWxnZXR2YXIsIG5hbWUpCiAKIAogICAgIGRlZiB0ZXN0X2luaXRpYWxpemF0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHR0ay5PcHRpb25NZW51LCBOb25lLCBzZWxmLnRleHR2YXIsIGludmFsaWQ9J3RoaW5nJykKIAogICAgICAgICBvcHRtZW51ID0gdHRrLk9wdGlvbk1lbnUoTm9uZSwgc2VsZi50ZXh0dmFyLCAnYicsICdhJywgJ2InKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdG1lbnUuX3ZhcmlhYmxlLmdldCgpLCAnYicpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wdG1lbnVbJ21lbnUnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wdG1lbnVbJ3RleHR2YXJpYWJsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0bWVudVsnbWVudSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0bWVudVsndGV4dHZhcmlhYmxlJ10pCiAKICAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKIApAQCAtMjIyLDEwICsyMjIsMTAgQEAKICAgICAgICAgZm91bmRfZGVmYXVsdCA9IEZhbHNlCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgogICAgICAgICAgICAgdmFsdWUgPSBvcHRtZW51WydtZW51J10uZW50cnljZ2V0KGksICd2YWx1ZScpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZSwgaXRlbXNbaV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBpdGVtc1tpXSkKICAgICAgICAgICAgIGlmIHZhbHVlID09IGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgZm91bmRfZGVmYXVsdCA9IFRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvdW5kX2RlZmF1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZF9kZWZhdWx0KQogICAgICAgICBvcHRtZW51LmRlc3Ryb3koKQogCiAgICAgICAgICMgZGVmYXVsdCBzaG91bGRuJ3QgYmUgaW4gbWVudSBpZiBpdCBpcyBub3QgcGFydCBvZiB2YWx1ZXMKQEAgLTIzOCwyNiArMjM4LDI2IEBACiAgICAgICAgICAgICBpZiBsYXN0ID09IGN1cnI6CiAgICAgICAgICAgICAgICAgIyBubyBtb3JlIG1lbnUgZW50cmllcwogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihjdXJyID09IGRlZmF1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGN1cnIgPT0gZGVmYXVsdCkKICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpLCBsZW4oaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIGxlbihpdGVtcykpCiAKICAgICAgICAgIyBjaGVjayB0aGF0IHZhcmlhYmxlIGlzIHVwZGF0ZWQgY29ycmVjdGx5CiAgICAgICAgIG9wdG1lbnUucGFjaygpCiAgICAgICAgIG9wdG1lbnUud2FpdF92aXNpYmlsaXR5KCkKICAgICAgICAgb3B0bWVudVsnbWVudSddLmludm9rZSgwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgaXRlbXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0bWVudS5fdmFyaWFibGUuZ2V0KCksIGl0ZW1zWzBdKQogCiAgICAgICAgICMgY2hhbmdpbmcgdG8gYW4gaW52YWxpZCBpbmRleCBzaG91bGRuJ3QgY2hhbmdlIHRoZSB2YXJpYWJsZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgb3B0bWVudVsnbWVudSddLmludm9rZSwgLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG9wdG1lbnUuX3ZhcmlhYmxlLmdldCgpLCBpdGVtc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgb3B0bWVudVsnbWVudSddLmludm9rZSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0bWVudS5fdmFyaWFibGUuZ2V0KCksIGl0ZW1zWzBdKQogCiAgICAgICAgIG9wdG1lbnUuZGVzdHJveSgpCiAKICAgICAgICAgIyBzcGVjaWZ5aW5nIGEgY2FsbGJhY2sKICAgICAgICAgc3VjY2VzcyA9IFtdCiAgICAgICAgIGRlZiBjYl90ZXN0KGl0ZW0pOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbSwgaXRlbXNbMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIGl0ZW1zWzFdKQogICAgICAgICAgICAgc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkKICAgICAgICAgb3B0bWVudSA9IHR0ay5PcHRpb25NZW51KE5vbmUsIHNlbGYudGV4dHZhciwgJ2EnLCBjb21tYW5kPWNiX3Rlc3QsCiAgICAgICAgICAgICAqaXRlbXMpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKaW5kZXggYTFiMDg1NC4uZTUxNmZhNCAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQpAQCAtMjgsMTIgKzI4LDEyIEBACiAgICAgZGVmIHRlc3RfZm9ybWF0X29wdGRpY3Qoc2VsZik6CiAgICAgICAgIGRlZiBjaGVja19hZ2FpbnN0KGZtdF9vcHRzLCByZXN1bHQpOgogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGZtdF9vcHRzKSwgMik6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LnBvcChmbXRfb3B0c1tpXSksIGZtdF9vcHRzW2kgKyAxXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5wb3AoZm10X29wdHNbaV0pLCBmbXRfb3B0c1tpICsgMV0pCiAgICAgICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZXN1bHQgc3RpbGwgZ290IGVsZW1lbnRzOiAlcyIgJSByZXN1bHQpCiAKICAgICAgICAgIyBwYXNzaW5nIGFuIGVtcHR5IGRpY3Qgc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3QgKHR1cGxlIGhlcmUpCi0gICAgICAgIHNlbGYuZmFpbElmKHR0ay5fZm9ybWF0X29wdGRpY3Qoe30pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fZm9ybWF0X29wdGRpY3Qoe30pKQogCiAgICAgICAgICMgY2hlY2sgbGlzdCBmb3JtYXR0aW5nCiAgICAgICAgIGNoZWNrX2FnYWluc3QoCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICMgY2hlY2sgaWYgZ2l2aW5nIHVuaWNvZGUga2V5cyBpcyBmaW5lCiAgICAgICAgIGNoZWNrX2FnYWluc3QodHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzKSwge3UnLc6xzrLOsyc6IFRydWUsIHUnLcOhJzogRmFsc2V9KQogICAgICAgICAjIG9wdHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0cywgb3JpZ19vcHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIG9yaWdfb3B0cykKIAogICAgICAgICAjIHBhc3NpbmcgdmFsdWVzIHdpdGggc3BhY2VzIGluc2lkZSBhIHR1cGxlL2xpc3QKICAgICAgICAgY2hlY2tfYWdhaW5zdCgKQEAgLTczLDExMyArNzMsMTEzIEBACiAKICAgICAgICAgIyBpZ25vcmUgYW4gb3B0aW9uCiAgICAgICAgIGFtb3VudF9vcHRzID0gbGVuKHR0ay5fZm9ybWF0X29wdGRpY3Qob3B0cywgaWdub3JlPSh1J8OhJykpKSAvIDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYW1vdW50X29wdHMsIGxlbihvcHRzKSAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW1vdW50X29wdHMsIGxlbihvcHRzKSAtIDEpCiAKICAgICAgICAgIyBpZ25vcmUgbm9uLWV4aXN0aW5nIG9wdGlvbnMKICAgICAgICAgYW1vdW50X29wdHMgPSBsZW4odHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9KHUnw6EnLCAnYicpKSkgLyAyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFtb3VudF9vcHRzLCBsZW4ob3B0cykgLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFtb3VudF9vcHRzLCBsZW4ob3B0cykgLSAxKQogCiAgICAgICAgICMgaWdub3JlIGV2ZXJ5IG9wdGlvbgotICAgICAgICBzZWxmLmZhaWxJZih0dGsuX2Zvcm1hdF9vcHRkaWN0KG9wdHMsIGlnbm9yZT1vcHRzLmtleXMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9b3B0cy5rZXlzKCkpKQogCiAKICAgICBkZWYgdGVzdF9mb3JtYXRfbWFwZGljdChzZWxmKToKICAgICAgICAgb3B0cyA9IHsnYSc6IFsoJ2InLCAnYycsICd2YWwnKSwgKCdkJywgJ290aGVydmFsJyksICgnJywgJ3NpbmdsZScpXX0KICAgICAgICAgcmVzdWx0ID0gdHRrLl9mb3JtYXRfbWFwZGljdChvcHRzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzdWx0KSwgbGVuKG9wdHMua2V5cygpKSAqIDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgKCctYScsICd7YiBjfSB2YWwgZCBvdGhlcnZhbCB7fSBzaW5nbGUnKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdChvcHRzLCBzY3JpcHQ9VHJ1ZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIGxlbihvcHRzLmtleXMoKSkgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKCctYScsICd7YiBjfSB2YWwgZCBvdGhlcnZhbCB7fSBzaW5nbGUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KG9wdHMsIHNjcmlwdD1UcnVlKSwKICAgICAgICAgICAgICgnLWEnLCAne3tiIGN9IHZhbCBkIG90aGVydmFsIHt9IHNpbmdsZX0nKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KHsyOiBbXX0pLCAoJy0yJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QoezI6IFtdfSksICgnLTInLCAnJykpCiAKICAgICAgICAgb3B0cyA9IHt1J8O8w7HDrcSHw7Nkw6gnOiBbKHUnw6EnLCB1J3bDo2wnKV19CiAgICAgICAgIHJlc3VsdCA9IHR0ay5fZm9ybWF0X21hcGRpY3Qob3B0cykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAodSctw7zDscOtxIfDs2TDqCcsIHUnw6EgdsOjbCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKHUnLcO8w7HDrcSHw7Nkw6gnLCB1J8OhIHbDo2wnKSkKIAogICAgICAgICAjIGVtcHR5IHN0YXRlcwogICAgICAgICB2YWxpZCA9IHsnb3B0JzogWygnJywgdScnLCAnaGknKV19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLCAoJy1vcHQnLCAneyB9IGhpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksICgnLW9wdCcsICd7IH0gaGknKSkKIAogICAgICAgICAjIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBzdGF0ZXMsIHRoZXkgYWxsIG11c3QgYmUgc3RyaW5ncwogICAgICAgICBpbnZhbGlkID0geydvcHQnOiBbKDEsIDIsICd2YWxpZCB2YWwnKV19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHR0ay5fZm9ybWF0X21hcGRpY3QsIGludmFsaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgaW52YWxpZCkKICAgICAgICAgaW52YWxpZCA9IHsnb3B0JzogWyhbMV0sICcyJywgJ3ZhbGlkIHZhbCcpXX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgaW52YWxpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LCBpbnZhbGlkKQogICAgICAgICAjIGJ1dCB3aGVuIHBhc3NpbmcgYSBzaW5nbGUgc3RhdGUsIGl0IGNhbiBiZSBhbnl0aGluZwogICAgICAgICB2YWxpZCA9IHsnb3B0JzogW1sxLCAndmFsdWUnXV19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLCAoJy1vcHQnLCAnMSB2YWx1ZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLCAoJy1vcHQnLCAnMSB2YWx1ZScpKQogICAgICAgICAjIHNwZWNpYWwgYXR0ZW50aW9uIHRvIHNpbmdsZSBzdGF0ZXMgd2hpY2ggZXZhbHV0ZSB0byBGYWxzZQogICAgICAgICBmb3Igc3RhdGV2YWwgaW4gKE5vbmUsIDAsIEZhbHNlLCAnJywgc2V0KCkpOiAjIGp1c3Qgc29tZSBzYW1wbGVzCiAgICAgICAgICAgICB2YWxpZCA9IHsnb3B0JzogWyhzdGF0ZXZhbCwgJ3ZhbHVlJyldfQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLAogICAgICAgICAgICAgICAgICgnLW9wdCcsICd7fSB2YWx1ZScpKQogCiAgICAgICAgICMgdmFsdWVzIG11c3QgYmUgaXRlcmFibGUKICAgICAgICAgb3B0cyA9IHsnYSc6IE5vbmV9Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHR0ay5fZm9ybWF0X21hcGRpY3QsIG9wdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgb3B0cykKIAogICAgICAgICAjIGl0ZW1zIGluIHRoZSB2YWx1ZSBtdXN0IGhhdmUgc2l6ZSA+PSAyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LAogICAgICAgICAgICAgeydhJzogWygnaW52YWxpZCcsICldfSkKIAogCiAgICAgZGVmIHRlc3RfZm9ybWF0X2VsZW1jcmVhdGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKE5vbmUpLCAoTm9uZSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZShOb25lKSwgKE5vbmUsICgpKSkKIAogICAgICAgICAjIyBUZXN0aW5nIHR5cGUgPSBpbWFnZQogICAgICAgICAjIGltYWdlIHR5cGUgZXhwZWN0cyBhdCBsZWFzdCBhbiBpbWFnZSBuYW1lLCBzbyB0aGlzIHNob3VsZCByYWlzZQogICAgICAgICAjIEluZGV4RXJyb3Igc2luY2UgaXQgdHJpZXMgdG8gYWNjZXNzIHRoZSBpbmRleCAwIG9mIGFuIGVtcHR5IHR1cGxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlLCAnaW1hZ2UnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlLCAnaW1hZ2UnKQogCiAgICAgICAgICMgZG9uJ3QgZm9ybWF0IHJldHVybmVkIHZhbHVlcyBhcyBhIHRjbCBzY3JpcHQKICAgICAgICAgIyBtaW5pbXVtIGFjY2VwdGFibGUgZm9yIGltYWdlIHR5cGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcpLAogICAgICAgICAgICAgKCJ0ZXN0ICIsICgpKSkKICAgICAgICAgIyBzcGVjaWZpeW5nIGEgc3RhdGUgc3BlYwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCcnLCAnYScpKSwgKCJ0ZXN0IHt9IGEiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InLCAnYycpKSwgKCJ0ZXN0IHthIGJ9IGMiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyBhbmQgb3B0aW9ucwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InKSwgYT0neCcsIGI9J3knKSwgKCJ0ZXN0IGEgYiIsICgiLWEiLCAieCIsICItYiIsICJ5IikpKQogICAgICAgICAjIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CiAgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcyBhbmQgYW4gb3B0aW9uIHdpdGggYSBtdWx0aXZhbHVlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgVHJ1ZSwgJ3Rlc3QnLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgVHJ1ZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InLCAnYycsICdkJyksIHg9WzIsIDNdKSwgKCJ7dGVzdCB7YSBiIGN9IGR9IiwgIi14IHsyIDN9IikpCiAKICAgICAgICAgIyMgVGVzdGluZyB0eXBlID0gdnNhcGkKICAgICAgICAgIyB2c2FwaSB0eXBlIGV4cGVjdHMgYXQgbGVhc3QgYSBjbGFzcyBuYW1lIGFuZCBhIHBhcnRfaWQsIHNvIHRoaXMKICAgICAgICAgIyBzaG91bGQgcmFpc2UgYW4gVmFsdWVFcnJvciBzaW5jZSBpdCB0cmllcyB0byBnZXQgdHdvIGVsZW1lbnRzIGZyb20KICAgICAgICAgIyBhbiBlbXB0eSB0dXBsZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ3ZzYXBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ3ZzYXBpJykKIAogICAgICAgICAjIGRvbid0IGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CiAgICAgICAgICMgbWluaW11bSBhY2NlcHRhYmxlIGZvciB2c2FwaQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBGYWxzZSwgJ2EnLCAnYicpLAogICAgICAgICAgICAgKCJhIGIgIiwgKCkpKQogICAgICAgICAjIG5vdyB3aXRoIGEgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJywKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJywKICAgICAgICAgICAgICgnYScsICdiJywgJ2MnKSksICgiYSBiIHthIGJ9IGMiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyBhbmQgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgRmFsc2UsICdhJywgJ2InLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgRmFsc2UsICdhJywgJ2InLAogICAgICAgICAgICAgKCdhJywgJ2InKSwgb3B0PSd4JyksICgiYSBiIGEgYiIsICgiLW9wdCIsICJ4IikpKQogICAgICAgICAjIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CiAgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIGEgbXVsdGl2YWx1ZSBhbmQgYW4gb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgVHJ1ZSwgJ2EnLCAnYicsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBUcnVlLCAnYScsICdiJywKICAgICAgICAgICAgICgnYScsICdiJywgWzEsIDJdKSwgb3B0PSd4JyksICgie2EgYiB7YSBifSB7MSAyfX0iLCAiLW9wdCB4IikpCiAKICAgICAgICAgIyBUZXN0aW5nIHR5cGUgPSBmcm9tCiAgICAgICAgICMgZnJvbSB0eXBlIGV4cGVjdHMgYXQgbGVhc3QgYSB0eXBlIG5hbWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUsICdmcm9tJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ2Zyb20nKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdmcm9tJywgRmFsc2UsICdhJyksCiAgICAgICAgICAgICAoJ2EnLCAoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnLCAnYicpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnLCAnYicpLAogICAgICAgICAgICAgKCdhJywgKCdiJywgKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBUcnVlLCAnYScsICdiJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnZnJvbScsIFRydWUsICdhJywgJ2InKSwKICAgICAgICAgICAgICgne2F9JywgJ2InKSkKIAogCkBAIC0yMDgsNzUgKzIwOCw3NSBAQAogICAgICAgICAgICAgICAgICAgICBzcGFjZXMoMiAqIGluZGVudF9zaXplKSwgc3BhY2VzKGluZGVudF9zaXplKSwgc3BhY2VzKCkpKQogCiAgICAgICAgICMgZW1wdHkgbGF5b3V0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2xheW91dGxpc3QoW10pWzBdLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0KFtdKVswXSwgJycpCiAKICAgICAgICAgIyBzbWFsbGVzdCAoYWZ0ZXIgYW4gZW1wdHkgb25lKSBhY2NlcHRhYmxlIGxheW91dAogICAgICAgICBzbWFsbGVzdCA9IHR0ay5fZm9ybWF0X2xheW91dGxpc3QoWygnYScsIE5vbmUpXSwgaW5kZW50PTApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNtYWxsZXN0LAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtYWxsZXN0LAogICAgICAgICAgICAgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdChbKCdhJywgJycpXSwgaW5kZW50PTApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzbWFsbGVzdFswXSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtYWxsZXN0WzBdLCAnYScpCiAKICAgICAgICAgIyB0ZXN0aW5nIGluZGVudGF0aW9uIGxldmVscwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzYW1wbGUoKSwgc2FtcGxlX2V4cGVjdGVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlKCksIHNhbXBsZV9leHBlY3RlZCgpKQogICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNhbXBsZShpKSwgc2FtcGxlX2V4cGVjdGVkKGkpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2FtcGxlKGksIGkpLCBzYW1wbGVfZXhwZWN0ZWQoaSwgaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXBsZShpKSwgc2FtcGxlX2V4cGVjdGVkKGkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wbGUoaSwgaSksIHNhbXBsZV9leHBlY3RlZChpLCBpKSkKIAogICAgICAgICAjIGludmFsaWQgbGF5b3V0IGZvcm1hdCwgZGlmZmVyZW50IGtpbmQgb2YgZXhjZXB0aW9ucyB3aWxsIGJlCiAgICAgICAgICMgcmFpc2VkCiAKICAgICAgICAgIyBwbGFpbiB3cm9uZyBmb3JtYXQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fZm9ybWF0X2xheW91dGxpc3QsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fZm9ybWF0X2xheW91dGxpc3QsCiAgICAgICAgICAgICBbJ2JhZCcsICdmb3JtYXQnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LCBOb25lKQogICAgICAgICAjIF9mb3JtYXRfbGF5b3V0bGlzdCBhbHdheXMgZXhwZWN0cyB0aGUgc2Vjb25kIGl0ZW0gKGluIGV2ZXJ5IGl0ZW0pCiAgICAgICAgICMgdG8gYWN0IGxpa2UgYSBkaWN0IChleGNlcHQgd2hlbiB0aGUgdmFsdWUgZXZhbHV0ZXMgdG8gRmFsc2UpLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLAogICAgICAgICAgICAgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCwgWygnYScsICdiJyldKQogICAgICAgICAjIGJhZCBjaGlsZHJlbiBmb3JtYXR0aW5nCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LAogICAgICAgICAgICAgWygnbmFtZScsIHsnY2hpbGRyZW4nOiB7J2EnOiBOb25lfX0pXSkKIAogCiAgICAgZGVmIHRlc3Rfc2NyaXB0X2Zyb21fc2V0dGluZ3Moc2VsZik6CiAgICAgICAgICMgZW1wdHkgb3B0aW9ucwotICAgICAgICBzZWxmLmZhaWxJZih0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncyh7J25hbWUnOgogICAgICAgICAgICAgeydjb25maWd1cmUnOiBOb25lLCAnbWFwJzogTm9uZSwgJ2VsZW1lbnQgY3JlYXRlJzogTm9uZX19KSkKIAogICAgICAgICAjIGVtcHR5IGxheW91dAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzogeydsYXlvdXQnOiBOb25lfX0pLAogICAgICAgICAgICAgInR0azo6c3R5bGUgbGF5b3V0IG5hbWUge1xubnVsbFxufSIpCiAKICAgICAgICAgY29uZmlnZGljdCA9IHt1J86xzrLOsyc6IFRydWUsIHUnw6EnOiBGYWxzZX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6IHsnY29uZmlndXJlJzogY29uZmlnZGljdH19KSkKIAogICAgICAgICBtYXBkaWN0ID0ge3Unw7zDscOtxIfDs2TDqCc6IFsodSfDoScsIHUndsOjbCcpXX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6IHsnbWFwJzogbWFwZGljdH19KSkKIAogICAgICAgICAjIGludmFsaWQgaW1hZ2UgZWxlbWVudAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwKICAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MsIHsnbmFtZSc6IHsnZWxlbWVudCBjcmVhdGUnOiBbJ2ltYWdlJ119fSkKIAogICAgICAgICAjIG1pbmltYWwgdmFsaWQgaW1hZ2UKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzoKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzoKICAgICAgICAgICAgIHsnZWxlbWVudCBjcmVhdGUnOiBbJ2ltYWdlJywgJ25hbWUnXX19KSkKIAogICAgICAgICBpbWFnZSA9IHsndGhpbmcnOiB7J2VsZW1lbnQgY3JlYXRlJzoKICAgICAgICAgICAgIFsnaW1hZ2UnLCAnbmFtZScsICgnc3RhdGUxJywgJ3N0YXRlMicsICd2YWwnKV19fQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKICAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIpCiAKICAgICAgICAgaW1hZ2VbJ3RoaW5nJ11bJ2VsZW1lbnQgY3JlYXRlJ10uYXBwZW5kKHsnb3B0JzogMzB9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKICAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIKICAgICAgICAgICAgICItb3B0IDMwIikKIAogICAgICAgICBpbWFnZVsndGhpbmcnXVsnZWxlbWVudCBjcmVhdGUnXVstMV1bJ29wdCddID0gW01vY2tUY2xPYmooMyksCiAgICAgICAgICAgICBNb2NrVGNsT2JqKCcybScpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKICAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIKICAgICAgICAgICAgICItb3B0IHszIDJtfSIpCiAKQEAgLTI4NCwyOCArMjg0LDI4IEBACiAgICAgZGVmIHRlc3RfZGljdF9mcm9tX3RjbHR1cGxlKHNlbGYpOgogICAgICAgICBmYWtldHR1cGxlID0gKCctYScsICd7MSAyIDN9JywgJy1zb21ldGhpbmcnLCAnZm9vJykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2RpY3RfZnJvbV90Y2x0dXBsZShmYWtldHR1cGxlLCBGYWxzZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSwgRmFsc2UpLAogICAgICAgICAgICAgeyctYSc6ICd7MSAyIDN9JywgJy1zb21ldGhpbmcnOiAnZm9vJ30pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSksCiAgICAgICAgICAgICB7J2EnOiAnezEgMiAzfScsICdzb21ldGhpbmcnOiAnZm9vJ30pCiAKICAgICAgICAgIyBwYXNzaW5nIGEgdHVwbGUgd2l0aCBhIHNpbmdsZSBpdGVtIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgZGljdCwKICAgICAgICAgIyBzaW5jZSBpdCB0cmllcyB0byBicmVhayB0aGUgdHVwbGUgYnkgcGFpcnMuCi0gICAgICAgIHNlbGYuZmFpbElmKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKCgnc2luZ2xlJywgKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKCdzaW5nbGUnLCApKSkKIAogICAgICAgICBzc3BlYyA9IE1vY2tTdGF0ZVNwZWMoJ2EnLCAnYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKCgnLWEnLCAoc3NwZWMsICd2YWwnKSkpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKCgnLWEnLCAoc3NwZWMsICd2YWwnKSkpLAogICAgICAgICAgICAgeydhJzogWygnYScsICdiJywgJ3ZhbCcpXX0pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKE1vY2tUY2xPYmooJy1wYWRkaW5nJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKE1vY2tUY2xPYmooJy1wYWRkaW5nJyksCiAgICAgICAgICAgICBbTW9ja1RjbE9iaignMScpLCAyLCBNb2NrVGNsT2JqKCczbScpXSkpLAogICAgICAgICAgICAgeydwYWRkaW5nJzogWzEsIDIsICczbSddfSkKIAogCiAgICAgZGVmIHRlc3RfbGlzdF9mcm9tX3N0YXRlc3BlYyhzZWxmKToKICAgICAgICAgZGVmIHRlc3RfaXQoc3NwZWMsIHZhbHVlLCByZXNfdmFsdWUsIHN0YXRlcyk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2xpc3RfZnJvbV9zdGF0ZXNwZWMoCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX3N0YXRlc3BlYygKICAgICAgICAgICAgICAgICAoc3NwZWMsIHZhbHVlKSksIFtzdGF0ZXMgKyAocmVzX3ZhbHVlLCApXSkKIAogICAgICAgICBzdGF0ZXNfZXZlbiA9IHR1cGxlKCdzdGF0ZSVkJyAlIGkgZm9yIGkgaW4gcmFuZ2UoNikpCkBAIC0zMjIsMTkgKzMyMiwxOSBAQAogCiAgICAgZGVmIHRlc3RfbGlzdF9mcm9tX2xheW91dHR1cGxlKHNlbGYpOgogICAgICAgICAjIGVtcHR5IGxheW91dCB0dXBsZQotICAgICAgICBzZWxmLmZhaWxJZih0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUoKCkpKQogCiAgICAgICAgICMgc2hvcnRlc3QgbGF5b3V0IHR1cGxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKCgnbmFtZScsICkpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKCgnbmFtZScsICkpLAogICAgICAgICAgICAgWygnbmFtZScsIHt9KV0pCiAKICAgICAgICAgIyBub3Qgc28gaW50ZXJlc3RpbmcgbHR1cGxlCiAgICAgICAgIHNhbXBsZV9sdHVwbGUgPSAoJ25hbWUnLCAnLW9wdGlvbicsICd2YWx1ZScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKHNhbXBsZV9sdHVwbGUpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKHNhbXBsZV9sdHVwbGUpLAogICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ3ZhbHVlJ30pXSkKIAogICAgICAgICAjIGVtcHR5IGNoaWxkcmVuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKAogICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJywgKCkpKSwKICAgICAgICAgICAgIFsoJ3NvbWV0aGluZycsIHsnY2hpbGRyZW4nOiBbXX0pXQogICAgICAgICApCkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICApCiAgICAgICAgICkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUobHR1cGxlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShsdHVwbGUpLAogICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ25pY2VvbmUnLCAnY2hpbGRyZW4nOgogICAgICAgICAgICAgICAgIFsoJ290aGVyb25lJywgeydvdGhlcm9wdCc6ICdvdGhlcnZhbHVlJywgJ2NoaWxkcmVuJzoKICAgICAgICAgICAgICAgICAgICAgWygnY2hpbGQnLCB7fSldCkBAIC0zNTYsMTMgKzM1NiwxMyBAQAogICAgICAgICApCiAKICAgICAgICAgIyBiYWQgdHVwbGVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCiAgICAgICAgICAgICAoJ25hbWUnLCAnbm9fbWludXMnKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKICAgICAgICAgICAgICgnbmFtZScsICdub19taW51cycsICd2YWx1ZScpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAogICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJykpICMgbm8gY2hpbGRyZW4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKICAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicsICd2YWx1ZScpKSAjIGludmFsaWQgY2hpbGRyZW4KIAogCkBAIC0zNzMsMTAgKzM3MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIChvcHQsIHZhbCkKIAogICAgICAgICBvcHRpb25zID0geyd0ZXN0JzogTm9uZX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl92YWxfb3JfZGljdChvcHRpb25zLCBmdW5jKSwgInRlc3QgdmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCAidGVzdCB2YWwiKQogCiAgICAgICAgIG9wdGlvbnMgPSB7J3Rlc3QnOiAzfQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCBvcHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fdmFsX29yX2RpY3Qob3B0aW9ucywgZnVuYyksIG9wdGlvbnMpCiAKIAogICAgIGRlZiB0ZXN0X2NvbnZlcnRfc3RyaW5ndmFsKHNlbGYpOgpAQCAtMzg1LDEwICszODUsMTAgQEAKICAgICAgICAgICAgIChOb25lLCAnTm9uZScpCiAgICAgICAgICkKICAgICAgICAgZm9yIG9yaWcsIGV4cGVjdGVkIGluIHRlc3RzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9jb252ZXJ0X3N0cmluZ3ZhbChvcmlnKSwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fY29udmVydF9zdHJpbmd2YWwob3JpZyksIGV4cGVjdGVkKQogCiAgICAgICAgIGlmIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSA9PSAnYXNjaWknOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKICAgICAgICAgICAgICAgICB0dGsuX2NvbnZlcnRfc3RyaW5ndmFsLCAnw6EnKQogCiAKQEAgLTM5NiwyNyArMzk2LDI3IEBACiAKICAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgogICAgICAgICBhZGljdCA9IHsnb3B0JzogdSd2w6Rsw7rDqCd9Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiB1J3bDpGzDusOoJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLCB7J29wdCc6IHUndsOkbMO6w6gnfSkKIAogICAgICAgICBhZGljdFsnb3B0J10gPSBNb2NrVGNsT2JqKGFkaWN0WydvcHQnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLCB7J29wdCc6IHUndsOkbMO6w6gnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogdSd2w6Rsw7rDqCd9KQogCiAgICAgZGVmIHRlc3RfbXVsdGl2YWx1ZXMoc2VsZik6CiAgICAgICAgIGFkaWN0ID0geydvcHQnOiBbMSwgMiwgMywgNF19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiBbMSwgMiwgMywgNF19KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiBbMSwgMiwgMywgNF19KQogCiAgICAgICAgIGFkaWN0WydvcHQnXSA9IFsxLCAneG0nLCAzXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogWzEsICd4bScsIDNdfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogWzEsICd4bScsIDNdfSkKIAogICAgICAgICBhZGljdFsnb3B0J10gPSAoTW9ja1N0YXRlU3BlYygnYScsICdiJyksIHUndsOhbMWpw6gnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLAogICAgICAgICAgICAgeydvcHQnOiBbKCdhJywgJ2InLCB1J3bDoWzFqcOoJyldfSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weSh7J3gnOiBbJ3kgeiddfSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoeyd4JzogWyd5IHonXX0pLAogICAgICAgICAgICAgeyd4JzogWyd5IHonXX0pCiAKICAgICBkZWYgdGVzdF9ub3NwbGl0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weSh7J3RleHQnOiAnc29tZSB0ZXh0J30pLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KHsndGV4dCc6ICdzb21lIHRleHQnfSksCiAgICAgICAgICAgICB7J3RleHQnOiAnc29tZSB0ZXh0J30pCiAKIHRlc3RzX25vZ3VpID0gKEludGVybmFsRnVuY3Rpb25zVGVzdCwgVGNsT2Jqc1RvUHlUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQppbmRleCBhYjM1NTRkLi42MzBlMDc1IDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQorKysgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQpAQCAtMTYsMTcgKzE2LDE3IEBACiAgICAgZGVmIHRlc3RfY29uZmlndXJlKHNlbGYpOgogICAgICAgICBzdHlsZSA9IHNlbGYuc3R5bGUKICAgICAgICAgc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgYmFja2dyb3VuZD0neWVsbG93JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5jb25maWd1cmUoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcpLAogICAgICAgICAgICAgJ3llbGxvdycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHN0eWxlLmNvbmZpZ3VyZSgnVEJ1dHRvbicpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJyksIGRpY3QpKQogCiAKICAgICBkZWYgdGVzdF9tYXAoc2VsZik6CiAgICAgICAgIHN0eWxlID0gc2VsZi5zdHlsZQogICAgICAgICBzdHlsZS5tYXAoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPVsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0eWxlLm1hcCgnVEJ1dHRvbicsICdiYWNrZ3JvdW5kJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubWFwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwKICAgICAgICAgICAgIFsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHN0eWxlLm1hcCgnVEJ1dHRvbicpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUubWFwKCdUQnV0dG9uJyksIGRpY3QpKQogCiAKICAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CkBAIC0zNCwzOCArMzQsMzggQEAKICAgICAgICAgc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgYmFja2dyb3VuZD0neWVsbG93JykKICAgICAgICAgc3R5bGUubWFwKCdUQnV0dG9uJywgYmFja2dyb3VuZD1bKCdhY3RpdmUnLCAnYmFja2dyb3VuZCcsICdibHVlJyldKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0eWxlLmxvb2t1cCgnVEJ1dHRvbicsICdiYWNrZ3JvdW5kJyksICd5ZWxsb3cnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHlsZS5sb29rdXAoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwgJ3llbGxvdycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnLAogICAgICAgICAgICAgWydhY3RpdmUnLCAnYmFja2dyb3VuZCddKSwgJ2JsdWUnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHlsZS5sb29rdXAoJ1RCdXR0b24nLCAnb3B0aW9ubm90ZGVmaW5lZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ29wdGlvbm5vdGRlZmluZWQnLAogICAgICAgICAgICAgZGVmYXVsdD0naWtuZXdpdCcpLCAnaWtuZXdpdCcpCiAKIAogICAgIGRlZiB0ZXN0X2xheW91dChzZWxmKToKICAgICAgICAgc3R5bGUgPSBzZWxmLnN0eWxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzdHlsZS5sYXlvdXQsICdOb3RBTGF5b3V0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc3R5bGUubGF5b3V0LCAnTm90QUxheW91dCcpCiAgICAgICAgIHR2X3N0eWxlID0gc3R5bGUubGF5b3V0KCdUcmVldmlldycpCiAKICAgICAgICAgIyAiZXJhc2UiIFRyZWV2aWV3IGxheW91dAogICAgICAgICBzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JywgJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JyksCiAgICAgICAgICAgICBbKCdudWxsJywgeydzdGlja3knOiAnbnN3ZSd9KV0KICAgICAgICAgKQogCiAgICAgICAgICMgcmVzdG9yZSBsYXlvdXQKICAgICAgICAgc3R5bGUubGF5b3V0KCdUcmVldmlldycsIHR2X3N0eWxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JyksIHR2X3N0eWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwgdHZfc3R5bGUpCiAKICAgICAgICAgIyBzaG91bGQgcmV0dXJuIGEgbGlzdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzdHlsZS5sYXlvdXQoJ1RCdXR0b24nKSwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN0eWxlLmxheW91dCgnVEJ1dHRvbicpLCBsaXN0KSkKIAogICAgICAgICAjIGNvcnJlY3QgbGF5b3V0LCBidXQgIm9wdGlvbiIgZG9lc24ndCBleGlzdCBhcyBvcHRpb24KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHN0eWxlLmxheW91dCwgJ1RyZWV2aWV3JywKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc3R5bGUubGF5b3V0LCAnVHJlZXZpZXcnLAogICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ2luZXhpc3RlbnQnfSldKQogCiAKICAgICBkZWYgdGVzdF90aGVtZV91c2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnN0eWxlLnRoZW1lX3VzZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5zdHlsZS50aGVtZV91c2UsCiAgICAgICAgICAgICAnbm9uZXhpc3RpbmduYW1lJykKIAogICAgICAgICBjdXJyX3RoZW1lID0gc2VsZi5zdHlsZS50aGVtZV91c2UoKQpAQCAtNzksOCArNzksOCBAQAogICAgICAgICAgICAgIyBqdXN0IG9uZSB0aGVtZSBhdmFpbGFibGUsIGNhbid0IGdvIG9uIHdpdGggdGVzdHMKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIHNlbGYuZmFpbElmKGN1cnJfdGhlbWUgPT0gbmV3X3RoZW1lKQotICAgICAgICBzZWxmLmZhaWxJZihuZXdfdGhlbWUgIT0gc2VsZi5zdHlsZS50aGVtZV91c2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjdXJyX3RoZW1lID09IG5ld190aGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdfdGhlbWUgIT0gc2VsZi5zdHlsZS50aGVtZV91c2UoKSkKIAogICAgICAgICBzZWxmLnN0eWxlLnRoZW1lX3VzZShjdXJyX3RoZW1lKQogCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCA0ZjZmNDRkLi42Y2YwNDBjIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHkKQEAgLTI0LDQ4ICsyNCw0OCBAQAogCiAgICAgZGVmIHRlc3RfaWRlbnRpZnkoc2VsZik6CiAgICAgICAgIHNlbGYud2lkZ2V0LnVwZGF0ZV9pZGxldGFza3MoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLndpZGdldC5pZGVudGlmeSg1LCA1KSwgImxhYmVsIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoNSwgNSksICJsYWJlbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0LmlkZW50aWZ5LCBOb25lLCA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaWRlbnRpZnksIDUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pZGVudGlmeSwgNSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0LmlkZW50aWZ5LCBOb25lLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pZGVudGlmeSwgNSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaWRlbnRpZnksIDUsICcnKQogCiAKICAgICBkZWYgdGVzdF93aWRnZXRfc3RhdGUoc2VsZik6CiAgICAgICAgICMgWFhYIG5vdCBzdXJlIGFib3V0IHRoZSBwb3J0YWJpbGl0eSBvZiBhbGwgdGhlc2UgdGVzdHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoKSwgKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0Lmluc3RhdGUoWychZGlzYWJsZWQnXSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaW5zdGF0ZShbJyFkaXNhYmxlZCddKSwgVHJ1ZSkKIAogICAgICAgICAjIGNoYW5naW5nIGZyb20gIWRpc2FibGVkIHRvIGRpc2FibGVkCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgnIWRpc2FibGVkJywgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJ2Rpc2FibGVkJ10pLCAoJyFkaXNhYmxlZCcsICkpCiAgICAgICAgICMgbm8gc3RhdGUgY2hhbmdlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgpKQogICAgICAgICAjIGNoYW5nZSBiYWNrIHRvICFkaXNhYmxlIGJ1dCBhbHNvIGFjdGl2ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJyFkaXNhYmxlZCcsICdhY3RpdmUnXSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWychZGlzYWJsZWQnLCAnYWN0aXZlJ10pLAogICAgICAgICAgICAgKCchYWN0aXZlJywgJ2Rpc2FibGVkJykpCiAgICAgICAgICMgbm8gc3RhdGUgY2hhbmdlcywgYWdhaW4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWychZGlzYWJsZWQnLCAnYWN0aXZlJ10pLCAoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWydhY3RpdmUnLCAnIWRpc2FibGVkJ10pLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJyFkaXNhYmxlZCcsICdhY3RpdmUnXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnYWN0aXZlJywgJyFkaXNhYmxlZCddKSwgKCkpCiAKICAgICAgICAgZGVmIHRlc3RfY2IoYXJnMSwgKiprdyk6CiAgICAgICAgICAgICByZXR1cm4gYXJnMSwga3cKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuaW5zdGF0ZShbJyFkaXNhYmxlZCddLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0Lmluc3RhdGUoWychZGlzYWJsZWQnXSwKICAgICAgICAgICAgIHRlc3RfY2IsICJoaSIsICoqeyJtc2ciOiAidGhlcmUifSksCiAgICAgICAgICAgICAoJ2hpJywgeydtc2cnOiAndGhlcmUnfSkpCiAKICAgICAgICAgIyBhdHRlbXB0IHRvIHNldCBpbnZhbGlkIHN0YXRlc3BlYwogICAgICAgICBjdXJyc3RhdGUgPSBzZWxmLndpZGdldC5zdGF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pbnN0YXRlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pbnN0YXRlLAogICAgICAgICAgICAgWydiYWRzdGF0ZSddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaW5zdGF0ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaW5zdGF0ZSwKICAgICAgICAgICAgIFsnZGlzYWJsZWQnLCAnYmFkc3RhdGUnXSkKICAgICAgICAgIyB2ZXJpZnkgdGhhdCB3aWRnZXQgZGlkbid0IGNoYW5nZSBpdHMgc3RhdGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3VycnN0YXRlLCBzZWxmLndpZGdldC5zdGF0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJzdGF0ZSwgc2VsZi53aWRnZXQuc3RhdGUoKSkKIAogICAgICAgICAjIGVuc3VyaW5nIHRoYXQgcGFzc2luZyBOb25lIGFzIHN0YXRlIGRvZXNuJ3QgbW9kaWZ5IGN1cnJlbnQgc3RhdGUKICAgICAgICAgc2VsZi53aWRnZXQuc3RhdGUoWydhY3RpdmUnLCAnIWRpc2FibGVkJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKCksICgnYWN0aXZlJywgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZSgpLCAoJ2FjdGl2ZScsICkpCiAKIAogY2xhc3MgQnV0dG9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgIHN1Y2Nlc3MgPSBbXQogICAgICAgICBidG4gPSB0dGsuQnV0dG9uKGNvbW1hbmQ9bGFtYmRhOiBzdWNjZXNzLmFwcGVuZCgxKSkKICAgICAgICAgYnRuLmludm9rZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdWNjZXNzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKIAogCiBjbGFzcyBDaGVja2J1dHRvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtODgsMjEgKzg4LDIxIEBACiAgICAgICAgIGNidG4gPSB0dGsuQ2hlY2tidXR0b24oY29tbWFuZD1jYl90ZXN0KQogICAgICAgICAjIHRoZSB2YXJpYWJsZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdHRrLkNoZWNrYnV0dG9uIGlzIGFjdHVhbGx5CiAgICAgICAgICMgdW5kZWZpbmVkIHRpbGwgd2UgaW52b2tlIHRoZSBDaGVja2J1dHRvbgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYnRuLnN0YXRlKCksICgnYWx0ZXJuYXRlJywgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIGNidG4udGsuZ2xvYmFsZ2V0dmFyLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG4uc3RhdGUoKSwgKCdhbHRlcm5hdGUnLCApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBjYnRuLnRrLmdsb2JhbGdldHZhciwKICAgICAgICAgICAgIGNidG5bJ3ZhcmlhYmxlJ10pCiAKICAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNidG5bJ29udmFsdWUnXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0blsnb252YWx1ZSddLAogICAgICAgICAgICAgY2J0bi50ay5nbG9iYWxnZXR2YXIoY2J0blsndmFyaWFibGUnXSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdWNjZXNzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKIAogICAgICAgICBjYnRuWydjb21tYW5kJ10gPSAnJwogICAgICAgICByZXMgPSBjYnRuLmludm9rZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgJycpCi0gICAgICAgIHNlbGYuZmFpbElmKGxlbihzdWNjZXNzKSA+IDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNidG5bJ29mZnZhbHVlJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oc3VjY2VzcykgPiAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG5bJ29mZnZhbHVlJ10sCiAgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKIAogCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICAgICAgc2VsZi5jb21iby5ldmVudF9nZW5lcmF0ZSgnPFJldHVybj4nKQogICAgICAgICBzZWxmLmNvbWJvLnVwZGF0ZSgpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAKICAgICBkZWYgdGVzdF9wb3N0Y29tbWFuZChzZWxmKToKQEAgLTE0OSwxOCArMTQ5LDE4IEBACiAgICAgICAgIHNlbGYuY29tYm8ud2FpdF92aXNpYmlsaXR5KCkKIAogICAgICAgICBzZWxmLl9zaG93X2Ryb3BfZG93bl9saXN0Ym94KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAgICAgICAgICMgdGVzdGluZyBwb3N0Y29tbWFuZCByZW1vdmFsCiAgICAgICAgIHNlbGYuY29tYm9bJ3Bvc3Rjb21tYW5kJ10gPSAnJwogICAgICAgICBzZWxmLl9zaG93X2Ryb3BfZG93bl9saXN0Ym94KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKIAogCiAgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgogICAgICAgICBkZWYgY2hlY2tfZ2V0X2N1cnJlbnQoZ2V0dmFsLCBjdXJydmFsKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29tYm8uZ2V0KCksIGdldHZhbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29tYm8uY3VycmVudCgpLCBjdXJydmFsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvLmdldCgpLCBnZXR2YWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm8uY3VycmVudCgpLCBjdXJydmFsKQogCiAgICAgICAgIGNoZWNrX2dldF9jdXJyZW50KCcnLCAtMSkKIApAQCAtMTgyLDE3ICsxODIsMTcgQEAKIAogICAgICAgICAjIHRlc3RpbmcgdmFsdWVzIHdpdGggZW1wdHkgc3RyaW5nIHNldCB0aHJvdWdoIGNvbmZpZ3VyZQogICAgICAgICBzZWxmLmNvbWJvLmNvbmZpZ3VyZSh2YWx1ZXM9WzEsICcnLCAyXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sICgnMScsICcnLCAnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm9bJ3ZhbHVlcyddLCAoJzEnLCAnJywgJzInKSkKIAogICAgICAgICAjIG91dCBvZiByYW5nZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5jb21iby5jdXJyZW50LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsCiAgICAgICAgICAgICBsZW4oc2VsZi5jb21ib1sndmFsdWVzJ10pKQogICAgICAgICAjIGl0IGV4cGVjdHMgYW4gaW50ZWdlciAob3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsICcnKQogCiAgICAgICAgICMgdGVzdGluZyBjcmVhdGluZyBjb21ib2JveCB3aXRoIGVtcHR5IHN0cmluZyBpbiB2YWx1ZXMKICAgICAgICAgY29tYm8yID0gdHRrLkNvbWJvYm94KHZhbHVlcz1bMSwgMiwgJyddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjb21ibzJbJ3ZhbHVlcyddLCAoJzEnLCAnMicsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21ibzJbJ3ZhbHVlcyddLCAoJzEnLCAnMicsICcnKSkKICAgICAgICAgY29tYm8yLmRlc3Ryb3koKQogCiAKQEAgLTIwOCwxMiArMjA4LDEyIEBACiAKIAogICAgIGRlZiB0ZXN0X2Jib3goc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihzZWxmLmVudHJ5LmJib3goMCkpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmVudHJ5LmJib3goMCkpLCA0KQogICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJ5LmJib3goMCk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShpdGVtLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoaXRlbSwgaW50KSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5iYm94LCAnbm9pbmRleCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmJib3gsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkuYmJveCwgJ25vaW5kZXgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmJib3gsIE5vbmUpCiAKIAogICAgIGRlZiB0ZXN0X2lkZW50aWZ5KHNlbGYpOgpAQCAtMjIxLDEyICsyMjEsMTIgQEAKICAgICAgICAgc2VsZi5lbnRyeS53YWl0X3Zpc2liaWxpdHkoKQogICAgICAgICBzZWxmLmVudHJ5LnVwZGF0ZV9pZGxldGFza3MoKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuaWRlbnRpZnkoNSwgNSksICJ0ZXh0YXJlYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5pZGVudGlmeSg1LCA1KSwgInRleHRhcmVhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LmlkZW50aWZ5KC0xLCAtMSksICIiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCBOb25lLCA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5pZGVudGlmeSwgNSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkuaWRlbnRpZnksIDUsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCBOb25lLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCA1LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCA1LCAnJykKIAogCiAgICAgZGVmIHRlc3RfdmFsaWRhdGlvbl9vcHRpb25zKHNlbGYpOgpAQCAtMjM4LDIzICsyMzgsMjMgQEAKIAogICAgICAgICBzZWxmLmVudHJ5WydpbnZhbGlkY29tbWFuZCddID0gdGVzdF9pbnZhbGlkCiAgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3VjY2VzcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCiAKICAgICAgICAgc2VsZi5lbnRyeVsnaW52YWxpZGNvbW1hbmQnXSA9ICcnCiAgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oc3VjY2VzcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQogCiAgICAgICAgIHNlbGYuZW50cnlbJ2ludmFsaWRjb21tYW5kJ10gPSB0ZXN0X2ludmFsaWQKICAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSBsYW1iZGE6IFRydWUKICAgICAgICAgc2VsZi5lbnRyeS52YWxpZGF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihzdWNjZXNzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3VjY2VzcyksIDEpCiAKICAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSAnJwogICAgICAgICBzZWxmLmVudHJ5LnZhbGlkYXRlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKIAogICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IFRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkudmFsaWRhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkudmFsaWRhdGUpCiAKIAogICAgIGRlZiB0ZXN0X3ZhbGlkYXRpb24oc2VsZik6CkBAIC0yNzEsOCArMjcxLDggQEAKIAogICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgMSkKICAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoJ2VuZCcsICdhJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsaWRhdGlvbiwgW0ZhbHNlLCBUcnVlXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5lbnRyeS5nZXQoKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbGlkYXRpb24sIFtGYWxzZSwgVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5nZXQoKSwgJ2EnKQogCiAKICAgICBkZWYgdGVzdF9yZXZhbGlkYXRpb24oc2VsZik6CkBAIC0yODUsMTkgKzI4NSwxOSBAQAogICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IHNlbGYuZW50cnkucmVnaXN0ZXIodmFsaWRhdGUpLCAnJVAnCiAKICAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoJ2VuZCcsICdhdm9jYWRvJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5lbnRyeS52YWxpZGF0ZSgpLCBUcnVlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkudmFsaWRhdGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgpKQogCiAgICAgICAgIHNlbGYuZW50cnkuZGVsZXRlKDAsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmVudHJ5LmdldCgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LmdldCgpLCAnJykKIAogICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgJ2ExYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkudmFsaWRhdGUoKSwgRmFsc2UpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCdpbnZhbGlkJywgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCdpbnZhbGlkJywgKSkKIAogICAgICAgICBzZWxmLmVudHJ5LmRlbGV0ZSgxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIFRydWUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS52YWxpZGF0ZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCkpCiAKIAogY2xhc3MgUGFuZWR3aW5kb3dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTMxNSwxMDggKzMxNSwxMDggQEAKICAgICAgICAgIyBhdHRlbXB0IHRvIGFkZCBhIGNoaWxkIHRoYXQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBwYW5lZCB3aW5kb3cKICAgICAgICAgbGFiZWwgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCkKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwobGFiZWwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgY2hpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuYWRkLCBjaGlsZCkKICAgICAgICAgbGFiZWwuZGVzdHJveSgpCiAgICAgICAgIGNoaWxkLmRlc3Ryb3koKQogICAgICAgICAjIGFub3RoZXIgYXR0ZW1wdAogICAgICAgICBsYWJlbCA9IHR0ay5MYWJlbCgpCiAgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKGxhYmVsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5hZGQsIGNoaWxkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgY2hpbGQpCiAgICAgICAgIGNoaWxkLmRlc3Ryb3koKQogICAgICAgICBsYWJlbC5kZXN0cm95KCkKIAogICAgICAgICBnb29kX2NoaWxkID0gdHRrLkxhYmVsKCkKICAgICAgICAgc2VsZi5wYW5lZC5hZGQoZ29vZF9jaGlsZCkKICAgICAgICAgIyByZS1hZGRpbmcgYSBjaGlsZCBpcyBub3QgYWNjZXB0ZWQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuYWRkLCBnb29kX2NoaWxkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgZ29vZF9jaGlsZCkKIAogICAgICAgICBvdGhlcl9jaGlsZCA9IHR0ay5MYWJlbChzZWxmLnBhbmVkKQogICAgICAgICBzZWxmLnBhbmVkLmFkZChvdGhlcl9jaGlsZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoMSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMikKICAgICAgICAgZ29vZF9jaGlsZC5kZXN0cm95KCkKICAgICAgICAgb3RoZXJfY2hpbGQuZGVzdHJveSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCkKIAogCiAgICAgZGVmIHRlc3RfZm9yZ2V0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmZvcmdldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuZm9yZ2V0LCAwKQogCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKHR0ay5MYWJlbCgpKQogICAgICAgICBzZWxmLnBhbmVkLmZvcmdldCgwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuZm9yZ2V0LCAwKQogCiAKICAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgTm9uZSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCAwLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCBOb25lLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIDAsIDApCiAKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoKQogICAgICAgICBjaGlsZDIgPSB0dGsuTGFiZWwoKQogICAgICAgICBjaGlsZDMgPSB0dGsuTGFiZWwoKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgMCwgY2hpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCAwLCBjaGlsZCkKIAogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQyKQogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgwLCBjaGlsZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLCAoc3RyKGNoaWxkKSwgc3RyKGNoaWxkMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwgKHN0cihjaGlsZCksIHN0cihjaGlsZDIpKSkKIAogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgwLCBjaGlsZDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwgKHN0cihjaGlsZDIpLCBzdHIoY2hpbGQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmVzKCksIChzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSkpCiAKICAgICAgICAgc2VsZi5wYW5lZC5pbnNlcnQoJ2VuZCcsIGNoaWxkMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwKICAgICAgICAgICAgIChzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSwgc3RyKGNoaWxkMykpKQogCiAgICAgICAgICMgcmVpbnNlcnRpbmcgYSBjaGlsZCBzaG91bGQgbW92ZSBpdCB0byBpdHMgY3VycmVudCBwb3NpdGlvbgogICAgICAgICBwYW5lcyA9IHNlbGYucGFuZWQucGFuZXMoKQogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwYW5lcywgc2VsZi5wYW5lZC5wYW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhbmVzLCBzZWxmLnBhbmVkLnBhbmVzKCkpCiAKICAgICAgICAgIyBtb3ZpbmcgY2hpbGQzIHRvIGNoaWxkMiBwb3NpdGlvbiBzaG91bGQgcmVzdWx0IGluIGNoaWxkMiBlbmRpbmcgdXAKICAgICAgICAgIyBpbiBwcmV2aW91cyBjaGlsZCBwb3NpdGlvbiBhbmQgY2hpbGQgZW5kaW5nIHVwIGluIHByZXZpb3VzIGNoaWxkMwogICAgICAgICAjIHBvc2l0aW9uCiAgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KGNoaWxkMiwgY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnBhbmVkLnBhbmVzKCksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLAogICAgICAgICAgICAgKHN0cihjaGlsZDMpLCBzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSkpCiAKIAogICAgIGRlZiB0ZXN0X3BhbmUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCkKIAogICAgICAgICBjaGlsZCA9IHR0ay5MYWJlbCgpCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnBhbmUoMCksIGRpY3QpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnBhbmVkLnBhbmUoMCwgd2VpZ2h0PU5vbmUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnBhbmUoMCksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCB3ZWlnaHQ9Tm9uZSksIDApCiAgICAgICAgICMgbmV3ZXIgZm9ybSBmb3IgcXVlcnlpbmcgYSBzaW5nbGUgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYucGFuZWQucGFuZSgwLCAnd2VpZ2h0JyksIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYucGFuZWQucGFuZSgwKSwgc2VsZi5wYW5lZC5wYW5lKHN0cihjaGlsZCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCAnd2VpZ2h0JyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoc3RyKGNoaWxkKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5wYW5lLCAwLAogICAgICAgICAgICAgYmFkb3B0aW9uPSdzb21ldmFsdWUnKQogCiAKICAgICBkZWYgdGVzdF9zYXNocG9zKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAnJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsIDApCiAKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCwgdGV4dD0nYScpCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkLCB3ZWlnaHQ9MSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAwKQogICAgICAgICBjaGlsZDIgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCwgdGV4dD0nYicpCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAxKQogCiAgICAgICAgIHNlbGYucGFuZWQucGFjayhleHBhbmQ9VHJ1ZSwgZmlsbD0nYm90aCcpCiAgICAgICAgIHNlbGYucGFuZWQud2FpdF92aXNpYmlsaXR5KCkKIAogICAgICAgICBjdXJyX3BvcyA9IHNlbGYucGFuZWQuc2FzaHBvcygwKQogICAgICAgICBzZWxmLnBhbmVkLnNhc2hwb3MoMCwgMTAwMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGN1cnJfcG9zICE9IHNlbGYucGFuZWQuc2FzaHBvcygwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5wYW5lZC5zYXNocG9zKDApLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY3Vycl9wb3MgIT0gc2VsZi5wYW5lZC5zYXNocG9zKDApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnNhc2hwb3MoMCksIGludCkpCiAKIAogY2xhc3MgUmFkaW9idXR0b25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQzMiwyMSArNDMyLDIxIEBACiAgICAgICAgIGNidG4yID0gdHRrLlJhZGlvYnV0dG9uKGNvbW1hbmQ9Y2JfdGVzdCwgdmFyaWFibGU9bXl2YXIsIHZhbHVlPTEpCiAKICAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNidG5bJ3ZhbHVlJ10sIG15dmFyLmdldCgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChteXZhci5nZXQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0blsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXl2YXIuZ2V0KCksCiAgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAgICAgICAgIGNidG4yWydjb21tYW5kJ10gPSAnJwogICAgICAgICByZXMgPSBjYnRuMi5pbnZva2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsICcnKQotICAgICAgICBzZWxmLmZhaWxJZihsZW4oc3VjY2VzcykgPiAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYnRuMlsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG15dmFyLmdldCgpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKHN1Y2Nlc3MpID4gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYnRuMlsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXl2YXIuZ2V0KCksCiAgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoY2J0blsndmFyaWFibGUnXSksIHN0cihjYnRuMlsndmFyaWFibGUnXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNidG5bJ3ZhcmlhYmxlJ10pLCBzdHIoY2J0bjJbJ3ZhcmlhYmxlJ10pKQogCiAKIApAQCAtNDcyLDI3ICs0NzIsMjcgQEAKICAgICAgICAgc2VsZi5zY2FsZVsnZnJvbV8nXSA9IDEwCiAgICAgICAgIHNlbGYuc2NhbGVbJ3RvJ10gPSAzCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoZmFpbHVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmYWlsdXJlKQogCiAgICAgICAgIGZhaWx1cmUgPSBbMSwgMSwgMV0KICAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUoZnJvbV89MiwgdG89NSkKICAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUoZnJvbV89MCwgdG89LTIpCiAgICAgICAgIHNlbGYuc2NhbGUuY29uZmlndXJlKHRvPTEwKQogCi0gICAgICAgIHNlbGYuZmFpbElmKGZhaWx1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmFpbHVyZSkKIAogCiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgogICAgICAgICBzY2FsZV93aWR0aCA9IHNlbGYuc2NhbGUud2luZm9fd2lkdGgoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldChzY2FsZV93aWR0aCwgMCksIHNlbGYuc2NhbGVbJ3RvJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoc2NhbGVfd2lkdGgsIDApLCBzZWxmLnNjYWxlWyd0byddKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KDAsIDApLCBzZWxmLnNjYWxlWydmcm9tJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHNlbGYuc2NhbGVbJ3ZhbHVlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoMCwgMCksIHNlbGYuc2NhbGVbJ2Zyb20nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQogICAgICAgICBzZWxmLnNjYWxlWyd2YWx1ZSddID0gMzAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgc2VsZi5zY2FsZVsndmFsdWUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLmdldCwgJycsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLmdldCwgMCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuZ2V0LCAnJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5zY2FsZS5nZXQsIDAsICcnKQogCiAKICAgICBkZWYgdGVzdF9zZXQoc2VsZik6CkBAIC01MDAsMzAgKzUwMCwzMCBAQAogICAgICAgICBtYXggPSBzZWxmLnNjYWxlWyd0byddCiAgICAgICAgIG5ld19tYXggPSBtYXggKyAxMAogICAgICAgICBzZWxmLnNjYWxlLnNldChuZXdfbWF4KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4KQogICAgICAgICBtaW4gPSBzZWxmLnNjYWxlWydmcm9tJ10KICAgICAgICAgc2VsZi5zY2FsZS5zZXQobWluIC0gMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWluKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1pbikKIAogICAgICAgICAjIGNoYW5naW5nIGRpcmVjdGx5IHRoZSB2YXJpYWJsZSBkb2Vzbid0IGltcG9zZSB0aGlzIGxpbWl0YXRpb24gdGhvCiAgICAgICAgIHZhciA9IFRraW50ZXIuRG91YmxlVmFyKCkKICAgICAgICAgc2VsZi5zY2FsZVsndmFyaWFibGUnXSA9IHZhcgogICAgICAgICB2YXIuc2V0KG1heCArIDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHZhci5nZXQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4ICsgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCB2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4ICsgNSkKICAgICAgICAgZGVsIHZhcgogCiAgICAgICAgICMgdGhlIHNhbWUgaGFwcGVucyB3aXRoIHRoZSB2YWx1ZSBvcHRpb24KICAgICAgICAgc2VsZi5zY2FsZVsndmFsdWUnXSA9IG1heCArIDEwCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1heCArIDEwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1heCArIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHNlbGYuc2NhbGVbJ3ZhbHVlJ10pCiAKICAgICAgICAgIyBuZXZlcnRoZWxlc3MsIG5vdGUgdGhhdCB0aGUgbWF4L21pbiB2YWx1ZXMgd2UgY2FuIGdldCBzcGVjaWZ5aW5nCiAgICAgICAgICMgeCwgeSBjb29yZHMgYXJlIHRoZSBvbmVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByYW5nZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldCgwLCAwKSwgbWluKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldChzZWxmLnNjYWxlLndpbmZvX3dpZHRoKCksIDApLCBtYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoMCwgMCksIG1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldChzZWxmLnNjYWxlLndpbmZvX3dpZHRoKCksIDApLCBtYXgpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuc2V0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLnNldCwgTm9uZSkKIAogCiBjbGFzcyBOb3RlYm9va1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTQ2LDE4ICs1NDYsMTggQEAKICAgICBkZWYgdGVzdF90YWJfaWRlbnRpZmllcnMoc2VsZik6CiAgICAgICAgIHNlbGYubmIuZm9yZ2V0KDApCiAgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBzZWxmLmNoaWxkMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi5pbmRleCgnZW5kJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdlbmQnKSwgMSkKICAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAxKQogICAgICAgICBzZWxmLm5iLnNlbGVjdChzZWxmLmNoaWxkMikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5uYi50YWIoJ2N1cnJlbnQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubmIudGFiKCdjdXJyZW50JykpCiAgICAgICAgIHNlbGYubmIuYWRkKHNlbGYuY2hpbGQxLCB0ZXh0PSdhJykKIAogICAgICAgICBzZWxmLm5iLnBhY2soKQogICAgICAgICBzZWxmLm5iLndhaXRfdmlzaWJpbGl0eSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFiKCdANSw1JyksIHNlbGYubmIudGFiKCdjdXJyZW50JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoJ0A1LDUnKSwgc2VsZi5uYi50YWIoJ2N1cnJlbnQnKSkKIAogICAgICAgICBmb3IgaSBpbiByYW5nZSg1LCAxMDAsIDUpOgogICAgICAgICAgICAgaWYgc2VsZi5uYi50YWIoJ0AlZCwgNScgJSBpLCB0ZXh0PU5vbmUpID09ICdhJzoKQEAgLTU2NywxNyArNTY3LDE3IEBACiAKIAogICAgIGRlZiB0ZXN0X2FkZF9hbmRfaGlkZGVuKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5oaWRlLCAtMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgJ2hpJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuYWRkLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5hZGQsIHR0ay5MYWJlbCgpLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5hZGQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuYWRkLCB0dGsuTGFiZWwoKSwKICAgICAgICAgICAgIHVua25vd249J29wdGlvbicpCiAKICAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCiAgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMSkKICAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQogCiAgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKCkKICAgICAgICAgc2VsZi5uYi5hZGQoY2hpbGQsIHRleHQ9J2MnKQpAQCAtNTg4LDcwICs1ODgsNzAgQEAKICAgICAgICAgY2hpbGQyX2luZGV4ID0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMikKICAgICAgICAgc2VsZi5uYi5oaWRlKHNlbGYuY2hpbGQyKQogICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDIpLCBjaGlsZDJfaW5kZXgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoc2VsZi5jaGlsZDIpID09IHNlbGYubmIudGFicygpW2NoaWxkMl9pbmRleF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMiksIGNoaWxkMl9pbmRleCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihzZWxmLmNoaWxkMikgPT0gc2VsZi5uYi50YWJzKClbY2hpbGQyX2luZGV4XSkKICAgICAgICAgIyBidXQgdGhlIHRhYiBuZXh0IHRvIGl0IChub3QgaGlkZGVuKSBpcyB0aGUgb25lIHNlbGVjdGVkIG5vdwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLmluZGV4KCdjdXJyZW50JyksIGN1cnIgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2N1cnJlbnQnKSwgY3VyciArIDEpCiAKIAogICAgIGRlZiB0ZXN0X2ZvcmdldChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAtMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAnaGknKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5mb3JnZXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5mb3JnZXQsICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCBOb25lKQogCiAgICAgICAgIHRhYnMgPSBzZWxmLm5iLnRhYnMoKQogICAgICAgICBjaGlsZDFfaW5kZXggPSBzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKQogICAgICAgICBzZWxmLm5iLmZvcmdldChzZWxmLmNoaWxkMSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc3RyKHNlbGYuY2hpbGQxKSBpbiBzZWxmLm5iLnRhYnMoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHRhYnMpIC0gMSwgbGVuKHNlbGYubmIudGFicygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdHIoc2VsZi5jaGlsZDEpIGluIHNlbGYubmIudGFicygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0YWJzKSAtIDEsIGxlbihzZWxmLm5iLnRhYnMoKSkpCiAKICAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAxKQotICAgICAgICBzZWxmLmZhaWxJZihjaGlsZDFfaW5kZXggPT0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2hpbGQxX2luZGV4ID09IHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpKQogCiAKICAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5kZXgsIC0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbmRleCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbmRleCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5kZXgsIE5vbmUpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5uYi5pbmRleCgnZW5kJyksIGludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQyKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi5pbmRleCgnZW5kJyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAyKQogCiAKICAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CiAgICAgICAgICMgbW92aW5nIHRhYnMKICAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCiAgICAgICAgIHNlbGYubmIuaW5zZXJ0KDEsIHRhYnNbMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCAodGFic1sxXSwgdGFic1swXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksICh0YWJzWzFdLCB0YWJzWzBdKSkKICAgICAgICAgc2VsZi5uYi5pbnNlcnQoc2VsZi5jaGlsZDEsIHNlbGYuY2hpbGQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKICAgICAgICAgc2VsZi5uYi5pbnNlcnQoJ2VuZCcsIHNlbGYuY2hpbGQxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHRhYnNbMV0sIHRhYnNbMF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAodGFic1sxXSwgdGFic1swXSkpCiAgICAgICAgIHNlbGYubmIuaW5zZXJ0KCdlbmQnLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKICAgICAgICAgIyBiYWQgbW92ZXMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAyLCB0YWJzWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIC0xLCB0YWJzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgMiwgdGFic1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIC0xLCB0YWJzWzBdKQogCiAgICAgICAgICMgbmV3IHRhYgogICAgICAgICBjaGlsZDMgPSB0dGsuTGFiZWwoKQogICAgICAgICBzZWxmLm5iLmluc2VydCgxLCBjaGlsZDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCAodGFic1swXSwgc3RyKGNoaWxkMyksIHRhYnNbMV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAodGFic1swXSwgc3RyKGNoaWxkMyksIHRhYnNbMV0pKQogICAgICAgICBzZWxmLm5iLmZvcmdldChjaGlsZDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQogICAgICAgICBzZWxmLm5iLmluc2VydChzZWxmLmNoaWxkMSwgY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHN0cihjaGlsZDMpLCApICsgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHN0cihjaGlsZDMpLCApICsgdGFicykKICAgICAgICAgc2VsZi5uYi5mb3JnZXQoY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIDIsIGNoaWxkMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAtMSwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgMiwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgLTEsIGNoaWxkMykKIAogICAgICAgICAjIGJhZCBpbnNlcnRzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgJ2VuZCcsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgTm9uZSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgJ2VuZCcsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCBOb25lLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgTm9uZSwgTm9uZSkKIAogCiAgICAgZGVmIHRlc3Rfc2VsZWN0KHNlbGYpOgpAQCAtNjY1LDM2ICs2NjUsMzYgQEAKICAgICAgICAgc2VsZi5uYi5iaW5kKCc8PE5vdGVib29rVGFiQ2hhbmdlZD4+JywKICAgICAgICAgICAgIGxhbWJkYSBldnQ6IHRhYl9jaGFuZ2VkLmFwcGVuZChUcnVlKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCiAgICAgICAgIHNlbGYubmIuc2VsZWN0KHNlbGYuY2hpbGQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3VjY2VzcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQyKSkKIAogICAgICAgICBzZWxmLm5iLnVwZGF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0YWJfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhYl9jaGFuZ2VkKQogCiAKICAgICBkZWYgdGVzdF90YWIoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgJ25vdGFiJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCAnbm90YWInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgTm9uZSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSksIGRpY3QpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgdGV4dD1Ob25lKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYScpCiAgICAgICAgICMgbmV3ZXIgZm9ybSBmb3IgcXVlcnlpbmcgYSBzaW5nbGUgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCAndGV4dCcpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsICd0ZXh0JyksICdhJykKICAgICAgICAgc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsIHRleHQ9J2FiYycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYWJjJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsICd0ZXh0JyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgJ3RleHQnKSwgJ2FiYycpCiAKIAogICAgIGRlZiB0ZXN0X3RhYnMoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihzZWxmLm5iLnRhYnMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYubmIudGFicygpKSwgMikKIAogICAgICAgICBzZWxmLm5iLmZvcmdldChzZWxmLmNoaWxkMSkKICAgICAgICAgc2VsZi5uYi5mb3JnZXQoc2VsZi5jaGlsZDIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi50YWJzKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAoKSkKIAogCiAgICAgZGVmIHRlc3RfdHJhdmVyc2FsKHNlbGYpOgpAQCAtNzA1LDE2ICs3MDUsMTYgQEAKIAogICAgICAgICBzdXBwb3J0LnNpbXVsYXRlX21vdXNlX2NsaWNrKHNlbGYubmIsIDUsIDUpCiAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxDb250cm9sLVRhYj4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMikpCiAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxTaGlmdC1Db250cm9sLVRhYj4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCiAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxTaGlmdC1Db250cm9sLVRhYj4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMikpCiAKICAgICAgICAgc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsIHRleHQ9J2EnLCB1bmRlcmxpbmU9MCkKICAgICAgICAgc2VsZi5uYi5lbmFibGVfdHJhdmVyc2FsKCkKICAgICAgICAgc2VsZi5uYi5ldmVudF9nZW5lcmF0ZSgnPEFsdC1hPicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQxKSkKIAogCiBjbGFzcyBUcmVldmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNzMwLDE3ICs3MzAsMTcgQEAKIAogICAgIGRlZiB0ZXN0X2Jib3goc2VsZik6CiAgICAgICAgIHNlbGYudHYucGFjaygpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuYmJveCgnJyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuYmJveCgnJyksICcnKQogICAgICAgICBzZWxmLnR2LndhaXRfdmlzaWJpbGl0eSgpCiAgICAgICAgIHNlbGYudHYudXBkYXRlKCkKIAogICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQogICAgICAgICBjaGlsZHJlbiA9IHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNoaWxkcmVuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hpbGRyZW4pCiAKICAgICAgICAgYmJveCA9IHNlbGYudHYuYmJveChjaGlsZHJlblswXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGJib3gpLCA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShiYm94LCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJib3gpLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYm94LCB0dXBsZSkpCiAgICAgICAgIGZvciBpdGVtIGluIGJib3g6CiAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCBpbnQpOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiSW52YWxpZCBib3VuZGluZyBib3g6ICVzIiAlIGJib3gpCkBAIC03NTEsODYgKzc1MSw4NiBAQAogICAgICAgICBzZWxmLnR2LmNvbHVtbigndGVzdCcsIHdpZHRoPTUwKQogICAgICAgICBiYm94X2NvbHVtbjAgPSBzZWxmLnR2LmJib3goY2hpbGRyZW5bMF0sIDApCiAgICAgICAgIHJvb3Rfd2lkdGggPSBzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiYm94X2NvbHVtbjBbMF0sIGJib3hbMF0gKyByb290X3dpZHRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJib3hfY29sdW1uMFswXSwgYmJveFswXSArIHJvb3Rfd2lkdGgpCiAKICAgICAgICAgIyB2ZXJpZnkgdGhhdCBiYm94IG9mIGEgY2xvc2VkIGl0ZW0gaXMgdGhlIGVtcHR5IHN0cmluZwogICAgICAgICBjaGlsZDEgPSBzZWxmLnR2Lmluc2VydChpdGVtX2lkLCAnZW5kJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5iYm94KGNoaWxkMSksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuYmJveChjaGlsZDEpLCAnJykKIAogCiAgICAgZGVmIHRlc3RfY2hpbGRyZW4oc2VsZik6CiAgICAgICAgICMgbm8gY2hpbGRyZW4geWV0LCBzaG91bGQgZ2V0IGFuIGVtcHR5IHR1cGxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQogCiAgICAgICAgIGl0ZW1faWQgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIHR1cGxlKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKVswXSwgaXRlbV9pZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKClbMF0sIGl0ZW1faWQpCiAKICAgICAgICAgIyBhZGQgaXRlbV9pZCBhbmQgY2hpbGQzIGFzIGNoaWxkcmVuIG9mIGNoaWxkMgogICAgICAgICBjaGlsZDIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCiAgICAgICAgIGNoaWxkMyA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oY2hpbGQyLCBpdGVtX2lkLCBjaGlsZDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGNoaWxkMiksIChpdGVtX2lkLCBjaGlsZDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGNoaWxkMiksIChpdGVtX2lkLCBjaGlsZDMpKQogCiAgICAgICAgICMgY2hpbGQzIGhhcyBjaGlsZDIgYXMgcGFyZW50LCB0aHVzIHRyeWluZyB0byBzZXQgY2hpbGQyIGFzIGEgY2hpbGRyZW4KICAgICAgICAgIyBvZiBjaGlsZDMgc2hvdWxkIHJlc3VsdCBpbiBhbiBlcnJvcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHNlbGYudHYuc2V0X2NoaWxkcmVuLCBjaGlsZDMsIGNoaWxkMikKIAogICAgICAgICAjIHJlbW92ZSBjaGlsZDIgY2hpbGRyZW4KICAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oY2hpbGQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihjaGlsZDIpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihjaGlsZDIpLCAoKSkKIAogICAgICAgICAjIHJlbW92ZSByb290J3MgY2hpbGRyZW4KICAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQogCiAKICAgICBkZWYgdGVzdF9jb2x1bW4oc2VsZik6CiAgICAgICAgICMgcmV0dXJuIGEgZGljdCB3aXRoIGFsbCBvcHRpb25zL3ZhbHVlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnR2LmNvbHVtbignIzAnKSwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcpLCBkaWN0KSkKICAgICAgICAgIyByZXR1cm4gYSBzaW5nbGUgdmFsdWUgb2YgdGhlIGdpdmVuIG9wdGlvbgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9Tm9uZSksIGludCkpCiAgICAgICAgICMgc2V0IGEgbmV3IHZhbHVlIGZvciBhbiBvcHRpb24KICAgICAgICAgc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9MTApCiAgICAgICAgICMgdGVzdGluZyBuZXcgd2F5IHRvIGdldCBvcHRpb24gdmFsdWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5jb2x1bW4oJyMwJywgJ3dpZHRoJyksIDEwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5jb2x1bW4oJyMwJywgJ3dpZHRoJyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLCAxMCkKICAgICAgICAgIyBjaGVjayByZWFkLW9ubHkgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywgaWQ9J1gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywgaWQ9J1gnKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJ2ludmFsaWQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJ2ludmFsaWQnKQogICAgICAgICBpbnZhbGlkX2t3cyA9IFsKICAgICAgICAgICAgIHsndW5rbm93bl9vcHRpb24nOiAnc29tZSB2YWx1ZSd9LCAgeydzdHJldGNoJzogJ3dyb25nJ30sCiAgICAgICAgICAgICB7J2FuY2hvcic6ICd3cm9uZyd9LCB7J3dpZHRoJzogJ3dyb25nJ30sIHsnbWlud2lkdGgnOiAnd3JvbmcnfQogICAgICAgICBdCiAgICAgICAgIGZvciBrdyBpbiBpbnZhbGlkX2t3czoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuY29sdW1uLCAnIzAnLAogICAgICAgICAgICAgICAgICoqa3cpCiAKIAogICAgIGRlZiB0ZXN0X2RlbGV0ZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZGVsZXRlLCAnIzAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmRlbGV0ZSwgJyMwJykKIAogICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQogICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KGl0ZW1faWQsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKGl0ZW0yLCApKQogCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW1faWQpCi0gICAgICAgIHNlbGYuZmFpbElmKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSkKIAogICAgICAgICAjIHJlYXR0YWNoIHNob3VsZCBmYWlsCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAogICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgaXRlbV9pZCwgJycsICdlbmQnKQogCiAgICAgICAgICMgdGVzdCBtdWx0aXBsZSBpdGVtIGRlbGV0ZQogICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgaXRlbTIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtMSwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtMSwgaXRlbTIpKQogCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xLCBpdGVtMikKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi50di5nZXRfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQogCiAKICAgICBkZWYgdGVzdF9kZXRhY2hfcmVhdHRhY2goc2VsZik6CkBAIC04NDAsODEgKzg0MCw4MSBAQAogICAgICAgICAjIGNhbGxpbmcgZGV0YWNoIHdpdGhvdXQgaXRlbXMgaXMgdmFsaWQsIGFsdGhvdWdoIGl0IGRvZXMgbm90aGluZwogICAgICAgICBwcmV2ID0gc2VsZi50di5nZXRfY2hpbGRyZW4oKQogICAgICAgICBzZWxmLnR2LmRldGFjaCgpICMgdGhpcyBzaG91bGQgZG8gbm90aGluZwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwcmV2LCBzZWxmLnR2LmdldF9jaGlsZHJlbigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXYsIHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoaXRlbTIsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKIAogICAgICAgICAjIGRldGFjaCBpdGVtIHdpdGggY2hpbGRyZW4KICAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbV9pZCkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi50di5nZXRfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQogCiAgICAgICAgICMgcmVhdHRhY2ggaXRlbSB3aXRoIGNoaWxkcmVuCiAgICAgICAgIHNlbGYudHYucmVhdHRhY2goaXRlbV9pZCwgJycsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKGl0ZW0yLCApKQogCiAgICAgICAgICMgbW92ZSBhIGNoaWxkcmVuIHRvIHRoZSByb290CiAgICAgICAgIHNlbGYudHYubW92ZShpdGVtMiwgJycsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgaXRlbTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCiAKICAgICAgICAgIyBiYWQgdmFsdWVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAogICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgJ25vbmV4aXN0ZW50JywgJycsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHNlbGYudHYuZGV0YWNoLCAnbm9uZXhpc3RlbnQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHNlbGYudHYucmVhdHRhY2gsIGl0ZW0yLCAnb3RoZXJwYXJlbnQnLCAnZW5kJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCiAgICAgICAgICAgICBzZWxmLnR2LnJlYXR0YWNoLCBpdGVtMiwgJycsICdpbnZhbGlkJykKIAogICAgICAgICAjIG11bHRpcGxlIGRldGFjaAogICAgICAgICBzZWxmLnR2LmRldGFjaChpdGVtX2lkLCBpdGVtMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCiAKIAogICAgIGRlZiB0ZXN0X2V4aXN0cyhzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5leGlzdHMoJ3NvbWV0aGluZycpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5leGlzdHMoJycpLCBUcnVlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmV4aXN0cyh7fSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZXhpc3RzKCdzb21ldGhpbmcnKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5leGlzdHMoJycpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZXhpc3RzKHt9KSwgRmFsc2UpCiAKICAgICAgICAgIyB0aGUgZm9sbG93aW5nIHdpbGwgbWFrZSBhIHRrLmNhbGwgZXF1aXZhbGVudCB0bwogICAgICAgICAjIHRrLmNhbGwodHJlZXZpZXcsICJleGlzdHMiKSB3aGljaCBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yCiAgICAgICAgICMgaW4gdGhlIHRjbCBpbnRlcnByZXRlciBzaW5jZSB0ayByZXF1aXJlcyBhbiBpdGVtLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5leGlzdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZXhpc3RzLCBOb25lKQogCiAKICAgICBkZWYgdGVzdF9mb2N1cyhzZWxmKToKICAgICAgICAgIyBub3RoaW5nIGlzIGZvY3VzZWQgcmlnaHQgbm93Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZm9jdXMoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5mb2N1cygpLCAnJykKIAogICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgc2VsZi50di5mb2N1cyhpdGVtMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5mb2N1cygpLCBpdGVtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmZvY3VzKCksIGl0ZW0xKQogCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmZvY3VzKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZm9jdXMoKSwgJycpCiAKICAgICAgICAgIyB0cnkgZm9jdXNpbmcgaW5leGlzdGVudCBpdGVtCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmZvY3VzLCAnaGknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmZvY3VzLCAnaGknKQogCiAKICAgICBkZWYgdGVzdF9oZWFkaW5nKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGEgZGljdCBpcyByZXR1cm5lZAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnR2LmhlYWRpbmcoJyMwJyksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2LmhlYWRpbmcoJyMwJyksIGRpY3QpKQogCiAgICAgICAgICMgY2hlY2sgYSB2YWx1ZSBpcyByZXR1cm5lZAogICAgICAgICBzZWxmLnR2LmhlYWRpbmcoJyMwJywgdGV4dD0naGknKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmhlYWRpbmcoJyMwJywgJ3RleHQnKSwgJ2hpJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9Tm9uZSksICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsICd0ZXh0JyksICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9Tm9uZSksICdoaScpCiAKICAgICAgICAgIyBpbnZhbGlkIG9wdGlvbgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5oZWFkaW5nLCAnIzAnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCiAgICAgICAgICAgICBiYWNrZ3JvdW5kPU5vbmUpCiAgICAgICAgICMgaW52YWxpZCB2YWx1ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5oZWFkaW5nLCAnIzAnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCiAgICAgICAgICAgICBhbmNob3I9MSkKIAogCkBAIC05NDAsNyArOTQwLDcgQEAKICAgICAgICAgc3VjY2VzcyA9IFtdCiAgICAgICAgIGNvbW1hbmRzID0gc2VsZi50di5tYXN0ZXIuX3RjbENvbW1hbmRzCiAgICAgICAgIHNlbGYudHYuaGVhZGluZygnIzAnLCBjb21tYW5kPXN0cihzZWxmLnR2LmhlYWRpbmcoJyMwJywgY29tbWFuZD1Ob25lKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNvbW1hbmRzLCBzZWxmLnR2Lm1hc3Rlci5fdGNsQ29tbWFuZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbWFuZHMsIHNlbGYudHYubWFzdGVyLl90Y2xDb21tYW5kcykKICAgICAgICAgc2ltdWxhdGVfaGVhZGluZ19jbGljayg1LCA1KQogICAgICAgICBpZiBub3Qgc3VjY2VzczoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB0byB0aGUgdHJlZXZpZXcgaGVhZGluZyB3YXNuJ3QgIgpAQCAtOTU0LDkyICs5NTQsOTIgQEAKIAogICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgogICAgICAgICAjIGl0ZW0gJ3doYXQnIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5kZXgsICd3aGF0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbmRleCwgJ3doYXQnKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaW5kZXgoJycpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoJycpLCAwKQogCiAgICAgICAgIGl0ZW0xID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQogICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgYzEgPSBzZWxmLnR2Lmluc2VydChpdGVtMSwgJ2VuZCcpCiAgICAgICAgIGMyID0gc2VsZi50di5pbnNlcnQoaXRlbTEsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0xKSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pbmRleChjMSksIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0xKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGMxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGMyKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMSkKIAogICAgICAgICBzZWxmLnR2Lm1vdmUoaXRlbTIsICcnLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pbmRleChpdGVtMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMSksIDEpCiAKICAgICAgICAgIyBjaGVjayB0aGF0IGluZGV4IHN0aWxsIHdvcmtzIGV2ZW4gYWZ0ZXIgaXRzIHBhcmVudCBhbmQgc2libGluZ3MKICAgICAgICAgIyBoYXZlIGJlZW4gZGV0YWNoZWQKICAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQogICAgICAgICBzZWxmLnR2LmRldGFjaChjMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pbmRleChjMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChjMiksIDApCiAKICAgICAgICAgIyBidXQgaXQgZmFpbHMgYWZ0ZXIgaXRlbSBoYXMgYmVlbiBkZWxldGVkCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbmRleCwgYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5kZXgsIGMyKQogCiAKICAgICBkZWYgdGVzdF9pbnNlcnRfaXRlbShzZWxmKToKICAgICAgICAgIyBwYXJlbnQgJ25vbmUnIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnbm9uZScsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJ25vbmUnLCAnZW5kJykKIAogICAgICAgICAjIG9wZW4gdmFsdWVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAogICAgICAgICAgICAgb3Blbj0nJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCiAgICAgICAgICAgICBvcGVuPSdwbGVhc2UnKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49VHJ1ZSkpKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49RmFsc2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49VHJ1ZSkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZGVsZXRlKHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgb3Blbj1GYWxzZSkpKQogCiAgICAgICAgICMgaW52YWxpZCBpbmRleAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnbWlkZGxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnbWlkZGxlJykKIAogICAgICAgICAjIHRyeWluZyB0byBkdXBsaWNhdGUgaXRlbSBpZCBpcyBpbnZhbGlkCiAgICAgICAgIGl0ZW1pZCA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgJ2ZpcnN0LWl0ZW0nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpdGVtaWQsICdmaXJzdC1pdGVtJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbWlkLCAnZmlyc3QtaXRlbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCiAgICAgICAgICAgICAnZmlyc3QtaXRlbScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAogICAgICAgICAgICAgTW9ja1RjbE9iaignZmlyc3QtaXRlbScpKQogCiAgICAgICAgICMgdW5pY29kZSB2YWx1ZXMKICAgICAgICAgdmFsdWUgPSB1J1x4ZTFiYScKICAgICAgICAgaXRlbSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdmFsdWVzPSh2YWx1ZSwgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sICd2YWx1ZXMnKSwgKHZhbHVlLCApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAodmFsdWUsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sICd2YWx1ZXMnKSwgKHZhbHVlLCApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKIAogICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPWxpc3Qoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAodmFsdWUsICkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi50di5pdGVtKGl0ZW0pLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5pdGVtKGl0ZW0pLCBkaWN0KSkKIAogICAgICAgICAjIGVyYXNlIGl0ZW0gdmFsdWVzCiAgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9JycpCi0gICAgICAgIHNlbGYuZmFpbElmKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkKIAogICAgICAgICAjIGl0ZW0gdGFncwogICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0YWdzPVsxLCAyLCB2YWx1ZV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpLCAoJzEnLCAnMicsIHZhbHVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInLCB2YWx1ZSkpCiAgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPVtdKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSkKICAgICAgICAgc2VsZi50di5pdGVtKGl0ZW0sIHRhZ3M9KDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInKSkKIAogICAgICAgICAjIHZhbHVlcyB3aXRoIHNwYWNlcwogICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB2YWx1ZXM9KCdhIGIgYycsCiAgICAgICAgICAgICAnJXMgJXMnICUgKHZhbHVlLCB2YWx1ZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksCiAgICAgICAgICAgICAoJ2EgYiBjJywgJyVzICVzJyAlICh2YWx1ZSwgdmFsdWUpKSkKIAogICAgICAgICAjIHRleHQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pdGVtKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbSgKICAgICAgICAgICAgIHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdGV4dD0iTGFiZWwgaGVyZSIpLCB0ZXh0PU5vbmUpLAogICAgICAgICAgICAgIkxhYmVsIGhlcmUiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKAogICAgICAgICAgICAgc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0ZXh0PXZhbHVlKSwgdGV4dD1Ob25lKSwKICAgICAgICAgICAgIHZhbHVlKQogCkBAIC0xMDQ3LDI5ICsxMDQ3LDI5IEBACiAgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgogICAgICAgICBzZWxmLnR2Wydjb2x1bW5zJ10gPSBbJ0EnLCAnQiddCiAgICAgICAgIGl0ZW0gPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHZhbHVlcz1bJ2EnLCAnYiddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LnNldChpdGVtKSwgeydBJzogJ2EnLCAnQic6ICdiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQSc6ICdhJywgJ0InOiAnYid9KQogCiAgICAgICAgIHNlbGYudHYuc2V0KGl0ZW0sICdCJywgJ2EnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoJ2EnLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgnYScsICdhJykpCiAKICAgICAgICAgc2VsZi50dlsnY29sdW1ucyddID0gWydCJ10KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6ICdhJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6ICdhJ30pCiAKICAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAnYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuc2V0KGl0ZW0sIGNvbHVtbj0nQicpLCAnYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgnYicsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSwgY29sdW1uPSdCJyksICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoJ2InLCAnYScpKQogCiAgICAgICAgIHNlbGYudHYuc2V0KGl0ZW0sICdCJywgMTIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LnNldChpdGVtLCAnQicpLCAxMjMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgxMjMsICdhJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuc2V0KGl0ZW0pLCB7J0InOiAxMjN9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2V0KGl0ZW0sICdCJyksIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoMTIzLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2V0KGl0ZW0pLCB7J0InOiAxMjN9KQogCiAgICAgICAgICMgaW5leGlzdGVudCBjb2x1bW4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNldCwgaXRlbSwgJ0EnLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScsICdiJykKIAogICAgICAgICAjIGluZXhpc3RlbnQgaXRlbQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5zZXQsICdub3RtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCAnbm90bWUnKQogCiAKICAgICBkZWYgdGVzdF90YWdfYmluZChzZWxmKToKQEAgLTEwOTUsMjggKzEwOTUsMjggQEAKICAgICAgICAgICAgICAgICBwb3NfeS5hZGQoaSkKICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoaXRlbV9pZCkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocG9zX3kpLCAyKSAjIGl0ZW0xIGFuZCBpdGVtMiB5IHBvcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3NfeSksIDIpICMgaXRlbTEgYW5kIGl0ZW0yIHkgcG9zCiAgICAgICAgIGZvciB5IGluIHBvc195OgogICAgICAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLnR2LCAwLCB5KQogCiAgICAgICAgICMgYnkgbm93IHRoZXJlIHNob3VsZCBiZSA0IHRoaW5ncyBpbiB0aGUgZXZlbnRzIGxpc3QsIHNpbmNlIGVhY2gKICAgICAgICAgIyBpdGVtIGhhZCBhIGJpbmQgZm9yIHR3byBldmVudHMgdGhhdCB3ZXJlIHNpbXVsYXRlZCBhYm92ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oZXZlbnRzKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXZlbnRzKSwgNCkKICAgICAgICAgZm9yIGV2dCBpbiB6aXAoZXZlbnRzWzo6Ml0sIGV2ZW50c1sxOjoyXSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChldnQsICgxLCAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZ0LCAoMSwgMikpCiAKIAogICAgIGRlZiB0ZXN0X3RhZ19jb25maWd1cmUoc2VsZik6CiAgICAgICAgICMgSnVzdCB0ZXN0aW5nIHBhcmFtZXRlciBwYXNzaW5nIGZvciBub3cKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHYudGFnX2NvbmZpZ3VyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlLAogICAgICAgICAgICAgJ3Rlc3QnLCBza3k9J2JsdWUnKQogICAgICAgICBzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPSdibHVlJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JywgJ2ZvcmVncm91bmQnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCAnZm9yZWdyb3VuZCcpLAogICAgICAgICAgICAgJ2JsdWUnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPU5vbmUpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYudGFnX2NvbmZpZ3VyZSgndGVzdCcsIGZvcmVncm91bmQ9Tm9uZSksCiAgICAgICAgICAgICAnYmx1ZScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNlbGYudHYudGFnX2NvbmZpZ3VyZSgndGVzdCcpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JyksIGRpY3QpKQogCiAKIHRlc3RzX2d1aSA9ICgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CmluZGV4IGM2ODU3YWIuLjdlYzRiYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weQpAQCAtNTAsMTcgKzUwLDE3IEBACiAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYucmVmZXJlbmNlLml0ZW1zKCk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba2V5XSwgdmFsdWUpCiAgICAgICAgIGtub3dua2V5ID0gc2VsZi5vdGhlci5rZXlzKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEtleUVycm9yLCBsYW1iZGE6ZFtrbm93bmtleV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6ZFtrbm93bmtleV0pCiAgICAgICAgICNsZW4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocCksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsZW4oc2VsZi5yZWZlcmVuY2UpKQogICAgICAgICAjaGFzX2tleQogICAgICAgICBmb3IgayBpbiBzZWxmLnJlZmVyZW5jZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkLmhhc19rZXkoaykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oayBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleShrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIGQpCiAgICAgICAgIGZvciBrIGluIHNlbGYub3RoZXI6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihkLmhhc19rZXkoaykpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihrIGluIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGQuaGFzX2tleShrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoayBpbiBkKQogICAgICAgICAjY21wCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAscCksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGQsZCksIDApCkBAIC03MSwxMCArNzEsMTAgQEAKICAgICAgICAgaWYgbm90IGQ6IHNlbGYuZmFpbCgiRnVsbCBtYXBwaW5nIG11c3QgY29tcGFyZSB0byBUcnVlIikKICAgICAgICAgIyBrZXlzKCksIGl0ZW1zKCksIGl0ZXJrZXlzKCkgLi4uCiAgICAgICAgIGRlZiBjaGVja19pdGVyYW5kbGlzdChpdGVyLCBsc3QsIHJlZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihpdGVyLCAnbmV4dCcpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoaXRlciwgJ19faXRlcl9fJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihpdGVyLCAnbmV4dCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoaXRlciwgJ19faXRlcl9fJykpCiAgICAgICAgICAgICB4ID0gbGlzdChpdGVyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNldCh4KT09c2V0KGxzdCk9PXNldChyZWYpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldCh4KT09c2V0KGxzdCk9PXNldChyZWYpKQogICAgICAgICBjaGVja19pdGVyYW5kbGlzdChkLml0ZXJrZXlzKCksIGQua2V5cygpLCBzZWxmLnJlZmVyZW5jZS5rZXlzKCkpCiAgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGl0ZXIoZCksIGQua2V5cygpLCBzZWxmLnJlZmVyZW5jZS5rZXlzKCkpCiAgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGQuaXRlcnZhbHVlcygpLCBkLnZhbHVlcygpLCBzZWxmLnJlZmVyZW5jZS52YWx1ZXMoKSkKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAga25vd25rZXksIGtub3dudmFsdWUgPSBzZWxmLm90aGVyLml0ZXJpdGVtcygpLm5leHQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGtleSwga25vd252YWx1ZSksIHZhbHVlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGtub3dua2V5LCBrbm93bnZhbHVlKSwga25vd252YWx1ZSkKLSAgICAgICAgc2VsZi5mYWlsSWYoa25vd25rZXkgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrbm93bmtleSBpbiBkKQogCiAgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CiAgICAgICAgICMgVGVzdCBmb3Igd3JpdGUgb3BlcmF0aW9ucyBvbiBtYXBwaW5nCkBAIC05NSw3ICs5NSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBba2V5XSwgdmFsdWUpCiAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5yZWZlcmVuY2Uua2V5cygpOgogICAgICAgICAgICAgZGVsIHBba2V5XQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEtleUVycm9yLCBsYW1iZGE6cFtrZXldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTpwW2tleV0pCiAgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKICAgICAgICAgI3VwZGF0ZQogICAgICAgICBwLnVwZGF0ZShzZWxmLnJlZmVyZW5jZSkKQEAgLTExNCwxNiArMTE0LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtrbm93bmtleV0sIGtub3dudmFsdWUpCiAgICAgICAgICNwb3AKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSksIGtub3dudmFsdWUpCi0gICAgICAgIHNlbGYuZmFpbElmKGtub3dua2V5IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoa25vd25rZXkgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9wLCBrbm93bmtleSkKICAgICAgICAgZGVmYXVsdCA9IDkwOQogICAgICAgICBkW2tub3dua2V5XSA9IGtub3dudmFsdWUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSwgZGVmYXVsdCksIGtub3dudmFsdWUpCi0gICAgICAgIHNlbGYuZmFpbElmKGtub3dua2V5IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoa25vd25rZXkgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSwgZGVmYXVsdCksIGRlZmF1bHQpCiAgICAgICAgICNwb3BpdGVtCiAgICAgICAgIGtleSwgdmFsdWUgPSBkLnBvcGl0ZW0oKQotICAgICAgICBzZWxmLmZhaWxJZihrZXkgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrZXkgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgc2VsZi5yZWZlcmVuY2Vba2V5XSkKICAgICAgICAgcD1zZWxmLl9lbXB0eV9tYXBwaW5nKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHAucG9waXRlbSkKQEAgLTEzMiwxNyArMTMyLDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZW1wdHlfbWFwcGluZygpLCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucmVmZXJlbmNlKQotICAgICAgICBzZWxmLmFzc2VydF8oYm9vbChzZWxmLl9lbXB0eV9tYXBwaW5nKCkpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oYm9vbChzZWxmLnJlZmVyZW5jZSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5fZW1wdHlfbWFwcGluZygpKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5yZWZlcmVuY2UpIGlzIFRydWUpCiAKICAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgogICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5rZXlzKCksIFtdKQogICAgICAgICBkID0gc2VsZi5yZWZlcmVuY2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuaW5tYXBwaW5nLmtleXMoKVswXSBpbiBkLmtleXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYub3RoZXIua2V5cygpWzBdIG5vdCBpbiBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaW5tYXBwaW5nLmtleXMoKVswXSBpbiBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYub3RoZXIua2V5cygpWzBdIG5vdCBpbiBkLmtleXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmtleXMsIE5vbmUpCiAKICAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CkBAIC0yNjgsMTAgKzI2OCwxMCBAQAogCiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgogICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmdldChzZWxmLm90aGVyLmtleXMoKVswXSkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdLCAzKSwgMykKICAgICAgICAgZCA9IHNlbGYucmVmZXJlbmNlCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmdldChzZWxmLm90aGVyLmtleXMoKVswXSkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdLCAzKSwgMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLmlubWFwcGluZy5rZXlzKClbMF0pLCBzZWxmLmlubWFwcGluZy52YWx1ZXMoKVswXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLmlubWFwcGluZy5rZXlzKClbMF0sIDMpLCBzZWxmLmlubWFwcGluZy52YWx1ZXMoKVswXSkKQEAgLTMwMiwxNSArMzAyLDE1IEBACiBjbGFzcyBUZXN0TWFwcGluZ1Byb3RvY29sKEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CiAgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2NvbnN0cnVjdG9yKHNlbGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9lbXB0eV9tYXBwaW5nKCkgaXMgbm90IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2VtcHR5X21hcHBpbmcoKSBpcyBub3Qgc2VsZi5fZW1wdHlfbWFwcGluZygpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KHg9MSwgeT0yKSwgeyJ4IjogMSwgInkiOiAyfSkKIAogICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2Jvb2woc2VsZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9mdWxsX21hcHBpbmcoeyJ4IjogInkifSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhib29sKHNlbGYuX2VtcHR5X21hcHBpbmcoKSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhib29sKHNlbGYuX2Z1bGxfbWFwcGluZyh7IngiOiAieSJ9KSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9mdWxsX21hcHBpbmcoeyJ4IjogInkifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKHNlbGYuX2VtcHR5X21hcHBpbmcoKSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKHNlbGYuX2Z1bGxfbWFwcGluZyh7IngiOiAieSJ9KSkgaXMgVHJ1ZSkKIAogICAgIGRlZiB0ZXN0X2tleXMoc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2tleXMoc2VsZikKQEAgLTMxOCw5ICszMTgsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5cygpLCBbXSkKICAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7J2EnOiAxLCAnYic6IDJ9KQogICAgICAgICBrID0gZC5rZXlzKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiBrKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2InIGluIGspCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYycgbm90IGluIGspCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdiJyBpbiBrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2MnIG5vdCBpbiBrKQogCiAgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgogICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF92YWx1ZXMoc2VsZikKQEAgLTMzNSw3ICszMzUsNyBAQAogCiAgICAgZGVmIHRlc3RfaGFzX2tleShzZWxmKToKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGQuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQuaGFzX2tleSgnYScpKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCiAgICAgICAgIGsgPSBkLmtleXMoKQogICAgICAgICBrLnNvcnQoKQpAQCAtMzQ1LDEyICszNDUsMTIgQEAKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKCdhJyBpbiBkKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoJ2EnIGluIGQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBkKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdiJyBpbiBkKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2MnIG5vdCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYicgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdjJyBub3QgaW4gZCkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19jb250YWluc19fKQogCkBAIC00MjksNyArNDI5LDcgQEAKICAgICBkZWYgdGVzdF9mcm9ta2V5cyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdC5mcm9ta2V5cygnYWJjJyksIHsnYSc6Tm9uZSwgJ2InOk5vbmUsICdjJzpOb25lfSkKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygoNCw1KSwwKSwgezQ6MCwgNTowfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKFtdKSwge30pCkBAIC00NDAsMTcgKzQ0MCwxNyBAQAogICAgICAgICBjbGFzcyBkaWN0bGlrZShzZWxmLnR5cGUydGVzdCk6IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0bGlrZS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlKCkuZnJvbWtleXMoJ2EnKSwgeydhJzpOb25lfSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3RsaWtlLmZyb21rZXlzKCdhJykuX19jbGFzc19fIGlzIGRpY3RsaWtlKQotICAgICAgICBzZWxmLmFzc2VydF8oZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLl9fY2xhc3NfXyBpcyBkaWN0bGlrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3RsaWtlLmZyb21rZXlzKCdhJykuX19jbGFzc19fIGlzIGRpY3RsaWtlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLl9fY2xhc3NfXyBpcyBkaWN0bGlrZSkKICAgICAgICAgIyBGSVhNRTogdGhlIGZvbGxvd2luZyB3b24ndCB3b3JrIHdpdGggVXNlckRpY3QsIGJlY2F1c2UgaXQncyBhbiBvbGQgc3R5bGUgY2xhc3MKLSAgICAgICAgIyBzZWxmLmFzc2VydF8odHlwZShkaWN0bGlrZS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUodHlwZShkaWN0bGlrZS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKICAgICAgICAgY2xhc3MgbXlkaWN0KHNlbGYudHlwZTJ0ZXN0KToKICAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJEaWN0LlVzZXJEaWN0KCkKICAgICAgICAgdWQgPSBteWRpY3QuZnJvbWtleXMoJ2FiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ZCwgeydhJzpOb25lLCAnYic6Tm9uZX0pCiAgICAgICAgICMgRklYTUU6IHRoZSBmb2xsb3dpbmcgd29uJ3Qgd29yayB3aXRoIFVzZXJEaWN0LCBiZWNhdXNlIGl0J3MgYW4gb2xkIHN0eWxlIGNsYXNzCi0gICAgICAgICMgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodWQsIFVzZXJEaWN0LlVzZXJEaWN0KSkKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpY3QuZnJvbWtleXMpCiAKICAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKQEAgLTQ4MCwxNiArNDgwLDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIHsxOjEsIDI6MiwgMzozfSkKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuY29weSgpLCBkKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShkLmNvcHkoKSwgZC5fX2NsYXNzX18pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLmNvcHkoKSwgZC5fX2NsYXNzX18pKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY29weSwgTm9uZSkKIAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKICAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfZ2V0KHNlbGYpCiAgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuZ2V0KCdjJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KCdjJykgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYScgOiAxLCAnYicgOiAyfSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuZ2V0KCdjJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KCdjJykgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhJyksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnLCAzKSwgMSkKQEAgLTQ5Nyw5ICs0OTcsOSBAQAogICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3NldGRlZmF1bHQoc2VsZikKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5zZXRkZWZhdWx0KCdrZXkwJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCiAgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5MCcsIFtdKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5zZXRkZWZhdWx0KCdrZXkwJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCiAgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5JywgW10pLmFwcGVuZCgzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2tleSddWzBdLCAzKQogICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoNCkKQEAgLTUyNSw5ICs1MjUsOSBAQAogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhLCBpbnQoa2EpKQogICAgICAgICAgICAgICAgICAgICBrYiwgdmIgPSB0YiA9IGIucG9waXRlbSgpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmIsIGludChrYikpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QoY29weW1vZGUgPCAwIGFuZCB0YSAhPSB0YikpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBhKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdChjb3B5bW9kZSA8IDAgYW5kIHRhICE9IHRiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBiKQogCiAgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgogICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9wb3Aoc2VsZikKQEAgLTU4NSw3ICs1ODUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVc2VyRGljdC5Vc2VyRGljdCgpCiAgICAgICAgIHVkID0gbXlkaWN0LmZyb21rZXlzKCdhYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWQsIHsnYSc6Tm9uZSwgJ2InOk5vbmV9KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpKQogCiAgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgogICAgICAgICBUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfcG9wKHNlbGYpCkBAIC02MzYsOCArNjM2LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCByZXByLCBkKQogCiAgICAgZGVmIHRlc3RfbGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHNlbGYuX2VtcHR5X21hcHBpbmcoKSA8IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHNlbGYuX2Z1bGxfbWFwcGluZyh7MTogMn0pIDwgc2VsZi5fZnVsbF9tYXBwaW5nKHsxTDogMkx9KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHNlbGYuX2VtcHR5X21hcHBpbmcoKSA8IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHNlbGYuX2Z1bGxfbWFwcGluZyh7MTogMn0pIDwgc2VsZi5fZnVsbF9tYXBwaW5nKHsxTDogMkx9KSkpCiAKICAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IGNlNDlmZGQuLjczMDZhYTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTQ2MSw3ICs0NjEsNyBAQAogICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMobCwgcHJvdG8pCiAgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB4WzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeFswXSkKIAogICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV90dXBsZShzZWxmKToKICAgICAgICAgdCA9IChbXSwpCkBAIC00NzEsNyArNDcxLDcgQEAKICAgICAgICAgICAgIHggPSBzZWxmLmxvYWRzKHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih4KSwgMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHhbMF0pLCAxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgeFswXVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHhbMF1bMF0pCiAKICAgICBkZWYgdGVzdF9yZWN1cnNpdmVfZGljdChzZWxmKToKICAgICAgICAgZCA9IHt9CkBAIC00ODAsNyArNDgwLDcgQEAKICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGQsIHByb3RvKQogICAgICAgICAgICAgeCA9IHNlbGYubG9hZHMocykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5rZXlzKCksIFsxXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh4WzFdIGlzIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsxXSBpcyB4KQogCiAgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2luc3Qoc2VsZik6CiAgICAgICAgIGkgPSBDKCkKQEAgLTQ4OSw3ICs0ODksNyBAQAogICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoaSwgMikKICAgICAgICAgICAgIHggPSBzZWxmLmxvYWRzKHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcih4KSwgZGlyKGkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHguYXR0ciBpcyB4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguYXR0ciBpcyB4KQogCiAgICAgZGVmIHRlc3RfcmVjdXJzaXZlX211bHRpKHNlbGYpOgogICAgICAgICBsID0gW10KQEAgLTUwMyw3ICs1MDMsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcih4WzBdKSwgZGlyKGkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLmF0dHIua2V5cygpLCBbMV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oeFswXS5hdHRyWzFdIGlzIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXS5hdHRyWzFdIGlzIHgpCiAKICAgICBkZWYgdGVzdF9nYXJ5cChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5lcnJvciwgc2VsZi5sb2FkcywgJ2dhcnlwJykKQEAgLTY0NCw3ICs2NDQsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmxvYWRzKGJhZHBpY2tsZSkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGRldGFpbDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoZGV0YWlsKS5zdGFydHN3aXRoKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihkZXRhaWwpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBwaWNrbGUgcHJvdG9jb2wiKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgYmFkIHByb3RvY29sIG51bWJlciB0byByYWlzZSBWYWx1ZUVycm9yIikKQEAgLTcxNiw3ICs3MTYsNyBAQAogICAgICAgICAgICAgZm9yIHggaW4gTm9uZSwgRmFsc2UsIFRydWU6CiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB5LCAocHJvdG8sIHgsIHMsIHkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHksIChwcm90bywgeCwgcywgeSkpCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZF9vcGNvZGVbcHJvdG8sIHhdCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKGV4cGVjdGVkLCBzKSwgVHJ1ZSkKIApAQCAtNzY2LDggKzc2Niw4IEBACiAKICAgICAgICAgICAgICMgRHVtcCB1c2luZyBwcm90b2NvbCAxIGZvciBjb21wYXJpc29uLgogICAgICAgICAgICAgczEgPSBzZWxmLmR1bXBzKHgsIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oX19uYW1lX18gaW4gczEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oIk15TGlzdCIgaW4gczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoX19uYW1lX18gaW4gczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIk15TGlzdCIgaW4gczEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUob3Bjb2RlLCBzMSksIEZhbHNlKQogCiAgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzMSkKQEAgLTc3Niw4ICs3NzYsOCBAQAogCiAgICAgICAgICAgICAjIER1bXAgdXNpbmcgcHJvdG9jb2wgMiBmb3IgdGVzdC4KICAgICAgICAgICAgIHMyID0gc2VsZi5kdW1wcyh4LCAyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKF9fbmFtZV9fIG5vdCBpbiBzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiTXlMaXN0IiBub3QgaW4gczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoX19uYW1lX18gbm90IGluIHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJNeUxpc3QiIG5vdCBpbiBzMikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShvcGNvZGUsIHMyKSwgVHJ1ZSkKIAogICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMoczIpCkBAIC04MjEsNyArODIxLDcgQEAKICAgICAgICAgICAgIGlmIHByb3RvID09IDA6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fYXBwZW5kcywgMCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG51bV9hcHBlbmRzID49IDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG51bV9hcHBlbmRzID49IDIpCiAKICAgICBkZWYgdGVzdF9kaWN0X2NodW5raW5nKHNlbGYpOgogICAgICAgICBuID0gMTAgICMgdG9vIHNtYWxsIHRvIGNodW5rCkBAIC04NDMsNyArODQzLDcgQEAKICAgICAgICAgICAgIGlmIHByb3RvID09IDA6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fc2V0aXRlbXMsIDApCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhudW1fc2V0aXRlbXMgPj0gMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnVtX3NldGl0ZW1zID49IDIpCiAKICAgICBkZWYgdGVzdF9zaW1wbGVfbmV3b2JqKHNlbGYpOgogICAgICAgICB4ID0gb2JqZWN0Ll9fbmV3X18oU2ltcGxlTmV3T2JqKSAgIyBhdm9pZCBfX2luaXRfXwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weSBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKaW5kZXggNThjYmVjMC4uZjVhMTc3ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQorKysgYi9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CkBAIC04NSw3ICs4NSw3IEBACiAKICAgICBkZWYgdGVzdF9pdGVyYXRvcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZXEoaXRlcihzZWxmLl9mcCksIHNlbGYuX2ZwKQogICAgICAgICAjIERvZXMgdGhpcyBvYmplY3Qgc3VwcG9ydCB0aGUgaXRlcmF0aW9uIHByb3RvY29sPwogICAgICAgICB1bmxlc3MoaGFzYXR0cihzZWxmLl9mcCwgJ19faXRlcl9fJykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkgYi9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkKaW5kZXggMGE4YzVkNi4uNjIzY2U5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weQpAQCAtMTgsNyArMTgsNyBAQAogICAgICAgICAgICAgICAgICMgU2lsZW50IGZhaWwgaGVyZSBzZWVtcyB0aGUgYmVzdCByb3V0ZSBzaW5jZSBzb21lIG1vZHVsZXMKICAgICAgICAgICAgICAgICAjIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGFsbCBlbnZpcm9ubWVudHMuCiAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAiX19hbGxfXyIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgIl9fYWxsX18iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gX19hbGxfXyBhdHRyaWJ1dGUiICUgbW9kbmFtZSkKICAgICAgICAgbmFtZXMgPSB7fQogICAgICAgICBleGVjICJmcm9tICVzIGltcG9ydCAqIiAlIG1vZG5hbWUgaW4gbmFtZXMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weSBiL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQppbmRleCA1MGEyYzc0Li5hOGM3YzJlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5CkBAIC0xNSw3ICsxNSw3IEBACiAgICAgICAgIGZvciBuYW1lIGluIGRpcihfX2Z1dHVyZV9fKToKICAgICAgICAgICAgIG9iaiA9IGdldGF0dHIoX19mdXR1cmVfXywgbmFtZSwgTm9uZSkKICAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvYmosIF9fZnV0dXJlX18uX0ZlYXR1cmUpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gZ2l2ZW5fZmVhdHVyZV9uYW1lcywKICAgICAgICAgICAgICAgICAgICAgIiVyIHNob3VsZCBoYXZlIGJlZW4gaW4gYWxsX2ZlYXR1cmVfbmFtZXMiICUgbmFtZQogICAgICAgICAgICAgICAgICkKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIG9wdGlvbmFsID0gdmFsdWUuZ2V0T3B0aW9uYWxSZWxlYXNlKCkKICAgICAgICAgICAgIG1hbmRhdG9yeSA9IHZhbHVlLmdldE1hbmRhdG9yeVJlbGVhc2UoKQogCi0gICAgICAgICAgICBhID0gc2VsZi5hc3NlcnRfCisgICAgICAgICAgICBhID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICAgICBlID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICAgICAgZGVmIGNoZWNrKHQsIG5hbWUpOgogICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZSh0LCB0dXBsZSksICIlcyBpc24ndCB0dXBsZSIgJSBuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hYmMucHkgYi9MaWIvdGVzdC90ZXN0X2FiYy5weQppbmRleCAzZTA5NTVmLi43MThkOTAzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FiYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FiYy5weQpAQCAtNDQsMjMgKzQ0LDIzIEBACiAgICAgICAgICAgICAgICAgZGVmIGJhcihzZWxmKTogcGFzcyAgIyBjb25jcmV0ZQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYWJzdHJhY3RtZXRob2RzX18sIHNldChbImZvbyJdKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgQykgICMgYmVjYXVzZSBmb28gaXMgYWJzdHJhY3QKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2Fic3RyYWN0KEMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzdHJhY3QoQykpCiAgICAgICAgICAgICBjbGFzcyBEKEMpOgogICAgICAgICAgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MgICMgY29uY3JldGUgb3ZlcnJpZGUgb2YgY29uY3JldGUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoWyJmb28iXSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEQpICAjIGJlY2F1c2UgZm9vIGlzIHN0aWxsIGFic3RyYWN0Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNhYnN0cmFjdChEKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2Fic3RyYWN0KEQpKQogICAgICAgICAgICAgY2xhc3MgRShEKToKICAgICAgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiBwYXNzCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuX19hYnN0cmFjdG1ldGhvZHNfXywgc2V0KCkpCiAgICAgICAgICAgICBFKCkgICMgbm93IGZvbyBpcyBjb25jcmV0ZSwgdG9vCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc2Fic3RyYWN0KEUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2Fic3RyYWN0KEUpKQogICAgICAgICAgICAgY2xhc3MgRihFKToKICAgICAgICAgICAgICAgICBAYWJzdHJhY3R0aGluZwogICAgICAgICAgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MgICMgYWJzdHJhY3Qgb3ZlcnJpZGUgb2YgY29uY3JldGUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRi5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoWyJiYXIiXSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYpICAjIGJlY2F1c2UgYmFyIGlzIGFic3RyYWN0IG5vdwotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzYWJzdHJhY3QoRikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNhYnN0cmFjdChGKSkKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX29sZHN0eWxlX2NsYXNzKHNlbGYpOgogICAgICAgICBjbGFzcyBBOgpAQCAtMTUyLDQxICsxNTIsNDEgQEAKICAgICBkZWYgdGVzdF9yZWdpc3RyYXRpb25fdHJhbnNpdGl2ZW5lc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEE6CiAgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQSwgQSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhBLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQSwgKEEsKSkpCiAgICAgICAgIGNsYXNzIEI6CiAgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhBLCBCKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhBLCAoQiwpKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhCLCBBKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhCLCAoQSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEEsIEIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQSwgKEIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhCLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEIsIChBLCkpKQogICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCiAgICAgICAgIEEucmVnaXN0ZXIoQikKICAgICAgICAgY2xhc3MgQjEoQik6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEIxLCBBKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQjEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhCMSwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEIxLCAoQSwpKSkKICAgICAgICAgY2xhc3MgQzEoQyk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIEIxLnJlZ2lzdGVyKEMxKQotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIEIpKQotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIChCLCkpKQotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIEIxKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhDLCAoQjEsKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEMxLCBBKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQzEsIChBLCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhDMSwgQikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEMxLCAoQiwpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQzEsIEIxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQzEsIChCMSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgKEIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCAoQjEsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDMSwgQikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCAoQiwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIEIxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChCMSwpKSkKICAgICAgICAgQzEucmVnaXN0ZXIoaW50KQogICAgICAgICBjbGFzcyBNeUludChpbnQpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhNeUludCwgQSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKE15SW50LCAoQSwpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoNDIsIEEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSg0MiwgKEEsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE15SW50LCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTXlJbnQsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSg0MiwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKDQyLCAoQSwpKSkKIAogICAgIGRlZiB0ZXN0X2FsbF9uZXdfbWV0aG9kc19hcmVfY2FsbGVkKHNlbGYpOgogICAgICAgICBjbGFzcyBBOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5CmluZGV4IDAzNGZiNTIuLjhmMWZkZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Fic3RyYWN0X251bWJlcnMucHkKQEAgLTksOCArOSw4IEBACiAKIGNsYXNzIFRlc3ROdW1iZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pbnQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGludCwgSW50ZWdyYWwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhpbnQsIENvbXBsZXgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhpbnQsIEludGVncmFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoaW50LCBDb21wbGV4KSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcsIGludCg3KS5yZWFsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGludCg3KS5pbWFnKQpAQCAtMTksOCArMTksOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGludCg3KS5kZW5vbWluYXRvcikKIAogICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGxvbmcsIEludGVncmFsKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MobG9uZywgQ29tcGxleCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGxvbmcsIEludGVncmFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MobG9uZywgQ29tcGxleCkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBsb25nKDcpLnJlYWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbG9uZyg3KS5pbWFnKQpAQCAtMjksMTYgKzI5LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbG9uZyg3KS5kZW5vbWluYXRvcikKIAogICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKGZsb2F0LCBSYXRpb25hbCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGZsb2F0LCBSZWFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBSYXRpb25hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGZsb2F0LCBSZWFsKSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcuMywgZmxvYXQoNy4zKS5yZWFsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGZsb2F0KDcuMykuaW1hZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LjMsIGZsb2F0KDcuMykuY29uanVnYXRlKCkpCiAKICAgICBkZWYgdGVzdF9jb21wbGV4KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKGNvbXBsZXgsIFJlYWwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhjb21wbGV4LCBDb21wbGV4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGNvbXBsZXgsIFJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhjb21wbGV4LCBDb21wbGV4KSkKIAogICAgICAgICBjMSwgYzIgPSBjb21wbGV4KDMsIDIpLCBjb21wbGV4KDQsMSkKICAgICAgICAgIyBYWFg6IFRoaXMgaXMgbm90IGlkZWFsLCBidXQgc2VlIHRoZSBjb21tZW50IGluIG1hdGhfdHJ1bmMoKS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CmluZGV4IDJjNGMyZmQuLjY0MzM5MzUgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQpAQCAtNDgsNyArNDgsNyBAQAogICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnR5cGVjb2RlLCBzZWxmLnR5cGVjb2RlKQotICAgICAgICBzZWxmLmFzc2VydF8oYS5pdGVtc2l6ZT49c2VsZi5taW5pdGVtc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuaXRlbXNpemU+PXNlbGYubWluaXRlbXNpemUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9sZW4oc2VsZik6CkBAIC02MywxMCArNjMsMTAgQEAKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmJ1ZmZlcl9pbmZvLCA0MikKICAgICAgICAgYmkgPSBhLmJ1ZmZlcl9pbmZvKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmksIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmksIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmkpLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiaVswXSwgKGludCwgbG9uZykpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiaVsxXSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmlbMF0sIChpbnQsIGxvbmcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmlbMV0sIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmlbMV0sIGxlbihhKSkKIAogICAgIGRlZiB0ZXN0X2J5dGVzd2FwKHNlbGYpOgpAQCAtMjIyLDM5ICsyMjIsMzkgQEAKIAogICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID09IDQyKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICE9IDQyKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gNDIpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gNDIpIGlzIFRydWUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID09IGEpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAhPSBhKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIDwgYSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8PSBhKSBpcyBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPiBhKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IGEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSBhKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gYSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhKSBpcyBUcnVlKQogCiAgICAgICAgIGFsID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5zbWFsbGVyZXhhbXBsZSkKICAgICAgICAgYWIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmJpZ2dlcmV4YW1wbGUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID09IDIqYSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAhPSAyKmEpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8IDIqYSkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIDw9IDIqYSkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID4gMiphKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IDIqYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSAyKmEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gMiphKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPCAyKmEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PSAyKmEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+IDIqYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSAyKmEpIGlzIEZhbHNlKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA9PSBhbCkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAhPSBhbCkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIDwgYWwpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPD0gYWwpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPiBhbCkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IGFsKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gYWwpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYWwpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGFsKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IGFsKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gYWwpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhbCkgaXMgVHJ1ZSkKIAotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPT0gYWIpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgIT0gYWIpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8IGFiKSBpcyBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPD0gYWIpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA+IGFiKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IGFiKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID09IGFiKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICE9IGFiKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPCBhYikgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IGFiKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiBhYikgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhYikgaXMgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9hZGQoc2VsZik6CiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpIFwKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKQogICAgICAgICBiID0gYQogICAgICAgICBhICs9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgYSwKICAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6Oi0xXSsyKnNlbGYuZXhhbXBsZSkKQEAgLTMxNiwyMiArMzE2LDIyIEBACiAgICAgICAgIGIgPSBhCiAKICAgICAgICAgYSAqPSA1Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBhLAogICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgNSpzZWxmLmV4YW1wbGUpCiAgICAgICAgICkKIAogICAgICAgICBhICo9IDAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKIAogICAgICAgICBhICo9IDEwMDAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKIAogICAgICAgICBhICo9IC0xCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkpCiAKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggODk4NTBmNi4uNGUzMTFlNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTEyMiwyMCArMTIyLDIwIEBACiAKIGNsYXNzIEFTVF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBkZWYgX2Fzc2VydF9vcmRlcihzZWxmLCBhc3Rfbm9kZSwgcGFyZW50X3Bvcyk6CisgICAgZGVmIF9hc3NlcnRUcnVlb3JkZXIoc2VsZiwgYXN0X25vZGUsIHBhcmVudF9wb3MpOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3Rfbm9kZSwgYXN0LkFTVCkgb3IgYXN0X25vZGUuX2ZpZWxkcyBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXN0X25vZGUsIChhc3QuZXhwciwgYXN0LnN0bXQsIGFzdC5leGNlcHRoYW5kbGVyKSk6CiAgICAgICAgICAgICBub2RlX3BvcyA9IChhc3Rfbm9kZS5saW5lbm8sIGFzdF9ub2RlLmNvbF9vZmZzZXQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm9kZV9wb3MgPj0gcGFyZW50X3BvcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlX3BvcyA+PSBwYXJlbnRfcG9zKQogICAgICAgICAgICAgcGFyZW50X3BvcyA9IChhc3Rfbm9kZS5saW5lbm8sIGFzdF9ub2RlLmNvbF9vZmZzZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGFzdF9ub2RlLl9maWVsZHM6CiAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoYXN0X25vZGUsIG5hbWUpCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gdmFsdWU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9vcmRlcihjaGlsZCwgcGFyZW50X3BvcykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGNoaWxkLCBwYXJlbnRfcG9zKQogICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLl9hc3NlcnRfb3JkZXIodmFsdWUsIHBhcmVudF9wb3MpCisgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKHZhbHVlLCBwYXJlbnRfcG9zKQogCiAgICAgZGVmIHRlc3Rfc25pcHBldHMoc2VsZik6CiAgICAgICAgIGZvciBpbnB1dCwgb3V0cHV0LCBraW5kIGluICgoZXhlY190ZXN0cywgZXhlY19yZXN1bHRzLCAiZXhlYyIpLApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgICAgICBmb3IgaSwgbyBpbiBpdGVydG9vbHMuaXppcChpbnB1dCwgb3V0cHV0KToKICAgICAgICAgICAgICAgICBhc3RfdHJlZSA9IGNvbXBpbGUoaSwgIj8iLCBraW5kLCBhc3QuUHlDRl9PTkxZX0FTVCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0b190dXBsZShhc3RfdHJlZSksIG8pCi0gICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X29yZGVyKGFzdF90cmVlLCAoMCwgMCkpCisgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGFzdF90cmVlLCAoMCwgMCkpCiAKICAgICBkZWYgdGVzdF9zbGljZShzZWxmKToKICAgICAgICAgc2xjID0gYXN0LnBhcnNlKCJ4Wzo6XSIpLmJvZHlbMF0udmFsdWUuc2xpY2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKaW5kZXggZGJmNzFiYy4uMjRhYTJiNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgeVsxOjJdICs9IFsxXQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIFsxLCAyLCAxLCAyLCAzXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeSkKIAogICAgIGRlZiB0ZXN0Q3VzdG9tTWV0aG9kczEoc2VsZik6CiAKQEAgLTk2LDIzICs5NiwyMyBAQAogICAgICAgICB5ID0geAogICAgICAgICB4ICs9IDEwCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpKQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDExKQogCiAgICAgICAgIHggPSBhdWdfdGVzdDIoMikKICAgICAgICAgeSA9IHgKICAgICAgICAgeCArPSAxMAogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgudmFsLCAxMikKIAogICAgICAgICB4ID0gYXVnX3Rlc3QzKDMpCiAgICAgICAgIHkgPSB4CiAgICAgICAgIHggKz0gMTAKIAotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBhdWdfdGVzdDMpKQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgudmFsLCAxMykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDM2MGJjYjIuLmNiMWIyZjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0xMzAsMTggKzEzMCwxOCBAQAogICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CiAgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzID09IGV2YWwocikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSBldmFsKHIpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2VuZHN3aXRoKHNlbGYsIHNpemUpOgogICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJwogICAgICAgICBzID0gJy0nICogc2l6ZSArIFNVQlNUUgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5lbmRzd2l0aChTVUJTVFIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5lbmRzd2l0aChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoU1VCU1RSKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgocykpCiAgICAgICAgIHMyID0gJy4uLicgKyBzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzMi5lbmRzd2l0aChzKSkKLSAgICAgICAgc2VsZi5mYWlsSWYocy5lbmRzd2l0aCgnYScgKyBTVUJTVFIpKQotICAgICAgICBzZWxmLmZhaWxJZihTVUJTVFIuZW5kc3dpdGgocykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMi5lbmRzd2l0aChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmVuZHN3aXRoKCdhJyArIFNVQlNUUikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoU1VCU1RSLmVuZHN3aXRoKHMpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfZXhwYW5kdGFicyhzZWxmLCBzaXplKToKQEAgLTE5MSw2MiArMTkxLDYyIEBACiAgICAgZGVmIHRlc3RfaXNhbG51bShzZWxmLCBzaXplKToKICAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKICAgICAgICAgcyA9ICdhJyAqIHNpemUgKyBTVUJTVFIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2FsbnVtKCkpCiAgICAgICAgIHMgKz0gJy4nCi0gICAgICAgIHNlbGYuZmFpbElmKHMuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNhbG51bSgpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2lzYWxwaGEoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICd6enp6enp6JwogICAgICAgICBzID0gJ2EnICogc2l6ZSArIFNVQlNUUgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzYWxwaGEoKSkKICAgICAgICAgcyArPSAnLicKLSAgICAgICAgc2VsZi5mYWlsSWYocy5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc2FscGhhKCkpCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfaXNkaWdpdChzZWxmLCBzaXplKToKICAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKICAgICAgICAgcyA9ICc5JyAqIHNpemUgKyBTVUJTVFIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2RpZ2l0KCkpCiAgICAgICAgIHMgKz0gJ3onCi0gICAgICAgIHNlbGYuZmFpbElmKHMuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNkaWdpdCgpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZiwgc2l6ZSk6CiAgICAgICAgIGNoYXJzID0gJycuam9pbihbIGNocihjKSBmb3IgYyBpbiByYW5nZSgyNTUpIGlmIG5vdCBjaHIoYykuaXN1cHBlcigpIF0pCiAgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbihjaGFycykgKyAyCiAgICAgICAgIHMgPSBjaGFycyAqIHJlcGVhdHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2xvd2VyKCkpCiAgICAgICAgIHMgKz0gJ0EnCi0gICAgICAgIHNlbGYuZmFpbElmKHMuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNsb3dlcigpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2lzc3BhY2Uoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHdoaXRlc3BhY2UgPSAnIFxmXG5cclx0XHYnCiAgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbih3aGl0ZXNwYWNlKSArIDIKICAgICAgICAgcyA9IHdoaXRlc3BhY2UgKiByZXBlYXRzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXNzcGFjZSgpKQogICAgICAgICBzICs9ICdqJwotICAgICAgICBzZWxmLmZhaWxJZihzLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzc3BhY2UoKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9pc3RpdGxlKHNlbGYsIHNpemUpOgogICAgICAgICBTVUJTVFIgPSAnMTIzNDU2JwogICAgICAgICBzID0gJycuam9pbihbJ0EnLCAnYScgKiBzaXplLCBTVUJTVFJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzdGl0bGUoKSkKICAgICAgICAgcyArPSAnQScKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3RpdGxlKCkpCiAgICAgICAgIHMgKz0gJ2FBJwotICAgICAgICBzZWxmLmZhaWxJZihzLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzdGl0bGUoKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9pc3VwcGVyKHNlbGYsIHNpemUpOgogICAgICAgICBjaGFycyA9ICcnLmpvaW4oWyBjaHIoYykgZm9yIGMgaW4gcmFuZ2UoMjU1KSBpZiBub3QgY2hyKGMpLmlzbG93ZXIoKSBdKQogICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBsZW4oY2hhcnMpICsgMgogICAgICAgICBzID0gY2hhcnMgKiByZXBlYXRzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXN1cHBlcigpKQogICAgICAgICBzICs9ICdhJwotICAgICAgICBzZWxmLmZhaWxJZihzLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzdXBwZXIoKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9qb2luKHNlbGYsIHNpemUpOgpAQCAtMjU0LDE0ICsyNTQsMTQgQEAKICAgICAgICAgeCA9IHMuam9pbihbJ2FhYWFhJywgJ2JiYmJiJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguY291bnQoJ2EnKSwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5jb3VudCgnYicpLCA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoeC5zdGFydHN3aXRoKCdhYWFhYUEnKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHguZW5kc3dpdGgoJ0FiYmJiYicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5zdGFydHN3aXRoKCdhYWFhYUEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZW5kc3dpdGgoJ0FiYmJiYicpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTEpCiAgICAgZGVmIHRlc3RfbGp1c3Qoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCiAgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQogCkBAIC0yODIsNyArMjgyLDcgQEAKICAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCiAgICAgICAgIHN0cmlwcGVkID0gcy5sc3RyaXAoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyaXBwZWQgaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmlwcGVkIGlzIHMpCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYsIHNpemUpOgpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgZGVmIHRlc3Rfcmp1c3Qoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCiAgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQogCkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICAgcyA9IFNVQlNUUi5yanVzdChzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCiAgICAgICAgIHN0cmlwcGVkID0gcy5yc3RyaXAoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyaXBwZWQgaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmlwcGVkIGlzIHMpCiAKICAgICAjIFRoZSB0ZXN0IHRha2VzIGFib3V0IHNpemUgYnl0ZXMgdG8gYnVpbGQgYSBzdHJpbmcsIGFuZCB0aGVuIGFib3V0CiAgICAgIyBzcXJ0KHNpemUpIHN1YnN0cmluZ3Mgb2Ygc3FydChzaXplKSBpbiBzaXplIGFuZCBhIGxpc3QgdG8KQEAgLTM5OSw5ICszOTksOSBAQAogICAgIGRlZiB0ZXN0X3N0YXJ0c3dpdGgoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCiAgICAgICAgIHMgPSAnLScgKiBzaXplICsgU1VCU1RSCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgocykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJy0nICogc2l6ZSkpCi0gICAgICAgIHNlbGYuZmFpbElmKHMuc3RhcnRzd2l0aChTVUJTVFIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCctJyAqIHNpemUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuc3RhcnRzd2l0aChTVUJTVFIpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0xKQogICAgIGRlZiB0ZXN0X3N0cmlwKHNlbGYsIHNpemUpOgpAQCAtNDMwLDggKzQzMCw4IEBACiAgICAgICAgIFNVQlNUUiA9ICdTcGFhSEFhYUFhaGFtJwogICAgICAgICBzID0gU1VCU1RSICogKHNpemUgLy8gbGVuKFNVQlNUUikgKyAyKQogICAgICAgICBzID0gcy50aXRsZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoKFNVQlNUUiAqIDMpLnRpdGxlKCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5lbmRzd2l0aChTVUJTVFIubG93ZXIoKSAqIDMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKChTVUJTVFIgKiAzKS50aXRsZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoU1VCU1RSLmxvd2VyKCkgKiAzKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZiwgc2l6ZSk6CkBAIC00NTksOCArNDU5LDggQEAKICAgICBkZWYgdGVzdF96ZmlsbChzZWxmLCBzaXplKToKICAgICAgICAgU1VCU1RSID0gJy01NjgzMjQ3MjM1OTgyMzQnCiAgICAgICAgIHMgPSBTVUJTVFIuemZpbGwoc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuZW5kc3dpdGgoJzAnICsgU1VCU1RSWzE6XSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJy0wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCcwJyArIFNVQlNUUlsxOl0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCctMCcpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJzAnKSwgc2l6ZSAtIGxlbihTVUJTVFIpKQogCkBAIC00NjgsMTIgKzQ2OCwxMiBAQAogICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmLCBzaXplKToKICAgICAgICAgcyA9ICctJyAqIHNpemUKICAgICAgICAgc2YgPSAnJXMnICUgKHMsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocyA9PSBzZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gc2YpCiAgICAgICAgIGRlbCBzZgogICAgICAgICBzZiA9ICcuLiVzLi4nICUgKHMsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oc2YpLCBsZW4ocykgKyA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2Yuc3RhcnRzd2l0aCgnLi4tJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZi5lbmRzd2l0aCgnLS4uJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZi5zdGFydHN3aXRoKCcuLi0nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNmLmVuZHN3aXRoKCctLi4nKSkKICAgICAgICAgZGVsIHMsIHNmCiAKICAgICAgICAgc2l6ZSAvLz0gMgpAQCAtNTE5LDcgKzUxOSw3IEBACiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT0yKiozMiAvIDUsIG1lbXVzZT02KzIpCiAgICAgZGVmIHRlc3RfdW5pY29kZV9yZXByKHNlbGYsIHNpemUpOgogICAgICAgICBzID0gdSJcdUFBQUEiICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKHJlcHIocykpID4gc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXByKHMpKSA+IHNpemUpCiAKICAgICAjIFRoaXMgdGVzdCBpcyBtZWFuaW5nZnVsIGV2ZW4gd2l0aCBzaXplIDwgMkcsIGFzIGxvbmcgYXMgdGhlCiAgICAgIyBkb3VibGVkIHN0cmluZyBpcyA+IDJHIChidXQgaXQgdGVzdHMgbW9yZSBpZiBib3RoIGFyZSA+IDJHIDopCkBAIC01ODAsMjQgKzU4MCwyNCBAQAogICAgICAgICBlZGdlID0gJy0nICogKHNpemUgLy8gMikKICAgICAgICAgcyA9ICcnLmpvaW4oW2VkZ2UsIFNVQlNUUiwgZWRnZV0pCiAgICAgICAgIGRlbCBlZGdlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhTVUJTVFIgaW4gcykKLSAgICAgICAgc2VsZi5mYWlsSWYoU1VCU1RSICogMiBpbiBzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJy0nIGluIHMpCi0gICAgICAgIHNlbGYuZmFpbElmKCdhJyBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoU1VCU1RSIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoU1VCU1RSICogMiBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJy0nIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ2EnIGluIHMpCiAgICAgICAgIHMgKz0gJ2EnCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnYScgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiBzKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKICAgICAgICAgczEgPSAnLScgKiBzaXplCiAgICAgICAgIHMyID0gJy0nICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoczEgPT0gczIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSA9PSBzMikKICAgICAgICAgZGVsIHMyCiAgICAgICAgIHMyID0gczEgKyAnYScKLSAgICAgICAgc2VsZi5mYWlsSWYoczEgPT0gczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoczEgPT0gczIpCiAgICAgICAgIGRlbCBzMgogICAgICAgICBzMiA9ICcuJyAqIHNpemUKLSAgICAgICAgc2VsZi5mYWlsSWYoczEgPT0gczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoczEgPT0gczIpCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKICAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgpAQCAtNjExLDcgKzYxMSw3IEBACiAgICAgICAgIGgxID0gaGFzaChzKQogICAgICAgICBkZWwgcwogICAgICAgICBzID0gJ1x4MDAnICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZihoMSA9PSBoYXNoKHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGgxID09IGhhc2gocykpCiAKIGNsYXNzIFR1cGxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTYyOCwxMyArNjI4LDEzIEBACiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKICAgICAgICAgdDEgPSAodScnLCkgKiBzaXplCiAgICAgICAgIHQyID0gKHUnJywpICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKICAgICAgICAgZGVsIHQyCiAgICAgICAgIHQyID0gKHUnJywpICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZih0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA9PSB0MikKICAgICAgICAgZGVsIHQyCiAgICAgICAgIHQyID0gKDEsKSAqIHNpemUKLSAgICAgICAgc2VsZi5mYWlsSWYodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPT0gdDIpCiAKICAgICAjIFRlc3QgY29uY2F0ZW5hdGluZyBpbnRvIGEgc2luZ2xlIHR1cGxlIG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGgsCiAgICAgIyBhbmQgY29uY2F0ZW5hdGluZyBhIHR1cGxlIG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KQEAgLTY1OSw5ICs2NTksOSBAQAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgogICAgICAgICB0ID0gKDEsIDIsIDMsIDQsIDUpICogc2l6ZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4odCksIHNpemUgKiA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoNSBpbiB0KQotICAgICAgICBzZWxmLmZhaWxJZigoMSwgMiwgMywgNCwgNSkgaW4gdCkKLSAgICAgICAgc2VsZi5mYWlsSWYoMCBpbiB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoNSBpbiB0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgxLCAyLCAzLCA0LCA1KSBpbiB0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDAgaW4gdCkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2hhc2goc2VsZiwgc2l6ZSk6CkBAIC02NjksNyArNjY5LDcgQEAKICAgICAgICAgaDEgPSBoYXNoKHQxKQogICAgICAgICBkZWwgdDEKICAgICAgICAgdDIgPSAoMCwpICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZihoMSA9PSBoYXNoKHQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoMSA9PSBoYXNoKHQyKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2luZGV4X2FuZF9zbGljZShzZWxmLCBzaXplKToKQEAgLTc2MiwxMyArNzYyLDEzIEBACiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKICAgICAgICAgbDEgPSBbdScnXSAqIHNpemUKICAgICAgICAgbDIgPSBbdScnXSAqIHNpemUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGwxID09IGwyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobDEgPT0gbDIpCiAgICAgICAgIGRlbCBsMgogICAgICAgICBsMiA9IFt1JyddICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZihsMSA9PSBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMSA9PSBsMikKICAgICAgICAgZGVsIGwyCiAgICAgICAgIGwyID0gWzJdICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxJZihsMSA9PSBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMSA9PSBsMikKIAogICAgICMgVGVzdCBjb25jYXRlbmF0aW5nIGludG8gYSBzaW5nbGUgbGlzdCBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoLAogICAgICMgYW5kIGNvbmNhdGVuYXRpbmcgYSBsaXN0IG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KQEAgLTc5Myw4ICs3OTMsOCBAQAogICAgICAgICBsID0gW3N5cy5zdGRvdXRdICogc2l6ZQogICAgICAgICBsICs9IGwKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MjQpCiAgICAgZGVmIHRlc3RfaW5wbGFjZV9jb25jYXRfc21hbGwoc2VsZiwgc2l6ZSk6CkBAIC04MDgsMTQgKzgwOCwxNCBAQAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgogICAgICAgICBsID0gWzEsIDIsIDMsIDQsIDVdICogc2l6ZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUgKiA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoNSBpbiBsKQotICAgICAgICBzZWxmLmZhaWxJZihbMSwgMiwgMywgNCwgNV0gaW4gbCkKLSAgICAgICAgc2VsZi5mYWlsSWYoMCBpbiBsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoNSBpbiBsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFsxLCAyLCAzLCA0LCA1XSBpbiBsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDAgaW4gbCkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2hhc2goc2VsZiwgc2l6ZSk6CiAgICAgICAgIGwgPSBbMF0gKiBzaXplCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgbCkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2luZGV4X2FuZF9zbGljZShzZWxmLCBzaXplKToKQEAgLTg3NSw3ICs4NzUsNyBAQAogICAgICMgTGlrZSB0ZXN0X2NvbmNhdCwgc3BsaXQgaW4gdHdvLgogICAgIGRlZiBiYXNpY190ZXN0X3JlcGVhdChzZWxmLCBzaXplKToKICAgICAgICAgbCA9IFtdICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxJZihsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGwpCiAgICAgICAgIGwgPSBbJyddICogc2l6ZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCiAgICAgICAgIGwgPSBsICogMgpAQCAtODkzLDEzICs4OTMsMTMgQEAKICAgICAgICAgbCA9IFsnJ10KICAgICAgICAgbCAqPSBzaXplCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWzBdIGlzIGxbLTFdKQogICAgICAgICBkZWwgbAogCiAgICAgICAgIGwgPSBbJyddICogc2l6ZQogICAgICAgICBsICo9IDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbc2l6ZSAtIDFdIGlzIGxbLTFdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFtzaXplIC0gMV0gaXMgbFstMV0pCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTE2KQogICAgIGRlZiB0ZXN0X2lucGxhY2VfcmVwZWF0X3NtYWxsKHNlbGYsIHNpemUpOgpAQCAtOTMzLDggKzkzMyw4IEBACiAgICAgICAgIGwgPSBbb2JqZWN0KCldICogc2l6ZQogICAgICAgICBsLmFwcGVuZChvYmplY3QoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKzEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsWy0zXSBpcyBsWy0yXSkKLSAgICAgICAgc2VsZi5mYWlsSWYobFstMl0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWy0zXSBpcyBsWy0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsWy0yXSBpcyBsWy0xXSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAyLCBtZW11c2U9OCAqIDUpCiAgICAgZGVmIHRlc3RfY291bnQoc2VsZiwgc2l6ZSk6CkBAIC05NDYsOCArOTQ2LDggQEAKICAgICAgICAgbCA9IFtmaWxlXSAqIHNpemUKICAgICAgICAgbC5leHRlbmQobCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MTYpCiAgICAgZGVmIHRlc3RfZXh0ZW5kX3NtYWxsKHNlbGYsIHNpemUpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weSBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKaW5kZXggZWE4YmUzMS4uYzUzMWM2NSAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CkBAIC0xNCw4ICsxNCw4IEBACiAKICAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgogICAgICAgICAjIENoZWNrIG1vZHVsZSBleGNlcHRpb25zCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKGJpbmFzY2lpLkVycm9yLCBFeGNlcHRpb24pKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhiaW5hc2NpaS5JbmNvbXBsZXRlLCBFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhiaW5hc2NpaS5FcnJvciwgRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYmluYXNjaWkuSW5jb21wbGV0ZSwgRXhjZXB0aW9uKSkKIAogICAgIGRlZiB0ZXN0X2Z1bmN0aW9ucyhzZWxmKToKICAgICAgICAgIyBDaGVjayBwcmVzZW5jZSBvZiBhbGwgZnVuY3Rpb25zCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgICAgICAgICAgICAgICBwcmVmaXhlcy5leHRlbmQoWyJjcmNfIiwgInJsZWNvZGVfIiwgInJsZWRlY29kZV8iXSkKICAgICAgICAgICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgbmFtZSA9IHByZWZpeCArIHN1ZmZpeAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjYWxsYWJsZShnZXRhdHRyKGJpbmFzY2lpLCBuYW1lKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGdldGF0dHIoYmluYXNjaWksIG5hbWUpKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIoYmluYXNjaWksIG5hbWUpKQogICAgICAgICBmb3IgbmFtZSBpbiAoImhleGxpZnkiLCAidW5oZXhsaWZ5Iik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGdldGF0dHIoYmluYXNjaWksIG5hbWUpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpCiAKICAgICBkZWYgdGVzdF9iYXNlNjR2YWxpZChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkgYi9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CmluZGV4IGIzZDlhNjIuLjhhZThmNDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQpAQCAtMjIwLDEwICsyMjAsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoLTEwLCAtMiksIC0yKQogICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAyMCk6CiAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSgxLCAyMCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdjZChpLCBqKSA+IDApCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdjZCgtaSwgaikgPCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhnY2QoaSwgLWopID4gMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZ2NkKC1pLCAtaikgPCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoaSwgaikgPiAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoLWksIGopIDwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2NkKGksIC1qKSA+IDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjZCgtaSwgLWopIDwgMCkKIAogICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgogICAgICAgICBhID0gUmF0KDEwLCAxNSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlzZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkKaW5kZXggNjZiYWU0OC4uOTM0YmE4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkKQEAgLTEzMCwxNCArMTMwLDE0IEBACiAgICAgICAgICAgICBlbGVtID0gcmFuZHJhbmdlKC0xLCBuKzEpCiAgICAgICAgICAgICBpcCA9IHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0KGRhdGEsIGVsZW0pCiAgICAgICAgICAgICBpZiBpcCA8IGxlbihkYXRhKToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZWxlbSA8PSBkYXRhW2lwXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8PSBkYXRhW2lwXSkKICAgICAgICAgICAgIGlmIGlwID4gMDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGF0YVtpcC0xXSA8IGVsZW0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPCBlbGVtKQogICAgICAgICAgICAgaXAgPSBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQoZGF0YSwgZWxlbSkKICAgICAgICAgICAgIGlmIGlwIDwgbGVuKGRhdGEpOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbGVtIDwgZGF0YVtpcF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gPCBkYXRhW2lwXSkKICAgICAgICAgICAgIGlmIGlwID4gMDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGF0YVtpcC0xXSA8PSBlbGVtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhW2lwLTFdIDw9IGVsZW0pCiAKICAgICBkZWYgdGVzdF9vcHRpb25hbFNsaWNpbmcoc2VsZik6CiAgICAgICAgIGZvciBmdW5jLCBkYXRhLCBlbGVtLCBleHBlY3RlZCBpbiBzZWxmLnByZWNvbXB1dGVkQ2FzZXM6CkBAIC0xNDYsMTUgKzE0NiwxNSBAQAogICAgICAgICAgICAgICAgIGZvciBoaSBpbiB4cmFuZ2UoMyw4KToKICAgICAgICAgICAgICAgICAgICAgaGkgPSBtaW4obGVuKGRhdGEpLCBoaSkKICAgICAgICAgICAgICAgICAgICAgaXAgPSBmdW5jKGRhdGEsIGVsZW0sIGxvLCBoaSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxvIDw9IGlwIDw9IGhpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG8gPD0gaXAgPD0gaGkpCiAgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgaXMgc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQgYW5kIGlwIDwgaGk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZWxlbSA8PSBkYXRhW2lwXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIDw9IGRhdGFbaXBdKQogICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0IGFuZCBpcCA+IGxvOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhdGFbaXAtMV0gPCBlbGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPCBlbGVtKQogICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCBhbmQgaXAgPCBoaToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbGVtIDwgZGF0YVtpcF0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8IGRhdGFbaXBdKQogICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCBhbmQgaXAgPiBsbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYXRhW2lwLTFdIDw9IGVsZW0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YVtpcC0xXSA8PSBlbGVtKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlwLCBtYXgobG8sIG1pbihoaSwgZXhwZWN0ZWQpKSkKIAogICAgIGRlZiB0ZXN0X2JhY2tjb21wYXRpYmlsaXR5KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ib29sLnB5IGIvTGliL3Rlc3QvdGVzdF9ib29sLnB5CmluZGV4IDMzMTg1YTAuLjJhOWVmNWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKQEAgLTgsMTAgKzgsMTAgQEAKIGNsYXNzIEJvb2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogICAgIGRlZiBhc3NlcnRJc05vdChzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgbm90IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIG5vdCBiKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3Moc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTIzMywxNSArMjMzLDE1IEBACiAKICAgICBkZWYgdGVzdF9ib29sZWFuKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUgJiAxLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzaW5zdGFuY2UoVHJ1ZSAmIDEsIGJvb2wpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2UoVHJ1ZSAmIDEsIGJvb2wpKQogICAgICAgICBzZWxmLmFzc2VydElzKFRydWUgJiBUcnVlLCBUcnVlKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSB8IDEsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShUcnVlIHwgMSwgYm9vbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShUcnVlIHwgMSwgYm9vbCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoVHJ1ZSB8IFRydWUsIFRydWUpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlIF4gMSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc2luc3RhbmNlKFRydWUgXiAxLCBib29sKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc2luc3RhbmNlKFRydWUgXiAxLCBib29sKSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhUcnVlIF4gVHJ1ZSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9maWxlY2xvc2VkKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ic2RkYi5weSBiL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKaW5kZXggNTZkYWRlNC4uYTRhZjBmMyAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CkBAIC00Myw4ICs0Myw4IEBACiAgICAgZGVmIHRlc3RfY2hhbmdlKHNlbGYpOgogICAgICAgICBzZWxmLmZbJ3InXSA9ICdkaXNjb3ZlcmVkJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZlsnciddLCAnZGlzY292ZXJlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygncicgaW4gc2VsZi5mLmtleXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdkaXNjb3ZlcmVkJyBpbiBzZWxmLmYudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgncicgaW4gc2VsZi5mLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdkaXNjb3ZlcmVkJyBpbiBzZWxmLmYudmFsdWVzKCkpCiAKICAgICBkZWYgdGVzdF9jbG9zZV9hbmRfcmVvcGVuKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmZuYW1lIGlzIE5vbmU6CkBAIC0xNzYsNyArMTc2LDcgQEAKIAogICAgIGRlZiB0ZXN0X2ZpcnN0X3doaWxlX2RlbGV0aW5nKHNlbGYpOgogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAxNzI1ODU2Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5kKSA+PSAyLCAidGVzdCByZXF1aXJlcyA+PTIgaXRlbXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuZCkgPj0gMiwgInRlc3QgcmVxdWlyZXMgPj0yIGl0ZW1zIikKICAgICAgICAgZm9yIF8gaW4gc2VsZi5kOgogICAgICAgICAgICAga2V5ID0gc2VsZi5mLmZpcnN0KClbMF0KICAgICAgICAgICAgIGRlbCBzZWxmLmZba2V5XQpAQCAtMTg0LDcgKzE4NCw3IEBACiAKICAgICBkZWYgdGVzdF9sYXN0X3doaWxlX2RlbGV0aW5nKHNlbGYpOgogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAxNzI1ODU2J3MgZXZpbCB0d2luCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5kKSA+PSAyLCAidGVzdCByZXF1aXJlcyA+PTIgaXRlbXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuZCkgPj0gMiwgInRlc3QgcmVxdWlyZXMgPj0yIGl0ZW1zIikKICAgICAgICAgZm9yIF8gaW4gc2VsZi5kOgogICAgICAgICAgICAga2V5ID0gc2VsZi5mLmxhc3QoKVswXQogICAgICAgICAgICAgZGVsIHNlbGYuZltrZXldCkBAIC0xOTUsMTMgKzE5NSwxMyBAQAogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIGZvciBrIGluIHNlbGYuZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIHNlbGYuZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdub3QgaGVyZScgbm90IGluIHNlbGYuZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdub3QgaGVyZScgbm90IGluIHNlbGYuZikKIAogICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CiAgICAgICAgIGZvciBrIGluIHNlbGYuZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmYuaGFzX2tleShrKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLmYuaGFzX2tleSgnbm90IGhlcmUnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuaGFzX2tleShrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmYuaGFzX2tleSgnbm90IGhlcmUnKSkKIAogICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgogICAgICAgICBzZWxmLmYuY2xlYXIoKQpAQCAtMjUzLDExICsyNTMsMTEgQEAKICAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiSyIKIAogICAgICAgICAjIHRlc3QgdGhlIGxlZ2FjeSBjdXJzb3IgaW50ZXJmYWNlIG1peGVkIHdpdGggd3JpdGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmYuZmlyc3QoKVswXSBpbiBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuZmlyc3QoKVswXSBpbiBzZWxmLmQpCiAgICAgICAgIGsgPSBzZWxmLmYubmV4dCgpWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gc2VsZi5kKQogICAgICAgICBzZWxmLmZba10gPSAiYmUgZ29uZSB3aXRoIHllIGRlYWRsb2NrcyIKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZltrXSwgImJlIGdvbmUgd2l0aCB5ZSBkZWFkbG9ja3MiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mW2tdLCAiYmUgZ29uZSB3aXRoIHllIGRlYWRsb2NrcyIpCiAKICAgICBkZWYgdGVzdF9mb3JfY3Vyc29yX21lbWxlYWsoc2VsZik6CiAgICAgICAgICMgZG8gdGhlIGJzZGRiLl9EQldpdGhDdXJzb3IgaXRlcmF0b3IgaW50ZXJuYWxzIGxlYWsgY3Vyc29ycz8KQEAgLTI3NSwyMSArMjc1LDIxIEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYzEsIG5jMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYzEsIG5jNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5jMyA9PSBuYzErMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5jMyA9PSBuYzErMSkKIAogICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CiAgICAgICAgIGssIHYgPSBzZWxmLmYucG9waXRlbSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIHNlbGYuZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gc2VsZi5kLnZhbHVlcygpKQotICAgICAgICBzZWxmLmFzc2VydF8oayBub3QgaW4gc2VsZi5mKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIHNlbGYuZC52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIHNlbGYuZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5kKS0xLCBsZW4oc2VsZi5mKSkKIAogICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKICAgICAgICAgayA9ICd3JwogICAgICAgICB2ID0gc2VsZi5mLnBvcChrKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIHNlbGYuZFtrXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGsgbm90IGluIHNlbGYuZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHYgbm90IGluIHNlbGYuZi52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgbm90IGluIHNlbGYuZi52YWx1ZXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5kKS0xLCBsZW4oc2VsZi5mKSkKIAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2J1ZmlvLnB5CmluZGV4IDQ4Y2MwZjMuLjEwOGIxZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWZpby5weQpAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzKQogICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBsaW5lKSAjIE11c3QgYmUgYXQgRU9GCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGxpbmUpICMgTXVzdCBiZSBhdCBFT0YKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggMTljZTllYy4uODBlMWI4MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKICAgICBkZWYgdGVzdF9uZWcoc2VsZik6CiAgICAgICAgIHggPSAtc3lzLm1heGludC0xCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHgsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXgsIHN5cy5tYXhpbnQrMSkKIAogICAgIGRlZiB0ZXN0X2FwcGx5KHNlbGYpOgpAQCAtMTUyLDE5ICsxNTIsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcHBseSwgaWQsICg0MiwpLCA0MikKIAogICAgIGRlZiB0ZXN0X2NhbGxhYmxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUobGVuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGxlbikpCiAgICAgICAgIGRlZiBmKCk6IHBhc3MKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNhbGxhYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoZikpCiAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICBkZWYgbWV0aChzZWxmKTogcGFzcwotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShDKSkKICAgICAgICAgeCA9IEMoKQotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoeC5tZXRoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjYWxsYWJsZSh4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKHgubWV0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2FsbGFibGUoeCkpCiAgICAgICAgIGNsYXNzIEQoQyk6CiAgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6IHBhc3MKICAgICAgICAgeSA9IEQoKQotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZSh5KSkKICAgICAgICAgeSgpCiAKICAgICBkZWYgdGVzdF9jaHIoc2VsZik6CkBAIC0xOTMsOSArMTkzLDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXApCiAKICAgICBkZWYgdGVzdF9jb2VyY2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZmNtcChjb2VyY2UoMSwgMS4xKSwgKDEuMCwgMS4xKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChjb2VyY2UoMSwgMS4xKSwgKDEuMCwgMS4xKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29lcmNlKDEsIDFMKSwgKDFMLCAxTCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZmNtcChjb2VyY2UoMUwsIDEuMSksICgxLjAsIDEuMSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoY29lcmNlKDFMLCAxLjEpLCAoMS4wLCAxLjEpKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2VyY2UpCiAgICAgICAgIGNsYXNzIEJhZE51bWJlcjoKICAgICAgICAgICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKQEAgLTIzNCwxMSArMjM0LDExIEBACiAKICAgICAgICAgIyBkaXIoKSAtIGxvY2FsIHNjb3BlCiAgICAgICAgIGxvY2FsX3ZhciA9IDEKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdsb2NhbF92YXInIGluIGRpcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2xvY2FsX3ZhcicgaW4gZGlyKCkpCiAKICAgICAgICAgIyBkaXIobW9kdWxlKQogICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZXhpdCcgaW4gZGlyKHN5cykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZXhpdCcgaW4gZGlyKHN5cykpCiAKICAgICAgICAgIyBkaXIobW9kdWxlX3dpdGhfaW52YWxpZF9fZGljdF9fKQogICAgICAgICBpbXBvcnQgdHlwZXMKQEAgLTI0OCw4ICsyNDgsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpciwgZikKIAogICAgICAgICAjIGRpcih0eXBlKQotICAgICAgICBzZWxmLmFzc2VydF8oInN0cmlwIiBpbiBkaXIoc3RyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX21yb19fIiBub3QgaW4gZGlyKHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgic3RyaXAiIGluIGRpcihzdHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9fbXJvX18iIG5vdCBpbiBkaXIoc3RyKSkKIAogICAgICAgICAjIGRpcihvYmopCiAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgpAQCAtMjU4LDEzICsyNTgsMTMgQEAKICAgICAgICAgICAgICAgICBzZWxmLnkgPSA4CiAgICAgICAgICAgICAgICAgc2VsZi56ID0gOQogICAgICAgICBmID0gRm9vKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJ5IiBpbiBkaXIoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgieSIgaW4gZGlyKGYpKQogCiAgICAgICAgICMgZGlyKG9ial9ub19fZGljdF9fKQogICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgICAgIGYgPSBGb28oKQotICAgICAgICBzZWxmLmFzc2VydF8oIl9fcmVwcl9fIiBpbiBkaXIoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19yZXByX18iIGluIGRpcihmKSkKIAogICAgICAgICAjIGRpcihvYmpfbm9fX2NsYXNzX193aXRoX19kaWN0X18pCiAgICAgICAgICMgKGFuIHVnbHkgdHJpY2sgdG8gY2F1c2UgZ2V0YXR0cihmLCAiX19jbGFzc19fIikgdG8gZmFpbCkKQEAgLTI3MywxNSArMjczLDE1IEBACiAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgc2VsZi5iYXIgPSAid293IgogICAgICAgICBmID0gRm9vKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX3JlcHJfXyIgbm90IGluIGRpcihmKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJiYXIiIGluIGRpcihmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfX3JlcHJfXyIgbm90IGluIGRpcihmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJiYXIiIGluIGRpcihmKSkKIAogICAgICAgICAjIGRpcihvYmpfdXNpbmcgX19kaXJfXykKICAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gWyJrYW4iLCAiZ2EiLCAicm9vIl0KICAgICAgICAgZiA9IEZvbygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkaXIoZikgPT0gWyJnYSIsICJrYW4iLCAicm9vIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXIoZikgPT0gWyJnYSIsICJrYW4iLCAicm9vIl0pCiAKICAgICAgICAgIyBkaXIob2JqX19kaXJfX25vdF9saXN0KQogICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKQEAgLTMwOSwxMCArMzA5LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC1zeXMubWF4aW50LTEsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoc3lzLm1heGludCsxLCAwKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8obm90IGZjbXAoZGl2bW9kKDMuMjUsIDEuMCksICgzLjAsIDAuMjUpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmY21wKGRpdm1vZCgtMy4yNSwgMS4wKSwgKC00LjAsIDAuNzUpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmY21wKGRpdm1vZCgzLjI1LCAtMS4wKSwgKC00LjAsIC0wLjc1KSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZmNtcChkaXZtb2QoLTMuMjUsIC0xLjApLCAoMy4wLCAtMC4yNSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoZGl2bW9kKDMuMjUsIDEuMCksICgzLjAsIDAuMjUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmY21wKGRpdm1vZCgtMy4yNSwgMS4wKSwgKC00LjAsIDAuNzUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmY21wKGRpdm1vZCgzLjI1LCAtMS4wKSwgKC00LjAsIC0wLjc1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChkaXZtb2QoLTMuMjUsIC0xLjApLCAoMy4wLCAtMC4yNSkpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGl2bW9kKQogCkBAIC01NzEsMTEgKzU3MSwxMSBAQAogICAgICAgICAgICAgICAgIGZvciBmdW5jIGluIGZ1bmNzOgogICAgICAgICAgICAgICAgICAgICBvdXRwID0gZmlsdGVyKGZ1bmMsIGNscyhpbnApKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHAsIGV4cCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc2luc3RhbmNlKG91dHAsIGNscykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShvdXRwLCBjbHMpKQogCiAgICAgZGVmIHRlc3RfZ2V0YXR0cihzZWxmKToKICAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICBzZWxmLmFzc2VydF8oZ2V0YXR0cihzeXMsICdzdGRvdXQnKSBpcyBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cihzeXMsICdzdGRvdXQnKSBpcyBzeXMuc3Rkb3V0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIsIHN5cywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyLCBzeXMsIDEsICJmb28iKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIpCkBAIC01ODQsNyArNTg0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2hhc2F0dHIoc2VsZik6CiAgICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc3lzLCAnc3Rkb3V0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHN5cywgJ3N0ZG91dCcpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2F0dHIsIHN5cywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNhdHRyKQogICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CkBAIC02NDcsOSArNjQ3LDkgQEAKICAgICBkZWYgdGVzdF9pbnRlcm4oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50ZXJuKQogICAgICAgICBzID0gIm5ldmVyIGludGVybmVkIGJlZm9yZSIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGludGVybihzKSBpcyBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50ZXJuKHMpIGlzIHMpCiAgICAgICAgIHMyID0gcy5zd2FwY2FzZSgpLnN3YXBjYXNlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGludGVybihzMikgaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludGVybihzMikgaXMgcykKIAogICAgICAgICAjIFN1YmNsYXNzZXMgb2Ygc3RyaW5nIGNhbid0IGJlIGludGVybmVkLCBiZWNhdXNlIHRoZXkKICAgICAgICAgIyBwcm92aWRlIHRvbyBtdWNoIG9wcG9ydHVuaXR5IGZvciBpbnNhbmUgdGhpbmdzIHRvIGhhcHBlbi4KQEAgLTY5MCwxMSArNjkwLDExIEBACiAgICAgICAgIGMgPSBDKCkKICAgICAgICAgZCA9IEQoKQogICAgICAgICBlID0gRSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGMsIEMpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShkLCBDKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc2luc3RhbmNlKGUsIEMpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzaW5zdGFuY2UoYywgRCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZSgnZm9vJywgRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc2luc3RhbmNlKGUsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2UoYywgRCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZSgnZm9vJywgRSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNpbnN0YW5jZSwgRSwgJ2ZvbycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNpbnN0YW5jZSkKIApAQCAtNzA4LDkgKzcwOCw5IEBACiAgICAgICAgIGMgPSBDKCkKICAgICAgICAgZCA9IEQoKQogICAgICAgICBlID0gRSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKEQsIEMpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhDLCBDKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc3N1YmNsYXNzKEMsIEQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhELCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNzdWJjbGFzcyhDLCBEKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCAnZm9vJywgRSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCBFLCAnZm9vJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzKQpAQCAtMTA0MiwxOCArMTA0MiwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKGErNCwgYSwgLTIpLCBbYSs0LCBhKzJdKQogCiAgICAgICAgIHNlcSA9IHJhbmdlKGEsIGIsIGMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGluIHNlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGIgbm90IGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaW4gc2VxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBub3QgaW4gc2VxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXEpLCAyKQogCiAgICAgICAgIHNlcSA9IHJhbmdlKGIsIGEsIC1jKQotICAgICAgICBzZWxmLmFzc2VydF8oYiBpbiBzZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIG5vdCBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgbm90IGluIHNlcSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKIAogICAgICAgICBzZXEgPSByYW5nZSgtYSwgLWIsIC1jKQotICAgICAgICBzZWxmLmFzc2VydF8oLWEgaW4gc2VxKQotICAgICAgICBzZWxmLmFzc2VydF8oLWIgbm90IGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC1hIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC1iIG5vdCBpbiBzZXEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSkKQEAgLTE0NTIsNyArMTQ1Miw3IEBACiAgICAgICAgICMgdGVzdHMgZm9yIG9iamVjdC5fX2Zvcm1hdF9fIHJlYWxseSBiZWxvbmcgZWxzZXdoZXJlLCBidXQKICAgICAgICAgIyAgdGhlcmUncyBubyBnb29kIHBsYWNlIHRvIHB1dCB0aGVtCiAgICAgICAgIHggPSBvYmplY3QoKS5fX2Zvcm1hdF9fKCcnKQotICAgICAgICBzZWxmLmFzc2VydF8oeC5zdGFydHN3aXRoKCc8b2JqZWN0IG9iamVjdCBhdCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5zdGFydHN3aXRoKCc8b2JqZWN0IG9iamVjdCBhdCcpKQogCiAgICAgICAgICMgZmlyc3QgYXJndW1lbnQgdG8gb2JqZWN0Ll9fZm9ybWF0X18gbXVzdCBiZSBzdHJpbmcKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvYmplY3QoKS5fX2Zvcm1hdF9fLCAzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weSBiL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKaW5kZXggMDliNDk3Yi4uZWU0ODA0ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CkBAIC0xMDIsMjIgKzEwMiwyMiBAQAogICAgICAgICBiMyA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAzXSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIxLCBiMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIyICE9IGIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYjEgPD0gYjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiMSA8PSBiMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIxIDwgIGIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYjEgPj0gYjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiMyA+PSBiMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIzID4gIGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjIgIT0gYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA8PSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIxIDw9IGIzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjEgPCAgYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA+PSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIzID49IGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjMgPiAgYjIpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoYjEgIT0gYjIpCi0gICAgICAgIHNlbGYuZmFpbElmKGIyID09IGIzKQotICAgICAgICBzZWxmLmZhaWxJZihiMSA+ICBiMikKLSAgICAgICAgc2VsZi5mYWlsSWYoYjEgPiAgYjMpCi0gICAgICAgIHNlbGYuZmFpbElmKGIxID49IGIzKQotICAgICAgICBzZWxmLmZhaWxJZihiMSA8ICBiMikKLSAgICAgICAgc2VsZi5mYWlsSWYoYjMgPCAgYjIpCi0gICAgICAgIHNlbGYuZmFpbElmKGIzIDw9IGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxICE9IGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIyID09IGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID4gIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID4gIGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID49IGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxIDwgIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIzIDwgIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIzIDw9IGIyKQogCiAgICAgZGVmIHRlc3RfY29tcGFyZV90b19zdHIoc2VsZik6CiAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgQnl0ZXNXYXJuaW5nKQpAQCAtMjIwLDI3ICsyMjAsMjcgQEAKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYiJhYmMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3JkKCdhJykgaW4gYikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGludChvcmQoJ2EnKSkgaW4gYikKLSAgICAgICAgc2VsZi5mYWlsSWYoMjAwIGluIGIpCi0gICAgICAgIHNlbGYuZmFpbElmKDIwMCBpbiBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3JkKCdhJykgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChvcmQoJ2EnKSkgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgyMDAgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgyMDAgaW4gYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAzMDAgaW4gYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAtMSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZmxvYXQob3JkKCdhJykpIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB1ImEiIGluIGIpCiAgICAgICAgIGZvciBmIGluIGJ5dGVzLCBieXRlYXJyYXk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZihiIiIpIGluIGIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZihiImEiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYoYiJiIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmKGIiYyIpIGluIGIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZihiImFiIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmKGIiYmMiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYoYiJhYmMiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZihiImFjIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYoYiJkIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYoYiJkYWIiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZihiImFiZCIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZihiIiIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZihiImEiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYoYiJiIikgaW4gYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmKGIiYyIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZihiImFiIikgaW4gYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmKGIiYmMiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYoYiJhYmMiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmKGIiYWMiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmKGIiZCIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYoYiJkYWIiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmKGIiYWJkIikgaW4gYikKIAogICAgIGRlZiB0ZXN0X2Zyb21oZXgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCkKQEAgLTYwMCw3ICs2MDAsNyBAQAogICAgICAgICBiICs9IGIiZGVmIgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjZGVmIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIgaXMgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQogICAgICAgICBiICs9IGIieHl6IgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjZGVmeHl6IikKICAgICAgICAgdHJ5OgpAQCAtNjE2LDcgKzYxNiw3IEBACiAgICAgICAgIGIgKj0gMwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjYWJjYWJjIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIgaXMgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQogCiAgICAgZGVmIHRlc3RfaXJlcGVhdF8xY2hhcihzZWxmKToKICAgICAgICAgYiA9IGJ5dGVhcnJheShiIngiKQpAQCAtNjI0LDE3ICs2MjQsMTcgQEAKICAgICAgICAgYiAqPSAxMDAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIngiKjEwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIgaXMgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQogCiAgICAgZGVmIHRlc3RfYWxsb2Moc2VsZik6CiAgICAgICAgIGIgPSBieXRlYXJyYXkoKQogICAgICAgICBhbGxvYyA9IGIuX19hbGxvY19fKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFsbG9jID49IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGxvYyA+PSAwKQogICAgICAgICBzZXEgPSBbYWxsb2NdCiAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAgICAgICAgICBiICs9IGIieCIKICAgICAgICAgICAgIGFsbG9jID0gYi5fX2FsbG9jX18oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFsbG9jID49IGxlbihiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGxvYyA+PSBsZW4oYikpCiAgICAgICAgICAgICBpZiBhbGxvYyBub3QgaW4gc2VxOgogICAgICAgICAgICAgICAgIHNlcS5hcHBlbmQoYWxsb2MpCiAKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgICAgICBhLCBiLCBjID0gYnl0ZWFycmF5KGIieCIpLnBhcnRpdGlvbihiInkiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIGlzIG5vdCBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBub3QgYykKICAgICAgICAgYiArPSBiIiEiCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQogICAgICAgICBhLCBiLCBjID0gYnl0ZWFycmF5KGIieCIpLnBhcnRpdGlvbihiInkiKQpAQCAtNzQ0LDcgKzc0NCw3IEBACiAgICAgICAgIGIsIGMsIGEgPSBieXRlYXJyYXkoYiJ4IikucnBhcnRpdGlvbihiInkiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIGlzIG5vdCBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBub3QgYykKICAgICAgICAgYiArPSBiIiEiCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQogICAgICAgICBjLCBiLCBhID0gYnl0ZWFycmF5KGIieCIpLnJwYXJ0aXRpb24oYiJ5IikKQEAgLTgzNiwxMCArODM2LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYmMiKSA8PSBiImFiIiwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9kb2Moc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhieXRlYXJyYXkuX19kb2NfXyAhPSBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYnl0ZWFycmF5Ll9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZWFycmF5KCIpLCBieXRlYXJyYXkuX19kb2NfXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGJ5dGVzLl9fZG9jX18gIT0gTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGJ5dGVzLl9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZXMoIiksIGJ5dGVzLl9fZG9jX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShieXRlYXJyYXkuX19kb2NfXyAhPSBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYnl0ZWFycmF5Ll9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZWFycmF5KCIpLCBieXRlYXJyYXkuX19kb2NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJ5dGVzLl9fZG9jX18gIT0gTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJ5dGVzLl9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZXMoIiksIGJ5dGVzLl9fZG9jX18pCiAKICAgICBkZWYgdGVzdF9mcm9tX2J5dGVhcnJheShzZWxmKToKICAgICAgICAgc2FtcGxlID0gYnl0ZXMoYiJIZWxsbyB3b3JsZFxuXHg4MFx4ODFceGZlXHhmZiIpCkBAIC05NTgsMjAgKzk1OCwyMCBAQAogY2xhc3MgQnl0ZUFycmF5U3ViY2xhc3NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhCeXRlQXJyYXlTdWJjbGFzcywgYnl0ZWFycmF5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoQnl0ZUFycmF5U3ViY2xhc3MoKSwgYnl0ZWFycmF5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQnl0ZUFycmF5U3ViY2xhc3MsIGJ5dGVhcnJheSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKEJ5dGVBcnJheVN1YmNsYXNzKCksIGJ5dGVhcnJheSkpCiAKICAgICAgICAgYSwgYiA9IGIiYWJjZCIsIGIiZWZnaCIKICAgICAgICAgX2EsIF9iID0gQnl0ZUFycmF5U3ViY2xhc3MoYSksIEJ5dGVBcnJheVN1YmNsYXNzKGIpCiAKICAgICAgICAgIyB0ZXN0IGNvbXBhcmlzb24gb3BlcmF0b3JzIHdpdGggc3ViY2xhc3MgaW5zdGFuY2VzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhfYSA9PSBfYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9hICE9IF9iKQotICAgICAgICBzZWxmLmFzc2VydF8oX2EgPCBfYikKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9hIDw9IF9iKQotICAgICAgICBzZWxmLmFzc2VydF8oX2IgPj0gX2EpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhfYiA+IF9hKQotICAgICAgICBzZWxmLmFzc2VydF8oX2EgaXMgbm90IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYSA9PSBfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hICE9IF9iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgPCBfYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hIDw9IF9iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2IgPj0gX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYiA+IF9hKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgaXMgbm90IGEpCiAKICAgICAgICAgIyB0ZXN0IGNvbmNhdCBvZiBzdWJjbGFzcyBpbnN0YW5jZXMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgYiwgX2EgKyBfYikKQEAgLTk3OSw3ICs5NzksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyBiLCBfYSArIGIpCiAKICAgICAgICAgIyB0ZXN0IHJlcGVhdAotICAgICAgICBzZWxmLmFzc2VydF8oYSo1ID09IF9hKjUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhKjUgPT0gX2EqNSkKIAogICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGpvaW4gcmV0dXJucyBhIE5FVyBvYmplY3QgZm9yIHNpbmdsZSBpdGVtIHNlcXVlbmNlcwpAQCAtOTg3LDEyICs5ODcsMTIgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBpdCBpcyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KICAgICAgICAgczEgPSBCeXRlQXJyYXlTdWJjbGFzcyhiImFiY2QiKQogICAgICAgICBzMiA9IGJ5dGVhcnJheSgpLmpvaW4oW3MxXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMxIGlzIG5vdCBzMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoczIpIGlzIGJ5dGVhcnJheSwgdHlwZShzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHMyKSBpcyBieXRlYXJyYXksIHR5cGUoczIpKQogCiAgICAgICAgICMgVGVzdCByZXZlcnNlLCBjYWxsaW5nIGpvaW4gb24gc3ViY2xhc3MKICAgICAgICAgczMgPSBzMS5qb2luKFtiImFiY2QiXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoczMpIGlzIGJ5dGVhcnJheSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczMpIGlzIGJ5dGVhcnJheSkKIAogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKICAgICAgICAgYSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiYWJjZCIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKaW5kZXggODdmZTEzYy4uNGRjMzEwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAgICAgaWYgY29udGV4dCBhbmQgbm90IGNvbnRleHQuZXZlbnQuaXNfc2V0KCk6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb3VudCA8IDEwMDAwLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50IDwgMTAwMDAsCiAgICAgICAgICAgICAgICAgInRpbWVvdXQgd2FpdGluZyBmb3IgJWkgY2FsbGJhY2tzLCBnb3QgJWkiJShuLCBsZW4obCkpKQogICAgICAgICBpZiBGYWxzZSBhbmQgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiKCVpKSIlKGxlbihsKSwpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NmZ3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CmluZGV4IGEwZDgwNTEuLmI5OWRkYzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CkBAIC04MSwxNiArODEsMTYgQEAKICAgICAgICAgZXEoY2YuZ2V0KCdTcGFjZXMnLCAna2V5IHdpdGggc3BhY2VzJyksICd2YWx1ZScpCiAgICAgICAgIGVxKGNmLmdldCgnU3BhY2VzJywgJ2Fub3RoZXIgd2l0aCBzcGFjZXMnKSwgJ3NwbGF0IScpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoJ19fbmFtZV9fJyBpbiBjZi5vcHRpb25zKCJGb28gQmFyIiksCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ19fbmFtZV9fJyBpbiBjZi5vcHRpb25zKCJGb28gQmFyIiksCiAgICAgICAgICAgICAgICAgICAgICdfX25hbWVfXyAib3B0aW9uIiBzaG91bGQgbm90IGJlIGV4cG9zZWQgYnkgdGhlIEFQSSEnKQogCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSByaWdodCB0aGluZ3MgaGFwcGVuIGZvciByZW1vdmVfb3B0aW9uKCk7CiAgICAgICAgICMgYWRkZWQgdG8gaW5jbHVkZSBjaGVjayBmb3IgU291cmNlRm9yZ2UgYnVnICMxMjMzMjQ6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjZi5yZW1vdmVfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YucmVtb3ZlX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVfb3B0aW9uKCkgZmFpbGVkIHRvIHJlcG9ydCBleGlzdGVuY2Ugb2Ygb3B0aW9uIikKLSAgICAgICAgc2VsZi5mYWlsSWYoY2YuaGFzX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5oYXNfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX29wdGlvbigpIGZhaWxlZCB0byByZW1vdmUgb3B0aW9uIikKLSAgICAgICAgc2VsZi5mYWlsSWYoY2YucmVtb3ZlX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5yZW1vdmVfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX29wdGlvbigpIGZhaWxlZCB0byByZXBvcnQgbm9uLWV4aXN0ZW5jZSBvZiBvcHRpb24iCiAgICAgICAgICAgICAgICAgICAgICIgdGhhdCB3YXMgcmVtb3ZlZCIpCiAKQEAgLTExMiwxMCArMTEyLDEwIEBACiAgICAgICAgIGVxKGNmLm9wdGlvbnMoImEiKSwgWyJiIl0pCiAgICAgICAgIGVxKGNmLmdldCgiYSIsICJiIiksICJ2YWx1ZSIsCiAgICAgICAgICAgICJjb3VsZCBub3QgbG9jYXRlIG9wdGlvbiwgZXhwZWN0aW5nIGNhc2UtaW5zZW5zaXRpdmUgb3B0aW9uIG5hbWVzIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNmLmhhc19vcHRpb24oImEiLCAiYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YuaGFzX29wdGlvbigiYSIsICJiIikpCiAgICAgICAgIGNmLnNldCgiQSIsICJBLUIiLCAiQS1CIHZhbHVlIikKICAgICAgICAgZm9yIG9wdCBpbiAoImEtYiIsICJBLWIiLCAiYS1CIiwgIkEtQiIpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIGNmLmhhc19vcHRpb24oIkEiLCBvcHQpLAogICAgICAgICAgICAgICAgICJoYXNfb3B0aW9uKCkgcmV0dXJuZWQgZmFsc2UgZm9yIG9wdGlvbiB3aGljaCBzaG91bGQgZXhpc3QiKQogICAgICAgICBlcShjZi5vcHRpb25zKCJBIiksIFsiYS1iIl0pCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgIyBTRiBidWcgIzU2MTgyMjoKICAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoIltzZWN0aW9uXVxubmVrZXk9bmV2YWx1ZVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHM9eyJrZXkiOiJ2YWx1ZSJ9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY2YuaGFzX29wdGlvbigic2VjdGlvbiIsICJLZXkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNmLmhhc19vcHRpb24oInNlY3Rpb24iLCAiS2V5IikpCiAKIAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfY2FzZV9zZW5zaXRpdml0eShzZWxmKToKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5zZWN0aW9ucygpLCBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3IENvbmZpZ1BhcnNlciBzaG91bGQgaGF2ZSBubyBkZWZpbmVkIHNlY3Rpb25zIikKLSAgICAgICAgc2VsZi5mYWlsSWYoY2YuaGFzX3NlY3Rpb24oIkZvbyIpLAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNmLmhhc19zZWN0aW9uKCJGb28iKSwKICAgICAgICAgICAgICAgICAgICAgIm5ldyBDb25maWdQYXJzZXIgc2hvdWxkIGhhdmUgbm8gYWNrbm93bGVkZ2VkIHNlY3Rpb25zIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQ29uZmlnUGFyc2VyLk5vU2VjdGlvbkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjZi5vcHRpb25zLCAiRm9vIikKQEAgLTIwNyw4ICsyMDcsOCBAQAogICAgICAgICAgICAgIkU1PUZBTFNFIEFORCBNT1JFIgogICAgICAgICAgICAgKQogICAgICAgICBmb3IgeCBpbiByYW5nZSgxLCA1KToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICd0JWQnICUgeCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICdmJWQnICUgeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YuZ2V0Ym9vbGVhbignQk9PTFRFU1QnLCAndCVkJyAlIHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICdmJWQnICUgeCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YuZ2V0Ym9vbGVhbiwgJ0JPT0xURVNUJywgJ2UlZCcgJSB4KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NnaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CmluZGV4IDgwMGY2MjkuLmFhMjZiYjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CkBAIC0xNTEsMTAgKzE1MSwxMCBAQAogICAgICAgICAgICAgICAgICMgdGVzdCBpbmRpdmlkdWFsIGZpZWxkcwogICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gZXhwZWN0LmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3ZhbCA9IGV4cGVjdFtrZXldCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhmY2QuaGFzX2tleShrZXkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZmNkLmhhc19rZXkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKGZjZFtrZXldKSwgbm9ybShleHBlY3Rba2V5XSkpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmNkLmdldChrZXksICJkZWZhdWx0IiksIGZjZFtrZXldKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZnMuaGFzX2tleShrZXkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZnMuaGFzX2tleShrZXkpKQogICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZXhwZWN0X3ZhbCkgPiAxOgogICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3ZhbHVlID0gMAogICAgICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMTYyLDEwICsxNjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2Rba2V5XQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2luZ2xlX3ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZShrZXkpLCBleHBlY3RfdmFsKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaW5nbGVfdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgZXhwZWN0X3ZhbFswXSkKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoa2V5KSwgZXhwZWN0X3ZhbFswXSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKHNkLmdldGxpc3Qoa2V5KSksIG5vcm0oZXhwZWN0X3ZhbCkpCkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgICAgIyBpZiB3ZSdyZSBub3QgY2h1bmtpbmcgcHJvcGVybHksIHJlYWRsaW5lIGlzIG9ubHkgY2FsbGVkIHR3aWNlCiAgICAgICAgICMgKGJ5IHJlYWRfYmluYXJ5KTsgaWYgd2UgYXJlIGNodW5raW5nIHByb3Blcmx5LCBpdCB3aWxsIGJlIGNhbGxlZCA1IHRpbWVzCiAgICAgICAgICMgYXMgbG9uZyBhcyB0aGUgY2h1bmtzaXplIGlzIDEgPDwgMTYuCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmLm51bWNhbGxzID4gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYubnVtY2FsbHMgPiAyKQogCiAgICAgZGVmIHRlc3RfZmllbGRzdG9yYWdlX211bHRpcGFydChzZWxmKToKICAgICAgICAgI1Rlc3QgYmFzaWMgRmllbGRTdG9yYWdlIG11bHRpcGFydCBwYXJzaW5nCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWF0aC5weQppbmRleCA1MjhmMzA3Li4yMGMxN2JkIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21hdGgucHkKQEAgLTQxNiw3ICs0MTYsNyBAQAogCiAgICAgICAgICMgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBOYU4KICAgICAgICAgZm9yIHogaW4gY29tcGxleF9uYW5zOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4ocGhhc2UoeikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocGhhc2UoeikpKQogCiAgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgogICAgICAgICAjIHplcm9zCkBAIC00MjksMTggKzQyOSwxOCBAQAogCiAgICAgICAgICMgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBOYU4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleChOQU4sIC1JTkYpKSwgSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIC0yLjMpKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgLTAuMCkpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCAwLjApKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgMi4zKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIC0yLjMpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgLTAuMCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCAwLjApKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgMi4zKSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhjb21wbGV4KE5BTiwgSU5GKSksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleCgtSU5GLCBOQU4pKSwgSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihhYnMoY29tcGxleCgtMi4zLCBOQU4pKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KC0wLjAsIE5BTikpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoMC4wLCBOQU4pKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KDIuMywgTkFOKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleCgtMi4zLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KC0wLjAsIE5BTikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoMC4wLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KDIuMywgTkFOKSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhjb21wbGV4KElORiwgTkFOKSksIElORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgTkFOKSkpKQogCiAgICAgICAgICMgcmVzdWx0IG92ZXJmbG93cwogICAgICAgICBpZiBmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIik6CkBAIC00NTksMjYgKzQ1OSwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDEsIC1waS8yKSwgKDAsIC0xLikpCiAKICAgICBkZWYgdGVzdF9pc25hbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsSWYoY21hdGguaXNuYW4oMSkpCi0gICAgICAgIHNlbGYuZmFpbElmKGNtYXRoLmlzbmFuKDFqKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoY21hdGguaXNuYW4oSU5GKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKE5BTikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWF0aC5pc25hbihjb21wbGV4KE5BTiwgMCkpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNuYW4oY29tcGxleCgwLCBOQU4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBOQU4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBJTkYpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKGNvbXBsZXgoSU5GLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbigxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbigxaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21hdGguaXNuYW4oSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKE5BTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc25hbihjb21wbGV4KE5BTiwgMCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oY29tcGxleCgwLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBJTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoSU5GLCBOQU4pKSkKIAogICAgIGRlZiB0ZXN0X2lzaW5mKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZihjbWF0aC5pc2luZigxKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoY21hdGguaXNpbmYoMWopKQotICAgICAgICBzZWxmLmZhaWxJZihjbWF0aC5pc2luZihOQU4pKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoSU5GKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzaW5mKGNvbXBsZXgoSU5GLCAwKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWF0aC5pc2luZihjb21wbGV4KDAsIElORikpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoY29tcGxleChJTkYsIElORikpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoY29tcGxleChOQU4sIElORikpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoY29tcGxleChJTkYsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKDFqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc2luZihOQU4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzaW5mKGNvbXBsZXgoSU5GLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihjb21wbGV4KDAsIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChOQU4sIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIE5BTikpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKaW5kZXggMjljOTJmYS4uY2VmYjlhZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKQEAgLTE1NCw5ICsxNTQsOSBAQAogICAgICAgICAgICAgcHJpbnQgcHJpbnRlZF9maWxlCiAgICAgICAgICAgICBwcmludCBwcmludGVkX3BhY2thZ2UKICAgICAgICAgICAgIHByaW50IHByaW50ZWRfYXJndjAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByaW50ZWRfZmlsZSBpbiBkYXRhKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJpbnRlZF9wYWNrYWdlIGluIGRhdGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwcmludGVkX2FyZ3YwIGluIGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmludGVkX2ZpbGUgaW4gZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByaW50ZWRfcGFja2FnZSBpbiBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJpbnRlZF9hcmd2MCBpbiBkYXRhKQogCiAgICAgZGVmIF9jaGVja19pbXBvcnRfZXJyb3Ioc2VsZiwgc2NyaXB0X25hbWUsIGV4cGVjdGVkX21zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY21kX2xpbmVfc3dpdGNoZXMpOgpAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICAgICAgICBwcmludCAnT3V0cHV0IGZyb20gdGVzdCBzY3JpcHQgJXI6JyAlIHNjcmlwdF9uYW1lCiAgICAgICAgICAgICBwcmludCBkYXRhCiAgICAgICAgICAgICBwcmludCAnRXhwZWN0ZWQgb3V0cHV0OiAlcicgJSBleHBlY3RlZF9tc2cKLSAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkX21zZyBpbiBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWRfbXNnIGluIGRhdGEpCiAKICAgICBkZWYgdGVzdF9iYXNpY19zY3JpcHQoc2VsZik6CiAgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQppbmRleCA1ZGY2ZmU1Li4wNmNhYjFjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgIGYud3JpdGUodSJzcGFtIikKICAgICAgICAgZCA9IHMuZ2V0dmFsdWUoKQogICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZXhhY3RseSBvbmUgQk9NIGluIGl0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCiAgICAgICAgICMgdHJ5IHRvIHJlYWQgaXQgYmFjawogICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oZCkKICAgICAgICAgZiA9IHJlYWRlcihzKQpAQCAtMzkwLDcgKzM5MCw3IEBACiAgICAgICAgIGYud3JpdGUodSJzcGFtIikKICAgICAgICAgZCA9IHMuZ2V0dmFsdWUoKQogICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZXhhY3RseSBvbmUgQk9NIGluIGl0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCiAgICAgICAgICMgdHJ5IHRvIHJlYWQgaXQgYmFjawogICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oZCkKICAgICAgICAgZiA9IHJlYWRlcihzKQpAQCAtMTEyOSwxNCArMTEyOSwxNCBAQAogICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJiYXNlNjRfY29kZWMiKShTdHJpbmdJTy5TdHJpbmdJTyhzaW4pKQogICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXQsICJceDgwIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc291dCwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc291dCwgc3RyKSkKIAogICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgogICAgICAgICBzaW4gPSAiXHg4MCIuZW5jb2RlKCJiYXNlNjRfY29kZWMiKQogICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJiYXNlNjRfY29kZWMiKShTdHJpbmdJTy5TdHJpbmdJTyhzaW4pKQogICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWRsaW5lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3V0LCAiXHg4MCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNvdXQsIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNvdXQsIHN0cikpCiAKIGFsbF91bmljb2RlX2VuY29kaW5ncyA9IFsKICAgICAiYXNjaWkiLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQppbmRleCA1ZDA2ZjJjLi42OTAwNDA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQpAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICAnJydzdWNjZWVkIGlmZiBzdHIgaXMgYSB2YWxpZCBwaWVjZSBvZiBjb2RlJycnCiAgICAgICAgIGlmIGlzX2p5dGhvbjoKICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlX2NvbW1hbmQoc3RyLCAiPGlucHV0PiIsIHN5bWJvbCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGUpCiAgICAgICAgICAgICBpZiBzeW1ib2wgPT0gInNpbmdsZSI6CiAgICAgICAgICAgICAgICAgZCxyID0ge30se30KICAgICAgICAgICAgICAgICBzYXZlZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQoc3RyLHN5bWJvbD1zeW1ib2wpCiAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgY29kZSIpCiAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc19zeW50YXgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNfc3ludGF4KQogICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfc3ludGF4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19zeW50YXgpCiAKICAgICBkZWYgdGVzdF92YWxpZChzZWxmKToKICAgICAgICAgYXYgPSBzZWxmLmFzc2VydFZhbGlkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weQppbmRleCBhNzBmODJkLi42N2QxOWE2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkKQEAgLTMwNywxNCArMzA3LDE0IEBACiAgICAgICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcwogICAgICAgICBjbGFzcyBXYWNreUNvbXBhcmVyKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgSW52YWxpZCBjbXAgbWFrZXMgdGhpcyB1bmhhc2hhYmxlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNtcChXYWNreUNvbXBhcmVyKCksIGV2aWxfY29lcmNlciksIDApCiAgICAgICAgICMgLi4uYW5kIGNsYXNzaWMgY2xhc3NlcyB0b28sIHNpbmNlIHRoYXQgY29kZSBwYXRoIGlzIGEgbGl0dGxlIGRpZmZlcmVudAogICAgICAgICBjbGFzcyBDbGFzc2ljV2Fja3lDb21wYXJlcjoKICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNsZiwgb3RoZXIpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNtcChDbGFzc2ljV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQppbmRleCAxYzQ5ODc2Li5mYjI0ZDQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKQEAgLTQyLDkgKzQyLDkgQEAKICAgICAgICAgbmFtZWR0dXBsZSgnXycsICdhIGIgYycpICAgICAgICAjIFRlc3QgbGVhZGluZyB1bmRlcnNjb3JlcyBpbiBhIHR5cGVuYW1lCiAKICAgICAgICAgbnQgPSBuYW1lZHR1cGxlKCdudCcsIHUndGhlIHF1aWNrIGJyb3duIGZveCcpICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHVuaWNvZGUgaW5wdXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJ1JyIgbm90IGluIHJlcHIobnQuX2ZpZWxkcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgidSciIG5vdCBpbiByZXByKG50Ll9maWVsZHMpKQogICAgICAgICBudCA9IG5hbWVkdHVwbGUoJ250JywgKHUndGhlJywgdSdxdWljaycpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdW5pY29kZSBpbnB1dAotICAgICAgICBzZWxmLmFzc2VydF8oInUnIiBub3QgaW4gcmVwcihudC5fZmllbGRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJ1JyIgbm90IGluIHJlcHIobnQuX2ZpZWxkcykpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQb2ludC5fbWFrZSwgWzExXSkgICAgICAgICAgICAgICAgICAgICAjIGNhdGNoIHRvbyBmZXcgYXJncwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBvaW50Ll9tYWtlLCBbMTEsIDIyLCAzM10pICAgICAgICAgICAgICMgY2F0Y2ggdG9vIG1hbnkgYXJncwpAQCAtNzMsOCArNzMsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdQb2ludChYWFg9MSwgeT0yKScsIGxvY2FscygpKSAgICMgd3Jvbmcga2V5d29yZCBhcmd1bWVudAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdQb2ludCh4PTEpJywgbG9jYWxzKCkpICAgICAgICAgICMgbWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwKSwgJ1BvaW50KHg9MTEsIHk9MjIpJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdfX2RpY3RfXycgbm90IGluIGRpcihwKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZlcmlmeSBpbnN0YW5jZSBoYXMgbm8gZGljdAotICAgICAgICBzZWxmLmFzc2VydF8oJ19fd2Vha3JlZl9fJyBub3QgaW4gZGlyKHApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ19fZGljdF9fJyBub3QgaW4gZGlyKHApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGluc3RhbmNlIGhhcyBubyBkaWN0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnX193ZWFrcmVmX18nIG5vdCBpbiBkaXIocCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgUG9pbnQuX21ha2UoWzExLCAyMl0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9tYWtlIGNsYXNzbWV0aG9kCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fZmllbGRzLCAoJ3gnLCAneScpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9maWVsZHMgYXR0cmlidXRlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fcmVwbGFjZSh4PTEpLCAoMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9yZXBsYWNlIG1ldGhvZApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykKICAgICAgICAgcCA9IFBvaW50KDExLCAyMikKIAotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHAsIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCAoMTEsIDIyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hdGNoZXMgYSByZWFsIHR1cGxlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUocCksICgxMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2VyY2FibGUgdG8gYSByZWFsIHR1cGxlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwKSwgWzExLCAyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2VyY2FibGUgdG8gYSBsaXN0CkBAIC0yMzMsOCArMjMzLDggQEAKICAgICAgICAgIyBDaGVjayBzb21lIG5vbi1oYXNoYWJsZXMKICAgICAgICAgbm9uX3NhbXBsZXMgPSBbbGlzdCgpLCBzZXQoKSwgZGljdCgpXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UoeCwgSGFzaGFibGUpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyh0eXBlKHgpLCBIYXNoYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoeCwgSGFzaGFibGUpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgIyBDaGVjayBzb21lIGhhc2hhYmxlcwogICAgICAgICBzYW1wbGVzID0gW05vbmUsCiAgICAgICAgICAgICAgICAgICAgaW50KCksIGZsb2F0KCksIGNvbXBsZXgoKSwKQEAgLTI0Myw4ICsyNDMsOCBAQAogICAgICAgICAgICAgICAgICAgIGludCwgbGlzdCwgb2JqZWN0LCB0eXBlLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHgsIEhhc2hhYmxlKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIEhhc2hhYmxlKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBIYXNoYWJsZSkKICAgICAgICAgIyBDaGVjayBkaXJlY3Qgc3ViY2xhc3NpbmcKICAgICAgICAgY2xhc3MgSChIYXNoYWJsZSk6CkBAIC0yNTIsMTUgKzI1MiwxNSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihILCBzZWxmKS5fX2hhc2hfXygpCiAgICAgICAgICAgICBfX2VxX18gPSBIYXNoYWJsZS5fX2VxX18gIyBTaWxlbmNlIFB5M2sgd2FybmluZwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goSCgpKSwgMCkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhpbnQsIEgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBIKSkKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEhhc2hhYmxlLCAnX19oYXNoX18nKQogCiAgICAgZGVmIHRlc3RfSXRlcmFibGUoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgc29tZSBub24taXRlcmFibGVzCiAgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxal0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHgsIEl0ZXJhYmxlKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHgsIEl0ZXJhYmxlKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBJdGVyYWJsZSksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgICMgQ2hlY2sgc29tZSBpdGVyYWJsZXMKICAgICAgICAgc2FtcGxlcyA9IFtzdHIoKSwKICAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBsaXN0KCksIHNldCgpLCBmcm96ZW5zZXQoKSwgZGljdCgpLApAQCAtMjY5LDIyICsyNjksMjIgQEAKICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoeCwgSXRlcmFibGUpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgSXRlcmFibGUpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQogICAgICAgICAjIENoZWNrIGRpcmVjdCBzdWJjbGFzc2luZwogICAgICAgICBjbGFzcyBJKEl0ZXJhYmxlKToKICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoSSwgc2VsZikuX19pdGVyX18oKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoSSgpKSwgW10pCi0gICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3Moc3RyLCBJKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHN0ciwgSSkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhJdGVyYWJsZSwgJ19faXRlcl9fJykKIAogICAgIGRlZiB0ZXN0X0l0ZXJhdG9yKHNlbGYpOgogICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosICIiLmVuY29kZSgnYXNjaWknKSwgIiIsICgpLCBbXSwKICAgICAgICAgICAgIHt9LCBzZXQoKV0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmF0b3IpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBJdGVyYXRvciksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgIHNhbXBsZXMgPSBbaXRlcihzdHIoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcih0dXBsZSgpKSwgaXRlcihsaXN0KCkpLCBpdGVyKGRpY3QoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcihzZXQoKSksIGl0ZXIoZnJvemVuc2V0KCkpLApAQCAtMjk0LDggKzI5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhdG9yKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhdG9yKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEl0ZXJhdG9yLCAnbmV4dCcpCiAKICAgICBkZWYgdGVzdF9TaXplZChzZWxmKToKQEAgLTMwNCwxNSArMzA0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyh0eXBlKHgpLCBTaXplZCksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIFNpemVkKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgc2FtcGxlcyA9IFtzdHIoKSwKICAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBsaXN0KCksIHNldCgpLCBmcm96ZW5zZXQoKSwgZGljdCgpLAogICAgICAgICAgICAgICAgICAgIGRpY3QoKS5rZXlzKCksIGRpY3QoKS5pdGVtcygpLCBkaWN0KCkudmFsdWVzKCksCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3ModHlwZSh4KSwgU2l6ZWQpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgU2l6ZWQpLCByZXByKHR5cGUoeCkpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoU2l6ZWQsICdfX2xlbl9fJykKIAogICAgIGRlZiB0ZXN0X0NvbnRhaW5lcihzZWxmKToKQEAgLTMyMSwxNSArMzIxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UoeCwgQ29udGFpbmVyKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3ModHlwZSh4KSwgQ29udGFpbmVyKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZSh4LCBDb250YWluZXIpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbnRhaW5lciksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgIHNhbXBsZXMgPSBbc3RyKCksCiAgICAgICAgICAgICAgICAgICAgdHVwbGUoKSwgbGlzdCgpLCBzZXQoKSwgZnJvemVuc2V0KCksIGRpY3QoKSwKICAgICAgICAgICAgICAgICAgICBkaWN0KCkua2V5cygpLCBkaWN0KCkuaXRlbXMoKSwKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciB4IGluIHNhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh4LCBDb250YWluZXIpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3ModHlwZSh4KSwgQ29udGFpbmVyKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIENvbnRhaW5lciksIHJlcHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBDb250YWluZXIpLCByZXByKHR5cGUoeCkpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoQ29udGFpbmVyLCAnX19jb250YWluc19fJykKIAogICAgIGRlZiB0ZXN0X0NhbGxhYmxlKHNlbGYpOgpAQCAtMzM5LDMzICszMzksMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKHR5cGUoeCksIENhbGxhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgQ2FsbGFibGUpLCByZXByKHR5cGUoeCkpKQogICAgICAgICBzYW1wbGVzID0gW2xhbWJkYTogTm9uZSwKICAgICAgICAgICAgICAgICAgICB0eXBlLCBpbnQsIG9iamVjdCwKICAgICAgICAgICAgICAgICAgICBsZW4sCiAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQsIFtdLmFwcGVuZCwKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciB4IGluIHNhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyh0eXBlKHgpLCBDYWxsYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBDYWxsYWJsZSksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhDYWxsYWJsZSwgJ19fY2FsbF9fJykKIAogICAgIGRlZiB0ZXN0X2RpcmVjdF9zdWJjbGFzc2luZyhzZWxmKToKICAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CiAgICAgICAgICAgICBjbGFzcyBDKEIpOgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEMsIEIpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhpbnQsIEMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBDKSkKIAogICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbihzZWxmKToKICAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CiAgICAgICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSB0eXBlCiAgICAgICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICAjIE1ha2Ugc3VyZSBpdCBpc24ndCBoYXNoYWJsZSBieSBkZWZhdWx0Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIEIpLCBCLl9fbmFtZV9fKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpLCBCLl9fbmFtZV9fKQogICAgICAgICAgICAgQi5yZWdpc3RlcihDKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQywgQikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBCKSkKIAogY2xhc3MgV2l0aFNldChNdXRhYmxlU2V0KToKIApAQCAtMzk1LDggKzM5NSw4IEBACiAKICAgICBkZWYgdGVzdF9TZXQoc2VsZik6CiAgICAgICAgIGZvciBzYW1wbGUgaW4gW3NldCwgZnJvemVuc2V0XToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNhbXBsZSgpLCBTZXQpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc2FtcGxlLCBTZXQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2FtcGxlKCksIFNldCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIFNldCkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhTZXQsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycpCiAKICAgICBkZWYgdGVzdF9oYXNoX1NldChzZWxmKToKQEAgLTQxMiwxMyArNDEyLDEzIEBACiAgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2goKQogICAgICAgICBhLCBiID0gT25lVHdvVGhyZWVTZXQoKSwgT25lVHdvVGhyZWVTZXQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzaChhKSA9PSBoYXNoKGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChhKSA9PSBoYXNoKGIpKQogCiAgICAgZGVmIHRlc3RfTXV0YWJsZVNldChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2V0KCksIE11dGFibGVTZXQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzZXQsIE11dGFibGVTZXQpKQotICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKGZyb3plbnNldCgpLCBNdXRhYmxlU2V0KSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhmcm96ZW5zZXQsIE11dGFibGVTZXQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZXQoKSwgTXV0YWJsZVNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNldCwgTXV0YWJsZVNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShmcm96ZW5zZXQoKSwgTXV0YWJsZVNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhmcm96ZW5zZXQsIE11dGFibGVTZXQpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTXV0YWJsZVNldCwgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKICAgICAgICAgICAgICdhZGQnLCAnZGlzY2FyZCcpCiAKQEAgLTQ1NywzNyArNDU3LDM3IEBACiAKICAgICBkZWYgdGVzdF9NYXBwaW5nKHNlbGYpOgogICAgICAgICBmb3Igc2FtcGxlIGluIFtkaWN0XToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNhbXBsZSgpLCBNYXBwaW5nKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNhbXBsZSwgTWFwcGluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzYW1wbGUoKSwgTWFwcGluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIE1hcHBpbmcpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTWFwcGluZywgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKICAgICAgICAgICAgICdfX2dldGl0ZW1fXycpCiAKICAgICBkZWYgdGVzdF9NdXRhYmxlTWFwcGluZyhzZWxmKToKICAgICAgICAgZm9yIHNhbXBsZSBpbiBbZGljdF06Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZU1hcHBpbmcpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlTWFwcGluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZU1hcHBpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlTWFwcGluZykpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhNdXRhYmxlTWFwcGluZywgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKICAgICAgICAgICAgICdfX2dldGl0ZW1fXycsICdfX3NldGl0ZW1fXycsICdfX2RlbGl0ZW1fXycpCiAKICAgICBkZWYgdGVzdF9TZXF1ZW5jZShzZWxmKToKICAgICAgICAgZm9yIHNhbXBsZSBpbiBbdHVwbGUsIGxpc3QsIHN0cl06Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzYW1wbGUoKSwgU2VxdWVuY2UpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc2FtcGxlLCBTZXF1ZW5jZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGJhc2VzdHJpbmcsIFNlcXVlbmNlKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UocmFuZ2UoMTApLCBTZXF1ZW5jZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHhyYW5nZSwgU2VxdWVuY2UpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzdHIsIFNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNhbXBsZSgpLCBTZXF1ZW5jZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyYW5nZSgxMCksIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoeHJhbmdlLCBTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHN0ciwgU2VxdWVuY2UpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoU2VxdWVuY2UsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycsCiAgICAgICAgICAgICAnX19nZXRpdGVtX18nKQogCiAgICAgZGVmIHRlc3RfTXV0YWJsZVNlcXVlbmNlKHNlbGYpOgogICAgICAgICBmb3Igc2FtcGxlIGluIFt0dXBsZSwgc3RyXToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVTZXF1ZW5jZSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKHNhbXBsZSwgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVTZXF1ZW5jZSkpCiAgICAgICAgIGZvciBzYW1wbGUgaW4gW2xpc3RdOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVTZXF1ZW5jZSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVTZXF1ZW5jZSkpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNhbXBsZSgpLCBNdXRhYmxlU2VxdWVuY2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgTXV0YWJsZVNlcXVlbmNlKSkKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKE11dGFibGVTZXF1ZW5jZSwgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsCiAgICAgICAgICAgICAnX19sZW5fXycsICdfX2dldGl0ZW1fXycsICdfX3NldGl0ZW1fXycsICdfX2RlbGl0ZW1fXycsICdpbnNlcnQnKQogCkBAIC00OTcsMTAgKzQ5NywxMCBAQAogICAgICAgICBjID0gQ291bnRlcignYWJjYWJhJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBDb3VudGVyKHsnYSc6MyAsICdiJzogMiwgJ2MnOiAxfSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgQ291bnRlcihhPTMsIGI9MiwgYz0xKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYywgZGljdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGMsIE1hcHBpbmcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhDb3VudGVyLCBkaWN0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3MoQ291bnRlciwgTWFwcGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjLCBNYXBwaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQ291bnRlciwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKENvdW50ZXIsIE1hcHBpbmcpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYy52YWx1ZXMoKSksIDYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGMudmFsdWVzKCkpLCBbMSwgMiwgM10pCkBAIC01NzgsNyArNTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ291bnRlcih3b3JkcyksCiAgICAgICAgICAgICAgICAgICAgIF0pOgogICAgICAgICAgICAgbXNnID0gKGksIGR1cCwgd29yZHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZHVwIGlzIG5vdCB3b3JkcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdXAgaXMgbm90IHdvcmRzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHVwLCB3b3JkcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihkdXApLCBsZW4od29yZHMpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHlwZShkdXApLCB0eXBlKHdvcmRzKSkKQEAgLTU5NCw3ICs1OTQsNyBAQAogICAgIGRlZiB0ZXN0X2ludmFyaWFudF9mb3JfdGhlX2luX29wZXJhdG9yKHNlbGYpOgogICAgICAgICBjID0gQ291bnRlcihhPTEwLCBiPS0yLCBjPTApCiAgICAgICAgIGZvciBlbGVtIGluIGM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYykKIAogICAgIGRlZiB0ZXN0X211bHRpc2V0X29wZXJhdGlvbnMoc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHRoYXQgYWRkaW5nIGEgemVybyBjb3VudGVyIHdpbGwgc3RyaXAgemVyb3MgYW5kIG5lZ2F0aXZlcwpAQCAtNjE5LDcgKzYxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtYmVyb3AocFt4XSwgcVt4XSksIHJlc3VsdFt4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnRlcm9wLCB4LCBwLCBxKSkKICAgICAgICAgICAgICAgICAjIHZlcmlmeSB0aGF0IHJlc3VsdHMgZXhjbHVkZSBub24tcG9zaXRpdmUgY291bnRzCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHg+MCBmb3IgeCBpbiByZXN1bHQudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHg+MCBmb3IgeCBpbiByZXN1bHQudmFsdWVzKCkpCiAKICAgICAgICAgZWxlbWVudHMgPSAnYWJjZGVmJwogICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgpAQCAtNjkzLDcgKzY5Myw3IEBACiAgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCiAgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCiAgICAgICAgIGRlbCBvZFsnYSddCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluIG9kKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBvZCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CiAgICAgICAgICAgICBkZWwgb2RbJ2EnXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIHBhaXJzWzoyXSArIHBhaXJzWzM6XSkKQEAgLTc3Niw3ICs3NzYsNyBAQAogICAgICAgICAgICAgICAgICAgICB1cGRhdGVfdGVzdCwKICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3Qob2QpLAogICAgICAgICAgICAgICAgICAgICBdKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkdXAgaXMgbm90IG9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR1cCBpcyBub3Qgb2QpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkdXAsIG9kKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGlzdChkdXAuaXRlbXMoKSksIGxpc3Qob2QuaXRlbXMoKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZHVwKSwgbGVuKG9kKSkKQEAgLTc4OSw3ICs3ODksNyBAQAogICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQogICAgICAgICAjIHlhbWwuZHVtcChvZCkgLS0+CiAgICAgICAgICMgJyEhcHl0aG9uL29iamVjdC9hcHBseTpfX21haW5fXy5PcmRlcmVkRGljdFxuLSAtIFthLCAxXVxuICAtIFtiLCAyXVxuJwotICAgICAgICBzZWxmLmFzc2VydF8oYWxsKHR5cGUocGFpcik9PWxpc3QgZm9yIHBhaXIgaW4gb2QuX19yZWR1Y2VfXygpWzFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbCh0eXBlKHBhaXIpPT1saXN0IGZvciBwYWlyIGluIG9kLl9fcmVkdWNlX18oKVsxXSkpCiAKICAgICBkZWYgdGVzdF9yZWR1Y2Vfbm90X3Rvb19mYXQoc2VsZik6CiAgICAgICAgICMgZG8gbm90IHNhdmUgaW5zdGFuY2UgZGljdGlvbmFyeSBpZiBub3QgbmVlZGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weQppbmRleCAzNmMyYTYzLi5mY2ZhNjE2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgICAgICAgIC9cLiAgICAgICAgICAjIGFuZCBlbmQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAgICAgICAgICAgICcnJwogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5tYXRjaChwYXQsIGdldHN0YXR1cygiLy4iKSwgcmUuVkVSQk9TRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChwYXQsIGdldHN0YXR1cygiLy4iKSwgcmUuVkVSQk9TRSkpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDZmZmQ2NGEuLjc1Yzk4M2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTQyNCwxMCArNDI0LDEwIEBACiAgICAgICAgICAgICAgICAgaW1wb3J0IF9fbWFuZ2xlZF9tb2QKICAgICAgICAgICAgICAgICBpbXBvcnQgX19wYWNrYWdlX18ubW9kdWxlCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfQV9fbWFuZ2xlZCIgaW4gQS5mLmZ1bmNfY29kZS5jb192YXJuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX25vdF9tYW5nbGVkX18iIGluIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiX0FfX21hbmdsZWRfbW9kIiBpbiBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oIl9fcGFja2FnZV9fIiBpbiBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9BX19tYW5nbGVkIiBpbiBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9fbm90X21hbmdsZWRfXyIgaW4gQS5mLmZ1bmNfY29kZS5jb192YXJuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfQV9fbWFuZ2xlZF9tb2QiIGluIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19wYWNrYWdlX18iIGluIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCiAKICAgICBkZWYgdGVzdF9jb21waWxlX2FzdChzZWxmKToKICAgICAgICAgZm5hbWUgPSBfX2ZpbGVfXwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAgICAgICAgIGZvciBmbmFtZSwgY29kZSBpbiBzYW1wbGVfY29kZToKICAgICAgICAgICAgIGNvMSA9IGNvbXBpbGUoY29kZSwgJyVzMScgJSBmbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICAgYXN0ID0gY29tcGlsZShjb2RlLCAnJXMyJyAlIGZuYW1lLCAnZXhlYycsIF9hc3QuUHlDRl9PTkxZX0FTVCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKGFzdCkgPT0gX2FzdC5Nb2R1bGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShhc3QpID09IF9hc3QuTW9kdWxlKQogICAgICAgICAgICAgY28yID0gY29tcGlsZShhc3QsICclczMnICUgZm5hbWUsICdleGVjJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28xLCBjbzIpCiAgICAgICAgICAgICAjIHRoZSBjb2RlIG9iamVjdCdzIGZpbGVuYW1lIGNvbWVzIGZyb20gdGhlIHNlY29uZCBjb21waWxhdGlvbiBzdGVwCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQppbmRleCBmMWZlZjc0Li4yNDkzMGY4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIGRlZiB0ZXN0RG9jc3RyaW5ncyhzZWxmKToKICAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJyJkb2MiJywgJzxzdHJpbmc+JywgJ2V4ZWMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ19fZG9jX18nIGluIGMuY29fbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnX19kb2NfXycgaW4gYy5jb19uYW1lcykKICAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2RlZiBmKCk6XG4gImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCiAgICAgICAgIGcgPSB7fQogICAgICAgICBleGVjIGMgaW4gZwpAQCAtMTEwLDkgKzExMCw5IEBACiAKICAgICBkZWYgX2NoZWNrX2xpbmVubyhzZWxmLCBub2RlKToKICAgICAgICAgaWYgbm90IG5vZGUuX19jbGFzc19fIGluIE5PTElORU5POgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uobm9kZS5saW5lbm8sIGludCksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShub2RlLmxpbmVubywgaW50KSwKICAgICAgICAgICAgICAgICAibGluZW5vPSVzIG9uICVzIiAlIChub2RlLmxpbmVubywgbm9kZS5fX2NsYXNzX18pKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vZGUubGluZW5vID4gMCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlLmxpbmVubyA+IDAsCiAgICAgICAgICAgICAgICAgImxpbmVubz0lcyBvbiAlcyIgJSAobm9kZS5saW5lbm8sIG5vZGUuX19jbGFzc19fKSkKICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuZ2V0Q2hpbGROb2RlcygpOgogICAgICAgICAgICAgc2VsZi5jaGVja19saW5lbm8oY2hpbGQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBsZXgucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBsZXgucHkKaW5kZXggNjBjNTI1Mi4uZjA3YTZiNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21wbGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGxleC5weQpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBpZiB4ID09IDA6CiAgICAgICAgICAgICByZXR1cm4gYWJzKHkpIDwgZXBzCiAgICAgICAgICMgY2hlY2sgdGhhdCByZWxhdGl2ZSBkaWZmZXJlbmNlIDwgZXBzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhYnMoKHgteSkveSkgPCBlcHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoKHgteSkveSkgPCBlcHMpCiAKICAgICBkZWYgYXNzZXJ0RmxvYXRzQXJlSWRlbnRpY2FsKHNlbGYsIHgsIHkpOgogICAgICAgICAiIiJhc3NlcnQgdGhhdCBmbG9hdHMgeCBhbmQgeSBhcmUgaWRlbnRpY2FsLCBpbiB0aGUgc2Vuc2UgdGhhdDoKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZUFicyh4LmltYWcsIHkuaW1hZywgZXBzKQogCiAgICAgZGVmIGFzc2VydElzKHNlbGYsIGEsIGIpOgotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogCiAgICAgZGVmIGNoZWNrX2RpdihzZWxmLCB4LCB5KToKICAgICAgICAgIiIiQ29tcHV0ZSBjb21wbGV4IHo9eCp5LCBhbmQgY2hlY2sgdGhhdCB6L3g9PXkgYW5kIHoveT09eC4iIiIKQEAgLTE5Miw4ICsxOTIsOCBAQAogCiAgICAgZGVmIHRlc3RfYm9vbGNvbnRleHQoc2VsZik6CiAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXBsZXgocmFuZG9tKCkgKyAxZS02LCByYW5kb20oKSArIDFlLTYpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvbXBsZXgoMC4wLCAwLjApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBsZXgocmFuZG9tKCkgKyAxZS02LCByYW5kb20oKSArIDFlLTYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvbXBsZXgoMC4wLCAwLjApKQogCiAgICAgZGVmIHRlc3RfY29uanVnYXRlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydENsb3NlKGNvbXBsZXgoNS4zLCA5LjgpLmNvbmp1Z2F0ZSgpLCA1LjMtOS44aikKQEAgLTI3NSw3ICsyNzUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0X3plcm9zKGNvbXBsZXgoLTAuLCAxLikucmVhbCksIHNwbGl0X3plcm9zKC0wLikpCiAKICAgICAgICAgYyA9IDMuMTQgKyAxagotICAgICAgICBzZWxmLmFzc2VydF8oY29tcGxleChjKSBpcyBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGxleChjKSBpcyBjKQogICAgICAgICBkZWwgYwogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgIjEiLCAiMSIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb250YWlucy5weQppbmRleCAwZDU0MDk5Li43M2UwNjg1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkKQEAgLTIwLDU3ICsyMCw1NyBAQAogICAgICAgICBhID0gYmFzZV9zZXQoMSkKICAgICAgICAgYiA9IHNldCgxKQogICAgICAgICBjID0gc2VxKDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygxIGluIGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwIG5vdCBpbiBiKQotICAgICAgICBzZWxmLmFzc2VydF8oMSBpbiBjKQotICAgICAgICBzZWxmLmFzc2VydF8oMCBub3QgaW4gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgbm90IGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxIGluIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIG5vdCBpbiBjKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMSBpbiBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMSBub3QgaW4gYSkKIAogICAgICAgICAjIHRlc3QgY2hhciBpbiBzdHJpbmcKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdjJyBpbiAnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdkJyBub3QgaW4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYycgaW4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZCcgbm90IGluICdhYmMnKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnJyBpbiAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCcnIGluICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJyBpbiAnYWJjJykKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiAnYWJjJykKIAogICAgIGlmIGhhdmVfdW5pY29kZToKICAgICAgICAgZGVmIHRlc3RfY2hhcl9pbl91bmljb2RlKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdjJyBpbiB1bmljb2RlKCdhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnZCcgbm90IGluIHVuaWNvZGUoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdjJyBpbiB1bmljb2RlKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZCcgbm90IGluIHVuaWNvZGUoJ2FiYycpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJycgaW4gdW5pY29kZSgnJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gJycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gdW5pY29kZSgnJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJycgaW4gdW5pY29kZSgnYWJjJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gJ2FiYycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gdW5pY29kZSgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gdW5pY29kZSgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gdW5pY29kZSgnYWJjJykpCiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBOb25lIGluIHVuaWNvZGUoJ2FiYycpKQogCiAgICAgICAgICAgICAjIHRlc3QgVW5pY29kZSBjaGFyIGluIFVuaWNvZGUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlKCdjJykgaW4gdW5pY29kZSgnYWJjJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnZCcpIG5vdCBpbiB1bmljb2RlKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKCdjJykgaW4gdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnZCcpIG5vdCBpbiB1bmljb2RlKCdhYmMnKSkKIAogICAgICAgICAgICAgIyB0ZXN0IFVuaWNvZGUgY2hhciBpbiBzdHJpbmcKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlKCdjJykgaW4gJ2FiYycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnZCcpIG5vdCBpbiAnYWJjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKCdjJykgaW4gJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnZCcpIG5vdCBpbiAnYWJjJykKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW5fc2VxdWVuY2VfdHlwZXMoc2VsZik6CiAgICAgICAgICMgYSBjb2xsZWN0aW9uIG9mIHRlc3RzIG9uIGJ1aWx0aW4gc2VxdWVuY2UgdHlwZXMKICAgICAgICAgYSA9IHJhbmdlKDEwKQogICAgICAgICBmb3IgaSBpbiBhOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDE2IG5vdCBpbiBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBub3QgaW4gYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIGluIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxNiBub3QgaW4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgbm90IGluIGEpCiAKICAgICAgICAgYSA9IHR1cGxlKGEpCiAgICAgICAgIGZvciBpIGluIGE6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaSBpbiBhKQotICAgICAgICBzZWxmLmFzc2VydF8oMTYgbm90IGluIGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIG5vdCBpbiBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDE2IG5vdCBpbiBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBub3QgaW4gYSkKIAogICAgICAgICBjbGFzcyBEZXZpYW50MToKICAgICAgICAgICAgICIiIkJlaGF2ZXMgc3RyYW5nZWx5IHdoZW4gY29tcGFyZWQKQEAgLTg2LDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hTGlzdC5yZW1vdmUoMTQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDEKIAotICAgICAgICBzZWxmLmFzc2VydF8oRGV2aWFudDEoKSBub3QgaW4gRGV2aWFudDEuYUxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZXZpYW50MSgpIG5vdCBpbiBEZXZpYW50MS5hTGlzdCkKIAogICAgICAgICBjbGFzcyBEZXZpYW50MjoKICAgICAgICAgICAgICIiIkJlaGF2ZXMgc3RyYW5nZWx5IHdoZW4gY29tcGFyZWQKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiZ290Y2hhIgogCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhEZXZpYW50MigpIG5vdCBpbiBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKERldmlhbnQyKCkgbm90IGluIGEpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQppbmRleCAyNzRhZjNkLi44MGJhM2U4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIGN0eCA9IHdoZWUoKQogICAgICAgICBjdHguX19lbnRlcl9fKCkKICAgICAgICAgIyBDYWxsaW5nIF9fZXhpdF9fIHNob3VsZCBub3QgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbgotICAgICAgICBzZWxmLmZhaWxJZihjdHguX19leGl0X18oVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjdHguX19leGl0X18oVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lKSkKIAogICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX3RyYXBfeWllbGRfYWZ0ZXJfdGhyb3coc2VsZik6CiAgICAgICAgIEBjb250ZXh0bWFuYWdlcgpAQCAtMjYxLDE3ICsyNjEsMTcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJ3IikgYXMgZjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihmLmNsb3NlZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuY2xvc2VkKQogICAgICAgICAgICAgICAgIGYud3JpdGUoIkJvb2hcbiIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5jbG9zZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAgICAgICAgICAgICBmID0gTm9uZQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJyIikgYXMgZjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoZi5jbG9zZWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICJCb29oXG4iKQogICAgICAgICAgICAgICAgICAgICAxLzAKICAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5jbG9zZWQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAgICAgICAgIGZpbmFsbHk6CkBAIC0yODMsMTYgKzI4MywxNiBAQAogY2xhc3MgTG9ja0NvbnRleHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgYm9pbGVyUGxhdGUoc2VsZiwgbG9jaywgbG9ja2VkKToKLSAgICAgICAgc2VsZi5mYWlsSWYobG9ja2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCiAgICAgICAgIHdpdGggbG9jazoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsb2NrZWQoKSkKLSAgICAgICAgc2VsZi5mYWlsSWYobG9ja2VkKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG9ja2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggbG9jazoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobG9ja2VkKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2tlZCgpKQogICAgICAgICAgICAgICAgIDEvMAogICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihsb2NrZWQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29va2llbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKaW5kZXggOTNkNjJmNy4uZTQzZDczNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKQEAgLTIxLDcgKzIxLDcgQEAKICAgICAgICAgYXogPSB0aW1lMmlzb3ooKQogICAgICAgICBieiA9IHRpbWUyaXNveig1MDAwMDApCiAgICAgICAgIGZvciB0ZXh0IGluIChheiwgYnopOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyIl5cZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGRaJCIsIHRleHQpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyIl5cZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGRaJCIsIHRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgdGltZTJpc296IGZvcm1hdDogJXMgJXMiICUgKGF6LCBieikpCiAKICAgICBkZWYgdGVzdF9odHRwMnRpbWUoc2VsZik6CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgICAgICB0MiA9IGh0dHAydGltZShzLmxvd2VyKCkpCiAgICAgICAgICAgICB0MyA9IGh0dHAydGltZShzLnVwcGVyKCkpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0ID09IHQyID09IHQzID09IHRlc3RfdCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ID09IHQyID09IHQzID09IHRlc3RfdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAgPT4gICVzLCAlcywgJXMgKCVzKSIgJSAocywgdCwgdDIsIHQzLCB0ZXN0X3QpKQogCiAgICAgZGVmIHRlc3RfaHR0cDJ0aW1lX2dhcmJhZ2Uoc2VsZik6CkBAIC05Miw3ICs5Miw3IEBACiAgICAgICAgICAgICAnMDEtMDEtMTk4MCAwMDo2MTowMCcsCiAgICAgICAgICAgICAnMDEtMDEtMTk4MCAwMDowMDo2MicsCiAgICAgICAgICAgICBdOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGh0dHAydGltZSh0ZXN0KSBpcyBOb25lLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGh0dHAydGltZSh0ZXN0KSBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwMnRpbWUoJXMpIGlzIG5vdCBOb25lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAydGltZSh0ZXN0KSAlcyIgJSAodGVzdCwgaHR0cDJ0aW1lKHRlc3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTM0OSw4ICszNDksOCBAQAogICAgICAgICAgICAgXToKICAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIyLlJlcXVlc3QodXJsKQogICAgICAgICAgICAgciA9IHBvbC5kb21haW5fcmV0dXJuX29rKGRvbWFpbiwgcmVxdWVzdCkKLSAgICAgICAgICAgIGlmIG9rOiBzZWxmLmFzc2VydF8ocikKLSAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0Xyhub3QgcikKKyAgICAgICAgICAgIGlmIG9rOiBzZWxmLmFzc2VydFRydWUocikKKyAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0VHJ1ZShub3QgcikKIAogICAgIGRlZiB0ZXN0X21pc3NpbmdfdmFsdWUoc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBsd3BfY29va2llX3N0cgpAQCAtMzYyLDEwICszNjIsMTAgQEAKICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3MnKQogICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnInNwYW0iOyBwYXRoPS9mb28vJykKICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZWdncyJdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUudmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS52YWx1ZSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUubmFtZSwgImVnZ3MiKQogICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS52YWx1ZSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLnZhbHVlIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5uYW1lLCAnInNwYW0iJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobHdwX2Nvb2tpZV9zdHIoY29va2llKSwgKAogICAgICAgICAgICAgcicic3BhbSI7IHBhdGg9Ii9mb28vIjsgZG9tYWluPSJ3d3cuYWNtZS5jb20iOyAnCkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuZXhhbXBsZS5jb20iXVsiLyJdWyJuaSJdCiAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZlcnNpb24gaXMgTm9uZSkgICMgZGlkbid0IGV4cGVjdCBhIHN0b3JlZCBjb29raWUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmVyc2lvbiBpcyBOb25lKSAgIyBkaWRuJ3QgZXhwZWN0IGEgc3RvcmVkIGNvb2tpZQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS52ZXJzaW9uLCB2ZXJzaW9uKQogICAgICAgICAgICAgICAgICMgMjk2NSBjb29raWVzIGFyZSB1bmFmZmVjdGVkCkBAIC00MzMsMjggKzQzMywyOCBAQAogCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbIi5hY21lLmNvbSJdWyIvIl1bInNwYW0iXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUuZG9tYWluLCAiLmFjbWUuY29tIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5wb3J0LCBERUZBVUxUX0hUVFBfUE9SVCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLnBvcnRfc3BlY2lmaWVkKQogICAgICAgICAjIGNhc2UgaXMgcHJlc2VydmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibEFyZ2giKSBhbmQKICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsYXJnaCIpKQogCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bIm5pIl0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLmRvbWFpbiwgInd3dy5hY21lLmNvbSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5wb3J0LCAiODAsODA4MCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUucG9ydF9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUucG9ydF9zcGVjaWZpZWQpCiAKICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmluaSJdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUucG9ydCBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS5wb3J0IGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLnBvcnRfc3BlY2lmaWVkKQogCiAgICAgICAgICMgaW52YWxpZCBleHBpcmVzIHNob3VsZCBub3QgY2F1c2UgY29va2llIHRvIGJlIGRyb3BwZWQKICAgICAgICAgZm9vID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vIl0KICAgICAgICAgc3BhbSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb28uZXhwaXJlcyBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BhbS5leHBpcmVzIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb28uZXhwaXJlcyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BhbS5leHBpcmVzIGlzIE5vbmUpCiAKICAgICBkZWYgdGVzdF9uc19wYXJzZXJfc3BlY2lhbF9uYW1lcyhzZWxmKToKICAgICAgICAgIyBuYW1lcyBzdWNoIGFzICdleHBpcmVzJyBhcmUgbm90IHNwZWNpYWwgaW4gZmlyc3QgbmFtZT12YWx1ZSBwYWlyCkBAIC00NjYsOCArNDY2LDggQEAKICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ3ZlcnNpb249ZWdnczsgc3BhbT1lZ2dzJykKIAogICAgICAgICBjb29raWVzID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXQotICAgICAgICBzZWxmLmFzc2VydF8oJ2V4cGlyZXMnIGluIGNvb2tpZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygndmVyc2lvbicgaW4gY29va2llcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdleHBpcmVzJyBpbiBjb29raWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3ZlcnNpb24nIGluIGNvb2tpZXMpCiAKICAgICBkZWYgdGVzdF9leHBpcmVzKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgdGltZTJuZXRzY2FwZSwgQ29va2llSmFyCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KQogICAgICAgICBoID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQogCiAgICAgICAgICMgbWF4LWFnZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXhwaXJlcywgYW5kIHplcm8gbWF4LWFnZSBpcyByZXF1ZXN0IHRvCiAgICAgICAgICMgZGVsZXRlIGJvdGggbmV3IGNvb2tpZSBhbmQgYW55IG9sZCBtYXRjaGluZyBjb29raWUKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc3BhbT0iYmFyIicgaW4gaCkKIAogICAgICAgICAjIFhYWCBSRkMgMjk2NSBleHBpcnkgcnVsZXMgKHNvbWUgYXBwbHkgdG8gVjAgdG9vKQogCkBAIC01MTcsMzkgKzUxNywzOSBAQAogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBWZXJzaW9uPSIxIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaCIsICdlZ2dzPSJiYXIiOyBWZXJzaW9uPSIxIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiIiwKICAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQotICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiL2JsYWgvIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwKICAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQotICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIvIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCIvYmxhaC9yaHViYXJiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgIyBOZXRzY2FwZQogCiAgICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgiLCAnZWdncz0iYmFyIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsICdlZ2dzPSJiYXIiJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCIvYmxhaCIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiL2JsYWgiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwgJ2VnZ3M9ImJhciInKQotICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQogCiAgICAgZGVmIHRlc3RfZXNjYXBlX3BhdGgoc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBlc2NhcGVfcGF0aApAQCAtNjI3LDE0ICs2MjcsMTQgQEAKIAogICAgIGRlZiB0ZXN0X2lzX0hETihzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGlzX0hETgotICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCJmb28uYmFyLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCIxZm9vMi4zYmFyNC41Y29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIxOTIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuZm9vLmJhci5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIi4uZm9vIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCJmb28uIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oImZvby5iYXIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oIjFmb28yLjNiYXI0LjVjb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIjE5Mi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi5mb28uYmFyLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzX0hETigiLi5mb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oImZvby4iKSkKIAogICAgIGRlZiB0ZXN0X3JlYWNoKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVhY2gKQEAgLTY0OSw0MCArNjQ5LDQwIEBACiAKICAgICBkZWYgdGVzdF9kb21haW5fbWF0Y2goc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBkb21haW5fbWF0Y2gsIHVzZXJfZG9tYWluX21hdGNoCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgInguWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiYS5iLmMuY29tIiwgIi5jLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiLmMuY29tIiwgImEuYi5jLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJleGFtcGxlLmxvY2FsIiwgIi5sb2NhbCIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiYmxhaC5ibGFoIiwgIiIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiIiwgIi5yaHViYXJiLnJodWJhcmIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiIiwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goImEuYi5jLmNvbSIsICIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIi5jLmNvbSIsICJhLmIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgiZXhhbXBsZS5sb2NhbCIsICIubG9jYWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goImJsYWguYmxhaCIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIiIsICIucmh1YmFyYi5yaHViYXJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIiIsICIiKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgImFjbWUuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInkuY29tIiwgIlkuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICJZLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJjb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLm0iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICJhY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICIuYWNtZS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJyaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goInd3dy5yaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJ5LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAibSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCiAgICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAotICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4iKSkKICAgICAgICAgIyBlbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIiIpKQogCiAgICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgogICAgICAgICAjIENvb2tpZXMgd2hvc2UgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lIGRvZXMgbm90IGRvbWFpbi1tYXRjaCB0aGUKQEAgLTgzOSw3ICs4MzksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgICMgLi4uIGFuZCBjaGVjayBpcyBkb2Vzbid0IGdldCByZXR1cm5lZAogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCByZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQogCiAgICAgZGVmIHRlc3RfZG9tYWluX2Jsb2NrKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CkBAIC04NjYsNyArODY2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQogICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCiAgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQotICAgICAgICBzZWxmLmFzc2VydF8oKHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSBhbmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZXEuaGFzX2hlYWRlcigiQ29va2llIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhhc19oZWFkZXIoIkNvb2tpZTIiKSkpCiAKICAgICAgICAgYy5jbGVhcigpCkBAIC04ODIsNyArODgyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKIAogICAgIGRlZiB0ZXN0X3NlY3VyZShzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTAyLDEwICs5MDIsMTAgQEAKICAgICAgICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbS8iCiAgICAgICAgICAgICAgICAgaW50KGMsIHVybCwgImZvbzE9YmFyJXMlcyIgJSAodnMsIHdoaXRlc3BhY2UpKQogICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28yPWJhciVzOyBzZWN1cmUlcyIgJSAgKHZzLCB3aGl0ZXNwYWNlKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgICAgICBub3QgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMSJdLnNlY3VyZSwKICAgICAgICAgICAgICAgICAgICAgIm5vbi1zZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgc2VjdXJlIikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgICAgICBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28yIl0uc2VjdXJlLAogICAgICAgICAgICAgICAgICAgICAic2VjdXJlIGNvb2tpZSByZWdpc3RlcmVkIG5vbi1zZWN1cmUiKQogCkBAIC05MjYsNyArOTI2LDcgQEAKICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCiAKICAgICBkZWYgdGVzdF9kb21haW5fbWlycm9yKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CkBAIC05MzcsMjEgKzkzNywyMSBAQAogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJEb21haW4iIG5vdCBpbiBoLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIkRvbWFpbiIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IGRvbWFpbiByZXR1cm5lZCB3aXRoIGRvbWFpbiBwcmVzZW50IikKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IERvbWFpbj0uYmFyLmNvbScpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSIuYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCckRG9tYWluPSIuYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgICMgbm90ZSBtaXNzaW5nIGluaXRpYWwgZG90IGluIERvbWFpbgogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49YmFyLmNvbScpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSJiYXIuY29tIicgaW4gaCwgImRvbWFpbiBub3QgcmV0dXJuZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJyREb21haW49ImJhci5jb20iJyBpbiBoLCAiZG9tYWluIG5vdCByZXR1cm5lZCIpCiAKICAgICBkZWYgdGVzdF9wYXRoX21pcnJvcihzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTYyLDE0ICs5NjIsMTQgQEAKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQogICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiUGF0aCIgbm90IGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiUGF0aCIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IHBhdGggcmV0dXJuZWQgd2l0aCBwYXRoIHByZXNlbnQiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUGF0aD0vJykKICAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQotICAgICAgICBzZWxmLmFzc2VydF8oJyRQYXRoPSIvIicgaW4gaCwgInBhdGggbm90IHJldHVybmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCckUGF0aD0iLyInIGluIGgsICJwYXRoIG5vdCByZXR1cm5lZCIpCiAKICAgICBkZWYgdGVzdF9wb3J0X21pcnJvcihzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTgwLDI4ICs5ODAsMjggQEAKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQogICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiUG9ydCIgbm90IGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiUG9ydCIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IHBvcnQgcmV0dXJuZWQgd2l0aCBwb3J0IHByZXNlbnQiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydCIpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaCgiXCRQb3J0KFtePV18JCkiLCBoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaCgiXCRQb3J0KFtePV18JCkiLCBoKSwKICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggbm8gdmFsdWUgbm90IHJldHVybmVkIHdpdGggbm8gdmFsdWUiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydD0iODAiJykKICAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQotICAgICAgICBzZWxmLmFzc2VydF8oJyRQb3J0PSI4MCInIGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJFBvcnQ9IjgwIicgaW4gaCwKICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggc2luZ2xlIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIHNpbmdsZSB2YWx1ZSIpCiAKICAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCw4MDgwIicpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCckUG9ydD0iODAsODA4MCInIGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJFBvcnQ9IjgwLDgwODAiJyBpbiBoLAogICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgbm90IHJldHVybmVkIHdpdGggbXVsdGlwbGUgIgogICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyIpCiAKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKICAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQogICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgIkNvbW1lbnQiIG5vdCBpbiBoLAogICAgICAgICAgICAgIkNvbW1lbnQgb3IgQ29tbWVudFVSTCBjb29raWUtYXR0cmlidXRlcyByZXR1cm5lZCB0byBzZXJ2ZXIiKQogCkBAIC0xMDQ1LDcgKzEwNDUsNyBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKICAgICAgICAgICAgIGkgPSAwCiAgICAgICAgICAgICBmb3IgYyBpbiBjczoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjLCBDb29raWUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIENvb2tpZSkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy52ZXJzaW9uLCB2ZXJzaW9uc1tpXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLm5hbWUsIG5hbWVzW2ldKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuZG9tYWluLCBkb21haW5zW2ldKQpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKICAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogYz1mb287IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0KICAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImMiXQotICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLmV4cGlyZXMgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS5leHBpcmVzIGlzIE5vbmUpCiAKIAogY2xhc3MgTFdQQ29va2llVGVzdHMoVGVzdENhc2UpOgpAQCAtMTE3OSw3ICsxMTc5LDcgQEAKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKICAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQotICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGgpCiAKICAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mb28nKQpAQCAtMTE5MCw3ICsxMTkwLDcgQEAKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKICAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQotICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGggYW5kCiAgICAgICAgICAgICAgICAgICAgICAiU0hJUFBJTkc9RkVERVgiIG5vdCBpbiBoKQogCkBAIC0xMTk4LDcgKzExOTgsNyBAQAogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKIAogICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBoLnN0YXJ0c3dpdGgoIlNISVBQSU5HPUZFREVYOyIpKSkKIApAQCAtMTI1Miw3ICsxMjUyLDcgQEAKICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9hbW1vIikKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyIlBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMztccyoiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gociJQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7XHMqIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKSkKIApAQCAtMTI4OCw3ICsxMjg4LDcgQEAKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgIGMsICdodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvbG9naW4nLAogICAgICAgICAgICAgJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZSkKIAogICAgICAgICAjCiAgICAgICAgICMgICAzLiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9waWNraXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpOwotICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKAogICAgICAgICAgICAgcideXCRWZXJzaW9uPSI/MSI/OyBDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPzsgXCRQYXRoPSIvYWNtZSIkJywKICAgICAgICAgICAgIGNvb2tpZSkpCiAKQEAgLTEzMzUsMTAgKzEzMzUsMTAgQEAKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3NoaXBwaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2hpcHBpbmc9IkZlZEV4IjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ15cJFZlcnNpb249Ij8xIj87JywgY29va2llKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ1BhcnRfTnVtYmVyPSI/Um9ja2V0X0xhdW5jaGVyXzAwMDEiPzsnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocideXCRWZXJzaW9uPSI/MSI/OycsIGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocidQYXJ0X051bWJlcj0iP1JvY2tldF9MYXVuY2hlcl8wMDAxIj87JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpKQotICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHInQ3VzdG9tZXI9Ij9XSUxFX0VfQ09ZT1RFIj87XHMqXCRQYXRoPSJcL2FjbWUiJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/O1xzKlwkUGF0aD0iXC9hY21lIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKSkKIAogICAgICAgICAjCkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogICAgICAgICAjICAgICAgIFRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wcm9jZXNzIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICByZS5zZWFyY2gocidTaGlwcGluZz0iP0ZlZEV4Ij87XHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSBhbmQKICAgICAgICAgICAgICJXSUxFX0VfQ09ZT1RFIiBpbiBjb29raWUpCiAKQEAgLTE0MTEsNyArMTQxMSw3IEBACiAgICAgICAgICMgdGhhbiBvbmNlLgogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vLy4uLiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgcmUuc2VhcmNoKHIiUmlkaW5nX1JvY2tldF8wMDIzLipSb2NrZXRfTGF1bmNoZXJfMDAwMSIsIGNvb2tpZSkpCiAKICAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgYSBVUkwgb2YKQEAgLTE0MjQsNyArMTQyNCw3IEBACiAgICAgICAgICMgdGhlIHNlcnZlci4KIAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcGFydHMvIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJSb2NrZXRfTGF1bmNoZXJfMDAwMSIgaW4gY29va2llIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlJvY2tldF9MYXVuY2hlcl8wMDAxIiBpbiBjb29raWUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAiUmlkaW5nX1JvY2tldF8wMDIzIiBub3QgaW4gY29va2llKQogCiAgICAgZGVmIHRlc3RfcmVqZWN0aW9uKHNlbGYpOgpAQCAtMTQ0MCw3ICsxNDQwLDcgQEAKICAgICAgICAgIyBpbGxlZ2FsIGRvbWFpbiAobm8gZW1iZWRkZWQgZG90cykKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj0iLmNvbSI7IHZlcnNpb249MScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjKQogCiAgICAgICAgICMgbGVnYWwgZG9tYWluCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLApAQCAtMTUzMywxMSArMTUzMywxMSBAQAogICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1Lzw8JTBhbmV35S/m+OUiLAogICAgICAgICAgICAgJ2Jhcj1iYXo7IHBhdGg9Ii9mb28vIjsgdmVyc2lvbj0xJyk7CiAgICAgICAgIHZlcnNpb25fcmUgPSByZS5jb21waWxlKHInXlwkdmVyc2lvbj1cIj8xXCI/JywgcmUuSSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb289YmFyIiBpbiBjb29raWUgYW5kIHZlcnNpb25fcmUuc2VhcmNoKGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZm9vPWJhciIgaW4gY29va2llIGFuZCB2ZXJzaW9uX3JlLnNlYXJjaChjb29raWUpKQogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCiAgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vJTI1Lzw8JTBhbmV35S/m+OUiKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUpCiAKICAgICAgICAgIyB1bmljb2RlIFVSTCBkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbgogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsIHUiaHR0cDovL3d3dy5hY21lLmNvbS9ceGZjIikKQEAgLTE1NzksMTEgKzE1NzksMTEgQEAKIAogICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5ld19jKSwgNikgICMgbm9uZSBkaXNjYXJkZWQKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIm5hbWU9J2ZvbzEnLCB2YWx1ZT0nYmFyJyIgaW4gcmVwcihuZXdfYykpCiAKICAgICAgICAgbmV3X2MgPSBzYXZlX2FuZF9yZXN0b3JlKGMsIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmV3X2MpLCA0KSAgIyAyIG9mIHRoZW0gZGlzY2FyZGVkIG9uIHNhdmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIm5hbWU9J2ZvbzEnLCB2YWx1ZT0nYmFyJyIgaW4gcmVwcihuZXdfYykpCiAKICAgICBkZWYgdGVzdF9uZXRzY2FwZV9taXNjKHNlbGYpOgogICAgICAgICAjIFNvbWUgYWRkaXRpb25hbCBOZXRzY2FwZSBjb29raWVzIHRlc3RzLgpAQCAtMTYwOCw3ICsxNjA4LDcgQEAKIAogICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Myw0IiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikgYW5kCiAgICAgICAgICAgICAiQ3VzdG9tZXI9V0lMRV9FX0NPWU9URSIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKQogCkBAIC0xNjIxLDExICsxNjIxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgImZvbzE9YmFyOyBQT1JUOyBEaXNjYXJkOyBWZXJzaW9uPTE7IikKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0iLmxvY2FsIjsgVmVyc2lvbj0xJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28xPWJhciIgaW4gY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbzE9YmFyIiBpbiBjb29raWUpCiAKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwgJ2ZvbzM9YmFyOyBWZXJzaW9uPTEnKQogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iKQotICAgICAgICBzZWxmLmFzc2VydF8oImZvbzI9YmFyIiBpbiBjb29raWUgYW5kIGxlbihjKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbzI9YmFyIiBpbiBjb29raWUgYW5kIGxlbihjKSA9PSAzKQogCiAgICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc19ucyhzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtMTYzNSwxMCArMTYzNSwxMCBAQAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBkb21haW49LmxvY2FsJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8oImZvbzE9YmFyIiBpbiBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZm9vMT1iYXIiIGluIGNvb2tpZSkKIAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28yPWJhciIgaW4gY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbzI9YmFyIiBpbiBjb29raWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKIAogICAgIGRlZiB0ZXN0X2VtcHR5X3BhdGgoc2VsZik6CkBAIC0xNzEzLDcgKzE3MTMsNyBAQAogICAgICAgICAgICAga2V5ID0gIiVzX2FmdGVyIiAlIGNvb2tpZS52YWx1ZQogICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICgKICAgICAgICAgICAgICMgYSBwZXJtYW5lbnQgY29va2llIGdvdCBsb3N0IGFjY2lkZW50YWxseQogICAgICAgICAgICAgY291bnRlclsicGVybV9hZnRlciJdICE9IGNvdW50ZXJbInBlcm1fYmVmb3JlIl0gb3IKICAgICAgICAgICAgICMgYSBzZXNzaW9uIGNvb2tpZSBoYXNuJ3QgYmVlbiBjbGVhcmVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHkucHkgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKaW5kZXggYThiZTg4Ny4uY2NiZDIzMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weS5weQpAQCAtMTMsOCArMTMsOCBAQAogICAgICMgQXR0ZW1wdCBmdWxsIGxpbmUgY292ZXJhZ2Ugb2YgY29weS5weSBmcm9tIHRvcCB0byBib3R0b20KIAogICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3B5LkVycm9yIGlzIGNvcHkuZXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKGNvcHkuRXJyb3IsIEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3B5LkVycm9yIGlzIGNvcHkuZXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGNvcHkuRXJyb3IsIEV4Y2VwdGlvbikpCiAKICAgICAjIFRoZSBjb3B5KCkgbWV0aG9kCiAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgInNob3VsZG4ndCBjYWxsIHRoaXMiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQogCiAgICAgZGVmIHRlc3RfY29weV9yZWR1Y2Uoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgeCA9IEMoKQogICAgICAgICB5ID0gY29weS5jb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCiAKICAgICBkZWYgdGVzdF9jb3B5X2NhbnQoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgICAgICAgImhlbGxvIiwgdSJoZWxsb1x1MTIzNCIsIGYuZnVuY19jb2RlLAogICAgICAgICAgICAgICAgICBOZXdTdHlsZSwgeHJhbmdlKDEwKSwgQ2xhc3NpYywgbWF4XQogICAgICAgICBmb3IgeCBpbiB0ZXN0czoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3B5LmNvcHkoeCkgaXMgeCwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3B5LmNvcHkoeCkgaXMgeCwgcmVwcih4KSkKIAogICAgIGRlZiB0ZXN0X2NvcHlfbGlzdChzZWxmKToKICAgICAgICAgeCA9IFsxLCAyLCAzXQpAQCAtMTgxLDkgKzE4MSw5IEBACiAgICAgICAgIHggPSBbeCwgeF0KICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHlbMF0gaXMgbm90IHhbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdIGlzIHlbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyBub3QgeFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF0gaXMgeVsxXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2lzc3ViY2xhc3Moc2VsZik6CiAgICAgICAgICMgWFhYIE5vdGU6IHRoZXJlJ3Mgbm8gd2F5IHRvIHRlc3QgdGhlIFR5cGVFcnJvciBjb21pbmcgb3V0IG9mCkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgInNob3VsZG4ndCBjYWxsIHRoaXMiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZHVjZShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2NhbnQoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTI2MCw2MSArMjYwLDYxIEBACiAgICAgICAgICAgICAgICAgICJoZWxsbyIsIHUiaGVsbG9cdTEyMzQiLCBmLmZ1bmNfY29kZSwKICAgICAgICAgICAgICAgICAgTmV3U3R5bGUsIHhyYW5nZSgxMCksIENsYXNzaWMsIG1heF0KICAgICAgICAgZm9yIHggaW4gdGVzdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY29weS5kZWVwY29weSh4KSBpcyB4LCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHkuZGVlcGNvcHkoeCkgaXMgeCwgcmVwcih4KSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2xpc3Qoc2VsZik6CiAgICAgICAgIHggPSBbWzEsIDJdLCAzXQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIG5vdCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeFswXSBpcyBub3QgeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX2xpc3Qoc2VsZik6CiAgICAgICAgIHggPSBbXQogICAgICAgICB4LmFwcGVuZCh4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgeSwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyB5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih5KSwgMSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3R1cGxlKHNlbGYpOgogICAgICAgICB4ID0gKFsxLCAyXSwgMykKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgbm90IHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZmxleGl2ZV90dXBsZShzZWxmKToKICAgICAgICAgeCA9IChbXSwpCiAgICAgICAgIHhbMF0uYXBwZW5kKHgpCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCB5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHlbMF0gaXMgbm90IHhbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdWzBdIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyBub3QgeFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF1bMF0gaXMgeSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2RpY3Qoc2VsZik6CiAgICAgICAgIHggPSB7ImZvbyI6IFsxLCAyXSwgImJhciI6IDN9CiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgbm90IHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4WyJmb28iXSBpcyBub3QgeVsiZm9vIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsiZm9vIl0gaXMgbm90IHlbImZvbyJdKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX2RpY3Qoc2VsZik6CiAgICAgICAgIHggPSB7fQogICAgICAgICB4Wydmb28nXSA9IHgKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeVsnZm9vJ10gaXMgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Wydmb28nXSBpcyB5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih5KSwgMSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2tlZXBhbGl2ZShzZWxmKToKICAgICAgICAgbWVtbyA9IHt9CiAgICAgICAgIHggPSA0MgogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4LCBtZW1vKQotICAgICAgICBzZWxmLmFzc2VydF8obWVtb1tpZCh4KV0gaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9baWQoeCldIGlzIHgpCiAKICAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X3ZhbmlsbGEoc2VsZik6CiAgICAgICAgIGNsYXNzIEM6CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgeCA9IEMoWzQyXSkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9kZWVwY29weShzZWxmKToKICAgICAgICAgY2xhc3MgQzoKQEAgLTMzOCw4ICszMzgsOCBAQAogICAgICAgICB4ID0gQyhbNDJdKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0aW5pdGFyZ3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEM6CkBAIC0zNTIsOCArMzUyLDggQEAKICAgICAgICAgeCA9IEMoWzQyXSkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkuZm9vIGlzIG5vdCB4LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCiAKICAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X2dldHN0YXRlKHNlbGYpOgogICAgICAgICBjbGFzcyBDOgpAQCAtMzY2LDggKzM2Niw4IEBACiAgICAgICAgIHggPSBDKFs0Ml0pCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5LmZvbyBpcyBub3QgeC5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9zZXRzdGF0ZShzZWxmKToKICAgICAgICAgY2xhc3MgQzoKQEAgLTM4MCw4ICszODAsOCBAQAogICAgICAgICB4ID0gQyhbNDJdKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0c3RhdGVfc2V0c3RhdGUoc2VsZik6CiAgICAgICAgIGNsYXNzIEM6CkBAIC0zOTYsOCArMzk2LDggQEAKICAgICAgICAgeCA9IEMoWzQyXSkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkuZm9vIGlzIG5vdCB4LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCiAKICAgICBkZWYgdGVzdF9kZWVwY29weV9yZWZsZXhpdmVfaW5zdChzZWxmKToKICAgICAgICAgY2xhc3MgQzoKQEAgLTQwNSw4ICs0MDUsOCBAQAogICAgICAgICB4ID0gQygpCiAgICAgICAgIHguZm9vID0geAogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkuZm9vIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgeSkKIAogICAgICMgX3JlY29uc3RydWN0KCkKIApAQCAtNDE2LDkgKzQxNiw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQogCiAgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3Rfbm9zdGF0ZShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgpAQCAtNDI3LDkgKzQyNyw5IEBACiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeC5mb28gPSA0MgogICAgICAgICB5ID0gY29weS5jb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5Ll9fY2xhc3NfXyBpcyB4Ll9fY2xhc3NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuX19jbGFzc19fIGlzIHguX19jbGFzc19fKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5fX2NsYXNzX18gaXMgeC5fX2NsYXNzX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Ll9fY2xhc3NfXyBpcyB4Ll9fY2xhc3NfXykKIAogICAgIGRlZiB0ZXN0X3JlY29uc3RydWN0X3N0YXRlKHNlbGYpOgogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CkBAIC00NDQsNyArNDQ0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5LmZvbyBpcyBub3QgeC5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCiAKICAgICBkZWYgdGVzdF9yZWNvbnN0cnVjdF9zdGF0ZV9zZXRzdGF0ZShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgpAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQogCiAgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3RfcmVmbGV4aXZlKHNlbGYpOgogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CkBAIC00NjksOCArNDY5LDggQEAKICAgICAgICAgeCA9IEMoKQogICAgICAgICB4LmZvbyA9IHgKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5LmZvbyBpcyB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIHkpCiAKICAgICAjIEFkZGl0aW9ucyBmb3IgUHl0aG9uIDIuMyBhbmQgcGlja2xlIHByb3RvY29sIDIKIApAQCAtNDg1LDEyICs0ODUsMTIgQEAKICAgICAgICAgeCA9IEMoW1sxLCAyXSwgM10pCiAgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIHlbMF0pCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgbm90IHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4WzBdIGlzIG5vdCB5WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0gaXMgbm90IHlbMF0pCiAKICAgICBkZWYgdGVzdF9yZWR1Y2VfNXR1cGxlKHNlbGYpOgogICAgICAgICBjbGFzcyBDKGRpY3QpOgpAQCAtNTAzLDEyICs1MDMsMTIgQEAKICAgICAgICAgeCA9IEMoWygiZm9vIiwgWzEsIDJdKSwgKCJiYXIiLCAzKV0pCiAgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbImZvbyJdIGlzIHlbImZvbyJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbImZvbyJdIGlzIHlbImZvbyJdKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIG5vdCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeFsiZm9vIl0gaXMgbm90IHlbImZvbyJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbImZvbyJdIGlzIG5vdCB5WyJmb28iXSkKIAogICAgIGRlZiB0ZXN0X2NvcHlfc2xvdHMoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTUxNiw3ICs1MTYsNyBAQAogICAgICAgICB4ID0gQygpCiAgICAgICAgIHguZm9vID0gWzQyXQogICAgICAgICB5ID0gY29weS5jb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4LmZvbyBpcyB5LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZm9vIGlzIHkuZm9vKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfc2xvdHMoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTUyNSw3ICs1MjUsNyBAQAogICAgICAgICB4LmZvbyA9IFs0Ml0KICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgeS5mb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4LmZvbyBpcyBub3QgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmZvbyBpcyBub3QgeS5mb28pCiAKICAgICBkZWYgdGVzdF9jb3B5X2xpc3Rfc3ViY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEMobGlzdCk6CkBAIC01MzUsOCArNTM1LDggQEAKICAgICAgICAgeSA9IGNvcHkuY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCksIGxpc3QoeSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIHkuZm9vKQotICAgICAgICBzZWxmLmFzc2VydF8oeFswXSBpcyB5WzBdKQotICAgICAgICBzZWxmLmFzc2VydF8oeC5mb28gaXMgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmZvbyBpcyB5LmZvbykKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2xpc3Rfc3ViY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEMobGlzdCk6CkBAIC01NDYsOCArNTQ2LDggQEAKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHgpLCBsaXN0KHkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCB5LmZvbykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgbm90IHlbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4LmZvbyBpcyBub3QgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5mb28gaXMgbm90IHkuZm9vKQogCiAgICAgZGVmIHRlc3RfY29weV90dXBsZV9zdWJjbGFzcyhzZWxmKToKICAgICAgICAgY2xhc3MgQyh0dXBsZSk6CkBAIC01NjQsOCArNTY0LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSh4KSwgKFsxLCAyXSwgMykpCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoeSksIChbMSwgMl0sIDMpKQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgbm90IHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKIAogICAgIGRlZiB0ZXN0X2dldHN0YXRlX2V4YyhzZWxmKToKICAgICAgICAgY2xhc3MgRXZpbFN0YXRlKG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5IGIvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weQppbmRleCBjM2QzOTY0Li5lZmUyYjRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weV9yZWcucHkKQEAgLTUxLDEwICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jLCBjb2RlKQogICAgICAgICAgICAgY29weV9yZWcuYWRkX2V4dGVuc2lvbihtb2QsIGZ1bmMsIGNvZGUpCiAgICAgICAgICAgICAjIFNob3VsZCBiZSBpbiB0aGUgcmVnaXN0cnkuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY29weV9yZWcuX2V4dGVuc2lvbl9yZWdpc3RyeVttb2QsIGZ1bmNdID09IGNvZGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5W2NvZGVdID09IChtb2QsIGZ1bmMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnlbbW9kLCBmdW5jXSA9PSBjb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHlfcmVnLl9pbnZlcnRlZF9yZWdpc3RyeVtjb2RlXSA9PSAobW9kLCBmdW5jKSkKICAgICAgICAgICAgICMgU2hvdWxkbid0IGJlIGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb2RlIG5vdCBpbiBjb3B5X3JlZy5fZXh0ZW5zaW9uX2NhY2hlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGUgbm90IGluIGNvcHlfcmVnLl9leHRlbnNpb25fY2FjaGUpCiAgICAgICAgICAgICAjIFJlZHVuZGFudCByZWdpc3RyYXRpb24gc2hvdWxkIGJlIE9LLgogICAgICAgICAgICAgY29weV9yZWcuYWRkX2V4dGVuc2lvbihtb2QsIGZ1bmMsIGNvZGUpICAjIHNob3VsZG4ndCBibG93IHVwCiAgICAgICAgICAgICAjIENvbmZsaWN0aW5nIGNvZGUuCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgICAgICBlLnJlc3RvcmUoKQogCiAgICAgICAgICMgU2hvdWxkbid0IGJlIHRoZXJlIGFueW1vcmUuCi0gICAgICAgIHNlbGYuYXNzZXJ0XygobW9kLCBmdW5jKSBub3QgaW4gY29weV9yZWcuX2V4dGVuc2lvbl9yZWdpc3RyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChtb2QsIGZ1bmMpIG5vdCBpbiBjb3B5X3JlZy5fZXh0ZW5zaW9uX3JlZ2lzdHJ5KQogICAgICAgICAjIFRoZSBjb2RlICptYXkqIGJlIGluIGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnksIHRob3VnaCwgaWYKICAgICAgICAgIyB3ZSBoYXBwZW5lZCB0byBwaWNrIG9uIGEgcmVnaXN0ZXJlZCBjb2RlLiAgU28gZG9uJ3QgY2hlY2sgZm9yCiAgICAgICAgICMgdGhhdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3N2LnB5IGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKaW5kZXggNTU0NDkwNC4uYWViNjhiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jc3YucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKQEAgLTMyNiw3ICszMjYsNyBAQAogICAgICAgICBleHBlY3RlZF9kaWFsZWN0cy5zb3J0KCkKICAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QobmFtZSwgbXlleGNlbHRzdikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY3N2LmdldF9kaWFsZWN0KG5hbWUpLmRlbGltaXRlciwgJ1x0JykKICAgICAgICAgICAgIGdvdF9kaWFsZWN0cyA9IGNzdi5saXN0X2RpYWxlY3RzKCkKICAgICAgICAgICAgIGdvdF9kaWFsZWN0cy5zb3J0KCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZGlhbGVjdHMsIGdvdF9kaWFsZWN0cykKQEAgLTMzNyw4ICszMzcsOCBAQAogICAgICAgICBuYW1lID0gJ2ZlZGNiYScKICAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QobmFtZSwgZGVsaW1pdGVyPSc7JykKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGlzdChjc3YucmVhZGVyKCdYO1k7WicsIG5hbWUpKSwgWydYJywgJ1knLCAnWiddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGlzdChjc3YucmVhZGVyKCdYO1k7WicsIG5hbWUpKSwgWydYJywgJ1knLCAnWiddKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdChuYW1lKQogCkBAIC05MzUsNyArOTM1LDcgQEAKICAgICAgICAgIyBnaXZlbiB0aGF0IGFsbCB0aHJlZSBsaW5lcyBpbiBzYW1wbGUzIGFyZSBlcXVhbCwKICAgICAgICAgIyBJIHRoaW5rIHRoYXQgYW55IGNoYXJhY3RlciBjb3VsZCBoYXZlIGJlZW4gJ2d1ZXNzZWQnIGFzIHRoZQogICAgICAgICAjIGRlbGltaXRlciwgZGVwZW5kaW5nIG9uIGRpY3Rpb25hcnkgb3JkZXIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpYWxlY3QuZGVsaW1pdGVyIGluIHNlbGYuc2FtcGxlMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxlY3QuZGVsaW1pdGVyIGluIHNlbGYuc2FtcGxlMykKICAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSI/LCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICI/IikKICAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSIvLCIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQppbmRleCAyNGVjODk1Li5hZDM2Mzk4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKQEAgLTc5LDkgKzc5LDkgQEAKICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIG5hbWUpOgogICAgICAgICAgICAgICAgIHNlbGYuX19vZmZzZXQgPSBvZmZzZXQKICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoTm90RW5vdWdoLCB0emluZm8pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhOb3RFbm91Z2gsIHR6aW5mbykpCiAgICAgICAgIG5lID0gTm90RW5vdWdoKDMsICJOb3RCeUFMb25nU2hvdCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG5lLCB0emluZm8pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShuZSwgdHppbmZvKSkKIAogICAgICAgICBkdCA9IGRhdGV0aW1lLm5vdygpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG5lLnR6bmFtZSwgZHQpCkBAIC05MCw3ICs5MCw3IEBACiAKICAgICBkZWYgdGVzdF9ub3JtYWwoc2VsZik6CiAgICAgICAgIGZvID0gRml4ZWRPZmZzZXQoMywgIlRocmVlIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZm8sIHR6aW5mbykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGZvLCB0emluZm8pKQogICAgICAgICBmb3IgZHQgaW4gZGF0ZXRpbWUubm93KCksIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnV0Y29mZnNldChkdCksIHRpbWVkZWx0YShtaW51dGVzPTMpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby50em5hbWUoZHQpLCAiVGhyZWUiKQpAQCAtMTAxLDI1ICsxMDEsMjUgQEAKICAgICAgICAgIyBjYXJyeSBubyBkYXRhKSwgYnV0IHRoZXkgbmVlZCB0byBiZSBwaWNrbGFibGUgYW55d2F5IGVsc2UKICAgICAgICAgIyBjb25jcmV0ZSBzdWJjbGFzc2VzIGNhbid0IGJlIHBpY2tsZWQuCiAgICAgICAgIG9yaWcgPSB0emluZm8uX19uZXdfXyh0emluZm8pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKG9yaWcpIGlzIHR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUob3JpZykgaXMgdHppbmZvKQogICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShkZXJpdmVkKSBpcyB0emluZm8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShkZXJpdmVkKSBpcyB0emluZm8pCiAKICAgICBkZWYgdGVzdF9waWNrbGluZ19zdWJjbGFzcyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgd2UgY2FuIHBpY2tsZS91bnBpY2tsZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzLgogICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEobWludXRlcz0tMzAwKQogICAgICAgICBvcmlnID0gUGlja2xhYmxlRml4ZWRPZmZzZXQob2Zmc2V0LCAnY29va2llJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uob3JpZywgdHppbmZvKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUob3JpZykgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9yaWcsIHR6aW5mbykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9yaWcpIGlzIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcudXRjb2Zmc2V0KE5vbmUpLCBvZmZzZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZy50em5hbWUoTm9uZSksICdjb29raWUnKQogICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShkZXJpdmVkLCB0emluZm8pKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoZGVyaXZlZCkgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkZXJpdmVkLCB0emluZm8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGVyaXZlZCkgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudXRjb2Zmc2V0KE5vbmUpLCBvZmZzZXQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKE5vbmUpLCAnY29va2llJykKIApAQCAtMTM2LDE2ICsxMzYsMTYgQEAKICAgICBkZWYgdGVzdF9oYXJtbGVzc19taXhlZF9jb21wYXJpc29uKHNlbGYpOgogICAgICAgICBtZSA9IHNlbGYudGhlY2xhc3MoMSwgMSwgMSkKIAotICAgICAgICBzZWxmLmZhaWxJZihtZSA9PSAoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1lICE9ICgpKQotICAgICAgICBzZWxmLmZhaWxJZigoKSA9PSBtZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCgpICE9IG1lKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1lID09ICgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWUgIT0gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKCkgPT0gbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoKSAhPSBtZSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWUgaW4gWzEsIDIwTCwgW10sIG1lXSkKLSAgICAgICAgc2VsZi5mYWlsSWYobWUgbm90IGluIFsxLCAyMEwsIFtdLCBtZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZSBpbiBbMSwgMjBMLCBbXSwgbWVdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1lIG5vdCBpbiBbMSwgMjBMLCBbXSwgbWVdKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhbXSBpbiBbbWUsIDEsIDIwTCwgW11dKQotICAgICAgICBzZWxmLmZhaWxJZihbXSBub3QgaW4gW21lLCAxLCAyMEwsIFtdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFtdIGluIFttZSwgMSwgMjBMLCBbXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoW10gbm90IGluIFttZSwgMSwgMjBMLCBbXV0pCiAKICAgICBkZWYgdGVzdF9oYXJtZnVsX21peGVkX2NvbXBhcmlzb24oc2VsZik6CiAgICAgICAgIG1lID0gc2VsZi50aGVjbGFzcygxLCAxLCAxKQpAQCAtMzA3LDI5ICszMDcsMjkgQEAKICAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYpOgogICAgICAgICB0MSA9IHRpbWVkZWx0YSgyLCAzLCA0KQogICAgICAgICB0MiA9IHRpbWVkZWx0YSgyLCAzLCA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID49IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxICE9IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxIDwgdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKICAgICAgICAgICAgIHQyID0gdGltZWRlbHRhKCphcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDwgdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgPiB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+PSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSAhPSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiAhPSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPT0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyID09IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIApAQCAtMzc3LDcgKzM3Nyw3IEBACiAKICAgICAgICAgICAgICMgVmVyaWZ5IHRkIC0+IHN0cmluZyAtPiB0ZCBpZGVudGl0eS4KICAgICAgICAgICAgIHMgPSByZXByKHRkKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCdkYXRldGltZS4nKSkKICAgICAgICAgICAgIHMgPSBzWzk6XQogICAgICAgICAgICAgdGQyID0gZXZhbChzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZCwgdGQyKQpAQCAtMzg3LDEwICszODcsMTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQsIHRkMikKIAogICAgIGRlZiB0ZXN0X3Jlc29sdXRpb25faW5mbyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGltZWRlbHRhLm1pbiwgdGltZWRlbHRhKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lZGVsdGEubWF4ID4gdGltZWRlbHRhLm1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGltZWRlbHRhLm1pbiwgdGltZWRlbHRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEubWF4ID4gdGltZWRlbHRhLm1pbikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lZGVsdGEubWluLCB0aW1lZGVsdGEoLTk5OTk5OTk5OSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKDk5OTk5OTk5OSwgMjQqMzYwMC0xLCAxZTYtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSgwLCAwLCAxKSkKQEAgLTQzNywxMSArNDM3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLCAyNCozNjAwLTEsIDk5OTk5OSkpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKDAsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKDAsIDAsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0aW1lZGVsdGEoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHRpbWVkZWx0YSgwKSkKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3RpbWVkZWx0YShzZWxmKToKIApAQCAtNDU3LDE3ICs0NTcsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcm91bmQoc3VtKQogCiAgICAgICAgIHQxID0gVChkYXlzPTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQxKSBpcyBUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0MSkgaXMgVCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5hc19ob3VycygpLCAyNCkKIAogICAgICAgICB0MiA9IFQoZGF5cz0tMSwgc2Vjb25kcz0tMzYwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodDIpIGlzIFQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQyKSBpcyBUKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLmFzX2hvdXJzKCksIC0yNSkKIAogICAgICAgICB0MyA9IHQxICsgdDIKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodDMpIGlzIHRpbWVkZWx0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDMpIGlzIHRpbWVkZWx0YSkKICAgICAgICAgdDQgPSBULmZyb21fdGQodDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQ0KSBpcyBUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0NCkgaXMgVCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5kYXlzLCB0NC5kYXlzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnNlY29uZHMsIHQ0LnNlY29uZHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMubWljcm9zZWNvbmRzLCB0NC5taWNyb3NlY29uZHMpCkBAIC01MzAsNyArNTMwLDcgQEAKICAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzLnRvZGF5KCkpOgogICAgICAgICAgICAgIyBWZXJpZnkgZHQgLT4gc3RyaW5nIC0+IGRhdGUgaWRlbnRpdHkuCiAgICAgICAgICAgICBzID0gcmVwcihkdCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCiAgICAgICAgICAgICBzID0gc1s5Ol0KICAgICAgICAgICAgIGR0MiA9IGV2YWwocykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGR0MikKQEAgLTc2NCw3ICs3NjQsNyBAQAogCiAgICAgICAgICMgSXQgd29ya2VkIG9yIGl0IGRpZG4ndC4gIElmIGl0IGRpZG4ndCwgYXNzdW1lIGl0J3MgcmVhc29uICMyLCBhbmQKICAgICAgICAgIyBsZXQgdGhlIHRlc3QgcGFzcyBpZiB0aGV5J3JlIHdpdGhpbiBoYWxmIGEgc2Vjb25kIG9mIGVhY2ggb3RoZXIuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0b2RheSA9PSB0b2RheWFnYWluIG9yCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2RheSA9PSB0b2RheWFnYWluIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICBhYnModG9kYXlhZ2FpbiAtIHRvZGF5KSA8IHRpbWVkZWx0YShzZWNvbmRzPTAuNSkpCiAKICAgICBkZWYgdGVzdF93ZWVrZGF5KHNlbGYpOgpAQCAtOTAxLDEwICs5MDEsMTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKGZtdCksICdCJykKIAogICAgIGRlZiB0ZXN0X3Jlc29sdXRpb25faW5mbyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5taW4sIHNlbGYudGhlY2xhc3MpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1heCwgc2VsZi50aGVjbGFzcykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MucmVzb2x1dGlvbiwgdGltZWRlbHRhKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhlY2xhc3MubWF4ID4gc2VsZi50aGVjbGFzcy5taW4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MubWluLCBzZWxmLnRoZWNsYXNzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5tYXgsIHNlbGYudGhlY2xhc3MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1heCA+IHNlbGYudGhlY2xhc3MubWluKQogCiAgICAgZGVmIHRlc3RfZXh0cmVtZV90aW1lZGVsdGEoc2VsZik6CiAgICAgICAgIGJpZyA9IHNlbGYudGhlY2xhc3MubWF4IC0gc2VsZi50aGVjbGFzcy5taW4KQEAgLTk1MiwyOSArOTUyLDI5IEBACiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKICAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDIsIDMsIDQpCiAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygyLCAzLCA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID49IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxICE9IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxIDwgdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKICAgICAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykgICAjIHRoaXMgaXMgbGFyZ2VyIHRoYW4gdDEKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQyID4gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPD0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgPj0gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgIT0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgIT0gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID09IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA9PSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPiB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPCB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPj0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiAhPSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyID09IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPD0gdDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCiAKQEAgLTEwMjgsMTMgKzEwMjgsMTMgQEAKICAgICAgICAgdGhlaXIgPSBDb21wYXJhYmxlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAob3VyLCB0aGVpciksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHRoZWlyLCBvdXIpLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3VyID09IHRoZWlyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGhlaXIgPT0gb3VyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3VyID09IHRoZWlyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGhlaXIgPT0gb3VyKQogCiAgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKICAgICAgICAgIyBBbGwgZGF0ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZS4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYudGhlY2xhc3MubWluKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi50aGVjbGFzcy5tYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhlY2xhc3MubWF4KQogCiAgICAgZGVmIHRlc3Rfc3RyZnRpbWVfb3V0X29mX3JhbmdlKHNlbGYpOgogICAgICAgICAjIEZvciBuYXN0eSB0ZWNobmljYWwgcmVhc29ucywgd2UgY2FuJ3QgaGFuZGxlIHllYXJzIGJlZm9yZSAxOTAwLgpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzLm5vdygpKToKICAgICAgICAgICAgICMgVmVyaWZ5IGR0IC0+IHN0cmluZyAtPiBkYXRldGltZSBpZGVudGl0eS4KICAgICAgICAgICAgIHMgPSByZXByKGR0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCdkYXRldGltZS4nKSkKICAgICAgICAgICAgIHMgPSBzWzk6XQogICAgICAgICAgICAgZHQyID0gZXZhbChzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQpAQCAtMTIzMCw3ICsxMjMwLDcgQEAKICAgICAgICAgZHQyID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCAxMCwgMCwgMCkKICAgICAgICAgZHQzID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCA5LCAwLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MSwgZHQzKQotICAgICAgICBzZWxmLmFzc2VydF8oZHQyID4gZHQzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQyID4gZHQzKQogCiAgICAgICAgICMgTWFrZSBzdXJlIGNvbXBhcmlzb24gZG9lc24ndCBmb3JnZXQgbWljcm9zZWNvbmRzLCBhbmQgaXNuJ3QgZG9uZQogICAgICAgICAjIHZpYSBjb21wYXJpbmcgYSBmbG9hdCB0aW1lc3RhbXAgKGFuIElFRUUgZG91YmxlIGRvZXNuJ3QgaGF2ZSBlbm91Z2gKQEAgLTEyNDEsNyArMTI0MSw3IEBACiAgICAgICAgIHVzID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKQogICAgICAgICBkdDIgPSBkdDEgKyB1cwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiAtIGR0MSwgdXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkdDEgPCBkdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdDEgPCBkdDIpCiAKICAgICBkZWYgdGVzdF9zdHJmdGltZV93aXRoX2JhZF90em5hbWVfcmVwbGFjZShzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgb2sgaWYgdHppbmZvLnR6bmFtZSgpLnJlcGxhY2UoKSByZXR1cm5zIGEgbm9uLXN0cmluZwpAQCAtMTQyMSwxMiArMTQyMSwxMiBAQAogICAgICAgICBhcmdzID0gWzIwMDAsIDExLCAyOSwgMjAsIDU4LCAxNiwgOTk5OTk4XQogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCiAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID09IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPD0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA+PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSAhPSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA8IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPj0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgIT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQogCkBAIC0xNDM0LDE4ICsxNDM0LDE4IEBACiAgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQogICAgICAgICAgICAgbmV3YXJnc1tpXSA9IGFyZ3NbaV0gKyAxCiAgICAgICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoKm5ld2FyZ3MpICAgIyB0aGlzIGlzIGxhcmdlciB0aGFuIHQxCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPCB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDw9IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQyID49IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxICE9IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQyICE9IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA9PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPT0gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyIDwgdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID49IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQogCkBAIC0xNTI2LDcgKzE1MjYsNyBAQAogICAgICAgICAgICAgaWYgYWJzKGZyb21fdGltZXN0YW1wIC0gZnJvbV9ub3cpIDw9IHRvbGVyYW5jZToKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgIyBFbHNlIHRyeSBhZ2FpbiBhIGZldyB0aW1lcy4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFicyhmcm9tX3RpbWVzdGFtcCAtIGZyb21fbm93KSA8PSB0b2xlcmFuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoZnJvbV90aW1lc3RhbXAgLSBmcm9tX25vdykgPD0gdG9sZXJhbmNlKQogCiAgICAgZGVmIHRlc3Rfc3RycHRpbWUoc2VsZik6CiAgICAgICAgIGltcG9ydCBfc3RycHRpbWUKQEAgLTE2OTUsNyArMTY5NSw3IEBACiAKICAgICAgICAgIyBWZXJpZnkgdCAtPiBzdHJpbmcgLT4gdGltZSBpZGVudGl0eS4KICAgICAgICAgcyA9IHJlcHIodCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQogICAgICAgICBzID0gc1s5Ol0KICAgICAgICAgdDIgPSBldmFsKHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdDIpCkBAIC0xNzA5LDEyICsxNzA5LDEyIEBACiAgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNF0KICAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQogICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA9PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDw9IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPj0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgIT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPCB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMCkKIApAQCAtMTcyMiwxOCArMTcyMiwxOCBAQAogICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KICAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBhcmdzW2ldICsgMQogICAgICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCpuZXdhcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDwgdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgPiB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+PSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSAhPSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiAhPSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPT0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyID09IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIApAQCAtMTg4NiwxMCArMTg4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICIlcygyMywgMTUpIiAlIG5hbWUpCiAKICAgICBkZWYgdGVzdF9yZXNvbHV0aW9uX2luZm8oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MubWluLCBzZWxmLnRoZWNsYXNzKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5tYXgsIHNlbGYudGhlY2xhc3MpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZWNsYXNzLm1heCA+IHNlbGYudGhlY2xhc3MubWluKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1pbiwgc2VsZi50aGVjbGFzcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MubWF4LCBzZWxmLnRoZWNsYXNzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5yZXNvbHV0aW9uLCB0aW1lZGVsdGEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGVjbGFzcy5tYXggPiBzZWxmLnRoZWNsYXNzLm1pbikKIAogICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgogICAgICAgICBhcmdzID0gMjAsIDU5LCAxNiwgNjQqKjIKQEAgLTE5MDksMTIgKzE5MDksMTIgQEAKIAogICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CiAgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygwLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygwLCAwLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygwLCAwLCAwLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBjbHMoMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgY2xzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMCwgMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2xzKDApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNscygpKQogCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcwpAQCAtMjAxMSw3ICsyMDExLDcgQEAKICAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiBwYXNzCiAgICAgICAgIGIgPSBCZXR0ZXJUcnkoKQogICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModC50emluZm8gaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQudHppbmZvIGlzIGIpCiAKICAgICBkZWYgdGVzdF91dGNfb2Zmc2V0X291dF9vZl9ib3VuZHMoc2VsZik6CiAgICAgICAgIGNsYXNzIEVkZ3kodHppbmZvKToKQEAgLTIwNTAsOSArMjA1MCw5IEBACiAgICAgICAgIGZvciB0IGluIChjbHMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICBjbHMoMSwgMSwgMSwgdHppbmZvPU5vbmUpLAogICAgICAgICAgICAgICAgICAgY2xzKDEsIDEsIDEsIHR6aW5mbz1DMSgpKSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModC51dGNvZmZzZXQoKSBpcyBOb25lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQuZHN0KCkgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0LnR6bmFtZSgpIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodC51dGNvZmZzZXQoKSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuZHN0KCkgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LnR6bmFtZSgpIGlzIE5vbmUpCiAKICAgICAgICAgY2xhc3MgQzModHppbmZvKToKICAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9LTE0MzkpCkBAIC0yMTQ2LDcgKzIxNDYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWludXRlLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2Vjb25kLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWljcm9zZWNvbmQsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0LnR6aW5mbyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC50emluZm8gaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X3pvbmVzKHNlbGYpOgogICAgICAgICBlc3QgPSBGaXhlZE9mZnNldCgtMzAwLCAiRVNUIiwgMSkKQEAgLTIxNjEsMjUgKzIxNjEsMjUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50emluZm8sIGVzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50emluZm8sIHV0YykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My50emluZm8sIG1ldCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQ0LnR6aW5mbyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudHppbmZvIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDUudHppbmZvLCB1dGMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz02MCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0NC51dGNvZmZzZXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudXRjb2Zmc2V0KCkgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0MS51dGNvZmZzZXQsICJubyBhcmdzIikKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnR6bmFtZSgpLCAiRVNUIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50em5hbWUoKSwgIlVUQyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudHpuYW1lKCksICJNRVQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDQudHpuYW1lKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LnR6bmFtZSgpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEudHpuYW1lLCAibm8gYXJncyIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuZHN0KCksIHRpbWVkZWx0YShtaW51dGVzPS0yKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0NC5kc3QoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQuZHN0KCkgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0MS5kc3QsICJubyBhcmdzIikKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQyKSkKQEAgLTIyNTUsNyArMjI1NSw3IEBACiAgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCiAgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZGVyaXZlZC50emluZm8sIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGRlcml2ZWQudHppbmZvLCBQaWNrbGFibGVGaXhlZE9mZnNldCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPS0zMDApKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXJpdmVkLnR6bmFtZSgpLCAnY29va2llJykKIApAQCAtMjI2NCwyMCArMjI2NCwyMCBAQAogICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCiAKICAgICAgICAgdCA9IGNscygwLCB0emluZm89Rml4ZWRPZmZzZXQoLTMwMCwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCiAKICAgICAgICAgdCA9IGNscyg1LCB0emluZm89Rml4ZWRPZmZzZXQoLTMwMCwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCiAKICAgICAgICAgdCA9IGNscyg1LCB0emluZm89Rml4ZWRPZmZzZXQoMzAwLCAiIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0KQogCiAgICAgICAgIHQgPSBjbHMoMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMjMqNjAgKyA1OSwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdCkKIAogICAgICAgICAjIE1vc3RseSBlbnN1cmluZyB0aGlzIGRvZXNuJ3Qgb3ZlcmZsb3cgaW50ZXJuYWxseS4KICAgICAgICAgdCA9IGNscygwLCB0emluZm89Rml4ZWRPZmZzZXQoMjMqNjAgKyA1OSwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCiAKICAgICAgICAgIyBCdXQgdGhpcyBzaG91bGQgeWllbGQgYSB2YWx1ZSBlcnJvciAtLSB0aGUgdXRjb2Zmc2V0IGlzIGJvZ3VzLgogICAgICAgICB0ID0gY2xzKDAsIHR6aW5mbz1GaXhlZE9mZnNldCgyNCo2MCwgIiIpKQpAQCAtMjMxMSwxMyArMjMxMSwxMyBAQAogICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gZ2V0IHJpZCBvZiBhIHR6aW5mby4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLnR6bmFtZSgpLCAiKzEwMCIpCiAgICAgICAgIGJhc2UyID0gYmFzZS5yZXBsYWNlKHR6aW5mbz1Ob25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYmFzZTIudHppbmZvIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlMi50em5hbWUoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHppbmZvIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50em5hbWUoKSBpcyBOb25lKQogCiAgICAgICAgICMgRW5zdXJlIHdlIGNhbiBhZGQgb25lLgogICAgICAgICBiYXNlMyA9IGJhc2UyLnJlcGxhY2UodHppbmZvPXoxMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZTMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCiAKICAgICAgICAgIyBPdXQgb2YgYm91bmRzLgogICAgICAgICBiYXNlID0gY2xzKDEpCkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCiAgICAgICAgICMgQnV0IGlmIHRoZXkncmUgbm90IGlkZW50aWNhbCwgaXQgaXNuJ3QgaWdub3JlZC4KICAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1WYXJpZXMoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDwgdDIpICAjIHQxJ3Mgb2Zmc2V0IGNvdW50ZXIgc3RpbGwgZ29pbmcgdXAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpICAjIHQxJ3Mgb2Zmc2V0IGNvdW50ZXIgc3RpbGwgZ29pbmcgdXAKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3RpbWV0eihzZWxmKToKIApAQCAtMjQxMCwxMiArMjQxMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvPUZpeGVkT2Zmc2V0KC0xNDM5LCAiIikpCiAKICAgICAgICAgIyBNYWtlIHN1cmUgdGhvc2UgY29tcGFyZSBjb3JyZWN0bHksIGFuZCB3L28gb3ZlcmZsb3cuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgIT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+IHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPT0gdDIpCiAKICAgICAgICAgIyBFcXVhbCBhZmVyIGFkanVzdG1lbnQuCiAgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDEsICIiKSkKQEAgLTI0MjQsMjEgKzI0MjQsMjEgQEAKIAogICAgICAgICAjIENoYW5nZSB0MSBub3QgdG8gc3VidHJhY3QgYSBtaW51dGUsIGFuZCB0MSBzaG91bGQgYmUgbGFyZ2VyLgogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgwLCAiIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA+IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPiB0MikKIAogICAgICAgICAjIENoYW5nZSB0MSB0byBzdWJ0cmFjdCAyIG1pbnV0ZXMsIGFuZCB0MSBzaG91bGQgYmUgc21hbGxlci4KICAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDEsIDEyLCAzMSwgMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMiwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCiAKICAgICAgICAgIyBCYWNrIHRvIHRoZSBvcmlnaW5hbCB0MSwgYnV0IG1ha2Ugc2Vjb25kcyByZXNvbHZlIGl0LgogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgxLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQ9MSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+IHQyKQogCiAgICAgICAgICMgTGlrZXdpc2UsIGJ1dCBtYWtlIG1pY3Jvc2Vjb25kcyByZXNvbHZlIGl0LgogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgxLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID4gdDIpCiAKICAgICAgICAgIyBNYWtlIHQyIG5haXZlIGFuZCBpdCBzaG91bGQgZmFpbC4KICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzLm1pbgpAQCAtMjQ4Miw3ICsyNDgyLDcgQEAKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShkZXJpdmVkLnR6aW5mbywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGRlcml2ZWQudHppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVyaXZlZC51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKCksICdjb29raWUnKQpAQCAtMjU1Myw3ICsyNTUzLDcgQEAKICAgICAgICAgdHo1NSA9IEZpeGVkT2Zmc2V0KC0zMzAsICJ3ZXN0IDU6MzAiKQogICAgICAgICB0aW1lYXdhcmUgPSBub3cudGltZSgpLnJlcGxhY2UodHppbmZvPXR6NTUpCiAgICAgICAgIG5vd2F3YXJlID0gc2VsZi50aGVjbGFzcy5jb21iaW5lKG5vdy5kYXRlKCksIHRpbWVhd2FyZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vd2F3YXJlLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmUudHppbmZvIGlzIHR6NTUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmUudGltZXR6KCksIHRpbWVhd2FyZSkKIAogICAgICAgICAjIENhbid0IG1peCBhd2FyZSBhbmQgbm9uLWF3YXJlLgpAQCAtMjU3MiwxNSArMjU3MiwxNSBAQAogICAgICAgICAjIEFkZGluZyBhIGRlbHRhIHNob3VsZCBwcmVzZXJ2ZSB0emluZm8uCiAgICAgICAgIGRlbHRhID0gdGltZWRlbHRhKHdlZWtzPTEsIG1pbnV0ZXM9MTIsIG1pY3Jvc2Vjb25kcz01Njc4KQogICAgICAgICBub3dhd2FyZXBsdXMgPSBub3dhd2FyZSArIGRlbHRhCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3dhd2FyZS50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlLnR6aW5mbyBpcyB0ejU1KQogICAgICAgICBub3dhd2FyZXBsdXMyID0gZGVsdGEgKyBub3dhd2FyZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm93YXdhcmVwbHVzMi50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlcGx1czIudHppbmZvIGlzIHR6NTUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmVwbHVzLCBub3dhd2FyZXBsdXMyKQogCiAgICAgICAgICMgdGhhdCAtIGRlbHRhIHNob3VsZCBiZSB3aGF0IHdlIHN0YXJ0ZWQgd2l0aCwgYW5kIHRoYXQgLSB3aGF0IHdlCiAgICAgICAgICMgc3RhcnRlZCB3aXRoIHNob3VsZCBiZSBkZWx0YS4KICAgICAgICAgZGlmZiA9IG5vd2F3YXJlcGx1cyAtIGRlbHRhCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkaWZmLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlmZi50emluZm8gaXMgdHo1NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZSwgZGlmZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRlbHRhIC0gbm93YXdhcmVwbHVzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlcGx1cyAtIG5vd2F3YXJlLCBkZWx0YSkKQEAgLTI1ODksNyArMjU4OSw3IEBACiAgICAgICAgIHR6ciA9IEZpeGVkT2Zmc2V0KHJhbmRvbS5yYW5kcmFuZ2UoLTE0MzksIDE0NDApLCAicmFuZG9tdGltZXpvbmUiKQogICAgICAgICAjIEF0dGFjaCBpdCB0byBub3dhd2FyZXBsdXMuCiAgICAgICAgIG5vd2F3YXJlcGx1cyA9IG5vd2F3YXJlcGx1cy5yZXBsYWNlKHR6aW5mbz10enIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3dhd2FyZXBsdXMudHppbmZvIGlzIHR6cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlcGx1cy50emluZm8gaXMgdHpyKQogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlmZmVyZW5jZSB0YWtlcyB0aGUgdGltZXpvbmUgYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgogICAgICAgICBnb3QgPSBub3dhd2FyZSAtIG5vd2F3YXJlcGx1cwogICAgICAgICAjIEV4cGVjdGVkOiAgKG5vd2F3YXJlIGJhc2UgLSBub3dhd2FyZSBvZmZzZXQpIC0KQEAgLTI2MTYsNyArMjYxNiw3IEBACiAgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCiAgICAgICAgIGFub3RoZXIgPSBtZXRoKG9mZjQyKQogICAgICAgICBhZ2FpbiA9IG1ldGgodHo9b2ZmNDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5vdGhlci51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9NDIpKQogICAgICAgICAjIEJhZCBhcmd1bWVudCB3aXRoIGFuZCB3L28gbmFtaW5nIHRoZSBrZXl3b3JkLgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIDE2KQpAQCAtMjYzMyw3ICsyNjMzLDcgQEAKICAgICAgICAgdXRjID0gRml4ZWRPZmZzZXQoMCwgInV0YyIsIDApCiAgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgzKToKICAgICAgICAgICAgIG5vdyA9IGRhdGV0aW1lLm5vdyh3ZWlyZHR6KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdy50emluZm8gaXMgd2VpcmR0eikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3cudHppbmZvIGlzIHdlaXJkdHopCiAgICAgICAgICAgICB1dGNub3cgPSBkYXRldGltZS51dGNub3coKS5yZXBsYWNlKHR6aW5mbz11dGMpCiAgICAgICAgICAgICBub3cyID0gdXRjbm93LmFzdGltZXpvbmUod2VpcmR0eikKICAgICAgICAgICAgIGlmIGFicyhub3cgLSBub3cyKSA8IHRpbWVkZWx0YShzZWNvbmRzPTMwKToKQEAgLTI2NTQsNyArMjY1NCw3IEBACiAgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCiAgICAgICAgIGFub3RoZXIgPSBtZXRoKHRzLCBvZmY0MikKICAgICAgICAgYWdhaW4gPSBtZXRoKHRzLCB0ej1vZmY0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFub3RoZXIudHppbmZvIGlzIGFnYWluLnR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFub3RoZXIudHppbmZvIGlzIGFnYWluLnR6aW5mbykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbm90aGVyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz00MikpCiAgICAgICAgICMgQmFkIGFyZ3VtZW50IHdpdGggYW5kIHcvbyBuYW1pbmcgdGhlIGtleXdvcmQuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIDE2KQpAQCAtMjg0OCwxMyArMjg0OCwxMyBAQAogICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gZ2V0IHJpZCBvZiBhIHR6aW5mby4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLnR6bmFtZSgpLCAiKzEwMCIpCiAgICAgICAgIGJhc2UyID0gYmFzZS5yZXBsYWNlKHR6aW5mbz1Ob25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYmFzZTIudHppbmZvIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlMi50em5hbWUoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHppbmZvIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50em5hbWUoKSBpcyBOb25lKQogCiAgICAgICAgICMgRW5zdXJlIHdlIGNhbiBhZGQgb25lLgogICAgICAgICBiYXNlMyA9IGJhc2UyLnJlcGxhY2UodHppbmZvPXoxMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZTMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCiAKICAgICAgICAgIyBPdXQgb2YgYm91bmRzLgogICAgICAgICBiYXNlID0gY2xzKDIwMDAsIDIsIDI5KQpAQCAtMjg2NywyMCArMjg2NywyMCBAQAogICAgICAgICBmbTVoID0gRml4ZWRPZmZzZXQoLXRpbWVkZWx0YShob3Vycz01KSwgIm0zMDAiKQogCiAgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcy5ub3codHo9ZjQ0bSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGR0LnR6aW5mbyBpcyBmNDRtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQudHppbmZvIGlzIGY0NG0pCiAgICAgICAgICMgUmVwbGFjaW5nIHdpdGggZGVnZW5lcmF0ZSB0emluZm8gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZHQuYXN0aW1lem9uZSwgZm5vbmUpCiAgICAgICAgICMgRGl0dG8gd2l0aCBOb25lIHR6LgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGR0LmFzdGltZXpvbmUsIE5vbmUpCiAgICAgICAgICMgUmVwbGFjaW5nIHdpdGggc2FtZSB0emluZm8gbWFrZXMgbm8gY2hhbmdlLgogICAgICAgICB4ID0gZHQuYXN0aW1lem9uZShkdC50emluZm8pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh4LnR6aW5mbyBpcyBmNDRtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC50emluZm8gaXMgZjQ0bSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmRhdGUoKSwgZHQuZGF0ZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudGltZSgpLCBkdC50aW1lKCkpCiAKICAgICAgICAgIyBSZXBsYWNpbmcgd2l0aCBkaWZmZXJlbnQgdHppbmZvIGRvZXMgYWRqdXN0LgogICAgICAgICBnb3QgPSBkdC5hc3RpbWV6b25lKGZtNWgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhnb3QudHppbmZvIGlzIGZtNWgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb3QudHppbmZvIGlzIGZtNWgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnV0Y29mZnNldCgpLCB0aW1lZGVsdGEoaG91cnM9LTUpKQogICAgICAgICBleHBlY3RlZCA9IGR0IC0gZHQudXRjb2Zmc2V0KCkgICMgaW4gZWZmZWN0LCBjb252ZXJ0IHRvIFVUQwogICAgICAgICBleHBlY3RlZCArPSBmbTVoLnV0Y29mZnNldChkdCkgICMgYW5kIGZyb20gdGhlcmUgdG8gbG9jYWwgdGltZQpAQCAtMjg4OCw3ICsyODg4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QuZGF0ZSgpLCBleHBlY3RlZC5kYXRlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnRpbWUoKSwgZXhwZWN0ZWQudGltZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdC50aW1ldHooKSwgZXhwZWN0ZWQudGltZXR6KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhnb3QudHppbmZvIGlzIGV4cGVjdGVkLnR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdvdC50emluZm8gaXMgZXhwZWN0ZWQudHppbmZvKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICBkZWYgdGVzdF9hd2FyZV9zdWJ0cmFjdChzZWxmKToKQEAgLTI5NjMsNyArMjk2Myw3IEBACiAKICAgICAgICAgIyBCdXQgaWYgdGhleSdyZSBub3QgaWRlbnRpY2FsLCBpdCBpc24ndCBpZ25vcmVkLgogICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPVZhcmllcygpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPCB0MikgICMgdDEncyBvZmZzZXQgY291bnRlciBzdGlsbCBnb2luZyB1cAorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikgICMgdDEncyBvZmZzZXQgY291bnRlciBzdGlsbCBnb2luZyB1cAogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGF0ZXRpbWV0eihzZWxmKToKIApAQCAtMzMxNCwxMCArMzMxNCwxMCBAQAogICAgICAgICAjIHR5cGUgY29tcGFyaXNvbiwgZGVzcGl0ZSB0aGF0IGRhdGV0aW1lIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZS4KICAgICAgICAgYXNfZGF0ZSA9IGRhdGUudG9kYXkoKQogICAgICAgICBhc19kYXRldGltZSA9IGRhdGV0aW1lLmNvbWJpbmUoYXNfZGF0ZSwgdGltZSgpKQotICAgICAgICBzZWxmLmFzc2VydF8oYXNfZGF0ZSAhPSBhc19kYXRldGltZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFzX2RhdGV0aW1lICE9IGFzX2RhdGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYXNfZGF0ZSA9PSBhc19kYXRldGltZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBhc19kYXRldGltZSA9PSBhc19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZSAhPSBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFzX2RhdGV0aW1lICE9IGFzX2RhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYXNfZGF0ZSA9PSBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRldGltZSA9PSBhc19kYXRlKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZSA8IGFzX2RhdGV0aW1lKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZXRpbWUgPCBhc19kYXRlKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZSA8PSBhc19kYXRldGltZSkKQEAgLTMzMjksOSArMzMyOSw5IEBACiAKICAgICAgICAgIyBOZXZlcnRoZWxzcywgY29tcGFyaXNvbiBzaG91bGQgd29yayB3aXRoIHRoZSBiYXNlLWNsYXNzIChkYXRlKQogICAgICAgICAjIHByb2plY3Rpb24gaWYgdXNlIG9mIGEgZGF0ZSBtZXRob2QgaXMgZm9yY2VkLgotICAgICAgICBzZWxmLmFzc2VydF8oYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpKQogICAgICAgICBkaWZmZXJlbnRfZGF5ID0gKGFzX2RhdGUuZGF5ICsgMSkgJSAyMCArIDEKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBhc19kYXRlLl9fZXFfXyhhc19kYXRldGltZS5yZXBsYWNlKGRheT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRlLl9fZXFfXyhhc19kYXRldGltZS5yZXBsYWNlKGRheT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50X2RheSkpKQogCiAgICAgICAgICMgQW5kIGRhdGUgc2hvdWxkIGNvbXBhcmUgd2l0aCBvdGhlciBzdWJjbGFzc2VzIG9mIGRhdGUuICBJZiBhCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibS5weSBiL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CmluZGV4IDE2MjdmZmYuLjQzZjhhNWIgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CkBAIC0yMSw5ICsyMSw5IEBACiAgICAgICAgICAgICBzZWxmLmRba10gPSB2CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHNlbGYuZC5rZXlzKCkpLCBzb3J0ZWQoayBmb3IgKGssIHYpIGluIGEpKQogICAgICAgICBmb3IgaywgdiBpbiBhOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGsgaW4gc2VsZi5kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gc2VsZi5kKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRba10sIHYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygneHh4JyBub3QgaW4gc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3h4eCcgbm90IGluIHNlbGYuZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5kWyd4eHgnXSkKICAgICAgICAgc2VsZi5kLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CmluZGV4IDdmOTU5ODMuLjFjZTY1ZWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTUxMyw3ICs1MTMsNyBAQAogCiAgICAgICAgICMgZnJvbSBpbnQKICAgICAgICAgZCA9IG5jLmNyZWF0ZV9kZWNpbWFsKDQ1NikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZCwgRGVjaW1hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGQsIERlY2ltYWwpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5jLmNyZWF0ZV9kZWNpbWFsKDQ1Njc4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYy5jcmVhdGVfZGVjaW1hbCgnNDU3RSsyJykpCiAKQEAgLTEwNjEsMTIgKzEwNjEsMTIgQEAKICAgICAgICAgZiA9IERlY2ltYWwoJzInKQogICAgICAgICBmb3IgeCwgeSBpbiBbKG4sIG4pLCAobiwgaSksIChpLCBuKSwgKG4sIGYpLCAoZiwgbiksCiAgICAgICAgICAgICAgICAgICAgICAocywgbiksIChuLCBzKSwgKHMsIGkpLCAoaSwgcyksIChzLCBmKSwgKGYsIHMpLCAocywgcyldOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHggIT0geSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHggPT0geSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90ICh4IDwgeSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90ICh4IDw9IHkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoeCA+IHkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoeCA+PSB5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4ICE9IHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICh4ID09IHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoeCA8IHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoeCA8PSB5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHggPiB5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHggPj0geSkpCiAKICMgVGhlIGZvbGxvd2luZyBhcmUgdHdvIGZ1bmN0aW9ucyB1c2VkIHRvIHRlc3QgdGhyZWFkaW5nIGluIHRoZSBuZXh0IGNsYXNzCiAKQEAgLTExMzksMjIgKzExMzksMjIgQEAKICAgICAgICAgZGMgPSBEZWNpbWFsKCc0NScpCiAKICAgICAgICAgI3R3byBEZWNpbWFscwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGMgPiBkYSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRjID49IGRhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPCBkYykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhIDw9IGRjKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPT0gZGIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYSAhPSBkYykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhIDw9IGRiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPj0gZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYyA+IGRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGMgPj0gZGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYSA8IGRjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGEgPD0gZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYSA9PSBkYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhICE9IGRjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGEgPD0gZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYSA+PSBkYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGMsZGEpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYSxkYyksIC0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYSxkYiksIDApCiAKICAgICAgICAgI2EgRGVjaW1hbCBhbmQgYW4gaW50Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYyA+IDIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMjMgPCBkYykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRjID09IDQ1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGMgPiAyMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIzIDwgZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYyA9PSA0NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGMsMjMpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCgyMyxkYyksIC0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYyw0NSksIDApCkBAIC0xMjIxLDggKzEyMjEsOCBAQAogICAgICAgICAjdGhlIHNhbWUgaGFzaCB0aGF0IHRvIGFuIGludAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goRGVjaW1hbCgyMykpLCBoYXNoKDIzKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBEZWNpbWFsKCdOYU4nKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2goRGVjaW1hbCgnSW5mJykpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzaChEZWNpbWFsKCctSW5mJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChEZWNpbWFsKCdJbmYnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNoKERlY2ltYWwoJy1JbmYnKSkpCiAKICAgICAgICAgIyBjaGVjayB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUKICAgICAgICAgIyBjdXJyZW50IGNvbnRleHQgKGlzc3VlICMxNzU3KQpAQCAtMTI0OSwyMiArMTI0OSwyMiBAQAogICAgICAgICBsMiA9IDI4CiAKICAgICAgICAgI2JldHdlZW4gRGVjaW1hbHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1pbihkMSxkMikgaXMgZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtaW4oZDIsZDEpIGlzIGQxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWF4KGQxLGQyKSBpcyBkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1heChkMixkMSkgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtaW4oZDEsZDIpIGlzIGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWluKGQyLGQxKSBpcyBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1heChkMSxkMikgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXgoZDIsZDEpIGlzIGQyKQogCiAgICAgICAgICNiZXR3ZWVuIERlY2ltYWwgYW5kIGxvbmcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1pbihkMSxsMikgaXMgZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtaW4obDIsZDEpIGlzIGQxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWF4KGwxLGQyKSBpcyBkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1heChkMixsMSkgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtaW4oZDEsbDIpIGlzIGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWluKGwyLGQxKSBpcyBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1heChsMSxkMikgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXgoZDIsbDEpIGlzIGQyKQogCiAgICAgZGVmIHRlc3RfYXNfbm9uemVybyhzZWxmKToKICAgICAgICAgI2FzIGZhbHNlCi0gICAgICAgIHNlbGYuZmFpbElmKERlY2ltYWwoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRGVjaW1hbCgwKSkKICAgICAgICAgI2FzIHRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKERlY2ltYWwoJzAuMzcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKCcwLjM3MicpKQogCiAgICAgZGVmIHRlc3RfdG9zdHJpbmdfbWV0aG9kcyhzZWxmKToKICAgICAgICAgI1Rlc3Qgc3RyIGFuZCByZXByIG1ldGhvZHMuCkBAIC0xNDU5LDEwICsxNDU5LDEwIEBACiBjbGFzcyBEZWNpbWFsUHl0aG9uQVBJdGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYWJjKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLk51bWJlcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLlJlYWwpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLk51bWJlcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLlJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLk51bWJlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLlJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLk51bWJlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLlJlYWwpKQogCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgogICAgICAgICBkID0gRGVjaW1hbCgnLTMuMTQxNTkwMDAwJykKQEAgLTE1MDEsOSArMTUwMSw5IEBACiAgICAgICAgICAgICAgICAgJzAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNScpCiAgICAgICAgIGJpZ2ludCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTXlEZWNpbWFsLmZyb21fZmxvYXQoYmlnaW50KSwgTXlEZWNpbWFsKGJpZ2ludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhNeURlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnbmFuJykpLmlzX3FuYW4oKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkuaXNfaW5maW5pdGUoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCctaW5mJykpLmlzX2luZmluaXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShNeURlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnbmFuJykpLmlzX3FuYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkuaXNfaW5maW5pdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCctaW5mJykpLmlzX2luZmluaXRlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCduYW4nKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCdOYU4nKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkpLApAQCAtMTU1MCw4ICsxNTUwLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjEsIHYyKQogCiAgICAgZGVmIHRlc3RfZXF1YWxpdHlfd2l0aF9vdGhlcl90eXBlcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKERlY2ltYWwoMTApIGluIFsnYScsIDEuMCwgRGVjaW1hbCgxMCksICgxLDIpLCB7fV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhEZWNpbWFsKDEwKSBub3QgaW4gWydhJywgMS4wLCAoMSwyKSwge31dKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbCgxMCkgaW4gWydhJywgMS4wLCBEZWNpbWFsKDEwKSwgKDEsMiksIHt9XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKERlY2ltYWwoMTApIG5vdCBpbiBbJ2EnLCAxLjAsICgxLDIpLCB7fV0pCiAKICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgogICAgICAgICAjIEFsbCBjb3BpZXMgc2hvdWxkIGJlIGRlZXAKQEAgLTE1NzEsOSArMTU3MSw5IEBACiAgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KCkgYXMgZW50ZXJfY3R4OgogICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQogICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhvcmlnX2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcmlnX2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKIAogICAgIGRlZiB0ZXN0X2xvY2FsY29udGV4dGFyZyhzZWxmKToKICAgICAgICAgIyBVc2UgYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBjb250ZXh0IGluIHRoZSBibG9jawpAQCAtMTU4MiwxMCArMTU4MiwxMCBAQAogICAgICAgICB3aXRoIGxvY2FsY29udGV4dChuZXdfY3R4KSBhcyBlbnRlcl9jdHg6CiAgICAgICAgICAgICBzZXRfY3R4ID0gZ2V0Y29udGV4dCgpCiAgICAgICAgIGZpbmFsX2N0eCA9IGdldGNvbnRleHQoKQotICAgICAgICBzZWxmLmFzc2VydF8ob3JpZ19jdHggaXMgZmluYWxfY3R4LCAnZGlkIG5vdCByZXN0b3JlIGNvbnRleHQgY29ycmVjdGx5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldF9jdHgucHJlYyA9PSBuZXdfY3R4LnByZWMsICdkaWQgbm90IHNldCBjb3JyZWN0IGNvbnRleHQnKQotICAgICAgICBzZWxmLmFzc2VydF8obmV3X2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXRfY3R4LnByZWMgPT0gbmV3X2N0eC5wcmVjLCAnZGlkIG5vdCBzZXQgY29ycmVjdCBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5ld19jdHggaXMgbm90IHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0X2N0eCBpcyBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCiAKIGNsYXNzIENvbnRleHRGbGFncyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZmxhZ3NfaXJyZWxldmFudChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CmluZGV4IDU5MzVlMDUuLjcxZDY5YzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQpAQCAtMjQsMjEgKzI0LDIxIEBACiAgICAgICAgIGQxWzEzXQogICAgICAgICBkMVsxNF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgezEyOiBbNDIsIDI0XSwgMTM6IFtdLCAxNDogW119KQotICAgICAgICBzZWxmLmFzc2VydF8oZDFbMTJdIGlzIG5vdCBkMVsxM10gaXMgbm90IGQxWzE0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWzEyXSBpcyBub3QgZDFbMTNdIGlzIG5vdCBkMVsxNF0pCiAgICAgICAgIGQyID0gZGVmYXVsdGRpY3QobGlzdCwgZm9vPTEsIGJhcj0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgeyJmb28iOiAxLCAiYmFyIjogMn0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDJbImZvbyJdLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyWyJiYXIiXSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMls0Ml0sIFtdKQotICAgICAgICBzZWxmLmFzc2VydF8oImZvbyIgaW4gZDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vIiBpbiBkMi5rZXlzKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiYmFyIiBpbiBkMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJiYXIiIGluIGQyLmtleXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDQyIGluIGQyKQotICAgICAgICBzZWxmLmFzc2VydF8oNDIgaW4gZDIua2V5cygpKQotICAgICAgICBzZWxmLmFzc2VydF8oMTIgbm90IGluIGQyKQotICAgICAgICBzZWxmLmFzc2VydF8oMTIgbm90IGluIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmb28iIGluIGQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbyIgaW4gZDIua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImJhciIgaW4gZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiYmFyIiBpbiBkMi5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSg0MiBpbiBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDQyIGluIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEyIG5vdCBpbiBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEyIG5vdCBpbiBkMi5rZXlzKCkpCiAgICAgICAgIGQyLmRlZmF1bHRfZmFjdG9yeSA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIE5vbmUpCiAgICAgICAgIHRyeToKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQyKSwgImRlZmF1bHRkaWN0KDx0eXBlICdpbnQnPiwgezEyOiA0Mn0pIikKICAgICAgICAgZGVmIGZvbygpOiByZXR1cm4gNDMKICAgICAgICAgZDMgPSBkZWZhdWx0ZGljdChmb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkMy5kZWZhdWx0X2ZhY3RvcnkgaXMgZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDMuZGVmYXVsdF9mYWN0b3J5IGlzIGZvbykKICAgICAgICAgZDNbMTNdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkMyksICJkZWZhdWx0ZGljdCglcywgezEzOiA0M30pIiAlIHJlcHIoZm9vKSkKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgIGQyID0gY29weS5kZWVwY29weShkMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGZvb2JhcikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkMVsxXSBpcyBub3QgZDJbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMVsxXSBpcyBub3QgZDJbMV0pCiAgICAgICAgIGQxLmRlZmF1bHRfZmFjdG9yeSA9IGxpc3QKICAgICAgICAgZDIgPSBjb3B5LmRlZXBjb3B5KGQxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICAgICAgZGVmIF9mYWN0b3J5KHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICBkID0gc3ViKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcHIoZCkuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZCkuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICJkZWZhdWx0ZGljdCg8Ym91bmQgbWV0aG9kIHN1Yi5fZmFjdG9yeSBvZiBkZWZhdWx0ZGljdCguLi4iKSkKIAogICAgICAgICAjIE5PVEU6IHByaW50aW5nIGEgc3ViY2xhc3Mgb2YgYSBidWlsdGluIHR5cGUgZG9lcyBub3QgY2FsbCBpdHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkgYi9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CmluZGV4IGE2OGQwMTQuLjg2ODEwZjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQpAQCAtMTg4LDkgKzE4OCw5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbi1pKQogICAgICAgICAgICAgaiA9IHJhbmRvbS5yYW5kcmFuZ2UoLWxlbihkKSwgbGVuKGQpKQogICAgICAgICAgICAgdmFsID0gZFtqXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZhbCBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbCBpbiBkKQogICAgICAgICAgICAgZGVsIGRbal0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWwgbm90IGluIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsIG5vdCBpbiBkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKIAogICAgIGRlZiB0ZXN0X3JvdGF0ZShzZWxmKToKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGQucmVtb3ZlLCAnYycpCiAgICAgICAgIGZvciB4LCB5IGluIHppcChkLCBlKToKICAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgb3JpZ2luYWwgb3JkZXIgYW5kIHZhbHVlcyBhcmUgcmV0YWluZWQuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeSkKIAogICAgICAgICAjIEhhbmRsZSBldmlsIG11dGF0b3IKICAgICAgICAgZm9yIG1hdGNoIGluIChUcnVlLCBGYWxzZSk6CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICAgICAgZSA9IGV2YWwocmVwcihkKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogICAgICAgICBkLmFwcGVuZChkKQotICAgICAgICBzZWxmLmFzc2VydF8oJy4uLicgaW4gcmVwcihkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcuLi4nIGluIHJlcHIoZCkpCiAKICAgICBkZWYgdGVzdF9wcmludChzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKHhyYW5nZSgyMDApKQpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICAgICAgICBvYmoueCA9IGl0ZXIoY29udGFpbmVyKQogICAgICAgICAgICAgZGVsIG9iaiwgY29udGFpbmVyCiAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsICJDeWNsZSB3YXMgbm90IGNvbGxlY3RlZCIpCiAKIGNsYXNzIFRlc3RWYXJpb3VzSXRlcmF0b3JBcmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggZjE2MDI4Ni4uNmRjMjdiZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC00MDksMTIgKzQwOSwxMiBAQAogCiAgICAgZGVmIHRlc3RfcHl0aG9uX2RpY3RzKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgUHl0aG9uIHN1YmNsYXNzIG9mIGRpY3QuLi4KLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3MoZGljdCwgZGljdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHt9LCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZGljdCwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHt9LCBkaWN0KSkKICAgICAgICAgZCA9IGRpY3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHt9KQotICAgICAgICBzZWxmLmFzc2VydF8oZC5fX2NsYXNzX18gaXMgZGljdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZCwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLl9fY2xhc3NfXyBpcyBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLCBkaWN0KSkKICAgICAgICAgY2xhc3MgQyhkaWN0KToKICAgICAgICAgICAgIHN0YXRlID0gLTEKICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmX2xvY2FsLCAqYSwgKiprdyk6CkBAIC00MjcsMTMgKzQyNywxMyBAQAogICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KGtleSwgMCkKICAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmX2xvY2FsLCBrZXksIHZhbHVlKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShrZXksIHR5cGUoMCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGtleSwgdHlwZSgwKSkpCiAgICAgICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmX2xvY2FsLCBrZXksIHZhbHVlKQogICAgICAgICAgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUKICAgICAgICAgICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhDLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgZGljdCkpCiAgICAgICAgIGExID0gQygxMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMS5zdGF0ZSwgMTIpCiAgICAgICAgIGEyID0gQyhmb289MSwgYmFyPTIpCkBAIC01MjcsNyArNTI3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gNDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm5hbWUsICdDJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmJhc2VzLCAoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdzcGFtJyBpbiBDLmRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc3BhbScgaW4gQy5kaWN0KQogICAgICAgICBjID0gQygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zcGFtKCksIDQyKQogCkBAIC01OTQsNyArNTk0LDcgQEAKICAgICAgICAgICAgIGRlZiBfc2V0X3goc2VsZiwgeCk6CiAgICAgICAgICAgICAgICAgc2VsZi5fX3ggPSAteAogICAgICAgICBhID0gQSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihhLCAieCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYSwgIngiKSkKICAgICAgICAgYS54ID0gMTIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDEyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX0FfX3gsIC0xMikKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgICAgICAgIGNsYXNzIEQob2JqZWN0KToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiX19kaWN0X18iXQogICAgICAgICBhID0gRCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQogICAgICAgICBhLmZvbyA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCkBAIC0xMTc5LDcgKzExNzksNyBAQAogICAgICAgICBjbGFzcyBXKG9iamVjdCk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fd2Vha3JlZl9fIl0KICAgICAgICAgYSA9IFcoKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYS5mb28gPSA0MgpAQCAtMTE5MSwxNiArMTE5MSwxNiBAQAogICAgICAgICBjbGFzcyBDMShXLCBEKToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgICAgIGEgPSBDMSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQogICAgICAgICBhLmZvbyA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCiAKICAgICAgICAgY2xhc3MgQzIoRCwgVyk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQogICAgICAgICBhID0gQzIoKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihhLCAiX19kaWN0X18iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKICAgICAgICAgYS5mb28gPSA0MgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19kaWN0X18sIHsiZm9vIjogNDJ9KQogCkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogICAgICAgICBNeUFCQy5yZWdpc3RlcihVbnJlbGF0ZWQpCiAKICAgICAgICAgdSA9IFVucmVsYXRlZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHUsIE15QUJDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodSwgTXlBQkMpKQogCiAgICAgICAgICMgVGhpcyB1c2VkIHRvIGNyYXNoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTXlBQkMuYS5fX3NldF9fLCB1LCAzKQpAQCAtMTQ3Myw3ICsxNDczLDcgQEAKICAgICAgICAgY2xhc3MgRTogIyAqbm90KiBzdWJjbGFzc2luZyBmcm9tIEMKICAgICAgICAgICAgIGZvbyA9IEMuZm9vCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpLmZvbywgQy5mb28pICMgaS5lLiwgdW5ib3VuZAotICAgICAgICBzZWxmLmFzc2VydF8ocmVwcihDLmZvby5fX2dldF9fKEMoKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKEMuZm9vLl9fZ2V0X18oQygpKSkuc3RhcnRzd2l0aCgiPGJvdW5kIG1ldGhvZCAiKSkKIAogICAgIGRlZiB0ZXN0X2NvbXBhdHRyKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgY29tcHV0ZWQgYXR0cmlidXRlcy4uLgpAQCAtMTY2NCw3ICsxNjY0LDcgQEAKICAgICAgICAgY2xhc3MgRShvYmplY3QpOgogICAgICAgICAgICAgZm9vID0gQy5mb28KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFKCkuZm9vLCBDLmZvbykgIyBpLmUuLCB1bmJvdW5kCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXByKEMuZm9vLl9fZ2V0X18oQygxKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKEMuZm9vLl9fZ2V0X18oQygxKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCiAKICAgICBkZWYgdGVzdF9zcGVjaWFsX21ldGhvZF9sb29rdXAoc2VsZik6CiAgICAgICAgICMgVGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgYnlwYXNzZXMgX19nZXRhdHRyX18gYW5kCkBAIC0xNzc2LDIyICsxNzc2LDIyIEBACiAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgogICAgICAgICBjMSA9IEMoKQogICAgICAgICBjMiA9IEMoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG5vdCBjMSkgIyBXaGF0PworICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBjMSkgIyBXaGF0PwogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMxKSwgaWQoYzIpKQogICAgICAgICBoYXNoKGMxKQogICAgICAgICBoYXNoKGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChjMSwgYzIpLCBjbXAoaWQoYzEpLCBpZChjMikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLCBjMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGMxICE9IGMyKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGMxICE9IGMxKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGMxID09IGMyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYzEgIT0gYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYzEgIT0gYzEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYzEgPT0gYzIpCiAgICAgICAgICMgTm90ZSB0aGF0IHRoZSBtb2R1bGUgbmFtZSBhcHBlYXJzIGluIHN0ci9yZXByLCBhbmQgdGhhdCB2YXJpZXMKICAgICAgICAgIyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIHRlc3QgaXMgcnVuIHN0YW5kYWxvbmUgb3IgZnJvbSBhIGZyYW1ld29yay4KLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihjMSkuZmluZCgnQyBvYmplY3QgYXQgJykgPj0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihjMSkuZmluZCgnQyBvYmplY3QgYXQgJykgPj0gMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYzEpLCByZXByKGMxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0xIG5vdCBpbiBjMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0xIG5vdCBpbiBjMSkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gYzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiBjMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgxMCBpbiBjMSkKICAgICAgICAgIyBUZXN0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBkeW5hbWljIGNsYXNzZXMKICAgICAgICAgY2xhc3MgRChvYmplY3QpOgpAQCAtMTgwMCwyMiArMTgwMCwyMiBAQAogICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKICAgICAgICAgZDEgPSBEKCkKICAgICAgICAgZDIgPSBEKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBub3QgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IGQxKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQxKSwgaWQoZDIpKQogICAgICAgICBoYXNoKGQxKQogICAgICAgICBoYXNoKGQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkMSwgZDIpLCBjbXAoaWQoZDEpLCBpZChkMikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBkMSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkMSwgZDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZDEgIT0gZDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZDEgPT0gZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZDEgIT0gZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZDEgPT0gZDIpCiAgICAgICAgICMgTm90ZSB0aGF0IHRoZSBtb2R1bGUgbmFtZSBhcHBlYXJzIGluIHN0ci9yZXByLCBhbmQgdGhhdCB2YXJpZXMKICAgICAgICAgIyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIHRlc3QgaXMgcnVuIHN0YW5kYWxvbmUgb3IgZnJvbSBhIGZyYW1ld29yay4KLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihkMSkuZmluZCgnRCBvYmplY3QgYXQgJykgPj0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihkMSkuZmluZCgnRCBvYmplY3QgYXQgJykgPj0gMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZDEpLCByZXByKGQxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0xIG5vdCBpbiBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0xIG5vdCBpbiBkMSkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiBkMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgxMCBpbiBkMSkKICAgICAgICAgIyBUZXN0IG92ZXJyaWRkZW4gYmVoYXZpb3IgZm9yIHN0YXRpYyBjbGFzc2VzCiAgICAgICAgIGNsYXNzIFByb3h5KG9iamVjdCk6CkBAIC0xODQxLDExICsxODQxLDExIEBACiAgICAgICAgIHAxID0gUHJveHkoMSkKICAgICAgICAgcF8xID0gUHJveHkoLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocDApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgbm90IHAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBwMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHAwKSwgaGFzaCgwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMCwgcDApCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocDAsIHAxKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHAwICE9IHAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHAwICE9IHAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vdCBwMCwgcDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAwLCBwMSksIC0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChwMCwgcDApLCAwKQpAQCAtMTg1NSw3ICsxODU1LDcgQEAKICAgICAgICAgcDEwID0gUHJveHkocmFuZ2UoMTApKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKC0xIGluIHAxMCkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gcDEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gcDEwKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDEwIGluIHAxMCkKICAgICAgICAgIyBUZXN0IG92ZXJyaWRkZW4gYmVoYXZpb3IgZm9yIGR5bmFtaWMgY2xhc3NlcwogICAgICAgICBjbGFzcyBEUHJveHkob2JqZWN0KToKQEAgLTE4ODEsNyArMTg4MSw3IEBACiAgICAgICAgIHAxID0gRFByb3h5KDEpCiAgICAgICAgIHBfMSA9IERQcm94eSgtMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBub3QgcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IHAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocDApLCBoYXNoKDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAwLCBwMCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwMCwgcDEpCkBAIC0xODk1LDcgKzE4OTUsNyBAQAogICAgICAgICBwMTAgPSBEUHJveHkocmFuZ2UoMTApKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKC0xIGluIHAxMCkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gcDEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gcDEwKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDEwIGluIHAxMCkKIAogICAgICAgICAjIFNhZmV0eSB0ZXN0IGZvciBfX2NtcF9fCkBAIC0xOTc1LDcgKzE5NzUsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3ZWFrcmVmLnJlZihubykKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihtc2cpLmZpbmQoIndlYWsgcmVmZXJlbmNlIikgPj0gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIobXNnKS5maW5kKCJ3ZWFrIHJlZmVyZW5jZSIpID49IDApCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIndlYWtyZWYucmVmKG5vKSBzaG91bGQgYmUgaWxsZWdhbCIpCiAgICAgICAgIGNsYXNzIFdlYWsob2JqZWN0KToKQEAgLTIwMTIsMTggKzIwMTIsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJ4IikpCiAKICAgICAgICAgcmF3ID0gQy5fX2RpY3RfX1sneCddCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJhdywgcHJvcGVydHkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyYXcsIHByb3BlcnR5KSkKIAogICAgICAgICBhdHRycyA9IGRpcihyYXcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiX19kb2NfXyIgaW4gYXR0cnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZmdldCIgaW4gYXR0cnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZnNldCIgaW4gYXR0cnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZmRlbCIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19kb2NfXyIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZmdldCIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZnNldCIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZmRlbCIgaW4gYXR0cnMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuX19kb2NfXywgIkknbSB0aGUgeCBwcm9wZXJ0eS4iKQotICAgICAgICBzZWxmLmFzc2VydF8ocmF3LmZnZXQgaXMgQy5fX2RpY3RfX1snZ2V0eCddKQotICAgICAgICBzZWxmLmFzc2VydF8ocmF3LmZzZXQgaXMgQy5fX2RpY3RfX1snc2V0eCddKQotICAgICAgICBzZWxmLmFzc2VydF8ocmF3LmZkZWwgaXMgQy5fX2RpY3RfX1snZGVseCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZnZXQgaXMgQy5fX2RpY3RfX1snZ2V0eCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZzZXQgaXMgQy5fX2RpY3RfX1snc2V0eCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZkZWwgaXMgQy5fX2RpY3RfX1snZGVseCddKQogCiAgICAgICAgIGZvciBhdHRyIGluICJfX2RvY19fIiwgImZnZXQiLCAiZnNldCIsICJmZGVsIjoKICAgICAgICAgICAgIHRyeToKQEAgLTIwODUsNyArMjA4NSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5mb28uX19kb2NfXywgImhlbGxvIikKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGMsICJmb28iKSkKICAgICAgICAgYy5mb28gPSAtNDIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoYywgJ19mb28nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYywgJ19mb28nKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9mb28sIDQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm9vLCA0MikKICAgICAgICAgZGVsIGMuZm9vCkBAIC0yMjM2LDcgKzIyMzYsNyBAQAogCiAgICAgICAgIGNzdHVmZiA9IFsnQ2RhdGEnLCAnQ21ldGhvZCcsICdfX2RvY19fJywgJ19fbW9kdWxlX18nXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihDKSwgY3N0dWZmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihDLkNtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihDLkNtZXRob2QpKQogCiAgICAgICAgIGMgPSBDKCkgICMgYy5fX2RvY19fIGlzIGFuIG9kZCB0aGluZyB0byBzZWUgaGVyZTsgZGl0dG8gYy5fX21vZHVsZV9fLgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihjKSwgY3N0dWZmKQpAQCAtMjI0NCw3ICsyMjQ0LDcgQEAKICAgICAgICAgYy5jZGF0YSA9IDIKICAgICAgICAgYy5jbWV0aG9kID0gbGFtYmRhIHNlbGY6IDAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoYyksIGNzdHVmZiArIFsnY2RhdGEnLCAnY21ldGhvZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQogCiAgICAgICAgIGNsYXNzIEEoQyk6CiAgICAgICAgICAgICBBZGF0YSA9IDEKQEAgLTIyNTIsMTAgKzIyNTIsMTAgQEAKIAogICAgICAgICBhc3R1ZmYgPSBbJ0FkYXRhJywgJ0FtZXRob2QnXSArIGNzdHVmZgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihBKSwgYXN0dWZmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihBLkFtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihBLkFtZXRob2QpKQogICAgICAgICBhID0gQSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKGEpLCBhc3R1ZmYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCiAgICAgICAgIGEuYWRhdGEgPSA0MgogICAgICAgICBhLmFtZXRob2QgPSBsYW1iZGEgc2VsZjogMwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihhKSwgYXN0dWZmICsgWydhZGF0YScsICdhbWV0aG9kJ10pCkBAIC0yMjc0LDEyICsyMjc0LDEyIEBACiAKICAgICAgICAgYyA9IEMoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihjKSksIGNzdHVmZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdpbV9zZWxmJyBpbiBkaXIoQy5DbWV0aG9kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdpbV9zZWxmJyBpbiBkaXIoQy5DbWV0aG9kKSkKIAogICAgICAgICBjLmNkYXRhID0gMgogICAgICAgICBjLmNtZXRob2QgPSBsYW1iZGEgc2VsZjogMAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihjKSksIGNzdHVmZiArIFsnY2RhdGEnLCAnY21ldGhvZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQogCiAgICAgICAgIGNsYXNzIEEoQyk6CiAgICAgICAgICAgICBBZGF0YSA9IDEKQEAgLTIyODcsMTMgKzIyODcsMTMgQEAKIAogICAgICAgICBhc3R1ZmYgPSBbJ0FkYXRhJywgJ0FtZXRob2QnXSArIGNzdHVmZgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihBKSksIGFzdHVmZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdpbV9zZWxmJyBpbiBkaXIoQS5BbWV0aG9kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdpbV9zZWxmJyBpbiBkaXIoQS5BbWV0aG9kKSkKICAgICAgICAgYSA9IEEoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihhKSksIGFzdHVmZikKICAgICAgICAgYS5hZGF0YSA9IDQyCiAgICAgICAgIGEuYW1ldGhvZCA9IGxhbWJkYSBzZWxmOiAzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJlc3RpbmcoZGlyKGEpKSwgYXN0dWZmICsgWydhZGF0YScsICdhbWV0aG9kJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCiAKICAgICAgICAgIyBUcnkgYSBtb2R1bGUgc3ViY2xhc3MuCiAgICAgICAgIGltcG9ydCBzeXMKQEAgLTI0NzcsMTMgKzI0NzcsMTMgQEAKICAgICAgICAgYSA9IGhleGludCgxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCAxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoYSksIDEyMzQ1KQotICAgICAgICBzZWxmLmFzc2VydF8oaW50KGEpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoYSkuX19jbGFzc19fIGlzIGludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgrYSkuX19jbGFzc19fIGlzIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID4+IDApLl9fY2xhc3NfXyBpcyBpbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8PCAwKS5fX2NsYXNzX18gaXMgaW50KQotICAgICAgICBzZWxmLmFzc2VydF8oKGhleGludCgwKSA8PCAxMikuX19jbGFzc19fIGlzIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChoZXhpbnQoMCkgPj4gMTIpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PiAwKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPDwgMCkuX19jbGFzc19fIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChoZXhpbnQoMCkgPDwgMTIpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoaGV4aW50KDApID4+IDEyKS5fX2NsYXNzX18gaXMgaW50KQogCiAgICAgICAgIGNsYXNzIG9jdGxvbmcobG9uZyk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQpAQCAtMjUwMywzNiArMjUwMywzNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIDEyMzQ1TCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGEpLCAxMjM0NUwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhKSwgaGFzaCgxMjM0NUwpKQotICAgICAgICBzZWxmLmFzc2VydF8obG9uZyhhKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgrYSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoLWEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKC1vY3Rsb25nKDApKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID4+IDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPDwgMCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAtIDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKiAxKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICoqIDEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgLy8gMSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoMSAqIGEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgfCAwKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIF4gMCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAmIC0xTCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygob2N0bG9uZygwKSA8PCAxMikuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygob2N0bG9uZygwKSA+PiAxMikuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhYnMob2N0bG9uZygwKSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb25nKGEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCthKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgtYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoLW9jdGxvbmcoMCkpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj4gMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PCAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIC0gMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiogMSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAvLyAxKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgxICogYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSB8IDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgXiAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICYgLTFMKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChvY3Rsb25nKDApIDw8IDEyKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChvY3Rsb25nKDApID4+IDEyKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhvY3Rsb25nKDApKS5fX2NsYXNzX18gaXMgbG9uZykKIAogICAgICAgICAjIEJlY2F1c2Ugb2N0bG9uZyBvdmVycmlkZXMgX19hZGRfXywgd2UgY2FuJ3QgY2hlY2sgdGhlIGFic2VuY2Ugb2YgKzAKICAgICAgICAgIyBvcHRpbWl6YXRpb25zIHVzaW5nIG9jdGxvbmcuCiAgICAgICAgIGNsYXNzIGxvbmdjbG9uZShsb25nKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IGxvbmdjbG9uZSgxKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKyAwKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgwICsgYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSArIDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAgKyBhKS5fX2NsYXNzX18gaXMgbG9uZykKIAogICAgICAgICAjIENoZWNrIHRoYXQgbmVnYXRpdmUgY2xvbmVzIGRvbid0IHNlZ2ZhdWx0CiAgICAgICAgIGEgPSBsb25nY2xvbmUoLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywge30pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhhKSwgLTEpICAjIHNlbGYuYXNzZXJ0XyBQeU51bWJlcl9Mb25nKCkgY29waWVzIHRoZSBzaWduIGJpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoYSksIC0xKSAgIyBzZWxmLmFzc2VydFRydWUgUHlOdW1iZXJfTG9uZygpIGNvcGllcyB0aGUgc2lnbiBiaXQKIAogICAgICAgICBjbGFzcyBwcmVjZmxvYXQoZmxvYXQpOgogICAgICAgICAgICAgX19zbG90c19fID0gWydwcmVjJ10KQEAgLTI1NDQsOSArMjU0NCw5IEBACiAgICAgICAgIGEgPSBwcmVjZmxvYXQoMTIzNDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgMTIzNDUuMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChhKSwgMTIzNDUuMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZsb2F0KGEpLl9fY2xhc3NfXyBpcyBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsb2F0KGEpLl9fY2xhc3NfXyBpcyBmbG9hdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1LjApKQotICAgICAgICBzZWxmLmFzc2VydF8oKCthKS5fX2NsYXNzX18gaXMgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBmbG9hdCkKIAogICAgICAgICBjbGFzcyBtYWRjb21wbGV4KGNvbXBsZXgpOgogICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtMjU5NCwyMCArMjU5NCwyMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCB0KQogICAgICAgICBhID0gbWFkdHVwbGUoKDEsMiwzLDQsNSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgxLDIsMyw0LDUpKQotICAgICAgICBzZWxmLmFzc2VydF8odHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goKDEsMiwzLDQsNSkpKQotICAgICAgICBzZWxmLmFzc2VydF8oYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICogMCkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKyAoKSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMCkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKyAoKSkuX19jbGFzc19fIGlzIHR1cGxlKQogICAgICAgICBhID0gbWFkdHVwbGUoKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgpKQotICAgICAgICBzZWxmLmFzc2VydF8odHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKyBhKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAqIDApLl9fY2xhc3NfXyBpcyB0dXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICogMSkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKiAyKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhWzpdLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR1cGxlKGEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICsgYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAwKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMikuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCiAKICAgICAgICAgY2xhc3MgbWFkc3RyaW5nKHN0cik6CiAgICAgICAgICAgICBfcmV2ID0gTm9uZQpAQCAtMjYyOSw1MSArMjYyOSw1MSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzKQogICAgICAgICBzID0gbWFkc3RyaW5nKCIxMjM0NSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHMpLCAiMTIzNDUiKQotICAgICAgICBzZWxmLmFzc2VydF8oc3RyKHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIocykuX19jbGFzc19fIGlzIHN0cikKIAogICAgICAgICBiYXNlID0gIlx4MDAiICogNQogICAgICAgICBzID0gbWFkc3RyaW5nKGJhc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgYmFzZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocyksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHIocykuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihzKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocyksIGhhc2goYmFzZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3M6IDF9W2Jhc2VdLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHtiYXNlOiAxfVtzXSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChzICsgIiIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyArICIiKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMgKyAiIiwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgiIiArIHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoIiIgKyBzKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIiICsgcywgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChzICogMCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChzICogMCkuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICogMCwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygocyAqIDEpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDEpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDEsIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygocyAqIDIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDIpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDIsIGJhc2UgKyBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8oc1s6XS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc1s6XS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbOl0sIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzWzA6MF0uX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNbMDowXS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMDowXSwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMubHN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMubHN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxzdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5yc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5yc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucnN0cmlwKCksIGJhc2UpCiAgICAgICAgIGlkZW50aXR5dGFiID0gJycuam9pbihbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildKQotICAgICAgICBzZWxmLmFzc2VydF8ocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnRyYW5zbGF0ZShpZGVudGl0eXRhYikuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIngiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJ4IikuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIngiKSwgYmFzZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIlx4MDAiKSwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnJlcGxhY2UoIngiLCAieCIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJlcGxhY2UoIngiLCAieCIpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZXBsYWNlKCJ4IiwgIngiKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMubGp1c3QobGVuKHMpKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sanVzdChsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sanVzdChsZW4ocykpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5yanVzdChsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJqdXN0KGxlbihzKSkuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJqdXN0KGxlbihzKSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLmNlbnRlcihsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmNlbnRlcihsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jZW50ZXIobGVuKHMpKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMubG93ZXIoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sb3dlcigpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sb3dlcigpLCBiYXNlKQogCiAgICAgICAgIGNsYXNzIG1hZHVuaWNvZGUodW5pY29kZSk6CkBAIC0yNjkyLDQ3ICsyNjkyLDQ3IEBACiAgICAgICAgIGJhc2UgPSB1IjEyMzQ1IgogICAgICAgICB1ID0gbWFkdW5pY29kZShiYXNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUodSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlKHUpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSh1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHUpLCBoYXNoKGJhc2UpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt1OiAxfVtiYXNlXSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7YmFzZTogMX1bdV0sIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5zdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5sc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUubHN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sc3RyaXAoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUucnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJzdHJpcCgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucnN0cmlwKCksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LnJlcGxhY2UodSJ4IiwgdSJ4IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJlcGxhY2UodSJ4IiwgdSJ4IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yZXBsYWNlKHUieCIsIHUieCIpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5yZXBsYWNlKHUieHkiLCB1Inh5IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJlcGxhY2UodSJ4eSIsIHUieHkiKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJlcGxhY2UodSJ4eSIsIHUieHkiKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUuY2VudGVyKGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmNlbnRlcihsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuY2VudGVyKGxlbih1KSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LmxqdXN0KGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmxqdXN0KGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sanVzdChsZW4odSkpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5yanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmp1c3QobGVuKHUpKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUubG93ZXIoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUubG93ZXIoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Lmxvd2VyKCksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LnVwcGVyKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnVwcGVyKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS51cHBlcigpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5jYXBpdGFsaXplKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmNhcGl0YWxpemUoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmNhcGl0YWxpemUoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUudGl0bGUoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUudGl0bGUoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnRpdGxlKCksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygodSArIHUiIikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSArIHUiIikuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSArIHUiIiwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCh1IiIgKyB1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1IiIgKyB1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiIgKyB1LCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKHUgKiAwKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICogMCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSAqIDAsIHUiIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCh1ICogMSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDEpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAxLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKHUgKiAyKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICogMikuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSAqIDIsIGJhc2UgKyBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odVs6XS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVbOl0uX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVs6XSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVbMDowXS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVbMDowXS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzA6MF0sIHUiIikKIAogICAgICAgICBjbGFzcyBzdWJsaXN0KGxpc3QpOgpAQCAtMjg1MSw3ICsyODUxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2Npc3RyKCdvbmUnKV0sIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtjaXN0cigndFdvJyldLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbY2lzdHIoJ1RIckVFJyldLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8oY2lzdHIoJ09OZScpIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaXN0cignT05lJykgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChjaXN0cigndGhyRUUnKSksIDMpCiAKICAgICBkZWYgdGVzdF9jbGFzc2ljX2NvbXBhcmlzb25zKHNlbGYpOgpAQCAtMjg3OCwxMiArMjg3OCwxMiBAQAogICAgICAgICAgICAgYyA9IHsxOiBjMSwgMjogYzIsIDM6IGMzfQogICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQogICAgICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbXAoY1t4XSwgeSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbXAoeCwgY1t5XSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoY1t4XSwgeSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoeCwgY1t5XSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCiAKICAgICBkZWYgdGVzdF9yaWNoX2NvbXBhcmlzb25zKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgcmljaCBjb21wYXJpc29ucy4uLgpAQCAtMjk1NiwxMSArMjk1NiwxMSBAQAogICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgogICAgICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyB5IiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgeSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgieCAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoInggJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCiAKICAgICBkZWYgdGVzdF9jb2VyY2lvbnMoc2VsZik6CkBAIC0zMDI2LDkgKzMwMjYsOSBAQAogICAgICAgICAgICAgZm9yIGNsczIgaW4gQywgRCwgRSwgRjoKICAgICAgICAgICAgICAgICB4ID0gY2xzKCkKICAgICAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IGNsczIKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oeC5fX2NsYXNzX18gaXMgY2xzMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzMikKICAgICAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IGNscwotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh4Ll9fY2xhc3NfXyBpcyBjbHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguX19jbGFzc19fIGlzIGNscykKICAgICAgICAgZGVmIGNhbnQoeCwgQyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBDCkBAIC0zMDkwLDExICszMDkwLDExIEBACiAgICAgICAgICAgICB4ID0gY2xzKCkKICAgICAgICAgICAgIHguYSA9IDEKICAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzMgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHguX19jbGFzc19fIGlzIGNsczIsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzMiwKICAgICAgICAgICAgICAgICAgICAiYXNzaWduaW5nICVyIGFzIF9fY2xhc3NfXyBmb3IgJXIgc2lsZW50bHkgZmFpbGVkIiAlIChjbHMyLCB4KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQogICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh4Ll9fY2xhc3NfXyBpcyBjbHMsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzLAogICAgICAgICAgICAgICAgICAgICJhc3NpZ25pbmcgJXIgYXMgX19jbGFzc19fIGZvciAlciBzaWxlbnRseSBmYWlsZWQiICUgKGNscywgeCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMSkKICAgICAgICAgZm9yIGNscyBpbiBHLCBKLCBLLCBMLCBNLCBOLCBQLCBSLCBsaXN0LCBJbnQ6CkBAIC0zMjY0LDcgKzMyNjQsNyBAQAogICAgICAgICAgICAgICAgIGZvciBjbHMgaW4gQywgQzEsIEMyOgogICAgICAgICAgICAgICAgICAgICBzID0gcC5kdW1wcyhjbHMsIGJpbikKICAgICAgICAgICAgICAgICAgICAgY2xzMiA9IHAubG9hZHMocykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsczIgaXMgY2xzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzMiBpcyBjbHMpCiAKICAgICAgICAgICAgICAgICBhID0gQzEoMSwgMik7IGEuYXBwZW5kKDQyKTsgYS5hcHBlbmQoMjQpCiAgICAgICAgICAgICAgICAgYiA9IEMyKCJoZWxsbyIsICJ3b3JsZCIsIDQyKQpAQCAtMzI5NCw3ICszMjk0LDcgQEAKICAgICAgICAgaW1wb3J0IGNvcHkKICAgICAgICAgZm9yIGNscyBpbiBDLCBDMSwgQzI6CiAgICAgICAgICAgICBjbHMyID0gY29weS5kZWVwY29weShjbHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY2xzMiBpcyBjbHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzMiBpcyBjbHMpCiAKICAgICAgICAgYSA9IEMxKDEsIDIpOyBhLmFwcGVuZCg0Mik7IGEuYXBwZW5kKDI0KQogICAgICAgICBiID0gQzIoImhlbGxvIiwgIndvcmxkIiwgNDIpCkBAIC0zODY2LDggKzM4NjYsOCBAQAogICAgICAgICAgICAgX19zbG90c19fPSgpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYmFzaWNzaXplX18sIEIuX19iYXNpY3NpemVfXykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoQywgJ19fZGljdF9fJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKEMsICdfX3dlYWtyZWZfXycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihDLCAnX19kaWN0X18nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoQywgJ19fd2Vha3JlZl9fJykpCiAgICAgICAgIEMoKS54ID0gMgogCiAgICAgZGVmIHRlc3Rfcm11bChzZWxmKToKQEAgLTQyMjQsMjkgKzQyMjQsMjkgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IEMoKQogICAgICAgICBwYSA9IFByb3h5KGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGEsIEMpKSAgIyBCYXNlbGluZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwYSwgQykpICMgVGVzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKICAgICAgICAgIyBUZXN0IHdpdGggYSBjbGFzc2ljIHN1YmNsYXNzCiAgICAgICAgIGNsYXNzIEQoQyk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGEgPSBEKCkKICAgICAgICAgcGEgPSBQcm94eShhKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYSwgQykpICAjIEJhc2VsaW5lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHBhLCBDKSkgIyBUZXN0CiAgICAgICAgICMgVGVzdCB3aXRoIGEgbmV3LXN0eWxlIGNsYXNzCiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IEMoKQogICAgICAgICBwYSA9IFByb3h5KGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGEsIEMpKSAgIyBCYXNlbGluZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwYSwgQykpICMgVGVzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKICAgICAgICAgIyBUZXN0IHdpdGggYSBuZXctc3R5bGUgc3ViY2xhc3MKICAgICAgICAgY2xhc3MgRChDKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IEQoKQogICAgICAgICBwYSA9IFByb3h5KGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGEsIEMpKSAgIyBCYXNlbGluZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwYSwgQykpICMgVGVzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKIAogICAgIGRlZiB0ZXN0X3Byb3h5X3N1cGVyKHNlbGYpOgogICAgICAgICAjIFRlc3Rpbmcgc3VwZXIoKSBmb3IgYSBwcm94eSBvYmplY3QuLi4KQEAgLTQzNzMsMTcgKzQzNzMsMTcgQEAKICAgICAgICAgbCA9IFtdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBsLl9fYWRkX18pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBbXS5fX2FkZF9fKQotICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fICE9IFs1XS5fX2FkZF9fKQotICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fICE9IGwuX19tdWxfXykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGwuX19hZGRfXy5fX25hbWVfXyA9PSAnX19hZGRfXycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18gIT0gWzVdLl9fYWRkX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18gIT0gbC5fX211bF9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fbmFtZV9fID09ICdfX2FkZF9fJykKICAgICAgICAgaWYgaGFzYXR0cihsLl9fYWRkX18sICdfX3NlbGZfXycpOgogICAgICAgICAgICAgIyBDUHl0aG9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fLl9fc2VsZl9fIGlzIGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fLl9fb2JqY2xhc3NfXyBpcyBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX3NlbGZfXyBpcyBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX29iamNsYXNzX18gaXMgbGlzdCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aGVyZSBbXS5fX2FkZF9fIGlzIGEgbm9ybWFsIGJvdW5kIG1ldGhvZAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGwuX19hZGRfXy5pbV9zZWxmIGlzIGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fLmltX2NsYXNzIGlzIGxpc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLmltX3NlbGYgaXMgbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18uaW1fY2xhc3MgaXMgbGlzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLl9fYWRkX18uX19kb2NfXywgbGlzdC5fX2FkZF9fLl9fZG9jX18pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGhhc2gobC5fX2FkZF9fKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CmluZGV4IGI3M2E1M2YuLjA3NWY5ZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKQEAgLTksNyArOSw3IEBACiAgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CiAgICAgICAgICMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIGVtcHR5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdCgpLCB7fSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3QoKSBpcyBub3Qge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0KCkgaXMgbm90IHt9KQogCiAgICAgZGVmIHRlc3RfbGl0ZXJhbF9jb25zdHJ1Y3RvcihzZWxmKToKICAgICAgICAgIyBjaGVjayBsaXRlcmFsIGNvbnN0cnVjdG9yIGZvciBkaWZmZXJlbnQgc2l6ZWQgZGljdHMgKHRvIGV4ZXJjaXNlIHRoZSBCVUlMRF9NQVAgb3BhcmcKQEAgLTIzLDE4ICsyMywxOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGRpY3RsaXRlcmFsKSwgZGljdChpdGVtcykpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHt9KQotICAgICAgICBzZWxmLmFzc2VydF8oezE6IDJ9KQotICAgICAgICBzZWxmLmFzc2VydF8oYm9vbCh7fSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhib29sKHsxOiAyfSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHsxOiAyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woe30pIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm9vbCh7MTogMn0pIGlzIFRydWUpCiAKICAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgogICAgICAgICBkID0ge30KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleXMoKSwgW10pCiAgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CiAgICAgICAgIGsgPSBkLmtleXMoKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5oYXNfa2V5KCdhJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmhhc19rZXkoJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KCdiJykpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmtleXMsIE5vbmUpCiAKQEAgLTU3LDcgKzU3LDcgQEAKIAogICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGQuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQuaGFzX2tleSgnYScpKQogICAgICAgICBkID0geydhJzogMSwgJ2InOiAyfQogICAgICAgICBrID0gZC5rZXlzKCkKICAgICAgICAgay5zb3J0KCkKQEAgLTY3LDEyICs2NywxMiBAQAogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydF8obm90ICgnYScgaW4gZCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKCdhJyBpbiBkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gZCkKICAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiBkKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2InIGluIGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYycgbm90IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdiJyBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2MnIG5vdCBpbiBkKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX2NvbnRhaW5zX18pCiAKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgIGRlZiB0ZXN0X2Zyb21rZXlzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydF8obm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygoNCw1KSwwKSwgezQ6MCwgNTowfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKFtdKSwge30pCkBAIC0yMTcsMTQgKzIxNywxNCBAQAogICAgICAgICBjbGFzcyBkaWN0bGlrZShkaWN0KTogcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlLmZyb21rZXlzKCdhJyksIHsnYSc6Tm9uZX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZShkaWN0bGlrZS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGljdGxpa2UuZnJvbWtleXMoJ2EnKSkgaXMgZGljdGxpa2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRpY3RsaWtlKCkuZnJvbWtleXMoJ2EnKSkgaXMgZGljdGxpa2UpCiAgICAgICAgIGNsYXNzIG15ZGljdChkaWN0KToKICAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJEaWN0LlVzZXJEaWN0KCkKICAgICAgICAgdWQgPSBteWRpY3QuZnJvbWtleXMoJ2FiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ZCwgeydhJzpOb25lLCAnYic6Tm9uZX0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHVkLCBVc2VyRGljdC5Vc2VyRGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHVkLCBVc2VyRGljdC5Vc2VyRGljdCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGljdC5mcm9ta2V5cykKIAogICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjYxLDEwICsyNjEsMTAgQEAKIAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKICAgICAgICAgZCA9IHt9Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmdldCgnYycpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmdldCgnYycpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2MnLCAzKSwgMykKICAgICAgICAgZCA9IHsnYScgOiAxLCAnYicgOiAyfQotICAgICAgICBzZWxmLmFzc2VydF8oZC5nZXQoJ2MnKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5nZXQoJ2MnKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdjJywgMyksIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYScsIDMpLCAxKQpAQCAtMjc0LDkgKzI3NCw5IEBACiAgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKICAgICAgICAgIyBkaWN0LnNldGRlZmF1bHQoKQogICAgICAgICBkID0ge30KLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNldGRlZmF1bHQoJ2tleTAnKSBpcyBOb25lKQogICAgICAgICBkLnNldGRlZmF1bHQoJ2tleTAnLCBbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNldGRlZmF1bHQoJ2tleTAnKSBpcyBOb25lKQogICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydrZXknXVswXSwgMykKICAgICAgICAgZC5zZXRkZWZhdWx0KCdrZXknLCBbXSkuYXBwZW5kKDQpCkBAIC0zMTgsOSArMzE4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YSwgaW50KGthKSkKICAgICAgICAgICAgICAgICAgICAga2IsIHZiID0gdGIgPSBiLnBvcGl0ZW0oKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZiLCBpbnQoa2IpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90KGNvcHltb2RlIDwgMCBhbmQgdGEgIT0gdGIpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QoY29weW1vZGUgPCAwIGFuZCB0YSAhPSB0YikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYikKIAogICAgICAgICBkID0ge30KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9waXRlbSkKQEAgLTM5NSw4ICszOTUsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHJlcHIsIGQpCiAKICAgICBkZWYgdGVzdF9sZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoe30gPCB7fSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHsxOiAyfSA8IHsxTDogMkx9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoe30gPCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHsxOiAyfSA8IHsxTDogMkx9KSkKIAogICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcwogCkBAIC00MzAsOCArNDMwLDggQEAKICAgICAgICAgZCA9IEQoezE6IDIsIDM6IDR9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFszXSwgNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDIgbm90IGluIGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygyIG5vdCBpbiBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgbm90IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIG5vdCBpbiBkLmtleXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzJdLCA0MikKICAgICAgICAgY2xhc3MgRShkaWN0KToKICAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgpAQCAtNTY3LDcgKzU2Nyw3IEBACiAgICAgICAgICAgICBvYmoueCA9IGkoY29udGFpbmVyKQogICAgICAgICAgICAgZGVsIG9iaiwgY29udGFpbmVyCiAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsICJDeWNsZSB3YXMgbm90IGNvbGxlY3RlZCIpCiAKICAgICBkZWYgX25vdF90cmFja2VkKHNlbGYsIHQpOgogICAgICAgICAjIE5lc3RlZCBjb250YWluZXJzIGNhbiB0YWtlIHNldmVyYWwgY29sbGVjdGlvbnMgdG8gdW50cmFjawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaXJjYWNoZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGlyY2FjaGUucHkKaW5kZXggMjc2YzUyYS4uNTY3OTlkYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaXJjYWNoZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpcmNhY2hlLnB5CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVudHJpZXMsIFtdKQogCiAgICAgICAgICMgQ2hlY2sgdGhhdCBjYWNoZSBpcyBhY3R1YWxseSBjYWNoaW5nLCBub3QganVzdCBwYXNzaW5nIHRocm91Z2guCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkaXJjYWNoZS5saXN0ZGlyKHNlbGYudGVtcGRpcikgaXMgZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcmNhY2hlLmxpc3RkaXIoc2VsZi50ZW1wZGlyKSBpcyBlbnRyaWVzKQogCiAgICAgICAgICMgRGlyZWN0b3JpZXMgYXJlbid0ICJmaWxlcyIgb24gV2luZG93cywgYW5kIGRpcmVjdG9yeSBtdGltZSBoYXMKICAgICAgICAgIyBub3RoaW5nIHRvIGRvIHdpdGggd2hlbiBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBnZXQgY3JlYXRlZC4KQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgICAgIHNlbGYud3JpdGVUZW1wKCJ0ZXN0MSIpCiAgICAgICAgICAgICBlbnRyaWVzID0gZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbnRyaWVzLCBbJ3Rlc3QxJ10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpIGlzIGVudHJpZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpIGlzIGVudHJpZXMpCiAKICAgICAgICAgIyMgVU5TVUNDRVNTRlVMIENBU0VTCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGRpcmNhY2hlLmxpc3RkaXIsIHNlbGYudGVtcGRpcisiX25vbmV4aXN0ZW50IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKaW5kZXggNTc4MTNjOS4uMDFhZTQ2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiLyIpCiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0cmVzcG9uc2UoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogIiIiPGRsPjxkdD48YSBuYW1lPSItJmx0O2xhbWJkYSZndDsiPjxzdHJvbmc+Jmx0O2xhbWJkYSZndDs8L3N0cm9uZz48L2E+KHgsIHkpPC9kdD48L2RsPiIiIgogICAgICAgICAgICAgaW4gcmVzcG9uc2UucmVhZCgpKQogCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQogICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKIAotICAgICAgICBzZWxmLmFzc2VydF8oICMgVGhpcyBpcyB1Z2x5IC4uLiBob3cgY2FuIGl0IGJlIG1hZGUgYmV0dGVyPworICAgICAgICBzZWxmLmFzc2VydFRydWUoICMgVGhpcyBpcyB1Z2x5IC4uLiBob3cgY2FuIGl0IGJlIG1hZGUgYmV0dGVyPwogIiIiPGRsPjxkdD48YSBuYW1lPSItYWRkIj48c3Ryb25nPmFkZDwvc3Ryb25nPjwvYT4oeCwgeSk8L2R0PjxkZD48dHQ+QWRkJm5ic3A7dHdvJm5ic3A7aW5zdGFuY2VzJm5ic3A7dG9nZXRoZXIuJm5ic3A7VGhpcyZuYnNwO2ZvbGxvd3MmbmJzcDs8YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAwMDgvIj5QRVAwMDg8L2E+LCZuYnNwO2J1dCZuYnNwO2hhcyZuYnNwO25vdGhpbmc8YnI+XG50byZuYnNwO2RvJm5ic3A7d2l0aCZuYnNwOzxhIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzE5NTIudHh0Ij5SRkMxOTUyPC9hPi4mbmJzcDtDYXNlJm5ic3A7c2hvdWxkJm5ic3A7bWF0dGVyOiZuYnNwO3BFcDAwOCZuYnNwO2FuZCZuYnNwO3JGQzE5NTIuJm5ic3A7Jm5ic3A7VGhpbmdzPGJyPlxudGhhdCZuYnNwO3N0YXJ0Jm5ic3A7d2l0aCZuYnNwO2h0dHAmbmJzcDthbmQmbmJzcDtmdHAmbmJzcDtzaG91bGQmbmJzcDtiZSZuYnNwO2F1dG8tbGlua2VkLCZuYnNwO3Rvbzo8YnI+XG48YSBocmVmPSJodHRwOi8vZ29vZ2xlLmNvbSI+aHR0cDovL2dvb2dsZS5jb208L2E+LjwvdHQ+PC9kZD48L2RsPiIiIgogICAgICAgICAgIGluIHJlc3BvbnNlLnJlYWQoKSkKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAiIiI8ZGw+PGR0PjxhIG5hbWU9Ii1zeXN0ZW0ubGlzdE1ldGhvZHMiPjxzdHJvbmc+c3lzdGVtLmxpc3RNZXRob2RzPC9zdHJvbmc+PC9hPigpPC9kdD48ZGQ+PHR0PjxhIGhyZWY9IiMtc3lzdGVtLmxpc3RNZXRob2RzIj5zeXN0ZW0ubGlzdE1ldGhvZHM8L2E+KCkmbmJzcDs9Jmd0OyZuYnNwO1tcJ2FkZFwnLCZuYnNwO1wnc3VidHJhY3RcJywmbmJzcDtcJ211bHRpcGxlXCddPGJyPlxuJm5ic3A7PGJyPlxuUmV0dXJucyZuYnNwO2EmbmJzcDtsaXN0Jm5ic3A7b2YmbmJzcDt0aGUmbmJzcDttZXRob2RzJm5ic3A7c3VwcG9ydGVkJm5ic3A7YnkmbmJzcDt0aGUmbmJzcDtzZXJ2ZXIuPC90dD48L2RkPjwvZGw+XG4gPGRsPjxkdD48YSBuYW1lPSItc3lzdGVtLm1ldGhvZEhlbHAiPjxzdHJvbmc+c3lzdGVtLm1ldGhvZEhlbHA8L3N0cm9uZz48L2E+KG1ldGhvZF9uYW1lKTwvZHQ+PGRkPjx0dD48YSBocmVmPSIjLXN5c3RlbS5tZXRob2RIZWxwIj5zeXN0ZW0ubWV0aG9kSGVscDwvYT4oXCdhZGRcJykmbmJzcDs9Jmd0OyZuYnNwOyJBZGRzJm5ic3A7dHdvJm5ic3A7aW50ZWdlcnMmbmJzcDt0b2dldGhlciI8YnI+XG4mbmJzcDs8YnI+XG5SZXR1cm5zJm5ic3A7YSZuYnNwO3N0cmluZyZuYnNwO2NvbnRhaW5pbmcmbmJzcDtkb2N1bWVudGF0aW9uJm5ic3A7Zm9yJm5ic3A7dGhlJm5ic3A7c3BlY2lmaWVkJm5ic3A7bWV0aG9kLjwvdHQ+PC9kZD48L2RsPlxuIDxkbD48ZHQ+PGEgbmFtZT0iLXN5c3RlbS5tZXRob2RTaWduYXR1cmUiPjxzdHJvbmc+c3lzdGVtLm1ldGhvZFNpZ25hdHVyZTwvc3Ryb25nPjwvYT4obWV0aG9kX25hbWUpPC9kdD48ZGQ+PHR0PjxhIGhyZWY9IiMtc3lzdGVtLm1ldGhvZFNpZ25hdHVyZSI+c3lzdGVtLm1ldGhvZFNpZ25hdHVyZTwvYT4oXCdhZGRcJykmbmJzcDs9Jmd0OyZuYnNwO1tkb3VibGUsJm5ic3A7aW50LCZuYnNwO2ludF08YnI+XG4mbmJzcDs8YnI+XG5SZXR1cm5zJm5ic3A7YSZuYnNwO2xpc3QmbmJzcDtkZXNjcmliaW5nJm5ic3A7dGhlJm5ic3A7c2lnbmF0dXJlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDttZXRob2QuJm5ic3A7SW4mbmJzcDt0aGU8YnI+XG5hYm92ZSZuYnNwO2V4YW1wbGUsJm5ic3A7dGhlJm5ic3A7YWRkJm5ic3A7bWV0aG9kJm5ic3A7dGFrZXMmbmJzcDt0d28mbmJzcDtpbnRlZ2VycyZuYnNwO2FzJm5ic3A7YXJndW1lbnRzPGJyPlxuYW5kJm5ic3A7cmV0dXJucyZuYnNwO2EmbmJzcDtkb3VibGUmbmJzcDtyZXN1bHQuPGJyPlxuJm5ic3A7PGJyPlxuVGhpcyZuYnNwO3NlcnZlciZuYnNwO2RvZXMmbmJzcDtOT1QmbmJzcDtzdXBwb3J0Jm5ic3A7c3lzdGVtLm1ldGhvZFNpZ25hdHVyZS48L3R0PjwvZGQ+PC9kbD4iIiIKICAgICAgICAgICAgIGluIHJlc3BvbnNlLnJlYWQoKSkKIApAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCIiIlRyeSZuYnNwO3NlbGYuPHN0cm9uZz5hZGQ8L3N0cm9uZz4sJm5ic3A7dG9vLiIiIiBpbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoIiIiVHJ5Jm5ic3A7c2VsZi48c3Ryb25nPmFkZDwvc3Ryb25nPiwmbmJzcDt0b28uIiIiIGluCiAgICAgICAgICAgICByZXNwb25zZS5yZWFkKCkpCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkLnB5IGIvTGliL3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKaW5kZXggNThmYWViNC4uNzRkZTg2YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKQEAgLTI0LDQzICsyNCw0MyBAQAogCiAgICAgZGVmIHRlc3RfaW5pdGxvY2soc2VsZik6CiAgICAgICAgICNNYWtlIHN1cmUgbG9ja3Mgc3RhcnQgbG9ja2VkCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5sb2NrLmxvY2tlZCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYubG9jay5sb2NrZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NrIG9iamVjdCBpcyBub3QgaW5pdGlhbGl6ZWQgdW5sb2NrZWQuIikKIAogICAgIGRlZiB0ZXN0X3JlbGVhc2Uoc2VsZik6CiAgICAgICAgICMgVGVzdCBzZWxmLmxvY2sucmVsZWFzZSgpCiAgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKICAgICAgICAgc2VsZi5sb2NrLnJlbGVhc2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNlbGYubG9jay5sb2NrZWQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2subG9ja2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jayBvYmplY3QgZGlkIG5vdCByZWxlYXNlIHByb3Blcmx5LiIpCiAKICAgICBkZWYgdGVzdF9pbXByb3Blcl9yZWxlYXNlKHNlbGYpOgogICAgICAgICAjTWFrZSBzdXJlIHJlbGVhc2Ugb2YgYW4gdW5sb2NrZWQgdGhyZWFkIHJhaXNlcyBfdGhyZWFkLmVycm9yCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhfdGhyZWFkLmVycm9yLCBzZWxmLmxvY2sucmVsZWFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoX3RocmVhZC5lcnJvciwgc2VsZi5sb2NrLnJlbGVhc2UpCiAKICAgICBkZWYgdGVzdF9jb25kX2FjcXVpcmVfc3VjY2VzcyhzZWxmKToKICAgICAgICAgI01ha2Ugc3VyZSB0aGUgY29uZGl0aW9uYWwgYWNxdWlyaW5nIG9mIHRoZSBsb2NrIHdvcmtzLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5sb2NrLmFjcXVpcmUoMCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmxvY2suYWNxdWlyZSgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgdGhlIGxvY2sgZmFpbGVkLiIpCiAKICAgICBkZWYgdGVzdF9jb25kX2FjcXVpcmVfZmFpbChzZWxmKToKICAgICAgICAgI1Rlc3QgYWNxdWlyaW5nIGxvY2tlZCBsb2NrIHJldHVybnMgRmFsc2UKICAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBzZWxmLmxvY2suYWNxdWlyZSgwKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2suYWNxdWlyZSgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgYSBsb2NrZWQgbG9jayBpbmNvcnJlY3RseSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2NlZWRlZC4iKQogCiAgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfc3VjY2VzcyhzZWxmKToKICAgICAgICAgI01ha2Ugc3VyZSB1bmNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiBhIGxvY2sgd29ya3MuCiAgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYubG9jay5sb2NrZWQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubG9jay5sb2NrZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJVbmNvbmRpb25hbCBsb2NraW5nIGZhaWxlZC4iKQogCiAgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfcmV0dXJuX3ZhbChzZWxmKToKICAgICAgICAgI01ha2Ugc3VyZSB0aGF0IGFuIHVuY29uZGl0aW9uYWwgbG9ja2luZyByZXR1cm5zIFRydWUuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmxvY2suYWNxdWlyZSgxKSBpcyBUcnVlLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5sb2NrLmFjcXVpcmUoMSkgaXMgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJVbmNvbmRpdGlvbmFsIGxvY2tpbmcgZGlkIG5vdCByZXR1cm4gVHJ1ZS4iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5sb2NrLmFjcXVpcmUoKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5sb2NrLmFjcXVpcmUoKSBpcyBUcnVlKQogCiAgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfYmxvY2tpbmcoc2VsZik6CiAgICAgICAgICNNYWtlIHN1cmUgdGhhdCB1bmNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiBhIGxvY2tlZCBsb2NrIGJsb2Nrcy4KQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgZW5kX3RpbWUgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgImRvbmUiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygoZW5kX3RpbWUgLSBzdGFydF90aW1lKSA+PSBERUxBWSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChlbmRfdGltZSAtIHN0YXJ0X3RpbWUpID49IERFTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NraW5nIGJ5IHVuY29uZGl0aW9uYWwgYWNxdWlyaW5nIGZhaWxlZC4iKQogCiBjbGFzcyBNaXNjVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtODgsMTggKzg4LDE4IEBACiAKICAgICBkZWYgdGVzdF9leGl0KHNlbGYpOgogICAgICAgICAjTWFrZSBzdXJlIF90aHJlYWQuZXhpdCgpIHJhaXNlcyBTeXN0ZW1FeGl0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhTeXN0ZW1FeGl0LCBfdGhyZWFkLmV4aXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQsIF90aHJlYWQuZXhpdCkKIAogICAgIGRlZiB0ZXN0X2lkZW50KHNlbGYpOgogICAgICAgICAjVGVzdCBzYW5pdHkgb2YgX3RocmVhZC5nZXRfaWRlbnQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShfdGhyZWFkLmdldF9pZGVudCgpLCBpbnQpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShfdGhyZWFkLmdldF9pZGVudCgpLCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIl90aHJlYWQuZ2V0X2lkZW50KCkgcmV0dXJuZWQgYSBub24taW50ZWdlciIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhfdGhyZWFkLmdldF9pZGVudCgpICE9IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfdGhyZWFkLmdldF9pZGVudCgpICE9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAiX3RocmVhZC5nZXRfaWRlbnQoKSByZXR1cm5lZCAwIikKIAogICAgIGRlZiB0ZXN0X0xvY2tUeXBlKHNlbGYpOgogICAgICAgICAjTWFrZSBzdXJlIF90aHJlYWQuTG9ja1R5cGUgaXMgdGhlIHNhbWUgdHlwZSBhcyBfdGhyZWFkLmFsbG9jYXRlX2xvY2tlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoX3RocmVhZC5hbGxvY2F0ZV9sb2NrKCksIF90aHJlYWQuTG9ja1R5cGUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShfdGhyZWFkLmFsbG9jYXRlX2xvY2soKSwgX3RocmVhZC5Mb2NrVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiX3RocmVhZC5Mb2NrVHlwZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Ygd2hhdCBpcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IF90aHJlYWQuYWxsb2NhdGVfbG9jaygpIikKIApAQCAtMTA4LDEzICsxMDgsMTMgQEAKICAgICAgICAgIyBzaG91bGQgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQgdXBvbiBjb21wbGV0aW9uLgogICAgICAgICBkZWYgY2FsbF9pbnRlcnJ1cHQoKToKICAgICAgICAgICAgIF90aHJlYWQuaW50ZXJydXB0X21haW4oKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZCwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfaW50ZXJydXB0LCB0dXBsZSgpKQogCiAgICAgZGVmIHRlc3RfaW50ZXJydXB0X2luX21haW4oc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaWYgaW50ZXJydXB0X21haW4gaXMgY2FsbGVkIGluIG1haW4gdGhyZWF0IHRoYXQKICAgICAgICAgIyBLZXlib2FyZEludGVycnVwdCBpcyByYWlzZWQgaW5zdGFudGx5LgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuaW50ZXJydXB0X21haW4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0LCBfdGhyZWFkLmludGVycnVwdF9tYWluKQogCiBjbGFzcyBUaHJlYWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCB0aHJlYWQgY3JlYXRpb24uIiIiCkBAIC0xMjgsMTYgKzEyOCwxNiBAQAogICAgICAgICB0ZXN0aW5nX3F1ZXVlID0gUXVldWUuUXVldWUoMSkKICAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsICh0ZXN0aW5nX3F1ZXVlLCBUcnVlLCBUcnVlKSkKICAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gYW5kIHJlc3VsdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBwYXNzaW5nIGZvciB0aHJlYWQgY3JlYXRpb24gdXNpbmcgdHVwbGUgZmFpbGVkIikKICAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsIHR1cGxlKCksIHsncXVldWUnOnRlc3RpbmdfcXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZzEnOlRydWUsICdhcmcyJzpUcnVlfSkKICAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gYW5kIHJlc3VsdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBwYXNzaW5nIGZvciB0aHJlYWQgY3JlYXRpb24gdXNpbmcga3dhcmdzIGZhaWxlZCIpCiAgICAgICAgIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZChhcmdfdGVzdGVyLCAodGVzdGluZ19xdWV1ZSwgVHJ1ZSksIHsnYXJnMic6VHJ1ZX0pCiAgICAgICAgIHJlc3VsdCA9IHRlc3RpbmdfcXVldWUuZ2V0KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdFswXSBhbmQgcmVzdWx0WzFdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgcGFzc2luZyBmb3IgdGhyZWFkIGNyZWF0aW9uIHVzaW5nIGJvdGggdHVwbGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBrd2FyZ3MgZmFpbGVkIikKIApAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgIHRpbWUuc2xlZXAoREVMQVkpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgJ2RvbmUnCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0ZXN0aW5nX3F1ZXVlLnFzaXplKCkgPT0gdGhyZWFkX2NvdW50LAorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdGluZ19xdWV1ZS5xc2l6ZSgpID09IHRocmVhZF9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgYWxsICVzIHRocmVhZHMgZXhlY3V0ZWQgcHJvcGVybHkgYWZ0ZXIgJXMgc2VjLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgKHRocmVhZF9jb3VudCwgREVMQVkpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQppbmRleCAxNWM5ODY5Li5iMTEzNTQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKQEAgLTcxLDEwICs3MSwxMCBAQAogICAgICAgICAgICAgZXAgPSBzZWxlY3QuZXBvbGwoMTYpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3Ioc3RyKGUpKQotICAgICAgICBzZWxmLmFzc2VydF8oZXAuZmlsZW5vKCkgPiAwLCBlcC5maWxlbm8oKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBlcC5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcC5maWxlbm8oKSA+IDAsIGVwLmZpbGVubygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGVwLmNsb3NlZCkKICAgICAgICAgZXAuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oZXAuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXAuY2xvc2VkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBlcC5maWxlbm8pCiAKICAgICBkZWYgdGVzdF9iYWRjcmVhdGUoc2VsZik6CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZXAyLnBvbGwoMSwgNCkKICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVCQURGLCBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVCQURGLCBlKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJlcG9sbCBvbiBjbG9zZWQgZmQgZGlkbid0IHJhaXNlIEVCQURGIikKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKICAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbElmKHRoZW4gLSBub3cgPiAwLjEsIHRoZW4gLSBub3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMSwgdGhlbiAtIG5vdykKIAogICAgICAgICBldmVudHMuc29ydCgpCiAgICAgICAgIGV4cGVjdGVkID0gWyhjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5FUE9MTE9VVCksCkBAIC0xNjUsMTIgKzE2NSwxMiBAQAogICAgICAgICBleHBlY3RlZC5zb3J0KCkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhldmVudHMsIGV4cGVjdGVkKQotICAgICAgICBzZWxmLmZhaWxJZih0aGVuIC0gbm93ID4gMC4wMSwgdGhlbiAtIG5vdykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSwgdGhlbiAtIG5vdykKIAogICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgICBldmVudHMgPSBlcC5wb2xsKHRpbWVvdXQ9Mi4xLCBtYXhldmVudHM9NCkKICAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbElmKGV2ZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShldmVudHMpCiAKICAgICAgICAgY2xpZW50LnNlbmQoIkhlbGxvISIpCiAgICAgICAgIHNlcnZlci5zZW5kKCJ3b3JsZCEhISIpCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQogICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5mYWlsSWYodGhlbiAtIG5vdyA+IDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCiAKICAgICAgICAgZXZlbnRzLnNvcnQoKQogICAgICAgICBleHBlY3RlZCA9IFsoY2xpZW50LmZpbGVubygpLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCksCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQogICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5mYWlsSWYodGhlbiAtIG5vdyA+IDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCiAKICAgICAgICAgZXhwZWN0ZWQgPSBbKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMT1VUKV0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXZlbnRzLCBleHBlY3RlZCkKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgICBldmVudHMgPSBlcC5wb2xsKDEsIDQpCiAgICAgICAgIHRoZW4gPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmZhaWxJZih0aGVuIC0gbm93ID4gMC4wMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSkKIAogICAgICAgICBzZXJ2ZXIuY2xvc2UoKQogICAgICAgICBlcC51bnJlZ2lzdGVyKGZkKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lcnJuby5weSBiL0xpYi90ZXN0L3Rlc3RfZXJybm8ucHkKaW5kZXggOTUyMzkwNy4uNGFkYzFmMCAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9lcnJuby5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Vycm5vLnB5CkBAIC0xNCwxMyArMTQsMTMgQEAKICAgICBkZWYgdGVzdF9mb3JfaW1wcm9wZXJfYXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgIyBObyB1bmV4cGVjdGVkIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIG9uIHRoZSBtb2R1bGUuCiAgICAgICAgIGZvciBlcnJvcl9jb2RlIGluIHN0ZF9jX2Vycm9yczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGVycm5vLCBlcnJvcl9jb2RlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVycm5vLCBlcnJvcl9jb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJybm8gaXMgbWlzc2luZyAlcyIgJSBlcnJvcl9jb2RlKQogCiAgICAgZGVmIHRlc3RfdXNpbmdfZXJyb3Jjb2RlKHNlbGYpOgogICAgICAgICAjIEV2ZXJ5IGtleSB2YWx1ZSBpbiBlcnJuby5lcnJvcmNvZGUgc2hvdWxkIGJlIG9uIHRoZSBtb2R1bGUuCiAgICAgICAgIGZvciB2YWx1ZSBpbiBlcnJuby5lcnJvcmNvZGUuaXRlcnZhbHVlcygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoZXJybm8sIHZhbHVlKSwgJ25vICVzIGF0dHIgaW4gZXJybm8nICUgdmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlcnJubywgdmFsdWUpLCAnbm8gJXMgYXR0ciBpbiBlcnJubycgJSB2YWx1ZSkKIAogCiBjbGFzcyBFcnJvcmNvZGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc19pbl9lcnJvcmNvZGUoc2VsZik6CiAgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gZXJybm8uX19kaWN0X18uaXRlcmtleXMoKToKICAgICAgICAgICAgIGlmIGF0dHJpYnV0ZS5pc3VwcGVyKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdldGF0dHIoZXJybm8sIGF0dHJpYnV0ZSkgaW4gZXJybm8uZXJyb3Jjb2RlLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRhdHRyKGVycm5vLCBhdHRyaWJ1dGUpIGluIGVycm5vLmVycm9yY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vICVzIGF0dHIgaW4gZXJybm8uZXJyb3Jjb2RlJyAlIGF0dHJpYnV0ZSkKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKaW5kZXggMDZhMjM3OC4uNmNmYmQwOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpAQCAtMTYyLDcgKzE2Miw3IEBACiAgICAgICAgICAgICAgICAgZXhjLCBlcnIsIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICBjbyA9IHRiLnRiX2ZyYW1lLmZfY29kZQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvLmNvX25hbWUsICJ0ZXN0X2NhcGkxIikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY28uY29fZmlsZW5hbWUuZW5kc3dpdGgoJ3Rlc3RfZXhjZXB0aW9ucycrb3MuZXh0c2VwKydweScpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjby5jb19maWxlbmFtZS5lbmRzd2l0aCgndGVzdF9leGNlcHRpb25zJytvcy5leHRzZXArJ3B5JykpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIikKIApAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICAgICAgICAgICAgZXhjLCBlcnIsIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICBjbyA9IHRiLnRiX2ZyYW1lLmZfY29kZQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvLmNvX25hbWUsICJfX2luaXRfXyIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNvLmNvX2ZpbGVuYW1lLmVuZHN3aXRoKCd0ZXN0X2V4Y2VwdGlvbnMnK29zLmV4dHNlcCsncHknKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY28uY29fZmlsZW5hbWUuZW5kc3dpdGgoJ3Rlc3RfZXhjZXB0aW9ucycrb3MuZXh0c2VwKydweScpKQogICAgICAgICAgICAgICAgIGNvMiA9IHRiLnRiX2ZyYW1lLmZfYmFjay5mX2NvZGUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbzIuY29fbmFtZSwgInRlc3RfY2FwaTIiKQogICAgICAgICAgICAgZWxzZToKQEAgLTE5MCwxMiArMTkwLDEyIEBACiAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEpKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFdpbmRvd3NFcnJvcigxMDAxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwMSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltFcnJvciAxMDAxXSBtZXNzYWdlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLmVycm5vLCAyMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChXaW5kb3dzRXJyb3IoMTAwMSwgIm1lc3NhZ2UiKS5lcnJubywgMjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQogCiAgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkKQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAjIGdvaW5nIHRocm91Z2ggdGhlICdhcmdzJyBhdHRyaWJ1dGUuCiAgICAgICAgIGFyZ3MgPSAoMSwgMiwgMykKICAgICAgICAgZXhjID0gQmFzZUV4Y2VwdGlvbigqYXJncykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjWzpdLCBhcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Y1s6XSwgYXJncykKIAogICAgIGRlZiB0ZXN0S2V5d29yZEFyZ3Moc2VsZik6CiAgICAgICAgICMgdGVzdCB0aGF0IGJ1aWx0aW4gZXhjZXB0aW9uIGRvbid0IHRha2Uga2V5d29yZCBhcmdzLApAQCAtMzUwLDExICszNTAsMTEgQEAKICAgICBkZWYgdGVzdFVuaWNvZGVTdHJVc2FnZShzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgYm90aCBpbnN0YW5jZXMgYW5kIGNsYXNzZXMgaGF2ZSBhIHN0ciBhbmQgdW5pY29kZQogICAgICAgICAjIHJlcHJlc2VudGF0aW9uLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyKEV4Y2VwdGlvbikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh1bmljb2RlKEV4Y2VwdGlvbikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoRXhjZXB0aW9uKCdhJykpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModW5pY29kZShFeGNlcHRpb24odSdhJykpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModW5pY29kZShFeGNlcHRpb24odSdceGUxJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoRXhjZXB0aW9uKCdhJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24odSdhJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24odSdceGUxJykpKQogCiAgICAgZGVmIHRlc3RfYmFkaXNpbnN0YW5jZShzZWxmKToKICAgICAgICAgIyBCdWcgIzI1NDI6IGlmIGlzc3ViY2xhc3MoZSwgTXlFeGNlcHRpb24pIHJhaXNlcyBhbiBleGNlcHRpb24sCkBAIC0zODYsOCArMzg2LDggQEAKICAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgIGUsIHYsIHRiID0gZygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZSBpcyBSdW50aW1lRXJyb3IsIGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIiBpbiBzdHIodiksIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZSBpcyBSdW50aW1lRXJyb3IsIGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIiBpbiBzdHIodiksIHYpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CmluZGV4IDE5NzRmNTYuLjdkM2U3MmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTg4LDEzICs4OCwxMyBAQAogICAgIGRlZiB0ZXN0RXJyb3JzKHNlbGYpOgogICAgICAgICBmID0gc2VsZi5mCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYubmFtZSwgVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuaXNhdHR5KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5pc2F0dHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmNsb3NlZCkKIAogICAgICAgICBpZiBoYXNhdHRyKGYsICJyZWFkaW50byIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKElPRXJyb3IsIFR5cGVFcnJvciksIGYucmVhZGludG8sICIiKQogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbKCdmaWxlbm8nLCAoKSksCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQogICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQogCiAgICAgICAgIGZvciBtZXRob2RuYW1lLCBhcmdzIGluIG1ldGhvZHM6CiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZTJrLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKaW5kZXggYTEzNGE4OS4uNjUyMDI5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKQEAgLTgzLDE3ICs4MywxNyBAQAogCiAgICAgZGVmIHRlc3RSZXByKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSByZXByIHdvcmtzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXByKHNlbGYuZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSAnIiArIFRFU1RGTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHNlbGYuZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSAnIiArIFRFU1RGTikpCiAKICAgICBkZWYgdGVzdEVycm9ycyhzZWxmKToKICAgICAgICAgZiA9IHNlbGYuZgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLm5hbWUsIFRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmLmlzYXR0eSgpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuaXNhdHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5jbG9zZWQpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLnJlYWRpbnRvLCAiIikKICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQogCiAgICAgZGVmIHRlc3RNZXRob2RzKHNlbGYpOgogICAgICAgICBtZXRob2RzID0gWydmaWxlbm8nLCAnZmx1c2gnLCAnaXNhdHR5JywgJ25leHQnLCAncmVhZCcsICdyZWFkaW50bycsCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQogICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQogCiAgICAgICAgIGZvciBtZXRob2RuYW1lIGluIG1ldGhvZHM6CiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgIGRlZiB0ZXN0VW5pY29kZU9wZW4oc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHJlcHIgd29ya3MgZm9yIHVuaWNvZGUgdG9vCiAgICAgICAgIGYgPSBvcGVuKHVuaWNvZGUoVEVTVEZOKSwgInciKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwcihmKS5zdGFydHN3aXRoKCI8b3BlbiBmaWxlIHUnIiArIFRFU1RGTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGYpLnN0YXJ0c3dpdGgoIjxvcGVuIGZpbGUgdSciICsgVEVTVEZOKSkKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKQEAgLTM2NSw3ICszNjUsNyBAQAogCiAgICAgICAgIHdpdGggQyhURVNURk4sICd3JykgYXMgZjoKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuc3ViY2xhc3NfY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5zdWJjbGFzc19jbG9zZWQpCiAKIAogY2xhc3MgRmlsZVRocmVhZGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weQppbmRleCA1MDM1NjJiLi5mNzZiYTBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlY21wLnB5CkBAIC0yNSwxOSArMjUsMTkgQEAKICAgICAgICAgb3MudW5saW5rKHNlbGYubmFtZV9kaWZmKQogCiAgICAgZGVmIHRlc3RfbWF0Y2hpbmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZV9zYW1lKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lX3NhbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGl0c2VsZiBmYWlscyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZV9zYW1lLCBzaGFsbG93PUZhbHNlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lX3NhbWUsIHNoYWxsb3c9RmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGl0c2VsZiBmYWlscyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZSwgc2hhbGxvdz1GYWxzZSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZSwgc2hhbGxvdz1GYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGZpbGUgdG8gaWRlbnRpY2FsIGZpbGUgZmFpbHMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGlkZW50aWNhbCBmaWxlIGZhaWxzIikKIAogICAgIGRlZiB0ZXN0X2RpZmZlcmVudChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsSWYoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWVfZGlmZiksCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWVfZGlmZiksCiAgICAgICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIGZpbGVzIGNvbXBhcmUgYXMgZXF1YWwiKQotICAgICAgICBzZWxmLmZhaWxJZihmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYuZGlyKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYuZGlyKSwKICAgICAgICAgICAgICAgICAgICAgIkZpbGUgYW5kIGRpcmVjdG9yeSBjb21wYXJlIGFzIGVxdWFsIikKIAogY2xhc3MgRGlyQ29tcGFyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTY5LDE5ICs2OSwxOSBAQAogICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyX2RpZmYpCiAKICAgICBkZWYgdGVzdF9jbXBmaWxlcyhzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyLCBbJ2ZpbGUnXSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyLCBbJ2ZpbGUnXSkgPT0KICAgICAgICAgICAgICAgICAgICAgICAgIChbJ2ZpbGUnXSwgW10sIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZGlyZWN0b3J5IHRvIGl0c2VsZiBmYWlscyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLCBbJ2ZpbGUnXSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyX3NhbWUsIFsnZmlsZSddKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgKFsnZmlsZSddLCBbXSwgW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBkaXJlY3RvcnkgdG8gc2FtZSBmYWlscyIpCiAKICAgICAgICAgIyBUcnkgaXQgd2l0aCBzaGFsbG93PUZhbHNlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpciwgWydmaWxlJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpciwgWydmaWxlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWxsb3c9RmFsc2UpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFtdLCBbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBpdHNlbGYgZmFpbHMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgWydmaWxlJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLCBbJ2ZpbGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvdz1GYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBzYW1lIGZhaWxzIikKIApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBvdXRwdXQud3JpdGUoJ0RpZmZlcmVudCBjb250ZW50cy5cbicpCiAgICAgICAgIG91dHB1dC5jbG9zZSgpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZmlsZScsICdmaWxlMiddKSA9PQogICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFsnZmlsZTInXSwgW10pLAogICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIG1pc21hdGNoZWQgZGlyZWN0b3JpZXMgZmFpbHMiKQpAQCAtMTAzLDI4ICsxMDMsMjggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2QubGVmdF9saXN0LCBkLnJpZ2h0X2xpc3RdLFtbJ2ZpbGUnXSwgWydGaUxlJ11dKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbZC5sZWZ0X2xpc3QsIGQucmlnaHRfbGlzdF0sW1snZmlsZSddLCBbJ2ZpbGUnXV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmNvbW1vbiA9PSBbJ2ZpbGUnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQubGVmdF9vbmx5ID09IGQucmlnaHRfb25seSA9PSBbXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQuc2FtZV9maWxlcyA9PSBbJ2ZpbGUnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQuZGlmZl9maWxlcyA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuY29tbW9uID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5sZWZ0X29ubHkgPT0gZC5yaWdodF9vbmx5ID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFtdKQogCiAgICAgICAgICMgQ2hlY2sgYXR0cmlidXRlcyBmb3IgY29tcGFyaXNvbiBvZiB0d28gZGlmZmVyZW50IGRpcmVjdG9yaWVzCiAgICAgICAgIGQgPSBmaWxlY21wLmRpcmNtcChzZWxmLmRpciwgc2VsZi5kaXJfZGlmZikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQubGVmdF9saXN0ID09IFsnZmlsZSddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZC5yaWdodF9saXN0ID09IFsnZmlsZScsICdmaWxlMiddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZC5jb21tb24gPT0gWydmaWxlJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmxlZnRfb25seSA9PSBbXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQucmlnaHRfb25seSA9PSBbJ2ZpbGUyJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLnNhbWVfZmlsZXMgPT0gWydmaWxlJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmRpZmZfZmlsZXMgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmxlZnRfbGlzdCA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQucmlnaHRfbGlzdCA9PSBbJ2ZpbGUnLCAnZmlsZTInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuY29tbW9uID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5sZWZ0X29ubHkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnJpZ2h0X29ubHkgPT0gWydmaWxlMiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFtdKQogCiAgICAgICAgICMgQWRkIGRpZmZlcmVudCBmaWxlMgogICAgICAgICBvdXRwdXQgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLmRpciwgJ2ZpbGUyJyksICd3JykKICAgICAgICAgb3V0cHV0LndyaXRlKCdEaWZmZXJlbnQgY29udGVudHMuXG4nKQogICAgICAgICBvdXRwdXQuY2xvc2UoKQogICAgICAgICBkID0gZmlsZWNtcC5kaXJjbXAoc2VsZi5kaXIsIHNlbGYuZGlyX2RpZmYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLnNhbWVfZmlsZXMgPT0gWydmaWxlJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmRpZmZfZmlsZXMgPT0gWydmaWxlMiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFsnZmlsZTInXSkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IDlmYjNlYTcuLjg0YWVkMWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC02NSw4ICs2NSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDIxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgNikKLSAgICAgICAgc2VsZi5mYWlsSWYoZmkuaXNmaXJzdGxpbmUoKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoZmkuaXNzdGRpbigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpLmlzZmlyc3RsaW5lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmkuaXNzdGRpbigpKQogCiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAnJXMuIE5leHRmaWxlIChicz0lcyknICUgKHN0YXJ0KzIsIGJzKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVuYW1lKCksIHQzKQogCiAgICAgICAgICAgICBsaW5lID0gZmkucmVhZGxpbmUoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGluZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgMCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpby5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlvLnB5CmluZGV4IGU4ZDYzNjIuLjg3YmYwMTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlvLnB5CkBAIC04MiwxNyArODIsMTcgQEAKIAogICAgIGRlZiB0ZXN0RXJyb3JzKHNlbGYpOgogICAgICAgICBmID0gc2VsZi5mCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5pc2F0dHkoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmlzYXR0eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQogICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbHMoZi5uYW1lLCBURVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZCwgMTApICMgT3BlbiBmb3IgcmVhZGluZwogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgJ3InKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYucmVhZGludG8sICIiKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdpc2F0dHknLCAncmVhZCcsICdyZWFkaW50bycsCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgICAgIG1ldGhvZHMucmVtb3ZlKCd0cnVuY2F0ZScpCiAKICAgICAgICAgc2VsZi5mLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQogCiAgICAgICAgIGZvciBtZXRob2RuYW1lIGluIG1ldGhvZHM6CiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CmluZGV4IDM0NWE4MTUuLjg0NGE2NDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQpAQCAtMTQ4LDkgKzE0OCw5IEBACiAgICAgICAgIGZsb2F0Ll9fc2V0Zm9ybWF0X18oJ2Zsb2F0Jywgc2VsZi5zYXZlX2Zvcm1hdHNbJ2Zsb2F0J10pCiAKICAgICBkZWYgdGVzdF9nZXRmb3JtYXQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhmbG9hdC5fX2dldGZvcm1hdF9fKCdkb3VibGUnKSBpbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmxvYXQuX19nZXRmb3JtYXRfXygnZG91YmxlJykgaW4KICAgICAgICAgICAgICAgICAgICAgIFsndW5rbm93bicsICdJRUVFLCBiaWctZW5kaWFuJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2Zsb2F0JykgaW4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2Zsb2F0JykgaW4KICAgICAgICAgICAgICAgICAgICAgIFsndW5rbm93bicsICdJRUVFLCBiaWctZW5kaWFuJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQuX19nZXRmb3JtYXRfXywgJ2NoaWNrZW4nKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0Ll9fZ2V0Zm9ybWF0X18sIDEpCkBAIC0zNDAsMTIgKzM0MCwxMiBAQAogIyB3YXlzIHRvIGNyZWF0ZSBhbmQgcmVwcmVzZW50IGluZiBhbmQgbmFuCiBjbGFzcyBJbmZOYW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pbmZfZnJvbV9zdHIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luZihmbG9hdCgiaW5mIikpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbmYoZmxvYXQoIitpbmYiKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luZihmbG9hdCgiLWluZiIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5mKGZsb2F0KCJpbmZpbml0eSIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5mKGZsb2F0KCIraW5maW5pdHkiKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luZihmbG9hdCgiLWluZmluaXR5IikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKGZsb2F0KCIraW5mIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIi1pbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiaW5maW5pdHkiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiK2luZmluaXR5IikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIi1pbmZpbml0eSIpKSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoImluZiIpKSwgImluZiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiK2luZiIpKSwgImluZiIpCkBAIC0zODcsOSArMzg3LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoLTFlMzAwICogMWUzMDApLCAiLWluZiIpCiAKICAgICBkZWYgdGVzdF9uYW5fZnJvbV9zdHIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc25hbihmbG9hdCgibmFuIikpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNuYW4oZmxvYXQoIituYW4iKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc25hbihmbG9hdCgiLW5hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGZsb2F0KCJuYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihmbG9hdCgiK25hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGZsb2F0KCItbmFuIikpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgibmFuIikpLCAibmFuIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCIrbmFuIikpLCAibmFuIikKQEAgLTQxOCwxNCArNDE4LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKC0xZTMwMCAqIDFlMzAwICogMCksICJuYW4iKQogCiAgICAgZGVmIG5vdGVzdF9mbG9hdF9uYW4oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhOQU4uaXNfbmFuKCkpCi0gICAgICAgIHNlbGYuZmFpbElmKElORi5pc19uYW4oKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoKDAuKS5pc19uYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE5BTi5pc19uYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShJTkYuaXNfbmFuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKDAuKS5pc19uYW4oKSkKIAogICAgIGRlZiBub3Rlc3RfZmxvYXRfaW5mKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oSU5GLmlzX2luZigpKQotICAgICAgICBzZWxmLmZhaWxJZihOQU4uaXNfaW5mKCkpCi0gICAgICAgIHNlbGYuZmFpbElmKCgwLikuaXNfaW5mKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShJTkYuaXNfaW5mKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoTkFOLmlzX2luZigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgwLikuaXNfaW5mKCkpCiAKIGZyb21IZXggPSBmbG9hdC5mcm9taGV4CiB0b0hleCA9IGZsb2F0LmhleApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mbm1hdGNoLnB5IGIvTGliL3Rlc3QvdGVzdF9mbm1hdGNoLnB5CmluZGV4IDlhYmNiZDYuLmU2MTczZWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZm5tYXRjaC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZubWF0Y2gucHkKQEAgLTksMTEgKzksMTEgQEAKIGNsYXNzIEZubWF0Y2hUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIGNoZWNrX21hdGNoKHNlbGYsIGZpbGVuYW1lLCBwYXR0ZXJuLCBzaG91bGRfbWF0Y2g9MSk6CiAgICAgICAgIGlmIHNob3VsZF9tYXRjaDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmbm1hdGNoKGZpbGVuYW1lLCBwYXR0ZXJuKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbm1hdGNoKGZpbGVuYW1lLCBwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXIgdG8gbWF0Y2ggcGF0dGVybiAlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAlIChmaWxlbmFtZSwgcGF0dGVybikpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGZubWF0Y2goZmlsZW5hbWUsIHBhdHRlcm4pLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmbm1hdGNoKGZpbGVuYW1lLCBwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXIgbm90IHRvIG1hdGNoIHBhdHRlcm4gJXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZmlsZW5hbWUsIHBhdHRlcm4pKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CmluZGV4IGM0ODQ5N2QuLjhiMGJiMDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CkBAIC00MzgsNyArNDM4LDcgQEAKIAogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdCAtLSB1c2UgZ2xvYmFsIHNvY2tldCB0aW1lb3V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCJsb2NhbGhvc3QiKQpAQCAtNDUwLDcgKzQ1MCw3IEBACiAKICAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgogICAgICAgICAjIG5vIHRpbWVvdXQgLS0gZG8gbm90IHVzZSBnbG9iYWwgc29ja2V0IHRpbWVvdXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoImxvY2FsaG9zdCIsIHRpbWVvdXQ9Tm9uZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY2F0dHJzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKaW5kZXggMjk2MWNkMi4uNjM1MGFhZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKQEAgLTMxLDE0ICszMSwxNCBAQAogCiAgICAgZGVmIHRlc3RfZGlyX2luY2x1ZGVzX2NvcnJlY3RfYXR0cnMoc2VsZik6CiAgICAgICAgIHNlbGYuYi5rbm93bl9hdHRyID0gNwotICAgICAgICBzZWxmLmFzc2VydF8oJ2tub3duX2F0dHInIGluIGRpcihzZWxmLmIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2tub3duX2F0dHInIGluIGRpcihzZWxmLmIpLAogICAgICAgICAgICAgInNldCBhdHRyaWJ1dGVzIG5vdCBpbiBkaXIgbGlzdGluZyBvZiBtZXRob2QiKQogICAgICAgICAjIFRlc3Qgb24gdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Qgb2YgbWV0aG9kCiAgICAgICAgIHNlbGYuZi5hLmltX2Z1bmMua25vd25fYXR0ciA9IDcKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdrbm93bl9hdHRyJyBpbiBkaXIoc2VsZi5mLmEpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2tub3duX2F0dHInIGluIGRpcihzZWxmLmYuYSksCiAgICAgICAgICAgICAic2V0IGF0dHJpYnV0ZSBvbiB1bmJvdW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiBjbGFzcyBub3QgaW4gIgogICAgICAgICAgICAgICAgICAgICAgImRpciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygna25vd25fYXR0cicgaW4gZGlyKHNlbGYuZmkuYSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgna25vd25fYXR0cicgaW4gZGlyKHNlbGYuZmkuYSksCiAgICAgICAgICAgICAic2V0IGF0dHJpYnV0ZSBvbiB1bmJvdW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMsIHNob3VsZCBzaG93IHVwIgogICAgICAgICAgICAgICAgICAgICAgIiBpbiBuZXh0IGRpciIpCiAKQEAgLTI3OSwxMCArMjc5LDEwIEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgYyA9IGNsYXNzbWV0aG9kKGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjLl9fZnVuY19fIGlzIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjLl9fZnVuY19fIGlzIGYpCiAKICAgICAgICAgcyA9IHN0YXRpY21ldGhvZChmKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5fX2Z1bmNfXyBpcyBmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5fX2Z1bmNfXyBpcyBmKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggY2Q2NDVkMy4uYWI1YmFjMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoY2FwdHVyZSwgKmFyZ3MpCiAgICAgICAgICAgICBleHBlY3RlZCA9IGFyZ3MgKyAoJ3gnLCkKICAgICAgICAgICAgIGdvdCwgZW1wdHkgPSBwKCd4JykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleHBlY3RlZCA9PSBnb3QgYW5kIGVtcHR5ID09IHt9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID09IGdvdCBhbmQgZW1wdHkgPT0ge30pCiAKICAgICBkZWYgdGVzdF9rZXl3b3JkKHNlbGYpOgogICAgICAgICAjIG1ha2Ugc3VyZSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgY2FwdHVyZWQgY29ycmVjdGx5CkBAIC0xMDQsMTUgKzEwNCwxNSBAQAogICAgICAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlLCBhPWEpCiAgICAgICAgICAgICBleHBlY3RlZCA9IHsnYSc6YSwneCc6Tm9uZX0KICAgICAgICAgICAgIGVtcHR5LCBnb3QgPSBwKHg9Tm9uZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleHBlY3RlZCA9PSBnb3QgYW5kIGVtcHR5ID09ICgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID09IGdvdCBhbmQgZW1wdHkgPT0gKCkpCiAKICAgICBkZWYgdGVzdF9ub19zaWRlX2VmZmVjdHMoc2VsZik6CiAgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgdGhhdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscwogICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIDAsIGE9MSkKICAgICAgICAgYXJnczEsIGt3MSA9IHAoMSwgYj0yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYXJnczEgPT0gKDAsMSkgYW5kIGt3MSA9PSB7J2EnOjEsJ2InOjJ9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJnczEgPT0gKDAsMSkgYW5kIGt3MSA9PSB7J2EnOjEsJ2InOjJ9KQogICAgICAgICBhcmdzMiwga3cyID0gcCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcmdzMiA9PSAoMCwpIGFuZCBrdzIgPT0geydhJzoxfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFyZ3MyID09ICgwLCkgYW5kIGt3MiA9PSB7J2EnOjF9KQogCiAgICAgZGVmIHRlc3RfZXJyb3JfcHJvcGFnYXRpb24oc2VsZik6CiAgICAgICAgIGRlZiBmKHgsIHkpOgpAQCAtMTcyLDEzICsxNzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgICAjIENoZWNrIGF0dHJpYnV0ZXMgd2VyZSBhc3NpZ25lZAogICAgICAgICBmb3IgbmFtZSBpbiBhc3NpZ25lZDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhnZXRhdHRyKHdyYXBwZXIsIG5hbWUpIGlzIGdldGF0dHIod3JhcHBlZCwgbmFtZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cih3cmFwcGVyLCBuYW1lKSBpcyBnZXRhdHRyKHdyYXBwZWQsIG5hbWUpKQogICAgICAgICAjIENoZWNrIGF0dHJpYnV0ZXMgd2VyZSB1cGRhdGVkCiAgICAgICAgIGZvciBuYW1lIGluIHVwZGF0ZWQ6CiAgICAgICAgICAgICB3cmFwcGVyX2F0dHIgPSBnZXRhdHRyKHdyYXBwZXIsIG5hbWUpCiAgICAgICAgICAgICB3cmFwcGVkX2F0dHIgPSBnZXRhdHRyKHdyYXBwZWQsIG5hbWUpCiAgICAgICAgICAgICBmb3Iga2V5IGluIHdyYXBwZWRfYXR0cjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mod3JhcHBlZF9hdHRyW2tleV0gaXMgd3JhcHBlcl9hdHRyW2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyYXBwZWRfYXR0cltrZXldIGlzIHdyYXBwZXJfYXR0cltrZXldKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdF91cGRhdGUoc2VsZik6CiAgICAgICAgIGRlZiBmKCk6CkBAIC0yMDQsNyArMjA0LDcgQEAKICAgICAgICAgc2VsZi5jaGVja193cmFwcGVyKHdyYXBwZXIsIGYsICgpLCAoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fbmFtZV9fLCAnd3JhcHBlcicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX2RvY19fLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxJZihoYXNhdHRyKHdyYXBwZXIsICdhdHRyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih3cmFwcGVyLCAnYXR0cicpKQogCiAgICAgZGVmIHRlc3Rfc2VsZWN0aXZlX3VwZGF0ZShzZWxmKToKICAgICAgICAgZGVmIGYoKToKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgbWF4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICdtYXgnKQotICAgICAgICBzZWxmLmFzc2VydF8od3JhcHBlci5fX2RvY19fLnN0YXJ0c3dpdGgoJ21heCgnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyYXBwZXIuX19kb2NfXy5zdGFydHN3aXRoKCdtYXgoJykpCiAKIGNsYXNzIFRlc3RXcmFwcyhUZXN0VXBkYXRlV3JhcHBlcik6CiAKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZiwgKCksICgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICd3cmFwcGVyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbElmKGhhc2F0dHIod3JhcHBlciwgJ2F0dHInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHdyYXBwZXIsICdhdHRyJykpCiAKICAgICBkZWYgdGVzdF9zZWxlY3RpdmVfdXBkYXRlKHNlbGYpOgogICAgICAgICBkZWYgZigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdXR1cmU0LnB5IGIvTGliL3Rlc3QvdGVzdF9mdXR1cmU0LnB5CmluZGV4IDI1ODBjNTUuLjUzZjhhZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnV0dXJlNC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1dHVyZTQucHkKQEAgLTUsNyArNSw3IEBACiAKIGNsYXNzIFRlc3RGdXR1cmUodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBhc3NlcnRUeXBlKHNlbGYsIG9iaiwgdHlwKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUob2JqKSBpcyB0eXAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9iaikgaXMgdHlwLAogICAgICAgICAgICAgInR5cGUoJXIpIGlzICVyLCBub3QgJXIiICUgKG9iaiwgdHlwZShvYmopLCB0eXApKQogCiAgICAgZGVmIHRlc3RfdW5pY29kZV9zdHJpbmdzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZGJtLnB5IGIvTGliL3Rlc3QvdGVzdF9nZGJtLnB5CmluZGV4IDEzMWQyMmIuLmU3NmNjMDMgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2RibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dkYm0ucHkKQEAgLTI0LDEwICsyNCwxMCBAQAogICAgICAgICBzZWxmLmdbJzEyMzQ1Njc4OTEwJ10gPSAnMDE5MjM3NDEwOTgyMzQwOTEyODQwMTk4MjQyJwogICAgICAgICBrZXlfc2V0ID0gc2V0KHNlbGYuZy5rZXlzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5X3NldCwgZnJvemVuc2V0KFsnYScsICcxMjM0NTY3ODkxMCddKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZy5oYXNfa2V5KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmcuaGFzX2tleSgnYScpKQogICAgICAgICBrZXkgPSBzZWxmLmcuZmlyc3RrZXkoKQogICAgICAgICB3aGlsZSBrZXk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGtleV9zZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIGtleV9zZXQpCiAgICAgICAgICAgICBrZXlfc2V0LnJlbW92ZShrZXkpCiAgICAgICAgICAgICBrZXkgPSBzZWxmLmcubmV4dGtleShrZXkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuZ1sneHh4J10pCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICAgICAgc2VsZi5nWyd4J10gPSAneCcgKiAxMDAwMAogICAgICAgICBzaXplMSA9IG9zLnBhdGguZ2V0c2l6ZShmaWxlbmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNpemUwIDwgc2l6ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplMCA8IHNpemUxKQogCiAgICAgICAgIGRlbCBzZWxmLmdbJ3gnXQogICAgICAgICAjICdzaXplJyBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBldmVuIGFmdGVyIGRlbGV0aW5nIGFuIGVudHJ5LgpAQCAtNzMsNyArNzMsNyBAQAogCiAgICAgICAgIHNlbGYuZy5yZW9yZ2FuaXplKCkKICAgICAgICAgc2l6ZTIgPSBvcy5wYXRoLmdldHNpemUoZmlsZW5hbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzaXplMSA+IHNpemUyID49IHNpemUwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l6ZTEgPiBzaXplMiA+PSBzaXplMCkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQppbmRleCA1M2M0NjA3Li5jOGYzNTlkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKQEAgLTYsNyArNiw3IEBACiBjbGFzcyBBbGxDb21tb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCAiZm9vYmFyIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLmdldGN0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pIDw9CiAgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguZ2V0bXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IDliOTBhNjkuLmQ3ODY2Y2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtNjcsNjkgKzY3LDY5IEBACiAgICAgZGVmIHRlc3RfYihzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfYgogICAgICAgICAjIGIgcmV0dXJucyAndW5zaWduZWQgY2hhcicsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nICgwIC4uLiBVQ0hBUl9NQVgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdldGFyZ3NfYigzLjE0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfYihMb25nKCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19iKEludCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX2IoMy4xNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfYihMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2IoSW50KCkpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfYiwgLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfYigwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX2IoVUNIQVJfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX2IoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX2IoVUNIQVJfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19iLCBVQ0hBUl9NQVggKyAxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2IoNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19iKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfYig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfYig0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2IsIFZFUllfTEFSR0UpCiAKICAgICBkZWYgdGVzdF9CKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19CCiAgICAgICAgICMgQiByZXR1cm5zICd1bnNpZ25lZCBjaGFyJywgbm8gcmFuZ2UgY2hlY2tpbmcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19CKDMuMTQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19CKExvbmcoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX0IoSW50KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGdldGFyZ3NfQigzLjE0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19CKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfQihJbnQoKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoLTEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVQ0hBUl9NQVgsIGdldGFyZ3NfQigtMUwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0IoMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKFVDSEFSX01BWCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfQihVQ0hBUl9NQVgrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKC0xTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19CKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKFVDSEFSX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19CKFVDSEFSX01BWCsxKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19CKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfQig0MkwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVQ0hBUl9NQVggJiBWRVJZX0xBUkdFLCBnZXRhcmdzX0IoVkVSWV9MQVJHRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfQig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfQig0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCAmIFZFUllfTEFSR0UsIGdldGFyZ3NfQihWRVJZX0xBUkdFKSkKIAogICAgIGRlZiB0ZXN0X0goc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0gKICAgICAgICAgIyBIIHJldHVybnMgJ3Vuc2lnbmVkIHNob3J0Jywgbm8gcmFuZ2UgY2hlY2tpbmcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19IKDMuMTQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19IKExvbmcoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX0goSW50KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGdldGFyZ3NfSCgzLjE0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19IKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSChJbnQoKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVNIUlRfTUFYLCBnZXRhcmdzX0goLTEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0goMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVTSFJUX01BWCwgZ2V0YXJnc19IKFVTSFJUX01BWCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfSChVU0hSVF9NQVgrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVVNIUlRfTUFYLCBnZXRhcmdzX0goLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVU0hSVF9NQVgsIGdldGFyZ3NfSChVU0hSVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSChVU0hSVF9NQVgrMSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfSCg0MikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX0goNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19IKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19IKDQyTCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVkVSWV9MQVJHRSAmIFVTSFJUX01BWCwgZ2V0YXJnc19IKFZFUllfTEFSR0UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFZFUllfTEFSR0UgJiBVU0hSVF9NQVgsIGdldGFyZ3NfSChWRVJZX0xBUkdFKSkKIAogICAgIGRlZiB0ZXN0X0koc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0kKICAgICAgICAgIyBJIHJldHVybnMgJ3Vuc2lnbmVkIGludCcsIG5vIHJhbmdlIGNoZWNraW5nCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdldGFyZ3NfSSgzLjE0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfSShMb25nKCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19JKEludCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX0koMy4xNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSShMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0koSW50KCkpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koLTEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0koMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koVUlOVF9NQVgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0koVUlOVF9NQVgrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUlOVF9NQVgsIGdldGFyZ3NfSSgtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19JKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koVUlOVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSShVSU5UX01BWCsxKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19JKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfSSg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0koNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0koNDJMKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChWRVJZX0xBUkdFICYgVUlOVF9NQVgsIGdldGFyZ3NfSShWRVJZX0xBUkdFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChWRVJZX0xBUkdFICYgVUlOVF9NQVgsIGdldGFyZ3NfSShWRVJZX0xBUkdFKSkKIAogICAgIGRlZiB0ZXN0X2soc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2sKQEAgLTEzOSw2NCArMTM5LDY0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCBMb25nKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCBJbnQoKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVTE9OR19NQVgsIGdldGFyZ3NfaygtMSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfaygwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUxPTkdfTUFYLCBnZXRhcmdzX2soVUxPTkdfTUFYKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMCwgZ2V0YXJnc19rKFVMT05HX01BWCsxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVTE9OR19NQVgsIGdldGFyZ3NfaygtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19rKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMT05HX01BWCwgZ2V0YXJnc19rKFVMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19rKFVMT05HX01BWCsxKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19rKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3Nfayg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2soNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2soNDJMKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChWRVJZX0xBUkdFICYgVUxPTkdfTUFYLCBnZXRhcmdzX2soVkVSWV9MQVJHRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVkVSWV9MQVJHRSAmIFVMT05HX01BWCwgZ2V0YXJnc19rKFZFUllfTEFSR0UpKQogCiBjbGFzcyBTaWduZWRfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2koc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2kKICAgICAgICAgIyBpIHJldHVybnMgJ2ludCcsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nIChJTlRfTUlOIC4uLiBJTlRfTUFYKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX2koMy4xNCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX2koTG9uZygpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfaShJbnQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19pKDMuMTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2koTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19pKEludCgpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2ksIElOVF9NSU4tMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoSU5UX01JTiwgZ2V0YXJnc19pKElOVF9NSU4pKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChJTlRfTUFYLCBnZXRhcmdzX2koSU5UX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSU5UX01JTiwgZ2V0YXJnc19pKElOVF9NSU4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKElOVF9NQVgsIGdldGFyZ3NfaShJTlRfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19pLCBJTlRfTUFYKzEpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfaSg0MikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2koNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19pKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19pKDQyTCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfaSwgVkVSWV9MQVJHRSkKIAogICAgIGRlZiB0ZXN0X2woc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2wKICAgICAgICAgIyBsIHJldHVybnMgJ2xvbmcnLCBhbmQgZG9lcyByYW5nZSBjaGVja2luZyAoTE9OR19NSU4gLi4uIExPTkdfTUFYKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX2woMy4xNCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX2woTG9uZygpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfbChJbnQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19sKDMuMTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2woTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19sKEludCgpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIExPTkdfTUlOLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExPTkdfTUlOLCBnZXRhcmdzX2woTE9OR19NSU4pKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChMT05HX01BWCwgZ2V0YXJnc19sKExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMT05HX01JTiwgZ2V0YXJnc19sKExPTkdfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMT05HX01BWCwgZ2V0YXJnc19sKExPTkdfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19sLCBMT05HX01BWCsxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2woNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19sKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfbCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfbCg0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIFZFUllfTEFSR0UpCiAKICAgICBkZWYgdGVzdF9uKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19uCiAgICAgICAgICMgbiByZXR1cm5zICdQeV9zc2l6ZV90JywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcKICAgICAgICAgIyAoUFlfU1NJWkVfVF9NSU4gLi4uIFBZX1NTSVpFX1RfTUFYKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX24oMy4xNCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX24oTG9uZygpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfbihJbnQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19uKDMuMTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX24oTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19uKEludCgpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFBZX1NTSVpFX1RfTUlOLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBZX1NTSVpFX1RfTUlOLCBnZXRhcmdzX24oUFlfU1NJWkVfVF9NSU4pKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQWV9TU0laRV9UX01BWCwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQWV9TU0laRV9UX01JTiwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQWV9TU0laRV9UX01BWCwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBQWV9TU0laRV9UX01BWCsxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX24oNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19uKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfbig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfbig0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFZFUllfTEFSR0UpCiAKIApAQCAtMjA0LDE4ICsyMDQsMTggQEAKICAgICBkZWYgdGVzdF9MKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MCiAgICAgICAgICMgTCByZXR1cm5zICdsb25nIGxvbmcnLCBhbmQgZG9lcyByYW5nZSBjaGVja2luZyAoTExPTkdfTUlOIC4uLiBMTE9OR19NQVgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfTCwgIkhlbGxvIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19MKDMuMTQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19MKExvbmcoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX0woSW50KCkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfTCwgIkhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX0woMy4xNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfTChMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0woSW50KCkpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfTCwgTExPTkdfTUlOLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExMT05HX01JTiwgZ2V0YXJnc19MKExMT05HX01JTikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExMT05HX01BWCwgZ2V0YXJnc19MKExMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTExPTkdfTUlOLCBnZXRhcmdzX0woTExPTkdfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMTE9OR19NQVgsIGdldGFyZ3NfTChMTE9OR19NQVgpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX0wsIExMT05HX01BWCsxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX0woNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19MKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfTCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfTCg0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX0wsIFZFUllfTEFSR0UpCiAKICAgICBkZWYgdGVzdF9LKHNlbGYpOgpAQCAtMjI0LDE0ICsyMjQsMTQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0ssIDMuMTQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19LLCBMb25nKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19LLCBJbnQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUxMT05HX01BWCwgZ2V0YXJnc19LKFVMTE9OR19NQVgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0soMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfSyhVTExPTkdfTUFYKzEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMTE9OR19NQVgsIGdldGFyZ3NfSyhVTExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0soMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19LKFVMTE9OR19NQVgrMSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfSyg0MikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX0soNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19LKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19LKDQyTCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVkVSWV9MQVJHRSAmIFVMTE9OR19NQVgsIGdldGFyZ3NfSyhWRVJZX0xBUkdFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChWRVJZX0xBUkdFICYgVUxMT05HX01BWCwgZ2V0YXJnc19LKFZFUllfTEFSR0UpKQogCiAKIGNsYXNzIFR1cGxlX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0b3B0LnB5IGIvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkKaW5kZXggOTAzMTA1OC4uNDcyOTMwMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkKQEAgLTIzLDIxICsyMywyMSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhnZXRvcHQuR2V0b3B0RXJyb3IsICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiB0ZXN0X3Nob3J0X2hhc19hcmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhOicpKQotICAgICAgICBzZWxmLmZhaWxJZihnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhOicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdldG9wdC5zaG9ydF9oYXNfYXJnKCdhJywgJ2EnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQuc2hvcnRfaGFzX2FyZywgJ2EnLCAnYicpCiAKICAgICBkZWYgdGVzdF9sb25nX2hhc19hcmdzKHNlbGYpOgogICAgICAgICBoYXNfYXJnLCBvcHRpb24gPSBnZXRvcHQubG9uZ19oYXNfYXJncygnYWJjJywgWydhYmM9J10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNfYXJnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzX2FyZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24sICdhYmMnKQogCiAgICAgICAgIGhhc19hcmcsIG9wdGlvbiA9IGdldG9wdC5sb25nX2hhc19hcmdzKCdhYmMnLCBbJ2FiYyddKQotICAgICAgICBzZWxmLmZhaWxJZihoYXNfYXJnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc19hcmcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjJykKIAogICAgICAgICBoYXNfYXJnLCBvcHRpb24gPSBnZXRvcHQubG9uZ19oYXNfYXJncygnYWJjJywgWydhYmNkJ10pCi0gICAgICAgIHNlbGYuZmFpbElmKGhhc19hcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzX2FyZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24sICdhYmNkJykKIAogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5sb25nX2hhc19hcmdzLCAnYWJjJywgWydkZWYnXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQppbmRleCBkY2E5OWNiLi5kNjBlY2U3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CkBAIC0zMDYsNyArMzA2LDcgQEAKICAgICAgICAgc2VsZi5fID0gc2VsZi50LnVnZXR0ZXh0CiAKICAgICBkZWYgdGVzdF91bmljb2RlX21zZ2lkKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHNlbGYuXygnJyksIHVuaWNvZGUpKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzZWxmLl8odScnKSwgdW5pY29kZSkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCAxN2Y5ZjRjLi4yNzk2NmVkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC0zNiw4ICszNiw4IEBACiAgICAgICAgIGlmIG1heGludCA9PSAyMTQ3NDgzNjQ3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDctMSwgLTAyMDAwMDAwMDAwMCkKICAgICAgICAgICAgICMgWFhYIC0yMTQ3NDgzNjQ4Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMDM3Nzc3Nzc3Nzc3ID4gMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwMzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDB4ZmZmZmZmZmYgPiAwKQogICAgICAgICAgICAgZm9yIHMgaW4gJzIxNDc0ODM2NDgnLCAnMDQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJzoKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCkBAIC00NSw4ICs0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQogICAgICAgICBlbGlmIG1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSwgLTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQogICAgICAgICAgICAgZm9yIHMgaW4gJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCiAgICAgICAgICAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtODEsMTUgKzgxLDE1IEBACiAgICAgICAgIHggPSAzLjFlNAogCiAgICAgZGVmIHRlc3RTdHJpbmdMaXRlcmFscyhzZWxmKToKLSAgICAgICAgeCA9ICcnOyB5ID0gIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMCBhbmQgeCA9PSB5KQotICAgICAgICB4ID0gJ1wnJzsgeSA9ICInIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzOSkKLSAgICAgICAgeCA9ICciJzsgeSA9ICJcIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzQpCisgICAgICAgIHggPSAnJzsgeSA9ICIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDAgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICdcJyc7IHkgPSAiJyI7IHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCisgICAgICAgIHggPSAnIic7IHkgPSAiXCIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM0KQogICAgICAgICB4ID0gImRvZXNuJ3QgXCJzaHJpbmtcIiBkb2VzIGl0IgogICAgICAgICB5ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQogICAgICAgICB4ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgogICAgICAgICB5ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQogICAgICAgICB4ID0gIiIiCiBUaGUgInF1aWNrIgogYnJvd24gZm94CkBAIC01NTAsNyArNTUwLDcgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgnZXhlYyAuLi4gaW4gZyAoJXMpLCBsICglcyknICUoZyxsKSkKIAogICAgIGRlZiB0ZXN0QXNzZXJ0KHNlbGYpOgotICAgICAgICAjIGFzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgIyBhc3NlcnRUcnVlc3RtdDogJ2Fzc2VydCcgdGVzdCBbJywnIHRlc3RdCiAgICAgICAgIGFzc2VydCAxCiAgICAgICAgIGFzc2VydCAxLCAxCiAgICAgICAgIGFzc2VydCBsYW1iZGEgeDp4CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dycC5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CmluZGV4IGIzOGI5NGMuLjgyOWUxNWIgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CkBAIC0xMiwxMyArMTIsMTMgQEAKICAgICAgICAgIyBhdHRyaWJ1dGVzIHByb21pc2VkIGJ5IHRoZSBkb2NzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlKSwgNCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVswXSwgdmFsdWUuZ3JfbmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmFsdWUuZ3JfbmFtZSwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlLmdyX25hbWUsIGJhc2VzdHJpbmcpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzFdLCB2YWx1ZS5ncl9wYXNzd2QpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZhbHVlLmdyX3Bhc3N3ZCwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlLmdyX3Bhc3N3ZCwgYmFzZXN0cmluZykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMl0sIHZhbHVlLmdyX2dpZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmFsdWUuZ3JfZ2lkLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZS5ncl9naWQsIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbM10sIHZhbHVlLmdyX21lbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmFsdWUuZ3JfbWVtLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUuZ3JfbWVtLCBsaXN0KSkKIAogICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKICAgICAgICAgZW50cmllcyA9IGdycC5nZXRncmFsbCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2d6aXAucHkgYi9MaWIvdGVzdC90ZXN0X2d6aXAucHkKaW5kZXggYjcyNTBkYi4uOGFlMzFiMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nemlwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgTCA9IGYucmVhZGxpbmUobGluZV9sZW5ndGgpCiAgICAgICAgICAgICBpZiBMID09ICIiIGFuZCBsaW5lX2xlbmd0aCAhPSAwOiBicmVhawotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihMKSA8PSBsaW5lX2xlbmd0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oTCkgPD0gbGluZV9sZW5ndGgpCiAgICAgICAgICAgICBsaW5lX2xlbmd0aCA9IChsaW5lX2xlbmd0aCArIDEpICUgNTAKICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIGRlZiB0ZXN0XzE2NDc0ODQoc2VsZik6CiAgICAgICAgIGZvciBtb2RlIGluICgnd2InLCAncmInKToKICAgICAgICAgICAgIGYgPSBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsIG1vZGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihmLCAibmFtZSIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZiwgIm5hbWUiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5uYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgICAgICBmUmVhZCA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSkKICAgICAgICAgZGF0YVJlYWQgPSBmUmVhZC5yZWFkKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhUmVhZCwgZGF0YTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGZSZWFkLCAnbXRpbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZlJlYWQsICdtdGltZScpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZSZWFkLm10aW1lLCBtdGltZSkKICAgICAgICAgZlJlYWQuY2xvc2UoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hhc2gucHkgYi9MaWIvdGVzdC90ZXN0X2hhc2gucHkKaW5kZXggZmEwZmIyMy4uMThlYzA0ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9oYXNoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGFzaC5weQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICAgIG9iamVjdHMgPSAoc2VsZi5kZWZhdWx0X2V4cGVjdGVkICsKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpeGVkX2V4cGVjdGVkKQogICAgICAgICBmb3Igb2JqIGluIG9iamVjdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShvYmosIEhhc2hhYmxlKSwgcmVwcihvYmopKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob2JqLCBIYXNoYWJsZSksIHJlcHIob2JqKSkKIAogICAgIGRlZiB0ZXN0X25vdF9oYXNoYWJsZShzZWxmKToKICAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmVycm9yX2V4cGVjdGVkOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5IGIvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5CmluZGV4IGU3N2IyNDYuLjAxODM3MTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGFzaGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hhc2hsaWIucHkKQEAgLTM3LDEyICszNywxMiBAQAogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwID09ICJoYXNobGliIGRpZG4ndCByZWplY3QgYm9ndXMgaGFzaCBuYW1lIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwID09ICJoYXNobGliIGRpZG4ndCByZWplY3QgYm9ndXMgaGFzaCBuYW1lIikKIAogICAgIGRlZiB0ZXN0X2hleGRpZ2VzdChzZWxmKToKICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKICAgICAgICAgICAgIGggPSBoYXNobGliLm5ldyhuYW1lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhleHN0cihoLmRpZ2VzdCgpKSA9PSBoLmhleGRpZ2VzdCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhleHN0cihoLmRpZ2VzdCgpKSA9PSBoLmhleGRpZ2VzdCgpKQogCiAgICAgZGVmIHRlc3RfbGFyZ2VfdXBkYXRlKHNlbGYpOgogICAgICAgICBhYXMgPSAnYScgKiAxMjgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CmluZGV4IDdlM2M3YTEuLmUzNzczODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQpAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICBmb3IgcG9zLCBpdGVtIGluIGVudW1lcmF0ZShoZWFwKToKICAgICAgICAgICAgIGlmIHBvczogIyBwb3MgMCBoYXMgbm8gcGFyZW50CiAgICAgICAgICAgICAgICAgcGFyZW50cG9zID0gKHBvcy0xKSA+PiAxCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhlYXBbcGFyZW50cG9zXSA8PSBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoZWFwW3BhcmVudHBvc10gPD0gaXRlbSkKIAogICAgIGRlZiB0ZXN0X2hlYXBpZnkoc2VsZik6CiAgICAgICAgIGZvciBzaXplIGluIHJhbmdlKDMwKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaG1hYy5weSBiL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQppbmRleCBkOTc1ODNmLi4zMGJiNGZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2htYWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9obWFjLnB5CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgIyBUZXN0aW5nIGlmIEhNQUMgZGVmYXVsdHMgdG8gTUQ1IGFsZ29yaXRobS4KICAgICAgICAgIyBOT1RFOiB0aGlzIHdoaXRlYm94IHRlc3QgZGVwZW5kcyBvbiB0aGUgaG1hYyBjbGFzcyBpbnRlcm5hbHMKICAgICAgICAgaCA9IGhtYWMuSE1BQygia2V5IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGguZGlnZXN0X2NvbnMgPT0gaGFzaGxpYi5tZDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmRpZ2VzdF9jb25zID09IGhhc2hsaWIubWQ1KQogCiAgICAgZGVmIHRlc3RfZXhlcmNpc2VfYWxsX21ldGhvZHMoc2VsZik6CiAgICAgICAgICMgRXhlcmNpc2luZyBhbGwgbWV0aG9kcyBvbmNlLgpAQCAtMjgwLDExICsyODAsMTEgQEAKICAgICAgICAgIyBUZXN0aW5nIGlmIGF0dHJpYnV0ZXMgYXJlIG9mIHNhbWUgdHlwZS4KICAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCiAgICAgICAgIGgyID0gaDEuY29weSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoMS5kaWdlc3RfY29ucyA9PSBoMi5kaWdlc3RfY29ucywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGgxLmRpZ2VzdF9jb25zID09IGgyLmRpZ2VzdF9jb25zLAogICAgICAgICAgICAgImRpZ2VzdCBjb25zdHJ1Y3RvcnMgZG9uJ3QgbWF0Y2guIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoaDEuaW5uZXIpID09IHR5cGUoaDIuaW5uZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShoMS5pbm5lcikgPT0gdHlwZShoMi5pbm5lciksCiAgICAgICAgICAgICAiVHlwZXMgb2YgaW5uZXIgZG9uJ3QgbWF0Y2guIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoaDEub3V0ZXIpID09IHR5cGUoaDIub3V0ZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShoMS5vdXRlcikgPT0gdHlwZShoMi5vdXRlciksCiAgICAgICAgICAgICAiVHlwZXMgb2Ygb3V0ZXIgZG9uJ3QgbWF0Y2guIikKIAogICAgIGRlZiB0ZXN0X3JlYWxjb3B5KHNlbGYpOgpAQCAtMjkyLDEwICsyOTIsMTAgQEAKICAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCiAgICAgICAgIGgyID0gaDEuY29weSgpCiAgICAgICAgICMgVXNpbmcgaWQoKSBpbiBjYXNlIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIF9fY21wX18uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMSkgIT0gaWQoaDIpLCAiTm8gcmVhbCBjb3B5IG9mIHRoZSBITUFDIGluc3RhbmNlLiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMS5pbm5lcikgIT0gaWQoaDIuaW5uZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEpICE9IGlkKGgyKSwgIk5vIHJlYWwgY29weSBvZiB0aGUgSE1BQyBpbnN0YW5jZS4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEuaW5uZXIpICE9IGlkKGgyLmlubmVyKSwKICAgICAgICAgICAgICJObyByZWFsIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZSAnaW5uZXInLiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMS5vdXRlcikgIT0gaWQoaDIub3V0ZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEub3V0ZXIpICE9IGlkKGgyLm91dGVyKSwKICAgICAgICAgICAgICJObyByZWFsIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZSAnb3V0ZXInLiIpCiAKICAgICBkZWYgdGVzdF9lcXVhbGl0eShzZWxmKToKQEAgLTMwMyw5ICszMDMsOSBAQAogICAgICAgICBoMSA9IGhtYWMuSE1BQygia2V5IikKICAgICAgICAgaDEudXBkYXRlKCJzb21lIHJhbmRvbSB0ZXh0IikKICAgICAgICAgaDIgPSBoMS5jb3B5KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGgxLmRpZ2VzdCgpID09IGgyLmRpZ2VzdCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuZGlnZXN0KCkgPT0gaDIuZGlnZXN0KCksCiAgICAgICAgICAgICAiRGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBkaWdlc3QuIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGgxLmhleGRpZ2VzdCgpID09IGgyLmhleGRpZ2VzdCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuaGV4ZGlnZXN0KCkgPT0gaDIuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAiSGV4ZGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBoZXhkaWdlc3QuIikKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5IGIvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5CmluZGV4IGZhNmIyZjEuLjM4YThkZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaG90c2hvdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hvdHNob3QucHkKQEAgLTY0LDExICs2NCwxMSBAQAogICAgIGRlZiBydW5fdGVzdChzZWxmLCBjYWxsYWJsZSwgZXZlbnRzLCBwcm9maWxlcj1Ob25lKToKICAgICAgICAgaWYgcHJvZmlsZXIgaXMgTm9uZToKICAgICAgICAgICAgIHByb2ZpbGVyID0gc2VsZi5uZXdfcHJvZmlsZXIoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHByb2ZpbGVyLl9wcm9mLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm9maWxlci5fcHJvZi5jbG9zZWQpCiAgICAgICAgIHByb2ZpbGVyLnJ1bmNhbGwoY2FsbGFibGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgcHJvZmlsZXIuX3Byb2YuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb2ZpbGVyLl9wcm9mLmNsb3NlZCkKICAgICAgICAgcHJvZmlsZXIuY2xvc2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHJvZmlsZXIuX3Byb2YuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZmlsZXIuX3Byb2YuY2xvc2VkKQogICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhldmVudHMpCiAKICAgICBkZWYgdGVzdF9hZGRpbmZvKHNlbGYpOgpAQCAtODAsNyArODAsNyBAQAogICAgICAgICBsb2cgPSBzZWxmLmdldF9sb2dyZWFkZXIoKQogICAgICAgICBpbmZvID0gbG9nLl9pbmZvCiAgICAgICAgIGxpc3QobG9nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5mb1sidGVzdC1rZXkiXSA9PSBbInRlc3QtdmFsdWUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluZm9bInRlc3Qta2V5Il0gPT0gWyJ0ZXN0LXZhbHVlIl0pCiAKICAgICBkZWYgdGVzdF9saW5lX251bWJlcnMoc2VsZik6CiAgICAgICAgIGRlZiBmKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKaW5kZXggNTRhMmIwZS4uNzdlOTg4NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQpAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgICAgIEhUVFBDb25uZWN0aW9uIGFuZCBpbnRvIHRoZSBzb2NrZXQuCiAgICAgICAgICcnJwogICAgICAgICAjIGRlZmF1bHQgLS0gdXNlIGdsb2JhbCBzb2NrZXQgdGltZW91dAotICAgICAgICBzZWxmLmFzc2VydF8oc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaHR0cENvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQpCkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgaHR0cENvbm4uY2xvc2UoKQogCiAgICAgICAgICMgbm8gdGltZW91dCAtLSBkbyBub3QgdXNlIGdsb2JhbCBzb2NrZXQgZGVmYXVsdAotICAgICAgICBzZWxmLmFzc2VydF8oc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaHR0cENvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQppbmRleCA2ZWRjN2QzLi4yMjhkODJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKQEAgLTIxNiw5ICsyMTYsOSBAQAogCiAgICAgZGVmIGNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHNlbGYsIHJlc3BvbnNlLCBzdGF0dXMsIGRhdGE9Tm9uZSk6CiAgICAgICAgIGJvZHkgPSByZXNwb25zZS5yZWFkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlc3BvbnNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcG9uc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLnN0YXR1cywgc3RhdHVzKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVzcG9uc2UucmVhc29uICE9IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFzb24gIT0gTm9uZSkKICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYm9keSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXAucHkgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQppbmRleCBjOTY4MmFiLi5mNGExNjQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQpAQCAtOCw3ICs4LDcgQEAKICAgICAiIiJWZXJ5IGJhc2ljIHRlc3Qgb2YgaW1wb3J0IGxvY2sgZnVuY3Rpb25zLiIiIgogCiAgICAgZGVmIHZlcmlmeV9sb2NrX3N0YXRlKHNlbGYsIGV4cGVjdGVkKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaW1wLmxvY2tfaGVsZCgpLCBleHBlY3RlZCwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbXAubG9ja19oZWxkKCksIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaW1wLmxvY2tfaGVsZCgpIHRvIGJlICVyIiAlIGV4cGVjdGVkKQogICAgIGRlZiB0ZXN0TG9jayhzZWxmKToKICAgICAgICAgTE9PUFMgPSA1MApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQppbmRleCBlMTA3OTMxLi45Yjc1YjA0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBzeXMubW9kdWxlcywgImV4cGVjdGVkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoVEVTVEZOIGluIHN5cy5tb2R1bGVzLCAiZXhwZWN0ZWQgbW9kdWxlIGluIHN5cy5tb2R1bGVzIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5hLCAxLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5iLCAyLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAKICAgICAgICAgICAgICMgQnV0IHdlIHN0aWxsIGV4cGVjdCB0aGUgbW9kdWxlIHRvIGJlIGluIHN5cy5tb2R1bGVzLgogICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXMuZ2V0KFRFU1RGTikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKG1vZCBpcyBOb25lLCAiZXhwZWN0ZWQgbW9kdWxlIHRvIHN0aWxsIGJlIGluIHN5cy5tb2R1bGVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobW9kIGlzIE5vbmUsICJleHBlY3RlZCBtb2R1bGUgdG8gc3RpbGwgYmUgaW4gc3lzLm1vZHVsZXMiKQogCiAgICAgICAgICAgICAjIFdlIHNob3VsZCBoYXZlIHJlcGxhY2VkIGEgdy8gMTAsIGJ1dCB0aGUgb2xkIGIgdmFsdWUgc2hvdWxkCiAgICAgICAgICAgICAjIHN0aWNrLgpAQCAtMjA4LDEyICsyMDgsMTIgQEAKICAgICAgICAgIyBpbXBvcnQgeC55LnogYmluZHMgeCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UKICAgICAgICAgaW1wb3J0IHRlc3QgYXMgeAogICAgICAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgdGVzdCwgeC5fX25hbWVfXykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIodGVzdC50ZXN0X3N1cHBvcnQsICJfX2ZpbGVfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyB0ZXN0LCB4Ll9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih0ZXN0LnRlc3Rfc3VwcG9ydCwgIl9fZmlsZV9fIikpCiAKICAgICAgICAgIyBpbXBvcnQgeC55LnogYXMgdyBiaW5kcyB6IGFzIHcKICAgICAgICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0IGFzIHkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgdGVzdC50ZXN0X3N1cHBvcnQsIHkuX19uYW1lX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHRlc3QudGVzdF9zdXBwb3J0LCB5Ll9fbmFtZV9fKQogCiAgICAgZGVmIHRlc3RfaW1wb3J0X2luaXRsZXNzX2RpcmVjdG9yeV93YXJuaW5nKHNlbGYpOgogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CkBAIC0zOTQsMTQgKzM5NCwxNCBAQAogICAgICAgICBucyA9IGRpY3QoX19wYWNrYWdlX189J2ZvbycsIF9fbmFtZV9fPSd0ZXN0Lm5vdGFyZWFsbW9kdWxlJykKICAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygpIGFzIHc6CiAgICAgICAgICAgICBjaGVja19hYnNvbHV0ZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ2ZvbycgaW4gc3RyKHcubWVzc2FnZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ZvbycgaW4gc3RyKHcubWVzc2FnZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcuY2F0ZWdvcnksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvciwgY2hlY2tfcmVsYXRpdmUpCiAgICAgICAgICMgQ2hlY2sgcmVsYXRpdmUgZmFpbHMgd2l0aCBfX3BhY2thZ2VfXyBhbmQgX19uYW1lX18gd3JvbmcKICAgICAgICAgbnMgPSBkaWN0KF9fcGFja2FnZV9fPSdmb28nLCBfX25hbWVfXz0nbm90YXJlYWxwa2cubm90YXJlYWxtb2R1bGUnKQogICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKICAgICAgICAgICAgIGNoZWNrX2Fic29sdXRlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnZm9vJyBpbiBzdHIody5tZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZm9vJyBpbiBzdHIody5tZXNzYWdlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody5jYXRlZ29yeSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yLCBjaGVja19yZWxhdGl2ZSkKICAgICAgICAgIyBDaGVjayBib3RoIGZhaWwgd2l0aCBwYWNrYWdlIHNldCB0byBhIG5vbi1zdHJpbmcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5CmluZGV4IDY0M2VjY2UuLjdmZDhjNjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weQpAQCAtMTc3LDExICsxNzcsMTEgQEAKIAogICAgICAgICBUZXN0SW1wb3J0ZXIubW9kdWxlc1sncmVsb2FkbW9kdWxlJ10gPSAoRmFsc2UsIHRlc3RfY28pCiAgICAgICAgIGltcG9ydCByZWxvYWRtb2R1bGUKLSAgICAgICAgc2VsZi5mYWlsSWYoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCiAKICAgICAgICAgVGVzdEltcG9ydGVyLm1vZHVsZXNbJ3JlbG9hZG1vZHVsZSddID0gKEZhbHNlLCByZWxvYWRfY28pCiAgICAgICAgIHJlbG9hZChyZWxvYWRtb2R1bGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKHJlbG9hZG1vZHVsZSwncmVsb2FkZWQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVsb2FkbW9kdWxlLCdyZWxvYWRlZCcpKQogCiAgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uub2xkYWJzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLm9sZGFicy5nZXRfbmFtZSgpLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbmRleC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkKaW5kZXggNzVmMjQzNC4uMmU5OTdjNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbmRleC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luZGV4LnB5CkBAIC02MCwxMCArNjAsMTAgQEAKICAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKICAgICAgICAgc2VsZi5vLmluZCA9ICdkdW1iJwogICAgICAgICBzZWxmLm4uaW5kID0gJ2JhZCcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgc2xpY2Uoc2VsZi5vKS5pbmRpY2VzLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBzbGljZShzZWxmLm4pLmluZGljZXMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleCwgc2VsZi5uKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlKHNlbGYubykuaW5kaWNlcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZShzZWxmLm4pLmluZGljZXMsIDApCiAKIAogY2xhc3MgU2VxVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTE1LDExICsxMTUsMTEgQEAKICAgICAgICAgc2VsZi5vLmluZCA9ICdkdW1iJwogICAgICAgICBzZWxmLm4uaW5kID0gJ2JhZCcKICAgICAgICAgaW5kZXhvYmogPSBsYW1iZGEgeCwgb2JqOiBvYmouc2VxW3hdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGluZGV4b2JqLCBzZWxmLm8sIHNlbGYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGluZGV4b2JqLCBzZWxmLm4sIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW5kZXhvYmosIHNlbGYubywgc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbmRleG9iaiwgc2VsZi5uLCBzZWxmKQogICAgICAgICBzbGljZW9iaiA9IGxhbWJkYSB4LCBvYmo6IG9iai5zZXFbeDpdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNsaWNlb2JqLCBzZWxmLm8sIHNlbGYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNsaWNlb2JqLCBzZWxmLm4sIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2VvYmosIHNlbGYubywgc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZW9iaiwgc2VsZi5uLCBzZWxmKQogCiAKIGNsYXNzIExpc3RUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTFdCiAgICAgICAgIGwyID0gbHN0Ll9faW11bF9fKHNlbGYubikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGwyIGlzIGxzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwyIGlzIGxzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFs1LCA2LCA3LCA4LCA5LCAxMV0gKiAzKQogCiAKQEAgLTIwNiw4ICsyMDYsOCBAQAogICAgICAgICBzZWxmLl9nZXRpdGVtX2hlbHBlcihFbXB0eSkKIAogICAgIGRlZiB0ZXN0X3NlcXVlbmNlX3JlcGVhdChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKE92ZXJmbG93RXJyb3IsIGxhbWJkYTogImEiICogc2VsZi5wb3MpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYubmVnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYucG9zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYubmVnKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCAxNDRmODljLi5lNGM0ZWU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC00MywxMyArNDMsMTMgQEAKIAogICAgIGRlZiBpc3Rlc3Qoc2VsZiwgcHJlZGljYXRlLCBleHApOgogICAgICAgICBvYmogPSBldmFsKGV4cCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByZWRpY2F0ZShvYmopLCAnJXMoJXMpJyAlIChwcmVkaWNhdGUuX19uYW1lX18sIGV4cCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmVkaWNhdGUob2JqKSwgJyVzKCVzKScgJSAocHJlZGljYXRlLl9fbmFtZV9fLCBleHApKQogCiAgICAgICAgIGZvciBvdGhlciBpbiBzZWxmLnByZWRpY2F0ZXMgLSBzZXQoW3ByZWRpY2F0ZV0pOgogICAgICAgICAgICAgaWYgcHJlZGljYXRlID09IGluc3BlY3QuaXNnZW5lcmF0b3JmdW5jdGlvbiBhbmRcCiAgICAgICAgICAgICAgICBvdGhlciA9PSBpbnNwZWN0LmlzZnVuY3Rpb246CiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKG90aGVyKG9iaiksICdub3QgJXMoJXMpJyAlIChvdGhlci5fX25hbWVfXywgZXhwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3RoZXIob2JqKSwgJ25vdCAlcyglcyknICUgKG90aGVyLl9fbmFtZV9fLCBleHApKQogCiBkZWYgZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUoc2VsZik6CiAgICAgZm9yIGkgaW4geHJhbmdlKDIpOgpAQCAtODMsMTUgKzgzLDE1IEBACiAgICAgICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlKHRiLnRiX2ZyYW1lKS5mX2xvY2FscycpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcih0eXBlKHRiLnRiX2ZyYW1lKS5mX2xvY2FscykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yKHR5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzKSkKICAgICAgICAgaWYgaGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyk6CiAgICAgICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvciwgJ2RhdGV0aW1lLnRpbWVkZWx0YS5kYXlzJykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKGRhdGV0aW1lLnRpbWVkZWx0YS5kYXlzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3IoZGF0ZXRpbWUudGltZWRlbHRhLmRheXMpKQogCiAgICAgZGVmIHRlc3RfaXNyb3V0aW5lKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaW5zcGVjdC5pc3JvdXRpbmUobW9kLnNwYW0pKQotICAgICAgICBzZWxmLmFzc2VydF8oaW5zcGVjdC5pc3JvdXRpbmUoW10uY291bnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5zcGVjdC5pc3JvdXRpbmUobW9kLnNwYW0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5zcGVjdC5pc3JvdXRpbmUoW10uY291bnQpKQogCiAgICAgZGVmIHRlc3RfaXNjbGFzcyhzZWxmKToKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2NsYXNzLCAnbW9kLlN0dXBpZEdpdCcpCkBAIC0xMTIsOCArMTEyLDggQEAKICAgICAgICAgeCA9IEMoKQogICAgICAgICB4LmEgPSA0MgogICAgICAgICBtZW1iZXJzID0gZGljdChpbnNwZWN0LmdldG1lbWJlcnMoeCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gbWVtYmVycykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdiJyBub3QgaW4gbWVtYmVycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiBtZW1iZXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2InIG5vdCBpbiBtZW1iZXJzKQogCiAKIGNsYXNzIFRlc3RJbnRlcnByZXRlclN0YWNrKElzVGVzdEJhc2UpOgpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNmcmFtZSwgJ21vZC5mcicpCiAKICAgICBkZWYgdGVzdF9zdGFjayhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihtb2Quc3QpID49IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obW9kLnN0KSA+PSA1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5zdFswXVsxOl0sCiAgICAgICAgICAgICAgKG1vZGZpbGUsIDE2LCAnZWdncycsIFsnICAgIHN0ID0gaW5zcGVjdC5zdGFjaygpXG4nXSwgMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnN0WzFdWzE6XSwKQEAgLTQxOSwyMyArNDE5LDIzIEBACiAgICAgICAgICAgICBkYXRhYmxvYiA9ICcxJwogCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhBKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCiAKICAgICAgICAgY2xhc3MgQihBKToKICAgICAgICAgICAgIGRlZiBtKHNlbGYpOiBwYXNzCiAKICAgICAgICAgYXR0cnMgPSBhdHRyc193b19vYmpzKEIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20xJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtJywgJ21ldGhvZCcsIEIpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKIAogCiAgICAgICAgIGNsYXNzIEMoQSk6CkBAIC00NDMsMjMgKzQ0MywyMyBAQAogICAgICAgICAgICAgZGVmIGMoc2VsZik6IHBhc3MKIAogICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoQykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdjJywgJ21ldGhvZCcsIEMpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbScsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnYycsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20nLCAnbWV0aG9kJywgQykgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20xJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQogCiAgICAgICAgIGNsYXNzIEQoQiwgQyk6CiAgICAgICAgICAgICBkZWYgbTEoc2VsZik6IHBhc3MKIAogICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoRCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbScsICdtZXRob2QnLCBCKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbTEnLCAnbWV0aG9kJywgRCkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20xJywgJ21ldGhvZCcsIEQpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQogCiAgICAgIyBSZXBlYXQgYWxsIHRoYXQsIGJ1dCB3LyBuZXctc3R5bGUgY2xhc3Nlcy4KICAgICBkZWYgdGVzdF9jbGFzc2lmeV9uZXdzdHlsZShzZWxmKToKQEAgLTQ4MSwyNCArNDgxLDI0IEBACiAgICAgICAgICAgICBkYXRhYmxvYiA9ICcxJwogCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhBKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCiAKICAgICAgICAgY2xhc3MgQihBKToKIAogICAgICAgICAgICAgZGVmIG0oc2VsZik6IHBhc3MKIAogICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoQikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbScsICdtZXRob2QnLCBCKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20xJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQogCiAKICAgICAgICAgY2xhc3MgQyhBKToKQEAgLTUwNywyNCArNTA3LDI0IEBACiAgICAgICAgICAgICBkZWYgYyhzZWxmKTogcGFzcwogCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhDKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2MnLCAnbWV0aG9kJywgQykgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtJywgJ21ldGhvZCcsIEMpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdjJywgJ21ldGhvZCcsIEMpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbScsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCiAKICAgICAgICAgY2xhc3MgRChCLCBDKToKIAogICAgICAgICAgICAgZGVmIG0xKHNlbGYpOiBwYXNzCiAKICAgICAgICAgYXR0cnMgPSBhdHRyc193b19vYmpzKEQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnYycsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20xJywgJ21ldGhvZCcsIEQpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2MnLCAnbWV0aG9kJywgQykgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtJywgJ21ldGhvZCcsIEIpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtMScsICdtZXRob2QnLCBEKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUZXN0RGVjb3JhdG9ycywgVGVzdFJldHJpZXZpbmdTb3VyY2VDb2RlLCBUZXN0T25lbGluZXJzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnQucHkgYi9MaWIvdGVzdC90ZXN0X2ludC5weQppbmRleCA1MTRhOThlLi5lNGNhYzBjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ludC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ludC5weQpAQCAtNzYsMTUgKzc2LDE1IEBACiAgICAgICAgIHMgPSByZXByKC0xLXN5cy5tYXhpbnQpCiAgICAgICAgIHggPSBpbnQocykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4KzEsIC1zeXMubWF4aW50KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4LCBpbnQpKQogICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChzWzE6XSksIHN5cy5tYXhpbnQrMSkKIAogICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZwogICAgICAgICB4ID0gaW50KDFlMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgbG9uZykpCiAgICAgICAgIHggPSBpbnQoLTFlMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgbG9uZykpCiAKIAogICAgICAgICAjIFNGIGJ1ZyA0MzQxODY6ICAweDgwMDAwMDAwLzIgIT0gMHg4MDAwMDAwMD4+MS4KQEAgLTEwMiwxMSArMTAyLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEyM1x4MDAgMjQ1JywgMjApCiAKICAgICAgICAgeCA9IGludCgnMScgKiA2MDApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHgsIGxvbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4LCBsb25nKSkKIAogICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CiAgICAgICAgICAgICB4ID0gaW50KHVuaWNocigweDY2MSkgKiA2MDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBsb25nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIGxvbmcpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50LCAxLCAxMikKIApAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIGxlbihiaW4oeCkubHN0cmlwKCctMGInKSkpCiAgICAgICAgICAgICAjIEJlaGF2aW91ciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRvY3MKICAgICAgICAgICAgIGlmIHggIT0gMDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqKGstMSkgPD0gYWJzKHgpIDwgMioqaykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqKGstMSkgPD0gYWJzKHgpIDwgMioqaykKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAwKQogICAgICAgICAgICAgIyBBbHRlcm5hdGl2ZSBkZWZpbml0aW9uOiB4LmJpdF9sZW5ndGgoKSA9PSAxICsgZmxvb3IobG9nXzIoeCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lvLnB5IGIvTGliL3Rlc3QvdGVzdF9pby5weQppbmRleCAzNzUxZTZmLi43NmNlMzQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKQEAgLTM5Niw3ICszOTYsNyBAQAogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgImFiIikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDMpCiAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiYSIpIGFzIGY6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZi50ZWxsKCkgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYudGVsbCgpID4gMCkKIAogICAgIGRlZiB0ZXN0X2Rlc3RydWN0b3Ioc2VsZik6CiAgICAgICAgIHJlY29yZCA9IFtdCkBAIC01MTQsNyArNTE0LDcgQEAKICAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihmKQogICAgICAgICBkZWwgZgogICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQotICAgICAgICBzZWxmLmFzc2VydF8od3IoKSBpcyBOb25lLCB3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCiAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJhYmN4eHgiKQogCkBAIC02MjIsOCArNjIyLDggQEAKICAgICAgICAgaWYgczoKICAgICAgICAgICAgICMgVGhlIGRlc3RydWN0b3IgKm1heSogaGF2ZSBwcmludGVkIGFuIHVucmFpc2FibGUgZXJyb3IsIGNoZWNrIGl0CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzLnNwbGl0bGluZXMoKSksIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocy5zdGFydHN3aXRoKCJFeGNlcHRpb24gSU9FcnJvcjogIiksIHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocy5lbmRzd2l0aCgiIGlnbm9yZWQiKSwgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoIkV4Y2VwdGlvbiBJT0Vycm9yOiAiKSwgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCIgaWdub3JlZCIpLCBzKQogCiAgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKICAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQpAQCAtNzIwLDcgKzcyMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiZSIsIGJ1ZmlvLnJlYWQoMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiZmciLCBidWZpby5yZWFkKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiIiwgYnVmaW8ucGVlaygxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKE5vbmUgaXMgYnVmaW8ucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTm9uZSBpcyBidWZpby5yZWFkKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiIiwgYnVmaW8ucmVhZCgpKQogCiAgICAgZGVmIHRlc3RfcmVhZF9wYXN0X2VvZihzZWxmKToKQEAgLTgyMiw3ICs4MjIsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKGYpCiAgICAgICAgIGRlbCBmCiAgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3cigpIGlzIE5vbmUsIHdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKIAogY2xhc3MgUHlCdWZmZXJlZFJlYWRlclRlc3QoQnVmZmVyZWRSZWFkZXJUZXN0KToKICAgICB0cCA9IHB5aW8uQnVmZmVyZWRSZWFkZXIKQEAgLTg3MSw3ICs4NzEsNyBAQAogICAgICAgICBmbHVzaGVkID0gYiIiLmpvaW4od3JpdGVyLl93cml0ZV9zdGFjaykKICAgICAgICAgIyBBdCBsZWFzdCAodG90YWwgLSA4KSBieXRlcyB3ZXJlIGltcGxpY2l0bHkgZmx1c2hlZCwgcGVyaGFwcyBtb3JlCiAgICAgICAgICMgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgc2VsZi5hc3NlcnRfKGZsdXNoZWQuc3RhcnRzd2l0aChjb250ZW50c1s6LThdKSwgZmx1c2hlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsdXNoZWQuc3RhcnRzd2l0aChjb250ZW50c1s6LThdKSwgZmx1c2hlZCkKIAogICAgIGRlZiBjaGVja193cml0ZXMoc2VsZiwgaW50ZXJtZWRpYXRlX2Z1bmMpOgogICAgICAgICAjIExvdHMgb2Ygd3JpdGVzLCB0ZXN0IHRoZSBmbHVzaGVkIG91dHB1dCBpcyBhcyBleHBlY3RlZC4KQEAgLTEwODMsNyArMTA4Myw3IEBACiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoZikKICAgICAgICAgZGVsIGYKICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKQogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiMTIzeHh4IikKIApAQCAtMTU3Myw3ICsxNTczLDcgQEAKICAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0idXRmOCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5lbmNvZGluZywgInV0ZjgiKQogICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0LmVuY29kaW5nIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC5lbmNvZGluZyBpcyBub3QgTm9uZSkKICAgICAgICAgY29kZWNzLmxvb2t1cCh0LmVuY29kaW5nKQogCiAgICAgZGVmIHRlc3RfZW5jb2RpbmdfZXJyb3JzX3JlYWRpbmcoc2VsZik6CkBAIC0xNzQzLDggKzE3NDMsOCBAQAogICAgICAgICBpZiBzOgogICAgICAgICAgICAgIyBUaGUgZGVzdHJ1Y3RvciAqbWF5KiBoYXZlIHByaW50ZWQgYW4gdW5yYWlzYWJsZSBlcnJvciwgY2hlY2sgaXQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMuc3BsaXRsaW5lcygpKSwgMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzLnN0YXJ0c3dpdGgoIkV4Y2VwdGlvbiBJT0Vycm9yOiAiKSwgcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzLmVuZHN3aXRoKCIgaWdub3JlZCIpLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiRXhjZXB0aW9uIElPRXJyb3I6ICIpLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoIiBpZ25vcmVkIiksIHMpCiAKICAgICAjIFN5c3RlbWF0aWMgdGVzdHMgb2YgdGhlIHRleHQgSS9PIEFQSQogCkBAIC0yMDY0LDcgKzIwNjQsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKHQpCiAgICAgICAgIGRlbCB0CiAgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3cigpIGlzIE5vbmUsIHdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIjQ1NmRlZiIpCiAKQEAgLTIyODgsNyArMjI4OCw3IEBACiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoYykKICAgICAgICAgZGVsIGMsIGIKICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKQogCiAgICAgZGVmIHRlc3RfYWJjcyhzZWxmKToKICAgICAgICAgIyBUZXN0IHRoZSB2aXNpYmxlIGJhc2UgY2xhc3NlcyBhcmUgQUJDcy4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW9jdGwucHkgYi9MaWIvdGVzdC90ZXN0X2lvY3RsLnB5CmluZGV4IDgyM2Q5NTQuLmI5OTYyMTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW9jdGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pb2N0bC5weQpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICB0dHkgPSBvcGVuKCIvZGV2L3R0eSIsICJyIikKICAgICAgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsICIgICAgIikKICAgICAgICAgcnBncnAgPSBzdHJ1Y3QudW5wYWNrKCJpIiwgcilbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRfKHJwZ3JwIGluIGlkcywgIiVzIG5vdCBpbiAlcyIgJSAocnBncnAsIGlkcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShycGdycCBpbiBpZHMsICIlcyBub3QgaW4gJXMiICUgKHJwZ3JwLCBpZHMpKQogCiAgICAgZGVmIHRlc3RfaW9jdGxfbXV0YXRlKHNlbGYpOgogICAgICAgICBpbXBvcnQgYXJyYXkKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsIGJ1ZiwgMSkKICAgICAgICAgcnBncnAgPSBidWZbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMociwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJwZ3JwIGluIGlkcywgIiVzIG5vdCBpbiAlcyIgJSAocnBncnAsIGlkcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShycGdycCBpbiBpZHMsICIlcyBub3QgaW4gJXMiICUgKHJwZ3JwLCBpZHMpKQogCiAgICAgZGVmIHRlc3RfaW9jdGxfc2lnbmVkX3Vuc2lnbmVkX2NvZGVfcGFyYW0oc2VsZik6CiAgICAgICAgIGlmIG5vdCBwdHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKaW5kZXggZTg0NzAxOC4uZjVkNmU2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICBzZXEgPSByYW5nZSgxMCkKICAgICAgICAgaXQgPSBpdGVyKHNlcSkKICAgICAgICAgaXQyID0gaXRlcihpdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGl0IGlzIGl0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0IGlzIGl0MikKIAogICAgICMgVGVzdCB0aGF0IGZvciBsb29wcyBvdmVyIGl0ZXJhdG9ycyB3b3JrCiAgICAgZGVmIHRlc3RfaXRlcl9mb3JfbG9vcChzZWxmKToKQEAgLTU2NiwyMyArNTY2LDIzIEBACiAgICAgZGVmIHRlc3RfaW5fYW5kX25vdF9pbihzZWxmKToKICAgICAgICAgZm9yIHNjNSBpbiBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDUpLCBTZXF1ZW5jZUNsYXNzKDUpOgogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gc2M1KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIGluIHNjNSkKICAgICAgICAgICAgIGZvciBpIGluICJhYmMiLCAtMSwgNSwgNDIuNDIsICgzLCA0KSwgW10sIHsxOiAxfSwgMy0xMmosIHNjNToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaSBub3QgaW4gc2M1KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIG5vdCBpbiBzYzUpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IDMgaW4gMTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAzIG5vdCBpbiBtYXApCiAKICAgICAgICAgZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDMsIDFqOiAyan0KICAgICAgICAgZm9yIGsgaW4gZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIGQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oayBub3QgaW4gZC5pdGVydmFsdWVzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIGQuaXRlcnZhbHVlcygpKQogICAgICAgICBmb3IgdiBpbiBkLnZhbHVlcygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gZC5pdGVydmFsdWVzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBub3QgaW4gZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIGQuaXRlcnZhbHVlcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgbm90IGluIGQpCiAgICAgICAgIGZvciBrLCB2IGluIGQuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oKGssIHYpIGluIGQuaXRlcml0ZW1zKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oKHYsIGspIG5vdCBpbiBkLml0ZXJpdGVtcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChrLCB2KSBpbiBkLml0ZXJpdGVtcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh2LCBrKSBub3QgaW4gZC5pdGVyaXRlbXMoKSkKIAogICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKICAgICAgICAgdHJ5OgpAQCAtNTkzLDkgKzU5Myw5IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZvciBjaHVuayBpbiAiYWJjIjoKICAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY2h1bmsgbm90IGluIGYpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNodW5rIG5vdCBpbiBmKQogICAgICAgICAgICAgICAgIGYuc2VlaygwLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygoY2h1bmsgKyAiXG4iKSBpbiBmKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoY2h1bmsgKyAiXG4iKSBpbiBmKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CmluZGV4IDMxZDEwZGMuLmY4OGIwOTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIHIpICAgICAgICAgICAgICAgICAgICAgICAgICMgci1sZW5ndGggY29tYmluYXRpb25zCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChjKSksIHIpICAgICAgICAgICAgICAgICAgICAjIG5vIGR1cGxpY2F0ZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksIHNvcnRlZChjKSkgICAgICAgICAgICAgICAgIyBrZWVwIG9yaWdpbmFsIG9yZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhhbGwoZSBpbiB2YWx1ZXMgZm9yIGUgaW4gYykpICAgICAgICAgICAjIGVsZW1lbnRzIHRha2VuIGZyb20gaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChlIGluIHZhbHVlcyBmb3IgZSBpbiBjKSkgICAgICAgICAgICMgZWxlbWVudHMgdGFrZW4gZnJvbSBpbnB1dCBpdGVyYWJsZQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2UgZm9yIGUgaW4gdmFsdWVzIGlmIGUgaW4gY10pICAgICAgIyBjb21iIGlzIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIGlucHV0IGl0ZXJhYmxlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QoY29tYmluYXRpb25zMSh2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIGZpcnN0IHB1cmUgcHl0aG9uIHZlcnNpb24KQEAgLTE5MSwxNCArMTkxLDE0IEBACiAgICAgICAgICAgICAgICAgaWYgbiA9PSAwIG9yIHIgPD0gMToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LCByZWd1bGFyX2NvbWJzKSAgICAgICAgICAgICMgY2FzZXMgdGhhdCBzaG91bGQgYmUgaWRlbnRpY2FsCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNldChyZXN1bHQpID49IHNldChyZWd1bGFyX2NvbWJzKSkgICAgICMgcmVzdCBzaG91bGQgYmUgc3VwZXJzZXRzIG9mIHJlZ3VsYXIgY29tYnMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChyZXN1bHQpID49IHNldChyZWd1bGFyX2NvbWJzKSkgICAgICMgcmVzdCBzaG91bGQgYmUgc3VwZXJzZXRzIG9mIHJlZ3VsYXIgY29tYnMKIAogICAgICAgICAgICAgICAgIGZvciBjIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIHIpICAgICAgICAgICAgICAgICAgICAgICAgICMgci1sZW5ndGggY29tYmluYXRpb25zCiAgICAgICAgICAgICAgICAgICAgIG5vcnVucyA9IFtrIGZvciBrLHYgaW4gZ3JvdXBieShjKV0gICAgICAgICAgICAgICAgICAjIGNvbWJvIHdpdGhvdXQgY29uc2VjdXRpdmUgcmVwZWF0cwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihub3J1bnMpLCBsZW4oc2V0KG5vcnVucykpKSAgICAgIyBubyByZXBlYXRzIG90aGVyIHRoYW4gY29uc2VjdXRpdmUKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGMpLCBzb3J0ZWQoYykpICAgICAgICAgICAgICAgICMga2VlcCBvcmlnaW5hbCBvcmRlcmluZwotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYWxsKGUgaW4gdmFsdWVzIGZvciBlIGluIGMpKSAgICAgICAgICAgIyBlbGVtZW50cyB0YWtlbiBmcm9tIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoZSBpbiB2YWx1ZXMgZm9yIGUgaW4gYykpICAgICAgICAgICAjIGVsZW1lbnRzIHRha2VuIGZyb20gaW5wdXQgaXRlcmFibGUKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3J1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2UgZm9yIGUgaW4gdmFsdWVzIGlmIGUgaW4gY10pICAgICAjIGNvbWIgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUgaW5wdXQgaXRlcmFibGUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChjd3IxKHZhbHVlcywgcikpKSAgICAgICAgICMgbWF0Y2hlcyBmaXJzdCBwdXJlIHB5dGhvbiB2ZXJzaW9uCkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgICAgICAgICBmb3IgcCBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCByKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHItbGVuZ3RoIHBlcm11dGF0aW9ucwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQocCkpLCByKSAgICAgICAgICAgICAgICAgICAgIyBubyBkdXBsaWNhdGUgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFsbChlIGluIHZhbHVlcyBmb3IgZSBpbiBwKSkgICAgICAgICAgICMgZWxlbWVudHMgdGFrZW4gZnJvbSBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKGUgaW4gdmFsdWVzIGZvciBlIGluIHApKSAgICAgICAgICAgIyBlbGVtZW50cyB0YWtlbiBmcm9tIGlucHV0IGl0ZXJhYmxlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QocGVybXV0YXRpb25zMSh2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIGZpcnN0IHB1cmUgcHl0aG9uIHZlcnNpb24KICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChwZXJtdXRhdGlvbnMyKHZhbHVlcywgcikpKSAjIG1hdGNoZXMgc2Vjb25kIHB1cmUgcHl0aG9uIHZlcnNpb24KICAgICAgICAgICAgICAgICBpZiByID09IG46CkBAIC04MjEsNyArODIxLDcgQEAKICAgICAgICAgIyB0ZWUgcGFzcy10aHJvdWdoIHRvIGNvcHlhYmxlIGl0ZXJhdG9yCiAgICAgICAgIGEsIGIgPSB0ZWUoJ2FiYycpCiAgICAgICAgIGMsIGQgPSB0ZWUoYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYykKIAogICAgICAgICAjIHRlc3QgdGVlX25ldwogICAgICAgICB0MSwgdDIgPSB0ZWUoJ2FiYycpCkBAIC04MjksNyArODI5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0bmV3KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRuZXcsIDEwKQogICAgICAgICB0MyA9IHRuZXcodDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsaXN0KHQxKSA9PSBsaXN0KHQyKSA9PSBsaXN0KHQzKSA9PSBsaXN0KCdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpc3QodDEpID09IGxpc3QodDIpID09IGxpc3QodDMpID09IGxpc3QoJ2FiYycpKQogCiAgICAgICAgICMgdGVzdCB0aGF0IHRlZSBvYmplY3RzIGFyZSB3ZWFrIHJlZmVyZW5jYWJsZQogICAgICAgICBhLCBiID0gdGVlKHhyYW5nZSgxMCkpCkBAIC0xMzM2LDcgKzEzMzYsNyBAQAogICAgICAgICAgICAgICAgIFN1YmNsYXNzKG5ld2FyZz0xKQogICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgogICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHR5cGUgZXJyb3JzIGJlY2F1c2Ugb2Ygd3JvbmcgYXJndW1lbnQgY291bnQKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZigiZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIgaW4gZXJyLmFyZ3NbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgiZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIgaW4gZXJyLmFyZ3NbMF0pCiAKIAogbGlicmVmdGVzdCA9ICIiIiBEb2N0ZXN0IGZvciBleGFtcGxlcyBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2U6IGxpYml0ZXJ0b29scy50ZXgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKaW5kZXggNjIxNjg1MC4uOTAxMjk1YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKQEAgLTE1LDEwICsxNSwxMCBAQAogY2xhc3MgVGVzdEtRdWV1ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfY3JlYXRlX3F1ZXVlKHNlbGYpOgogICAgICAgICBrcSA9IHNlbGVjdC5rcXVldWUoKQotICAgICAgICBzZWxmLmFzc2VydF8oa3EuZmlsZW5vKCkgPiAwLCBrcS5maWxlbm8oKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBrcS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrcS5maWxlbm8oKSA+IDAsIGtxLmZpbGVubygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGtxLmNsb3NlZCkKICAgICAgICAga3EuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oa3EuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoa3EuY2xvc2VkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBrcS5maWxlbm8pCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfZXZlbnQoc2VsZik6CkBAIC0zNCw4ICszNCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYsIGV2KQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGV2LCBvdGhlcikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZXYsIG90aGVyKSwgLTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhldiA8IG90aGVyKQotICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPj0gZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldiA8IG90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPj0gZXYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBldiwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGV2LCAxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgZXYsICJldiIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xhcmdlZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CmluZGV4IGRkYmNjMDYuLmM0ZmFlYWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgZm9yIHBvcyBpbiAoMioqMzEtMSwgMioqMzEsIDIqKjMxKzEpOgogICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oVEVTVEZOLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgIGYuc2Vlayhwb3MpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGYuc2Vla2FibGUoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5zZWVrYWJsZSgpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfbGlzdC5weQppbmRleCAxNjcyOTNhLi42ZTA4MGRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9saXN0LnB5CkBAIC05LDcgKzksNyBAQAogICAgICAgICBsMF8zID0gWzAsIDEsIDIsIDNdCiAgICAgICAgIGwwXzNfYmlzID0gbGlzdChsMF8zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwwXzMsIGwwXzNfYmlzKQotICAgICAgICBzZWxmLmFzc2VydF8obDBfMyBpcyBub3QgbDBfM19iaXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsMF8zIGlzIG5vdCBsMF8zX2JpcykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCgpKSwgW10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoMCwgMSwgMiwgMykpLCBbMCwgMSwgMiwgM10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgnJyksIFtdKQpAQCAtMzksMTEgKzM5LDExIEBACiAKICAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKICAgICAgICAgc3VwZXIoTGlzdFRlc3QsIHNlbGYpLnRlc3RfdHJ1dGgoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IFtdKQotICAgICAgICBzZWxmLmFzc2VydF8oWzQyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFs0Ml0pCiAKICAgICBkZWYgdGVzdF9pZGVudGl0eShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKFtdIGlzIG5vdCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFtdIGlzIG5vdCBbXSkKIAogICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKICAgICAgICAgc3VwZXIoTGlzdFRlc3QsIHNlbGYpLnRlc3RfbGVuKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQppbmRleCAxZTgxNTY4Li45ZTg2NmI3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCiAKLSAgICBkZWYgYXNzZXJ0X2xvZ19saW5lcyhzZWxmLCBleHBlY3RlZF92YWx1ZXMsIHN0cmVhbT1Ob25lKToKKyAgICBkZWYgYXNzZXJ0VHJ1ZWxvZ19saW5lcyhzZWxmLCBleHBlY3RlZF92YWx1ZXMsIHN0cmVhbT1Ob25lKToKICAgICAgICAgIiIiTWF0Y2ggdGhlIGNvbGxlY3RlZCBsb2cgbGluZXMgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uCiAgICAgICAgIHNlbGYuZXhwZWN0ZWRfbG9nX3BhdCwgYW5kIGNvbXBhcmUgdGhlIGV4dHJhY3RlZCBncm91cCB2YWx1ZXMgdG8KICAgICAgICAgdGhlIGV4cGVjdGVkX3ZhbHVlcyBsaXN0IG9mIHR1cGxlcy4iIiIKQEAgLTE2NSw3ICsxNjUsNyBAQAogCiAgICAgICAgIElORi5kZWJ1ZyhtKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICgnRVJSJywgJ0NSSVRJQ0FMJywgJzEnKSwKICAgICAgICAgICAgICgnRVJSJywgJ0VSUk9SJywgJzInKSwKICAgICAgICAgICAgICgnSU5GJywgJ0NSSVRJQ0FMJywgJzMnKSwKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICBJTkZfRVJSLmluZm8obSgpKQogICAgICAgICBJTkZfRVJSLmRlYnVnKG0oKSkKIAotICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgKCdJTkYuRVJSJywgJ0NSSVRJQ0FMJywgJzEnKSwKICAgICAgICAgICAgICgnSU5GLkVSUicsICdFUlJPUicsICcyJyksCiAgICAgICAgIF0pCkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAgICAgSU5GX0VSUl9VTkRFRi5pbmZvKG0oKSkKICAgICAgICAgSU5GX0VSUl9VTkRFRi5kZWJ1ZyhtKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ0NSSVRJQ0FMJywgJzEnKSwKICAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ0VSUk9SJywgJzInKSwKICAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ1dBUk5JTkcnLCAnMycpLApAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgICAgIEdSQU5EQ0hJTEQuZGVidWcobSgpKQogICAgICAgICBDSElMRC5kZWJ1ZyhtKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICgnSU5GLkJBRFBBUkVOVC5VTkRFRicsICdDUklUSUNBTCcsICcxJyksCiAgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQuVU5ERUYnLCAnSU5GTycsICcyJyksCiAgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQnLCAnQ1JJVElDQUwnLCAnMycpLApAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICBzcGFtX2VnZ3NfZmlzaC5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpICAjIEdvb2QuCiAgICAgICAgICAgICBzcGFtX2Jha2VkYmVhbnMuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICAgICAoJ3NwYW0uZWdncycsICdJTkZPJywgJzInKSwKICAgICAgICAgICAgICAgICAoJ3NwYW0uZWdncy5maXNoJywgJ0lORk8nLCAnMycpLAogICAgICAgICAgICAgXSkKQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnNldExldmVsKFZFUkJPU0UpCiAgICAgICAgICMgTGV2ZWxzID49ICdWZXJib3NlJyBhcmUgZ29vZC4KICAgICAgICAgc2VsZi5sb2dfYXRfYWxsX2xldmVscyhzZWxmLnJvb3RfbG9nZ2VyKQotICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgKCdWZXJib3NlJywgJzUnKSwKICAgICAgICAgICAgICgnU29jaWFibGUnLCAnNicpLAogICAgICAgICAgICAgKCdFZmZ1c2l2ZScsICc3JyksCkBAIC0zODIsNyArMzgyLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBMZXZlbHMgPj0gJ1NvY2lhYmxlJyBhcmUgZ29vZC4KICAgICAgICAgICAgIHNlbGYubG9nX2F0X2FsbF9sZXZlbHMoc2VsZi5yb290X2xvZ2dlcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgICAgICgnU29jaWFibGUnLCAnNicpLAogICAgICAgICAgICAgICAgICgnRWZmdXNpdmUnLCAnNycpLAogICAgICAgICAgICAgICAgICgnVGVyc2UnLCAnOCcpLApAQCAtNDEzLDEyICs0MTMsMTIgQEAKICAgICAgICAgICAgICAgICAoJ1RhY2l0dXJuJywgJzknKSwKICAgICAgICAgICAgICAgICAoJ1NpbGVudCcsICcxMCcpLAogICAgICAgICAgICAgXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGZpcnN0X2xpbmVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKGZpcnN0X2xpbmVzKQogCiAgICAgICAgICAgICBzcGVjaWZpY19maWx0ZXIgPSBWZXJ5U3BlY2lmaWNGaWx0ZXIoKQogICAgICAgICAgICAgc2VsZi5yb290X2xvZ2dlci5hZGRGaWx0ZXIoc3BlY2lmaWNfZmlsdGVyKQogICAgICAgICAgICAgc2VsZi5sb2dfYXRfYWxsX2xldmVscyhzZWxmLnJvb3RfbG9nZ2VyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGZpcnN0X2xpbmVzICsgWworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKGZpcnN0X2xpbmVzICsgWwogICAgICAgICAgICAgICAgICMgTm90IG9ubHkgJ0dhcnJ1bG91cycgaXMgc3RpbGwgbWlzc2luZywgYnV0IGFsc28gJ1NvY2lhYmxlJwogICAgICAgICAgICAgICAgICMgYW5kICdUYWNpdHVybicKICAgICAgICAgICAgICAgICAoJ0JvcmluZycsICcxMScpLApAQCAtNDU4LDkgKzQ1OCw5IEBACiAgICAgICAgICMgVGhlIG1lbW9yeSBoYW5kbGVyIGZsdXNoZXMgdG8gaXRzIHRhcmdldCBoYW5kbGVyIGJhc2VkIG9uIHNwZWNpZmljCiAgICAgICAgICMgIGNyaXRlcmlhIChtZXNzYWdlIGNvdW50IGFuZCBtZXNzYWdlIGxldmVsKS4KICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFtdKQogICAgICAgICBzZWxmLm1lbV9sb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQotICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhbXSkKICAgICAgICAgIyBUaGlzIHdpbGwgZmx1c2ggYmVjYXVzZSB0aGUgbGV2ZWwgaXMgPj0gbG9nZ2luZy5XQVJOSU5HCiAgICAgICAgIHNlbGYubWVtX2xvZ2dlci53YXJuKHNlbGYubmV4dF9tZXNzYWdlKCkpCiAgICAgICAgIGxpbmVzID0gWwpAQCAtNDY4LDE5ICs0NjgsMTkgQEAKICAgICAgICAgICAgICgnSU5GTycsICcyJyksCiAgICAgICAgICAgICAoJ1dBUk5JTkcnLCAnMycpLAogICAgICAgICBdCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKGxpbmVzKQogICAgICAgICBmb3IgbiBpbiAoNCwgMTQpOgogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOSk6CiAgICAgICAgICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMobGluZXMpCiAgICAgICAgICAgICAjIFRoaXMgd2lsbCBmbHVzaCBiZWNhdXNlIGl0J3MgdGhlIDEwdGggbWVzc2FnZSBzaW5jZSB0aGUgbGFzdAogICAgICAgICAgICAgIyAgZmx1c2guCiAgICAgICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKICAgICAgICAgICAgIGxpbmVzID0gbGluZXMgKyBbKCdERUJVRycsIHN0cihpKSkgZm9yIGkgaW4gcmFuZ2UobiwgbiArIDEwKV0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhsaW5lcykKIAogICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMobGluZXMpCiAKIAogY2xhc3MgRXhjZXB0aW9uRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKQEAgLTY1MCwxMSArNjUwLDExIEBACiAgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQogICAgICAgICAgICAgIyBPdXRwdXRzIGEgbWVzc2FnZQogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKICAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCiAgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoW10pCiAKICAgICBkZWYgdGVzdF9jb25maWcxX29rKHNlbGYsIGNvbmZpZz1jb25maWcxKToKICAgICAgICAgIyBBIGNvbmZpZyBmaWxlIGRlZmluaW5nIGEgc3ViLXBhcnNlciBhcyB3ZWxsLgpAQCAtNjY0LDEyICs2NjQsMTIgQEAKICAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCiAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgICAgICgnSU5GTycsICcxJyksCiAgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCiAgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQogICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFtdKQogCiAgICAgZGVmIHRlc3RfY29uZmlnMl9mYWlsdXJlKHNlbGYpOgogICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyBmaWxlIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KQEAgLTY5Miw3ICs2OTIsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob3V0cHV0LmdldHZhbHVlKCksCiAgICAgICAgICAgICAgICAgIkVSUk9SOnJvb3Q6anVzdCB0ZXN0aW5nXG5Hb3QgYSBbUnVudGltZUVycm9yXVxuIikKICAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFtdKQogCiAgICAgZGVmIHRlc3RfY29uZmlnNV9vayhzZWxmKToKICAgICAgICAgc2VsZi50ZXN0X2NvbmZpZzFfb2soY29uZmlnPXNlbGYuY29uZmlnNSkKQEAgLTgyNiw3ICs4MjYsNyBAQAogICAgICAgICAgICAga2V5ID0gaWQob2JqKSwgcmVwcihvYmopCiAgICAgICAgICAgICBzZWxmLl9zdXJ2aXZvcnNba2V5XSA9IHdlYWtyZWYucmVmKG9iaikKIAotICAgIGRlZiBfYXNzZXJ0X3N1cnZpdmFsKHNlbGYpOgorICAgIGRlZiBfYXNzZXJ0VHJ1ZXN1cnZpdmFsKHNlbGYpOgogICAgICAgICAiIiJBc3NlcnQgdGhhdCBhbGwgb2JqZWN0cyB3YXRjaGVkIGZvciBzdXJ2aXZhbCBoYXZlIHN1cnZpdmVkLiIiIgogICAgICAgICAjIFRyaWdnZXIgY3ljbGUgYnJlYWtpbmcuCiAgICAgICAgIGdjLmNvbGxlY3QoKQpAQCAtODQ3LDE2ICs4NDcsMTYgQEAKICAgICAgICAgZm9vLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCiAgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKICAgICAgICAgZm9vLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhbCiAgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICcyJyksCiAgICAgICAgIF0pCiAgICAgICAgIGRlbCBmb28KICAgICAgICAgIyBmb28gaGFzIHN1cnZpdmVkLgotICAgICAgICBzZWxmLl9hc3NlcnRfc3Vydml2YWwoKQorICAgICAgICBzZWxmLl9hc3NlcnRUcnVlc3Vydml2YWwoKQogICAgICAgICAjIGZvbyBoYXMgcmV0YWluZWQgaXRzIHNldHRpbmdzLgogICAgICAgICBiYXIgPSBsb2dnaW5nLmdldExvZ2dlcigiZm9vIikKICAgICAgICAgYmFyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhbCiAgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICcyJyksCiAgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICczJyksCiAgICAgICAgIF0pCkBAIC04ODEsNyArODgxLDcgQEAKICAgICAgICAgICAgICMgY2hlY2sgd2Ugd3JvdGUgZXhhY3RseSB0aG9zZSBieXRlcywgaWdub3JpbmcgdHJhaWxpbmcgXG4gZXRjCiAgICAgICAgICAgICBmID0gb3BlbihmbikKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmLnJlYWQoKS5yc3RyaXAoKSwgZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLnJzdHJpcCgpLCBkYXRhKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgZmluYWxseToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCBhMjBjM2ZjLi4xOTQzNTE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC04OCw3ICs4OCw3IEBACiAgICAgIyBUaGUgc2lnbiBvZiB0aGUgbnVtYmVyIGlzIGFsc28gcmFuZG9tLgogCiAgICAgZGVmIGdldHJhbihzZWxmLCBuZGlnaXRzKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5kaWdpdHMgPiAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmRpZ2l0cyA+IDApCiAgICAgICAgIG5iaXRzX2hpID0gbmRpZ2l0cyAqIFNISUZUCiAgICAgICAgIG5iaXRzX2xvID0gbmJpdHNfaGkgLSBTSElGVCArIDEKICAgICAgICAgYW5zd2VyID0gMEwKQEAgLTk3LDEzICs5NywxMyBAQAogICAgICAgICB3aGlsZSBuYml0cyA8IG5iaXRzX2xvOgogICAgICAgICAgICAgYml0cyA9IChyID4+IDEpICsgMQogICAgICAgICAgICAgYml0cyA9IG1pbihiaXRzLCBuYml0c19oaSAtIG5iaXRzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDEgPD0gYml0cyA8PSBTSElGVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxIDw9IGJpdHMgPD0gU0hJRlQpCiAgICAgICAgICAgICBuYml0cyA9IG5iaXRzICsgYml0cwogICAgICAgICAgICAgYW5zd2VyID0gYW5zd2VyIDw8IGJpdHMKICAgICAgICAgICAgIGlmIHIgJiAxOgogICAgICAgICAgICAgICAgIGFuc3dlciA9IGFuc3dlciB8ICgoMSA8PCBiaXRzKSAtIDEpCiAgICAgICAgICAgICByID0gaW50KHJhbmRvbS5yYW5kb20oKSAqIChTSElGVCAqIDIpKQotICAgICAgICBzZWxmLmFzc2VydF8obmJpdHNfbG8gPD0gbmJpdHMgPD0gbmJpdHNfaGkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYml0c19sbyA8PSBuYml0cyA8PSBuYml0c19oaSkKICAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgogICAgICAgICAgICAgYW5zd2VyID0gLWFuc3dlcgogICAgICAgICByZXR1cm4gYW5zd2VyCkBAIC0xMjksOSArMTI5LDkgQEAKICAgICAgICAgZXEociwgcjIsIEZybSgiZGl2bW9kIHJldHVybnMgZGlmZmVyZW50IG1vZCB0aGFuICUlIGZvciAlciBhbmQgJXIiLCB4LCB5KSkKICAgICAgICAgZXEoeCwgcSp5ICsgciwgRnJtKCJ4ICE9IHEqeSArIHIgYWZ0ZXIgZGl2bW9kIG9uIHg9JXIsIHk9JXIiLCB4LCB5KSkKICAgICAgICAgaWYgeSA+IDA6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSByIDwgeSwgRnJtKCJiYWQgbW9kIGZyb20gZGl2bW9kIG9uICVyIGFuZCAlciIsIHgsIHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gciA8IHksIEZybSgiYmFkIG1vZCBmcm9tIGRpdm1vZCBvbiAlciBhbmQgJXIiLCB4LCB5KSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh5IDwgciA8PSAwLCBGcm0oImJhZCBtb2QgZnJvbSBkaXZtb2Qgb24gJXIgYW5kICVyIiwgeCwgeSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeSA8IHIgPD0gMCwgRnJtKCJiYWQgbW9kIGZyb20gZGl2bW9kIG9uICVyIGFuZCAlciIsIHgsIHkpKQogCiAgICAgZGVmIHRlc3RfZGl2aXNpb24oc2VsZik6CiAgICAgICAgIGRpZ2l0cyA9IHJhbmdlKDEsIE1BWERJR0lUUysxKSArIHJhbmdlKEtBUkFUU1VCQV9DVVRPRkYsCkBAIC01NTIsNyArNTUyLDcgQEAKICAgICAgICAgICAgIHkgPSBpbnQoeCkKICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImludChsb25nKHN5cy5tYXhpbnQpICsgMSkgbXVzdG4ndCBvdmVyZmxvdyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHksIGxvbmcpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh5LCBsb25nKSwKICAgICAgICAgICAgICJpbnQobG9uZyhzeXMubWF4aW50KSArIDEpIHNob3VsZCBoYXZlIHJldHVybmVkIGxvbmciKQogCiAgICAgICAgIHggPSBodWdlbmVnX2FzbG9uZyAtIDEKQEAgLTU2MCwxNCArNTYwLDE0IEBACiAgICAgICAgICAgICB5ID0gaW50KHgpCiAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZygtc3lzLm1heGludC0xKSAtIDEpIG11c3RuJ3Qgb3ZlcmZsb3ciKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh5LCBsb25nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeSwgbG9uZyksCiAgICAgICAgICAgICAgICAiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkgLSAxKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBsb25nIikKIAogICAgICAgICBjbGFzcyBsb25nMihsb25nKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgeCA9IGxvbmcyKDFMPDwxMDApCiAgICAgICAgIHkgPSBpbnQoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoeSkgaXMgbG9uZywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoeSkgaXMgbG9uZywKICAgICAgICAgICAgICJvdmVyZmxvd2luZyBpbnQgY29udmVyc2lvbiBtdXN0IHJldHVybiBsb25nIG5vdCBsb25nIHN1YnR5cGUiKQogCiAgICAgICAgICMgbG9uZyAtPiBQeV9zc2l6ZV90IGNvbnZlcnNpb24KQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBsZW4oYmluKHgpLmxzdHJpcCgnLTBiJykpKQogICAgICAgICAgICAgIyBCZWhhdmlvdXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkb2NzCiAgICAgICAgICAgICBpZiB4ICE9IDA6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMCkKICAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgZGVmaW5pdGlvbjogeC5iaXRfbGVuZ3RoKCkgPT0gMSArIGZsb29yKGxvZ18yKHgpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5CmluZGV4IDI0NDliMGEuLjQ1NDFlYjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFjcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkKQEAgLTYsMjYgKzYsMjYgQEAKIGNsYXNzIE1hY1BhdGhUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9hYnNwYXRoKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obWFjcGF0aC5hYnNwYXRoKCJ4eDp5eSIpID09ICJ4eDp5eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWNwYXRoLmFic3BhdGgoInh4Onl5IikgPT0gInh4Onl5IikKIAogICAgIGRlZiB0ZXN0X2lzYWJzKHNlbGYpOgogICAgICAgICBpc2FicyA9IG1hY3BhdGguaXNhYnMKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzYWJzKCJ4eDp5eSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNhYnMoInh4Onl5OiIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNhYnMoInh4OiIpKQotICAgICAgICBzZWxmLmZhaWxJZihpc2FicygiZm9vIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzYWJzKCI6Zm9vIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzYWJzKCI6Zm9vOmJhciIpKQotICAgICAgICBzZWxmLmZhaWxJZihpc2FicygiOmZvbzpiYXI6IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2FicygieHg6eXkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDp5eToiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDoiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNhYnMoIjpmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbzpiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbzpiYXI6IikpCiAKIAogICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKICAgICAgICAgY29tbW9ucHJlZml4ID0gbWFjcGF0aC5jb21tb25wcmVmaXgKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvbW1vbnByZWZpeChbImhvbWU6c3dlbnNvbjpzcGFtIiwgImhvbWU6c3dlbjpzcGFtIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21tb25wcmVmaXgoWyJob21lOnN3ZW5zb246c3BhbSIsICJob21lOnN3ZW46c3BhbSJdKQogICAgICAgICAgICAgICAgICAgICAgPT0gImhvbWU6c3dlbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21tb25wcmVmaXgoWyI6aG9tZTpzd2VuOnNwYW0iLCAiOmhvbWU6c3dlbjplZ2dzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21tb25wcmVmaXgoWyI6aG9tZTpzd2VuOnNwYW0iLCAiOmhvbWU6c3dlbjplZ2dzIl0pCiAgICAgICAgICAgICAgICAgICAgICA9PSAiOmhvbWU6c3dlbjoiKQotICAgICAgICBzZWxmLmFzc2VydF8oY29tbW9ucHJlZml4KFsiOmhvbWU6c3dlbjpzcGFtIiwgIjpob21lOnN3ZW46c3BhbSJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tbW9ucHJlZml4KFsiOmhvbWU6c3dlbjpzcGFtIiwgIjpob21lOnN3ZW46c3BhbSJdKQogICAgICAgICAgICAgICAgICAgICAgPT0gIjpob21lOnN3ZW46c3BhbSIpCiAKICAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCA2MzQyNjc2Li4yNjc1OGEzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC0yMiwxNyArMjIsMTcgQEAKIAogICAgIGRlZiBfY2hlY2tfc2FtcGxlKHNlbGYsIG1zZyk6CiAgICAgICAgICMgSW5zcGVjdCBhIG1haWxib3guTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtcGxlIG1lc3NhZ2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2csIG1haWxib3guTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZywgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLCBtYWlsYm94Lk1lc3NhZ2UpKQogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfc2FtcGxlX2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaW4gbXNnLmdldF9hbGwoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5pc19tdWx0aXBhcnQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihtc2cuZ2V0X3BheWxvYWQoKSkgPT0gbGVuKF9zYW1wbGVfcGF5bG9hZHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGluIG1zZy5nZXRfYWxsKGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnLmdldF9wYXlsb2FkKCkpID09IGxlbihfc2FtcGxlX3BheWxvYWRzKSkKICAgICAgICAgZm9yIGksIHBheWxvYWQgaW4gZW51bWVyYXRlKF9zYW1wbGVfcGF5bG9hZHMpOgogICAgICAgICAgICAgcGFydCA9IG1zZy5nZXRfcGF5bG9hZChpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocGFydCwgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShwYXJ0LCBtYWlsYm94Lk1lc3NhZ2UpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHBhcnQuZ2V0X3BheWxvYWQoKSA9PSBwYXlsb2FkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGFydCwgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShwYXJ0LCBtYWlsYm94Lk1lc3NhZ2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnQuZ2V0X3BheWxvYWQoKSA9PSBwYXlsb2FkKQogCiAgICAgZGVmIF9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZiwgdGFyZ2V0KToKICAgICAgICAgIyBEZWxldGUgYSBmaWxlIG9yIGRlbGV0ZSBhIGRpcmVjdG9yeSByZWN1cnNpdmVseQpAQCAtNjUsMTYgKzY1LDE2IEBACiAgICAgICAgICMgQWRkIGNvcGllcyBvZiBhIHNhbXBsZSBtZXNzYWdlCiAgICAgICAgIGtleXMgPSBbXQogICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMSkKICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMikKICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkpKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDMpCiAgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoU3RyaW5nSU8uU3RyaW5nSU8oX3NhbXBsZV9tZXNzYWdlKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gNCkKICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gNSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleXNbMF0pID09IHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXlzWzBdKSA9PSBzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIGZvciBpIGluICgxLCAyLCAzLCA0KToKICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5c1tpXV0pCiAKQEAgLTkwLDIzICs5MCwyMyBAQAogICAgICAgICAjIChVc2VkIGJ5IHRlc3RfcmVtb3ZlKCkgYW5kIHRlc3RfZGVsaXRlbSgpLikKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMikKICAgICAgICAgbWV0aG9kKGtleTApCiAgICAgICAgIGwgPSBsZW4oc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8obCA9PSAxLCAiYWN0dWFsIGw6ICVzIiAlIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsID09IDEsICJhY3R1YWwgbDogJXMiICUgbCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTBdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBtZXRob2Qoa2V5MCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBzZWxmLl90ZW1wbGF0ZSAlIDEpCiAgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAyKQogICAgICAgICBtZXRob2Qoa2V5MikKICAgICAgICAgbCA9IGxlbihzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsID09IDEsICJhY3R1YWwgbDogJXMiICUgbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwgPT0gMSwgImFjdHVhbCBsOiAlcyIgJSBsKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5Ml0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IG1ldGhvZChrZXkyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09IHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09IHNlbGYuX3RlbXBsYXRlICUgMSkKICAgICAgICAgbWV0aG9kKGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTFdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBtZXRob2Qoa2V5MSkpCiAKQEAgLTExNCwzNSArMTE0LDM1IEBACiAgICAgICAgICMgRGlzY2FyZCBtZXNzYWdlcwogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAyKQogICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkwXSkKICAgICAgICAgc2VsZi5fYm94LmRpc2NhcmQoa2V5MCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCiAKICAgICBkZWYgdGVzdF9nZXQoc2VsZik6CiAgICAgICAgICMgUmV0cmlldmUgbWVzc2FnZXMgdXNpbmcgZ2V0KCkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXQoJ2ZvbycpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0KCdmb28nLCBGYWxzZSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXQoJ2ZvbycpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0KCdmb28nLCBGYWxzZSkgaXMgRmFsc2UpCiAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCiAgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQogICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5mcC5yZWFkKCkgPT0gJzEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnWydmcm9tJ10gPT0gJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZnAucmVhZCgpID09ICcxJykKIAogICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CiAgICAgICAgICMgUmV0cmlldmUgbWVzc2FnZSB1c2luZyBfX2dldGl0ZW1fXygpCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAgbXNnID0gc2VsZi5fYm94W2tleTBdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ1snZnJvbSddID09ICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9wYXlsb2FkKCkgPT0gJzAnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hbJ2ZvbyddKQogICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCkBAIC0xNTIsMjUgKzE1MiwyNSBAQAogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgbXNnMCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2cwLCBtYWlsYm94Lk1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnMFsnZnJvbSddID09ICdmb28nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnMC5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMCwgbWFpbGJveC5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzBbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzAuZ2V0X3BheWxvYWQoKSA9PSAnMCcpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MSkpCiAKICAgICBkZWYgdGVzdF9nZXRfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gc2VsZi5fdGVtcGxhdGUgJSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gX3NhbXBsZV9tZXNzYWdlKQogCiAgICAgZGVmIHRlc3RfZ2V0X2ZpbGUoc2VsZik6CiAgICAgICAgICMgR2V0IGZpbGUgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9maWxlKGtleTApLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X2ZpbGUoa2V5MCkucmVhZCgpLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJykKICAgICAgICAgICAgICAgICAgICAgID09IHNlbGYuX3RlbXBsYXRlICUgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfZmlsZShrZXkxKS5yZWFkKCkucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9maWxlKGtleTEpLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpCiAgICAgICAgICAgICAgICAgICAgICA9PSBfc2FtcGxlX21lc3NhZ2UpCiAKICAgICBkZWYgdGVzdF9pdGVya2V5cyhzZWxmKToKQEAgLTIyMSwxNSArMjIxLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuZWRfa2V5cy5hcHBlbmQoa2V5KQogICAgICAgICAgICAgICAgIHJldHVybmVkX3ZhbHVlcy5hcHBlbmQodmFsdWUpCiAgICAgICAgIGlmIGRvX2tleXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKGtleXMpID09IGxlbihyZXR1cm5lZF9rZXlzKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoa2V5cykgPT0gc2V0KHJldHVybmVkX2tleXMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihrZXlzKSA9PSBsZW4ocmV0dXJuZWRfa2V5cykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KGtleXMpID09IHNldChyZXR1cm5lZF9rZXlzKSkKICAgICAgICAgaWYgZG9fdmFsdWVzOgogICAgICAgICAgICAgY291bnQgPSAwCiAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gcmV0dXJuZWRfdmFsdWVzOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZVsnZnJvbSddID09ICdmb28nKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQodmFsdWUuZ2V0X3BheWxvYWQoKSkgPCByZXBldGl0aW9ucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWVbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHZhbHVlLmdldF9wYXlsb2FkKCkpIDwgcmVwZXRpdGlvbnMpCiAgICAgICAgICAgICAgICAgY291bnQgKz0gMQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih2YWx1ZXMpID09IGNvdW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih2YWx1ZXMpID09IGNvdW50KQogCiAgICAgZGVmIHRlc3RfaGFzX2tleShzZWxmKToKICAgICAgICAgIyBDaGVjayBleGlzdGVuY2Ugb2Yga2V5cyB1c2luZyBoYXNfa2V5KCkKQEAgLTI0MSw2MSArMjQxLDYxIEBACiAKICAgICBkZWYgX3Rlc3RfaGFzX2tleV9vcl9jb250YWlucyhzZWxmLCBtZXRob2QpOgogICAgICAgICAjIChVc2VkIGJ5IHRlc3RfaGFzX2tleSgpIGFuZCB0ZXN0X2NvbnRhaW5zKCkuKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQotICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTApKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQotICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTEpKQotICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTApKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKICAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkwKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZChrZXkwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1ldGhvZChrZXkxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtZXRob2QoJ2ZvbycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG1ldGhvZChrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBtZXRob2QoJ2ZvbycpKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgbWV0aG9kKGtleTEpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZChrZXkwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtZXRob2QoJ2ZvbycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKIAogICAgIGRlZiB0ZXN0X2xlbihzZWxmLCByZXBldGl0aW9ucz0xMCk6CiAgICAgICAgICMgR2V0IG1lc3NhZ2UgY291bnQKICAgICAgICAga2V5cyA9IFtdCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShyZXBldGl0aW9ucyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSBpKQogICAgICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IGkgKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IGkgKyAxKQogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmVwZXRpdGlvbnMpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IHJlcGV0aXRpb25zIC0gaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSByZXBldGl0aW9ucyAtIGkpCiAgICAgICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleXNbaV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gcmVwZXRpdGlvbnMgLSBpIC0gMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSByZXBldGl0aW9ucyAtIGkgLSAxKQogCiAgICAgZGVmIHRlc3Rfc2V0X2l0ZW0oc2VsZik6CiAgICAgICAgICMgTW9kaWZ5IG1lc3NhZ2VzIHVzaW5nIF9fc2V0aXRlbV9fKCkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAxJykKICAgICAgICAgc2VsZi5fYm94W2tleTBdID0gc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJykKICAgICAgICAgc2VsZi5fYm94W2tleTFdID0gc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKICAgICAgICAgc2VsZi5fYm94W2tleTBdID0gX3NhbXBsZV9tZXNzYWdlCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MF0pCiAgICAgICAgIHNlbGYuX2JveFtrZXkxXSA9IHNlbGYuX2JveFtrZXkwXQogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUoc2VsZi5fYm94W2tleTFdKQogICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09CiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKHNlbGYuX2JveFtrZXkxXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc2VsZi5fYm94Ll9fc2V0aXRlbV9fKCdmb28nLCAnYmFyJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFsnZm9vJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMikKIAogICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgogICAgICAgICAjIFJlbW92ZSBhbGwgbWVzc2FnZXMgdXNpbmcgY2xlYXIoKQpAQCAtMzAzLDI5ICszMDMsMjkgQEAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgogICAgICAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpCiAgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgPT0gc2VsZi5fdGVtcGxhdGUgJSBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgPT0gc2VsZi5fdGVtcGxhdGUgJSBpKQogICAgICAgICBzZWxmLl9ib3guY2xlYXIoKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDApCiAgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSkKIAogICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKICAgICAgICAgIyBHZXQgYW5kIHJlbW92ZSBhIG1lc3NhZ2UgdXNpbmcgcG9wKCkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MCBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkwIGluIHNlbGYuX2JveCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTApLmdldF9wYXlsb2FkKCkgPT0gJzAnKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MCBub3QgaW4gc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkxIGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5wb3Aoa2V5MCkuZ2V0X3BheWxvYWQoKSA9PSAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkwIG5vdCBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkxIGluIHNlbGYuX2JveCkKICAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MiBpbiBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTIpLmdldF9wYXlsb2FkKCkgPT0gJzInKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MiBub3QgaW4gc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTEpLmdldF9wYXlsb2FkKCkgPT0gJzEnKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBub3QgaW4gc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTIgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LnBvcChrZXkyKS5nZXRfcGF5bG9hZCgpID09ICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTIgbm90IGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTEgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LnBvcChrZXkxKS5nZXRfcGF5bG9hZCgpID09ICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTEgbm90IGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDApCiAKICAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgogICAgICAgICAjIEdldCBhbmQgcmVtb3ZlIGFuIGFyYml0cmFyeSAoa2V5LCBtZXNzYWdlKSB1c2luZyBwb3BpdGVtKCkKQEAgLTMzNSwxMSArMzM1LDExIEBACiAgICAgICAgIHNlZW4gPSBbXQogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgogICAgICAgICAgICAga2V5LCBtc2cgPSBzZWxmLl9ib3gucG9waXRlbSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGtleXMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IG5vdCBpbiBzZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleSBpbiBrZXlzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleSBub3QgaW4gc2VlbikKICAgICAgICAgICAgIHNlZW4uYXBwZW5kKGtleSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQobXNnLmdldF9wYXlsb2FkKCkpID09IGtleXMuaW5kZXgoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KG1zZy5nZXRfcGF5bG9hZCgpKSA9PSBrZXlzLmluZGV4KGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAwKQogICAgICAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5XSkKIApAQCAtMzUwLDMxICszNTAsMzEgQEAKICAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMicpCiAgICAgICAgIHNlbGYuX2JveC51cGRhdGUoe2tleTA6IHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTI6IF9zYW1wbGVfbWVzc2FnZX0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAzKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5Ml0pCiAgICAgICAgIHNlbGYuX2JveC51cGRhdGUoWyhrZXkyLCBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDInKSwKICAgICAgICAgICAgICAgICAgICAgKGtleTEsIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMScpLAogICAgICAgICAgICAgICAgICAgICAoa2V5MCwgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09CiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTIpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkyKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAyJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc2VsZi5fYm94LnVwZGF0ZSh7J2Zvbyc6ICdiYXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MDogc2VsZi5fdGVtcGxhdGUgJSAiY2hhbmdlZCAwIn0pKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0KICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkyKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MikgPT0KICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMiIpCiAKICAgICBkZWYgdGVzdF9mbHVzaChzZWxmKToKQEAgLTM4MywxMSArMzgzLDExIEBACiAKICAgICBkZWYgdGVzdF9sb2NrX3VubG9jayhzZWxmKToKICAgICAgICAgIyBMb2NrIGFuZCB1bmxvY2sgdGhlIG1haWxib3gKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCiAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQogICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCiAKICAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKICAgICAgICAgIyBDbG9zZSBtYWlsYm94IGFuZCBmbHVzaCBjaGFuZ2VzIHRvIGRpc2sKQEAgLTQwMyw5ICs0MDMsOSBAQAogICAgICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKICAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQogICAgICAgICBrZXlzID0gc2VsZi5fYm94LmtleXMoKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGtleXMpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oa2V5cykgPT0gMykKICAgICAgICAgZm9yIGtleSBpbiBrZXlzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gY29udGVudHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSBpbiBjb250ZW50cykKIAogICAgIGRlZiB0ZXN0X2R1bXBfbWVzc2FnZShzZWxmKToKICAgICAgICAgIyBXcml0ZSBtZXNzYWdlIHJlcHJlc2VudGF0aW9ucyB0byBkaXNrCkBAIC00MTMsNyArNDEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2UsIFN0cmluZ0lPLlN0cmluZ0lPKF9zYW1wbGVfbWVzc2FnZSkpOgogICAgICAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgc2VsZi5fYm94Ll9kdW1wX21lc3NhZ2UoaW5wdXQsIG91dHB1dCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdXRwdXQuZ2V0dmFsdWUoKSA9PQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dHB1dC5nZXR2YWx1ZSgpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhbXBsZV9tZXNzYWdlLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCiAgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLApAQCAtNDc0LDcgKzQ3NCw3IEBACiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQogICAgICAgICBtc2cuc2V0X2luZm8oJ2ZvbycpCiAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInLCAnJXMlc2ZvbycgJQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInLCAnJXMlc2ZvbycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXksIHNlbGYuX2JveC5jb2xvbikpKSkKIAogICAgIGRlZiB0ZXN0X2dldF9NTShzZWxmKToKQEAgLTQ4NCw5ICs0ODQsOSBAQAogICAgICAgICBtc2cuc2V0X2ZsYWdzKCdSRicpCiAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQogICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2dfcmV0dXJuZWQsIG1haWxib3guTWFpbGRpck1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnRlInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2dfcmV0dXJuZWQsIG1haWxib3guTWFpbGRpck1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnRlInKQogCiAgICAgZGVmIHRlc3Rfc2V0X01NKHNlbGYpOgogICAgICAgICAjIFNldCB3aXRoIGEgTWFpbGRpck1lc3NhZ2UgaW5zdGFuY2UKQEAgLTQ5NCwyMiArNDk0LDIyIEBACiAgICAgICAgIG1zZzAuc2V0X2ZsYWdzKCdUUCcpCiAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnMCkKICAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJ1BUJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJ1BUJykKICAgICAgICAgbXNnMSA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAxKQogICAgICAgICBzZWxmLl9ib3hba2V5XSA9IG1zZzEKICAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X3BheWxvYWQoKSA9PSAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9mbGFncygpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9wYXlsb2FkKCkgPT0gJzEnKQogICAgICAgICBtc2cyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDIpCiAgICAgICAgIG1zZzIuc2V0X2luZm8oJzIsUycpCiAgICAgICAgIHNlbGYuX2JveFtrZXldID0gbXNnMgogICAgICAgICBzZWxmLl9ib3hba2V5XSA9IHNlbGYuX3RlbXBsYXRlICUgMwogICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQotICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X3BheWxvYWQoKSA9PSAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9mbGFncygpID09ICdTJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ19yZXR1cm5lZC5nZXRfcGF5bG9hZCgpID09ICczJykKIAogICAgIGRlZiB0ZXN0X2NvbnNpc3RlbnRfZmFjdG9yeShzZWxmKToKICAgICAgICAgIyBBZGQgYSBtZXNzYWdlLgpAQCAtNTI0LDcgKzUyNCw3IEBACiAgICAgICAgIGJveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoLCBmYWN0b3J5PUZha2VNZXNzYWdlKQogICAgICAgICBib3guY29sb24gPSBzZWxmLl9ib3guY29sb24KICAgICAgICAgbXNnMiA9IGJveC5nZXRfbWVzc2FnZShrZXkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1zZzIsIEZha2VNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMiwgRmFrZU1lc3NhZ2UpKQogCiAgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV9uZXcoc2VsZik6CiAgICAgICAgICMgSW5pdGlhbGl6ZSBhIG5vbi1leGlzdGVudCBtYWlsYm94CkBAIC01NTIsMTUgKzU1MiwxNSBAQAogICAgICAgICBmb3Igc3ViZGlyIGluICcnLCAndG1wJywgJ25ldycsICdjdXInOgogICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIpCiAgICAgICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKVtzdGF0LlNUX01PREVdCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oc3RhdC5TX0lTRElSKG1vZGUpLCAiTm90IGEgZGlyZWN0b3J5OiAnJXMnIiAlIHBhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RhdC5TX0lTRElSKG1vZGUpLCAiTm90IGEgZGlyZWN0b3J5OiAnJXMnIiAlIHBhdGgpCiAKICAgICBkZWYgdGVzdF9saXN0X2ZvbGRlcnMoc2VsZik6CiAgICAgICAgICMgTGlzdCBmb2xkZXJzCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdvbmUnKQogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndHdvJykKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3RocmVlJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09CiAgICAgICAgICAgICAgICAgICAgICBzZXQoKCdvbmUnLCAndHdvJywgJ3RocmVlJykpKQogCiAgICAgZGVmIHRlc3RfZ2V0X2ZvbGRlcihzZWxmKToKQEAgLTU2OCwyOSArNTY4LDI5IEBACiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuZm9vLmJhcicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuZm9vLmJhcicpKSkKICAgICAgICAgZm9sZGVyMSA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9sZGVyMS5nZXRfc3RyaW5nKGZvbGRlcjEua2V5cygpWzBdKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQogCiAgICAgZGVmIHRlc3RfYWRkX2FuZF9yZW1vdmVfZm9sZGVycyhzZWxmKToKICAgICAgICAgIyBEZWxldGUgZm9sZGVycwogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3R3bycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgnb25lJywgJ3R3bycpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCdvbmUnLCAndHdvJykpKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcignb25lJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywgJ3RocmVlJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsICd0aHJlZScpKSkKICAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ3RocmVlJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0d28nKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkgPT0gW10pCiAKICAgICBkZWYgdGVzdF9jbGVhbihzZWxmKToKICAgICAgICAgIyBSZW1vdmUgb2xkIGZpbGVzIGZyb20gJ3RtcCcKQEAgLTYwMywxNCArNjAzLDE0IEBACiAgICAgICAgIGYud3JpdGUoIkAiKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgc2VsZi5fYm94LmNsZWFuKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKICAgICAgICAgZm9vX3N0YXQgPSBvcy5zdGF0KGZvb19wYXRoKQogICAgICAgICBvcy51dGltZShmb29fcGF0aCwgKHRpbWUudGltZSgpIC0gMTI5NjAwIC0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb29fc3RhdC5zdF9tdGltZSkpCiAgICAgICAgIHNlbGYuX2JveC5jbGVhbigpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoZm9vX3BhdGgpKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoYmFyX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV90bXAoc2VsZiwgcmVwZXRpdGlvbnM9MTApOgogICAgICAgICAjIENyZWF0ZSBmaWxlcyBpbiB0bXAgZGlyZWN0b3J5CkBAIC02MzAsNDkgKzYzMCw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIGluIHdyb25nIGxvY2F0aW9uOiAnJXMnIiAlIGhlYWQpCiAgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm4ubWF0Y2godGFpbCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRjaCBpcyBub3QgTm9uZSwgIkludmFsaWQgZmlsZSBuYW1lOiAnJXMnIiAlIHRhaWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0Y2ggaXMgbm90IE5vbmUsICJJbnZhbGlkIGZpbGUgbmFtZTogJyVzJyIgJSB0YWlsKQogICAgICAgICAgICAgZ3JvdXBzID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgIGlmIHByZXZpb3VzX2dyb3VwcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1swXSA+PSBwcmV2aW91c19ncm91cHNbMF0pLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzBdID49IHByZXZpb3VzX2dyb3Vwc1swXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24tbW9ub3RvbmljIHNlY29uZHM6ICclcycgYmVmb3JlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2dyb3Vwc1swXSwgZ3JvdXBzWzBdKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1sxXSA+PSBwcmV2aW91c19ncm91cHNbMV0pIG9yCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChncm91cHNbMV0gPj0gcHJldmlvdXNfZ3JvdXBzWzFdKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHNbMF0gIT0gZ3JvdXBzWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLW1vbm90b25pYyBtaWxsaXNlY29uZHM6ICclcycgYmVmb3JlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2dyb3Vwc1sxXSwgZ3JvdXBzWzFdKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1syXSkgPT0gcGlkLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzJdKSA9PSBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzIElEIG1pc21hdGNoOiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cHNbMl0sIHBpZCkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGludChncm91cHNbM10pID09IGludChwcmV2aW91c19ncm91cHNbM10pICsgMSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KGdyb3Vwc1szXSkgPT0gaW50KHByZXZpb3VzX2dyb3Vwc1szXSkgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLXNlcXVlbnRpYWwgY291bnRlcjogJyVzJyBiZWZvcmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzNdLCBncm91cHNbM10pKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhncm91cHNbNF0gPT0gaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyb3Vwc1s0XSA9PSBob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvc3QgbmFtZSBtaXNtYXRjaDogJyVzJyBzaG91bGQgYmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JvdXBzWzRdLCBob3N0bmFtZSkpCiAgICAgICAgICAgICBwcmV2aW91c19ncm91cHMgPSBncm91cHMKICAgICAgICAgICAgIHRtcF9maWxlLndyaXRlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgICAgIHRtcF9maWxlLnNlZWsoMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0bXBfZmlsZS5yZWFkKCkgPT0gX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRtcF9maWxlLnJlYWQoKSA9PSBfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICB0bXBfZmlsZS5jbG9zZSgpCiAgICAgICAgIGZpbGVfY291bnQgPSBsZW4ob3MubGlzdGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgInRtcCIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZpbGVfY291bnQgPT0gcmVwZXRpdGlvbnMsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlX2NvdW50ID09IHJlcGV0aXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgIldyb25nIGZpbGUgY291bnQ6ICclcycgc2hvdWxkIGJlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgIChmaWxlX2NvdW50LCByZXBldGl0aW9ucykpCiAKICAgICBkZWYgdGVzdF9yZWZyZXNoKHNlbGYpOgogICAgICAgICAjIFVwZGF0ZSB0aGUgdGFibGUgb2YgY29udGVudHMKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHt9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll90b2MgPT0ge30pCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll90b2MgPT0ge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX3RvYyA9PSB7fSkKICAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll90b2MgPT0ge2tleTA6IG9zLnBhdGguam9pbignbmV3Jywga2V5MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKX0pCiAgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll90b2MgPT0ge2tleTA6IG9zLnBhdGguam9pbignbmV3Jywga2V5MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKX0pCiAgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTE6IG9zLnBhdGguam9pbignbmV3Jywga2V5MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Mjogb3MucGF0aC5qb2luKCduZXcnLCBrZXkyKX0pCiAKQEAgLTY4MCwxMSArNjgwLDExIEBACiAgICAgICAgICMgTG9vayB1cCBtZXNzYWdlIHN1YnBhdGhzIGluIHRoZSBUT0MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Ll9sb29rdXAoJ2ZvbycpKQogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX2xvb2t1cChrZXkwKSA9PSBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll9sb29rdXAoa2V5MCkgPT0gb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSkKICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnbmV3Jywga2V5MCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveC5fbG9va3VwKGtleTApKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll90b2MgPT0ge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX3RvYyA9PSB7fSkKIAogICAgIGRlZiB0ZXN0X2xvY2tfdW5sb2NrKHNlbGYpOgogICAgICAgICAjIExvY2sgYW5kIHVubG9jayB0aGUgbWFpbGJveC4gRm9yIE1haWxkaXIsIHRoaXMgZG9lcyBub3RoaW5nLgpAQCAtNjk4LDEwICs2OTgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIGJveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1kdW1teV9mYWN0b3J5KQogICAgICAgICBmb2xkZXIgPSBib3guYWRkX2ZvbGRlcignZm9sZGVyMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIuX2ZhY3RvcnkgaXMgZHVtbXlfZmFjdG9yeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvbGRlci5fZmFjdG9yeSBpcyBkdW1teV9mYWN0b3J5KQogCiAgICAgICAgIGZvbGRlcjFfYWxpYXMgPSBib3guZ2V0X2ZvbGRlcignZm9sZGVyMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIxX2FsaWFzLl9mYWN0b3J5IGlzIGR1bW15X2ZhY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2xkZXIxX2FsaWFzLl9mYWN0b3J5IGlzIGR1bW15X2ZhY3RvcnkpCiAKICAgICBkZWYgdGVzdF9kaXJlY3RvcnlfaW5fZm9sZGVyIChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgbWFpbGJveGVzIHN0aWxsIHdvcmsgaWYgdGhlcmUncyBhIHN0cmF5IGV4dHJhIGRpcmVjdG9yeQpAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICAgICAgICBvcy51bWFzayhvcmlnX3VtYXNrKQogICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHNlbGYuX2JveC5fbG9va3VwKGtleSkpCiAgICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1vZGUgJiAwMTExID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2RlICYgMDExMSA9PSAwKQogCiAgICAgZGVmIHRlc3RfZm9sZGVyX2ZpbGVfcGVybXMoc2VsZik6CiAgICAgICAgICMgRnJvbSBidWcgIzMyMjgsIHdlIHdhbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgY3JlYXRlZCBpbnNpZGUgYSBNYWlsZGlyCkBAIC03OTAsOCArNzkwLDggQEAKICAgICBkZWYgdGVzdF9hZGRfZnJvbV9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgQWRkIGEgc3RyaW5nIHN0YXJ0aW5nIHdpdGggJ0Zyb20gJyB0byB0aGUgbWFpbGJveAogICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjAnKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94W2tleV0uZ2V0X2Zyb20oKSA9PSAnZm9vQGJhciBibGFoJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveFtrZXldLmdldF9wYXlsb2FkKCkgPT0gJzAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94W2tleV0uZ2V0X2Zyb20oKSA9PSAnZm9vQGJhciBibGFoJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveFtrZXldLmdldF9wYXlsb2FkKCkgPT0gJzAnKQogCiAgICAgZGVmIHRlc3RfYWRkX21ib3hfb3JfbW1kZl9tZXNzYWdlKHNlbGYpOgogICAgICAgICAjIEFkZCBhbiBtYm94TWVzc2FnZSBvciBNTURGTWVzc2FnZQpAQCAtODA3LDExICs4MDcsMTEgQEAKICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKICAgICAgICAgbXRpbWUgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYuX3BhdGgpCiAgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAzKQogICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2JveC5pdGVya2V5cygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gdmFsdWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gdmFsdWVzKQogICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8obXRpbWUgPT0gb3MucGF0aC5nZXRtdGltZShzZWxmLl9wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG10aW1lID09IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5fcGF0aCkpCiAKICAgICBkZWYgdGVzdF9hZGRfYW5kX2Nsb3NlKHNlbGYpOgogICAgICAgICAjIFZlcmlmeWluZyB0aGF0IGNsb3NpbmcgYSBtYWlsYm94IGRvZXNuJ3QgY2hhbmdlIGFkZGVkIGl0ZW1zCkBAIC04MjMsNyArODIzLDcgQEAKICAgICAgICAgc2VsZi5fYm94Ll9maWxlLnNlZWsoMCkKICAgICAgICAgY29udGVudHMgPSBzZWxmLl9ib3guX2ZpbGUucmVhZCgpCiAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb250ZW50cyA9PSBvcGVuKHNlbGYuX3BhdGgsICdyYicpLnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbnRlbnRzID09IG9wZW4oc2VsZi5fcGF0aCwgJ3JiJykucmVhZCgpKQogICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCiAKICAgICBkZWYgdGVzdF9sb2NrX2NvbmZsaWN0KHNlbGYpOgpAQCAtODY0LDcgKzg2NCw3IEBACiAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKICAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQobXNnKQogICAgICAgICBzZWxmLl9ib3guZmx1c2goKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll9sb2NrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX2xvY2tlZCkKICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKIAogCkBAIC05MDUsOCArOTA1LDggQEAKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndGhyZWUnKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0KICAgICAgICAgICAgICAgICAgICAgIHNldCgoJ29uZScsICd0d28nLCAndGhyZWUnKSkpCiAKICAgICBkZWYgdGVzdF9nZXRfZm9sZGVyKHNlbGYpOgpAQCAtOTE4LDU0ICs5MTgsNTQgQEAKICAgICAgICAgbmV3X2ZvbGRlciA9IHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdmb28uYmFyJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2Zvby5iYXInKSkpCiAgICAgICAgIGZvbGRlcjEgPSBzZWxmLl9ib3guZ2V0X2ZvbGRlcignZm9vLmJhcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIxLmdldF9zdHJpbmcoZm9sZGVyMS5rZXlzKClbMF0pID09IFwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKIAogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU2OTc5MDogdmVyaWZ5IHRoYXQgZm9sZGVycyByZXR1cm5lZCBieSAuZ2V0X2ZvbGRlcigpCiAgICAgICAgICMgdXNlIHRoZSBzYW1lIGZhY3RvcnkgZnVuY3Rpb24uCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhuZXdfZm9sZGVyLl9mYWN0b3J5IGlzIHNlbGYuX2JveC5fZmFjdG9yeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjAuX2ZhY3RvcnkgaXMgc2VsZi5fYm94Ll9mYWN0b3J5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmV3X2ZvbGRlci5fZmFjdG9yeSBpcyBzZWxmLl9ib3guX2ZhY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2xkZXIwLl9mYWN0b3J5IGlzIHNlbGYuX2JveC5fZmFjdG9yeSkKIAogICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CiAgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ29uZScsICd0d28nKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgnb25lJywgJ3R3bycpKSkKICAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ29uZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndGhyZWUnKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsICd0aHJlZScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCAndGhyZWUnKSkpCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0aHJlZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndHdvJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpID09IFtdKQogCiAgICAgZGVmIHRlc3Rfc2VxdWVuY2VzKHNlbGYpOgogICAgICAgICAjIEdldCBhbmQgc2V0IHNlcXVlbmNlcwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0ge30pCiAgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIG1zZzAuYWRkX3NlcXVlbmNlKCdmb28nKQogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7J2Zvbyc6W2tleTBdfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0geydmb28nOltrZXkwXX0pCiAgICAgICAgIG1zZzEgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCiAgICAgICAgIG1zZzEuc2V0X3NlcXVlbmNlcyhbJ2JhcicsICdyZXBsaWVkJywgJ2ZvbyddKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLCBrZXkxXSwgJ2Jhcic6W2tleTFdLCAncmVwbGllZCc6W2tleTFdfSkKICAgICAgICAgbXNnMC5zZXRfc2VxdWVuY2VzKFsnZmxhZ2dlZCddKQogICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBtc2cwCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CiAgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6W2tleTFdLCAnYmFyJzpba2V5MV0sICdyZXBsaWVkJzpba2V5MV0sCiAgICAgICAgICAgICAgICAgICAgICAgJ2ZsYWdnZWQnOltrZXkwXX0pCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0geydmbGFnZ2VkJzpba2V5MF19KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7J2ZsYWdnZWQnOltrZXkwXX0pCiAKICAgICBkZWYgdGVzdF9pc3N1ZTI2MjUoc2VsZik6CiAgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCkBAIC05ODcsMTkgKzk4NywxOSBAQAogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQogICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cyKQogICAgICAgICBrZXkzID0gc2VsZi5fYm94LmFkZChtc2czKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLGtleTEsa2V5MixrZXkzXSwgJ3Vuc2Vlbic6W2tleTBdLAogICAgICAgICAgICAgICAgICAgICAgICdmbGFnZ2VkJzpba2V5Ml0sICdiYXInOltrZXkzXSwgJ3JlcGxpZWQnOltrZXkzXX0pCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KICAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpba2V5MCxrZXkxLGtleTNdLCAndW5zZWVuJzpba2V5MF0sICdiYXInOltrZXkzXSwKICAgICAgICAgICAgICAgICAgICAgICAncmVwbGllZCc6W2tleTNdfSkKICAgICAgICAgc2VsZi5fYm94LnBhY2soKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmtleXMoKSA9PSBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3gua2V5cygpID09IFsxLCAyLCAzXSkKICAgICAgICAga2V5MCA9IGtleTAKICAgICAgICAga2V5MSA9IGtleTAgKyAxCiAgICAgICAgIGtleTIgPSBrZXkxICsgMQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzXSwgJ3Vuc2Vlbic6WzFdLCAnYmFyJzpbM10sICdyZXBsaWVkJzpbM119KQogCiAgICAgICAgICMgVGVzdCBjYXNlIGZvciBwYWNraW5nIHdoaWxlIGhvbGRpbmcgdGhlIG1haWxib3ggbG9ja2VkLgpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICAgICAgc2VsZi5fYm94LmxvY2soKQogICAgICAgICBzZWxmLl9ib3gucGFjaygpCiAgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzLCA0LCA1XSwKICAgICAgICAgICAgICAgICAgICAgICAndW5zZWVuJzpbMV0sICdiYXInOlszXSwgJ3JlcGxpZWQnOlszXX0pCiAKQEAgLTEwMzMsMjEgKzEwMzMsMjEgQEAKIAogICAgIGRlZiB0ZXN0X2xhYmVscyhzZWxmKToKICAgICAgICAgIyBHZXQgbGFiZWxzIGZyb20gdGhlIG1haWxib3gKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfbGFiZWxzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X2xhYmVscygpID09IFtdKQogICAgICAgICBtc2cwID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBtc2cwLmFkZF9sYWJlbCgnZm9vJykKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfbGFiZWxzKCkgPT0gWydmb28nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfbGFiZWxzKCkgPT0gWydmb28nXSkKICAgICAgICAgbXNnMSA9IG1haWxib3guQmFieWxNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMSkKICAgICAgICAgbXNnMS5zZXRfbGFiZWxzKFsnYmFyJywgJ2Fuc3dlcmVkJywgJ2ZvbyddKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5nZXRfbGFiZWxzKCkpID09IHNldChbJ2ZvbycsICdiYXInXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0gc2V0KFsnZm9vJywgJ2JhciddKSkKICAgICAgICAgbXNnMC5zZXRfbGFiZWxzKFsnYmxhaCcsICdmaWxlZCddKQogICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBtc2cwCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2V0KFsnZm9vJywgJ2JhcicsICdibGFoJ10pKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0gc2V0KFsnYmxhaCddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSA9PSBzZXQoWydibGFoJ10pKQogCiAKIGNsYXNzIFRlc3RNZXNzYWdlKFRlc3RCYXNlKToKQEAgLTEwODcsMTIgKzEwODcsMTIgQEAKICAgICAgICAgIyBJbml0aWFsaXplIHdpdGhvdXQgYXJndW1lbnRzCiAgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoKQogICAgICAgICBzZWxmLl9wb3N0X2luaXRpYWxpemVfaG9vayhtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1zZywgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnLCBtYWlsYm94Lk1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2csIHNlbGYuX2ZhY3RvcnkpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmtleXMoKSA9PSBbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtc2cuaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3BheWxvYWQoKSA9PSBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2csIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZywgbWFpbGJveC5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLCBzZWxmLl9mYWN0b3J5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5rZXlzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9wYXlsb2FkKCkgPT0gTm9uZSkKIAogICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfaW5jb3JyZWN0bHkoc2VsZik6CiAgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgYXJndW1lbnQKQEAgLTExMjcsNzIgKzExMjcsNzIgQEAKICAgICBfZmFjdG9yeSA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UKIAogICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5fc3ViZGlyID09ICduZXcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLl9pbmZvID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLl9zdWJkaXIgPT0gJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuX2luZm8gPT0gJycpCiAKICAgICBkZWYgdGVzdF9zdWJkaXIoc2VsZik6CiAgICAgICAgICMgVXNlIGdldF9zdWJkaXIoKSBhbmQgc2V0X3N1YmRpcigpCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCduZXcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogbXNnLnNldF9zdWJkaXIoJ3RtcCcpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCduZXcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCiAKICAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKICAgICAgICAgIyBVc2UgZ2V0X2ZsYWdzKCksIHNldF9mbGFncygpLCBhZGRfZmxhZygpLCByZW1vdmVfZmxhZygpCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ0YnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnRicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdGJykKICAgICAgICAgbXNnLnNldF9mbGFncygnU0RUUCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0RQU1QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdEUFNUJykKICAgICAgICAgbXNnLmFkZF9mbGFnKCdGVCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0RGUFNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnREZQU1QnKQogICAgICAgICBtc2cucmVtb3ZlX2ZsYWcoJ1REUlAnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdGUycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQogCiAgICAgZGVmIHRlc3RfZGF0ZShzZWxmKToKICAgICAgICAgIyBVc2UgZ2V0X2RhdGUoKSBhbmQgc2V0X2RhdGUoKQogICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFicyhtc2cuZ2V0X2RhdGUoKSAtIHRpbWUudGltZSgpKSA8IDYwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKG1zZy5nZXRfZGF0ZSgpIC0gdGltZS50aW1lKCkpIDwgNjApCiAgICAgICAgIG1zZy5zZXRfZGF0ZSgwLjApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2RhdGUoKSA9PSAwLjApCiAKICAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgogICAgICAgICAjIFVzZSBnZXRfaW5mbygpIGFuZCBzZXRfaW5mbygpCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2luZm8oKSA9PSAnJykKICAgICAgICAgbXNnLnNldF9pbmZvKCcxLGZvbz1iYXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzEsZm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2luZm8oKSA9PSAnMSxmb289YmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1zZy5zZXRfaW5mbyhOb25lKSkKICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKIAogICAgIGRlZiB0ZXN0X2luZm9fYW5kX2ZsYWdzKHNlbGYpOgogICAgICAgICAjIFRlc3QgaW50ZXJhY3Rpb24gb2YgaW5mbyBhbmQgZmxhZyBtZXRob2RzCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2luZm8oKSA9PSAnJykKICAgICAgICAgbXNnLnNldF9mbGFncygnU0YnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2luZm8oKSA9PSAnMixGUycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0ZTJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfaW5mbygpID09ICcyLEZTJykKICAgICAgICAgbXNnLnNldF9pbmZvKCcxLCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2luZm8oKSA9PSAnMSwnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9pbmZvKCkgPT0gJzEsJykKICAgICAgICAgbXNnLnJlbW92ZV9mbGFnKCdSUFQnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzEsJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfaW5mbygpID09ICcxLCcpCiAgICAgICAgIG1zZy5hZGRfZmxhZygnRCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0QnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzIsRCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9pbmZvKCkgPT0gJzIsRCcpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCiAKIApAQCAtMTIwOCwxNCArMTIwOCwxNCBAQAogICAgICAgICBtc2cgPSBtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBtc2cuc2V0X3VuaXhmcm9tKCdGcm9tIGZvb0BiYXIgYmxhaCcpCiAgICAgICAgIG1zZyA9IG1haWxib3gubWJveE1lc3NhZ2UobXNnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXIgYmxhaCcsIG1zZy5nZXRfZnJvbSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXIgYmxhaCcsIG1zZy5nZXRfZnJvbSgpKQogCiAgICAgZGVmIHRlc3RfZnJvbShzZWxmKToKICAgICAgICAgIyBHZXQgYW5kIHNldCAiRnJvbSAiIGxpbmUKICAgICAgICAgbXNnID0gbWFpbGJveC5tYm94TWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnKQogICAgICAgICBtc2cuc2V0X2Zyb20oJ2ZvbyBiYXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ2ZvbyBiYXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mcm9tKCkgPT0gJ2ZvbyBiYXInKQogICAgICAgICBtc2cuc2V0X2Zyb20oJ2Zvb0BiYXInLCBUcnVlKQogICAgICAgICBzZWxmLl9jaGVja19mcm9tKG1zZywgJ2Zvb0BiYXInKQogICAgICAgICBtc2cuc2V0X2Zyb20oJ2JsYWhAdGVtcCcsIHRpbWUubG9jYWx0aW1lKCkpCkBAIC0xMjI0LDIyICsxMjI0LDIyIEBACiAgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CiAgICAgICAgICMgVXNlIGdldF9mbGFncygpLCBzZXRfZmxhZ3MoKSwgYWRkX2ZsYWcoKSwgcmVtb3ZlX2ZsYWcoKQogICAgICAgICBtc2cgPSBtYWlsYm94Lm1ib3hNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKICAgICAgICAgbXNnLnNldF9mbGFncygnRicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0YnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdGJykKICAgICAgICAgbXNnLnNldF9mbGFncygnWE9EUicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPRFgnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdST0RYJykKICAgICAgICAgbXNnLmFkZF9mbGFnKCdGQScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPREZBWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPREZBWCcpCiAgICAgICAgIG1zZy5yZW1vdmVfZmxhZygnRkRYQScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnUk8nKQogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQogCiAgICAgZGVmIF9jaGVja19mcm9tKHNlbGYsIG1zZywgc2VuZGVyPU5vbmUpOgogICAgICAgICAjIENoZWNrIGNvbnRlbnRzIG9mICJGcm9tICIgbGluZQogICAgICAgICBpZiBzZW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgIHNlbmRlciA9ICJNQUlMRVItREFFTU9OIgotICAgICAgICBzZWxmLmFzc2VydF8ocmUubWF0Y2goc2VuZGVyICsgciIgXHd7M30gXHd7M30gW1xkIF1cZCBbXGQgXVxkOlxkezJ9OiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHNlbmRlciArIHIiIFx3ezN9IFx3ezN9IFtcZCBdXGQgW1xkIF1cZDpcZHsyfToiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlxkezJ9IFxkezR9IiwgbXNnLmdldF9mcm9tKCkpIGlzIG5vdCBOb25lKQogCiAKQEAgLTEyNTMsMzAgKzEyNTMsMzAgQEAKICAgICBfZmFjdG9yeSA9IG1haWxib3guTUhNZXNzYWdlCiAKICAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuX3NlcXVlbmNlcyA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5fc2VxdWVuY2VzID09IFtdKQogCiAgICAgZGVmIHRlc3Rfc2VxdWVuY2VzKHNlbGYpOgogICAgICAgICAjIEdldCwgc2V0LCBqb2luLCBhbmQgbGVhdmUgc2VxdWVuY2VzCiAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFtdKQogICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhciddKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2Zvb2JhciddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2Zvb2JhciddKQogICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFtdKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbiddKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWyd1bnNlZW4nLCAnZmxhZ2dlZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pCiAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsndW5zZWVuJywgJ2ZsYWdnZWQnXSkKICAgICAgICAgbXNnLnJlbW92ZV9zZXF1ZW5jZSgndW5zZWVuJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmbGFnZ2VkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZmxhZ2dlZCddKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmb29iYXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2ZsYWdnZWQnLCAnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZmxhZ2dlZCcsICdmb29iYXInXSkKICAgICAgICAgbXNnLnJlbW92ZV9zZXF1ZW5jZSgncmVwbGllZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZmxhZ2dlZCcsICdmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmbGFnZ2VkJywgJ2Zvb2JhciddKQogICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhcicsICdyZXBsaWVkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZm9vYmFyJywgJ3JlcGxpZWQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmb29iYXInLCAncmVwbGllZCddKQogCiAKIGNsYXNzIFRlc3RCYWJ5bE1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgpAQCAtMTI4NCw1NCArMTI4NCw1NCBAQAogICAgIF9mYWN0b3J5ID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UKIAogICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5fbGFiZWxzID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLl9sYWJlbHMgPT0gW10pCiAKICAgICBkZWYgdGVzdF9sYWJlbHMoc2VsZik6CiAgICAgICAgICMgR2V0LCBzZXQsIGpvaW4sIGFuZCBsZWF2ZSBsYWJlbHMKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gW10pCiAgICAgICAgIG1zZy5zZXRfbGFiZWxzKFsnZm9vYmFyJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJ10pCiAgICAgICAgIG1zZy5zZXRfbGFiZWxzKFtdKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gW10pCiAgICAgICAgIG1zZy5hZGRfbGFiZWwoJ2ZpbGVkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydmaWxlZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9sYWJlbHMoKSA9PSBbJ2ZpbGVkJ10pCiAgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCiAgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCiAgICAgICAgIG1zZy5yZW1vdmVfbGFiZWwoJ2ZpbGVkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnXSkKICAgICAgICAgbXNnLmFkZF9sYWJlbCgnZm9vYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnLCAnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsncmVzZW50JywgJ2Zvb2JhciddKQogICAgICAgICBtc2cucmVtb3ZlX2xhYmVsKCd1bnNlZW4nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbJ3Jlc2VudCcsICdmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnLCAnZm9vYmFyJ10pCiAgICAgICAgIG1zZy5zZXRfbGFiZWxzKFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCiAKICAgICBkZWYgdGVzdF92aXNpYmxlKHNlbGYpOgogICAgICAgICAjIEdldCwgc2V0LCBhbmQgdXBkYXRlIHZpc2libGUgaGVhZGVycwogICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQotICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5rZXlzKCkgPT0gW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGUua2V5cygpID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCiAgICAgICAgIHZpc2libGVbJ1VzZXItQWdlbnQnXSA9ICdGb29CYXIgMS4wJwogICAgICAgICB2aXNpYmxlWydYLVdoYXRldmVyJ10gPSAnQmxhaCcKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBbXSkKICAgICAgICAgbXNnLnNldF92aXNpYmxlKHZpc2libGUpCiAgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQotICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5rZXlzKCkgPT0gWydVc2VyLUFnZW50JywgJ1gtV2hhdGV2ZXInXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHZpc2libGVbJ1VzZXItQWdlbnQnXSA9PSAnRm9vQmFyIDEuMCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlWydYLVdoYXRldmVyJ10gPT0gJ0JsYWgnKQotICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aXNpYmxlLmtleXMoKSA9PSBbJ1VzZXItQWdlbnQnLCAnWC1XaGF0ZXZlciddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmlzaWJsZVsnVXNlci1BZ2VudCddID09ICdGb29CYXIgMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGVbJ1gtV2hhdGV2ZXInXSA9PSAnQmxhaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKICAgICAgICAgbXNnLnVwZGF0ZV92aXNpYmxlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHZpc2libGUua2V5cygpID09IFsnVXNlci1BZ2VudCcsICdYLVdoYXRldmVyJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGUua2V5cygpID09IFsnVXNlci1BZ2VudCcsICdYLVdoYXRldmVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKICAgICAgICAgdmlzaWJsZSA9IG1zZy5nZXRfdmlzaWJsZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmtleXMoKSA9PSBbJ1VzZXItQWdlbnQnLCAnRGF0ZScsICdGcm9tJywgJ1RvJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGUua2V5cygpID09IFsnVXNlci1BZ2VudCcsICdEYXRlJywgJ0Zyb20nLCAnVG8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdWJqZWN0J10pCiAgICAgICAgIGZvciBoZWFkZXIgaW4gKCdVc2VyLUFnZW50JywgJ0RhdGUnLCAnRnJvbScsICdUbycsICdTdWJqZWN0Jyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZVtoZWFkZXJdID09IG1zZ1toZWFkZXJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGVbaGVhZGVyXSA9PSBtc2dbaGVhZGVyXSkKIAogCiBjbGFzcyBUZXN0TU1ERk1lc3NhZ2UoX1Rlc3RNYm94TU1ERk1lc3NhZ2UpOgpAQCAtMTM3NCw5ICsxMzc0LDkgQEAKICAgICAgICAgZGF0ZSA9IG1zZ19tYWlsZGlyLmdldF9kYXRlKCkKICAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWFpbGRpcikKICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnREZQUlNUJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSBkYXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdERlBSU1QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZGF0ZSgpID09IGRhdGUpCiAKICAgICBkZWYgdGVzdF9tYWlsZGlyX3RvX21ib3htbWRmKHNlbGYpOgogICAgICAgICAjIENvbnZlcnQgTWFpbGRpck1lc3NhZ2UgdG8gbWJveG1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlCkBAIC0xMzg4LDExICsxMzg4LDExIEBACiAgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncyhzZXR0aW5nKQogICAgICAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhtc2dfbWFpbGRpcikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09IHJlc3VsdCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ01BSUxFUi1EQUVNT04gJXMnICUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mcm9tKCkgPT0gJ01BSUxFUi1EQUVNT04gJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKDAuMCkpKQogICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X3N1YmRpcignY3VyJykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnX21haWxkaXIpLmdldF9mbGFncygpID09ICdST0RGQScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xhc3NfKG1zZ19tYWlsZGlyKS5nZXRfZmxhZ3MoKSA9PSAnUk9ERkEnKQogCiAgICAgZGVmIHRlc3RfbWFpbGRpcl90b19taChzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIE1ITWVzc2FnZQpAQCAtMTQwMiw3ICsxNDAyLDcgQEAKICAgICAgICAgICAgICAgICAgKCdUJywgWyd1bnNlZW4nXSksICgnREZQUlNUJywgWydyZXBsaWVkJywgJ2ZsYWdnZWQnXSkpCiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZmxhZ3Moc2V0dGluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWFpbGRpcikuZ2V0X3NlcXVlbmNlcygpID09IFwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWFpbGRpcikuZ2V0X3NlcXVlbmNlcygpID09IFwKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpCiAKICAgICBkZWYgdGVzdF9tYWlsZGlyX3RvX2JhYnlsKHNlbGYpOgpAQCAtMTQxNCw3ICsxNDE0LDcgQEAKICAgICAgICAgICAgICAgICAgKCdERlBSU1QnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJ10pKQogICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X2ZsYWdzKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9sYWJlbHMoKSA9PSBcCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9sYWJlbHMoKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQogCiAgICAgZGVmIHRlc3RfbWJveG1tZGZfdG9fbWFpbGRpcihzZWxmKToKQEAgLTE0MjcsMTAgKzE0MjcsMTAgQEAKICAgICAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncyhzZXR0aW5nKQogICAgICAgICAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnX21ib3hNTURGKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSAwLjAsIG1zZy5nZXRfZGF0ZSgpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2RhdGUoKSA9PSAwLjAsIG1zZy5nZXRfZGF0ZSgpKQogICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncygnTycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zdWJkaXIoKSA9PSBcCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zdWJkaXIoKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cicpCiAKICAgICBkZWYgdGVzdF9tYm94bW1kZl90b19tYm94bW1kZihzZWxmKToKQEAgLTE0NDEsOCArMTQ0MSw4IEBACiAgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2Zyb20oJ2Zvb0BiYXInKQogICAgICAgICAgICAgZm9yIGNsYXNzMl8gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgogICAgICAgICAgICAgICAgIG1zZzIgPSBjbGFzczJfKG1zZ19tYm94TU1ERikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnMi5nZXRfZmxhZ3MoKSA9PSAnUk9ERkEnKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cyLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXInKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmdldF9mbGFncygpID09ICdST0RGQScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZ2V0X2Zyb20oKSA9PSAnZm9vQGJhcicpCiAKICAgICBkZWYgdGVzdF9tYm94bW1kZl90b19taChzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBNSE1lc3NhZ2UKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAoJ1JPREZBJywgWydyZXBsaWVkJywgJ2ZsYWdnZWQnXSkpCiAgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3Moc2V0dGluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnX21ib3hNTURGKS5nZXRfc2VxdWVuY2VzKCkgXAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zZXF1ZW5jZXMoKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHJlc3VsdCkKIAogICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX2JhYnlsKHNlbGYpOgpAQCAtMTQ2Nyw3ICsxNDY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnXSkpCiAgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgICAgIG1zZy5zZXRfZmxhZ3Moc2V0dGluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpLmdldF9sYWJlbHMoKSA9PSByZXN1bHQpCiAKICAgICBkZWYgdGVzdF9taF90b19tYWlsZGlyKHNlbGYpOgogICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIE1haWxkaXJNZXNzYWdlCkBAIC0xNDc1LDE0ICsxNDc1LDE0IEBACiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpID09ICdjdXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ0ZSJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ0ZSJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCiAKICAgICBkZWYgdGVzdF9taF90b19tYm94bW1kZihzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IE1ITWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKQEAgLTE0OTEsMTMgKzE0OTEsMTMgQEAKICAgICAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2Uoc2V0dGluZykKICAgICAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCiAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPRkEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPRkEnKQogCiAgICAgZGVmIHRlc3RfbWhfdG9fbWgoc2VsZik6CiAgICAgICAgICMgQ29udmVydCBNSE1lc3NhZ2UgdG8gTUhNZXNzYWdlCkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1ITWVzc2FnZShtc2cpLmdldF9zZXF1ZW5jZXMoKSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1ITWVzc2FnZShtc2cpLmdldF9zZXF1ZW5jZXMoKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBbJ3Vuc2VlbicsICdyZXBsaWVkJywgJ2ZsYWdnZWQnXSkKIAogICAgIGRlZiB0ZXN0X21oX3RvX2JhYnlsKHNlbGYpOgpAQCAtMTUxNSwxMiArMTUxNSwxMiBAQAogICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZShzZXR0aW5nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guQmFieWxNZXNzYWdlKG1zZykuZ2V0X2xhYmVscygpID09IHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpLmdldF9sYWJlbHMoKSA9PSByZXN1bHQpCiAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCiAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSkKIAogICAgIGRlZiB0ZXN0X2JhYnlsX3RvX21haWxkaXIoc2VsZik6CkBAIC0xNTMxLDE0ICsxNTMxLDE0IEBACiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpID09ICdjdXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09ICdQUlQnKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSAnUFJUJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCiAKICAgICBkZWYgdGVzdF9iYWJ5bF90b19tYm94bW1kZihzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IEJhYnlsTWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKQEAgLTE1NDksMTMgKzE1NDksMTMgQEAKICAgICAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgogICAgICAgICAgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xhc3NfKG1zZykuZ2V0X2ZsYWdzKCkgPT0gcmVzdWx0KQogICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgIGZvciBsYWJlbCBpbiAoJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKICAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCiAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPREEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPREEnKQogCiAgICAgZGVmIHRlc3RfYmFieWxfdG9fbWgoc2VsZik6CiAgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gTUhNZXNzYWdlCkBAIC0xNTY1LDEyICsxNTY1LDEyIEBACiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTUhNZXNzYWdlKG1zZykuZ2V0X3NlcXVlbmNlcygpID09IHJlc3VsdCkKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAncmVwbGllZCddKQogCiAgICAgZGVmIHRlc3RfYmFieWxfdG9fYmFieWwoc2VsZik6CkBAIC0xNTgxLDEyICsxNTgxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKICAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCiAgICAgICAgIG1zZzIgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cyLmdldF9sYWJlbHMoKSA9PSBbJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZ2V0X2xhYmVscygpID09IFsndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLCAnZWRpdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzZW50J10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCkgPT0gbXNnMi5nZXRfdmlzaWJsZSgpLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBtc2cyLmdldF92aXNpYmxlKCkua2V5cygpKQogICAgICAgICBmb3Iga2V5IGluIG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3Zpc2libGUoKVtrZXldID09IG1zZzIuZ2V0X3Zpc2libGUoKVtrZXldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfdmlzaWJsZSgpW2tleV0gPT0gbXNnMi5nZXRfdmlzaWJsZSgpW2tleV0pCiAKIAogY2xhc3MgVGVzdFByb3h5RmlsZUJhc2UoVGVzdEJhc2UpOgpAQCAtMTU5NCw2OSArMTU5NCw2OSBAQAogICAgIGRlZiBfdGVzdF9yZWFkKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBSZWFkIGJ5IGJ5dGUKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgpID09ICdiYXInKQogICAgICAgICBwcm94eS5zZWVrKDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKCkgPT0gJ2FyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWQoKSA9PSAnYXInKQogICAgICAgICBwcm94eS5zZWVrKDApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKDIpID09ICdiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkKDIpID09ICdiYScpCiAgICAgICAgIHByb3h5LnNlZWsoMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQoLTEpID09ICdhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkKC0xKSA9PSAnYXInKQogICAgICAgICBwcm94eS5zZWVrKDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKDEwMDApID09ICdyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWQoMTAwMCkgPT0gJ3InKQogCiAgICAgZGVmIF90ZXN0X3JlYWRsaW5lKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBSZWFkIGJ5IGxpbmUKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnZm9vJyArIG9zLmxpbmVzZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZSgpID09ICdiYXInICsgb3MubGluZXNlcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2ZyZWQnICsgb3MubGluZXNlcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2JvYicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkbGluZSgpID09ICdmb28nICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2JhcicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnYm9iJykKICAgICAgICAgcHJveHkuc2VlaygyKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnbycgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnbycgKyBvcy5saW5lc2VwKQogICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQogICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoMikgPT0gJ2ZyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKC0xMCkgPT0gJ2VkJyArIG9zLmxpbmVzZXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkbGluZSgyKSA9PSAnZnInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoLTEwKSA9PSAnZWQnICsgb3MubGluZXNlcCkKIAogICAgIGRlZiBfdGVzdF9yZWFkbGluZXMoc2VsZiwgcHJveHkpOgogICAgICAgICAjIFJlYWQgbXVsdGlwbGUgbGluZXMKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmVzKCkgPT0gWydmb28nICsgb3MubGluZXNlcCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWRsaW5lcygpID09IFsnZm9vJyArIG9zLmxpbmVzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhcicgKyBvcy5saW5lc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmVzKDIpID09IFsnZm9vJyArIG9zLmxpbmVzZXBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmVzKDIpID09IFsnZm9vJyArIG9zLmxpbmVzZXBdKQogICAgICAgICBwcm94eS5zZWVrKDMgKyBsZW4ob3MubGluZXNlcCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZXMoNCArIGxlbihvcy5saW5lc2VwKSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWRsaW5lcyg0ICsgbGVuKG9zLmxpbmVzZXApKSA9PQogICAgICAgICAgICAgICAgICAgICAgWydiYXInICsgb3MubGluZXNlcCwgJ2ZyZWQnICsgb3MubGluZXNlcF0pCiAgICAgICAgIHByb3h5LnNlZWsoMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lcygxMDAwKSA9PSBbb3MubGluZXNlcCwgJ2JhcicgKyBvcy5saW5lc2VwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmVzKDEwMDApID09IFtvcy5saW5lc2VwLCAnYmFyJyArIG9zLmxpbmVzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKIAogICAgIGRlZiBfdGVzdF9pdGVyYXRpb24oc2VsZiwgcHJveHkpOgogICAgICAgICAjIEl0ZXJhdGUgYnkgbGluZQogICAgICAgICBwcm94eS5zZWVrKDApCiAgICAgICAgIGl0ZXJhdG9yID0gaXRlcihwcm94eSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGl0ZXJhdG9yLm5leHQoKSA9PSAnZm9vJyArIG9zLmxpbmVzZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpdGVyYXRvci5uZXh0KCkgPT0gJ2JhcicgKyBvcy5saW5lc2VwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXRlcmF0b3IubmV4dCgpID09ICdmcmVkJyArIG9zLmxpbmVzZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpdGVyYXRvci5uZXh0KCkgPT0gJ2JvYicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdGVyYXRvci5uZXh0KCkgPT0gJ2ZvbycgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlcmF0b3IubmV4dCgpID09ICdiYXInICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZXJhdG9yLm5leHQoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlcmF0b3IubmV4dCgpID09ICdib2InKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBsYW1iZGE6IGl0ZXJhdG9yLm5leHQoKSkKIAogICAgIGRlZiBfdGVzdF9zZWVrX2FuZF90ZWxsKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBTZWVrIGFuZCB1c2UgdGVsbCB0byBjaGVjayBwb3NpdGlvbgogICAgICAgICBwcm94eS5zZWVrKDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS50ZWxsKCkgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQobGVuKG9zLmxpbmVzZXApKSA9PSBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkudGVsbCgpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkKGxlbihvcy5saW5lc2VwKSkgPT0gb3MubGluZXNlcCkKICAgICAgICAgcHJveHkuc2VlaygyLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgxICsgbGVuKG9zLmxpbmVzZXApKSA9PSAncicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgxICsgbGVuKG9zLmxpbmVzZXApKSA9PSAncicgKyBvcy5saW5lc2VwKQogICAgICAgICBwcm94eS5zZWVrKC0zIC0gbGVuKG9zLmxpbmVzZXApLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgzKSA9PSAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWQoMykgPT0gJ2JhcicpCiAgICAgICAgIHByb3h5LnNlZWsoMiwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQoKSA9PSAnbycgKyBvcy5saW5lc2VwICsgJ2JhcicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgpID09ICdvJyArIG9zLmxpbmVzZXAgKyAnYmFyJyArIG9zLmxpbmVzZXApCiAgICAgICAgIHByb3h5LnNlZWsoMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgpID09ICcnKQogCiAgICAgZGVmIF90ZXN0X2Nsb3NlKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBDbG9zZSBhIGZpbGUKQEAgLTE2NzksMTEgKzE2NzksMTEgQEAKICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJykKICAgICAgICAgcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKICAgICAgICAgcHJveHkwID0gbWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eTAudGVsbCgpID09IHBvcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5MC50ZWxsKCkgPT0gcG9zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZmlsZS50ZWxsKCkgPT0gcG9zKQogICAgICAgICBwcm94eTEgPSBtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5MS50ZWxsKCkgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5MS50ZWxsKCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKIAogICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CiAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2JhcicpCkBAIC0xNzI4LDggKzE3MjgsOCBAQAogICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28nICsgb3MubGluZXNlcCArICdiYXInKQogICAgICAgICBwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQogICAgICAgICBwcm94eSA9IG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDIsIDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS50ZWxsKCkgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnRlbGwoKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZmlsZS50ZWxsKCkgPT0gcG9zKQogCiAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKioqYmFyKioqJykKQEAgLTE4MjEsMzYgKzE4MjEsMzYgQEAKICAgICAgICAgIyBUZXN0IGZvciByZWdyZXNzaW9uIG9uIGJ1ZyAjMTE3NDkwOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgYm94ZXMgYXR0cmlidXRlIGFjdHVhbGx5IGdldHMgc2V0LgogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgI3NlbGYuYXNzZXJ0XyhoYXNhdHRyKHNlbGYubWJveCwgImJveGVzIikpCi0gICAgICAgICNzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYubWJveCwgImJveGVzIikpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfY3VyKHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICAjc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCiAgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9uZXcoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICNzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCiAKICAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX2JvdGgoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJuZXciKQogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgI3NlbGYuYXNzZXJ0XyhsZW4oc2VsZi5tYm94LmJveGVzKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCiAgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgogICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQppbmRleCA5NDNhYTU1Li4wY2Q0NmEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgICAgICAgIHQgPSBjb25zdHJ1Y3RvcihzZWxmLmQua2V5cygpKQogICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShuZXcsIGNvbnN0cnVjdG9yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG5ldywgY29uc3RydWN0b3IpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZCh0KSwgaWQobmV3KSkKICAgICAgICAgICAgIG1hcnNoYWwuZHVtcCh0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKaW5kZXggMDEwOGQ0OS4uM2FiYjg0YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKDEpJywgbWF0aC5hY29zKDEpLCAwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3MsIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFjb3MoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYWNvcyhOQU4pKSkKIAogICAgIGRlZiB0ZXN0QWNvc2goc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hY29zaCkKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zaCwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguYWNvc2goSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3NoLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFjb3NoKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFjb3NoKE5BTikpKQogCiAgICAgZGVmIHRlc3RBc2luKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXNpbikKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigxKScsIG1hdGguYXNpbigxKSwgbWF0aC5waS8yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hc2luLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFzaW4oTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXNpbihOQU4pKSkKIAogICAgIGRlZiB0ZXN0QXNpbmgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hc2luaCkKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luaCgtMSknLCBtYXRoLmFzaW5oKC0xKSwgLTAuODgxMzczNTg3MDE5NTQzMDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguYXNpbmgoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmFzaW5oKE5JTkYpLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFzaW5oKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFzaW5oKE5BTikpKQogCiAgICAgZGVmIHRlc3RBdGFuKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbikKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKDEpJywgbWF0aC5hdGFuKDEpLCBtYXRoLnBpLzQpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oaW5mKScsIG1hdGguYXRhbihJTkYpLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oLWluZiknLCBtYXRoLmF0YW4oTklORiksIC1tYXRoLnBpLzIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbihOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuKE5BTikpKQogCiAgICAgZGVmIHRlc3RBdGFuaChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmF0YW4pCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hdGFuaCwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXRhbmgsIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hdGFuaCwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuaChOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuaChOQU4pKSkKIAogICAgIGRlZiB0ZXN0QXRhbjIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hdGFuMikKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMC4sIDAuKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigwLiwgMi4zKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigwLiwgSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbjIoMC4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKDAuLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKC0wLCB4KQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMC4sIC1pbmYpJywgbWF0aC5hdGFuMigtMC4sIE5JTkYpLCAtbWF0aC5waSkKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTAuLCAtMi4zKScsIG1hdGguYXRhbjIoLTAuLCAtMi4zKSwgLW1hdGgucGkpCkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgMC4pLCAtMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigtMC4sIDIuMyksIC0wLikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgSU5GKSwgLTAuKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmF0YW4yKC0wLiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoLTAuLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKElORiwgeCkKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoaW5mLCAtaW5mKScsIG1hdGguYXRhbjIoSU5GLCBOSU5GKSwgbWF0aC5waSozLzQpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgLTIuMyknLCBtYXRoLmF0YW4yKElORiwgLTIuMyksIG1hdGgucGkvMikKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMihpbmYsIDAuKScsIG1hdGguYXRhbjIoSU5GLCAwLjApLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgMi4zKScsIG1hdGguYXRhbjIoSU5GLCAyLjMpLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgaW5mKScsIG1hdGguYXRhbjIoSU5GLCBJTkYpLCBtYXRoLnBpLzQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbjIoSU5GLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihJTkYsIE5BTikpKQogICAgICAgICAjIG1hdGguYXRhbjIoTklORiwgeCkKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgLWluZiknLCBtYXRoLmF0YW4yKE5JTkYsIE5JTkYpLCAtbWF0aC5waSozLzQpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIC0yLjMpJywgbWF0aC5hdGFuMihOSU5GLCAtMi4zKSwgLW1hdGgucGkvMikKQEAgLTE2MSwyNyArMTYxLDI3IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIDAuKScsIG1hdGguYXRhbjIoTklORiwgMC4wKSwgLW1hdGgucGkvMikKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgMi4zKScsIG1hdGguYXRhbjIoTklORiwgMi4zKSwgLW1hdGgucGkvMikKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgaW5mKScsIG1hdGguYXRhbjIoTklORiwgSU5GKSwgLW1hdGgucGkvNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOSU5GLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOSU5GLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKCtmaW5pdGUsIHgpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgLWluZiknLCBtYXRoLmF0YW4yKDIuMywgTklORiksIG1hdGgucGkpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgLTAuKScsIG1hdGguYXRhbjIoMi4zLCAtMC4pLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgMC4pJywgbWF0aC5hdGFuMigyLjMsIDAuKSwgbWF0aC5waS8yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMi4zLCBJTkYpLCAwLikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMigyLjMsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKDIuMywgTkFOKSkpCiAgICAgICAgICMgbWF0aC5hdGFuMigtZmluaXRlLCB4KQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMi4zLCAtaW5mKScsIG1hdGguYXRhbjIoLTIuMywgTklORiksIC1tYXRoLnBpKQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMi4zLCAtMC4pJywgbWF0aC5hdGFuMigtMi4zLCAtMC4pLCAtbWF0aC5waS8yKQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMi4zLCAwLiknLCBtYXRoLmF0YW4yKC0yLjMsIDAuKSwgLW1hdGgucGkvMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0yLjMsIElORiksIC0wLikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMigtMi4zLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMigtMi4zLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKE5BTiwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIE5JTkYpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0yLjMpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0wLikpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgMC4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIDIuMykpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgSU5GKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIE5JTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0yLjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0wLikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgMC4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIDIuMykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCBOQU4pKSkKIAogICAgIGRlZiB0ZXN0Q2VpbChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNlaWwpCkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgtMS41KScsIG1hdGguY2VpbCgtMS41KSwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY2VpbChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY2VpbChOSU5GKSwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5jZWlsKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNlaWwoTkFOKSkpCiAKICAgICAgICAgY2xhc3MgVGVzdENlaWwob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CkBAIC0yMjksMTQgKzIyOSwxNCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29weXNpZ24oSU5GLCBOSU5GKSwgTklORikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlzaWduKE5JTkYsIElORiksIElORikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlzaWduKE5JTkYsIE5JTkYpLCBOSU5GKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oY29weXNpZ24oTkFOLCAxLikpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oY29weXNpZ24oTkFOLCBJTkYpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgTklORikpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oY29weXNpZ24oTkFOLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgMS4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihjb3B5c2lnbihOQU4sIE5JTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgTkFOKSkpCiAgICAgICAgICAgICAjIGNvcHlzaWduKElORiwgTkFOKSBtYXkgYmUgSU5GIG9yIGl0IG1heSBiZSBOSU5GLCBzaW5jZQogICAgICAgICAgICAgIyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHNpZ24gYml0IG9mIE5BTiBpcyBzZXQgb24gYW55CiAgICAgICAgICAgICAjIGdpdmVuIHBsYXRmb3JtLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNpbmYoY29weXNpZ24oSU5GLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKGNvcHlzaWduKElORiwgTkFOKSkpCiAgICAgICAgICAgICAjIHNpbWlsYXJseSwgY29weXNpZ24oMi4sIE5BTikgY291bGQgYmUgMi4gb3IgLTIuCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhYnMoY29weXNpZ24oMi4sIE5BTikpLCAyLikKIApAQCAtMjQ3LDEyICsyNDcsMTIgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCkKICAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpKScsIG1hdGguY29zKG1hdGgucGkpLCAtMSkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5jb3MoSU5GKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmNvcyhOSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhJTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zKE5JTkYpKSkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmNvcywgSU5GKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5jb3MsIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguY29zKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhOQU4pKSkKIAogICAgIGRlZiB0ZXN0Q29zaChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvc2gpCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnY29zaCgyKS0yKmNvc2goMSkqKjInLCBtYXRoLmNvc2goMiktMiptYXRoLmNvc2goMSkqKjIsIC0xKSAjIFRoYW5rcyB0byBMYW1iZXJ0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY29zaChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY29zaChOSU5GKSwgSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmNvc2goTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zaChOQU4pKSkKIAogICAgIGRlZiB0ZXN0RGVncmVlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmRlZ3JlZXMpCkBAIC0yNzUsNyArMjc1LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnZXhwKDEpJywgbWF0aC5leHAoMSksIG1hdGguZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5leHAoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmV4cChOSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZXhwKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmV4cChOQU4pKSkKIAogICAgIGRlZiB0ZXN0RmFicyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZhYnMpCkBAIC0zMTUsNyArMzE1LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuMjNlMTY3KScsIG1hdGguZmxvb3IoLTEuMjNlMTY3KSwgLTEuMjNlMTY3KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmNlaWwoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmNlaWwoTklORiksIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZmxvb3IoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZmxvb3IoTkFOKSkpCiAKICAgICAgICAgY2xhc3MgVGVzdEZsb29yKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgpAQCAtMzM4LDkgKzMzOCw5IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoLTEwLDEpJywgbWF0aC5mbW9kKC0xMCwxKSwgMCkKICAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMC41KScsIG1hdGguZm1vZCgtMTAsMC41KSwgMCkKICAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMS41KScsIG1hdGguZm1vZCgtMTAsMS41KSwgLTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZm1vZChOQU4sIDEuKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZm1vZCgxLiwgTkFOKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZm1vZChOQU4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZtb2QoTkFOLCAxLikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZtb2QoMS4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZtb2QoTkFOLCBOQU4pKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mbW9kLCAxLiwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguZm1vZCwgSU5GLCAxLikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mbW9kLCBOSU5GLCAxLikKQEAgLTM2Nyw3ICszNjcsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguZnJleHAoSU5GKVswXSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmZyZXhwKE5JTkYpWzBdLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmZyZXhwKE5BTilbMF0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZyZXhwKE5BTilbMF0pKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQpAQCAtNDY5LDggKzQ2OSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5oeXBvdChJTkYsIE5BTiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KE5BTiwgTklORiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KE5JTkYsIE5BTiksIElORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5oeXBvdCgxLjAsIE5BTikpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmh5cG90KE5BTiwgLTIuMCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmh5cG90KDEuMCwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguaHlwb3QoTkFOLCAtMi4wKSkpCiAKICAgICBkZWYgdGVzdExkZXhwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubGRleHApCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sZGV4cCgtMS4sIC0xMDAwMDAwKSwgLTAuKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKElORiwgMzApLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGgubGRleHAoTklORiwgLTIxMyksIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCAwKSkpCiAKICAgICAgICAgIyBsYXJnZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgZm9yIG4gaW4gWzEwKio1LCAxMEwqKjUsIDEwKioxMCwgMTBMKioxMCwgMTAqKjIwLCAxMCoqNDBdOgpAQCAtNDk0LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKC0xLiwgLW4pLCAtMC4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKDAuLCAtbiksIDAuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sZGV4cCgtMC4sIC1uKSwgLTAuKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIC1uKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxkZXhwKE5BTiwgLW4pKSkKIAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbWF0aC5sZGV4cCwgMS4sIG4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtYXRoLmxkZXhwLCAtMS4sIG4pCkBAIC01MDIsNyArNTAyLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGgubGRleHAoLTAuLCBuKSwgLTAuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sZGV4cChJTkYsIG4pLCBJTkYpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKE5JTkYsIG4pLCBOSU5GKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIG4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCBuKSkpCiAKICAgICBkZWYgdGVzdExvZyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxvZykKQEAgLTUxNCw3ICs1MTQsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMTAqKjQwLCAxMCoqMjApJywgbWF0aC5sb2coMTAqKjQwLCAxMCoqMjApLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxvZyhJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmxvZyhOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2coTkFOKSkpCiAKICAgICBkZWYgdGVzdExvZzFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nMXApCkBAIC01MjQsNyArNTI0LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnbG9nMXAoMSknLCBtYXRoLmxvZzFwKDEpLCBtYXRoLmxvZygyKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sb2cxcChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nMXAsIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgubG9nMXAoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubG9nMXAoTkFOKSkpCiAgICAgICAgIG49IDIqKjkwCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKG1hdGgubG9nMXAobiksIDYyLjM4MzI0NjI1MDM5NTA3NSkKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMobWF0aC5sb2cxcChuKSwgbWF0aC5sb2cxcChmbG9hdChuKSkpCkBAIC01MzYsNyArNTM2LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMTApJywgbWF0aC5sb2cxMCgxMCksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGgubG9nKElORiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxMCwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5sb2cxMChOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2cxMChOQU4pKSkKIAogICAgIGRlZiB0ZXN0TW9kZihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLm1vZGYpCkBAIC01NTMsOCArNTUzLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5tb2RmKE5JTkYpLCAoLTAuMCwgTklORikpCiAKICAgICAgICAgbW9kZl9uYW4gPSBtYXRoLm1vZGYoTkFOKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtb2RmX25hblswXSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1vZGZfbmFuWzFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obW9kZl9uYW5bMF0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtb2RmX25hblsxXSkpCiAKICAgICBkZWYgdGVzdFBvdyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnBvdykKQEAgLTU2Niw5ICs1NjYsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIDEpLCBOSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChtYXRoLnBvdygxLCBJTkYpKSwgMS4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG1hdGgucG93KDEsIE5JTkYpKSwgMS4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KE5BTiwgMSkpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLnBvdygyLCBOQU4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5wb3coMCwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KE5BTiwgMSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygyLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coMCwgTkFOKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMSwgTkFOKSwgMSkKIAogICAgICAgICAjIHBvdygwLiwgeCkKQEAgLTU4Miw3ICs1ODIsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgMC4sIC0yLjMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAwLiwgLTMuKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgMC4sIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KDAuLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coMC4sIE5BTikpKQogCiAgICAgICAgICMgcG93KElORiwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIElORiksIElORikKQEAgLTU5NSw3ICs1OTUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTIuMyksIDAuKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTMuKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCBOSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KElORiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KElORiwgTkFOKSkpCiAKICAgICAgICAgIyBwb3coLTAuLCB4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLiwgSU5GKSwgMC4pCkBAIC02MDgsNyArNjA4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTIuMykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTMuKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTAuLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLnBvdygtMC4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygtMC4sIE5BTikpKQogCiAgICAgICAgICMgcG93KE5JTkYsIHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgSU5GKSwgSU5GKQpAQCAtNjIxLDcgKzYyMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgLTIuMyksIDAuKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIC0zLiksIC0wLikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCBOSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KE5JTkYsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdyhOSU5GLCBOQU4pKSkKIAogICAgICAgICAjIHBvdygtMSwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIElORiksIDEuKQpAQCAtNjM0LDcgKzYzNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMS4sIC0yLjMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCAtMy4pLCAtMS4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCBOSU5GKSwgMS4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KC0xLiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KC0xLiwgTkFOKSkpCiAKICAgICAgICAgIyBwb3coMSwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgSU5GKSwgMS4pCkBAIC03MTcsMTIgKzcxNywxMiBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4ocGkvMiknLCBtYXRoLnNpbihtYXRoLnBpLzIpLCAxKQogICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4oLXBpLzIpJywgbWF0aC5zaW4oLW1hdGgucGkvMiksIC0xKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLnNpbihJTkYpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguc2luKE5JTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKElORikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zaW4oTklORikpKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc2luLCBJTkYpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNpbiwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5zaW4oTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKE5BTikpKQogCiAgICAgZGVmIHRlc3RTaW5oKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc2luaCkKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDEpK3NpbmgoLTEpJywgbWF0aC5zaW5oKDEpK21hdGguc2luaCgtMSksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguc2luaChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguc2luaChOSU5GKSwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5zaW5oKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnNpbmgoTkFOKSkpCiAKICAgICBkZWYgdGVzdFNxcnQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zcXJ0KQpAQCAtNzQwLDcgKzc0MCw3IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ3NxcnQoNCknLCBtYXRoLnNxcnQoNCksIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguc3FydChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc3FydCwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5zcXJ0KE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnNxcnQoTkFOKSkpCiAKICAgICBkZWYgdGVzdFRhbihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRhbikKQEAgLTc0OCwxMiArNzQ4LDEyIEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbihwaS80KScsIG1hdGgudGFuKG1hdGgucGkvNCksIDEpCiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbigtcGkvNCknLCBtYXRoLnRhbigtbWF0aC5waS80KSwgLTEpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgudGFuKElORikpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC50YW4oTklORikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC50YW4oSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbihOSU5GKSkpCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgudGFuLCBJTkYpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnRhbiwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC50YW4oTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgudGFuKE5BTikpKQogCiAgICAgZGVmIHRlc3RUYW5oKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudGFuaCkKQEAgLTc2MSw3ICs3NjEsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDEpK3RhbmgoLTEpJywgbWF0aC50YW5oKDEpK21hdGgudGFuaCgtMSksIDApCiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoaW5mKScsIG1hdGgudGFuaChJTkYpLCAxKQogICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKC1pbmYpJywgbWF0aC50YW5oKE5JTkYpLCAtMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC50YW5oKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbmgoTkFOKSkpCiAgICAgICAgICMgY2hlY2sgdGhhdCB0YW5oKC0wLikgPT0gLTAuIG9uIElFRUUgNzU0IHN5c3RlbXMKICAgICAgICAgaWYgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRhbmgoLTAuKSwgLTAuKQpAQCAtODA3LDIwICs4MDcsMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDQuLCAtMC4pLCAtNC4wKQogCiAgICAgZGVmIHRlc3RJc25hbihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oZmxvYXQoIm5hbiIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKiAwLikpCi0gICAgICAgIHNlbGYuZmFpbElmKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKSkKLSAgICAgICAgc2VsZi5mYWlsSWYobWF0aC5pc25hbigwLikpCi0gICAgICAgIHNlbGYuZmFpbElmKG1hdGguaXNuYW4oMS4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgibmFuIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgiaW5mIikqIDAuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKGZsb2F0KCJpbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbigwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbigxLikpCiAKICAgICBkZWYgdGVzdElzaW5mKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc2luZihmbG9hdCgiaW5mIikpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc2luZihmbG9hdCgiLWluZiIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNpbmYoMUU0MDApKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc2luZigtMUU0MDApKQotICAgICAgICBzZWxmLmZhaWxJZihtYXRoLmlzaW5mKGZsb2F0KCJuYW4iKSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG1hdGguaXNpbmYoMC4pKQotICAgICAgICBzZWxmLmZhaWxJZihtYXRoLmlzaW5mKDEuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoZmxvYXQoIi1pbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKDFFNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoLTFFNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzaW5mKGZsb2F0KCJuYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZigwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZigxLikpCiAKICAgICAjIFJFRF9GTEFHIDE2LU9jdC0yMDAwIFRpbQogICAgICMgV2hpbGUgMi4wIGlzIG1vcmUgY29uc2lzdGVudCBhYm91dCBleGNlcHRpb25zIHRoYW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21lbW9yeWlvLnB5IGIvTGliL3Rlc3QvdGVzdF9tZW1vcnlpby5weQppbmRleCBkMTI4MWI0Li5hNjljYWFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21lbW9yeWlvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkKQEAgLTIyNSw4ICsyMjUsOCBAQAogICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYgKiAxMCkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIobWVtaW8pLCBtZW1pbykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIobWVtaW8sICdfX2l0ZXJfXycpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihtZW1pbywgJ25leHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobWVtaW8sICdfX2l0ZXJfXycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihtZW1pbywgJ25leHQnKSkKICAgICAgICAgaSA9IDAKICAgICAgICAgZm9yIGxpbmUgaW4gbWVtaW86CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGJ1ZikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weSBiL0xpYi90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weQppbmRleCA3MDViMmNlLi41NzE0ODFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21lbW9yeXZpZXcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICAgIG9sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGIpCiAgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1bMF0sIGl0ZW0oYiJhIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1bMF0sIGJ5dGVzKSwgdHlwZShtWzBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobVswXSwgYnl0ZXMpLCB0eXBlKG1bMF0pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtWzVdLCBpdGVtKGIiZiIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtWy0xXSwgaXRlbShiImYiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobVstNl0sIGl0ZW0oYiJhIikpCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgICAgIGV4cGVjdGVkID0gYiIiLmpvaW4oCiAgICAgICAgICAgICAgICAgc2VsZi5nZXRpdGVtX3R5cGUoYykgZm9yIGMgaW4gYiJhYmNkZWYiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYiwgZXhwZWN0ZWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiLCBieXRlcyksIHR5cGUoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiLCBieXRlcyksIHR5cGUoYikpCiAKICAgICBkZWYgdGVzdF90b2xpc3Qoc2VsZik6CiAgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICAgICAgYiA9IG0gPSBvID0gTm9uZQogICAgICAgICAgICAgIyBUaGUgY3ljbGUgbXVzdCBiZSBicm9rZW4KICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdyKCkgaXMgTm9uZSwgd3IoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKCkpCiAKIAogIyBWYXJpYXRpb25zIG9uIHNvdXJjZSBvYmplY3RzIGZvciB0aGUgYnVmZmVyOiBieXRlcy1saWtlIG9iamVjdHMsIHRoZW4gYXJyYXlzCkBAIC0yOTEsOCArMjkxLDggQEAKICAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKICAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgogICAgICAgICAgICAgb2IgPSB0cChzZWxmLl9zb3VyY2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWVtb3J5dmlldyhvYikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWVtb3J5dmlldyhvYmplY3Q9b2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9yeXZpZXcob2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9yeXZpZXcob2JqZWN0PW9iKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtb3J5dmlldykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtb3J5dmlldywgb2IsIG9iKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1vcnl2aWV3LCBhcmd1bWVudD1vYikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWhsaWIucHkgYi9MaWIvdGVzdC90ZXN0X21obGliLnB5CmluZGV4IGYxYWZhNjcuLmQxM2ZlYmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWhsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taGxpYi5weQpAQCAtMjU2LDkgKzI1Niw5IEBACiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKIAogICAgICAgICBtaC5tYWtlZm9sZGVyKCJkdW1teTEiKQotICAgICAgICBzZWxmLmFzc2VydF8oImR1bW15MSIgaW4gbWgubGlzdGZvbGRlcnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJkdW1teTEiIGluIG1oLmxpc3Rmb2xkZXJzKCkpCiAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oX21ocGF0aCwgImR1bW15MSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhwYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHBhdGgpKQogCiAgICAgICAgIGYgPSBtaC5vcGVuZm9sZGVyKCdkdW1teTEnKQogICAgICAgICBkZWYgY3JlYXRlKG4pOgpAQCAtMzEwLDggKzMxMCw4IEBACiAKICAgICAgICAgbWguZGVsZXRlZm9sZGVyKCdkdW1teTEnKQogICAgICAgICBtaC5kZWxldGVmb2xkZXIoJ2R1bW15MicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZHVtbXkxJyBub3QgaW4gbWgubGlzdGZvbGRlcnMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdkdW1teTEnIG5vdCBpbiBtaC5saXN0Zm9sZGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHBhdGgpKQogCiAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKICAgICAgICAgbWggPSBnZXRNSCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21pbWV0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5CmluZGV4IGVkMDFlZGUuLjlmNWJmNzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5CkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIHMgPSBzZXQoWyIiXSkKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CiAgICAgICAgICAgICBuYiA9IG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5iIG5vdCBpbiBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5iIG5vdCBpbiBzKQogICAgICAgICAgICAgcy5hZGQobmIpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCAwMTkwYzJmLi5jYzE3OTBlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtNDcsNyArNDcsNyBAQAogCiAgICAgZGVmIHRlc3RfZ3Vlc3NfYWxsX3R5cGVzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIEZpcnN0IHRyeSBzdHJpY3QuICBVc2UgYSBzZXQgaGVyZSBmb3IgdGVzdGluZyB0aGUgcmVzdWx0cyBiZWNhdXNlIGlmCiAgICAgICAgICMgdGVzdF91cmxsaWIyIGlzIHJ1biBiZWZvcmUgdGVzdF9taW1ldHlwZXMsIGdsb2JhbCBzdGF0ZSBpcyBtb2RpZmllZAogICAgICAgICAjIHN1Y2ggdGhhdCB0aGUgJ2FsbCcgc2V0IHdpbGwgaGF2ZSBtb3JlIGl0ZW1zIGluIGl0LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CmluZGV4IGMyZjY3NDMuLmI5NTQzOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgIGRlZiBjaGVja19jbG9uZV9hdHRyaWJ1dGUoc2VsZiwgZGVlcCwgdGVzdE5hbWUpOgogICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhdHRyPSd2YWx1ZScvPiIpCiAgICAgICAgIGF0dHIgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoImF0dHIiKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKGF0dHIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYXR0ciwgTm9uZSkKICAgICAgICAgY2xvbmUgPSBhdHRyLmNsb25lTm9kZShkZWVwKQogICAgICAgICBzZWxmLmNvbmZpcm0obm90IGNsb25lLmlzU2FtZU5vZGUoYXR0cikpCiAgICAgICAgIHNlbGYuY29uZmlybShub3QgYXR0ci5pc1NhbWVOb2RlKGNsb25lKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weSBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQppbmRleCA5ZTI4YjM0Li42N2NlZTdhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21tYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CkBAIC01MDEsOCArNTAxLDggQEAKICAgICAgICAgZi5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3MobW1hcC5lcnJvciwgRW52aXJvbm1lbnRFcnJvcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygibW1hcC5lcnJvciIgaW4gc3RyKG1tYXAuZXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhtbWFwLmVycm9yLCBFbnZpcm9ubWVudEVycm9yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJtbWFwLmVycm9yIiBpbiBzdHIobW1hcC5lcnJvcikpCiAKICAgICBkZWYgdGVzdF9pb19tZXRob2RzKHNlbGYpOgogICAgICAgICBkYXRhID0gIjAxMjM0NTY3ODkiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21vZHVsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CmluZGV4IGUwYzdlYzMuLjViYzMzZDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CkBAIC0xMCw3ICsxMCw3IEBACiAgICAgICAgICMgQW4gdW5pbml0aWFsaXplZCBtb2R1bGUgaGFzIG5vIF9fZGljdF9fIG9yIF9fbmFtZV9fLAogICAgICAgICAjIGFuZCBfX2RvY19fIGlzIE5vbmUKICAgICAgICAgZm9vID0gTW9kdWxlVHlwZS5fX25ld19fKE1vZHVsZVR5cGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb28uX19kaWN0X18gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvby5fX2RpY3RfXyBpcyBOb25lKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzID0gZm9vLl9fbmFtZV9fCiAgICAgICAgICAgICBzZWxmLmZhaWwoIl9fbmFtZV9fID0gJXMiICUgcmVwcihzKSkKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uYmFyLCA0MikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kaWN0X18sCiAgICAgICAgICAgICAgIHsiX19uYW1lX18iOiAiZm9vIiwgIl9fZG9jX18iOiAiZm9vZG9jIiwgImJhciI6IDQyfSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvby5fX2RpY3RfXyBpcyBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9vLl9fZGljdF9fIGlzIGQpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoTW9kdWxlVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weSBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CmluZGV4IDlkN2Y3NmEuLjhjNzY5NzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CkBAIC0yNDAsMTIgKzI0MCwxMiBAQAogICAgICAgICAgICAgbW9yZSA9IGxpc3QoZm91bmQgLSBtb2R1bGVzKQogICAgICAgICAgICAgbGVzcyA9IGxpc3QobW9kdWxlcyAtIGZvdW5kKQogICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBmb3VuZCB3aGF0IHdlIGV4cGVjdGVkLCBub3QgbW9yZSwgbm90IGxlc3MKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChtb3JlLCBsZXNzKSwgKFtdLCBbXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChtb3JlLCBsZXNzKSwgKFtdLCBbXSkpCiAKICAgICAgICAgICAgICMgY2hlY2sgZm9yIG1pc3NpbmcgYW5kIG1heWJlIG1pc3NpbmcgbW9kdWxlcwogICAgICAgICAgICAgYmFkLCBtYXliZSA9IG1mLmFueV9taXNzaW5nX21heWJlKCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJhZCwgbWlzc2luZykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1heWJlLCBtYXliZV9taXNzaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWQsIG1pc3NpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heWJlLCBtYXliZV9taXNzaW5nKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZGlzdHV0aWxzLmRpcl91dGlsLnJlbW92ZV90cmVlKFRFU1RfRElSKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCAwOTAzNzRjLi5mMjNlNmUwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTIyMiwxMCArMjIyLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNvMjAyMmpwMi5kZWNvZGUoJ2lzbzIwMjItanAtMicpLCB1bmkpCiAKICAgICBkZWYgdGVzdF9pc28yMDIyX2pwX2cwKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZignXHgwZScgaW4gdSdcTntTT0ZUIEhZUEhFTn0nLmVuY29kZSgnaXNvLTIwMjItanAtMicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdceDBlJyBpbiB1J1xOe1NPRlQgSFlQSEVOfScuZW5jb2RlKCdpc28tMjAyMi1qcC0yJykpCiAgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ2lzby0yMDIyLWpwLTIwMDQnLCAnaXNvLTIwMjItanAtMycpOgogICAgICAgICAgICAgZSA9IHUnXHUzNDA2Jy5lbmNvZGUoZW5jb2RpbmcpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihmaWx0ZXIobGFtYmRhIHg6IHggPj0gJ1x4ODAnLCBlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsdGVyKGxhbWJkYSB4OiB4ID49ICdceDgwJywgZSkpCiAKICAgICBkZWYgdGVzdF9idWcxNTcyODMyKHNlbGYpOgogICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+PSAweDEwMDAwOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdXRleC5weSBiL0xpYi90ZXN0L3Rlc3RfbXV0ZXgucHkKaW5kZXggNGUzZjdjZC4uMjg4MjIxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdXRleC5weQorKysgYi9MaWIvdGVzdC90ZXN0X211dGV4LnB5CkBAIC05LDE0ICs5LDE0IEBACiAKICAgICAgICAgZGVmIGNhbGxlZF9ieV9tdXRleChzb21lX2RhdGEpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb21lX2RhdGEsICJzcGFtIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtLnRlc3QoKSwgIm11dGV4IG5vdCBoZWxkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLnRlc3QoKSwgIm11dGV4IG5vdCBoZWxkIikKICAgICAgICAgICAgICMgTmVzdGVkIGxvY2tpbmcKICAgICAgICAgICAgIG0ubG9jayhjYWxsZWRfYnlfbXV0ZXgyLCAiZWdncyIpCiAKICAgICAgICAgZGVmIGNhbGxlZF9ieV9tdXRleDIoc29tZV9kYXRhKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNvbWVfZGF0YSwgImVnZ3MiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG0udGVzdCgpLCAibXV0ZXggbm90IGhlbGQiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlYWR5X2Zvcl8yLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0udGVzdCgpLCAibXV0ZXggbm90IGhlbGQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWR5X2Zvcl8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZWRfYnlfbXV0ZXgyIGNhbGxlZCB0b28gc29vbiIpCiAKICAgICAgICAgbSA9IG11dGV4Lm11dGV4KCkKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgIyB1bmxvY2sgYm90aCBsb2NrcwogICAgICAgICBtLnVubG9jaygpCiAgICAgICAgIG0udW5sb2NrKCkKLSAgICAgICAgc2VsZi5mYWlsSWYobS50ZXN0KCksICJtdXRleCBzdGlsbCBoZWxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLnRlc3QoKSwgIm11dGV4IHN0aWxsIGhlbGQiKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE11dGV4VGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbmV0cmMucHkgYi9MaWIvdGVzdC90ZXN0X25ldHJjLnB5CmluZGV4IGI1MzYyNTUuLjUwYWZlNzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmV0cmMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9uZXRyYy5weQpAQCAtMzUsMTEgKzM1LDExIEBACiAgICAgICAgIG9zLnVubGluayh0ZW1wX2ZpbGVuYW1lKQogCiAgICAgZGVmIHRlc3RfY2FzZV8xKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5uZXRyYy5tYWNyb3MgPT0geydtYWNybzEnOlsnbGluZTFcbicsICdsaW5lMlxuJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm5ldHJjLm1hY3JvcyA9PSB7J21hY3JvMSc6WydsaW5lMVxuJywgJ2xpbmUyXG4nXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFjcm8yJzpbJ2xpbmUzXG4nLCAnbGluZTRcbiddfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubmV0cmMuaG9zdHNbJ2ZvbyddID09ICgnbG9nMScsICdhY2N0MScsICdwYXNzMScpKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5uZXRyYy5ob3N0c1snZGVmYXVsdCddID09ICgnbG9nMicsIE5vbmUsICdwYXNzMicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5uZXRyYy5ob3N0c1snZm9vJ10gPT0gKCdsb2cxJywgJ2FjY3QxJywgJ3Bhc3MxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm5ldHJjLmhvc3RzWydkZWZhdWx0J10gPT0gKCdsb2cyJywgTm9uZSwgJ3Bhc3MyJykpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE5ldHJjVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25ldy5weSBiL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CmluZGV4IDIzMWY0YmIuLmE4NGIzZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICAgICAgICAgIGQgPSBuZXcuY29kZShhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMsIHQsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGxpbmVubywgbG5vdGFiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodFswXSkgaXMgUywgImVlaywgdHVwbGUgY2hhbmdlZCB1bmRlciB1cyEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodFswXSkgaXMgUywgImVlaywgdHVwbGUgY2hhbmdlZCB1bmRlciB1cyEiKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOZXdUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5IGIvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CmluZGV4IGU5MDU2Y2QuLjBlZWE0YmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKQEAgLTY3LDE0ICs2NywxNCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgICAgICMgUGVyZm9ybSB0ZXN0cwotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGMyID09ICBORkMoYzEpID09ICBORkMoYzIpID09ICBORkMoYzMpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGM0ID09ICBORkMoYzQpID09ICBORkMoYzUpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGMzID09ICBORkQoYzEpID09ICBORkQoYzIpID09ICBORkQoYzMpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGM1ID09ICBORkQoYzQpID09ICBORkQoYzUpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGM0ID09IE5GS0MoYzEpID09IE5GS0MoYzIpID09IFwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMiA9PSAgTkZDKGMxKSA9PSAgTkZDKGMyKSA9PSAgTkZDKGMzKSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjNCA9PSAgTkZDKGM0KSA9PSAgTkZDKGM1KSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMyA9PSAgTkZEKGMxKSA9PSAgTkZEKGMyKSA9PSAgTkZEKGMzKSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjNSA9PSAgTkZEKGM0KSA9PSAgTkZEKGM1KSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjNCA9PSBORktDKGMxKSA9PSBORktDKGMyKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZLQyhjMykgPT0gTkZLQyhjNCkgPT0gTkZLQyhjNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjNSA9PSBORktEKGMxKSA9PSBORktEKGMyKSA9PSBcCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzUgPT0gTkZLRChjMSkgPT0gTkZLRChjMikgPT0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GS0QoYzMpID09IE5GS0QoYzQpID09IE5GS0QoYzUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCiAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgIFggPSB1bmljaHIoYykKICAgICAgICAgICAgIGlmIFggaW4gcGFydDFfZGF0YToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKFggPT0gTkZDKFgpID09IE5GRChYKSA9PSBORktDKFgpID09IE5GS0QoWCksIGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoWCA9PSBORkMoWCkgPT0gTkZEKFgpID09IE5GS0MoWCkgPT0gTkZLRChYKSwgYykKIAogICAgIGRlZiB0ZXN0X2J1Z184MzQ2NzYoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgZm9yIGJ1ZyA4MzQ2NzYKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkgYi9MaWIvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5CmluZGV4IDdiZDU1NTcuLmU2MWIxOWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weQpAQCAtNjcsMzUgKzY3LDM1IEBACiAgICAgICAgICIiIlRlc3QgYW4gZW1wdHkgbWFpbGRpciBtYWlsYm94IiIiCiAgICAgICAgICMgVGVzdCBmb3IgcmVncmVzc2lvbiBvbiBidWcgIzExNzQ5MDoKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5tYm94KSA9PSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfY3VyKHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfbmV3KHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfYm90aChzZWxmKToKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCiAgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgogICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKQEAgLTEzOSw3ICsxMzksNyBAQAogIiIiKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgYm94ID0gbWFpbGJveC5Vbml4TWFpbGJveChvcGVuKHNlbGYuX3BhdGgsICdyJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4obGlzdChpdGVyKGJveCkpKSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGxpc3QoaXRlcihib3gpKSkgPT0gNCkKIAogCiAgICAgIyBYWFggV2Ugc3RpbGwgbmVlZCBtb3JlIHRlc3RzIQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CmluZGV4IDc5ODViZjYuLmMwM2NhMWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKQEAgLTY0LDcgKzY0LDcgQEAKIAogICAgICAgICB0cnk6ICByYWlzZSBEQ2xhc3MsIGEKICAgICAgICAgZXhjZXB0IERDbGFzcywgdjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHYsIERDbGFzcykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2LCBEQ2xhc3MpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQppbmRleCA5YmMwYTRlLi4yNzU4ODU2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKQEAgLTM0LDMzMiArMzQsMzMyIEBACiAKIGNsYXNzIE9wZXJhdG9yVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2x0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHQsIDFqLCAyaikKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IubHQoMSwgMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmx0KDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmx0KDEsIDEpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5sdCgxLCAxLjApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubHQoMSwgMikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5sdCgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmx0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmx0LCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubHQoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubHQoMSwgMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHQoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sdCgxLCAyLjApKQogCiAgICAgZGVmIHRlc3RfbGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSwgMWosIDJqKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5sZSgxLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IubGUoMSwgMC4wKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxlKDEsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubGUoMSwgMS4wKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxlKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubGUoMSwgMi4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSwgMWosIDJqKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmxlKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmxlKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxlKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxlKDEsIDIuMCkpCiAKICAgICBkZWYgdGVzdF9lcShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgogICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmVxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLmVxLCBDKCksIEMoKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuZXEoMSwgMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmVxKDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5lcSgxLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmVxKDEsIDEuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmVxKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5lcSgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmVxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuZXEsIEMoKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmVxKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmVxKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5lcSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmVxKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMi4wKSkKIAogICAgIGRlZiB0ZXN0X25lKHNlbGYpOgogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5uZSwgQygpLCBDKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5uZSgxLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLm5lKDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLm5lKDEsIDEpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5uZSgxLCAxLjApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmUoMSwgMikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5uZSgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IubmUsIEMoKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmUoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLm5lKDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLm5lKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lKDEsIDIuMCkpCiAKICAgICBkZWYgdGVzdF9nZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2UpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlLCAxaiwgMmopCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5nZSgxLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmdlKDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5nZSgxLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmdlKDEsIDEuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmdlKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5nZSgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlLCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdlKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdlKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ2UoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ2UoMSwgMi4wKSkKIAogICAgIGRlZiB0ZXN0X2d0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5ndCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ3QsIDFqLCAyaikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmd0KDEsIDApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuZ3QoMSwgMC4wKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuZ3QoMSwgMSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmd0KDEsIDEuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmd0KDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5ndCgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0LCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5ndCgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmd0KDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5ndCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5ndCgxLCAyLjApKQogCiAgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hYnMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFicywgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmFicygtMSkgPT0gMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmFicygxKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFicykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hYnMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hYnMoLTEpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hYnMoMSkgPT0gMSkKIAogICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5hZGQoMywgNCkgPT0gNykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYWRkKDMsIDQpID09IDcpCiAKICAgICBkZWYgdGVzdF9iaXR3aXNlX2FuZChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpID09IDB4YSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8sIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSA9PSAweGEpCiAKICAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuY29uY2F0KCdweScsICd0aG9uJykgPT0gJ3B5dGhvbicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pID09IFsxLCAyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmNvbmNhdChTZXExKFs1LCA2XSksIFNlcTEoWzddKSkgPT0gWzUsIDYsIDddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuY29uY2F0KFNlcTIoWzUsIDZdKSwgU2VxMihbN10pKSA9PSBbNSwgNiwgN10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgMTMsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoJ3B5JywgJ3Rob24nKSA9PSAncHl0aG9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChbMSwgMl0sIFszLCA0XSkgPT0gWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSA9PSBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMihbNSwgNl0pLCBTZXEyKFs3XSkpID09IFs1LCA2LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIDEzLCAyOSkKIAogICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMykgPT0gMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY291bnRPZiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDUpID09IDApCiAKICAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBhID0gWzQsIDMsIDIsIDFdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IFs0LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFs0LCAyLCAxXSkKIAogICAgIGRlZiB0ZXN0X2RlbHNsaWNlKHNlbGYpOgogICAgICAgICBhID0gcmFuZ2UoMTApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbHNsaWNlLCBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmRlbHNsaWNlKGEsIDIsIDgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IFswLCAxLCA4LCA5XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmRlbHNsaWNlKGEsIDIsIDgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFswLCAxLCA4LCA5XSkKICAgICAgICAgb3BlcmF0b3IuZGVsc2xpY2UoYSwgMCwgdGVzdF9zdXBwb3J0Lk1BWF9QeV9zc2l6ZV90KQotICAgICAgICBzZWxmLmFzc2VydF8oYSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gW10pCiAKICAgICBkZWYgdGVzdF9kaXYoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRpdiwgNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGl2LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kaXYsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKIAogICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5mbG9vcmRpdiwgNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZmxvb3JkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5mbG9vcmRpdig1LCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKIAogICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKIAogICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CiAgICAgICAgIGEgPSByYW5nZSgxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmdldGl0ZW0oYSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIGEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRpdGVtKGEsIDIpID09IDIpCiAKICAgICBkZWYgdGVzdF9nZXRzbGljZShzZWxmKToKICAgICAgICAgYSA9IHJhbmdlKDEwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRzbGljZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UsIGEsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5nZXRzbGljZShhLCA0LCA2KSA9PSBbNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UsIGEsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRzbGljZShhLCA0LCA2KSA9PSBbNCwgNV0pCiAgICAgICAgIGIgPSBvcGVyYXRvci5nZXRzbGljZShhLCAwLCB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiID09IGEpCiAKICAgICBkZWYgdGVzdF9pbmRleE9mKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpID09IDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIFs0LCAzLCAyLCAxXSwgMCkKIAogICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW52ZXJ0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbnZlcnQsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pbnYoNCkgPT0gLTUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW52ZXJ0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmludmVydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmludig0KSA9PSAtNSkKIAogICAgIGRlZiB0ZXN0X2lzQ2FsbGFibGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzQ2FsbGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNDYWxsYWJsZSkKICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZGVmIGNoZWNrKHNlbGYsIG8sIHYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9wZXJhdG9yLmlzQ2FsbGFibGUobykgPT0gY2FsbGFibGUobykgPT0gdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc0NhbGxhYmxlKG8pID09IGNhbGxhYmxlKG8pID09IHYpCiAgICAgICAgIGNoZWNrKHNlbGYsIDQsIDApCiAgICAgICAgIGNoZWNrKHNlbGYsIG9wZXJhdG9yLmlzQ2FsbGFibGUsIDEpCiAgICAgICAgIGNoZWNrKHNlbGYsIEMsIDEpCiAgICAgICAgIGNoZWNrKHNlbGYsIEMoKSwgMCkKIAogICAgIGRlZiB0ZXN0X2lzTWFwcGluZ1R5cGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUoMSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc01hcHBpbmdUeXBlKG9wZXJhdG9yLl9fZGljdF9fKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUoe30pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNNYXBwaW5nVHlwZShvcGVyYXRvci5fX2RpY3RfXykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKHt9KSkKIAogICAgIGRlZiB0ZXN0X2lzTnVtYmVyVHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNOdW1iZXJUeXBlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDhqKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4TCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc051bWJlclR5cGUoOC4zKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNOdW1iZXJUeXBlKGRpcigpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc051bWJlclR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOGopKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDhMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4LjMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZShkaXIoKSkpCiAKICAgICBkZWYgdGVzdF9pc1NlcXVlbmNlVHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShkaXIoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSh4cmFuZ2UoMTApKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKCd5ZWFoYnVkZHknKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShkaXIoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSh4cmFuZ2UoMTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKCd5ZWFoYnVkZHknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgzKSkKICAgICAgICAgY2xhc3MgRGljdChkaWN0KTogcGFzcwotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShEaWN0KCkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKERpY3QoKSkpCiAKICAgICBkZWYgdGVzdF9sc2hpZnQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSA9PSAxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDEpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDApID09IDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCwgMiwgLTEpCiAKICAgICBkZWYgdGVzdF9tb2Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kLCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLm1vZCg1LCAyKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tb2QsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubW9kKDUsIDIpID09IDEpCiAKICAgICBkZWYgdGVzdF9tdWwoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubXVsKDUsIDIpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tdWwoNSwgMikgPT0gMTApCiAKICAgICBkZWYgdGVzdF9uZWcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubmVnLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmVnKDUpID09IC01KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmVnKC01KSA9PSA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmVnKDApID09IDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5uZWcoLTApID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubmVnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZyg1KSA9PSAtNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZygtNSkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZygwKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmVnKC0wKSA9PSAwKQogCiAgICAgZGVmIHRlc3RfYml0d2lzZV9vcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8sIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5vcl8oMHhhLCAweDUpID09IDB4ZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iub3JfKDB4YSwgMHg1KSA9PSAweGYpCiAKICAgICBkZWYgdGVzdF9wb3Moc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG9zLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucG9zKDUpID09IDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5wb3MoLTUpID09IC01KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucG9zKDApID09IDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5wb3MoLTApID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG9zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvcywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvcyg1KSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG9zKC01KSA9PSAtNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvcygwKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG9zKC0wKSA9PSAwKQogCiAgICAgZGVmIHRlc3RfcG93KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvdywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnBvdygzLDUpID09IDMqKjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5fX3Bvd19fKDMsNSkgPT0gMyoqNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG93LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG93KDMsNSkgPT0gMyoqNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLl9fcG93X18oMyw1KSA9PSAzKio1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvdywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3csIDEsIDIsIDMpCiAKICAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CiAgICAgICAgIGEgPSByYW5nZSgzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJlcGVhdCwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAyKSA9PSBhK2EpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMSkgPT0gYSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCBhLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09IFtdKQogICAgICAgICBhID0gKDEsIDIsIDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gKCkpCiAgICAgICAgIGEgPSAnMTIzJwotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDApID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09ICcnKQogICAgICAgICBhID0gU2VxMShbNCwgNSwgNl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gWzQsIDUsIDYsIDQsIDUsIDZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IFs0LCA1LCA2XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAyKSA9PSBbNCwgNSwgNiwgNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMSkgPT0gWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09IFtdKQogICAgICAgICBhID0gU2VxMihbNCwgNSwgNl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gWzQsIDUsIDYsIDQsIDUsIDZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IFs0LCA1LCA2XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCA2LCA3KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IFs0LCA1LCA2LCA0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBbNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCA2LCA3KQogCiAgICAgZGVmIHRlc3RfcnNoaWZ0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yc2hpZnQoNSwgMSkgPT0gMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDEpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMCkgPT0gNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29udGFpbnMsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgMikpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCA1KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucywgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKIAogICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CiAgICAgICAgIGEgPSByYW5nZSgzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oYSA9PSBbMiwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMiwgMSwgMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIDQsIDIpCiAKICAgICBkZWYgdGVzdF9zZXRzbGljZShzZWxmKToKICAgICAgICAgYSA9IHJhbmdlKDQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwgYSwgTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnNldHNsaWNlKGEsIDEsIDMsIFsyLCAxXSkgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPT0gWzAsIDIsIDEsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhLCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0c2xpY2UoYSwgMSwgMywgWzIsIDFdKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMCwgMiwgMSwgM10pCiAgICAgICAgIG9wZXJhdG9yLnNldHNsaWNlKGEsIDAsIHRlc3Rfc3VwcG9ydC5NQVhfUHlfc3NpemVfdCwgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbXSkKIAogICAgIGRlZiB0ZXN0X3N1YihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5zdWIoNSwgMikgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc3ViKDUsIDIpID09IDMpCiAKICAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgogICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydXRoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLnRydXRoLCBDKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci50cnV0aCg1KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnRydXRoKFswXSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLnRydXRoKDApKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci50cnV0aChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1dGgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci50cnV0aCwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IudHJ1dGgoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnV0aChbMF0pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnRydXRoKDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnRydXRoKFtdKSkKIAogICAgIGRlZiB0ZXN0X2JpdHdpc2VfeG9yKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvciwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnhvcigweGIsIDB4YykgPT0gMHg3KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci54b3IoMHhiLCAweGMpID09IDB4NykKIAogICAgIGRlZiB0ZXN0X2lzKHNlbGYpOgogICAgICAgICBhID0gYiA9ICd4eXpwZHEnCiAgICAgICAgIGMgPSBhWzozXSArIGJbMzpdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzXyhhLCBiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNfKGEsYykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNfKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNfKGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzXyhhLGMpKQogCiAgICAgZGVmIHRlc3RfaXNfbm90KHNlbGYpOgogICAgICAgICBhID0gYiA9ICd4eXpwZHEnCiAgICAgICAgIGMgPSBhWzozXSArIGJbMzpdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzX25vdCkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNfbm90KGEsIGIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaXNfbm90KGEsYykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNfbm90KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzX25vdChhLCBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzX25vdChhLGMpKQogCiAgICAgZGVmIHRlc3RfYXR0cmdldHRlcihzZWxmKToKICAgICAgICAgY2xhc3MgQToKQEAgLTM4NSw3ICszODUsNyBAQAogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5hdHRyZ2V0dGVyKCdmb28nKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuYXR0cmdldHRlcignZm9vJyksIEMoKSkKIAogICAgICAgICAjIHJlY3Vyc2l2ZSBnZXRzCiAgICAgICAgIGEgPSBBKCkKQEAgLTQxNyw3ICs0MTcsNyBAQAogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5pdGVtZ2V0dGVyKDQyKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuaXRlbWdldHRlcig0MiksIEMoKSkKIAogICAgICAgICBmID0gb3BlcmF0b3IuaXRlbWdldHRlcignbmFtZScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgYSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CmluZGV4IDc0ODNmZTcuLmIxMWI4YzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgIGV4Y2VwdCBleHBlY3RlZF9leGNlcHRpb24sIGVycjoKICAgICAgICAgICAgIGFjdHVhbF9tZXNzYWdlID0gc3RyKGVycikKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfbWVzc2FnZSwgcmV0eXBlKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0ZWRfbWVzc2FnZS5zZWFyY2goYWN0dWFsX21lc3NhZ2UpLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZF9tZXNzYWdlLnNlYXJjaChhY3R1YWxfbWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIlwKIGV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlIHBhdHRlcm46CiAvJXMvCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKIAogICAgICAgICBleGNlcHQgSW50ZXJjZXB0ZWRFcnJvciwgZXJyOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIHR5cGUob3V0cHV0KSBpcyB0eXBlcy5TdHJpbmdUeXBlLAogICAgICAgICAgICAgICAgICJleHBlY3RlZCBvdXRwdXQgdG8gYmUgYW4gb3JkaW5hcnkgc3RyaW5nLCBub3QgJXIiCiAgICAgICAgICAgICAgICAgJSB0eXBlKG91dHB1dCkpCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAogICAgIGRlZiB0ZXN0X2dldF9vcHRpb24oc2VsZik6CiAgICAgICAgIG9wdDEgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItdiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG9wdDEsIE9wdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9wdDEsIE9wdGlvbikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0MS5fc2hvcnRfb3B0cywgWyItdiIsICItbiJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdDEuX2xvbmdfb3B0cywgWyItLXZlcmJvc2UiLCAiLS1ub2lzeSJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdDEuYWN0aW9uLCAic3RvcmVfdHJ1ZSIpCkBAIC0zNTksMzMgKzM1OSwzMyBAQAogICAgICAgICBvcHQyID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJib3NlIikKICAgICAgICAgb3B0MyA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1uIikKICAgICAgICAgb3B0NCA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tbm9pc3kiKQotICAgICAgICBzZWxmLmFzc2VydF8ob3B0MSBpcyBvcHQyIGlzIG9wdDMgaXMgb3B0NCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdDEgaXMgb3B0MiBpcyBvcHQzIGlzIG9wdDQpCiAKICAgICBkZWYgdGVzdF9oYXNfb3B0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLXYiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tdmVyYm9zZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLXYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tdmVyYm9zZSIpKQogCi0gICAgZGVmIGFzc2VydF9yZW1vdmVkKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXYiKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJib3NlIikgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1uIikgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tbm9pc3kiKSBpcyBOb25lKQorICAgIGRlZiBhc3NlcnRUcnVlcmVtb3ZlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi12IikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tdmVyYm9zZSIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItbiIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLW5vaXN5IikgaXMgTm9uZSkKIAotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItdiIpKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLXZlcmJvc2UiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLW4iKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS1ub2lzeSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi12IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS12ZXJib3NlIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLW4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLW5vaXN5IikpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi1xIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLXNpbGVudCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLXEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tc2lsZW50IikpCiAKICAgICBkZWYgdGVzdF9yZW1vdmVfc2hvcnRfb3B0KHNlbGYpOgogICAgICAgICBzZWxmLnBhcnNlci5yZW1vdmVfb3B0aW9uKCItbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0X3JlbW92ZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWVyZW1vdmVkKCkKIAogICAgIGRlZiB0ZXN0X3JlbW92ZV9sb25nX29wdChzZWxmKToKICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlX29wdGlvbigiLS12ZXJib3NlIikKLSAgICAgICAgc2VsZi5hc3NlcnRfcmVtb3ZlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZXJlbW92ZWQoKQogCiAgICAgZGVmIHRlc3RfcmVtb3ZlX25vbmV4aXN0ZW50KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLnBhcnNlci5yZW1vdmVfb3B0aW9uLCAoJ2ZvbycsKSwgTm9uZSwKQEAgLTc5NSwxNCArNzk1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQogICAgICAgICBpZiBoYXNhdHRyKF9fYnVpbHRpbnNfXywgJ0ZhbHNlJyk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3B0aW9ucy52ZXJib3NlIGlzIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbnMudmVyYm9zZSBpcyBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2Jvb2xfdHJ1ZShzZWxmKToKICAgICAgICAgKG9wdGlvbnMsIGFyZ3MpID0gc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXYiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCiAgICAgICAgIGlmIGhhc2F0dHIoX19idWlsdGluc19fLCAnVHJ1ZScpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wdGlvbnMudmVyYm9zZSBpcyBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbnMudmVyYm9zZSBpcyBUcnVlKQogCiAgICAgZGVmIHRlc3RfYm9vbF9mbGlja2VyX29uX2FuZF9vZmYoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1xdnEiLCAiLXEiLCAiLXYiXSwKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU29tZSBtb3JlIG9wdGlvbnMiKQogICAgICAgICBncm91cC5zZXRfdGl0bGUoIkJhY29uIikKICAgICAgICAgZ3JvdXAuYWRkX29wdGlvbigiLS1iYWNvbiIsIHR5cGU9ImludCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uX2dyb3VwKCItLWJhY29uIiksIGdyb3VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbl9ncm91cCgiLS1iYWNvbiIpLCBncm91cCkKIAogIyAtLSBUZXN0IGV4dGVuZGluZyBhbmQgcGFyc2VyLnBhcnNlX2FyZ3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTExMDQsMTUgKzExMDQsMTUgQEAKICAgICAgICAgaWYgb3B0ID09ICIteCI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbi5fc2hvcnRfb3B0cywgWyIteCJdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX2xvbmdfb3B0cywgW10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocGFyc2VyXyBpcyBzZWxmLnBhcnNlcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlcl8gaXMgc2VsZi5wYXJzZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgTm9uZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFycyhwYXJzZXJfLnZhbHVlcyksIHsnZmlsZW5hbWUnOiBOb25lfSkKIAogICAgICAgICAgICAgcGFyc2VyXy52YWx1ZXMueCA9IDQyCiAgICAgICAgIGVsaWYgb3B0ID09ICItLWZpbGUiOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX3Nob3J0X29wdHMsIFsiLWYiXSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLl9sb25nX29wdHMsIFsiLS1maWxlIl0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocGFyc2VyXyBpcyBzZWxmLnBhcnNlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZXJfIGlzIHNlbGYucGFyc2VyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgImZvbyIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcnMocGFyc2VyXy52YWx1ZXMpLCB7J2ZpbGVuYW1lJzogTm9uZSwgJ3gnOiA0Mn0pCiAKQEAgLTExNTAsNyArMTE1MCw3IEBACiAKICAgICBkZWYgcHJvY2Vzc190dXBsZShzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8sIGxlbiwgdHlwZSk6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZSBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlIGlzIGludCkKIAogICAgICAgICBpZiBvcHQgPT0gIi1wIjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICIxLDIsMyIpCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fbGlzdD1vcHRpb25zKQogCiAgICAgZGVmIHZhcmlhYmxlX2FyZ3Moc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXIpOgotICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGlzIE5vbmUpCiAgICAgICAgIGRvbmUgPSAwCiAgICAgICAgIHZhbHVlID0gW10KICAgICAgICAgcmFyZ3MgPSBwYXJzZXIucmFyZ3MKQEAgLTEyOTcsNyArMTI5Nyw3IEBACiAKIGNsYXNzIFRlc3RDb25mbGljdChDb25mbGljdEJhc2UpOgogICAgICIiIlVzZSB0aGUgZGVmYXVsdCBjb25mbGljdCByZXNvbHV0aW9uIGZvciBPcHRpayAxLjI6IGVycm9yLiIiIgotICAgIGRlZiBhc3NlcnRfY29uZmxpY3RfZXJyb3Ioc2VsZiwgZnVuYyk6CisgICAgZGVmIGFzc2VydFRydWVjb25mbGljdF9lcnJvcihzZWxmLCBmdW5jKToKICAgICAgICAgZXJyID0gc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBmdW5jLCAoIi12IiwgIi0tdmVyc2lvbiIpLCB7J2FjdGlvbicgOiAiY2FsbGJhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFjaycgOiBzZWxmLnNob3dfdmVyc2lvbiwKQEAgLTEzMDksMTEgKzEzMDksMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIub3B0aW9uX2lkLCAiLXYvLS12ZXJzaW9uIikKIAogICAgIGRlZiB0ZXN0X2NvbmZsaWN0X2Vycm9yKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF9jb25mbGljdF9lcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uKQorICAgICAgICBzZWxmLmFzc2VydFRydWVjb25mbGljdF9lcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uKQogCiAgICAgZGVmIHRlc3RfY29uZmxpY3RfZXJyb3JfZ3JvdXAoc2VsZik6CiAgICAgICAgIGdyb3VwID0gT3B0aW9uR3JvdXAoc2VsZi5wYXJzZXIsICJHcm91cCAxIikKLSAgICAgICAgc2VsZi5hc3NlcnRfY29uZmxpY3RfZXJyb3IoZ3JvdXAuYWRkX29wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlY29uZmxpY3RfZXJyb3IoZ3JvdXAuYWRkX29wdGlvbikKIAogICAgIGRlZiB0ZXN0X25vX3N1Y2hfY29uZmxpY3RfaGFuZGxlcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCkBAIC0xMzMzLDggKzEzMzMsOCBAQAogICAgICAgICB2ZXJib3NlX29wdCA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tdmVyYm9zZSIpCiAgICAgICAgIHZlcnNpb25fb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJzaW9uIikKIAotICAgICAgICBzZWxmLmFzc2VydF8odl9vcHQgaXMgdmVyc2lvbl9vcHQpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2X29wdCBpcyBub3QgdmVyYm9zZV9vcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2X29wdCBpcyB2ZXJzaW9uX29wdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZfb3B0IGlzIG5vdCB2ZXJib3NlX29wdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2X29wdC5fbG9uZ19vcHRzLCBbIi0tdmVyc2lvbiJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnNpb25fb3B0Ll9zaG9ydF9vcHRzLCBbIi12Il0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyc2lvbl9vcHQuX2xvbmdfb3B0cywgWyItLXZlcnNpb24iXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IDQyNzE2ZmUuLmZhODJhNzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMjIsNyArMjIsNyBAQAogICAgIGRlZiB0ZXN0X2FjY2VzcyhzZWxmKToKICAgICAgICAgZiA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19DUkVBVHxvcy5PX1JEV1IpCiAgICAgICAgIG9zLmNsb3NlKGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5hY2Nlc3ModGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuV19PSykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5hY2Nlc3ModGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuV19PSykpCiAKICAgICBkZWYgdGVzdF9jbG9zZXJhbmdlKHNlbGYpOgogICAgICAgICBmaXJzdCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19DUkVBVHxvcy5PX1JEV1IpCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICBkZWYgY2hlY2tfdGVtcGZpbGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICMgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdDoKLSAgICAgICAgc2VsZi5mYWlsSWYob3MucGF0aC5leGlzdHMobmFtZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMobmFtZSksCiAgICAgICAgICAgICAgICAgICAgICJmaWxlIGFscmVhZHkgZXhpc3RzIGZvciB0ZW1wb3JhcnkgZmlsZSIpCiAgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiBjcmVhdGUgdGhlIGZpbGUKICAgICAgICAgb3BlbihuYW1lLCAidyIpCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUobmFtZSkKIAogICAgICAgICBuYW1lID0gb3MudGVtcG5hbSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicGZ4IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguYmFzZW5hbWUobmFtZSlbOjNdID09ICJwZngiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5iYXNlbmFtZShuYW1lKVs6M10gPT0gInBmeCIpCiAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUobmFtZSkKIAogICAgIGRlZiB0ZXN0X3RtcGZpbGUoc2VsZik6CkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgZnAuc2VlaygwLDApCiAgICAgICAgIHMgPSBmcC5yZWFkKCkKICAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8ocyA9PSAiZm9vYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gImZvb2JhciIpCiAKICAgICBkZWYgdGVzdF90bXBuYW0oc2VsZik6CiAgICAgICAgIGltcG9ydCBzeXMKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICAgICAgIyB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBkcml2ZS4gIFRoYXQncyBhIHRlcnJpYmxlIHBsYWNlIHRvCiAgICAgICAgICAgICAjIHB1dCB0ZW1wIGZpbGVzLCBhbmQsIGRlcGVuZGluZyBvbiBwcml2aWxlZ2VzLCB0aGUgdXNlcgogICAgICAgICAgICAgIyBtYXkgbm90IGV2ZW4gYmUgYWJsZSB0byBvcGVuIGEgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihvcy5wYXRoLmV4aXN0cyhuYW1lKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMobmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGVtcG9yYXJ5IGZpbGUiKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5jaGVja190ZW1wZmlsZShuYW1lKQpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRlZiB0cnVuYyh4KTogcmV0dXJuIHgKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cnVuYyhnZXRhdHRyKHJlc3VsdCwgYXR0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtnZXRhdHRyKHN0YXQsIG5hbWUpXSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYXR0ciBpbiBtZW1iZXJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhdHRyIGluIG1lbWJlcnMpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmVzdWx0WzIwMF0KQEAgLTQ2NCw3ICs0NjQsNyBAQAogICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogCiAgICAgICAgICMgVHJ5IHBhdGhzIHdpdGggYSAnLicgaW4gdGhlbQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoT1NFcnJvciwgb3MubWFrZWRpcnMsIG9zLmN1cmRpcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MubWFrZWRpcnMsIG9zLmN1cmRpcikKICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCAnZGlyMScsICdkaXIyJywgJ2RpcjMnLCAnZGlyNCcsICdkaXI1Jywgb3MuY3VyZGlyKQogICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICdkaXIxJywgb3MuY3VyZGlyLCAnZGlyMicsICdkaXIzJywgJ2RpcjQnLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weSBiL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKaW5kZXggMzQ4OTNmMS4uZGYwNDcwNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgIGRzcC5maWxlbm8oKQogCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlcyB3b3JrLgotICAgICAgICBzZWxmLmZhaWxJZihkc3AuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRzcC5jbG9zZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHNwLm5hbWUsICIvZGV2L2RzcCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHNwLm1vZGUsICJ3IiwgImJhZCBkc3AubW9kZTogJXIiICUgZHNwLm1vZGUpCiAKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgZWxhcHNlZF90aW1lID0gdDIgLSB0MQogCiAgICAgICAgIHBlcmNlbnRfZGlmZiA9IChhYnMoZWxhcHNlZF90aW1lIC0gZXhwZWN0ZWRfdGltZSkgLyBleHBlY3RlZF90aW1lKSAqIDEwMAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGVyY2VudF9kaWZmIDw9IDEwLjAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwZXJjZW50X2RpZmYgPD0gMTAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICJlbGFwc2VkIHRpbWUgPiAxMCUgb2ZmIG9mIGV4cGVjdGVkIHRpbWUiKQogCiAgICAgZGVmIHNldF9wYXJhbWV0ZXJzKHNlbGYsIGRzcCk6CkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBdOgogICAgICAgICAgICAgKGZtdCwgY2hhbm5lbHMsIHJhdGUpID0gY29uZmlnCiAgICAgICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmRXF1YWwocmVzdWx0LCBjb25maWcsCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlc3VsdCwgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZGx5IGdvdCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiIpCiAKICAgICAgICAgICAgIHRyeToKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgICAgICAgICAgI3NlbGYuc2V0X2JhZF9wYXJhbWV0ZXJzKGRzcCkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGRzcC5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZHNwLmNsb3NlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkc3AuY2xvc2VkKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKaW5kZXggNjYzOGE1YS4uMWY2ZWZiNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKQEAgLTI1LDggKzI1LDggQEAKICAgICAgICAgICAgICAgICBkZWwgeAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZSh1bm90KQogICAgICAgICBmb3IgZWxlbSBpbiAoJ1VOQVJZX05PVCcsICdQT1BfSlVNUF9JRl9GQUxTRScpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gbm90IGluIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdQT1BfSlVNUF9JRl9UUlVFJyBpbiBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1BPUF9KVU1QX0lGX1RSVUUnIGluIGFzbSkKIAogICAgIGRlZiB0ZXN0X2VsaW1faW52ZXJzaW9uX29mX2lzX29yX2luKHNlbGYpOgogICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgICAgICAoJ25vdCBhIG5vdCBpbiBiJywgJyhpbiknLCksCiAgICAgICAgICAgICApOgogICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtKQogCiAgICAgZGVmIHRlc3Rfbm9uZV9hc19jb25zdGFudChzZWxmKToKICAgICAgICAgIyBMT0FEX0dMT0JBTCBOb25lICAtLT4gIExPQURfQ09OU1QgTm9uZQpAQCAtNDUsMTQgKzQ1LDE0IEBACiAgICAgICAgICAgICByZXR1cm4geAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQogICAgICAgICBmb3IgZWxlbSBpbiAoJ0xPQURfR0xPQkFMJywpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gbm90IGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIG5vdCBpbiBhc20pCiAgICAgICAgIGZvciBlbGVtIGluICgnTE9BRF9DT05TVCcsICcoTm9uZSknKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGFzbSkKICAgICAgICAgZGVmIGYoKToKICAgICAgICAgICAgICdBZGRpbmcgYSBkb2NzdHJpbmcgbWFkZSB0aGlzIHRlc3QgZmFpbCBpbiBQeTIuNS4wJwogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdMT0FEX0NPTlNUJyBpbiBkaXNhc3NlbWJsZShmKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdMT0FEX0dMT0JBTCcgbm90IGluIGRpc2Fzc2VtYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0xPQURfQ09OU1QnIGluIGRpc2Fzc2VtYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0xPQURfR0xPQkFMJyBub3QgaW4gZGlzYXNzZW1ibGUoZikpCiAKICAgICBkZWYgdGVzdF93aGlsZV9vbmUoc2VsZik6CiAgICAgICAgICMgU2tpcCBvdmVyOiAgTE9BRF9DT05TVCB0cnVlY29uc3QgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4CkBAIC02Miw5ICs2Miw5IEBACiAgICAgICAgICAgICByZXR1cm4gbGlzdAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQogICAgICAgICBmb3IgZWxlbSBpbiAoJ0xPQURfQ09OU1QnLCAnUE9QX0pVTVBfSUZfRkFMU0UnKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIG5vdCBpbiBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBub3QgaW4gYXNtKQogICAgICAgICBmb3IgZWxlbSBpbiAoJ0pVTVBfQUJTT0xVVEUnLCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBpbiBhc20pCiAKICAgICBkZWYgdGVzdF9wYWNrX3VucGFjayhzZWxmKToKICAgICAgICAgZm9yIGxpbmUsIGVsZW0gaW4gKApAQCAtNzMsOSArNzMsOSBAQAogICAgICAgICAgICAgKCdhLCBiLCBjID0gYSwgYiwgYycsICdST1RfVEhSRUUnLCksCiAgICAgICAgICAgICApOgogICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gYXNtKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdCVUlMRF9UVVBMRScgbm90IGluIGFzbSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnVU5QQUNLX1RVUExFJyBub3QgaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdCVUlMRF9UVVBMRScgbm90IGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVU5QQUNLX1RVUExFJyBub3QgaW4gYXNtKQogCiAgICAgZGVmIHRlc3RfZm9sZGluZ19vZl90dXBsZXNfb2ZfY29uc3RhbnRzKHNlbGYpOgogICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCkBAIC04Niw4ICs4Niw4IEBACiAgICAgICAgICAgICAoJygoMSwgMiksIDMsIDQpJywgJygoKDEsIDIpLCAzLCA0KSknKSwKICAgICAgICAgICAgICk6CiAgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ0JVSUxEX1RVUExFJyBub3QgaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdCVUlMRF9UVVBMRScgbm90IGluIGFzbSkKIAogICAgICAgICAjIEJ1ZyAxMDUzODE5OiAgVHVwbGUgb2YgY29uc3RhbnRzIG1pc2lkZW50aWZpZWQgd2hlbiBwcmVzZW50ZWQgd2l0aDoKICAgICAgICAgIyAuIC4gLiBvcGNvZGVfd2l0aF9hcmcgMTAwICAgdW5hcnlfb3Bjb2RlICAgQlVJTERfVFVQTEUgMSAgLiAuIC4KQEAgLTEyNSwxNyArMTI1LDE3IEBACiAgICAgICAgICAgICAoJ2EgPSAxMyB8IDcnLCAnKDE1KScpLCAgICAgICAgICAgICAgICAgIyBiaW5hcnkgb3IKICAgICAgICAgICAgICk6CiAgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20sIGFzbSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnQklOQVJZXycgbm90IGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdCSU5BUllfJyBub3QgaW4gYXNtKQogCiAgICAgICAgICMgVmVyaWZ5IHRoYXQgdW5mb2xkYWJsZXMgYXJlIHNraXBwZWQKICAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgnYT0yKyJiIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnKDIpJyBpbiBhc20pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiKCdiJykiIGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcoMiknIGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCIoJ2InKSIgaW4gYXNtKQogCiAgICAgICAgICMgVmVyaWZ5IHRoYXQgbGFyZ2Ugc2VxdWVuY2VzIGRvIG5vdCByZXN1bHQgZnJvbSBmb2xkaW5nCiAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ2E9IngiKjEwMDAnKQotICAgICAgICBzZWxmLmFzc2VydF8oJygxMDAwKScgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJygxMDAwKScgaW4gYXNtKQogCiAgICAgZGVmIHRlc3RfZm9sZGluZ19vZl91bmFyeW9wc19vbl9jb25zdGFudHMoc2VsZik6CiAgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKQEAgLTE0NCw4ICsxNDQsOCBAQAogICAgICAgICAgICAgKCd+LTInLCAnKDEpJyksICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5hcnkgaW52ZXJ0CiAgICAgICAgICk6CiAgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20sIGFzbSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnVU5BUllfJyBub3QgaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtLCBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1VOQVJZXycgbm90IGluIGFzbSkKIAogICAgICAgICAjIFZlcmlmeSB0aGF0IHVuZm9sZGFibGVzIGFyZSBza2lwcGVkCiAgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKQEAgLTE1MywxNiArMTUzLDE2IEBACiAgICAgICAgICAgICAoJ34iYWJjIicsICIoJ2FiYycpIiksICAgICAgICAgICAgICAgICAgIyB1bmFyeSBpbnZlcnQKICAgICAgICAgKToKICAgICAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUobGluZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIGFzbSwgYXNtKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdVTkFSWV8nIGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdVTkFSWV8nIGluIGFzbSkKIAogICAgIGRlZiB0ZXN0X2VsaW1fZXh0cmFfcmV0dXJuKHNlbGYpOgogICAgICAgICAjIFJFVFVSTiBMT0FEX0NPTlNUIE5vbmUgUkVUVVJOICAtLT4gIFJFVFVSTgogICAgICAgICBkZWYgZih4KToKICAgICAgICAgICAgIHJldHVybiB4CiAgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnTE9BRF9DT05TVCcgbm90IGluIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCcoTm9uZSknIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnTE9BRF9DT05TVCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcoTm9uZSknIG5vdCBpbiBhc20pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCAxKQogCiAgICAgZGVmIHRlc3RfZWxpbV9qdW1wX3RvX3JldHVybihzZWxmKToKQEAgLTE3MCw4ICsxNzAsOCBAQAogICAgICAgICBkZWYgZihjb25kLCB0cnVlX3ZhbHVlLCBmYWxzZV92YWx1ZSk6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZV92YWx1ZSBpZiBjb25kIGVsc2UgZmFsc2VfdmFsdWUKICAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9BQlNPTFVURScgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnSlVNUF9BQlNPTFVURScgbm90IGluIGFzbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDIpCiAKICAgICBkZWYgdGVzdF9lbGltX2p1bXBfYWZ0ZXJfcmV0dXJuMShzZWxmKToKQEAgLTE4Niw4ICsxODYsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiA1CiAgICAgICAgICAgICByZXR1cm4gNgogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0FCU09MVVRFJyBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdKVU1QX0FCU09MVVRFJyBub3QgaW4gYXNtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgNikKIAogICAgIGRlZiB0ZXN0X2VsaW1fanVtcF9hZnRlcl9yZXR1cm4yKHNlbGYpOgpAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gNAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCiAgICAgICAgICMgVGhlcmUgc2hvdWxkIGJlIG9uZSBqdW1wIGZvciB0aGUgd2hpbGUgbG9vcC4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnSlVNUF9BQlNPTFVURScpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjQ3LnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKaW5kZXggNjkxYzg1YS4uN2Q3NDI1ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKQEAgLTE5LDggKzE5LDggQEAKIGNsYXNzIFBlcDI0N1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIGNoZWNrX21vZHVsZShzZWxmLCBtb2R1bGUsIGtleT1Ob25lKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIobW9kdWxlLCAnZGlnZXN0X3NpemUnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1vZHVsZS5kaWdlc3Rfc2l6ZSBpcyBOb25lIG9yIG1vZHVsZS5kaWdlc3Rfc2l6ZSA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1vZHVsZSwgJ2RpZ2VzdF9zaXplJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZSBvciBtb2R1bGUuZGlnZXN0X3NpemUgPiAwKQogCiAgICAgICAgIGlmIG5vdCBrZXkgaXMgTm9uZToKICAgICAgICAgICAgIG9iajEgPSBtb2R1bGUubmV3KGtleSkKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoMSwgaDIpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIob2JqMSwgJ2RpZ2VzdF9zaXplJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9iajEsICdkaWdlc3Rfc2l6ZScpKQogCiAgICAgICAgIGlmIG5vdCBtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iajEuZGlnZXN0X3NpemUsIG1vZHVsZS5kaWdlc3Rfc2l6ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjc3LnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAyNzcucHkKaW5kZXggYTYxYmNkZi4uNDY5NWUwYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyNzcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyNzcucHkKQEAgLTgyLDggKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKSkKICAgICAgICAgc2YyID0gc2V0KHUiXFwiLmpvaW4oKHVuaWNvZGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIGYpKQogICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihmMSksIGxlbihzZWxmLmZpbGVzKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2YyLCBzZXQoc2VsZi5maWxlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYxKSwgbGVuKHNlbGYuZmlsZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNmMiwgc2V0KHNlbGYuZmlsZXMpKQogCiAgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmZpbGVzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQppbmRleCA1ZjU3OGQyLi5kMjQyOWViIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQpAQCAtMTksNyArMTksNyBAQAogICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSkiIiIKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW5zX25ld19zdHlsZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCkpCiAKICAgICBkZWYgdmVyaWZ5X2luc3RhbmNlX2ludGVyZmFjZShzZWxmLCBpbnMpOgogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICAgICAgICAgbGFzdF9leGMgPSBnZXRhdHRyKF9fYnVpbHRpbl9fLCBzdXBlcmNsYXNzX25hbWUpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJiYXNlIGNsYXNzICVzIG5vdCBhIGJ1aWx0LWluIiAlIHN1cGVyY2xhc3NfbmFtZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdXBlcmNsYXNzX25hbWUgaW4gZXhjX3NldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdXBlcmNsYXNzX25hbWUgaW4gZXhjX3NldCkKICAgICAgICAgICAgIGV4Y19zZXQuZGlzY2FyZChzdXBlcmNsYXNzX25hbWUpCiAgICAgICAgICAgICBzdXBlcmNsYXNzZXMgPSBbXSAgIyBMb29wIHdpbGwgaW5zZXJ0IGJhc2UgZXhjZXB0aW9uCiAgICAgICAgICAgICBsYXN0X2RlcHRoID0gMApAQCAtNjgsMjAgKzY4LDIwIEBACiAgICAgICAgICAgICAgICAgZWxpZiBsYXN0X2RlcHRoID4gZGVwdGg6CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHN1cGVyY2xhc3Nlc1stMV1bMF0gPj0gZGVwdGg6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcmNsYXNzZXMucG9wKCkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhleGMsIHN1cGVyY2xhc3Nlc1stMV1bMV0pLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Yywgc3VwZXJjbGFzc2VzWy0xXVsxXSksCiAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YmNsYXNzIG9mICVzIiAlIChleGMuX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgIHN1cGVyY2xhc3Nlc1stMV1bMV0uX19uYW1lX18pKQogICAgICAgICAgICAgICAgIHRyeTogICMgU29tZSBleGNlcHRpb25zIHJlcXVpcmUgYXJndW1lbnRzOyBqdXN0IHNraXAgdGhlbQogICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcmlmeV9pbnN0YW5jZV9pbnRlcmZhY2UoZXhjKCkpCiAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleGNfbmFtZSBpbiBleGNfc2V0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleGNfbmFtZSBpbiBleGNfc2V0KQogICAgICAgICAgICAgICAgIGV4Y19zZXQuZGlzY2FyZChleGNfbmFtZSkKICAgICAgICAgICAgICAgICBsYXN0X2V4YyA9IGV4YwogICAgICAgICAgICAgICAgIGxhc3RfZGVwdGggPSBkZXB0aAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgaW5oZXJpdGFuY2VfdHJlZS5jbG9zZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihleGNfc2V0KSwgMCwgIiVzIG5vdCBhY2NvdW50ZWQgZm9yIiAlIGV4Y19zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4Y19zZXQpLCAwLCAiJXMgbm90IGFjY291bnRlZCBmb3IiICUgZXhjX3NldCkKIAogICAgIGludGVyZmFjZV90ZXN0cyA9ICgibGVuZ3RoIiwgImFyZ3MiLCAibWVzc2FnZSIsICJzdHIiLCAidW5pY29kZSIsICJyZXByIiwKICAgICAgICAgICAgICJpbmRleGluZyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZy5weSBiL0xpYi90ZXN0L3Rlc3RfcGtnLnB5CmluZGV4IDNhOTU0Y2EuLmUzYjg2ZTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGtnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtnLnB5CkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJzdWIuX19uYW1lX18sICJ0Mi5zdWIuc3Vic3ViIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuc3Vic3ViLl9fbmFtZV9fLCAidDIuc3ViLnN1YnN1YiIpCiAgICAgICAgIGZvciBuYW1lIGluIFsnc3BhbScsICdzdWInLCAnc3Vic3ViJywgJ3QyJ106Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobG9jYWxzKClbIm5hbWUiXSwgIkZhaWxlZCB0byBpbXBvcnQgJXMiICUgbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NhbHMoKVsibmFtZSJdLCAiRmFpbGVkIHRvIGltcG9ydCAlcyIgJSBuYW1lKQogCiAgICAgICAgIGltcG9ydCB0Mi5zdWIKICAgICAgICAgaW1wb3J0IHQyLnN1Yi5zdWJzdWIKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAgICAgICAgIHMgPSAiIiIKICAgICAgICAgICAgIGZyb20gdDIgaW1wb3J0ICoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkaXIoKSwgWydzZWxmJywgJ3N1YiddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcigpLCBbJ3NlbGYnLCAnc3ViJ10pCiAgICAgICAgICAgICAiIiIKICAgICAgICAgc2VsZi5ydW5fY29kZShzKQogCkBAIC0yNTQsMjUgKzI1NCwyNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodGFzKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJ10pCi0gICAgICAgIHNlbGYuZmFpbElmKHQ3KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQ3KQogICAgICAgICBmcm9tIHQ3IGltcG9ydCBzdWIgYXMgc3VicGFyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZGlyKGRpcihzdWJwYXIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nXSkKLSAgICAgICAgc2VsZi5mYWlsSWYodDcpCi0gICAgICAgIHNlbGYuZmFpbElmKHN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0NykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWIpCiAgICAgICAgIGZyb20gdDcuc3ViIGltcG9ydCBzdWJzdWIgYXMgc3Vic3Vic3ViCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZGlyKGRpcihzdWJzdWJzdWIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXycsICdfX3BhdGhfXycsICdzcGFtJ10pCi0gICAgICAgIHNlbGYuZmFpbElmKHQ3KQotICAgICAgICBzZWxmLmZhaWxJZihzdWIpCi0gICAgICAgIHNlbGYuZmFpbElmKHN1YnN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0NykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3Vic3ViKQogICAgICAgICBmcm9tIHQ3LnN1Yi5zdWJzdWIgaW1wb3J0IHNwYW0gYXMgaGFtCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFtLCAxKQotICAgICAgICBzZWxmLmZhaWxJZih0NykKLSAgICAgICAgc2VsZi5mYWlsSWYoc3ViKQotICAgICAgICBzZWxmLmZhaWxJZihzdWJzdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3ViKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YnN1YikKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5CmluZGV4IGM4N2MzNDIuLjhhYTIyNGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5CkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIHRyeTogX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6IHBhc3MKICAgICAgICAgZWxzZTogcmFpc2UgUnVudGltZUVycm9yLCAnRmFpbGVkIHRvIGluZHVjZSBTeW50YXhFcnJvcicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzeXMubW9kdWxlcy5oYXNfa2V5KHNlbGYubW9kdWxlX25hbWUpIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHN5cy5tb2R1bGVzLmhhc19rZXkoc2VsZi5tb2R1bGVfbmFtZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICBub3QgaGFzYXR0cihzeXMubW9kdWxlc1tzZWxmLnBhY2thZ2VfbmFtZV0sICdmb28nKSkKIAogICAgICAgICAjIC4uLm1ha2UgdXAgYSB2YXJpYWJsZSBuYW1lIHRoYXQgaXNuJ3QgYm91bmQgaW4gX19idWlsdGluc19fCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5IGIvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQppbmRleCAwY2E3NjFjLi42M2Q1ZGEyMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CkBAIC0xMjUsMTIgKzEyNSwxMiBAQAogCiAgICAgZGVmIHRlc3RfdW5hbWUoc2VsZik6CiAgICAgICAgIHJlcyA9IHBsYXRmb3JtLnVuYW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFueShyZXMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYW55KHJlcykpCiAKICAgICBkZWYgdGVzdF9qYXZhX3ZlcihzZWxmKToKICAgICAgICAgcmVzID0gcGxhdGZvcm0uamF2YV92ZXIoKQogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2phdmEnOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFsbChyZXMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChyZXMpKQogCiAgICAgZGVmIHRlc3Rfd2luMzJfdmVyKHNlbGYpOgogICAgICAgICByZXMgPSBwbGF0Zm9ybS53aW4zMl92ZXIoKQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlYWxfdmVyID0gbG4uc3RyaXAoKS5zcGxpdCgpWy0xXQogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgZmQuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYocmVhbF92ZXIgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVhbF92ZXIgaXMgTm9uZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc1swXSwgcmVhbF92ZXIpCiAKICAgICAgICAgICAgICMgcmVzWzFdIGNsYWltcyB0byBjb250YWluCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CmluZGV4IGFkNGI4ZDMuLjUwNmQxODMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CkBAIC0yNDYsNyArMjQ2LDcgQEAKICAgICAgICAgICAgIHNlbGYuY2xpZW50ID0gcG9wbGliLlBPUDNfU1NMKHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCiAKICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdQT1AzX1NTTCcgaW4gcG9wbGliLl9fYWxsX18pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1BPUDNfU1NMJyBpbiBwb3BsaWIuX19hbGxfXykKIAogCiBjbGFzcyBUZXN0VGltZW91dHMoVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3NpeC5weSBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKaW5kZXggMzJjYmExMy4uYTk2MzA5ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CkBAIC00MywxMyArNDMsMTMgQEAKIAogICAgIGRlZiB0ZXN0X3N0YXR2ZnMoc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdzdGF0dmZzJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocG9zaXguc3RhdHZmcyhvcy5jdXJkaXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXR2ZnMob3MuY3VyZGlyKSkKIAogICAgIGRlZiB0ZXN0X2ZzdGF0dmZzKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZnN0YXR2ZnMnKToKICAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC5mc3RhdHZmcyhmcC5maWxlbm8oKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmZzdGF0dmZzKGZwLmZpbGVubygpKSkKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmZCA9IHBvc2l4LmR1cChmcC5maWxlbm8oKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShmZCwgaW50KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShmZCwgaW50KSkKICAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQpAQCAtMTM1LDEzICsxMzUsMTMgQEAKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2ZzdGF0Jyk6CiAgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ocG9zaXguZnN0YXQoZnAuZmlsZW5vKCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5mc3RhdChmcC5maWxlbm8oKSkpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0X3N0YXQoc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdzdGF0Jyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocG9zaXguc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pKQogCiAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2Nob3duJyk6CiAgICAgICAgIGRlZiB0ZXN0X2Nob3duKHNlbGYpOgpAQCAtMTc3LDIxICsxNzcsMjEgQEAKIAogICAgIGRlZiB0ZXN0X2xzZGlyKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnbHNkaXInKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0X3N1cHBvcnQuVEVTVEZOIGluIHBvc2l4LmxzZGlyKG9zLmN1cmRpcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9zdXBwb3J0LlRFU1RGTiBpbiBwb3NpeC5sc2Rpcihvcy5jdXJkaXIpKQogCiAgICAgZGVmIHRlc3RfYWNjZXNzKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnYWNjZXNzJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocG9zaXguYWNjZXNzKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLlJfT0spKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmFjY2Vzcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5SX09LKSkKIAogICAgIGRlZiB0ZXN0X3VtYXNrKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAndW1hc2snKToKICAgICAgICAgICAgIG9sZF9tYXNrID0gcG9zaXgudW1hc2soMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG9sZF9tYXNrLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob2xkX21hc2ssIGludCkpCiAgICAgICAgICAgICBwb3NpeC51bWFzayhvbGRfbWFzaykKIAogICAgIGRlZiB0ZXN0X3N0cmVycm9yKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RyZXJyb3InKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC5zdHJlcnJvcigwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdHJlcnJvcigwKSkKIAogICAgIGRlZiB0ZXN0X3BpcGUoc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdwaXBlJyk6CkBAIC0yMDEsOSArMjAxLDkgQEAKIAogICAgIGRlZiB0ZXN0X3RlbXBuYW0oc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd0ZW1wbmFtJyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocG9zaXgudGVtcG5hbSgpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHBvc2l4LnRlbXBuYW0ob3MuY3VyZGlyKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC50ZW1wbmFtKG9zLmN1cmRpciwgJ2JsYWgnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC50ZW1wbmFtKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXgudGVtcG5hbShvcy5jdXJkaXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnRlbXBuYW0ob3MuY3VyZGlyLCAnYmxhaCcpKQogCiAgICAgZGVmIHRlc3RfdG1wZmlsZShzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3RtcGZpbGUnKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKaW5kZXggMGEwYTQ4Yi4uM2U4ZmZhOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgICAgIHNhZmVfcm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTiArIHN1ZmZpeCkKIAogICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogICAgIGRlZiB0ZXN0X25vcm1jYXNlKHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoYXQgbm9ybWNhc2UoKSBpcyBpZGVtcG90ZW50CkBAIC0xMzQsOCArMTM0LDggQEAKICAgICAgICAgZm9yIHMxIGluIHRlc3RsaXN0OgogICAgICAgICAgICAgZm9yIHMyIGluIHRlc3RsaXN0OgogICAgICAgICAgICAgICAgIHAgPSBwb3NpeHBhdGguY29tbW9ucHJlZml4KFtzMSwgczJdKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzMS5zdGFydHN3aXRoKHApKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzMi5zdGFydHN3aXRoKHApKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMS5zdGFydHN3aXRoKHApKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMi5zdGFydHN3aXRoKHApKQogICAgICAgICAgICAgICAgIGlmIHMxICE9IHMyOgogICAgICAgICAgICAgICAgICAgICBuID0gbGVuKHApCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoczFbbjpuKzFdLCBzMltuOm4rMV0pCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCAiZm9vYmFyIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5nZXRjdGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSA8PQogICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5nZXRtdGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICAgICAgKQpAQCAtMzM1LDE1ICszMzUsMTUgQEAKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4vIiksIGJhc2VzdHJpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4vIiksIGJhc2VzdHJpbmcpKQogICAgICAgICAgICAgIyBpZiBob21lIGRpcmVjdG9yeSA9PSByb290IGRpcmVjdG9yeSwgdGhpcyB0ZXN0IG1ha2VzIG5vIHNlbnNlCiAgICAgICAgICAgICBpZiBwb3NpeHBhdGguZXhwYW5kdXNlcigifiIpICE9ICcvJzoKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgICAgICBwb3NpeHBhdGguZXhwYW5kdXNlcigifiIpICsgIi8iLAogICAgICAgICAgICAgICAgICAgICBwb3NpeHBhdGguZXhwYW5kdXNlcigifi8iKQogICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+cm9vdC8iKSwgYmFzZXN0cmluZykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifmZvby8iKSwgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifnJvb3QvIiksIGJhc2VzdHJpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn5mb28vIiksIGJhc2VzdHJpbmcpKQogCiAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgogICAgICAgICAgICAgICAgIGVudlsnSE9NRSddID0gJy8nCkBAIC0zODQsMTIgKzM4NCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4cGF0aC5ub3JtcGF0aCkKIAogICAgIGRlZiB0ZXN0X2Fic3BhdGgoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vIiBpbiBwb3NpeHBhdGguYWJzcGF0aCgiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZm9vIiBpbiBwb3NpeHBhdGguYWJzcGF0aCgiZm9vIikpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeHBhdGguYWJzcGF0aCkKIAogICAgIGRlZiB0ZXN0X3JlYWxwYXRoKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oImZvbyIgaW4gcmVhbHBhdGgoImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbyIgaW4gcmVhbHBhdGgoImZvbyIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4cGF0aC5yZWFscGF0aCkKIAogICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BwcmludC5weSBiL0xpYi90ZXN0L3Rlc3RfcHByaW50LnB5CmluZGV4IDNmMjkwMzguLjcxYjkwNGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHByaW50LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHByaW50LnB5CkBAIC00MCw3ICs0MCw3IEBACiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKICAgICAgICAgIyBWZXJpZnkgLmlzcmVjdXJzaXZlKCkgYW5kIC5pc3JlYWRhYmxlKCkgdy9vIHJlY3Vyc2lvbgotICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydF8KKyAgICAgICAgdmVyaWZ5ID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHBwID0gcHByaW50LlByZXR0eVByaW50ZXIoKQogICAgICAgICBmb3Igc2FmZSBpbiAoMiwgMi4wLCAyaiwgImFiYyIsIFszXSwgKDIsMiksIHszOiAzfSwgdW5pKCJ5YWRkYXlhZGRhIiksCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmEsIHNlbGYuYik6CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIHNlbGYuZCA9IHt9CiAgICAgICAgIHNlbGYuZFswXSA9IHNlbGYuZFsxXSA9IHNlbGYuZFsyXSA9IHNlbGYuZAogCi0gICAgICAgIHZlcmlmeSA9IHNlbGYuYXNzZXJ0XworICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgcHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcigpCiAKICAgICAgICAgZm9yIGlja3kgaW4gc2VsZi5hLCBzZWxmLmIsIHNlbGYuZCwgKHNlbGYuZCwgc2VsZi5kKToKQEAgLTkxLDcgKzkxLDcgQEAKIAogICAgIGRlZiB0ZXN0X3VucmVhZGFibGUoc2VsZik6CiAgICAgICAgICMgTm90IHJlY3Vyc2l2ZSBidXQgbm90IHJlYWRhYmxlIGFueXdheQotICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydF8KKyAgICAgICAgdmVyaWZ5ID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHBwID0gcHByaW50LlByZXR0eVByaW50ZXIoKQogICAgICAgICBmb3IgdW5yZWFkYWJsZSBpbiB0eXBlKDMpLCBwcHJpbnQsIHBwcmludC5pc3JlY3Vyc2l2ZToKICAgICAgICAgICAgICMgbW9kdWxlLWxldmVsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgICMgaXQgc29ydGVkIGEgZGljdCBkaXNwbGF5IGlmIGFuZCBvbmx5IGlmIHRoZSBkaXNwbGF5IHJlcXVpcmVkCiAgICAgICAgICMgbXVsdGlwbGUgbGluZXMuICBGb3IgdGhhdCByZWFzb24sIGRpY3RzIHdpdGggbW9yZSB0aGFuIG9uZSBlbGVtZW50CiAgICAgICAgICMgYXJlbid0IHRlc3RlZCBoZXJlLgotICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydF8KKyAgICAgICAgdmVyaWZ5ID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIGZvciBzaW1wbGUgaW4gKDAsIDBMLCAwKzBqLCAwLjAsICIiLCB1bmkoIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAoKSwgdHVwbGUyKCksIHR1cGxlMygpLAogICAgICAgICAgICAgICAgICAgICAgICBbXSwgbGlzdDIoKSwgbGlzdDMoKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHJvcGVydHkucHkgYi9MaWIvdGVzdC90ZXN0X3Byb3BlcnR5LnB5CmluZGV4IDdhODAwM2YuLjY4NGY4ZmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHJvcGVydHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wcm9wZXJ0eS5weQpAQCAtODYsOCArODYsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2Uuc3BhbSwgMTApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5fc3BhbSwgMTApCiAgICAgICAgIGRlbGF0dHIoYmFzZSwgInNwYW0iKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIoYmFzZSwgInNwYW0iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoYXNhdHRyKGJhc2UsICJfc3BhbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYmFzZSwgInNwYW0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKGJhc2UsICJfc3BhbSIpKQogICAgICAgICBiYXNlLnNwYW0gPSAyMAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2Uuc3BhbSwgMjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5fc3BhbSwgMjApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B3ZC5weSBiL0xpYi90ZXN0L3Rlc3RfcHdkLnB5CmluZGV4IGRlNDA4NGUuLmZkYzc0YjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHdkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHdkLnB5CkBAIC0xMywxOSArMTMsMTkgQEAKICAgICAgICAgZm9yIGUgaW4gZW50cmllczoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGUpLCA3KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzBdLCBlLnB3X25hbWUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X25hbWUsIGJhc2VzdHJpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZS5wd19uYW1lLCBiYXNlc3RyaW5nKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVsxXSwgZS5wd19wYXNzd2QpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X3Bhc3N3ZCwgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShlLnB3X3Bhc3N3ZCwgYmFzZXN0cmluZykpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbMl0sIGUucHdfdWlkKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZS5wd191aWQsIGludCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShlLnB3X3VpZCwgaW50KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVszXSwgZS5wd19naWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X2dpZCwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGUucHdfZ2lkLCBpbnQpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzRdLCBlLnB3X2dlY29zKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZS5wd19nZWNvcywgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShlLnB3X2dlY29zLCBiYXNlc3RyaW5nKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVs1XSwgZS5wd19kaXIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X2RpciwgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShlLnB3X2RpciwgYmFzZXN0cmluZykpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbNl0sIGUucHdfc2hlbGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X3NoZWxsLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGUucHdfc2hlbGwsIGJhc2VzdHJpbmcpKQogCiAgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgd29uJ3Qgd29yaywgYmVjYXVzZSBvZiBkdXBsaWNhdGUgZW50cmllcwogICAgICAgICAgICAgIyBmb3Igb25lIHVpZApAQCAtNDMsOCArNDMsOCBAQAogICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgaWYgbm90IGVbMF0gb3IgZVswXSA9PSAnKyc6CiAgICAgICAgICAgICAgICAgY29udGludWUgIyBza2lwIE5JUyBlbnRyaWVzIGV0Yy4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwd2QuZ2V0cHduYW0oZS5wd19uYW1lKSBpbiBlbnRyaWVzYnluYW1lW2UucHdfbmFtZV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocHdkLmdldHB3dWlkKGUucHdfdWlkKSBpbiBlbnRyaWVzYnl1aWRbZS5wd191aWRdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB3ZC5nZXRwd25hbShlLnB3X25hbWUpIGluIGVudHJpZXNieW5hbWVbZS5wd19uYW1lXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwd2QuZ2V0cHd1aWQoZS5wd191aWQpIGluIGVudHJpZXNieXVpZFtlLnB3X3VpZF0pCiAKICAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHdkLmdldHB3dWlkKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weTNrd2Fybi5weSBiL0xpYi90ZXN0L3Rlc3RfcHkza3dhcm4ucHkKaW5kZXggN2MyNTk4MC4uMzZjOTg4ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weTNrd2Fybi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5M2t3YXJuLnB5CkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lLCBsZXZlbD0wKQogICAgICAgICAgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZyBhcyBleGM6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1vZHVsZV9uYW1lIGluIGV4Yy5hcmdzWzBdLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2R1bGVfbmFtZSBpbiBleGMuYXJnc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHdhcm5pbmcgZGlkbid0IGNvbnRhaW4gbW9kdWxlIG5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbW9kdWxlX25hbWUpCiAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weSBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CmluZGV4IDVmYmU3NWQuLjcxZGRhMjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgICcnJyBzdWNjZWVkIGlmZiBoYXNhdHRyKG9iaixhdHRyKSBvciBhdHRyIGluIGlnbm9yZS4gJycnCiAgICAgICAgIGlmIGF0dHIgaW4gaWdub3JlOiByZXR1cm4KICAgICAgICAgaWYgbm90IGhhc2F0dHIob2JqLCBhdHRyKTogcHJpbnQgIj8/PyIsIGF0dHIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIob2JqLCBhdHRyKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob2JqLCBhdHRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZCBoYXNhdHRyKCVyLCAlciknICUgKG9iaiwgYXR0cikpCiAKIApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBpZiBrZXkgaW4gaWdub3JlOiByZXR1cm4KICAgICAgICAgaWYgbm90IG9iai5oYXNfa2V5KGtleSk6CiAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICIqKioiLGtleQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob2JqLmhhc19rZXkoa2V5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iai5oYXNfa2V5KGtleSkpCiAKICAgICBkZWYgYXNzZXJ0RXF1YWxzT3JJZ25vcmVkKHNlbGYsIGEsIGIsIGlnbm9yZSk6CiAgICAgICAgICcnJyBzdWNjZWVkIGlmZiBhID09IGIgb3IgYSBpbiBpZ25vcmUgb3IgYiBpbiBpZ25vcmUgJycnCkBAIC05MiwxMiArOTIsMTIgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SGFzYXR0cihtb2R1bGUsIG5hbWUsIGlnbm9yZSkKICAgICAgICAgICAgIHB5X2l0ZW0gPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHB5Y2xici5GdW5jdGlvbik6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocHlfaXRlbSwgKEZ1bmN0aW9uVHlwZSwgQnVpbHRpbkZ1bmN0aW9uVHlwZSkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHB5X2l0ZW0sIChGdW5jdGlvblR5cGUsIEJ1aWx0aW5GdW5jdGlvblR5cGUpKSkKICAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKICAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgZnVuY3Rpb25zIHRoYXQgY2FtZSBmcm9tIHNvbWV3aGVyZSBlbHNlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocHlfaXRlbS5fX21vZHVsZV9fLCB2YWx1ZS5tb2R1bGUpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHB5X2l0ZW0sIChDbGFzc1R5cGUsIHR5cGUpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShweV9pdGVtLCAoQ2xhc3NUeXBlLCB0eXBlKSkpCiAgICAgICAgICAgICAgICAgaWYgcHlfaXRlbS5fX21vZHVsZV9fICE9IG1vZHVsZU5hbWU6CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgIyBza2lwIGNsYXNzZXMgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weSBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKaW5kZXggYzFjMTlmNi4uMGZhZjRhMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICAgICAgIyBDaGVjayB0aGF0IHB5ZG9jZm9kZGVyIG1vZHVsZSBjYW4gYmUgZGVzY3JpYmVkCiAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgcHlkb2Nmb2RkZXIKICAgICAgICAgZG9jID0gcHlkb2MucmVuZGVyX2RvYyhweWRvY2ZvZGRlcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJweWRvY2ZvZGRlciIgaW4gZG9jKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInB5ZG9jZm9kZGVyIiBpbiBkb2MpCiAKICAgICBkZWYgdGVzdF9jbGFzc2ljX2NsYXNzKHNlbGYpOgogICAgICAgICBjbGFzcyBDOiAiQ2xhc3NpYyBjbGFzcyIKQEAgLTMwMiw3ICszMDIsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5ZG9jLmRlc2NyaWJlKEMpLCAnY2xhc3MgQycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoYyksICdpbnN0YW5jZSBvZiBDJykKICAgICAgICAgZXhwZWN0ZWQgPSAnaW5zdGFuY2Ugb2YgQyBpbiBtb2R1bGUgJXMnICUgX19uYW1lX18KLSAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkIGluIHB5ZG9jLnJlbmRlcl9kb2MoYykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZCBpbiBweWRvYy5yZW5kZXJfZG9jKGMpKQogCiAgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KTogIk5ldy1zdHlsZSBjbGFzcyIKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5ZG9jLmRlc2NyaWJlKEMpLCAnY2xhc3MgQycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoYyksICdDJykKICAgICAgICAgZXhwZWN0ZWQgPSAnQyBpbiBtb2R1bGUgJXMgb2JqZWN0JyAlIF9fbmFtZV9fCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhleHBlY3RlZCBpbiBweWRvYy5yZW5kZXJfZG9jKGMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgaW4gcHlkb2MucmVuZGVyX2RvYyhjKSkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQppbmRleCBlMGViOGY0Li4yZmEzNmI3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTEwMCwxMCArMTAwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWRuJ3Qgc2VlbSB0byBxdWV1ZSB0aGUgY29ycmVjdCBkYXRhISIpCiAgICAgICAgIGZvciBpIGluIHJhbmdlKFFVRVVFX1NJWkUtMSk6CiAgICAgICAgICAgICBxLnB1dChpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGVtcHR5IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZnVsbCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBmdWxsIikKICAgICAgICAgcS5wdXQoImxhc3QiKQotICAgICAgICBzZWxmLmFzc2VydF8ocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcS5wdXQoImZ1bGwiLCBibG9jaz0wKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgYXBwZWFyIHRvIGJsb2NrIHdpdGggYSBmdWxsIHF1ZXVlIikKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgICAgICAjIEVtcHR5IGl0CiAgICAgICAgIGZvciBpIGluIHJhbmdlKFFVRVVFX1NJWkUpOgogICAgICAgICAgICAgcS5nZXQoKQotICAgICAgICBzZWxmLmFzc2VydF8ocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHEuZ2V0KGJsb2NrPTApCiAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBhcHBlYXIgdG8gYmxvY2sgd2l0aCBhbiBlbXB0eSBxdWV1ZSIpCkBAIC0yNDIsNyArMjQyLDcgQEAKICAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgcS5wdXQoImxhc3QiKQotICAgICAgICBzZWxmLmFzc2VydF8ocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKICAgICAgICAgIyBUZXN0IGEgZmFpbGluZyBibG9ja2luZyBwdXQKICAgICAgICAgcS5mYWlsX25leHRfcHV0ID0gVHJ1ZQogICAgICAgICB0cnk6CkBAIC0yNjQsMTcgKzI2NCwxNyBAQAogICAgICAgICAjIENoZWNrIHRoZSBRdWV1ZSBpc24ndCBkYW1hZ2VkLgogICAgICAgICAjIHB1dCBmYWlsZWQsIGJ1dCBnZXQgc3VjY2VlZGVkIC0gcmUtYWRkCiAgICAgICAgIHEucHV0KCJsYXN0IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCiAgICAgICAgIHEuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZnVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5mdWxsKCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGZ1bGwiKQogICAgICAgICBxLnB1dCgibGFzdCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQogICAgICAgICAjIFRlc3QgYSBibG9ja2luZyBwdXQKICAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEucHV0LCAoImZ1bGwiLCksIHEuZ2V0LCAoKSkKICAgICAgICAgIyBFbXB0eSBpdAogICAgICAgICBmb3IgaSBpbiByYW5nZShRVUVVRV9TSVpFKToKICAgICAgICAgICAgIHEuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQogICAgICAgICBxLnB1dCgiZmlyc3QiKQogICAgICAgICBxLmZhaWxfbmV4dF9nZXQgPSBUcnVlCiAgICAgICAgIHRyeToKQEAgLTI4MiwxNiArMjgyLDE2IEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoIlRoZSBxdWV1ZSBkaWRuJ3QgZmFpbCB3aGVuIGl0IHNob3VsZCBoYXZlIikKICAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGVtcHR5IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGVtcHR5IikKICAgICAgICAgcS5mYWlsX25leHRfZ2V0ID0gVHJ1ZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBxLmdldCh0aW1lb3V0PTAuMSkKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIHF1ZXVlIGRpZG4ndCBmYWlsIHdoZW4gaXQgc2hvdWxkIGhhdmUiKQogICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmFzc2VydF8obm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQogICAgICAgICBxLmdldCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKICAgICAgICAgcS5mYWlsX25leHRfZ2V0ID0gVHJ1ZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmRvX2V4Y2VwdGlvbmFsX2Jsb2NraW5nX3Rlc3QocS5nZXQsICgpLCBxLnB1dCwgKCdlbXB0eScsKSwKQEAgLTMwMCw5ICszMDAsOSBAQAogICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogICAgICAgICAjIHB1dCBzdWNjZWVkZWQsIGJ1dCBnZXQgZmFpbGVkLgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQogICAgICAgICBxLmdldCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKIAogICAgIGRlZiB0ZXN0X2ZhaWxpbmdfcXVldWUoc2VsZik6CiAgICAgICAgICMgVGVzdCB0byBtYWtlIHN1cmUgYSBxdWV1ZSBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weSBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CmluZGV4IDU2YTc5M2MuLjQwNmU1ZmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CkBAIC0xMzAsMTcgKzEzMCwxNyBAQAogICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KICAgICBkZWYgdGVzdF9lbmNvZGVzdHJpbmcoc2VsZik6CiAgICAgICAgIGZvciBwLCBlIGluIHNlbGYuU1RSSU5HUzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhxdW9wcmkuZW5jb2Rlc3RyaW5nKHApID09IGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmVuY29kZXN0cmluZyhwKSA9PSBlKQogCiAgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgogICAgIGRlZiB0ZXN0X2RlY29kZXN0cmluZyhzZWxmKToKICAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSkgPT0gcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKGUpID09IHApCiAKICAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCiAgICAgZGVmIHRlc3RfaWRlbXBvdGVudF9zdHJpbmcoc2VsZik6CiAgICAgICAgIGZvciBwLCBlIGluIHNlbGYuU1RSSU5HUzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhxdW9wcmkuZGVjb2Rlc3RyaW5nKHF1b3ByaS5lbmNvZGVzdHJpbmcoZSkpID09IGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmRlY29kZXN0cmluZyhxdW9wcmkuZW5jb2Rlc3RyaW5nKGUpKSA9PSBlKQogCiAgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICAgICAgaW5mcCA9IGNTdHJpbmdJTy5TdHJpbmdJTyhwKQogICAgICAgICAgICAgb3V0ZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgcXVvcHJpLmVuY29kZShpbmZwLCBvdXRmcCwgcXVvdGV0YWJzPUZhbHNlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG91dGZwLmdldHZhbHVlKCkgPT0gZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdXRmcC5nZXR2YWx1ZSgpID09IGUpCiAKICAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCiAgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgpAQCAtMTU2LDIzICsxNTYsMjMgQEAKICAgICAgICAgICAgIGluZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oZSkKICAgICAgICAgICAgIG91dGZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgICAgIHF1b3ByaS5kZWNvZGUoaW5mcCwgb3V0ZnApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob3V0ZnAuZ2V0dmFsdWUoKSA9PSBwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dGZwLmdldHZhbHVlKCkgPT0gcCkKIAogICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KICAgICBkZWYgdGVzdF9lbWJlZGRlZF93cyhzZWxmKToKICAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5FU1RSSU5HUzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhxdW9wcmkuZW5jb2Rlc3RyaW5nKHAsIHF1b3RldGFicz1UcnVlKSA9PSBlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSkgPT0gcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZW5jb2Rlc3RyaW5nKHAsIHF1b3RldGFicz1UcnVlKSA9PSBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSkgPT0gcCkKIAogICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KICAgICBkZWYgdGVzdF9lbmNvZGVfaGVhZGVyKHNlbGYpOgogICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLkhTVFJJTkdTOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5lbmNvZGVzdHJpbmcocCwgaGVhZGVyPVRydWUpID09IGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmVuY29kZXN0cmluZyhwLCBoZWFkZXI9VHJ1ZSkgPT0gZSkKIAogICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KICAgICBkZWYgdGVzdF9kZWNvZGVfaGVhZGVyKHNlbGYpOgogICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLkhTVFJJTkdTOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSwgaGVhZGVyPVRydWUpID09IHApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmRlY29kZXN0cmluZyhlLCBoZWFkZXI9VHJ1ZSkgPT0gcCkKIAogICAgIGRlZiB0ZXN0X3NjcmlwdGVuY29kZShzZWxmKToKICAgICAgICAgKHAsIGUpID0gc2VsZi5TVFJJTkdTWy0xXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQppbmRleCA4ZTQ2MzllLi4zMGJkMzMwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIGspCiAgICAgICAgICAgICB1bmlxID0gc2V0KHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1bmlxKSwgaykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh1bmlxIDw9IHNldChwb3B1bGF0aW9uKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmlxIDw9IHNldChwb3B1bGF0aW9uKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdlbi5zYW1wbGUoW10sIDApLCBbXSkgICMgdGVzdCBlZGdlIGNhc2UgTj09az09MAogCiAgICAgZGVmIHRlc3Rfc2FtcGxlX2Rpc3RyaWJ1dGlvbihzZWxmKToKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICAgICAgc2FtcCA9IHNlbGYuZ2VuLnNhbXBsZShkLCBrKQogICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCB3ZSBnb3QgaW50cyBiYWNrIChrZXlzKTsgdGhlIHZhbHVlcyBhcmUgY29tcGxleC4KICAgICAgICAgICAgIGZvciB4IGluIHNhbXA6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoeCkgaXMgaW50KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHgpIGlzIGludCkKICAgICAgICAgc2FtcC5zb3J0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wLCByYW5nZShOKSkKIApAQCAtMjM3LDcgKzIzNyw3IEBACiAgICAgICAgIGN1bSA9IDAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CiAgICAgICAgICAgICByID0gc2VsZi5nZW4ucmFuZHJhbmdlKHNwYW4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSByIDwgc3BhbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHIgPCBzcGFuKQogICAgICAgICAgICAgY3VtIHw9IHIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdW0sIHNwYW4tMSkKIApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgICAgICAgICBzdG9wID0gc2VsZi5nZW4ucmFuZHJhbmdlKDIgKiogKGktMikpCiAgICAgICAgICAgICBpZiBzdG9wIDw9IHN0YXJ0OgogICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHN0YXJ0IDw9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCkgPCBzdG9wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0YXJ0IDw9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCkgPCBzdG9wKQogCiAgICAgZGVmIHRlc3RfcmFuZ2VsaW1pdHMoc2VsZik6CiAgICAgICAgIGZvciBzdGFydCwgc3RvcCBpbiBbKC0yLDApLCAoLSgyKio2MCktMiwtKDIqKjYwKSksICgyKio2MCwyKio2MCsyKV06CkBAIC0yNTcsNyArMjU3LDcgQEAKICAgICBkZWYgdGVzdF9nZW5yYW5kYml0cyhzZWxmKToKICAgICAgICAgIyBWZXJpZnkgcmFuZ2VzCiAgICAgICAgIGZvciBrIGluIHhyYW5nZSgxLCAxMDAwKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IHNlbGYuZ2VuLmdldHJhbmRiaXRzKGspIDwgMioqaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHNlbGYuZ2VuLmdldHJhbmRiaXRzKGspIDwgMioqaykKIAogICAgICAgICAjIFZlcmlmeSBhbGwgYml0cyBhY3RpdmUKICAgICAgICAgZ2V0Yml0cyA9IHNlbGYuZ2VuLmdldHJhbmRiaXRzCkBAIC0yODMsMTcgKzI4MywxNyBAQAogICAgICAgICAgICAgbnVtYml0cyA9IGkrMQogICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhuID09IDIqKihrLTEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4gPT0gMioqKGstMSkpCiAKICAgICAgICAgICAgIG4gKz0gbiAtIDEgICAgICAjIGNoZWNrIDEgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCiAgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGsgaW4gW251bWJpdHMsIG51bWJpdHMrMV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqayA+IG4gPiAyKiooay0yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIFtudW1iaXRzLCBudW1iaXRzKzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMikpCiAKICAgICAgICAgICAgIG4gLT0gbiA+PiAxNSAgICAgIyBjaGVjayBhIGxpdHRsZSBmYXJ0aGVyIGJlbG93IHRoZSBuZXh0IHBvd2VyIG9mIHR3bwogICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykgICAgICAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqayA+IG4gPiAyKiooay0xKSkgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMSkpICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KIAogCiBjbGFzcyBNZXJzZW5uZVR3aXN0ZXJfVGVzdEJhc2ljT3BzKFRlc3RCYXNpY09wcyk6CkBAIC0zODksNyArMzg5LDcgQEAKICAgICAgICAgY3VtID0gMAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKICAgICAgICAgICAgIHIgPSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3BhbikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IHIgPCBzcGFuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gciA8IHNwYW4pCiAgICAgICAgICAgICBjdW0gfD0gcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1bSwgc3Bhbi0xKQogCkBAIC0zOTksNyArMzk5LDcgQEAKICAgICAgICAgICAgIHN0b3AgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiAoaS0yKSkKICAgICAgICAgICAgIGlmIHN0b3AgPD0gc3RhcnQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oc3RhcnQgPD0gc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LCBzdG9wKSA8IHN0b3ApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RhcnQgPD0gc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LCBzdG9wKSA8IHN0b3ApCiAKICAgICBkZWYgdGVzdF9yYW5nZWxpbWl0cyhzZWxmKToKICAgICAgICAgZm9yIHN0YXJ0LCBzdG9wIGluIFsoLTIsMCksICgtKDIqKjYwKS0yLC0oMioqNjApKSwgKDIqKjYwLDIqKjYwKzIpXToKQEAgLTQxMyw3ICs0MTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIDk3OTA0ODQ1Nzc3MzQzNTEwNDA0NzE4OTU2MTE1TCkKICAgICAgICAgIyBWZXJpZnkgcmFuZ2VzCiAgICAgICAgIGZvciBrIGluIHhyYW5nZSgxLCAxMDAwKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IHNlbGYuZ2VuLmdldHJhbmRiaXRzKGspIDwgMioqaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHNlbGYuZ2VuLmdldHJhbmRiaXRzKGspIDwgMioqaykKIAogICAgICAgICAjIFZlcmlmeSBhbGwgYml0cyBhY3RpdmUKICAgICAgICAgZ2V0Yml0cyA9IHNlbGYuZ2VuLmdldHJhbmRiaXRzCkBAIC00MzksMjQgKzQzOSwyNCBAQAogICAgICAgICAgICAgbnVtYml0cyA9IGkrMQogICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhuID09IDIqKihrLTEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4gPT0gMioqKGstMSkpCiAKICAgICAgICAgICAgIG4gKz0gbiAtIDEgICAgICAjIGNoZWNrIDEgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCiAgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGsgaW4gW251bWJpdHMsIG51bWJpdHMrMV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqayA+IG4gPiAyKiooay0yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIFtudW1iaXRzLCBudW1iaXRzKzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMikpCiAKICAgICAgICAgICAgIG4gLT0gbiA+PiAxNSAgICAgIyBjaGVjayBhIGxpdHRsZSBmYXJ0aGVyIGJlbG93IHRoZSBuZXh0IHBvd2VyIG9mIHR3bwogICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykgICAgICAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqayA+IG4gPiAyKiooay0xKSkgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMSkpICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KIAogICAgIGRlZiB0ZXN0X3JhbmRyYW5nZV9idWdfMTU5MDg5MShzZWxmKToKICAgICAgICAgc3RhcnQgPSAxMDAwMDAwMDAwMDAwCiAgICAgICAgIHN0b3AgPSAtMTAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAgICAgIHN0ZXAgPSAtMjAwCiAgICAgICAgIHggPSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdG9wIDwgeCA8PSBzdGFydCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0b3AgPCB4IDw9IHN0YXJ0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4K3N0b3ApJXN0ZXAsIDApCiAKIGRlZiBnYW1tYSh6LCBzcXJ0MnBpPSgyLjAqcGkpKiowLjUpOgpAQCAtNTM0LDcgKzUzNCw3IEBACiAKICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CiAgICAgICAgICMgdGVzdHMgdmFsaWRpdHkgYnV0IG5vdCBjb21wbGV0ZW5lc3Mgb2YgdGhlIF9fYWxsX18gbGlzdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2V0KHJhbmRvbS5fX2FsbF9fKSA8PSBzZXQoZGlyKHJhbmRvbSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHJhbmRvbS5fX2FsbF9fKSA8PSBzZXQoZGlyKHJhbmRvbSkpKQogCiAgICAgZGVmIHRlc3RfcmFuZG9tX3N1YmNsYXNzX3dpdGhfa3dhcmdzKHNlbGYpOgogICAgICAgICAjIFNGIGJ1ZyAjMTQ4NjY2MyAtLSB0aGlzIHVzZWQgdG8gZXJyb25lb3VzbHkgcmFpc2UgYSBUeXBlRXJyb3IKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmUucHkgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CmluZGV4IGZlYjcxNjAuLjRmNTQzZDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZS5weQpAQCAtNjA5LDcgKzYwOSw3IEBACiAgICAgICAgICAgICB1bmljb2RlCiAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgICAgICByZXR1cm4gIyBubyBwcm9ibGVtIGlmIHdlIGhhdmUgbm8gdW5pY29kZQotICAgICAgICBzZWxmLmFzc2VydF8ocmUuY29tcGlsZSgnYnVnXzkyNjA3NScpIGlzIG5vdAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuY29tcGlsZSgnYnVnXzkyNjA3NScpIGlzIG5vdAogICAgICAgICAgICAgICAgICAgICAgcmUuY29tcGlsZShldmFsKCJ1J2J1Z185MjYwNzUnIikpKQogCiAgICAgZGVmIHRlc3RfYnVnXzkzMTg0OChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVwci5weSBiL0xpYi90ZXN0L3Rlc3RfcmVwci5weQppbmRleCAxMDk0ODE2Li40OTRhN2MzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlcHIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZXByLnB5CkBAIC0xMjMsMjAgKzEyMywyMCBAQAogICAgICAgICBlcShyKGkzKSwgKCI8Q2xhc3NXaXRoRmFpbGluZ1JlcHIgaW5zdGFuY2UgYXQgJXg+IiVpZChpMykpKQogCiAgICAgICAgIHMgPSByKENsYXNzV2l0aEZhaWxpbmdSZXByKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5zdGFydHN3aXRoKCI8Y2xhc3MgIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmVuZHN3aXRoKCI+IikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmZpbmQoIi4uLiIpID09IDgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoIjxjbGFzcyAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoIj4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZmluZCgiLi4uIikgPT0gOCkKIAogICAgIGRlZiB0ZXN0X2ZpbGUoc2VsZik6CiAgICAgICAgIGZwID0gb3Blbih1bml0dGVzdC5fX2ZpbGVfXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoZnApLnN0YXJ0c3dpdGgoCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGZwKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgIjxvcGVuIGZpbGUgJyVzJywgbW9kZSAncicgYXQgMHgiICUgdW5pdHRlc3QuX19maWxlX18pKQogICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKGZwKS5zdGFydHN3aXRoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihmcCkuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICI8Y2xvc2VkIGZpbGUgJyVzJywgbW9kZSAncicgYXQgMHgiICUgdW5pdHRlc3QuX19maWxlX18pKQogCiAgICAgZGVmIHRlc3RfbGFtYmRhKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcihsYW1iZGEgeDogeCkuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIobGFtYmRhIHg6IHgpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAiPGZ1bmN0aW9uIDxsYW1iZGEiKSkKICAgICAgICAgIyBYWFggYW5vbnltb3VzIGZ1bmN0aW9ucz8gIHNlZSBmdW5jX3JlcHIKIApAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgICMgRnVuY3Rpb25zCiAgICAgICAgIGVxKHJlcHIoaGFzaCksICc8YnVpbHQtaW4gZnVuY3Rpb24gaGFzaD4nKQogICAgICAgICAjIE1ldGhvZHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoJycuc3BsaXQpLnN0YXJ0c3dpdGgoCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKCcnLnNwbGl0KS5zdGFydHN3aXRoKAogICAgICAgICAgICAgJzxidWlsdC1pbiBtZXRob2Qgc3BsaXQgb2Ygc3RyIG9iamVjdCBhdCAweCcpKQogCiAgICAgZGVmIHRlc3RfeHJhbmdlKHNlbGYpOgpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgICMgWFhYIGRvZXNuJ3QgdGVzdCBidWZmZXJzIHdpdGggbm8gYl9iYXNlIG9yIHJlYWQtd3JpdGUgYnVmZmVycyAoc2VlCiAgICAgICAgICMgYnVmZmVyb2JqZWN0LmMpLiAgVGhlIHRlc3QgaXMgZmFpcmx5IGluY29tcGxldGUgdG9vLiAgU2lnaC4KICAgICAgICAgeCA9IGJ1ZmZlcignZm9vJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoeCkuc3RhcnRzd2l0aCgnPHJlYWQtb25seSBidWZmZXIgZm9yIDB4JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHgpLnN0YXJ0c3dpdGgoJzxyZWFkLW9ubHkgYnVmZmVyIGZvciAweCcpKQogCiAgICAgZGVmIHRlc3RfY2VsbChzZWxmKToKICAgICAgICAgIyBYWFggSG1tPyBIb3cgdG8gZ2V0IGF0IGEgY2VsbCBvYmplY3Q/CkBAIC0xOTIsOSArMTkyLDkgQEAKICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgIGRlZiBmb28oY2xzKTogcGFzcwogICAgICAgICB4ID0gc3RhdGljbWV0aG9kKEMuZm9vKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcih4KS5zdGFydHN3aXRoKCc8c3RhdGljbWV0aG9kIG9iamVjdCBhdCAweCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih4KS5zdGFydHN3aXRoKCc8c3RhdGljbWV0aG9kIG9iamVjdCBhdCAweCcpKQogICAgICAgICB4ID0gY2xhc3NtZXRob2QoQy5mb28pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKHgpLnN0YXJ0c3dpdGgoJzxjbGFzc21ldGhvZCBvYmplY3QgYXQgMHgnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoeCkuc3RhcnRzd2l0aCgnPGNsYXNzbWV0aG9kIG9iamVjdCBhdCAweCcpKQogCiAgICAgZGVmIHRlc3RfdW5zb3J0YWJsZShzZWxmKToKICAgICAgICAgIyBSZXByLnJlcHIoKSB1c2VkIHRvIGNhbGwgc29ydGVkKCkgb24gc2V0cywgZnJvemVuc2V0cyBhbmQgZGljdHMKQEAgLTI3Miw3ICsyNzIsNyBAQAogJycnKQogICAgICAgICBmcm9tIGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5hcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24gaW1wb3J0IGJhcgogICAgICAgICAjIE1vZHVsZSBuYW1lIG1heSBiZSBwcmVmaXhlZCB3aXRoICJ0ZXN0LiIsIGRlcGVuZGluZyBvbiBob3cgcnVuLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcihiYXIuYmFyKS5zdGFydHN3aXRoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihiYXIuYmFyKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgIjxjbGFzcyAlcy5iYXIgYXQgMHgiICUgYmFyLl9fbmFtZV9fKSkKIAogICAgIGRlZiB0ZXN0X2luc3RhbmNlKHNlbGYpOgpAQCAtMjgyLDcgKzI4Miw3IEBACiAnJycpCiAgICAgICAgIGZyb20gYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uLmFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbiBpbXBvcnQgYmF6CiAgICAgICAgIGliYXogPSBiYXouYmF6KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoaWJheikuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoaWJheikuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICI8JXMuYmF6IGluc3RhbmNlIGF0IDB4IiAlIGJhei5fX25hbWVfXykpCiAKICAgICBkZWYgdGVzdF9tZXRob2Qoc2VsZik6CkBAIC0yOTcsNyArMjk3LDcgQEAKICAgICAgICAgJzx1bmJvdW5kIG1ldGhvZCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS5hbWV0aG9kPicpCiAgICAgICAgICMgQm91bmQgbWV0aG9kIG5leHQKICAgICAgICAgaXF1eCA9IHF1eC5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKGlxdXguYW1ldGhvZCkuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoaXF1eC5hbWV0aG9kKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgJzxib3VuZCBtZXRob2QgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuYW1ldGhvZCBvZiA8JXMuYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgaW5zdGFuY2UgYXQgMHgnIFwKICAgICAgICAgICAgICUgKHF1eC5fX25hbWVfXywpICkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmZjODIyLnB5IGIvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkKaW5kZXggYWZiYzk4NC4uOGMyYjJjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkKQEAgLTE2LDIzICsxNiwyMyBAQAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKICAgICAgICAgbXNnID0gc2VsZi5jcmVhdGVfbWVzc2FnZSgKICAgICAgICAgICAgICdUbzogImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+XG5cbnRlc3RcbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0KCJ0byIpID09ICcibGFzdCwgZmlyc3QiIDx1c2VyaWRAZm9vLm5ldD4nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldCgiVE8iKSA9PSAnImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXQoIk5vLVN1Y2gtSGVhZGVyIikgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXQoIk5vLVN1Y2gtSGVhZGVyIiwgIk5vLVN1Y2gtVmFsdWUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldCgidG8iKSA9PSAnImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXQoIlRPIikgPT0gJyJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0KCJOby1TdWNoLUhlYWRlciIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0KCJOby1TdWNoLUhlYWRlciIsICJOby1TdWNoLVZhbHVlIikKICAgICAgICAgICAgICAgICAgICAgID09ICJOby1TdWNoLVZhbHVlIikKIAogICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CiAgICAgICAgIG1zZyA9IHNlbGYuY3JlYXRlX21lc3NhZ2UoCiAgICAgICAgICAgICAnVG86ICJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PlxuXG50ZXN0XG4nKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1zZy5oYXNfa2V5KCJOZXctSGVhZGVyIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuc2V0ZGVmYXVsdCgiTmV3LUhlYWRlciIsICJOZXctVmFsdWUiKSA9PSAiTmV3LVZhbHVlIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5zZXRkZWZhdWx0KCJOZXctSGVhZGVyIiwgIkRpZmZlcmVudC1WYWx1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbXNnLmhhc19rZXkoIk5ldy1IZWFkZXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5zZXRkZWZhdWx0KCJOZXctSGVhZGVyIiwgIk5ldy1WYWx1ZSIpID09ICJOZXctVmFsdWUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLnNldGRlZmF1bHQoIk5ldy1IZWFkZXIiLCAiRGlmZmVyZW50LVZhbHVlIikKICAgICAgICAgICAgICAgICAgICAgID09ICJOZXctVmFsdWUiKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnWyJuZXctaGVhZGVyIl0gPT0gIk5ldy1WYWx1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dbIm5ldy1oZWFkZXIiXSA9PSAiTmV3LVZhbHVlIikKIAotICAgICAgICBzZWxmLmFzc2VydF8obXNnLnNldGRlZmF1bHQoIkFub3RoZXItSGVhZGVyIikgPT0gIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbImFub3RoZXItaGVhZGVyIl0gPT0gIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuc2V0ZGVmYXVsdCgiQW5vdGhlci1IZWFkZXIiKSA9PSAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ1siYW5vdGhlci1oZWFkZXIiXSA9PSAiIikKIAogICAgIGRlZiBjaGVjayhzZWxmLCBtc2csIHJlc3VsdHMpOgogICAgICAgICAiIiJDaGVjayBhZGRyZXNzZXMgYW5kIHRoZSBkYXRlLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5IGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CmluZGV4IGFkNjgzODYuLmVkMGI0OTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVhbHJlcyksIGxlbihleHByZXMpKQogICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihyZWFscmVzKSk6CiAgICAgICAgICAgICAgICAgIyByZXN1bHRzIGFyZSBib29sLCBzbyB3ZSBjYW4gdXNlICJpcyIgaGVyZQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZWFscmVzW2ldIGlzIGV4cHJlc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhbHJlc1tpXSBpcyBleHByZXNbaV0pCiAKICAgICBkZWYgdGVzdF9taXhlZChzZWxmKToKICAgICAgICAgIyBjaGVjayB0aGF0IGNvbXBhcmlzb25zIGludm9sdmluZyBWZWN0b3Igb2JqZWN0cwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgICAgICAgICAgZm9yIG9wIGluIG9wbWFwW29wbmFtZV06CiAgICAgICAgICAgICAgICAgICAgIHJlYWxyZXMgPSBvcCh0YSwgdGIpCiAgICAgICAgICAgICAgICAgICAgIHJlYWxyZXMgPSBnZXRhdHRyKHJlYWxyZXMsICJ4IiwgcmVhbHJlcykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlYWxyZXMgaXMgZXhwcmVzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhbHJlcyBpcyBleHByZXMpCiAKICAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CiAgICAgICAgICMgY2hlY2sgYWxsIG9wZXJhdG9ycyBhbmQgYWxsIGNvbXBhcmlzb24gcmVzdWx0cwpAQCAtMjM5LDggKzIzOSw4IEBACiAgICAgICAgIGIuYXBwZW5kKDE3KQogICAgICAgICAjIEV2ZW4gcmVjdXJzaXZlIGxpc3RzIG9mIGRpZmZlcmVudCBsZW5ndGhzIGFyZSBkaWZmZXJlbnQsCiAgICAgICAgICMgYnV0IHRoZXkgY2Fubm90IGJlIG9yZGVyZWQKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoYSA9PSBiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgIT0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoYSA9PSBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5sdCwgYSwgYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5sZSwgYSwgYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5ndCwgYSwgYikKQEAgLTI1MCw5ICsyNTAsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLm5lLCBhLCBiKQogICAgICAgICBhLmluc2VydCgwLCAxMSkKICAgICAgICAgYi5pbnNlcnQoMCwgMTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKGEgPT0gYikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhICE9IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIDwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoYSA9PSBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPCBiKQogCiBjbGFzcyBEaWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTI3MSwxMCArMjcxLDEwIEBACiAgICAgICAgICAgICBpbWFnMWJba10gPSB2CiAgICAgICAgIGltYWcyID0gaW1hZzFiLmNvcHkoKQogICAgICAgICBpbWFnMltrXSA9IHYgKyAxLjAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGltYWcxYSA9PSBpbWFnMWEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpbWFnMWEgPT0gaW1hZzFiKQotICAgICAgICBzZWxmLmFzc2VydF8oaW1hZzIgPT0gaW1hZzIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpbWFnMWEgIT0gaW1hZzIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbWFnMWEgPT0gaW1hZzFhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW1hZzFhID09IGltYWcxYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGltYWcyID09IGltYWcyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW1hZzFhICE9IGltYWcyKQogICAgICAgICBmb3Igb3BuYW1lIGluICgibHQiLCAibGUiLCAiZ3QiLCAiZ2UiKToKICAgICAgICAgICAgIGZvciBvcCBpbiBvcG1hcFtvcG5hbWVdOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3AsIGltYWcxYSwgaW1hZzIpCkBAIC0yODIsNyArMjgyLDcgQEAKIGNsYXNzIExpc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogICAgIGRlZiB0ZXN0X2NvdmVyYWdlKHNlbGYpOgogICAgICAgICAjIGV4ZXJjaXNlIGFsbCBjb21wYXJpc29ucyBmb3IgbGlzdHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CmluZGV4IDQzMWI4ZmYuLjI2ZmIyOTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpAQCAtMjAsOSArMjAsOSBAQAogICAgICAgICAgICAgdXJsID0gc2VsZi51cmwKICAgICAgICAgICAgIGFnZW50ID0gc2VsZi5hZ2VudAogICAgICAgICBpZiBzZWxmLmdvb2Q6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLnN0cgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ydW5weS5weSBiL0xpYi90ZXN0L3Rlc3RfcnVucHkucHkKaW5kZXggMTY1Y2I2My4uZmE1ZDliNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ydW5weS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3J1bnB5LnB5CkBAIC0zNywxNCArMzcsMTQgQEAKICAgICBkZWYgdGVzdF9ydW5fY29kZShzZWxmKToKICAgICAgICAgc2F2ZWRfYXJndjAgPSBzeXMuYXJndlswXQogICAgICAgICBkID0gX3J1bl9jb2RlKHNlbGYudGVzdF9zb3VyY2UsIHt9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZFsicmVzdWx0Il0gPT0gc2VsZi5leHBlY3RlZF9yZXN1bHQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkWyJfX25hbWVfXyJdIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkWyJfX2ZpbGVfXyJdIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkWyJfX2xvYWRlcl9fIl0gaXMgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRbIl9fcGFja2FnZV9fIl0gaXMgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRbInJ1bl9hcmd2MCJdIGlzIHNhdmVkX2FyZ3YwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoInJ1bl9uYW1lIiBub3QgaW4gZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN5cy5hcmd2WzBdIGlzIHNhdmVkX2FyZ3YwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZFsicmVzdWx0Il0gPT0gc2VsZi5leHBlY3RlZF9yZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkWyJfX25hbWVfXyJdIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkWyJfX2ZpbGVfXyJdIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkWyJfX2xvYWRlcl9fIl0gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbIl9fcGFja2FnZV9fIl0gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbInJ1bl9hcmd2MCJdIGlzIHNhdmVkX2FyZ3YwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInJ1bl9uYW1lIiBub3QgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5hcmd2WzBdIGlzIHNhdmVkX2FyZ3YwKQogCiAgICAgZGVmIHRlc3RfcnVuX21vZHVsZV9jb2RlKHNlbGYpOgogICAgICAgICBpbml0aWFsID0gb2JqZWN0KCkKQEAgLTYwLDE5ICs2MCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygicmVzdWx0IiBub3QgaW4gZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsiaW5pdGlhbCJdIGlzIGluaXRpYWwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsicmVzdWx0Il0gPT0gc2VsZi5leHBlY3RlZF9yZXN1bHQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsibmVzdGVkIl1bIngiXSA9PSAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbIl9fbmFtZV9fIl0gaXMgbmFtZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJydW5fbmFtZV9pbl9zeXNfbW9kdWxlcyJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbIm1vZHVsZV9pbl9zeXNfbW9kdWxlcyJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbIl9fZmlsZV9fIl0gaXMgZmlsZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJydW5fYXJndjAiXSBpcyBmaWxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbIl9fbG9hZGVyX18iXSBpcyBsb2FkZXIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsiX19wYWNrYWdlX18iXSBpcyBwYWNrYWdlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3lzLmFyZ3ZbMF0gaXMgc2F2ZWRfYXJndjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhuYW1lIG5vdCBpbiBzeXMubW9kdWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJyZXN1bHQiIG5vdCBpbiBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJpbml0aWFsIl0gaXMgaW5pdGlhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJyZXN1bHQiXSA9PSBzZWxmLmV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJuZXN0ZWQiXVsieCJdID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsiX19uYW1lX18iXSBpcyBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbInJ1bl9uYW1lX2luX3N5c19tb2R1bGVzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsibW9kdWxlX2luX3N5c19tb2R1bGVzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsiX19maWxlX18iXSBpcyBmaWxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbInJ1bl9hcmd2MCJdIGlzIGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsiX19sb2FkZXJfXyJdIGlzIGxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX3BhY2thZ2VfXyJdIGlzIHBhY2thZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMuYXJndlswXSBpcyBzYXZlZF9hcmd2MCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgbm90IGluIHN5cy5tb2R1bGVzKQogCiAKIGNsYXNzIFJ1bk1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTU5LDE1ICsxNTksMTUgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBzb3VyY2U6IiwgbW9kX25hbWUKICAgICAgICAgICAgIGQxID0gcnVuX21vZHVsZShtb2RfbmFtZSkgIyBSZWFkIGZyb20gc291cmNlCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoIngiIGluIGQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQxWyJ4Il0gPT0gMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgieCIgaW4gZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDFbIngiXSA9PSAxKQogICAgICAgICAgICAgZGVsIGQxICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgogICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RfbmFtZSkKICAgICAgICAgICAgIG9zLnJlbW92ZShtb2RfZm5hbWUpCiAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIGNvbXBpbGVkOiIsIG1vZF9uYW1lCiAgICAgICAgICAgICBkMiA9IHJ1bl9tb2R1bGUobW9kX25hbWUpICMgUmVhZCBmcm9tIGJ5dGVjb2RlCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoIngiIGluIGQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJ4Il0gPT0gMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgieCIgaW4gZDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIngiXSA9PSAxKQogICAgICAgICAgICAgZGVsIGQyICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5fZGVsX3BrZyhwa2dfZGlyLCBkZXB0aCwgbW9kX25hbWUpCkBAIC0yMTEsMTkgKzIxMSwxOSBAQAogICAgICAgICAgICAgcGtnX25hbWUgPSBtb2RfbmFtZS5ycGFydGl0aW9uKCcuJylbMF0KICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gc291cmNlOiIsIG1vZF9uYW1lCiAgICAgICAgICAgICBkMSA9IHJ1bl9tb2R1bGUobW9kX25hbWUsIHJ1bl9uYW1lPXJ1bl9uYW1lKSAjIFJlYWQgZnJvbSBzb3VyY2UKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygiX19wYWNrYWdlX18iIGluIGQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQxWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJzaWJsaW5nIiBpbiBkMSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygibmVwaGV3IiBpbiBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19wYWNrYWdlX18iIGluIGQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJzaWJsaW5nIiBpbiBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibmVwaGV3IiBpbiBkMSkKICAgICAgICAgICAgIGRlbCBkMSAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KICAgICAgICAgICAgIF9faW1wb3J0X18obW9kX25hbWUpCiAgICAgICAgICAgICBvcy5yZW1vdmUobW9kX2ZuYW1lKQogICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBjb21waWxlZDoiLCBtb2RfbmFtZQogICAgICAgICAgICAgZDIgPSBydW5fbW9kdWxlKG1vZF9uYW1lLCBydW5fbmFtZT1ydW5fbmFtZSkgIyBSZWFkIGZyb20gYnl0ZWNvZGUKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygiX19wYWNrYWdlX18iIGluIGQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJzaWJsaW5nIiBpbiBkMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygibmVwaGV3IiBpbiBkMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19wYWNrYWdlX18iIGluIGQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJzaWJsaW5nIiBpbiBkMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibmVwaGV3IiBpbiBkMikKICAgICAgICAgICAgIGRlbCBkMiAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHNlbGYuX2RlbF9wa2cocGtnX2RpciwgZGVwdGgsIG1vZF9uYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zY29wZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKaW5kZXggMzYxNzdlYS4uYjY4ZThmNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zY29wZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CkBAIC00NjcsNyArNDY3LDcgQEAKICAgICBsb2NhbHMoKVsnbG9va2VkX3VwX2J5X2xvYWRfbmFtZSddID0gVHJ1ZQogICAgIHBhc3NlZCA9IGxvb2tlZF91cF9ieV9sb2FkX25hbWUKIAotc2VsZi5hc3NlcnRfKFgucGFzc2VkKQorc2VsZi5hc3NlcnRUcnVlKFgucGFzc2VkKQogIiIiCiAKICAgICBkZWYgdGVzdExvY2Fsc0Z1bmN0aW9uKHNlbGYpOgpAQCAtNDgyLDcgKzQ4Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gZwogCiAgICAgICAgIGQgPSBmKDIpKDQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmhhc19rZXkoJ2gnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgnaCcpKQogICAgICAgICBkZWwgZFsnaCddCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeyd4JzogMiwgJ3knOiA3LCAndyc6IDZ9KQogCkBAIC01MTYsOCArNTE2LDggQEAKICAgICAgICAgICAgIHJldHVybiBDCiAKICAgICAgICAgdmFybmFtZXMgPSBmKDEpLnoKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJ4IiBub3QgaW4gdmFybmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygieSIgaW4gdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgieCIgbm90IGluIHZhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInkiIGluIHZhcm5hbWVzKQogCiAgICAgZGVmIHRlc3RMb2NhbHNDbGFzc19XaXRoVHJhY2Uoc2VsZik6CiAgICAgICAgICMgSXNzdWUyMzcyODogYWZ0ZXIgdGhlIHRyYWNlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBsb2NhbHMoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCA4ODZjNGI4Li44NzJlOWVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtNjQsNyArNjQsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIHNlbGYucywgYyBpbiBzZWxmLmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLl9fY29udGFpbnNfXywgW1tdXSkKICAgICAgICAgcyA9IHNlbGYudGhldHlwZShbZnJvemVuc2V0KHNlbGYubGV0dGVycyldKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi50aGV0eXBlKHNlbGYubGV0dGVycykgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhldHlwZShzZWxmLmxldHRlcnMpIGluIHMpCiAKICAgICBkZWYgdGVzdF91bmlvbihzZWxmKToKICAgICAgICAgdSA9IHNlbGYucy51bmlvbihzZWxmLm90aGVyd29yZCkKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBzMS5pc2Rpc2pvaW50KHMyKQogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGYoczEsIHMyKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhhY3R1YWwgaXMgVHJ1ZSBvciBhY3R1YWwgaXMgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY3R1YWwgaXMgVHJ1ZSBvciBhY3R1YWwgaXMgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9hbmQoc2VsZik6CiAgICAgICAgIGkgPSBzZWxmLnMuaW50ZXJzZWN0aW9uKHNlbGYub3RoZXJ3b3JkKQpAQCAtMjA3LDE5ICsyMDcsMTkgQEAKIAogICAgIGRlZiB0ZXN0X3N1Yl9hbmRfc3VwZXIoc2VsZik6CiAgICAgICAgIHAsIHEsIHIgPSBtYXAoc2VsZi50aGV0eXBlLCBbJ2FiJywgJ2FiY2RlJywgJ2RlZiddKQotICAgICAgICBzZWxmLmFzc2VydF8ocCA8IHEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwIDw9IHEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxIDw9IHEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxID4gcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEgPj0gcCkKLSAgICAgICAgc2VsZi5mYWlsSWYocSA8IHIpCi0gICAgICAgIHNlbGYuZmFpbElmKHEgPD0gcikKLSAgICAgICAgc2VsZi5mYWlsSWYocSA+IHIpCi0gICAgICAgIHNlbGYuZmFpbElmKHEgPj0gcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldCgnYScpLmlzc3Vic2V0KCdhYmMnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldCgnYWJjJykuaXNzdXBlcnNldCgnYScpKQotICAgICAgICBzZWxmLmZhaWxJZihzZXQoJ2EnKS5pc3N1YnNldCgnY2JzJykpCi0gICAgICAgIHNlbGYuZmFpbElmKHNldCgnY2JzJykuaXNzdXBlcnNldCgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocCA8IHEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwIDw9IHEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxIDw9IHEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxID4gcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPj0gcCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxIDwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxIDw9IHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocSA+IHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocSA+PSByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KCdhJykuaXNzdWJzZXQoJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KCdhYmMnKS5pc3N1cGVyc2V0KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2V0KCdhJykuaXNzdWJzZXQoJ2NicycpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNldCgnY2JzJykuaXNzdXBlcnNldCgnYScpKQogCiAgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CiAgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICAgICAgcz1IKCkKICAgICAgICAgZj1zZXQoKQogICAgICAgICBmLmFkZChzKQotICAgICAgICBzZWxmLmFzc2VydF8ocyBpbiBmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocyBpbiBmKQogICAgICAgICBmLnJlbW92ZShzKQogICAgICAgICBmLmFkZChzKQogICAgICAgICBmLmRpc2NhcmQocykKQEAgLTMzMyw3ICszMzMsNyBAQAogICAgICAgICBvYmoueCA9IGl0ZXIoY29udGFpbmVyKQogICAgICAgICBkZWwgb2JqLCBjb250YWluZXIKICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmKCkgaXMgTm9uZSwgIkN5Y2xlIHdhcyBub3QgY29sbGVjdGVkIikKIAogY2xhc3MgVGVzdFNldChUZXN0Sm9pbnRPcHMpOgogICAgIHRoZXR5cGUgPSBzZXQKQEAgLTM2Nyw3ICszNjcsNyBAQAogCiAgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgogICAgICAgICBzZWxmLnMuYWRkKCdRJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdRJyBpbiBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnUScgaW4gc2VsZi5zKQogICAgICAgICBkdXAgPSBzZWxmLnMuY29weSgpCiAgICAgICAgIHNlbGYucy5hZGQoJ1EnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgZHVwKQpAQCAtMzc1LDEzICszNzUsMTMgQEAKIAogICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKICAgICAgICAgc2VsZi5zLnJlbW92ZSgnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gc2VsZi5zKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgc2VsZi5zLnJlbW92ZSwgJ1EnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5yZW1vdmUsIFtdKQogICAgICAgICBzID0gc2VsZi50aGV0eXBlKFtmcm96ZW5zZXQoc2VsZi53b3JkKV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGV0eXBlKHNlbGYud29yZCkgaW4gcykKICAgICAgICAgcy5yZW1vdmUoc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSBub3QgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhldHlwZShzZWxmLndvcmQpIG5vdCBpbiBzKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgc2VsZi5zLnJlbW92ZSwgc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCiAKICAgICBkZWYgdGVzdF9yZW1vdmVfa2V5ZXJyb3JfdW5wYWNraW5nKHNlbGYpOgpAQCAtNDAwLDcgKzQwMCw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYucy5yZW1vdmUoa2V5KQogICAgICAgICBleGNlcHQgS2V5RXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlLmFyZ3NbMF0gaXMga2V5LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGUuYXJnc1swXSBpcyBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIktleUVycm9yIHNob3VsZCBiZSB7MH0sIG5vdCB7MX0iLmZvcm1hdChrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFyZ3NbMF0pKQogICAgICAgICBlbHNlOgpAQCAtNDA4LDI2ICs0MDgsMjYgQEAKIAogICAgIGRlZiB0ZXN0X2Rpc2NhcmQoc2VsZik6CiAgICAgICAgIHNlbGYucy5kaXNjYXJkKCdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBzZWxmLnMpCiAgICAgICAgIHNlbGYucy5kaXNjYXJkKCdRJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuZGlzY2FyZCwgW10pCiAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW2Zyb3plbnNldChzZWxmLndvcmQpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhldHlwZShzZWxmLndvcmQpIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSBpbiBzKQogICAgICAgICBzLmRpc2NhcmQoc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSBub3QgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhldHlwZShzZWxmLndvcmQpIG5vdCBpbiBzKQogICAgICAgICBzLmRpc2NhcmQoc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCiAKICAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CiAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oc2VsZi5zKSk6CiAgICAgICAgICAgICBlbGVtID0gc2VsZi5zLnBvcCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBub3QgaW4gc2VsZi5zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gbm90IGluIHNlbGYucykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucy5wb3ApCiAKICAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CiAgICAgICAgIHJldHZhbCA9IHNlbGYucy51cGRhdGUoc2VsZi5vdGhlcndvcmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQogICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLnVwZGF0ZSwgY2hlY2tfcGFzc190aHJ1KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnVwZGF0ZSwgW1tdXSkKICAgICAgICAgZm9yIHAsIHEgaW4gKCgnY2RjJywgJ2FiY2QnKSwgKCdlZmdmZScsICdhYmNlZmcnKSwgKCdjY2InLCAnYWJjJyksICgnZWYnLCAnYWJjZWYnKSk6CkBAIC00NDUsMTYgKzQ0NSwxNiBAQAogICAgIGRlZiB0ZXN0X2lvcihzZWxmKToKICAgICAgICAgc2VsZi5zIHw9IHNldChzZWxmLm90aGVyd29yZCkKICAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjIGluIHNlbGYucykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKIAogICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl91cGRhdGUoc2VsZik6CiAgICAgICAgIHJldHZhbCA9IHNlbGYucy5pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYub3RoZXJ3b3JkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKICAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKICAgICAgICAgICAgIGlmIGMgaW4gc2VsZi5vdGhlcndvcmQgYW5kIGMgaW4gc2VsZi53b3JkOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjIGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBpbiBzZWxmLnMpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjIG5vdCBpbiBzZWxmLnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgbm90IGluIHNlbGYucykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUGFzc1RocnUsIHNlbGYucy5pbnRlcnNlY3Rpb25fdXBkYXRlLCBjaGVja19wYXNzX3RocnUoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuaW50ZXJzZWN0aW9uX3VwZGF0ZSwgW1tdXSkKICAgICAgICAgZm9yIHAsIHEgaW4gKCgnY2RjJywgJ2MnKSwgKCdlZmdmZScsICcnKSwgKCdjY2InLCAnYmMnKSwgKCdlZicsICcnKSk6CkBAIC00NzIsMTggKzQ3MiwxOCBAQAogICAgICAgICBzZWxmLnMgJj0gc2V0KHNlbGYub3RoZXJ3b3JkKQogICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgogICAgICAgICAgICAgaWYgYyBpbiBzZWxmLm90aGVyd29yZCBhbmQgYyBpbiBzZWxmLndvcmQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgbm90IGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBub3QgaW4gc2VsZi5zKQogCiAgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CiAgICAgICAgIHJldHZhbCA9IHNlbGYucy5kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLm90aGVyd29yZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCiAgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CiAgICAgICAgICAgICBpZiBjIGluIHNlbGYud29yZCBhbmQgYyBub3QgaW4gc2VsZi5vdGhlcndvcmQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgbm90IGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBub3QgaW4gc2VsZi5zKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLmRpZmZlcmVuY2VfdXBkYXRlLCBjaGVja19wYXNzX3RocnUoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuZGlmZmVyZW5jZV91cGRhdGUsIFtbXV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKQEAgLTUwOSwxOCArNTA5LDE4IEBACiAgICAgICAgIHNlbGYucyAtPSBzZXQoc2VsZi5vdGhlcndvcmQpCiAgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CiAgICAgICAgICAgICBpZiBjIGluIHNlbGYud29yZCBhbmQgYyBub3QgaW4gc2VsZi5vdGhlcndvcmQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgbm90IGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBub3QgaW4gc2VsZi5zKQogCiAgICAgZGVmIHRlc3Rfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYpOgogICAgICAgICByZXR2YWwgPSBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXJ3b3JkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKICAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKICAgICAgICAgICAgIGlmIChjIGluIHNlbGYud29yZCkgXiAoYyBpbiBzZWxmLm90aGVyd29yZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgbm90IGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBub3QgaW4gc2VsZi5zKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgY2hlY2tfcGFzc190aHJ1KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKICAgICAgICAgZm9yIHAsIHEgaW4gKCgnY2RjJywgJ2FiZCcpLCAoJ2VmZ2ZlJywgJ2FiY2VmZycpLCAoJ2NjYicsICdhJyksICgnZWYnLCAnYWJjZWYnKSk6CkBAIC01MzMsOSArNTMzLDkgQEAKICAgICAgICAgc2VsZi5zIF49IHNldChzZWxmLm90aGVyd29yZCkKICAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKICAgICAgICAgICAgIGlmIChjIGluIHNlbGYud29yZCkgXiAoYyBpbiBzZWxmLm90aGVyd29yZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgbm90IGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBub3QgaW4gc2VsZi5zKQogCiAgICAgZGVmIHRlc3RfaW5wbGFjZV9vbl9zZWxmKHNlbGYpOgogICAgICAgICB0ID0gc2VsZi5zLmNvcHkoKQpAQCAtNzYzLDcgKzc2Myw3IEBACiAKICAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CiAgICAgICAgIGZvciB2IGluIHNlbGYuc2V0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gc2VsZi52YWx1ZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpbiBzZWxmLnZhbHVlcykKICAgICAgICAgc2V0aXRlciA9IGl0ZXIoc2VsZi5zZXQpCiAgICAgICAgICMgbm90ZTogX19sZW5ndGhfaGludF9fIGlzIGFuIGludGVybmFsIHVuZG9jdW1lbnRlZCBBUEksCiAgICAgICAgICMgZG9uJ3QgcmVseSBvbiBpdCBpbiB5b3VyIG93biBwcm9ncmFtcwpAQCAtNzk4LDEwICs3OTgsMTAgQEAKICAgICAgICAgc2VsZi5yZXByICAgPSAic2V0KFszXSkiCiAKICAgICBkZWYgdGVzdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDMgaW4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgzIGluIHNlbGYuc2V0KQogCiAgICAgZGVmIHRlc3Rfbm90X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMiBub3QgaW4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIG5vdCBpbiBzZWxmLnNldCkKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC04MTUsMTAgKzgxNSwxMCBAQAogICAgICAgICBzZWxmLnJlcHIgICA9ICJzZXQoWygwLCAnemVybycpXSkiCiAKICAgICBkZWYgdGVzdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCgwLCAiemVybyIpIGluIHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAsICJ6ZXJvIikgaW4gc2VsZi5zZXQpCiAKICAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyg5IG5vdCBpbiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDkgbm90IGluIHNlbGYuc2V0KQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTExMTAsNyArMTExMCw3IEBACiAgICAgICAgICAgICBwb3BwZWRbc2VsZi5zZXQucG9wKCldID0gTm9uZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3BwZWQpLCBsZW4oc2VsZi52YWx1ZXMpKQogICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IGluIHBvcHBlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIHBvcHBlZCkKIAogICAgIGRlZiB0ZXN0X3VwZGF0ZV9lbXB0eV90dXBsZShzZWxmKToKICAgICAgICAgc2VsZi5zZXQudXBkYXRlKCgpKQpAQCAtMTM3OSw3ICsxMzc5LDcgQEAKICAgICAgICAgc2V0X2xpc3QgPSBsaXN0KHNlbGYuc2V0KTsgc2V0X2xpc3Quc29ydCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cF9saXN0KSwgbGVuKHNldF9saXN0KSkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGR1cF9saXN0KSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZHVwX2xpc3RbaV0gaXMgc2V0X2xpc3RbaV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZHVwX2xpc3RbaV0gaXMgc2V0X2xpc3RbaV0pCiAKICAgICBkZWYgdGVzdF9kZWVwX2NvcHkoc2VsZik6CiAgICAgICAgIGR1cCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zZXQpCkBAIC0xNDI5LDEzICsxNDI5LDEzIEBACiAKICAgICBkZWYgdGVzdF9iaW5vcHNWc1N1YnNldHMoc2VsZik6CiAgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgotICAgICAgICBzZWxmLmFzc2VydF8oYSAtIGIgPCBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYiAtIGEgPCBiKQotICAgICAgICBzZWxmLmFzc2VydF8oYSAmIGIgPCBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYSAmIGIgPCBiKQotICAgICAgICBzZWxmLmFzc2VydF8oYSB8IGIgPiBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYSB8IGIgPiBiKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBeIGIgPCBhIHwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgLSBiIDwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIgLSBhIDwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgfCBiID4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgfCBiID4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgXiBiIDwgYSB8IGIpCiAKICAgICBkZWYgdGVzdF9jb21tdXRhdGl2aXR5KHNlbGYpOgogICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKQEAgLTE2ODQsNyArMTY4NCw3IEBACiAgICAgICAgICAgICBlZGdlID0gdmVydGV4ICAgICAgICAgICAgICAgICAgICAgICAjIEN1Ym9jdGFoZWRyb24gdmVydGljZXMgYXJlIGVkZ2VzIGluIEN1YmUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVkZ2UpLCAyKSAgICAgICMgVHdvIGN1YmUgdmVydGljZXMgZGVmaW5lIGFuIGVkZ2UKICAgICAgICAgICAgIGZvciBjdWJldmVydCBpbiBlZGdlOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjdWJldmVydCBpbiBnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjdWJldmVydCBpbiBnKQogCiAKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQppbmRleCBlZmEzODhmLi45YzU5ODM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CkBAIC03Niw3ICs3Niw3IEBACiAKICAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CiAgICAgICAgIGZvciB2IGluIHNlbGYuc2V0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gc2VsZi52YWx1ZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpbiBzZWxmLnZhbHVlcykKIAogICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgogICAgICAgICBwID0gcGlja2xlLmR1bXBzKHNlbGYuc2V0KQpAQCAtMTA3LDEwICsxMDcsMTAgQEAKICAgICAgICAgc2VsZi5yZXByICAgPSAiU2V0KFszXSkiCiAKICAgICBkZWYgdGVzdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDMgaW4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgzIGluIHNlbGYuc2V0KQogCiAgICAgZGVmIHRlc3Rfbm90X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMiBub3QgaW4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIG5vdCBpbiBzZWxmLnNldCkKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICAgICAgICBzZWxmLnJlcHIgICA9ICJTZXQoWygwLCAnemVybycpXSkiCiAKICAgICBkZWYgdGVzdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCgwLCAiemVybyIpIGluIHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAsICJ6ZXJvIikgaW4gc2VsZi5zZXQpCiAKICAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyg5IG5vdCBpbiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDkgbm90IGluIHNlbGYuc2V0KQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQwNiw3ICs0MDYsNyBAQAogICAgICAgICAgICAgcG9wcGVkW3NlbGYuc2V0LnBvcCgpXSA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocG9wcGVkKSwgbGVuKHNlbGYudmFsdWVzKSkKICAgICAgICAgZm9yIHYgaW4gc2VsZi52YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModiBpbiBwb3BwZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpbiBwb3BwZWQpCiAKICAgICBkZWYgdGVzdF91cGRhdGVfZW1wdHlfdHVwbGUoc2VsZik6CiAgICAgICAgIHNlbGYuc2V0LnVuaW9uX3VwZGF0ZSgoKSkKQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgICAgICBzZXRfbGlzdCA9IGxpc3Qoc2VsZi5zZXQpOyBzZXRfbGlzdC5zb3J0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZHVwX2xpc3QpKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkdXBfbGlzdFtpXSBpcyBzZXRfbGlzdFtpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdXBfbGlzdFtpXSBpcyBzZXRfbGlzdFtpXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKICAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKQEAgLTczMywxMyArNzMzLDEzIEBACiAKICAgICBkZWYgdGVzdF9iaW5vcHNWc1N1YnNldHMoc2VsZik6CiAgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgotICAgICAgICBzZWxmLmFzc2VydF8oYSAtIGIgPD0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGIgLSBhIDw9IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhICYgYiA8PSBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYSAmIGIgPD0gYikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgfCBiID49IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIHwgYiA+PSBiKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBeIGIgPD0gYSB8IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIC0gYiA8PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiAtIGEgPD0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhICYgYiA8PSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPj0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgfCBiID49IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIF4gYiA8PSBhIHwgYikKIAogICAgIGRlZiB0ZXN0X2NvbW11dGF0aXZpdHkoc2VsZik6CiAgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgpAQCAtNzU1LDkgKzc1NSw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIGEsIHplcm8pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSB8IGEsIGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAmIGEsIGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIDw9IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID49IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID49IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IGEpCiAKICAgICBkZWYgdGVzdF9zdW1tYXRpb25zKHNlbGYpOgogICAgICAgICAjIGNoZWNrIHRoYXQgc3VtcyBvZiBwYXJ0cyBlcXVhbCB0aGUgd2hvbGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2hhLnB5IGIvTGliL3Rlc3QvdGVzdF9zaGEucHkKaW5kZXggMDY0N2RiMy4uNmIzODQzNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaGEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaGEucHkKQEAgLTE4LDE5ICsxOCwxOSBAQAogICAgICAgICAjIENoZWNrIGRpZ2VzdCBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZQogICAgICAgICBvYmogPSBzaGEubmV3KGRhdGEpCiAgICAgICAgIGNvbXB1dGVkID0gb2JqLmhleGRpZ2VzdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21wdXRlZCA9PSBkaWdlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wdXRlZCA9PSBkaWdlc3QpCiAKICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUKICAgICAgICAgIyBkaWdlc3Qgb3BlcmF0aW9ucy4KICAgICAgICAgY29tcHV0ZWRfYWdhaW4gPSBvYmouaGV4ZGlnZXN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXB1dGVkID09IGNvbXB1dGVkX2FnYWluKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcHV0ZWQgPT0gY29tcHV0ZWRfYWdhaW4pCiAKICAgICAgICAgIyBDaGVjayBoZXhkaWdlc3QoKSBvdXRwdXQgbWF0Y2hlcyBkaWdlc3QoKSdzIG91dHB1dAogICAgICAgICBkaWdlc3QgPSBvYmouZGlnZXN0KCkKICAgICAgICAgaGV4ZCA9ICIiCiAgICAgICAgIGZvciBjIGluIGRpZ2VzdDoKICAgICAgICAgICAgIGhleGQgKz0gJyUwMngnICUgb3JkKGMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21wdXRlZCA9PSBoZXhkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcHV0ZWQgPT0gaGV4ZCkKIAogICAgIGRlZiB0ZXN0X2Nhc2VfMShzZWxmKToKICAgICAgICAgc2VsZi5jaGVjaygiYWJjIiwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKaW5kZXggNjIyNmY5Yi4uMTdkM2NhYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKQEAgLTYzLDEyICs2MywxMiBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZnVuYywgb3MubGlzdGRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jIG11c3QgYmUgZWl0aGVyIG9zLnJlbW92ZSBvciBvcy5saXN0ZGlyIikKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZywgVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoZXhjWzBdLCBPU0Vycm9yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Y1swXSwgT1NFcnJvcikpCiAgICAgICAgICAgICBzZWxmLmVycm9yU3RhdGUgPSAxCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMsIG9zLnJtZGlyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmcsIFRFU1RGTikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGV4Y1swXSwgT1NFcnJvcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhleGNbMF0sIE9TRXJyb3IpKQogICAgICAgICAgICAgc2VsZi5lcnJvclN0YXRlID0gMgogCiAgICAgZGVmIHRlc3Rfcm10cmVlX2RvbnRfZGVsZXRlX2ZpbGUoc2VsZik6CkBAIC0xNTgsOSArMTU4LDkgQEAKICAgICAgICAgICAgIHBhdHRlcm5zID0gc2h1dGlsLmlnbm9yZV9wYXR0ZXJucygnKi50bXAnLCAndGVzdF9kaXIyJykKICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmNfZGlyLCBkc3RfZGlyLCBpZ25vcmU9cGF0dGVybnMpCiAgICAgICAgICAgICAjIGNoZWNraW5nIHRoZSByZXN1bHQ6IHNvbWUgZWxlbWVudHMgc2hvdWxkIG5vdCBiZSBjb3BpZWQKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0LnRtcCcpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0LnRtcCcpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicpKSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdF9kaXIpOgogICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKQEAgLTE2OCw5ICsxNjgsOSBAQAogICAgICAgICAgICAgcGF0dGVybnMgPSBzaHV0aWwuaWdub3JlX3BhdHRlcm5zKCcqLnRtcCcsICdzdWJkaXIqJykKICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmNfZGlyLCBkc3RfZGlyLCBpZ25vcmU9cGF0dGVybnMpCiAgICAgICAgICAgICAjIGNoZWNraW5nIHRoZSByZXN1bHQ6IHNvbWUgZWxlbWVudHMgc2hvdWxkIG5vdCBiZSBjb3BpZWQKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3QudG1wJykpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJywgJ3N1YmRpcjInKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyJykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50bXAnKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInKSkpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3RfZGlyKToKICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRzdF9kaXIpCkBAIC0xOTIsOSArMTkyLDkgQEAKICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmNfZGlyLCBkc3RfZGlyLCBpZ25vcmU9X2ZpbHRlcikKIAogICAgICAgICAgICAgIyBjaGVja2luZyB0aGUgcmVzdWx0OiBzb21lIGVsZW1lbnRzIHNob3VsZCBub3QgYmUgY29waWVkCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5weScpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyJykpKQogCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3RfZGlyKToKQEAgLTM5Myw3ICszOTMsNyBAQAogICAgICAgICAgICAgZm9yIHNyYywgZHN0IGluIFsoJ3NyY2RpcicsICdzcmNkaXIvZGVzdCcpXToKICAgICAgICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBzcmMpCiAgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKFRFU1RGTiwgZHN0KQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzaHV0aWwuX2Rlc3RpbnNyYyhzcmMsIGRzdCksCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNodXRpbC5fZGVzdGluc3JjKHNyYywgZHN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdfZGVzdGluc3JjKCkgd3JvbmdseSBjb25jbHVkZWQgdGhhdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkc3QgKCVzKSBpcyBub3QgaW4gc3JjICglcyknICUgKGRzdCwgc3JjKSkKICAgICAgICAgZmluYWxseToKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAgICAgICAgZm9yIHNyYywgZHN0IGluIFsoJ3NyY2RpcicsICdzcmMvZGVzdCcpLCAoJ3NyY2RpcicsICdzcmNkaXIubmV3JyldOgogICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihURVNURk4sIHNyYykKICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBkc3QpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoc2h1dGlsLl9kZXN0aW5zcmMoc3JjLCBkc3QpLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2h1dGlsLl9kZXN0aW5zcmMoc3JjLCBkc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nX2Rlc3RpbnNyYygpIHdyb25nbHkgY29uY2x1ZGVkIHRoYXQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkc3QgKCVzKSBpcyBpbiBzcmMgKCVzKScgJSAoZHN0LCBzcmMpKQogICAgICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkgYi9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQppbmRleCAyMTU3N2RiLi40MzY4Mzc1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQpAQCAtMjE3LDEwICsyMTcsMTAgQEAKICAgICAgICAgIyBiZWZvcmUgc2VsZWN0IGlzIGNhbGxlZAogICAgICAgICB0aW1lLnNsZWVwKHNlbGYuVElNRU9VVF9GVUxMKQogICAgICAgICBtaWRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtaWRfdGltZSAtIGJlZm9yZV90aW1lIDwgc2VsZi5USU1FT1VUX0hBTEYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtaWRfdGltZSAtIGJlZm9yZV90aW1lIDwgc2VsZi5USU1FT1VUX0hBTEYpCiAgICAgICAgIHNlbGVjdC5zZWxlY3QoW3NlbGYucmVhZF0sIFtdLCBbXSwgc2VsZi5USU1FT1VUX0ZVTEwpCiAgICAgICAgIGFmdGVyX3RpbWUgPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmFzc2VydF8oYWZ0ZXJfdGltZSAtIG1pZF90aW1lIDwgc2VsZi5USU1FT1VUX0hBTEYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhZnRlcl90aW1lIC0gbWlkX3RpbWUgPCBzZWxmLlRJTUVPVVRfSEFMRikKIAogICAgIGRlZiB0ZXN0X3dha2V1cF9mZF9kdXJpbmcoc2VsZik6CiAgICAgICAgIGltcG9ydCBzZWxlY3QKQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxlY3QuZXJyb3IsIHNlbGVjdC5zZWxlY3QsCiAgICAgICAgICAgICBbc2VsZi5yZWFkXSwgW10sIFtdLCBzZWxmLlRJTUVPVVRfRlVMTCkKICAgICAgICAgYWZ0ZXJfdGltZSA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhZnRlcl90aW1lIC0gYmVmb3JlX3RpbWUgPCBzZWxmLlRJTUVPVVRfSEFMRikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFmdGVyX3RpbWUgLSBiZWZvcmVfdGltZSA8IHNlbGYuVElNRU9VVF9IQUxGKQogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBpbXBvcnQgZmNudGwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQppbmRleCAwM2Y2ZDgwLi4yYjkzZDA0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NpdGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CkBAIC00NywyNiArNDcsMjYgQEAKICAgICAgICAgcGF0aF9wYXJ0cyA9ICgiQmVnaW5uaW5nIiwgIkVuZCIpCiAgICAgICAgIG9yaWdpbmFsX2RpciA9IG9zLnBhdGguam9pbigqcGF0aF9wYXJ0cykKICAgICAgICAgYWJzX2Rpciwgbm9ybV9kaXIgPSBzaXRlLm1ha2VwYXRoKCpwYXRoX3BhcnRzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcy5wYXRoLmFic3BhdGgob3JpZ2luYWxfZGlyKSwgYWJzX2RpcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmFic3BhdGgob3JpZ2luYWxfZGlyKSwgYWJzX2RpcikKICAgICAgICAgaWYgb3JpZ2luYWxfZGlyID09IG9zLnBhdGgubm9ybWNhc2Uob3JpZ2luYWxfZGlyKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFic19kaXIsIG5vcm1fZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnNfZGlyLCBub3JtX2RpcikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG9zLnBhdGgubm9ybWNhc2UoYWJzX2RpciksIG5vcm1fZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLm5vcm1jYXNlKGFic19kaXIpLCBub3JtX2RpcikKIAogICAgIGRlZiB0ZXN0X2luaXRfcGF0aGluZm8oc2VsZik6CiAgICAgICAgIGRpcl9zZXQgPSBzaXRlLl9pbml0X3BhdGhpbmZvKCkKICAgICAgICAgZm9yIGVudHJ5IGluIFtzaXRlLm1ha2VwYXRoKHBhdGgpWzFdIGZvciBwYXRoIGluIHN5cy5wYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKHBhdGgpXToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbnRyeSBpbiBkaXJfc2V0LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVudHJ5IGluIGRpcl9zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGZyb20gc3lzLnBhdGggbm90IGZvdW5kIGluIHNldCByZXR1cm5lZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IF9pbml0X3BhdGhpbmZvKCk6ICVzIiAlIChlbnRyeSwgZGlyX3NldCkpCiAKICAgICBkZWYgcHRoX2ZpbGVfdGVzdHMoc2VsZiwgcHRoX2ZpbGUpOgogICAgICAgICAiIiJDb250YWluIGNvbW1vbiBjb2RlIGZvciB0ZXN0aW5nIHJlc3VsdHMgb2YgcmVhZGluZyBhIC5wdGggZmlsZSIiIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHRoX2ZpbGUuaW1wb3J0ZWQgaW4gc3lzLm1vZHVsZXMsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwdGhfZmlsZS5pbXBvcnRlZCBpbiBzeXMubW9kdWxlcywKICAgICAgICAgICAgICAgICAiJXMgbm90IGluIHN5cy5wYXRoIiAlIHB0aF9maWxlLmltcG9ydGVkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2l0ZS5tYWtlcGF0aChwdGhfZmlsZS5nb29kX2Rpcl9wYXRoKVswXSBpbiBzeXMucGF0aCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZS5iYWRfZGlyX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l0ZS5tYWtlcGF0aChwdGhfZmlsZS5nb29kX2Rpcl9wYXRoKVswXSBpbiBzeXMucGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZS5iYWRfZGlyX3BhdGgpKQogCiAgICAgZGVmIHRlc3RfYWRkcGFja2FnZShzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgYWRkcGFja2FnZSgpIGltcG9ydHMgaWYgdGhlIGxpbmUgc3RhcnRzIHdpdGggJ2ltcG9ydCcsCkBAIC05OCw3ICs5OCw3IEBACiAKICAgICBkZWYgdGVzdF9zX29wdGlvbihzZWxmKToKICAgICAgICAgdXNlcnNpdGUgPSBzaXRlLlVTRVJfU0lURQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcnNpdGUgaW4gc3lzLnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2Vyc2l0ZSBpbiBzeXMucGF0aCkKIAogICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICctYycsCiAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLmV4aXQoJXIgaW4gc3lzLnBhdGgpJyAlIHVzZXJzaXRlXSkKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICBzaXRlLmFic19fZmlsZV9fKCkKICAgICAgICAgZm9yIG1vZHVsZSBpbiAoc3lzLCBvcywgX19idWlsdGluX18pOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmlzYWJzKG1vZHVsZS5fX2ZpbGVfXyksIGBtb2R1bGVgKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzYWJzKG1vZHVsZS5fX2ZpbGVfXyksIGBtb2R1bGVgKQogICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICMgV2UgY291bGQgdHJ5IGV2ZXJ5dGhpbmcgaW4gc3lzLm1vZHVsZXM7IGhvd2V2ZXIsIHdoZW4gcmVncnRlc3QucHkKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgICAgICBzaXRlLnJlbW92ZWR1cHBhdGhzKCkKICAgICAgICAgc2Vlbl9wYXRocyA9IHNldCgpCiAgICAgICAgIGZvciBwYXRoIGluIHN5cy5wYXRoOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhdGggbm90IGluIHNlZW5fcGF0aHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0aCBub3QgaW4gc2Vlbl9wYXRocykKICAgICAgICAgICAgIHNlZW5fcGF0aHMuYWRkKHBhdGgpCiAKICAgICBkZWYgdGVzdF9hZGRfYnVpbGRfZGlyKHNlbGYpOgpAQCAtMjIxLDE3ICsyMjEsMTcgQEAKIAogICAgIGRlZiB0ZXN0X3NldHRpbmdfcXVpdChzZWxmKToKICAgICAgICAgIyAncXVpdCcgYW5kICdleGl0JyBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byBfX2J1aWx0aW5fXwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihfX2J1aWx0aW5fXywgInF1aXQiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIoX19idWlsdGluX18sICJleGl0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAicXVpdCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihfX2J1aWx0aW5fXywgImV4aXQiKSkKIAogICAgIGRlZiB0ZXN0X3NldHRpbmdfY29weXJpZ2h0KHNlbGYpOgogICAgICAgICAjICdjb3B5cmlnaHQnIGFuZCAnY3JlZGl0cycgc2hvdWxkIGJlIGluIF9fYnVpbHRpbl9fCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKF9fYnVpbHRpbl9fLCAiY29weXJpZ2h0IikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKF9fYnVpbHRpbl9fLCAiY3JlZGl0cyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihfX2J1aWx0aW5fXywgImNvcHlyaWdodCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihfX2J1aWx0aW5fXywgImNyZWRpdHMiKSkKIAogICAgIGRlZiB0ZXN0X3NldHRpbmdfaGVscChzZWxmKToKICAgICAgICAgIyAnaGVscCcgc2hvdWxkIGJlIHNldCBpbiBfX2J1aWx0aW5fXwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihfX2J1aWx0aW5fXywgImhlbHAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoX19idWlsdGluX18sICJoZWxwIikpCiAKICAgICBkZWYgdGVzdF9hbGlhc2luZ19tYmNzKHNlbGYpOgogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdGVuY29kaW5nX3JlbW92ZWQoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcgaXMgZ29uZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IGhhc2F0dHIoc3lzLCAic2V0ZGVmYXVsdGVuY29kaW5nIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihzeXMsICJzZXRkZWZhdWx0ZW5jb2RpbmciKSkKIAogICAgIGRlZiB0ZXN0X3NpdGVjdXN0b21pemVfZXhlY3V0ZWQoc2VsZik6CiAgICAgICAgICMgSWYgc2l0ZWN1c3RvbWl6ZSBpcyBhdmFpbGFibGUsIGl0IHNob3VsZCBoYXZlIGJlZW4gaW1wb3J0ZWQuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NsaWNlLnB5IGIvTGliL3Rlc3QvdGVzdF9zbGljZS5weQppbmRleCA4NTQ4MDViLi4wOGRlOGUzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NsaWNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkKQEAgLTcxLDcgKzcxLDcgQEAKIAogICAgICAgICBvYmogPSBBbnlDbGFzcygpCiAgICAgICAgIHMgPSBzbGljZShvYmopCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnN0b3AgaXMgb2JqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdG9wIGlzIG9iaikKIAogICAgIGRlZiB0ZXN0X2luZGljZXMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSAgICAgICAgICAgKS5pbmRpY2VzKDEwKSwgKDAsIDEwLCAgMSkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDVjOTA2ZDcuLmEyMjY1ZGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0yMzcsMTEgKzIzNywxMSBAQAogICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmhlcnJvcgogICAgICAgICBkZWYgcmFpc2VfZ2FpZXJyb3IoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5nYWllcnJvcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCByYWlzZV9lcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCByYWlzZV9lcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByYWlzaW5nIHNvY2tldCBleGNlcHRpb24uIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC5lcnJvciwgcmFpc2VfaGVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHJhaXNlX2hlcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByYWlzaW5nIHNvY2tldCBleGNlcHRpb24uIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC5lcnJvciwgcmFpc2VfZ2FpZXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgcmFpc2VfZ2FpZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmFpc2luZyBzb2NrZXQgZXhjZXB0aW9uLiIpCiAKICAgICBkZWYgdGVzdENydWNpYWxDb25zdGFudHMoc2VsZik6CkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICMgUHJvYmFibHkgbmFtZSBsb29rdXAgd2Fzbid0IHNldCB1cCByaWdodDsgc2tpcCB0aGlzIHRlc3QKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFzc2VydF8oaXAuZmluZCgnLicpID49IDAsICJFcnJvciByZXNvbHZpbmcgaG9zdCB0byBpcC4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXAuZmluZCgnLicpID49IDAsICJFcnJvciByZXNvbHZpbmcgaG9zdCB0byBpcC4iKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBobmFtZSwgYWxpYXNlcywgaXBhZGRycyA9IHNvY2tldC5nZXRob3N0YnlhZGRyKGlwKQogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgpAQCAtNDkxLDcgKzQ5MSw3IEBACiAgICAgICAgICMgaXQgcmVhc29uYWJsZSB0byBnZXQgdGhlIGhvc3QncyBhZGRyIGluIGFkZGl0aW9uIHRvIDAuMC4wLjAuCiAgICAgICAgICMgQXQgbGVhc3QgZm9yIGVDb3MuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgUy8zOTAgdG8gcGFzcy4KICAgICAgICAgbXlfaXBfYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQotICAgICAgICBzZWxmLmFzc2VydF8obmFtZVswXSBpbiAoIjAuMC4wLjAiLCBteV9pcF9hZGRyKSwgJyVzIGludmFsaWQnICUgbmFtZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWVbMF0gaW4gKCIwLjAuMC4wIiwgbXlfaXBfYWRkciksICclcyBpbnZhbGlkJyAlIG5hbWVbMF0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZVsxXSwgcG9ydCkKIAogICAgIGRlZiB0ZXN0R2V0U29ja09wdChzZWxmKToKQEAgLTQ5OSwxNCArNDk5LDE0IEBACiAgICAgICAgICMgV2Uga25vdyBhIHNvY2tldCBzaG91bGQgc3RhcnQgd2l0aG91dCByZXVzZT09MAogICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQogICAgICAgICByZXVzZSA9IHNvY2suZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUikKLSAgICAgICAgc2VsZi5mYWlsSWYocmV1c2UgIT0gMCwgImluaXRpYWwgbW9kZSBpcyByZXVzZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV1c2UgIT0gMCwgImluaXRpYWwgbW9kZSBpcyByZXVzZSIpCiAKICAgICBkZWYgdGVzdFNldFNvY2tPcHQoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyBzZXRzb2Nrb3B0KCkKICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQogICAgICAgICByZXVzZSA9IHNvY2suZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUikKLSAgICAgICAgc2VsZi5mYWlsSWYocmV1c2UgPT0gMCwgImZhaWxlZCB0byBzZXQgcmV1c2UgbW9kZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV1c2UgPT0gMCwgImZhaWxlZCB0byBzZXQgcmV1c2UgbW9kZSIpCiAKICAgICBkZWYgdGVzdFNlbmRBZnRlckNsb3NlKHNlbGYpOgogICAgICAgICAjIHRlc3Rpbmcgc2VuZCgpIGFmdGVyIGNsb3NlKCkgd2l0aCB0aW1lb3V0CkBAIC01MzksMTAgKzUzOSwxMCBAQAogICAgIGRlZiB0ZXN0X3NvY2tfaW9jdGwoc2VsZik6CiAgICAgICAgIGlmIG9zLm5hbWUgIT0gIm50IjoKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzb2NrZXQuc29ja2V0LCAnaW9jdGwnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc29ja2V0LCAnU0lPX1JDVkFMTCcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzb2NrZXQsICdSQ1ZBTExfT04nKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc29ja2V0LCAnUkNWQUxMX09GRicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQuc29ja2V0LCAnaW9jdGwnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc29ja2V0LCAnU0lPX1JDVkFMTCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdSQ1ZBTExfT04nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc29ja2V0LCAnUkNWQUxMX09GRicpKQogCiAKIGNsYXNzIEJhc2ljVENQVGVzdChTb2NrZXRDb25uZWN0ZWRUZXN0KToKQEAgLTcwMSw3ICs3MDEsNyBAQAogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbmQgPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmFzc2VydF8oKGVuZCAtIHN0YXJ0KSA8IDEuMCwgIkVycm9yIHNldHRpbmcgbm9uLWJsb2NraW5nIG1vZGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChlbmQgLSBzdGFydCkgPCAxLjAsICJFcnJvciBzZXR0aW5nIG5vbi1ibG9ja2luZyBtb2RlLiIpCiAKICAgICBkZWYgX3Rlc3RTZXRCbG9ja2luZyhzZWxmKToKICAgICAgICAgcGFzcwpAQCAtNzY4LDcgKzc2OCw3IEBACiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuc2Vydl9maWxlLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuc2Vydl9maWxlLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc2Vydl9maWxlLmNsb3NlZCkKICAgICAgICAgc2VsZi5zZXJ2X2ZpbGUgPSBOb25lCiAgICAgICAgIFNvY2tldENvbm5lY3RlZFRlc3QudGVhckRvd24oc2VsZikKIApAQCAtNzc4LDcgKzc3OCw3IEBACiAKICAgICBkZWYgY2xpZW50VGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY2xpX2ZpbGUuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5jbGlfZmlsZS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNsaV9maWxlLmNsb3NlZCkKICAgICAgICAgc2VsZi5jbGlfZmlsZSA9IE5vbmUKICAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC5jbGllbnRUZWFyRG93bihzZWxmKQogCkBAIC04NTMsMTAgKzg1MywxMCBAQAogICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKCJFbmQgT2YgTGluZSIpCiAKICAgICBkZWYgdGVzdENsb3NlZEF0dHIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgc2VsZi5zZXJ2X2ZpbGUuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuc2Vydl9maWxlLmNsb3NlZCkKIAogICAgIGRlZiBfdGVzdENsb3NlZEF0dHIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgc2VsZi5jbGlfZmlsZS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5jbGlfZmlsZS5jbG9zZWQpCiAKIGNsYXNzIFVuYnVmZmVyZWRGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZShGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZSk6CiAKQEAgLTkwOCw3ICs5MDgsNyBAQAogY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb25Ob1NlcnZlcih1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RXaXRob3V0U2VydmVyKHNlbGYpOgogICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAogICAgICAgICAgICAgc29ja2V0LmVycm9yLAogICAgICAgICAgICAgbGFtYmRhOiBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHBvcnQpKQogICAgICAgICApCkBAIC05MzgsNyArOTM4LDcgQEAKICAgICB0ZXN0VGltZW91dERlZmF1bHQgPSBfanVzdEFjY2VwdAogICAgIGRlZiBfdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogICAgICAgICAjIHBhc3Npbmcgbm8gZXhwbGljaXQgdGltZW91dCB1c2VzIHNvY2tldCdzIGdsb2JhbCBkZWZhdWx0Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDQyKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSkKQEAgLTk0OSw3ICs5NDksNyBAQAogICAgIHRlc3RUaW1lb3V0Tm9uZSA9IF9qdXN0QWNjZXB0CiAgICAgZGVmIF90ZXN0VGltZW91dE5vbmUoc2VsZik6CiAgICAgICAgICMgTm9uZSB0aW1lb3V0IG1lYW5zIHRoZSBzYW1lIGFzIHNvY2suc2V0dGltZW91dChOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCksIHRpbWVvdXQ9Tm9uZSkKQEAgLTk5NCw3ICs5OTQsNyBAQAogCiAgICAgZGVmIF90ZXN0T3V0c2lkZVRpbWVvdXQoc2VsZik6CiAgICAgICAgIHNlbGYuY2xpID0gc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgdGltZW91dD0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LnRpbWVvdXQsIGxhbWJkYTogc29jay5yZWN2KDUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCwgbGFtYmRhOiBzb2NrLnJlY3YoNSkpCiAKIAogY2xhc3MgVXJsbGliMkZpbGVvYmplY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTEwMTQsMTIgKzEwMTQsMTIgQEAKICAgICAgICAgcyA9IE1vY2tTb2NrZXQoKQogICAgICAgICBmID0gc29ja2V0Ll9maWxlb2JqZWN0KHMpCiAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHMuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHMuY2xvc2VkKQogCiAgICAgICAgIHMgPSBNb2NrU29ja2V0KCkKICAgICAgICAgZiA9IHNvY2tldC5fZmlsZW9iamVjdChzLCBjbG9zZT1UcnVlKQogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5jbG9zZWQpCiAKIGNsYXNzIFRDUFRpbWVvdXRUZXN0KFNvY2tldFRDUFRlc3QpOgogCkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogICAgICAgICBkZWYgcmFpc2VfdGltZW91dCgqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgc2VsZi5zZXJ2LnNldHRpbWVvdXQoMS4wKQogICAgICAgICAgICAgc2VsZi5zZXJ2LmFjY2VwdCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQudGltZW91dCwgcmFpc2VfdGltZW91dCwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LnRpbWVvdXQsIHJhaXNlX3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2VuZXJhdGluZyBhIHRpbWVvdXQgZXhjZXB0aW9uIChUQ1ApIikKIAogICAgIGRlZiB0ZXN0VGltZW91dFplcm8oc2VsZik6CkBAIC0xMDg0LDcgKzEwODQsNyBAQAogICAgICAgICBkZWYgcmFpc2VfdGltZW91dCgqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgc2VsZi5zZXJ2LnNldHRpbWVvdXQoMS4wKQogICAgICAgICAgICAgc2VsZi5zZXJ2LnJlY3YoMTAyNCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC50aW1lb3V0LCByYWlzZV90aW1lb3V0LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCwgcmFpc2VfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZW5lcmF0aW5nIGEgdGltZW91dCBleGNlcHRpb24gKFVEUCkiKQogCiAgICAgZGVmIHRlc3RUaW1lb3V0WmVybyhzZWxmKToKQEAgLTExMDQsMTAgKzExMDQsMTAgQEAKIGNsYXNzIFRlc3RFeGNlcHRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0RXhjZXB0aW9uVHJlZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3Moc29ja2V0LmVycm9yLCBFeGNlcHRpb24pKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhzb2NrZXQuaGVycm9yLCBzb2NrZXQuZXJyb3IpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhzb2NrZXQuZ2FpZXJyb3IsIHNvY2tldC5lcnJvcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKHNvY2tldC50aW1lb3V0LCBzb2NrZXQuZXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzb2NrZXQuZXJyb3IsIEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5oZXJyb3IsIHNvY2tldC5lcnJvcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5nYWllcnJvciwgc29ja2V0LmVycm9yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LnRpbWVvdXQsIHNvY2tldC5lcnJvcikpCiAKIGNsYXNzIFRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHIucHkgYi9MaWIvdGVzdC90ZXN0X3N0ci5weQppbmRleCA1MzQxYWYyLi5jNTQ2MTU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0ci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0ci5weQpAQCAtODYsNyArODYsNyBAQAogICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiAibm90IHVuaWNvZGUiCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihGb28wKCkpLnN0YXJ0c3dpdGgoIjwiKSkgIyB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIF9fdW5pY29kZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoRm9vMCgpKS5zdGFydHN3aXRoKCI8IikpICMgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBfX3VuaWNvZGVfXwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb28xKCkpLCAiZm9vIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vMigpKSwgImZvbyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzMoKSksICJmb28iKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJpbmcucHkgYi9MaWIvdGVzdC90ZXN0X3N0cmluZy5weQppbmRleCAyMGNmZjBhLi4zNWFiMTE3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cmluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cmluZy5weQpAQCAtMTk5LDEzICsxOTksMTMgQEAKIGNsYXNzIEJ5dGVzQWxpYXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW4oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHIgaXMgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIgaXMgYnl0ZXMpCiAKICAgICBkZWYgdGVzdF9zeW50YXgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJzcGFtIiwgInNwYW0iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJyImVnZ1xmb28iLCAiZWdnXFxmb28iKQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZShiIiIpLCBzdHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKGJyIiIpLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGIiIiksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYnIiIiksIHN0cikKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyaW5nVGVzdCwgTW9kdWxlVGVzdCwgQnl0ZXNBbGlhc1Rlc3QpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkgYi9MaWIvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkKaW5kZXggNjA0MjVkZC4uMTViZGY4NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weQpAQCAtOCw2NiArOCw2NiBAQAogCiBjbGFzcyBTdHJpbmdwcmVwVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYTEodSJcdTAyMjEiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYTEodSJcdTAyMjIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2ExKHUiXHUwMjIxIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYTEodSJcdTAyMjIiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYjEodSJcdTAwYWQiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYjEodSJcdTAwYWUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2IxKHUiXHUwMGFkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYjEodSJcdTAwYWUiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWFwX3RhYmxlX2IyKHUiXHUwMDQxIiksIHUiXHUwMDYxIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1hcF90YWJsZV9iMih1Ilx1MDA2MSIpLCB1Ilx1MDA2MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXBfdGFibGVfYjIodSJcdTAwNDEiKSwgdSJcdTAwNjEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFwX3RhYmxlX2IyKHUiXHUwMDYxIiksIHUiXHUwMDYxIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWFwX3RhYmxlX2IzKHUiXHUwMDQxIiksIHUiXHUwMDYxIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1hcF90YWJsZV9iMyh1Ilx1MDA2MSIpLCB1Ilx1MDA2MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXBfdGFibGVfYjModSJcdTAwNDEiKSwgdSJcdTAwNjEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFwX3RhYmxlX2IzKHUiXHUwMDYxIiksIHUiXHUwMDYxIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzExKHUiXHUwMDIwIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGluX3RhYmxlX2MxMSh1Ilx1MDAyMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzExKHUiXHUwMDIwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzExKHUiXHUwMDIxIikpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGluX3RhYmxlX2MxMih1Ilx1MDBhMCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jMTIodSJcdTAwYTEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MxMih1Ilx1MDBhMCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MxMih1Ilx1MDBhMSIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jMTIodSJcdTAwYTAiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzEyKHUiXHUwMGExIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMTIodSJcdTAwYTAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMTIodSJcdTAwYTEiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzExX2MxMih1Ilx1MDBhMCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jMTFfYzEyKHUiXHUwMGExIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMTFfYzEyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzExX2MxMih1Ilx1MDBhMSIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jMjEodSJcdTAwMWYiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzIxKHUiXHUwMDIwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMjEodSJcdTAwMWYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMjEodSJcdTAwMjAiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzIyKHUiXHUwMDlmIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGluX3RhYmxlX2MyMih1Ilx1MDBhMCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzIyKHUiXHUwMDlmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzIyKHUiXHUwMGEwIikpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGluX3RhYmxlX2MyMV9jMjIodSJcdTAwOWYiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzIxX2MyMih1Ilx1MDBhMCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzIxX2MyMih1Ilx1MDA5ZiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MyMV9jMjIodSJcdTAwYTAiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzModSJcdWUwMDAiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzModSJcdWY5MDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MzKHUiXHVlMDAwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzModSJcdWY5MDAiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzQodSJcdWZmZmYiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzQodSJcdTAwMDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M0KHUiXHVmZmZmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzQodSJcdTAwMDAiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzUodSJcdWQ4MDAiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzUodSJcdWQ3ZmYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M1KHUiXHVkODAwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzUodSJcdWQ3ZmYiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzYodSJcdWZmZjkiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzYodSJcdWZmZmUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M2KHUiXHVmZmY5IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzYodSJcdWZmZmUiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzcodSJcdTJmZjAiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzcodSJcdTJmZmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M3KHUiXHUyZmYwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzcodSJcdTJmZmMiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzgodSJcdTAzNDAiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzgodSJcdTAzNDIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M4KHUiXHUwMzQwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzgodSJcdTAzNDIiKSkKIAogICAgICAgICAjIEMuOSBpcyBub3QgaW4gdGhlIGJtcAotICAgICAgICAjIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jOSh1IlxVMDAwRTAwMDEiKSkKLSAgICAgICAgIyBzZWxmLmZhaWxJZihpbl90YWJsZV9jOCh1IlxVMDAwRTAwMDIiKSkKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzkodSJcVTAwMEUwMDAxIikpCisgICAgICAgICMgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jOCh1IlxVMDAwRTAwMDIiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfZDEodSJcdTA1YmUiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfZDEodSJcdTA1YmYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2QxKHUiXHUwNWJlIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfZDEodSJcdTA1YmYiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfZDIodSJcdTAwNDEiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfZDIodSJcdTAwNDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2QyKHUiXHUwMDQxIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfZDIodSJcdTAwNDAiKSkKIAogICAgICAgICAjIFRoaXMgd291bGQgZ2VuZXJhdGUgYSBoYXNoIG9mIGFsbCBwcmVkaWNhdGVzLiBIb3dldmVyLCBydW5uaW5nCiAgICAgICAgICMgaXQgaXMgcXVpdGUgZXhwZW5zaXZlLCBhbmQgb25seSBzZXJ2ZXMgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gdGhlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cm9wLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJvcC5weQppbmRleCA3Y2RhODNmLi4wMTcyOTU3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cm9wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3Ryb3AucHkKQEAgLTEwLDEwNCArMTAsMTA0IEBACiBjbGFzcyBTdHJvcEZ1bmN0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYXRvaShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmF0b2koIiAxICIpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5hdG9pKCIgMSAiKSA9PSAxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9pLCAiIDF4IikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvaSwgIiB4MSAiKQogCiAgICAgZGVmIHRlc3RfYXRvbChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmF0b2woIiAxICIpID09IDFMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuYXRvbCgiIDEgIikgPT0gMUwpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2wsICIgMXgiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9sLCAiIHgxICIpCiAKICAgICBkZWYgdGVzdF9hdG9mKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AuYXRvZigiIDEgIikgPT0gMS4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuYXRvZigiIDEgIikgPT0gMS4wKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9mLCAiIDF4IikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvZiwgIiB4MSAiKQogCiAgICAgZGVmIHRlc3RfY2FwaXRhbGl6ZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmNhcGl0YWxpemUoIiBoZWxsbyAiKSA9PSAiIGhlbGxvICIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5jYXBpdGFsaXplKCJoZWxsbyAiKSA9PSAiSGVsbG8gIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmNhcGl0YWxpemUoIiBoZWxsbyAiKSA9PSAiIGhlbGxvICIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5jYXBpdGFsaXplKCJoZWxsbyAiKSA9PSAiSGVsbG8gIikKIAogICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5maW5kKCJhYmNkZWZnaGlhYmMiLCAiYWJjIikgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiLCAxKSA9PSA5KQotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AuZmluZCgiYWJjZGVmZ2hpYWJjIiwgImRlZiIsIDQpID09IC0xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuZmluZCgiYWJjZGVmZ2hpYWJjIiwgImFiYyIpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5maW5kKCJhYmNkZWZnaGlhYmMiLCAiYWJjIiwgMSkgPT0gOSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmZpbmQoImFiY2RlZmdoaWFiYyIsICJkZWYiLCA0KSA9PSAtMSkKIAogICAgIGRlZiB0ZXN0X3JmaW5kKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AucmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiKSA9PSA5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AucmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiKSA9PSA5KQogCiAgICAgZGVmIHRlc3RfbG93ZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5sb3dlcigiSGVMTG8iKSA9PSAiaGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AubG93ZXIoIkhlTExvIikgPT0gImhlbGxvIikKIAogICAgIGRlZiB0ZXN0X3VwcGVyKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AudXBwZXIoIkhlTExvIikgPT0gIkhFTExPIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnVwcGVyKCJIZUxMbyIpID09ICJIRUxMTyIpCiAKICAgICBkZWYgdGVzdF9zd2FwY2FzZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLnN3YXBjYXNlKCJIZUxMbyBjT21wVXRlUnMiKSA9PSAiaEVsbE8gQ29NUHVURXJTIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnN3YXBjYXNlKCJIZUxMbyBjT21wVXRlUnMiKSA9PSAiaEVsbE8gQ29NUHVURXJTIikKIAogICAgIGRlZiB0ZXN0X3N0cmlwKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gImhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnN0cmlwKCIgXHRcbiBoZWxsbyBcdFxuICIpID09ICJoZWxsbyIpCiAKICAgICBkZWYgdGVzdF9sc3RyaXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5sc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gImhlbGxvIFx0XG4gIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmxzdHJpcCgiIFx0XG4gaGVsbG8gXHRcbiAiKSA9PSAiaGVsbG8gXHRcbiAiKQogCiAgICAgZGVmIHRlc3RfcnN0cmlwKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AucnN0cmlwKCIgXHRcbiBoZWxsbyBcdFxuICIpID09ICIgXHRcbiBoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5yc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gIiBcdFxuIGhlbGxvIikKIAogICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CiAgICAgICAgIHJlcGxhY2UgPSBzdHJvcC5yZXBsYWNlCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMSkKICAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvIXRocmVlISIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMikKICAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvQHRocmVlISIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMykKICAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvQHRocmVlQCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgNCkKICAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvQHRocmVlQCIpCiAKICAgICAgICAgIyBDQVVUSU9OOiBhIHJlcGxhY2UgY291bnQgb2YgMCBtZWFucyBpbmZpbml0eSBvbmx5IHRvIHN0cm9wLAogICAgICAgICAjIG5vdCB0byB0aGUgc3RyaW5nIC5yZXBsYWNlKCkgbWV0aG9kIG9yIHRvIHRoZQogICAgICAgICAjIHN0cmluZy5yZXBsYWNlKCkgZnVuY3Rpb24uCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAwKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJ3gnLCAnQCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICd4JywgJ0AnKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZSF0d28hdGhyZWUhIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJ3gnLCAnQCcsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICd4JywgJ0AnLCAyKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZSF0d28hdGhyZWUhIikKIAogICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgogICAgICAgICBzcGxpdCA9IHN0cm9wLnNwbGl0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzcGxpdCgidGhpcyBpcyB0aGUgc3BsaXQgZnVuY3Rpb24iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoInRoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgID09IFsndGhpcycsICdpcycsICd0aGUnLCAnc3BsaXQnLCAnZnVuY3Rpb24nXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJhfGJ8Y3xkIiwgJ3wnKSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJhfGJ8Y3xkIiwgJ3wnLCAyKSA9PSBbJ2EnLCAnYicsICdjfGQnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMSkgPT0gWydhJywgJ2IgYyBkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDIpID09IFsnYScsICdiJywgJ2MgZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BsaXQoImEgYiBjIGQiLCBOb25lLCAzKSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgNCkgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDApID09IFsnYScsICdiJywgJ2MnLCAnZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BsaXQoImEgIGIgIGMgIGQiLCBOb25lLCAyKSA9PSAgWydhJywgJ2InLCAnYyAgZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImF8YnxjfGQiLCAnfCcpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImF8YnxjfGQiLCAnfCcsIDIpID09IFsnYScsICdiJywgJ2N8ZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCAxKSA9PSBbJ2EnLCAnYiBjIGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMikgPT0gWydhJywgJ2InLCAnYyBkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDMpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCA0KSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMCkgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSAgYiAgYyAgZCIsIE5vbmUsIDIpID09ICBbJ2EnLCAnYicsICdjICBkJ10pCiAKICAgICBkZWYgdGVzdF9qb2luKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auam9pbihbJ2EnLCAnYicsICdjJywgJ2QnXSkgPT0gJ2EgYiBjIGQnKQotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auam9pbigoJ2EnLCAnYicsICdjJywgJ2QnKSwgJycpID09ICdhYmNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmpvaW4oU2VxdWVuY2UoKSkgPT0gJ3cgeCB5IHonKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbihbJ2EnLCAnYicsICdjJywgJ2QnXSkgPT0gJ2EgYiBjIGQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbigoJ2EnLCAnYicsICdjJywgJ2QnKSwgJycpID09ICdhYmNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oU2VxdWVuY2UoKSkgPT0gJ3cgeCB5IHonKQogCiAgICAgICAgICMgdHJ5IGEgZmV3IGxvbmcgb25lcwotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auam9pbihbJ3gnICogMTAwXSAqIDEwMCwgJzonKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbihbJ3gnICogMTAwXSAqIDEwMCwgJzonKQogICAgICAgICAgICAgICAgICAgICAgPT0gKCgneCcgKiAxMDApICsgIjoiKSAqIDk5ICsgIngiICogMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auam9pbigoJ3gnICogMTAwLCkgKiAxMDAsICc6JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oKCd4JyAqIDEwMCwpICogMTAwLCAnOicpCiAgICAgICAgICAgICAgICAgICAgICA9PSAoKCd4JyAqIDEwMCkgKyAiOiIpICogOTkgKyAieCIgKiAxMDApCiAKICAgICBkZWYgdGVzdF9tYWtldHJhbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5tYWtldHJhbnMoImFiYyIsICJ4eXoiKSA9PSB0cmFuc3RhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AubWFrZXRyYW5zKCJhYmMiLCAieHl6IikgPT0gdHJhbnN0YWJsZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AubWFrZXRyYW5zLCAiYWJjIiwgInh5enEiKQogCiAgICAgZGVmIHRlc3RfdHJhbnNsYXRlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AudHJhbnNsYXRlKCJ4eXphYmNkZWYiLCB0cmFuc3RhYmxlLCAiZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnRyYW5zbGF0ZSgieHl6YWJjZGVmIiwgdHJhbnN0YWJsZSwgImRlZiIpCiAgICAgICAgICAgICAgICAgICAgICA9PSAieHl6eHl6IikKIAogICAgIGRlZiB0ZXN0X2RhdGFfYXR0cmlidXRlcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CmluZGV4IDJhYTRiYzkuLjE2ODI2M2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQpAQCAtMTMsNyArMTMsNyBAQAogY2xhc3MgZ2V0bGFuZ19UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCBfZ2V0bGFuZyIiIgogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChfc3RycHRpbWUuX2dldGxhbmcoKSwgbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfVElNRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3N0cnB0aW1lLl9nZXRsYW5nKCksIGxvY2FsZS5nZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUpKQogCiBjbGFzcyBMb2NhbGVUaW1lX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0cyBmb3IgX3N0cnB0aW1lLkxvY2FsZVRpbWUuCkBAIC0zNiw5ICszNiw5IEBACiAgICAgICAgICIiIgogICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKGRpcmVjdGl2ZSwgc2VsZi50aW1lX3R1cGxlKS5sb3dlcigpCiAgICAgICAgIGNvbXBhcmlzb24gPSB0ZXN0aW5nW3NlbGYudGltZV90dXBsZVt0dXBsZV9wb3NpdGlvbl1dCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJmdGltZV9vdXRwdXQgaW4gdGVzdGluZywgIiVzOiBub3QgZm91bmQgaW4gdHVwbGUiICUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmZ0aW1lX291dHB1dCBpbiB0ZXN0aW5nLCAiJXM6IG5vdCBmb3VuZCBpbiB0dXBsZSIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbXBhcmlzb24gPT0gc3RyZnRpbWVfb3V0cHV0LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGFyaXNvbiA9PSBzdHJmdGltZV9vdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHBvc2l0aW9uIHdpdGhpbiB0dXBsZSBpbmNvcnJlY3Q7ICVzICE9ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JfbXNnLCBjb21wYXJpc29uLCBzdHJmdGltZV9vdXRwdXQpKQogCkBAIC02MSwxOCArNjEsMTggQEAKICAgICBkZWYgdGVzdF9hbV9wbShzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgQU0vUE0gcmVwcmVzZW50YXRpb24gZG9uZSBwcm9wZXJseQogICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlcCIsIHNlbGYudGltZV90dXBsZSkubG93ZXIoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyZnRpbWVfb3V0cHV0IGluIHNlbGYuTFRfaW5zLmFtX3BtLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyZnRpbWVfb3V0cHV0IGluIHNlbGYuTFRfaW5zLmFtX3BtLAogICAgICAgICAgICAgICAgICAgICAgICAgIkFNL1BNIHJlcHJlc2VudGF0aW9uIG5vdCBpbiB0dXBsZSIpCiAgICAgICAgIGlmIHNlbGYudGltZV90dXBsZVszXSA8IDEyOiBwb3NpdGlvbiA9IDAKICAgICAgICAgZWxzZTogcG9zaXRpb24gPSAxCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJmdGltZV9vdXRwdXQgPT0gc2VsZi5MVF9pbnMuYW1fcG1bcG9zaXRpb25dLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyZnRpbWVfb3V0cHV0ID09IHNlbGYuTFRfaW5zLmFtX3BtW3Bvc2l0aW9uXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJBTS9QTSByZXByZXNlbnRhdGlvbiBpbiB0aGUgd3JvbmcgcG9zaXRpb24gd2l0aGluIHRoZSB0dXBsZSIpCiAKICAgICBkZWYgdGVzdF90aW1lem9uZShzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGltZXpvbmUgaXMgY29ycmVjdAogICAgICAgICB0aW1lem9uZSA9IHRpbWUuc3RyZnRpbWUoIiVaIiwgc2VsZi50aW1lX3R1cGxlKS5sb3dlcigpCiAgICAgICAgIGlmIHRpbWV6b25lOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHRpbWV6b25lIGluIHNlbGYuTFRfaW5zLnRpbWV6b25lWzBdIG9yIFwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lem9uZSBpbiBzZWxmLkxUX2lucy50aW1lem9uZVswXSBvciBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUgaW4gc2VsZi5MVF9pbnMudGltZXpvbmVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWV6b25lICVzIG5vdCBmb3VuZCBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lem9uZSwgc2VsZi5MVF9pbnMudGltZXpvbmUpKQpAQCAtODYsMjYgKzg2LDI2IEBACiAgICAgICAgICMgIG91dHB1dC4KICAgICAgICAgbWFnaWNfZGF0ZSA9ICgxOTk5LCAzLCAxNywgMjIsIDQ0LCA1NSwgMiwgNzYsIDApCiAgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVjIiwgbWFnaWNfZGF0ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmZ0aW1lX291dHB1dCA9PSB0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGVfdGltZSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmZ0aW1lX291dHB1dCA9PSB0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGVfdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljX2RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkxDX2RhdGVfdGltZSBpbmNvcnJlY3QiKQogICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIleCIsIG1hZ2ljX2RhdGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJmdGltZV9vdXRwdXQgPT0gdGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ19kYXRlLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyZnRpbWVfb3V0cHV0ID09IHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljX2RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkxDX2RhdGUgaW5jb3JyZWN0IikKICAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJVgiLCBtYWdpY19kYXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyZnRpbWVfb3V0cHV0ID09IHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfdGltZSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmZ0aW1lX291dHB1dCA9PSB0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdpY19kYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJMQ190aW1lIGluY29ycmVjdCIpCiAgICAgICAgIExUID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQogICAgICAgICBMVC5hbV9wbSA9ICgnJywgJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhMVC5MQ190aW1lLCAiTG9jYWxlVGltZSdzIExDIGRpcmVjdGl2ZXMgY2Fubm90IGhhbmRsZSAiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMVC5MQ190aW1lLCAiTG9jYWxlVGltZSdzIExDIGRpcmVjdGl2ZXMgY2Fubm90IGhhbmRsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW1wdHkgc3RyaW5ncyIpCiAKICAgICBkZWYgdGVzdF9sYW5nKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBsYW5nIGlzIHNldCB0byB3aGF0IF9nZXRsYW5nKCkgcmV0dXJucwogICAgICAgICAjIEFzc3VtaW5nIGxvY2FsZSBoYXMgbm90IGNoYW5nZWQgYmV0d2VlbiBub3cgYW5kIHdoZW4gc2VsZi5MVF9pbnMgd2FzIGNyZWF0ZWQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5MVF9pbnMubGFuZywgX3N0cnB0aW1lLl9nZXRsYW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5MVF9pbnMubGFuZywgX3N0cnB0aW1lLl9nZXRsYW5nKCkpCiAKIAogY2xhc3MgVGltZVJFVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTE5LDEzICsxMTksMTMgQEAKICAgICBkZWYgdGVzdF9wYXR0ZXJuKHNlbGYpOgogICAgICAgICAjIFRlc3QgVGltZVJFLnBhdHRlcm4KICAgICAgICAgcGF0dGVybl9zdHJpbmcgPSBzZWxmLnRpbWVfcmUucGF0dGVybihyIiVhICVBICVkIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhdHRlcm5fc3RyaW5nLmZpbmQoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbMl0pICE9IC0xLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0dGVybl9zdHJpbmcuZmluZChzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheVsyXSkgIT0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCBmaW5kIGFiYnJldmlhdGVkIHdlZWtkYXkgaW4gcGF0dGVybiBzdHJpbmcgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc3RyaW5nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGF0dGVybl9zdHJpbmcuZmluZChzZWxmLmxvY2FsZV90aW1lLmZfd2Vla2RheVs0XSkgIT0gLTEsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXR0ZXJuX3N0cmluZy5maW5kKHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzRdKSAhPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGZpbmQgZnVsbCB3ZWVrZGF5IGluIHBhdHRlcm4gc3RyaW5nICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3N0cmluZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhdHRlcm5fc3RyaW5nLmZpbmQoc2VsZi50aW1lX3JlWydkJ10pICE9IC0xLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0dGVybl9zdHJpbmcuZmluZChzZWxmLnRpbWVfcmVbJ2QnXSkgIT0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCBmaW5kICdkJyBkaXJlY3RpdmUgcGF0dGVybiBzdHJpbmcgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc3RyaW5nKQogCkBAIC0xMzMsMjMgKzEzMywyMyBAQAogICAgICAgICAjIE1ha2Ugc3VyZSBhbnkgY2hhcmFjdGVycyBpbiB0aGUgZm9ybWF0IHN0cmluZyB0aGF0IG1pZ2h0IGJlIHRha2VuIGFzCiAgICAgICAgICMgcmVnZXggc3ludGF4IGlzIGVzY2FwZWQuCiAgICAgICAgIHBhdHRlcm5fc3RyaW5nID0gc2VsZi50aW1lX3JlLnBhdHRlcm4oIlxkKyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyIlxcZFwrIiBpbiBwYXR0ZXJuX3N0cmluZywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIiXFxkXCsiIGluIHBhdHRlcm5fc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgcmUgY2hhcmFjdGVycyBlc2NhcGVkIHByb3Blcmx5IiAlCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3N0cmluZykKIAogICAgIGRlZiB0ZXN0X2NvbXBpbGUoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCBjb21waWxlZCByZWdleCBpcyBjb3JyZWN0CiAgICAgICAgIGZvdW5kID0gc2VsZi50aW1lX3JlLmNvbXBpbGUociIlQSIpLm1hdGNoKHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZm91bmQgYW5kIGZvdW5kLmdyb3VwKCdBJykgPT0gc2VsZi5sb2NhbGVfdGltZS5mX3dlZWtkYXlbNl0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCBhbmQgZm91bmQuZ3JvdXAoJ0EnKSA9PSBzZWxmLmxvY2FsZV90aW1lLmZfd2Vla2RheVs2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyZSBvYmplY3QgZm9yICclQScgZmFpbGVkIikKICAgICAgICAgY29tcGlsZWQgPSBzZWxmLnRpbWVfcmUuY29tcGlsZShyIiVhICViIikKICAgICAgICAgZm91bmQgPSBjb21waWxlZC5tYXRjaCgiJXMgJXMiICUgKHNlbGYubG9jYWxlX3RpbWUuYV93ZWVrZGF5WzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9jYWxlX3RpbWUuYV9tb250aFs0XSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb3VuZCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLAogICAgICAgICAgICAgIk1hdGNoIGZhaWxlZCB3aXRoICclcycgcmVnZXggYW5kICclcycgc3RyaW5nIiAlCiAgICAgICAgICAgICAgKGNvbXBpbGVkLnBhdHRlcm4sICIlcyAlcyIgJSAoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzRdKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb3VuZC5ncm91cCgnYScpID09IHNlbGYubG9jYWxlX3RpbWUuYV93ZWVrZGF5WzRdIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQuZ3JvdXAoJ2EnKSA9PSBzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheVs0XSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5ncm91cCgnYicpID09IHNlbGYubG9jYWxlX3RpbWUuYV9tb250aFs0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyZSBvYmplY3QgY291bGRuJ3QgZmluZCB0aGUgYWJicmV2aWF0ZWQgd2Vla2RheSBtb250aCBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgdXNpbmcgJyVzJzsgZ3JvdXAgJ2EnID0gJyVzJywgZ3JvdXAgJ2InID0gJXMnIiAlCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnLCd3JywnVycsJ3gnLCdYJywneScsJ1knLCdaJywnJScpOgogICAgICAgICAgICAgY29tcGlsZWQgPSBzZWxmLnRpbWVfcmUuY29tcGlsZSgiJSIgKyBkaXJlY3RpdmUpCiAgICAgICAgICAgICBmb3VuZCA9IGNvbXBpbGVkLm1hdGNoKHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb3VuZCwgIk1hdGNoaW5nIGZhaWxlZCBvbiAnJXMnIHVzaW5nICclcycgcmVnZXgiICUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgIk1hdGNoaW5nIGZhaWxlZCBvbiAnJXMnIHVzaW5nICclcycgcmVnZXgiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lLnN0cmZ0aW1lKCIlIiArIGRpcmVjdGl2ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWQucGF0dGVybikpCiAKQEAgLTE2OCwxNCArMTY4LDE0IEBACiAgICAgICAgICMgRml4ZXMgYnVnICM2NjEzNTQKICAgICAgICAgdGVzdF9sb2NhbGUgPSBfc3RycHRpbWUuTG9jYWxlVGltZSgpCiAgICAgICAgIHRlc3RfbG9jYWxlLnRpbWV6b25lID0gKGZyb3plbnNldCgpLCBmcm96ZW5zZXQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKF9zdHJwdGltZS5UaW1lUkUodGVzdF9sb2NhbGUpLnBhdHRlcm4oIiVaIikgPT0gJycsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfc3RycHRpbWUuVGltZVJFKHRlc3RfbG9jYWxlKS5wYXR0ZXJuKCIlWiIpID09ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggdGltZXpvbmUgPT0gKCcnLCcnKSwgVGltZVJFKCkucGF0dGVybignJVonKSAhPSAnJyIpCiAKICAgICBkZWYgdGVzdF9tYXRjaGluZ193aXRoX2VzY2FwZXMoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGEgZm9ybWF0IHRoYXQgcmVxdWlyZXMgZXNjYXBpbmcgb2YgY2hhcmFjdGVycyB3b3JrcwogICAgICAgICBjb21waWxlZF9yZSA9IHNlbGYudGltZV9yZS5jb21waWxlKCJcdysgJW0iKQogICAgICAgICBmb3VuZCA9IGNvbXBpbGVkX3JlLm1hdGNoKCJcdysgMTAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZm91bmQsICJFc2NhcGluZyBmYWlsZWQgb2YgZm9ybWF0ICdcdysgMTAnIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiRXNjYXBpbmcgZmFpbGVkIG9mIGZvcm1hdCAnXHcrIDEwJyIpCiAKICAgICBkZWYgdGVzdF9sb2NhbGVfZGF0YV93X3JlZ2V4X21ldGFjaGFyYWN0ZXJzKHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoYXQgaWYgbG9jYWxlIGRhdGEgY29udGFpbnMgcmVnZXggbWV0YWNoYXJhY3RlcnMgdGhleSBhcmUKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9reW8gKHN0YW5kYXJkIHRpbWUpIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoIlRva3lvIChkYXlsaWdodCB0aW1lKSIpKQogICAgICAgICB0aW1lX3JlID0gX3N0cnB0aW1lLlRpbWVSRShsb2NhbGVfdGltZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHRpbWVfcmUuY29tcGlsZSgiJVoiKS5tYXRjaCgiVG9reW8gKHN0YW5kYXJkIHRpbWUpIiksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lX3JlLmNvbXBpbGUoIiVaIikubWF0Y2goIlRva3lvIChzdGFuZGFyZCB0aW1lKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsZSBkYXRhIHRoYXQgY29udGFpbnMgcmVnZXggbWV0YWNoYXJhY3RlcnMgaXMgbm90IgogICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9wZXJseSBlc2NhcGVkIikKIApAQCAtMTk1LDggKzE5NSw4IEBACiAgICAgICAgICMgc28gYXMgdG8gbm90IGFsbG93IHRvIHN1YnBhdHRlcm5zIHRvIGVuZCB1cCBuZXh0IHRvIGVhY2ggb3RoZXIgYW5kCiAgICAgICAgICMgInN0ZWFsIiBjaGFyYWN0ZXJzIGZyb20gZWFjaCBvdGhlci4KICAgICAgICAgcGF0dGVybiA9IHNlbGYudGltZV9yZS5wYXR0ZXJuKCclaiAlSCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgcmUubWF0Y2gocGF0dGVybiwgIjE4MCIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmUubWF0Y2gocGF0dGVybiwgIjE4IDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZS5tYXRjaChwYXR0ZXJuLCAiMTgwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChwYXR0ZXJuLCAiMTggMCIpKQogCiAKIGNsYXNzIFN0cnB0aW1lVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgICIiIkhlbHBlciBmeG4gaW4gdGVzdGluZy4iIiIKICAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlIiArIGRpcmVjdGl2ZSwgc2VsZi50aW1lX3R1cGxlKQogICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dCwgIiUiICsgZGlyZWN0aXZlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RycF9vdXRwdXRbcG9zaXRpb25dID09IHNlbGYudGltZV90dXBsZVtwb3NpdGlvbl0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFtwb3NpdGlvbl0gPT0gc2VsZi50aW1lX3R1cGxlW3Bvc2l0aW9uXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nIG9mICclcycgZGlyZWN0aXZlIGZhaWxlZDsgJyVzJyAtPiAlcyAhPSAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3RpdmUsIHN0cmZfb3V0cHV0LCBzdHJwX291dHB1dFtwb3NpdGlvbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZV90dXBsZVtwb3NpdGlvbl0pKQpAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICAgICAgICBmb3IgYm91bmQgaW4gYm91bmRzOgogICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKGJvdW5kLCAnJXknKQogICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3VsdCA9IGNlbnR1cnkgKyBpbnQoYm91bmQpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cnBfb3V0cHV0WzBdID09IGV4cGVjdGVkX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbMF0gPT0gZXhwZWN0ZWRfcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3knIHRlc3QgZmFpbGVkOyBwYXNzZWQgaW4gJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcmV0dXJuZWQgJyVzJyIgJSAoYm91bmQsIHN0cnBfb3V0cHV0WzBdKSkKIApAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgIHNlbGYuaGVscGVyKCdIJywgMykKICAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlSSAlcCIsIHNlbGYudGltZV90dXBsZSkKICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQsICIlSSAlcCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJwX291dHB1dFszXSA9PSBzZWxmLnRpbWVfdHVwbGVbM10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFszXSA9PSBzZWxmLnRpbWVfdHVwbGVbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGluZyBvZiAnJSVJICUlcCcgZGlyZWN0aXZlIGZhaWxlZDsgJyVzJyAtPiAlcyAhPSAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJmX291dHB1dCwgc3RycF9vdXRwdXRbM10sIHNlbGYudGltZV90dXBsZVszXSkpCiAKQEAgLTI5NCw5ICsyOTQsOSBAQAogICAgICAgICAjIENoZWNrIGZvciBlcXVhbCB0aW1lem9uZSBuYW1lcyBkZWFscyB3aXRoIGJhZCBsb2NhbGUgaW5mbyB3aGVuIHRoaXMKICAgICAgICAgIyBvY2N1cnM7IGZpcnN0IGZvdW5kIGluIEZyZWVCU0QgNC40LgogICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgiVVRDIiwgIiVaIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RycF9vdXRwdXQudG1faXNkc3QsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RycF9vdXRwdXQudG1faXNkc3QsIDApCiAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCJHTVQiLCAiJVoiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJwX291dHB1dC50bV9pc2RzdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJwX291dHB1dC50bV9pc2RzdCwgMCkKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJtYWMiOgogICAgICAgICAgICAgIyBUaW1lem9uZXMgZG9uJ3QgcmVhbGx5IHdvcmsgb24gTWFjT1M5CiAgICAgICAgICAgICByZXR1cm4KQEAgLTMwNSwxMSArMzA1LDExIEBACiAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LCAiJVoiKQogICAgICAgICBsb2NhbGVfdGltZSA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKICAgICAgICAgaWYgdGltZS50em5hbWVbMF0gIT0gdGltZS50em5hbWVbMV0gb3Igbm90IHRpbWUuZGF5bGlnaHQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RycF9vdXRwdXRbOF0gPT0gdGltZV90dXBsZVs4XSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs4XSA9PSB0aW1lX3R1cGxlWzhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lem9uZSBjaGVjayBmYWlsZWQ7ICclcycgLT4gJXMgIT0gJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmZfb3V0cHV0LCBzdHJwX291dHB1dFs4XSwgdGltZV90dXBsZVs4XSkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RycF9vdXRwdXRbOF0gPT0gLTEsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbOF0gPT0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2FsZVRpbWUoKS50aW1lem9uZSBoYXMgZHVwbGljYXRlIHZhbHVlcyBhbmQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZS5kYXlsaWdodCBidXQgdGltZXpvbmUgdmFsdWUgbm90IHNldCB0byAtMSIpCiAKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAgICAgICAgdGltZS50em5hbWUgPSAodHpfbmFtZSwgdHpfbmFtZSkKICAgICAgICAgICAgIHRpbWUuZGF5bGlnaHQgPSAxCiAgICAgICAgICAgICB0el92YWx1ZSA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSh0el9uYW1lLCAiJVoiKVs4XQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHpfdmFsdWUsIC0xLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0el92YWx1ZSwgLTEsCiAgICAgICAgICAgICAgICAgICAgICIlcyBsZWFkIHRvIGEgdGltZXpvbmUgdmFsdWUgb2YgJXMgaW5zdGVhZCBvZiAtMSB3aGVuICIKICAgICAgICAgICAgICAgICAgICAgInRpbWUuZGF5bGlnaHQgc2V0IHRvICVzIGFuZCBwYXNzaW5nIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICh0aW1lLnR6bmFtZSwgdHpfdmFsdWUsIHRpbWUuZGF5bGlnaHQsIHR6X25hbWUpKQpAQCAtMzU0LDI1ICszNTQsMjUgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgJSBzaWducyBhcmUgaGFuZGxlZCBwcm9wZXJseQogICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVtICUlICVZIiwgc2VsZi50aW1lX3R1cGxlKQogICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dCwgIiVtICUlICVZIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cnBfb3V0cHV0WzBdID09IHNlbGYudGltZV90dXBsZVswXSBhbmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzBdID09IHNlbGYudGltZV90dXBsZVswXSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFsxXSA9PSBzZWxmLnRpbWVfdHVwbGVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxpbmcgb2YgcGVyY2VudCBzaWduIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9jYXNlaW5zZW5zaXRpdmUoc2VsZik6CiAgICAgICAgICMgU2hvdWxkIGhhbmRsZSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHkuCiAgICAgICAgIHN0cmZfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJUIiLCBzZWxmLnRpbWVfdHVwbGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQudXBwZXIoKSwgIiVCIiksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQudXBwZXIoKSwgIiVCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAic3RycHRpbWUgZG9lcyBub3QgaGFuZGxlIEFMTC1DQVBTIG5hbWVzIHByb3Blcmx5IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dC5sb3dlcigpLCAiJUIiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dC5sb3dlcigpLCAiJUIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJwdGltZSBkb2VzIG5vdCBoYW5kbGUgbG93ZXJjYXNlIG5hbWVzIHByb3Blcmx5IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dC5jYXBpdGFsaXplKCksICIlQiIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LmNhcGl0YWxpemUoKSwgIiVCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAic3RycHRpbWUgZG9lcyBub3QgaGFuZGxlIGNhcHdvcmQgbmFtZXMgcHJvcGVybHkiKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdHMoc2VsZik6CiAgICAgICAgICMgRGVmYXVsdCByZXR1cm4gdmFsdWUgc2hvdWxkIGJlICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAwKQogICAgICAgICBkZWZhdWx0cyA9ICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkKICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEnLCAnJW0nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RycF9vdXRwdXQgPT0gZGVmYXVsdHMsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dCA9PSBkZWZhdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IHZhbHVlcyBmb3Igc3RycHRpbWUoKSBhcmUgaW5jb3JyZWN0OyIKICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgIT0gJXMiICUgKHN0cnBfb3V0cHV0LCBkZWZhdWx0cykpCiAKQEAgLTM4Myw3ICszODMsNyBAQAogICAgICAgICAjIGVzY2FwZWQuCiAgICAgICAgICMgVGVzdCBpbnN0aWdhdGVkIGJ5IGJ1ZyAjNzk2MTQ5IC4KICAgICAgICAgbmVlZF9lc2NhcGluZyA9ICIuXiQqKz97fVxbXXwpKCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShuZWVkX2VzY2FwaW5nLCBuZWVkX2VzY2FwaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShuZWVkX2VzY2FwaW5nLCBuZWVkX2VzY2FwaW5nKSkKIAogY2xhc3MgU3RycHRpbWUxMkFNUE1UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCBhIF9zdHJwdGltZSByZWdyZXNzaW9uIGluICclSSAlcCcgYXQgMTIgbm9vbiAoMTIgUE0pIiIiCkBAIC00MTYsNyArNDE2LDcgQEAKICAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIlWSAlbSAlZCAlSCAlTSAlUyAldyAlWiIKICAgICAgICAgcmVzdWx0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHRpbWUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZywgc2VsZi50aW1lX3R1cGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXN1bHQudG1feWRheSA9PSBzZWxmLnRpbWVfdHVwbGUudG1feWRheSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC50bV95ZGF5ID09IHNlbGYudGltZV90dXBsZS50bV95ZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0aW9uIG9mIHRtX3lkYXkgZmFpbGVkOyAlcyAhPSAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQudG1feWRheSwgc2VsZi50aW1lX3R1cGxlLnRtX3lkYXkpKQogCkBAIC00MjUsNyArNDI1LDcgQEAKICAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIlWSAlSCAlTSAlUyAldyAlaiAlWiIKICAgICAgICAgcmVzdWx0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHRpbWUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZywgc2VsZi50aW1lX3R1cGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXN1bHQudG1feWVhciA9PSBzZWxmLnRpbWVfdHVwbGUudG1feWVhciBhbmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC50bV95ZWFyID09IHNlbGYudGltZV90dXBsZS50bV95ZWFyIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50bV9tb24gPT0gc2VsZi50aW1lX3R1cGxlLnRtX21vbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudG1fbWRheSA9PSBzZWxmLnRpbWVfdHVwbGUudG1fbWRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxjdWxhdGlvbiBvZiBHcmVnb3JpYW4gZGF0ZSBmYWlsZWQ7IgpAQCAtNDM5LDcgKzQzOSw3IEBACiAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJVkgJW0gJWQgJUggJVMgJWogJVoiCiAgICAgICAgIHJlc3VsdCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSh0aW1lLnN0cmZ0aW1lKGZvcm1hdF9zdHJpbmcsIHNlbGYudGltZV90dXBsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVzdWx0LnRtX3dkYXkgPT0gc2VsZi50aW1lX3R1cGxlLnRtX3dkYXksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQudG1fd2RheSA9PSBzZWxmLnRpbWVfdHVwbGUudG1fd2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxjdWxhdGlvbiBvZiBkYXkgb2YgdGhlIHdlZWsgZmFpbGVkOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgIT0gJXMiICUgKHJlc3VsdC50bV93ZGF5LCBzZWxmLnRpbWVfdHVwbGUudG1fd2RheSkpCiAKQEAgLTQ1Miw3ICs0NTIsNyBAQAogICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCiAgICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKICAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJwX2lucHV0LCBmb3JtYXRfc3RyaW5nKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJwX291dHB1dFs6M10gPT0geW1kX3R1cGxlLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs6M10gPT0geW1kX3R1cGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSB0ZXN0IGZhaWxlZCB3LyAnJXMnOiAlcyAhPSAlcyAoJXMgIT0gJXMpIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfcmVhc29uLCBkaXJlY3RpdmUsIHN0cnBfaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzozXSwgeW1kX3R1cGxlLApAQCAtNDk1LDggKzQ5NSw4IEBACiAgICAgICAgIF9zdHJwdGltZS5fVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lLmxhbmcgPSAiTmkiCiAgICAgICAgIG9yaWdpbmFsX3RpbWVfcmUgPSBpZChfc3RycHRpbWUuX1RpbWVSRV9jYWNoZSkKICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIxMCIsICIlZCIpCi0gICAgICAgIHNlbGYuZmFpbElmRXF1YWwob3JpZ2luYWxfdGltZV9yZSwgaWQoX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oX3N0cnB0aW1lLl9yZWdleF9jYWNoZSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3JpZ2luYWxfdGltZV9yZSwgaWQoX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihfc3RycHRpbWUuX3JlZ2V4X2NhY2hlKSwgMSkKIAogICAgIGRlZiB0ZXN0X3JlZ2V4X2NsZWFudXAoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGNhY2hlZCByZWdleGVzIGFyZSBkaXNjYXJkZWQgd2hlbiBjYWNoZSBiZWNvbWVzICJmdWxsIi4KQEAgLTUwOSw3ICs1MDksNyBAQAogICAgICAgICAgICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZVtib2d1c19rZXldID0gTm9uZQogICAgICAgICAgICAgYm9ndXNfa2V5ICs9IDEKICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIxMCIsICIlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihfc3RycHRpbWUuX3JlZ2V4X2NhY2hlKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oX3N0cnB0aW1lLl9yZWdleF9jYWNoZSksIDEpCiAKICAgICBkZWYgdGVzdF9uZXdfbG9jYWxldGltZShzZWxmKToKICAgICAgICAgIyBBIG5ldyBMb2NhbGVUaW1lIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkIHdoZW4gYSBuZXcgVGltZVJFIG9iamVjdApAQCAtNTE3LDcgKzUxNyw3IEBACiAgICAgICAgIGxvY2FsZV90aW1lX2lkID0gaWQoX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUpCiAgICAgICAgIF9zdHJwdGltZS5fVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lLmxhbmcgPSAiTmkiCiAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgiMTAiLCAiJWQiKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKGxvY2FsZV90aW1lX2lkLAorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGxvY2FsZV90aW1lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkKF9zdHJwdGltZS5fVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lKSkKIAogICAgIGRlZiB0ZXN0X1RpbWVSRV9yZWNyZWF0aW9uKHNlbGYpOgpAQCAtNTM4LDcgKzUzOCw3IEBACiAgICAgICAgICAgICAgICAgIyBHZXQgdGhlIG5ldyBjYWNoZSBvYmplY3QncyBpZC4KICAgICAgICAgICAgICAgICBzZWNvbmRfdGltZV9yZV9pZCA9IGlkKF9zdHJwdGltZS5fVGltZVJFX2NhY2hlKQogICAgICAgICAgICAgICAgICMgVGhleSBzaG91bGQgbm90IGJlIGVxdWFsLgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmRXF1YWwoZmlyc3RfdGltZV9yZV9pZCwgc2Vjb25kX3RpbWVfcmVfaWQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF90aW1lX3JlX2lkLCBzZWNvbmRfdGltZV9yZV9pZCkKICAgICAgICAgICAgICMgUG9zc2libGUgdGVzdCBsb2NhbGUgaXMgbm90IHN1cHBvcnRlZCB3aGlsZSBpbml0aWFsIGxvY2FsZSBpcy4KICAgICAgICAgICAgICMgSWYgdGhpcyBpcyB0aGUgY2FzZSBqdXN0IHN1cHByZXNzIHRoZSBleGNlcHRpb24gYW5kIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgIyB0byB0aGUgcmVzZXRpbmcgdG8gdGhlIG9yaWdpbmFsIGxvY2FsZS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkKaW5kZXggMWNmMzQ4NC4uZWYwNWUzYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LmNhbGNzaXplKHhmbXQpLCBsZW4ocmVzKSkKICAgICAgICAgICAgICAgICByZXYgPSBzdHJ1Y3QudW5wYWNrKHhmbXQsIHJlcylbMF0KICAgICAgICAgICAgICAgICBpZiByZXYgIT0gYXJnOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYXN5KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYXN5KQogCiAgICAgZGVmIHRlc3RfbmF0aXZlX3FRKHNlbGYpOgogICAgICAgICAjIGNhbid0IHBhY2sgLTEgYXMgdW5zaWduZWQgcmVnYXJkbGVzcwpAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZyh4KQogICAgICAgICAgICAgICAgICAgICBpZiB4IDwgMDoKICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICs9IDFMIDw8IHNlbGYuYml0c2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZCA+IDApCiAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gaGV4KGV4cGVjdGVkKVsyOi0xXSAjIGNob3AgIjB4IiBhbmQgdHJhaWxpbmcgJ0wnCiAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihleHBlY3RlZCkgJiAxOgogICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAiMCIgKyBleHBlY3RlZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdHNlcS5weQppbmRleCA4M2M3Y2NmLi41NzgzY2NiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdHNlcS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdHNlcS5weQpAQCAtMjgsNyArMjgsNyBAQAogCiAgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKICAgICAgICAgdCA9IHRpbWUuZ210aW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcHIodCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHQpKQogICAgICAgICB0ID0gdGltZS5nbXRpbWUoMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLAogICAgICAgICAgICAgInRpbWUuc3RydWN0X3RpbWUodG1feWVhcj0xOTcwLCB0bV9tb249MSwgdG1fbWRheT0xLCB0bV9ob3VyPTAsICIKQEAgLTUwLDggKzUwLDggQEAKICAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKICAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCiAgICAgICAgIGZvciBpdGVtIGluIHQxOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGl0ZW0gaW4gdDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtNDIgbm90IGluIHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW0gaW4gdDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtNDIgbm90IGluIHQxKQogCiAgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKICAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCkBAIC02MSwxMSArNjEsMTEgQEAKICAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCiAgICAgICAgIHQyID0gdHlwZSh0MSkodDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQotICAgICAgICBzZWxmLmFzc2VydF8obm90ICh0MSA8IHQyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHQxIDw9IHQyKQotICAgICAgICBzZWxmLmFzc2VydF8obm90ICh0MSA+IHQyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHQxID49IHQyKQotICAgICAgICBzZWxmLmFzc2VydF8obm90ICh0MSAhPSB0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHQxIDwgdDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHQxID4gdDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPj0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHQxICE9IHQyKSkKIAogICAgIGRlZiB0ZXN0X2ZpZWxkcyhzZWxmKToKICAgICAgICAgdCA9IHRpbWUuZ210aW1lKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQppbmRleCAwZGRhYzNkLi5jNDQxY2RjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CkBAIC00OTcsNyArNDk3LDcgQEAKICAgICAgICAgIyBidXQsIGJhc2VkIG9uIHN5c3RlbSBzY2hlZHVsaW5nIHdlIGNhbid0IGNvbnRyb2wsIGl0J3MgcG9zc2libGUKICAgICAgICAgIyBwb2xsKCkgbmV2ZXIgcmV0dXJuZWQgTm9uZS4gIEl0ICJzaG91bGQgYmUiIHZlcnkgcmFyZSB0aGF0IGl0CiAgICAgICAgICMgZGlkbid0IGdvIGFyb3VuZCBhdCBsZWFzdCB0d2ljZS4KLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvdW50ID49IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3VudCA+PSAyKQogICAgICAgICAjIFN1YnNlcXVlbnQgaW52b2NhdGlvbnMgc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSByZXR1cm5jb2RlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb2xsKCksIDApCiAKQEAgLTY1Miw3ICs2NTIsNyBAQAogICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImlucHV0KCkiXSkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQogICAgICAgICAgICAgcC5zZW5kX3NpZ25hbChzaWduYWwuU0lHSU5UKQogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwLndhaXQoKSwgMCkKIApAQCAtNjYwLDcgKzY2MCw3IEBACiAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImlucHV0KCkiXSkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQogICAgICAgICAgICAgcC5raWxsKCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIC1zaWduYWwuU0lHS0lMTCkKIApAQCAtNjY4LDcgKzY2OCw3IEBACiAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImlucHV0KCkiXSkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQogICAgICAgICAgICAgcC50ZXJtaW5hdGUoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgLXNpZ25hbC5TSUdURVJNKQogCkBAIC03NDYsNyArNzQ2LDcgQEAKICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJpbnB1dCgpIl0pCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhwLnBvbGwoKSBpcyBOb25lLCBwLnBvbGwoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwLnBvbGwoKSBpcyBOb25lLCBwLnBvbGwoKSkKICAgICAgICAgICAgIHAuc2VuZF9zaWduYWwoc2lnbmFsLlNJR1RFUk0pCiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHAud2FpdCgpLCAwKQogCkBAIC03NTQsNyArNzU0LDcgQEAKICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW5wdXQoKSJdKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCiAgICAgICAgICAgICBwLmtpbGwoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwLndhaXQoKSwgMCkKIApAQCAtNzYyLDcgKzc2Miw3IEBACiAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImlucHV0KCkiXSkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQogICAgICAgICAgICAgcC50ZXJtaW5hdGUoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwLndhaXQoKSwgMCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IGRkMWYwMDUuLjRiMTRjM2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgICAgICAgICAgICAgICMgdG8gbWFrZSBzdXJlIHRoZXkgd29yay4gV2Ugc3RpbGwgd2FudCB0byBhdm9pZCB1c2luZwogICAgICAgICAgICAgICAgICMgdG9vIG11Y2ggbWVtb3J5LCB0aG91Z2gsIGJ1dCB3ZSBkbyB0aGF0IG5vaXNpbHkuCiAgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IDUxNDcKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihtYXhzaXplICogbWVtdXNlICsgb3ZlcmhlYWQgPiAyMCAqIF8xTSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1heHNpemUgKiBtZW11c2UgKyBvdmVyaGVhZCA+IDIwICogXzFNKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBtYXhzaXplID0gaW50KChtYXhfbWVtdXNlIC0gb3ZlcmhlYWQpIC8gbWVtdXNlKQogICAgICAgICAgICAgICAgIGlmIG1heHNpemUgPCBtaW5zaXplOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkKaW5kZXggMmRlMzBhZS4uYzlkMjA1NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5bXRhYmxlLnB5CkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudG9wLmxvb2t1cCgibmFtZXNwYWNlX3Rlc3QiKS5pc19uYW1lc3BhY2UoKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnNwYW0ubG9va3VwKCJ4IikuaXNfbmFtZXNwYWNlKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudG9wLmxvb2t1cCgic3BhbSIpLmdldF9uYW1lc3BhY2UoKSBpcyBzZWxmLnNwYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5sb29rdXAoInNwYW0iKS5nZXRfbmFtZXNwYWNlKCkgaXMgc2VsZi5zcGFtKQogICAgICAgICBuc190ZXN0ID0gc2VsZi50b3AubG9va3VwKCJuYW1lc3BhY2VfdGVzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5zX3Rlc3QuZ2V0X25hbWVzcGFjZXMoKSksIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5zX3Rlc3QuZ2V0X25hbWVzcGFjZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXMucHkKaW5kZXggMzQ5M2ZkMS4uMGUzNjRhZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXMucHkKQEAgLTE5LDcgKzE5LDcgQEAKIAogICAgICAgICBkaChOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAiIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoYXNhdHRyKF9fYnVpbHRpbl9fLCAiXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoX19idWlsdGluX18sICJfIikpCiAgICAgICAgIGRoKDQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAiNDJcbiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX19idWlsdGluX18uXywgNDIpCkBAIC01OSw3ICs1OSw3IEBACiAgICAgICAgICAgICBlaCgqc3lzLmV4Y19pbmZvKCkpCiAKICAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVzdGRlcnIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVyci5nZXR2YWx1ZSgpLmVuZHN3aXRoKCJWYWx1ZUVycm9yOiA0MlxuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnIuZ2V0dmFsdWUoKS5lbmRzd2l0aCgiVmFsdWVFcnJvcjogNDJcbiIpKQogCiAgICAgIyBGSVhNRTogdGVzdGluZyB0aGUgY29kZSBmb3IgYSBsb3N0IG9yIHJlcGxhY2VkIGV4Y2VwdGhvb2sgaW4KICAgICAjIFB5dGhvbi9weXRob25ydW4uYzo6UHlFcnJfUHJpbnRFeCgpIGlzIHRyaWNreS4KQEAgLTcxLDE2ICs3MSwxNiBAQAogICAgICAgICAjIGNoZWNrIHRoYXQgaXQgd29ya2VkLgogICAgICAgICBkZWYgY2xlYXJfY2hlY2soZXhjKToKICAgICAgICAgICAgIHR5cCwgdmFsdWUsIHRyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwIGlzIG5vdCBOb25lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZhbHVlIGlzIGV4YykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0cmFjZWJhY2sgaXMgbm90IE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwIGlzIG5vdCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGlzIGV4YykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWJhY2sgaXMgbm90IE5vbmUpCiAKICAgICAgICAgICAgIHN5cy5leGNfY2xlYXIoKQogCiAgICAgICAgICAgICB0eXAsIHZhbHVlLCB0cmFjZWJhY2sgPSBzeXMuZXhjX2luZm8oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cCBpcyBOb25lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZhbHVlIGlzIE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHJhY2ViYWNrIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWJhY2sgaXMgTm9uZSkKIAogICAgICAgICBkZWYgY2xlYXIoKToKICAgICAgICAgICAgIHRyeToKQEAgLTEwMCwxMCArMTAwLDEwIEBACiAgICAgICAgICAgICBjbGVhcigpCiAgICAgICAgICAgICB0eXAyLCB2YWx1ZTIsIHRyYWNlYmFjazIgPSBzeXMuZXhjX2luZm8oKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwMSBpcyB0eXAyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZhbHVlMSBpcyBleGMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUxIGlzIHZhbHVlMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0cmFjZWJhY2sxIGlzIHRyYWNlYmFjazIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwMSBpcyB0eXAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlMSBpcyBleGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUxIGlzIHZhbHVlMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWJhY2sxIGlzIHRyYWNlYmFjazIpCiAKICAgICAgICAgIyBDaGVjayB0aGF0IGFuIGV4Y2VwdGlvbiBjYW4gYmUgY2xlYXJlZCBvdXRzaWRlIG9mIGFuIGV4Y2VwdCBibG9jawogICAgICAgICBjbGVhcl9jaGVjayhleGMpCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgaWYgdGVzdC50ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nLCA0MikKICAgICAgICAgICAgICMgY2FuJ3QgY2hlY2sgbW9yZSB0aGFuIHRoZSB0eXBlLCBhcyB0aGUgdXNlciBtaWdodCBoYXZlIGNoYW5nZWQgaXQKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgc3RyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgc3RyKSkKIAogICAgICMgdGVzdGluZyBzeXMuc2V0dHJhY2UoKSBpcyBkb25lIGluIHRlc3RfdHJhY2UucHkKICAgICAjIHRlc3Rpbmcgc3lzLnNldHByb2ZpbGUoKSBpcyBkb25lIGluIHRlc3RfcHJvZmlsZS5weQpAQCAtMjAyLDE3ICsyMDIsMTcgQEAKICAgICBkZWYgdGVzdF9nZXR3aW5kb3dzdmVyc2lvbihzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXR3aW5kb3dzdmVyc2lvbiIpOgogICAgICAgICAgICAgdiA9IHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2LCB0dXBsZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2LCB0dXBsZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgNSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZbMF0sIGludCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2WzFdLCBpbnQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodlsyXSwgaW50KSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZbM10sIGludCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2WzRdLCBzdHIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodlswXSwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZbMV0sIGludCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2WzJdLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodlszXSwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZbNF0sIHN0cikpCiAKICAgICBkZWYgdGVzdF9kbG9wZW5mbGFncyhzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICJzZXRkbG9wZW5mbGFncyIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc3lzLCAiZ2V0ZGxvcGVuZmxhZ3MiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHN5cywgImdldGRsb3BlbmZsYWdzIikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5nZXRkbG9wZW5mbGFncywgNDIpCiAgICAgICAgICAgICBvbGRmbGFncyA9IHN5cy5nZXRkbG9wZW5mbGFncygpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5zZXRkbG9wZW5mbGFncykKQEAgLTIzMywxMiArMjMzLDEyIEBACiAgICAgICAgIGRlbCBuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KE5vbmUpLCBjKQogICAgICAgICBpZiBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5nZXR0b3RhbHJlZmNvdW50KCksIGludCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMuZ2V0dG90YWxyZWZjb3VudCgpLCBpbnQpKQogCiAgICAgZGVmIHRlc3RfZ2V0ZnJhbWUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLl9nZXRmcmFtZSwgNDIsIDQyKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzeXMuX2dldGZyYW1lLCAyMDAwMDAwMDAwKQotICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgIFN5c01vZHVsZVRlc3QudGVzdF9nZXRmcmFtZS5pbV9mdW5jLmZ1bmNfY29kZSBcCiAgICAgICAgICAgICBpcyBzeXMuX2dldGZyYW1lKCkuZl9jb2RlCiAgICAgICAgICkKQEAgLTI4OSwxMiArMjg5LDEyIEBACiAgICAgICAgIGQgPSBzeXMuX2N1cnJlbnRfZnJhbWVzKCkKIAogICAgICAgICBtYWluX2lkID0gdGhyZWFkLmdldF9pZGVudCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYWluX2lkIGluIGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0aHJlYWRfaWQgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haW5faWQgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRocmVhZF9pZCBpbiBkKQogCiAgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhcHR1cmVkIG1haW4tdGhyZWFkIGZyYW1lIGlzIF90aGlzXyBmcmFtZS4KICAgICAgICAgZnJhbWUgPSBkLnBvcChtYWluX2lkKQotICAgICAgICBzZWxmLmFzc2VydF8oZnJhbWUgaXMgc3lzLl9nZXRmcmFtZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZnJhbWUgaXMgc3lzLl9nZXRmcmFtZSgpKQogCiAgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhcHR1cmVkIHRocmVhZCBmcmFtZSBpcyBibG9ja2VkIGluIGc0NTYsIGNhbGxlZAogICAgICAgICAjIGZyb20gZjEyMy4gIFRoaXMgaXMgYSBsaXR0ZSB0cmlja3ksIHNpbmNlIHZhcmlvdXMgYml0cyBvZgpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICMgQW5kIHRoZSBuZXh0IHJlY29yZCBtdXN0IGJlIGZvciBnNDU2KCkuCiAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lLCBzb3VyY2VsaW5lID0gc3RhY2tbaSsxXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmNuYW1lLCAiZzQ1NiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhzb3VyY2VsaW5lIGluIFsibGVhdmVfZy53YWl0KCkiLCAiZW50ZXJlZF9nLnNldCgpIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb3VyY2VsaW5lIGluIFsibGVhdmVfZy53YWl0KCkiLCAiZW50ZXJlZF9nLnNldCgpIl0pCiAKICAgICAgICAgIyBSZWFwIHRoZSBzcGF3bmVkIHRocmVhZC4KICAgICAgICAgbGVhdmVfZy5zZXQoKQpAQCAtMzI0LDY3ICszMjQsNjcgQEAKICAgICAgICAgIyAidGhyZWFkIGlkIiAwLgogICAgICAgICBkID0gc3lzLl9jdXJyZW50X2ZyYW1lcygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8oMCBpbiBkKQotICAgICAgICBzZWxmLmFzc2VydF8oZFswXSBpcyBzeXMuX2dldGZyYW1lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkWzBdIGlzIHN5cy5fZ2V0ZnJhbWUoKSkKIAogICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5hcGlfdmVyc2lvbiwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmFyZ3YsIGxpc3QpKQotICAgICAgICBzZWxmLmFzc2VydF8oc3lzLmJ5dGVvcmRlciBpbiAoImxpdHRsZSIsICJiaWciKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzLCB0dXBsZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5jb3B5cmlnaHQsIGJhc2VzdHJpbmcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuZXhlY19wcmVmaXgsIGJhc2VzdHJpbmcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuZXhlY3V0YWJsZSwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5hcGlfdmVyc2lvbiwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLmFyZ3YsIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLmJ5dGVvcmRlciBpbiAoImxpdHRsZSIsICJiaWciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5jb3B5cmlnaHQsIGJhc2VzdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMuZXhlY19wcmVmaXgsIGJhc2VzdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMuZXhlY3V0YWJsZSwgYmFzZXN0cmluZykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN5cy5mbG9hdF9pbmZvKSwgMTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmZsb2F0X2luZm8ucmFkaXgsIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN5cy5sb25nX2luZm8pLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdCAlIDUgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN5cy5sb25nX2luZm8uc2l6ZW9mX2RpZ2l0ID49IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMubG9uZ19pbmZvLmJpdHNfcGVyX2RpZ2l0ICUgNSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLmxvbmdfaW5mby5zaXplb2ZfZGlnaXQgPj0gMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHN5cy5sb25nX2luZm8uYml0c19wZXJfZGlnaXQpLCBpbnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzeXMubG9uZ19pbmZvLnNpemVvZl9kaWdpdCksIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmhleHZlcnNpb24sIGludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5tYXhpbnQsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5oZXh2ZXJzaW9uLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMubWF4aW50LCBpbnQpKQogICAgICAgICBpZiB0ZXN0LnRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMubWF4dW5pY29kZSwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLnBsYXRmb3JtLCBiYXNlc3RyaW5nKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLnByZWZpeCwgYmFzZXN0cmluZykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy52ZXJzaW9uLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5tYXh1bmljb2RlLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMucGxhdGZvcm0sIGJhc2VzdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMucHJlZml4LCBiYXNlc3RyaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLnZlcnNpb24sIGJhc2VzdHJpbmcpKQogICAgICAgICB2aSA9IHN5cy52ZXJzaW9uX2luZm8KLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmlbOl0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmlbOl0sIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmkpLCA1KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aVswXSwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmlbMV0sIGludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpWzJdLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8odmlbM10gaW4gKCJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIsICJmaW5hbCIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aVs0XSwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmkubWFqb3IsIGludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpLm1pbm9yLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aS5taWNybywgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHZpLnJlbGVhc2VsZXZlbCBpbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2aVswXSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmlbMV0sIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZpWzJdLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmlbM10gaW4gKCJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIsICJmaW5hbCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2aVs0XSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmkubWFqb3IsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZpLm1pbm9yLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2aS5taWNybywgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpLnJlbGVhc2VsZXZlbCBpbgogICAgICAgICAgICAgICAgICAgICAgKCJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIsICJmaW5hbCIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aS5zZXJpYWwsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZpLnNlcmlhbCwgaW50KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aVswXSwgdmkubWFqb3IpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlbMV0sIHZpLm1pbm9yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzJdLCB2aS5taWNybykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aVszXSwgdmkucmVsZWFzZWxldmVsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzRdLCB2aS5zZXJpYWwpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aSA+ICgxLDAsMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aSA+ICgxLDAsMCkpCiAKICAgICBkZWYgdGVzdF80MzU4MShzZWxmKToKICAgICAgICAgIyBDYW4ndCB1c2Ugc3lzLnN0ZG91dCwgYXMgdGhpcyBpcyBhIGNTdHJpbmdJTyBvYmplY3Qgd2hlbgogICAgICAgICAjIHRoZSB0ZXN0IHJ1bnMgdW5kZXIgcmVncnRlc3QuCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzeXMuX19zdGRvdXRfXy5lbmNvZGluZyA9PSBzeXMuX19zdGRlcnJfXy5lbmNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5fX3N0ZG91dF9fLmVuY29kaW5nID09IHN5cy5fX3N0ZGVycl9fLmVuY29kaW5nKQogCiAgICAgZGVmIHRlc3Rfc3lzX2ZsYWdzKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3lzLmZsYWdzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLmZsYWdzKQogICAgICAgICBhdHRycyA9ICgiZGVidWciLCAicHkza193YXJuaW5nIiwgImRpdmlzaW9uX3dhcm5pbmciLCAiZGl2aXNpb25fbmV3IiwKICAgICAgICAgICAgICAgICAgImluc3BlY3QiLCAiaW50ZXJhY3RpdmUiLCAib3B0aW1pemUiLCAiZG9udF93cml0ZV9ieXRlY29kZSIsCiAgICAgICAgICAgICAgICAgICJub19zaXRlIiwgImlnbm9yZV9lbnZpcm9ubWVudCIsICJ0YWJjaGVjayIsICJ2ZXJib3NlIiwKICAgICAgICAgICAgICAgICAgInVuaWNvZGUiLCAiYnl0ZXNfd2FybmluZyIpCiAgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc3lzLmZsYWdzLCBhdHRyKSwgYXR0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHN5cy5mbGFncywgYXR0ciksIGF0dHIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZ2V0YXR0cihzeXMuZmxhZ3MsIGF0dHIpKSwgaW50LCBhdHRyKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwcihzeXMuZmxhZ3MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihzeXMuZmxhZ3MpKQogCiAgICAgZGVmIHRlc3RfY2xlYXJfdHlwZV9jYWNoZShzZWxmKToKICAgICAgICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCBlZTY4MTE4Li5hYmEyMThkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQogICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAogICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfZmlsZW9ial9yZWFkbGluZXMoc2VsZik6CkBAIC02OSwxMSArNjksMTEgQEAKIAogICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQogICAgICAgICBsaW5lczIgPSBmb2JqMi5yZWFkbGluZXMoKQotICAgICAgICBzZWxmLmFzc2VydF8obGluZXMxID09IGxpbmVzMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMSA9PSBsaW5lczIsCiAgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihsaW5lczIpID09IDExNCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihsaW5lczIpID09IDExNCwKICAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQotICAgICAgICBzZWxmLmFzc2VydF8obGluZXMyWzgzXSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczJbODNdID09IFwKICAgICAgICAgICAgICAgICAiSSB3aWxsIGdsYWRseSBhZG1pdCB0aGF0IFB5dGhvbiBpcyBub3QgdGhlIGZhc3Rlc3QgcnVubmluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UuXG4iLAogICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpCiAKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQogICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQogICAgICAgICBsaW5lczIgPSBbbGluZSBmb3IgbGluZSBpbiBmb2JqMl0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmVzMSA9PSBsaW5lczIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczEgPT0gbGluZXMyLAogICAgICAgICAgICAgICAgICAgICAgImZpbGVvYmouX19pdGVyX18oKSBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfZmlsZW9ial9zZWVrKHNlbGYpOgpAQCAtOTgsNDMgKzk4LDQzIEBACiAKICAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCiAgICAgICAgIGZvYmouc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8oMCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoMjA0OCwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDIwNDggPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyMDQ4ID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBhYnNvbHV0ZSBwb3NpdGlvbiBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoLTEwMjQsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygxMDI0ID09IGZvYmoudGVsbCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoMTAyNCA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKICAgICAgICAgZm9iai5zZWVrKDEwMjQsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygyMDQ4ID09IGZvYmoudGVsbCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoMjA0OCA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gcG9zaXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKICAgICAgICAgcyA9IGZvYmoucmVhZCgxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMgPT0gZGF0YVsyMDQ4OjIwNThdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSBkYXRhWzIwNDg6MjA1OF0sCiAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKICAgICAgICAgZm9iai5zZWVrKDAsIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnNpemUgPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnNpemUgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZvYmoucmVhZCgpID09ICIiLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5yZWFkKCkgPT0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGF0IGZpbGUncyBlbmQgZGlkIG5vdCByZXR1cm4gZW1wdHkgc3RyaW5nIikKICAgICAgICAgZm9iai5zZWVrKC10YXJpbmZvLnNpemUsIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCiAgICAgICAgIGZvYmouc2Vlayg1MTIpCiAgICAgICAgIHMxID0gZm9iai5yZWFkbGluZXMoKQogICAgICAgICBmb2JqLnNlZWsoNTEyKQogICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMxID09IHMyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgPT0gczIsCiAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmb2JqLnJlYWRsaW5lKCkpID09IGZvYmoudGVsbCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGZvYmoucmVhZGxpbmUoKSkgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKICAgICAgICAgZm9iai5zZWVrKDUxMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmb2JqLnJlYWRsaW5lKCkpICsgNTEyID09IGZvYmoudGVsbCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGZvYmoucmVhZGxpbmUoKSkgKyA1MTIgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHNlZWsoKSBhbmQgcmVhZGxpbmUoKSBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoMCkKICAgICAgICAgbGluZSA9IGZvYmoucmVhZGxpbmUoKQotICAgICAgICBzZWxmLmFzc2VydF8oZm9iai5yZWFkKCkgPT0gZGF0YVtsZW4obGluZSk6XSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoucmVhZCgpID09IGRhdGFbbGVuKGxpbmUpOl0sCiAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKICAgICAgICAgZm9iai5jbG9zZSgpCiAKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICAjIE9sZCBWNyB0YXJzIGNyZWF0ZSBkaXJlY3RvcnkgbWVtYmVycyB1c2luZyBhbiBBUkVHVFlQRQogICAgICAgICAjIGhlYWRlciB3aXRoIGEgIi8iIGFwcGVuZGVkIHRvIHRoZSBmaWxlbmFtZSBmaWVsZC4KICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9kaXJ0eXBlLW9sZC12NyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5ESVJUWVBFLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuRElSVFlQRSwKICAgICAgICAgICAgICAgICAidjcgZGlydHlwZSBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfeHN0YXJfdHlwZShzZWxmKToKQEAgLTIxOSwxNSArMjE5LDE1IEBACiAKICAgICBkZWYgdGVzdF9jaGVja19tZW1iZXJzKHNlbGYpOgogICAgICAgICBmb3IgdGFyaW5mbyBpbiBzZWxmLnRhcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQodGFyaW5mby5tdGltZSkgPT0gMDc2MDYxMzY2MTcsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHRhcmluZm8ubXRpbWUpID09IDA3NjA2MTM2NjE3LAogICAgICAgICAgICAgICAgICAgICAid3JvbmcgbXRpbWUgZm9yICVzIiAlIHRhcmluZm8ubmFtZSkKICAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvLm5hbWUuc3RhcnRzd2l0aCgidXN0YXIvIik6CiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnVuYW1lID09ICJ0YXJmaWxlIiwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnVuYW1lID09ICJ0YXJmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgIndyb25nIHVuYW1lIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCiAKICAgICBkZWYgdGVzdF9maW5kX21lbWJlcnMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRhci5nZXRtZW1iZXJzKClbLTFdLm5hbWUgPT0gIm1pc2MvZW9mIiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGFyLmdldG1lbWJlcnMoKVstMV0ubmFtZSA9PSAibWlzYy9lb2YiLAogICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZmluZCBhbGwgbWVtYmVycyIpCiAKICAgICBkZWYgdGVzdF9leHRyYWN0X2hhcmRsaW5rKHNlbGYpOgpAQCAtMjc2LDcgKzI3Niw3IEBACiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5uZXh0KCkgIyBnZXQgInJlZ3R5cGUiIChjYW4ndCB1c2UgZ2V0bWVtYmVyKQogICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAogICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfcHJvdm9rZV9zdHJlYW1fZXJyb3Ioc2VsZik6CkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICAgICAgICAgIHQyID0gdGFyMi5uZXh0KCkKICAgICAgICAgICAgIGlmIHQxIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0MiBpcyBub3QgTm9uZSwgInN0cmVhbS5uZXh0KCkgZmFpbGVkLiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgaXMgbm90IE5vbmUsICJzdHJlYW0ubmV4dCgpIGZhaWxlZC4iKQogCiAgICAgICAgICAgICBpZiB0Mi5pc2xuaygpIG9yIHQyLmlzc3ltKCk6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgdGFyMi5leHRyYWN0ZmlsZSwgdDIpCkBAIC0zMDMsOCArMzAzLDggQEAKICAgICAgICAgICAgIHYyID0gdGFyMi5leHRyYWN0ZmlsZSh0MikKICAgICAgICAgICAgIGlmIHYxIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodjIgaXMgbm90IE5vbmUsICJzdHJlYW0uZXh0cmFjdGZpbGUoKSBmYWlsZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYxLnJlYWQoKSA9PSB2Mi5yZWFkKCksICJzdHJlYW0gZXh0cmFjdGlvbiBmYWlsZWQiKQogCiAgICAgICAgIHRhcjEuY2xvc2UoKQogCkBAIC0zNjUsNyArMzY1LDcgQEAKIAogICAgIGRlZiBfdGVzdF9tZW1iZXIoc2VsZiwgdGFyaW5mbywgY2hrc3VtPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgaWYgY2hrc3VtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1kNXN1bShzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKS5yZWFkKCkpID09IGNoa3N1bSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZDVzdW0oc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykucmVhZCgpKSA9PSBjaGtzdW0sCiAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBtZDVzdW0gZm9yICVzIiAlIHRhcmluZm8ubmFtZSkKIAogICAgICAgICBrd2FyZ3NbIm10aW1lIl0gPSAwNzYwNjEzNjYxNwpAQCAtMzc2LDcgKzM3Niw3IEBACiAgICAgICAgICAgICBrd2FyZ3NbInVuYW1lIl0gPSAidGFyZmlsZSIKICAgICAgICAgICAgIGt3YXJnc1siZ25hbWUiXSA9ICJ0YXJmaWxlIgogICAgICAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZ2V0YXR0cih0YXJpbmZvLCBrKSA9PSB2LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldGF0dHIodGFyaW5mbywgaykgPT0gdiwKICAgICAgICAgICAgICAgICAgICAgIndyb25nIHZhbHVlIGluICVzIGZpZWxkIG9mICVzIiAlIChrLCB0YXJpbmZvLm5hbWUpKQogCiAgICAgZGVmIHRlc3RfZmluZF9yZWd0eXBlKHNlbGYpOgpAQCAtNDI1LDcgKzQyNSw3IEBACiAKICAgICBkZWYgdGVzdF9maW5kX3VzdGFyX2xvbmduYW1lKHNlbGYpOgogICAgICAgICBuYW1lID0gInVzdGFyLyIgKyAiMTIzNDUvIiAqIDM5ICsgIjEyMzQ1NjcvbG9uZ25hbWUiCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhuYW1lIGluIHNlbGYudGFyLmdldG5hbWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIHNlbGYudGFyLmdldG5hbWVzKCkpCiAKICAgICBkZWYgdGVzdF9maW5kX3JlZ3R5cGVfb2xkdjcoc2VsZik6CiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS1vbGQtdjciKQpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImxvbmduYW1lIG5vdCBmb3VuZCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgIT0gdGFyZmlsZS5ESVJUWVBFLCAicmVhZCBsb25nbmFtZSBhcyBkaXJ0eXBlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSAhPSB0YXJmaWxlLkRJUlRZUEUsICJyZWFkIGxvbmduYW1lIGFzIGRpcnR5cGUiKQogCiAgICAgZGVmIHRlc3RfcmVhZF9sb25nbGluayhzZWxmKToKICAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKQEAgLTQ1NSw3ICs0NTUsNyBAQAogICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbGluaykKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJsb25nbGluayBub3QgZm91bmQiKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby5saW5rbmFtZSA9PSBsb25nbmFtZSwgImxpbmtuYW1lIHdyb25nIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8ubGlua25hbWUgPT0gbG9uZ25hbWUsICJsaW5rbmFtZSB3cm9uZyIpCiAKICAgICBkZWYgdGVzdF90cnVuY2F0ZWRfbG9uZ25hbWUoc2VsZik6CiAgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCkBAIC00ODYsNyArNDg2LDcgQEAKICAgICAgICAgZm9iajEgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMSkKICAgICAgICAgdGFyaW5mbzIgPSBzZWxmLnRhci5nZXRtZW1iZXIoImdudS9zcGFyc2UiKQogICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8yKQotICAgICAgICBzZWxmLmFzc2VydF8oZm9iajEucmVhZCgpID09IGZvYmoyLnJlYWQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoxLnJlYWQoKSA9PSBmb2JqMi5yZWFkKCksCiAgICAgICAgICAgICAgICAgInNwYXJzZSBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKIAogCkBAIC01MzUsNyArNTM1LDcgQEAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCiAgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygiZm9vIikpCiAgICAgICAgIHRhci5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLmNsb3NlZCBpcyBGYWxzZSwgImV4dGVybmFsIGZpbGVvYmpzIG11c3QgbmV2ZXIgY2xvc2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmouY2xvc2VkIGlzIEZhbHNlLCAiZXh0ZXJuYWwgZmlsZW9ianMgbXVzdCBuZXZlciBjbG9zZWQiKQogCiAKIGNsYXNzIFdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToKQEAgLTU1NCw3ICs1NTQsNyBAQAogICAgICAgICB0YXIuY2xvc2UoKQogCiAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyLmdldG5hbWVzKClbMF0gPT0gbmFtZSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpWzBdID09IG5hbWUsCiAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzdG9yZSAxMDAgY2hhciBmaWxlbmFtZSIpCiAgICAgICAgIHRhci5jbG9zZSgpCiAKQEAgLTU2Nyw3ICs1NjcsNyBAQAogICAgICAgICBmb2JqLmNsb3NlKCkKICAgICAgICAgdGFyLmFkZChwYXRoKQogICAgICAgICB0YXIuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpID4gMCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZ2V0c2l6ZSh0bXBuYW1lKSA+IDAsCiAgICAgICAgICAgICAgICAgInRhcmZpbGUgaXMgZW1wdHkiKQogCiAgICAgIyBUaGUgdGVzdF8qX3NpemUgdGVzdHMgdGVzdCBmb3IgYnVnICMxMTY3MTI4LgpAQCAtNjI4LDE2ICs2MjgsMTYgQEAKICAgICAgICAgZHN0bmFtZSA9IG9zLnBhdGguYWJzcGF0aCh0bXBuYW1lKQogCiAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIubmFtZSA9PSBkc3RuYW1lLCAiYXJjaGl2ZSBuYW1lIG11c3QgYmUgYWJzb2x1dGUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLm5hbWUgPT0gZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikKIAogICAgICAgICB0YXIuYWRkKGRzdG5hbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCiAKICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKICAgICAgICAgb3MuY2hkaXIoVEVNUERJUikKICAgICAgICAgdGFyLmFkZChkc3RuYW1lKQogICAgICAgICBvcy5jaGRpcihjd2QpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCiAKICAgICBkZWYgdGVzdF9leGNsdWRlKHNlbGYpOgogICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJleGNsdWRlIikKQEAgLTY3OCwxNCArNjc4LDE0IEBACiAgICAgICAgICAgICBkZWMgPSBiejIuQloyRGVjb21wcmVzc29yKCkKICAgICAgICAgICAgIGRhdGEgPSBvcGVuKHRtcG5hbWUsICJyYiIpLnJlYWQoKQogICAgICAgICAgICAgZGF0YSA9IGRlYy5kZWNvbXByZXNzKGRhdGEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRlYy51bnVzZWRfZGF0YSkgPT0gMCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGVjLnVudXNlZF9kYXRhKSA9PSAwLAogICAgICAgICAgICAgICAgICAgICAiZm91bmQgdHJhaWxpbmcgZGF0YSIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAicmIiKQogICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCiAgICAgICAgICAgICBmb2JqLmNsb3NlKCkKIAotICAgICAgICBzZWxmLmFzc2VydF8oZGF0YS5jb3VudCgiXDAiKSA9PSB0YXJmaWxlLlJFQ09SRFNJWkUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhLmNvdW50KCJcMCIpID09IHRhcmZpbGUuUkVDT1JEU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IHplcm8gcGFkZGluZyIpCiAKIApAQCAtNzI1LDE0ICs3MjUsMTQgQEAKIAogICAgICAgICB2MSA9IHNlbGYuX2NhbGNfc2l6ZShuYW1lLCBsaW5rKQogICAgICAgICB2MiA9IHRhci5vZmZzZXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHYxID09IHYyLCAiR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MSA9PSB2MiwgIkdOVSBsb25nbmFtZS9sb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQogCiAgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCiAgICAgICAgIG1lbWJlciA9IHRhci5uZXh0KCkKLSAgICAgICAgc2VsZi5mYWlsSWYobWVtYmVyIGlzIE5vbmUsICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby5uYW1lID09IG1lbWJlci5uYW1lIGFuZCBcCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVtYmVyIGlzIE5vbmUsICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5uYW1lID09IG1lbWJlci5uYW1lIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID09IG1lbWJlci5saW5rbmFtZSwgXAogICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCiAKQEAgLTc5MiwxOCArNzkyLDE4IEBACiAgICAgICAgICMgVGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIGFzIGEgUkVHVFlQRSBldmVyeQogICAgICAgICAjIHRpbWUgcmVnYXJkbGVzcyBvZiBzdF9ubGluay4KICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5mb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuUkVHVFlQRSwKICAgICAgICAgICAgICAgICAiYWRkIGZpbGUgYXMgcmVndWxhciBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfYWRkX2hhcmRsaW5rKHNlbGYpOgogICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmJhcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkxOS1RZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5MTktUWVBFLAogICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyBoYXJkbGluayBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfZGVyZWZlcmVuY2VfaGFyZGxpbmsoc2VsZik6CiAgICAgICAgIHNlbGYudGFyLmRlcmVmZXJlbmNlID0gVHJ1ZQogICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmJhcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAogICAgICAgICAgICAgICAgICJkZXJlZmVyZW5jaW5nIGhhcmRsaW5rIGZhaWxlZCIpCiAKIApAQCAtODIzLDEwICs4MjMsMTAgQEAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCiAgICAgICAgIGlmIGxpbms6CiAgICAgICAgICAgICBsID0gdGFyLmdldG1lbWJlcnMoKVswXS5saW5rbmFtZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmsgPT0gbCwgIlBBWCBsb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmsgPT0gbCwgIlBBWCBsb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbiA9IHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgPT0gbiwgIlBBWCBsb25nbmFtZSBjcmVhdGlvbiBmYWlsZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgPT0gbiwgIlBBWCBsb25nbmFtZSBjcmVhdGlvbiBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfcGF4X2dsb2JhbF9oZWFkZXIoc2VsZik6CiAgICAgICAgIHBheF9oZWFkZXJzID0gewpAQCAtODQ4LDggKzg0OCw4IEBACiAKICAgICAgICAgIyBUZXN0IGlmIGFsbCB0aGUgZmllbGRzIGFyZSB1bmljb2RlLgogICAgICAgICBmb3Iga2V5LCB2YWwgaW4gdGFyLnBheF9oZWFkZXJzLml0ZXJpdGVtcygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoa2V5KSBpcyB1bmljb2RlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodmFsKSBpcyB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoa2V5KSBpcyB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodmFsKSBpcyB1bmljb2RlKQogICAgICAgICAgICAgaWYga2V5IGluIHRhcmZpbGUuUEFYX05VTUJFUl9GSUVMRFM6CiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLlBBWF9OVU1CRVJfRklFTERTW2tleV0odmFsKQpAQCAtODk3LDcgKzg5Nyw3IEBACiAgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPWVuY29kaW5nKQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh0YXIuZ2V0bmFtZXMoKVswXSkgaXMgbm90IHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHRhci5nZXRuYW1lcygpWzBdKSBpcyBub3QgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpWzBdLm5hbWUsIG5hbWUuZW5jb2RlKGVuY29kaW5nKSkKICAgICAgICAgdGFyLmNsb3NlKCkKIApAQCAtOTIxLDEwICs5MjEsMTAgQEAKICAgICBkZWYgdGVzdF91bmljb2RlX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgInIiLCBlbmNvZGluZz0iaXNvODg1OS0xIiwgZXJyb3JzPSJzdHJpY3QiKQogICAgICAgICBmb3IgdCBpbiB0YXI6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh0Lm5hbWUpIGlzIHN0cikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQubGlua25hbWUpIGlzIHN0cikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQudW5hbWUpIGlzIHN0cikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQuZ25hbWUpIGlzIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQubmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5saW5rbmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC51bmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5nbmFtZSkgaXMgc3RyKQogICAgICAgICB0YXIuY2xvc2UoKQogCiAgICAgZGVmIHRlc3RfdW5hbWVfdW5pY29kZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CmluZGV4IDhiODgzYjAuLjdmMGI4YjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weQpAQCAtNTksNyArNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlICclcycgZG9lcyBub3QgZW5kIHdpdGggJyVzJyIgJSAobmJhc2UsIHN1ZikpCiAKICAgICAgICAgbmJhc2UgPSBuYmFzZVtsZW4ocHJlKTpsZW4obmJhc2UpLWxlbihzdWYpXQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5zdHJfY2hlY2subWF0Y2gobmJhc2UpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zdHJfY2hlY2subWF0Y2gobmJhc2UpLAogICAgICAgICAgICAgICAgICAgICAgInJhbmRvbSBzdHJpbmcgJyVzJyBkb2VzIG5vdCBtYXRjaCAvXlthLXpBLVowLTlfLV17Nn0kLyIKICAgICAgICAgICAgICAgICAgICAgICUgbmJhc2UpCiAKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgZm9yIGtleSBpbiBkaWN0OgogICAgICAgICAgICAgaWYga2V5WzBdICE9ICdfJyBhbmQga2V5IG5vdCBpbiBleHBlY3RlZDoKICAgICAgICAgICAgICAgICB1bmV4cC5hcHBlbmQoa2V5KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKHVuZXhwKSA9PSAwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHVuZXhwKSA9PSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQga2V5czogJXMiICUgdW5leHApCiAKIHRlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9leHBvcnRzKQpAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgICAgIGZvciBpIGluIHhyYW5nZShURVNUX0ZJTEVTKToKICAgICAgICAgICAgIHMgPSByLm5leHQoKQogICAgICAgICAgICAgc2VsZi5uYW1lQ2hlY2socywgJycsICcnLCAnJykKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKHMgaW4gZGljdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocyBpbiBkaWN0KQogICAgICAgICAgICAgZGljdFtzXSA9IDEKIAogICAgIGRlZiB0ZXN0X3N1cHBvcnRzX2l0ZXIoc2VsZik6CkBAIC0xNDAsOSArMTQwLDkgQEAKIAogICAgICAgICBjYW5kID0gdGVtcGZpbGUuX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QoKQogCi0gICAgICAgIHNlbGYuZmFpbElmKGxlbihjYW5kKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihjYW5kKSA9PSAwKQogICAgICAgICBmb3IgYyBpbiBjYW5kOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYywgYmFzZXN0cmluZyksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjLCBiYXNlc3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3RyaW5nIiAlIGMpCiAKICAgICBkZWYgdGVzdF93YW50ZWRfZGlycyhzZWxmKToKQEAgLTE2MCwxNCArMTYwLDE0IEBACiAgICAgICAgICAgICBmb3IgZW52bmFtZSBpbiAnVE1QRElSJywgJ1RFTVAnLCAnVE1QJzoKICAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuZ2V0ZW52KGVudm5hbWUpCiAgICAgICAgICAgICAgICAgaWYgbm90IGRpcm5hbWU6IHJhaXNlIFZhbHVlRXJyb3IKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZGlybmFtZSBpbiBjYW5kKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXJuYW1lIGluIGNhbmQpCiAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuZ2V0Y3dkKCkKICAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIG9zLmVycm9yKToKICAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkaXJuYW1lIGluIGNhbmQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlybmFtZSBpbiBjYW5kKQogCiAgICAgICAgICAgICAjIE5vdCBwcmFjdGljYWwgdG8gdHJ5IHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgT1Mtc3BlY2lmaWMKICAgICAgICAgICAgICMgcGF0aHMgaW4gdGhpcyBsaXN0LgpAQCAtMTg0LDE0ICsxODQsMTQgQEAKICAgICBkZWYgdGVzdF9yZXR2YWwoc2VsZik6CiAgICAgICAgICMgX2dldF9jYW5kaWRhdGVfbmFtZXMgcmV0dXJucyBhIF9SYW5kb21OYW1lU2VxdWVuY2Ugb2JqZWN0CiAgICAgICAgIG9iaiA9IHRlbXBmaWxlLl9nZXRfY2FuZGlkYXRlX25hbWVzKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uob2JqLCB0ZW1wZmlsZS5fUmFuZG9tTmFtZVNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob2JqLCB0ZW1wZmlsZS5fUmFuZG9tTmFtZVNlcXVlbmNlKSkKIAogICAgIGRlZiB0ZXN0X3NhbWVfdGhpbmcoc2VsZik6CiAgICAgICAgICMgX2dldF9jYW5kaWRhdGVfbmFtZXMgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0CiAgICAgICAgIGEgPSB0ZW1wZmlsZS5fZ2V0X2NhbmRpZGF0ZV9uYW1lcygpCiAgICAgICAgIGIgPSB0ZW1wZmlsZS5fZ2V0X2NhbmRpZGF0ZV9uYW1lcygpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X19nZXRfY2FuZGlkYXRlX25hbWVzKQogCkBAIC0zMDAsOSArMzAwLDkgQEAKICAgICAgICAgICAgIGRlY29yYXRlZCA9IHN5cy5leGVjdXRhYmxlCiAKICAgICAgICAgcmV0dmFsID0gb3Muc3Bhd25sKG9zLlBfV0FJVCwgc3lzLmV4ZWN1dGFibGUsIGRlY29yYXRlZCwgdGVzdGVyLCB2LCBmZCkKLSAgICAgICAgc2VsZi5mYWlsSWYocmV0dmFsIDwgMCwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXR2YWwgPCAwLAogICAgICAgICAgICAgICAgICAgICAiY2hpbGQgcHJvY2VzcyBjYXVnaHQgZmF0YWwgc2lnbmFsICVkIiAlIC1yZXR2YWwpCi0gICAgICAgIHNlbGYuZmFpbElmKHJldHZhbCA+IDAsICJjaGlsZCBwcm9jZXNzIHJlcG9ydHMgZmFpbHVyZSAlZCIlcmV0dmFsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJldHZhbCA+IDAsICJjaGlsZCBwcm9jZXNzIHJlcG9ydHMgZmFpbHVyZSAlZCIlcmV0dmFsKQogCiAgICAgZGVmIHRlc3RfdGV4dG1vZGUoc2VsZik6CiAgICAgICAgICMgX21rc3RlbXBfaW5uZXIgY2FuIGNyZWF0ZSBmaWxlcyBpbiB0ZXh0IG1vZGUKQEAgLTMyMiw4ICszMjIsOCBAQAogICAgICAgICAjIGdldHRlbXBwcmVmaXggcmV0dXJucyBhIG5vbmVtcHR5IHByZWZpeCBzdHJpbmcKICAgICAgICAgcCA9IHRlbXBmaWxlLmdldHRlbXBwcmVmaXgoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHAsIGJhc2VzdHJpbmcpKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHApID4gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocCwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocCkgPiAwKQogCiAgICAgZGVmIHRlc3RfdXNhYmxlX3RlbXBsYXRlKHNlbGYpOgogICAgICAgICAjIGdldHRlbXBwcmVmaXggcmV0dXJucyBhIHVzYWJsZSBwcmVmaXggc3RyaW5nCkBAIC0zNTQsOSArMzU0LDkgQEAKICAgICAgICAgIyBnZXR0ZW1wZGlyIHJldHVybnMgYSBkaXJlY3Rvcnkgd2hpY2ggZXhpc3RzCiAKICAgICAgICAgZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzYWJzKGRpcikgb3IgZGlyID09IG9zLmN1cmRpciwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNhYnMoZGlyKSBvciBkaXIgPT0gb3MuY3VyZGlyLAogICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoIiAlIGRpcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIoZGlyKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIoZGlyKSwKICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgZGlyKQogCiAgICAgZGVmIHRlc3RfZGlyZWN0b3J5X3dyaXRhYmxlKHNlbGYpOgpAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgICAgIGEgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKICAgICAgICAgYiA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCiAKIHRlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9nZXR0ZW1wZGlyKQogCkBAIC01ODAsNyArNTgwLDcgQEAKICAgICBkZWYgdGVzdF9jcmVhdGVzX25hbWVkKHNlbGYpOgogICAgICAgICAjIE5hbWVkVGVtcG9yYXJ5RmlsZSBjcmVhdGVzIGZpbGVzIHdpdGggbmFtZXMKICAgICAgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lZFRlbXBvcmFyeUZpbGUgJXMgZG9lcyBub3QgZXhpc3QiICUgZi5uYW1lKQogCiAgICAgZGVmIHRlc3RfZGVsX29uX2Nsb3NlKHNlbGYpOgpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgICAgICAgICBmID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRpcj1kaXIpCiAgICAgICAgICAgICBmLndyaXRlKCdibGF0JykKICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lZFRlbXBvcmFyeUZpbGUgJXMgZXhpc3RzIGFmdGVyIGNsb3NlIiAlIGYubmFtZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKQEAgLTYwNCw3ICs2MDQsNyBAQAogICAgICAgICAgICAgdG1wID0gZi5uYW1lCiAgICAgICAgICAgICBmLndyaXRlKCdibGF0JykKICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguZXhpc3RzKGYubmFtZSksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lZFRlbXBvcmFyeUZpbGUgJXMgbWlzc2luZyBhZnRlciBjbG9zZSIgJSBmLm5hbWUpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpZiB0bXAgaXMgbm90IE5vbmU6CkBAIC02MjUsMTIgKzYyNSwxMiBAQAogICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKICAgICAgICAgIyBBIE5hbWVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgogICAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGY6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5leGlzdHMoZi5uYW1lKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3MucGF0aC5leGlzdHMoZi5uYW1lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKGYubmFtZSkpCiAgICAgICAgIGRlZiB1c2VfY2xvc2VkKCk6CiAgICAgICAgICAgICB3aXRoIGY6CiAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKIAogICAgICMgSG93IHRvIHRlc3QgdGhlIG1vZGUgYW5kIGJ1ZnNpemUgcGFyYW1ldGVycz8KIApAQCAtNjUzLDIxICs2NTMsMjEgQEAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKICAgICAgICAgIyBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gY3JlYXRlIGZpbGVzCiAgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCiAgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZShtYXhfc2l6ZT0xMDAsIHByZT0iYSIsIHN1Zj0iLnR4dCIpCi0gICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCiAKICAgICBkZWYgdGVzdF9kZWxfb25fY2xvc2Uoc2VsZik6CiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBpcyBkZWxldGVkIHdoZW4gY2xvc2VkCiAgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MTAsIGRpcj1kaXIpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgICAgIGYud3JpdGUoJ2JsYXQgJyAqIDUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5fcm9sbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKICAgICAgICAgICAgIGZpbGVuYW1lID0gZi5uYW1lCiAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZmlsZW5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIlNwb29sZWRUZW1wb3JhcnlGaWxlICVzIGV4aXN0cyBhZnRlciBjbG9zZSIgJSBmaWxlbmFtZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKQEAgLTY3NSw0NiArNjc1LDQ2IEBACiAgICAgZGVmIHRlc3RfcmV3cml0ZV9zbWFsbChzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB3cml0dGVuIHRvIG11bHRpcGxlIHdpdGhpbiB0aGUgbWF4X3NpemUKICAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKICAgICAgICAgICAgIGYuc2VlaygwLCAwKQogICAgICAgICAgICAgZi53cml0ZSgneCcgKiAyMCkKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKIAogICAgIGRlZiB0ZXN0X3dyaXRlX3NlcXVlbnRpYWwoc2VsZik6CiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBzaG91bGQgaG9sZCBleGFjdGx5IG1heF9zaXplIGJ5dGVzLCBhbmQgcm9sbAogICAgICAgICAjIG92ZXIgYWZ0ZXJ3YXJkCiAgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZShtYXhfc2l6ZT0zMCkKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgZi53cml0ZSgneCcgKiAyMCkKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgZi53cml0ZSgneCcgKiAxMCkKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgZi53cml0ZSgneCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCiAKICAgICBkZWYgdGVzdF9zcGFyc2Uoc2VsZik6CiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSB0aGF0IGlzIHdyaXR0ZW4gbGF0ZSBpbiB0aGUgZmlsZSB3aWxsIGV4dGVuZAogICAgICAgICAjIHdoZW4gdGhhdCBvY2N1cnMKICAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmLnNlZWsoMTAwLCAwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmLndyaXRlKCd4JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKIAogICAgIGRlZiB0ZXN0X2ZpbGVubyhzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIHNob3VsZCByb2xsIG92ZXIgdG8gYSByZWFsIGZpbGUgb24gZmlsZW5vKCkKICAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmLmZpbGVubygpID4gMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmZpbGVubygpID4gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKIAogICAgIGRlZiB0ZXN0X211bHRpcGxlX2Nsb3NlX2JlZm9yZV9yb2xsb3ZlcihzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSBjbG9zZWQgbWFueSB0aW1lcyB3aXRob3V0IGVycm9yCiAgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZSgpCiAgICAgICAgIGYud3JpdGUoJ2FiY1xuJykKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGYuY2xvc2UoKQpAQCAtNzI2LDcgKzcyNiw3IEBACiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgY2xvc2VkIG1hbnkgdGltZXMgd2l0aG91dCBlcnJvcgogICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkKICAgICAgICAgZi53cml0ZSgnYWJjXG4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZi5jbG9zZSgpCkBAIC03NDYsNDYgKzc0Niw0NiBAQAogICAgICAgICB3cml0ZSgiYSIgKiAzNSkKICAgICAgICAgd3JpdGUoImIiICogMzUpCiAgICAgICAgIHNlZWsoMCwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlYWQoNzApID09ICdhJyozNSArICdiJyozNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWQoNzApID09ICdhJyozNSArICdiJyozNSkKIAogICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9iZWZvcmVfcm9sbG92ZXIoc2VsZik6CiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgogICAgICAgICB3aXRoIHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEpIGFzIGY6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihmLmNsb3NlZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuY2xvc2VkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAgICAgICAgIGRlZiB1c2VfY2xvc2VkKCk6CiAgICAgICAgICAgICB3aXRoIGY6CiAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKIAogICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9kdXJpbmdfcm9sbG92ZXIoc2VsZik6CiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgogICAgICAgICB3aXRoIHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEpIGFzIGY6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgICAgIGYud3JpdGUoJ2FiY1xuJykKICAgICAgICAgICAgIGYuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuX3JvbGxlZCkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYuY2xvc2VkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5jbG9zZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQogICAgICAgICBkZWYgdXNlX2Nsb3NlZCgpOgogICAgICAgICAgICAgd2l0aCBmOgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCiAKICAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfYWZ0ZXJfcm9sbG92ZXIoc2VsZik6CiAgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgogICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkKICAgICAgICAgZi53cml0ZSgnYWJjXG4nKQogICAgICAgICBmLmZsdXNoKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKICAgICAgICAgd2l0aCBmOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZi5jbG9zZWQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmLmNsb3NlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKICAgICAgICAgZGVmIHVzZV9jbG9zZWQoKToKICAgICAgICAgICAgIHdpdGggZjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQogCiAKIHRlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9TcG9vbGVkVGVtcG9yYXJ5RmlsZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKaW5kZXggNDYzZDBkOC4uMjMzY2NmNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLm5ydW5uaW5nLmluYygpCiAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5ucnVubmluZy5nZXQoKSwgJ3Rhc2tzIGFyZSBydW5uaW5nJwotICAgICAgICAgICAgICAgIHNlbGYudGVzdGNhc2UuYXNzZXJ0XyhzZWxmLm5ydW5uaW5nLmdldCgpIDw9IDMpCisgICAgICAgICAgICAgICAgc2VsZi50ZXN0Y2FzZS5hc3NlcnRUcnVlKHNlbGYubnJ1bm5pbmcuZ2V0KCkgPD0gMykKIAogICAgICAgICAgICAgdGltZS5zbGVlcChkZWxheSkKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CkBAIC00OSw3ICs0OSw3IEBACiAKICAgICAgICAgICAgIHdpdGggc2VsZi5tdXRleDoKICAgICAgICAgICAgICAgICBzZWxmLm5ydW5uaW5nLmRlYygpCi0gICAgICAgICAgICAgICAgc2VsZi50ZXN0Y2FzZS5hc3NlcnRfKHNlbGYubnJ1bm5pbmcuZ2V0KCkgPj0gMCkKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3RjYXNlLmFzc2VydFRydWUoc2VsZi5ucnVubmluZy5nZXQoKSA+PSAwKQogICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgIHByaW50ICclcyBpcyBmaW5pc2hlZC4gJWQgdGFza3MgYXJlIHJ1bm5pbmcnICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLm5ydW5uaW5nLmdldCgpKQpAQCAtNzMsMTggKzczLDE4IEBACiAgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTVRBU0tTKToKICAgICAgICAgICAgIHQgPSBUZXN0VGhyZWFkKCI8dGhyZWFkICVkPiIlaSwgc2VsZiwgc2VtYSwgbXV0ZXgsIG51bXJ1bm5pbmcpCiAgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodC5pZGVudCwgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5tYXRjaCgnPFRlc3RUaHJlYWRcKC4qLCBpbml0aWFsXCk+JywgcmVwcih0KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaWRlbnQsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxUZXN0VGhyZWFkXCguKiwgaW5pdGlhbFwpPicsIHJlcHIodCkpKQogICAgICAgICAgICAgdC5zdGFydCgpCiAKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICd3YWl0aW5nIGZvciBhbGwgdGFza3MgdG8gY29tcGxldGUnCiAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CiAgICAgICAgICAgICB0LmpvaW4oTlVNVEFTS1MpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IHQuaXNfYWxpdmUoKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmRXF1YWwodC5pZGVudCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdC5pc19hbGl2ZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0LmlkZW50LCAwKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0LmlkZW50IGlzIE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocmUubWF0Y2goJzxUZXN0VGhyZWFkXCguKiwgXHcrIC0/XGQrXCk+JywgcmVwcih0KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxUZXN0VGhyZWFkXCguKiwgXHcrIC0/XGQrXCk+JywgcmVwcih0KSkpCiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAnYWxsIHRhc2tzIGRvbmUnCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtcnVubmluZy5nZXQoKSwgMCkKQEAgLTE0Miw4ICsxNDIsOCBAQAogICAgICAgICB0aWQgPSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZChmLCAobXV0ZXgsKSkKICAgICAgICAgIyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaC4KICAgICAgICAgbXV0ZXguYWNxdWlyZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0aWQgaW4gdGhyZWFkaW5nLl9hY3RpdmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHRocmVhZGluZy5fYWN0aXZlW3RpZF0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aWQgaW4gdGhyZWFkaW5nLl9hY3RpdmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHRocmVhZGluZy5fYWN0aXZlW3RpZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZGluZy5fRHVtbXlUaHJlYWQpKQogICAgICAgICBkZWwgdGhyZWFkaW5nLl9hY3RpdmVbdGlkXQogCkBAIC0yMDMsNyArMjAzLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJldCkKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICIgICAgdmVyaWZ5aW5nIHdvcmtlciBoYXNuJ3QgZXhpdGVkIgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHQuZmluaXNoZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdC5maW5pc2hlZCkKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICIgICAgYXR0ZW1wdGluZyB0byByYWlzZSBhc3luY2ggZXhjZXB0aW9uIGluIHdvcmtlciIKICAgICAgICAgcmVzdWx0ID0gc2V0X2FzeW5jX2V4YyhjdHlwZXMuY19sb25nKHQuaWQpLCBleGNlcHRpb24pCkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICIgICAgd2FpdGluZyBmb3Igd29ya2VyIHRvIHNheSBpdCBjYXVnaHQgdGhlIGV4Y2VwdGlvbiIKICAgICAgICAgd29ya2VyX3Nhd19leGNlcHRpb24ud2FpdCh0aW1lb3V0PTEwKQotICAgICAgICBzZWxmLmFzc2VydF8odC5maW5pc2hlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuZmluaXNoZWQpCiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiICAgIGFsbCBPSyAtLSBqb2luaW5nIHdvcmtlciIKICAgICAgICAgaWYgdC5maW5pc2hlZDoKQEAgLTI4Miw4ICsyODIsOCBAQAogCiAgICAgICAgICAgICBzeXMuc2V0dHJhY2UoZnVuYykKICAgICAgICAgICAgICIiIl0pCi0gICAgICAgIHNlbGYuZmFpbElmKHJjID09IDIsICJpbnRlcnByZXRlZCB3YXMgYmxvY2tlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyYyA9PSAwLCAiVW5leHBlY3RlZCBlcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmMgPT0gMiwgImludGVycHJldGVkIHdhcyBibG9ja2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJjID09IDAsICJVbmV4cGVjdGVkIGVycm9yIikKIAogCiAgICAgZGVmIHRlc3RfZW51bWVyYXRlX2FmdGVyX2pvaW4oc2VsZik6CkBAIC0zNTQsOCArMzU0LDggQEAKICAgICAgICAgcmMgPSBwLndhaXQoKQogICAgICAgICBkYXRhID0gcC5zdGRvdXQucmVhZCgpLnJlcGxhY2UoJ1xyJywgJycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgImVuZCBvZiBtYWluXG5lbmQgb2YgdGhyZWFkXG4iKQotICAgICAgICBzZWxmLmZhaWxJZihyYyA9PSAyLCAiaW50ZXJwcmV0ZXIgd2FzIGJsb2NrZWQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmMgPT0gMCwgIlVuZXhwZWN0ZWQgZXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJjID09IDIsICJpbnRlcnByZXRlciB3YXMgYmxvY2tlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyYyA9PSAwLCAiVW5leHBlY3RlZCBlcnJvciIpCiAKICAgICBkZWYgdGVzdF8xX2pvaW5fb25fc2h1dGRvd24oc2VsZik6CiAgICAgICAgICMgVGhlIHVzdWFsIGNhc2U6IG9uIGV4aXQsIHdhaXQgZm9yIGEgbm9uLWRhZW1vbiB0aHJlYWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nX2xvY2FsLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHkKaW5kZXggODY0MjE0MS4uZmMyYzM0MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHkKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgbG9jYWwuc29tZW90aGVydmFyID0gTm9uZQogICAgICAgICBnYy5jb2xsZWN0KCkKICAgICAgICAgZGVhZGxpc3QgPSBbd2VhayBmb3Igd2VhayBpbiB3ZWFrbGlzdCBpZiB3ZWFrKCkgaXMgTm9uZV0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkZWFkbGlzdCkgaW4gKG4tMSwgbiksIChuLCBsZW4oZGVhZGxpc3QpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkZWFkbGlzdCkgaW4gKG4tMSwgbiksIChuLCBsZW4oZGVhZGxpc3QpKSkKIAogICAgIGRlZiB0ZXN0X2Rlcml2ZWQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgMzA4ODogaWYgdGhlcmUgaXMgYSB0aHJlYWRzIHN3aXRjaCBpbnNpZGUgdGhlIF9faW5pdF9fCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKaW5kZXggYjUxNTViNC4uOTY1ZjdlMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQpAQCAtMTgsOSArMTgsOSBAQAogICAgICAgICB0aW1lLmNsb2NrKCkKIAogICAgIGRlZiB0ZXN0X2NvbnZlcnNpb25zKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8odGltZS5jdGltZShzZWxmLnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLmN0aW1lKHNlbGYudCkKICAgICAgICAgICAgICAgICAgICAgID09IHRpbWUuYXNjdGltZSh0aW1lLmxvY2FsdGltZShzZWxmLnQpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxvbmcodGltZS5ta3RpbWUodGltZS5sb2NhbHRpbWUoc2VsZi50KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb25nKHRpbWUubWt0aW1lKHRpbWUubG9jYWx0aW1lKHNlbGYudCkpKQogICAgICAgICAgICAgICAgICAgICAgPT0gbG9uZyhzZWxmLnQpKQogCiAgICAgZGVmIHRlc3Rfc2xlZXAoc2VsZik6CkBAIC0xNDgsMzYgKzE0OCwzNiBAQAogICAgICAgICAgICAgdGltZS50enNldCgpCiAgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gdXRjCiAgICAgICAgICAgICB0aW1lLnR6c2V0KCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICB0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKQogICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUuZGF5bGlnaHQsIDApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLnRpbWV6b25lLCAwKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmRheWxpZ2h0LCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnRpbWV6b25lLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikudG1faXNkc3QsIDApCiAKICAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGNhbiBzd2l0Y2ggdG8gVVMvRWFzdGVybgogICAgICAgICAgICAgZW52aXJvblsnVFonXSA9IGVhc3Rlcm4KICAgICAgICAgICAgIHRpbWUudHpzZXQoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWZFcXVhbCh0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUudHpuYW1lLCAoJ0VTVCcsICdFRFQnKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbih0aW1lLnR6bmFtZSksIDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLmRheWxpZ2h0LCAxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS50aW1lem9uZSwgMTgwMDApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLmFsdHpvbmUsIDE0NDAwKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAwKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGltZS5nbXRpbWUoeG1hczIwMDIpLCB0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUudHpuYW1lLCAoJ0VTVCcsICdFRFQnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5kYXlsaWdodCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS50aW1lem9uZSwgMTgwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuYWx0em9uZSwgMTQ0MDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKS50bV9pc2RzdCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKIAogICAgICAgICAgICAgIyBOb3cgZ28gdG8gdGhlIHNvdXRoZXJuIGhlbWlzcGhlcmUuCiAgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gdmljdG9yaWEKICAgICAgICAgICAgIHRpbWUudHpzZXQoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWZFcXVhbCh0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0aW1lLnR6bmFtZVswXSA9PSAnQUVTVCcsIHN0cih0aW1lLnR6bmFtZVswXSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZS50em5hbWVbMV0gPT0gJ0FFRFQnLCBzdHIodGltZS50em5hbWVbMV0pKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUuZGF5bGlnaHQsIDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLnRpbWV6b25lLCAtMzYwMDApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLmFsdHpvbmUsIC0zOTYwMCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKS50bV9pc2RzdCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGltZS5nbXRpbWUoeG1hczIwMDIpLCB0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50em5hbWVbMF0gPT0gJ0FFU1QnLCBzdHIodGltZS50em5hbWVbMF0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUudHpuYW1lWzFdID09ICdBRURUJywgc3RyKHRpbWUudHpuYW1lWzFdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5kYXlsaWdodCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS50aW1lem9uZSwgLTM2MDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmFsdHpvbmUsIC0zOTYwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAxKQogCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAjIFJlcGFpciBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBjYXNlIGFueSBvdGhlciB0ZXN0cwpAQCAtMjA5LDE0ICsyMDksMTQgQEAKICAgICAgICAgZ3QxID0gdGltZS5nbXRpbWUoTm9uZSkKICAgICAgICAgdDAgPSB0aW1lLm1rdGltZShndDApCiAgICAgICAgIHQxID0gdGltZS5ta3RpbWUoZ3QxKQotICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSAodDEtdDApIDwgMC4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSAodDEtdDApIDwgMC4yKQogCiAgICAgZGVmIHRlc3RfbG9jYWx0aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgogICAgICAgICBsdDAgPSB0aW1lLmxvY2FsdGltZSgpCiAgICAgICAgIGx0MSA9IHRpbWUubG9jYWx0aW1lKE5vbmUpCiAgICAgICAgIHQwID0gdGltZS5ta3RpbWUobHQwKQogICAgICAgICB0MSA9IHRpbWUubWt0aW1lKGx0MSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDAgPD0gKHQxLXQwKSA8IDAuMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gKHQxLXQwKSA8IDAuMikKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGltZVRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CmluZGV4IDAyNjg3YjAuLjA0Y2ZiZTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKQEAgLTExOSwxMSArMTE5LDExIEBACiAgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KF90aW1lb3V0KQogCiAgICAgICAgIF90MSA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5jb25uZWN0LCBhZGRyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5jb25uZWN0LCBhZGRyKQogICAgICAgICBfdDIgPSB0aW1lLnRpbWUoKQogCiAgICAgICAgIF9kZWx0YSA9IGFicyhfdDEgLSBfdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhfZGVsdGEgPCBfdGltZW91dCArIHNlbGYuZnV6eiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAogICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgKCVnKSBpcyBtb3JlIHRoYW4gJWcgc2Vjb25kcyBtb3JlIHRoYW4gZXhwZWN0ZWQgKCVnKSIKICAgICAgICAgICAgICAgICAgICAgICUoX2RlbHRhLCBzZWxmLmZ1enosIF90aW1lb3V0KSkKIApAQCAtMTM0LDExICsxMzQsMTEgQEAKICAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoX3RpbWVvdXQpCiAKICAgICAgICAgX3QxID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLnJlY3YsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLnJlY3YsIDEwMjQpCiAgICAgICAgIF90MiA9IHRpbWUudGltZSgpCiAKICAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCiAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzICVnIHNlY29uZHMgbW9yZSB0aGFuIGV4cGVjdGVkICglZykiCiAgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCiAKQEAgLTE1MCwxMSArMTUwLDExIEBACiAgICAgICAgIHNlbGYuc29jay5saXN0ZW4oNSkKIAogICAgICAgICBfdDEgPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2suYWNjZXB0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5hY2NlcHQpCiAgICAgICAgIF90MiA9IHRpbWUudGltZSgpCiAKICAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCiAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzICVnIHNlY29uZHMgbW9yZSB0aGFuIGV4cGVjdGVkICglZykiCiAgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCiAKQEAgLTE2NiwxMSArMTY2LDExIEBACiAgICAgICAgIHNlbGYuc29jay5iaW5kKHNlbGYuYWRkcl9sb2NhbCkKIAogICAgICAgICBfdDEgPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2sucmVjdmZyb20sIDgxOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLnJlY3Zmcm9tLCA4MTkyKQogICAgICAgICBfdDIgPSB0aW1lLnRpbWUoKQogCiAgICAgICAgIF9kZWx0YSA9IGFicyhfdDEgLSBfdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhfZGVsdGEgPCBfdGltZW91dCArIHNlbGYuZnV6eiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAogICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgKCVnKSBpcyAlZyBzZWNvbmRzIG1vcmUgdGhhbiBleHBlY3RlZCAoJWcpIgogICAgICAgICAgICAgICAgICAgICAgJShfZGVsdGEsIHNlbGYuZnV6eiwgX3RpbWVvdXQpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CmluZGV4IDExNDBhOTQuLmIyOTg2OWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CkBAIC0zNywxNiArMzcsMTYgQEAKICAgICBkZWYgdGVzdF9jYXJldChzZWxmKToKICAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJyZXR1cm4geCEiKQotICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAotICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLmZpbmQoIiEiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGVycikgPT0gNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyclsxXS5zdHJpcCgpID09ICJyZXR1cm4geCEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLmZpbmQoIiEiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQogCiAgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3Jfd2l0aF9jYXJldF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQotICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAotICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzJdLmNvdW50KCdcbicpID09IDEpICMgYW5kIG5vIGFkZGl0aW9uYWwgbmV3bGluZQotICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLmZpbmQoIisiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzJdLmNvdW50KCdcbicpID09IDEpICMgYW5kIG5vIGFkZGl0aW9uYWwgbmV3bGluZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLmZpbmQoIisiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQogCiAgICAgZGVmIHRlc3Rfbm9jYXJldChzZWxmKToKICAgICAgICAgaWYgaXNfanl0aG9uOgpAQCAtNTQsMTYgKzU0LDE2IEBACiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRob3V0X2NhcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJbeCBmb3IgeCBpbiB4XSA9IHgiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGVycikgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyclsxXS5zdHJpcCgpID09ICJbeCBmb3IgeCBpbiB4XSA9IHgiKQogCiAgICAgZGVmIHRlc3RfYmFkX2luZGVudGF0aW9uKHNlbGYpOgogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRhdGlvbkVycm9yKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJwcmludCAyIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uZmluZCgiMiIpID09IGVyclsyXS5maW5kKCJeIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXJyKSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLnN0cmlwKCkgPT0gInByaW50IDIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl4iIGluIGVyclsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyclsxXS5maW5kKCIyIikgPT0gZXJyWzJdLmZpbmQoIl4iKSkKIAogICAgIGRlZiB0ZXN0X2J1ZzczNzQ3MyhzZWxmKToKICAgICAgICAgaW1wb3J0IHN5cywgb3MsIHRlbXBmaWxlLCB0aW1lCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICB0ZXN0X2J1ZzczNzQ3My50ZXN0KCkKICAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgogICAgICAgICAgICAgICAgIHNyYyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHN5cy5leGNfdHJhY2ViYWNrKVstMV1bLTFdCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3JjLCAncmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmMsICdyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yJykKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRwYXRoCiAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKHRlc3RkaXIpOgpAQCAtMTgxLDkgKzE4MSw5IEBACiAgICAgICAgIHRiX2xpbmVzID0gcHl0aG9uX2ZtdC5zcGxpdGxpbmVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHRiX2xpbmVzKSwgMykKICAgICAgICAgYmFubmVyLCBsb2NhdGlvbiwgc291cmNlX2xpbmUgPSB0Yl9saW5lcwotICAgICAgICBzZWxmLmFzc2VydF8oYmFubmVyLnN0YXJ0c3dpdGgoJ1RyYWNlYmFjaycpKQotICAgICAgICBzZWxmLmFzc2VydF8obG9jYXRpb24uc3RhcnRzd2l0aCgnICBGaWxlJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhzb3VyY2VfbGluZS5zdGFydHN3aXRoKCcgICAgcmFpc2UnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhbm5lci5zdGFydHN3aXRoKCdUcmFjZWJhY2snKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2F0aW9uLnN0YXJ0c3dpdGgoJyAgRmlsZScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc291cmNlX2xpbmUuc3RhcnRzd2l0aCgnICAgIHJhaXNlJykpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90dXBsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdHVwbGUucHkKaW5kZXggODljYmUxZC4uNjQzNjQxMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90dXBsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R1cGxlLnB5CkBAIC0xMSw3ICsxMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoKSwgKCkpCiAgICAgICAgIHQwXzMgPSAoMCwgMSwgMiwgMykKICAgICAgICAgdDBfM19iaXMgPSB0dXBsZSh0MF8zKQotICAgICAgICBzZWxmLmFzc2VydF8odDBfMyBpcyB0MF8zX2JpcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQwXzMgaXMgdDBfM19iaXMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoW10pLCAoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShbMCwgMSwgMiwgM10pLCAoMCwgMSwgMiwgMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoJycpLCAoKSkKQEAgLTE5LDggKzE5LDggQEAKIAogICAgIGRlZiB0ZXN0X3RydXRoKHNlbGYpOgogICAgICAgICBzdXBlcihUdXBsZVRlc3QsIHNlbGYpLnRlc3RfdHJ1dGgoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90ICgpKQotICAgICAgICBzZWxmLmFzc2VydF8oKDQyLCApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDQyLCApKQogCiAgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgogICAgICAgICBzdXBlcihUdXBsZVRlc3QsIHNlbGYpLnRlc3RfbGVuKCkKQEAgLTMzLDE0ICszMywxNCBAQAogICAgICAgICB1ID0gKDAsIDEpCiAgICAgICAgIHUyID0gdQogICAgICAgICB1ICs9ICgyLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8odSBpcyBub3QgdTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1IGlzIG5vdCB1MikKIAogICAgIGRlZiB0ZXN0X2ltdWwoc2VsZik6CiAgICAgICAgIHN1cGVyKFR1cGxlVGVzdCwgc2VsZikudGVzdF9pbXVsKCkKICAgICAgICAgdSA9ICgwLCAxKQogICAgICAgICB1MiA9IHUKICAgICAgICAgdSAqPSAzCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1IGlzIG5vdCB1MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUgaXMgbm90IHUyKQogCiAgICAgZGVmIHRlc3RfdHVwbGVyZXNpemVidWcoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCBhIHNwZWNpZmljIGJ1ZyBpbiBfUHlUdXBsZV9SZXNpemUoKSBpcyBzcXVhc2hlZC4KQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgaW5wcyA9IGJhc2UgKyBbKGksIGopIGZvciBpIGluIGJhc2UgZm9yIGogaW4geHBdICsgXAogICAgICAgICAgICAgICAgICAgICAgWyhpLCBqKSBmb3IgaSBpbiB4cCBmb3IgaiBpbiBiYXNlXSArIHhwICsgemlwKGJhc2UpCiAgICAgICAgIGNvbGxpc2lvbnMgPSBsZW4oaW5wcykgLSBsZW4oc2V0KG1hcChoYXNoLCBpbnBzKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb2xsaXNpb25zIDw9IDE1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sbGlzaW9ucyA8PSAxNSkKIAogICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CiAgICAgICAgIGwwID0gdHVwbGUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmFyeS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5hcnkucHkKaW5kZXggOTg1NGY2NC4uNTk4ZmNhOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmFyeS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuYXJ5LnB5CkBAIC02LDMyICs2LDMyIEBACiBjbGFzcyBVbmFyeU9wVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfbmVnYXRpdmUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XygtMiA9PSAwIC0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0wID09IDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtLTIgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0yTCA9PSAwIC0gMkwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtMi4wID09IDAgLSAyLjApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtMmogPT0gMCAtIDJqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTIgPT0gMCAtIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMCA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLS0yID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMkwgPT0gMCAtIDJMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTIuMCA9PSAwIC0gMi4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTJqID09IDAgLSAyaikKIAogICAgIGRlZiB0ZXN0X3Bvc2l0aXZlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oKzIgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCswID09IDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygrKzIgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCsyTCA9PSAyTCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCsyLjAgPT0gMi4wKQotICAgICAgICBzZWxmLmFzc2VydF8oKzJqID09IDJqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCswID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgrKzIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCsyTCA9PSAyTCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCsyLjAgPT0gMi4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzJqID09IDJqKQogCiAgICAgZGVmIHRlc3RfaW52ZXJ0KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oLTIgPT0gMCAtIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtMCA9PSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oLS0yID09IDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtMkwgPT0gMCAtIDJMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTIgPT0gMCAtIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMCA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLS0yID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMkwgPT0gMCAtIDJMKQogCiAgICAgZGVmIHRlc3Rfbm9fb3ZlcmZsb3coc2VsZik6CiAgICAgICAgIG5pbmVzID0gIjkiICogMzIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGV2YWwoIisiICsgbmluZXMpID09IGV2YWwoIisiICsgbmluZXMgKyAiTCIpKQotICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiLSIgKyBuaW5lcykgPT0gZXZhbCgiLSIgKyBuaW5lcyArICJMIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhldmFsKCJ+IiArIG5pbmVzKSA9PSBldmFsKCJ+IiArIG5pbmVzICsgIkwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoIisiICsgbmluZXMpID09IGV2YWwoIisiICsgbmluZXMgKyAiTCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiLSIgKyBuaW5lcykgPT0gZXZhbCgiLSIgKyBuaW5lcyArICJMIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCJ+IiArIG5pbmVzKSA9PSBldmFsKCJ+IiArIG5pbmVzICsgIkwiKSkKIAogICAgIGRlZiB0ZXN0X25lZ2F0aW9uX29mX2V4cG9uZW50aWF0aW9uKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSAnKionIGRvZXMgdGhlIHJpZ2h0IHRoaW5nOyB0aGVzZSBmb3JtIGEKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCA5OTE1NWVjLi40MzgzMGIyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKQogICAgICAgICByZWFscmVzdWx0ID0gbWV0aG9kKCphcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxyZXN1bHQsIHJlc3VsdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUocmVhbHJlc3VsdCkgaXMgdHlwZShyZXN1bHQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZWFscmVzdWx0KSBpcyB0eXBlKHJlc3VsdCkpCiAKICAgICAgICAgIyBpZiB0aGUgb3JpZ2luYWwgaXMgcmV0dXJuZWQgbWFrZSBzdXJlIHRoYXQKICAgICAgICAgIyB0aGlzIGRvZXNuJ3QgaGFwcGVuIHdpdGggc3ViY2xhc3NlcwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihvYmplY3QsIG1ldGhvZG5hbWUpCiAgICAgICAgICAgICByZWFscmVzdWx0ID0gbWV0aG9kKCphcmdzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscmVzdWx0LCByZXN1bHQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob2JqZWN0IGlzIG5vdCByZWFscmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iamVjdCBpcyBub3QgcmVhbHJlc3VsdCkKIAogICAgIGRlZiB0ZXN0X2xpdGVyYWxzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHhmZicsIHUnXHUwMGZmJykKQEAgLTIwMCwyNSArMjAwLDI1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhYmMnLCAnYWJjJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJywgdSdhYmMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYWJjJywgdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYmNkJyA+ICdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2FiY2QnID4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYmNkJyA+IHUnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYWJjJyA8ICdhYmNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhYmMnIDwgdSdhYmNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYWJjJyA8IHUnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiY2QnID4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYWJjZCcgPiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiY2QnID4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmMnIDwgJ2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2FiYycgPCB1J2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmMnIDwgdSdhYmNkJykKIAogICAgICAgICBpZiAwOgogICAgICAgICAgICAgIyBNb3ZlIHRoZXNlIHRlc3RzIHRvIGEgVW5pY29kZSBjb2xsYXRpb24gbW9kdWxlIHRlc3QuLi4KICAgICAgICAgICAgICMgVGVzdGluZyBVVEYtMTYgY29kZSBwb2ludCBvcmRlciBjb21wYXJpc29ucy4uLgogCiAgICAgICAgICAgICAjIE5vIHN1cnJvZ2F0ZXMsIG5vIGZpeHVwIHJlcXVpcmVkLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHUnXHUwMDYxJyA8IHUnXHUyMGFjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1x1MDA2MScgPCB1J1x1MjBhYycpCiAgICAgICAgICAgICAjIE5vbiBzdXJyb2dhdGUgYmVsb3cgc3Vycm9nYXRlIHZhbHVlLCBubyBmaXh1cCByZXF1aXJlZAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHUnXHUwMDYxJyA8IHUnXHVkODAwXHVkYzAyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1x1MDA2MScgPCB1J1x1ZDgwMFx1ZGMwMicpCiAKICAgICAgICAgICAgICMgTm9uIHN1cnJvZ2F0ZSBhYm92ZSBzdXJyb2dhdGUgdmFsdWUsIGZpeHVwIHJlcXVpcmVkCiAgICAgICAgICAgICBkZWYgdGVzdF9sZWNtcChzLCBzMik6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHMgPCBzMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocyA8IHMyKQogCiAgICAgICAgICAgICBkZWYgdGVzdF9maXh1cChzKToKICAgICAgICAgICAgICAgICBzMiA9IHUnXHVkODAwXHVkYzAxJwpAQCAtMjU4LDcgKzI1OCw3IEBACiAgICAgICAgICAgICAgICAgdGVzdF9maXh1cCh1J1x1ZmY2MScpCiAKICAgICAgICAgIyBTdXJyb2dhdGVzIG9uIGJvdGggc2lkZXMsIG5vIGZpeHVwIHJlcXVpcmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J1x1ZDgwMFx1ZGMwMicgPCB1J1x1ZDg0ZFx1ZGM1NicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1x1ZDgwMFx1ZGMwMicgPCB1J1x1ZDg0ZFx1ZGM1NicpCiAKICAgICBkZWYgdGVzdF9pc2xvd2VyKHNlbGYpOgogICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9pc2xvd2VyKHNlbGYpCkBAIC0zMTYsNjMgKzMxNiw2MyBAQAogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyBVbmljb2RlIGNvbnRhaW5zIG1ldGhvZAotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluIHUnYWJkYicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gdSdiZGFiJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiB1J2JkYWJhJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiB1J2JkYmEnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluIHUnYmRiYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2EnIGluIHUnYmRiYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2EnIG5vdCBpbiB1J2JkYicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2EnIG5vdCBpbiAnYmRiJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgaW4gJ2JkYmEnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhJyBpbiAoJ2EnLDEsTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2EnIGluICgxLE5vbmUsJ2EnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgaW4gKDEsTm9uZSx1J2EnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiAoJ2EnLDEsTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gKDEsTm9uZSwnYScpKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluICgxLE5vbmUsdSdhJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluICgneCcsMSx1J3knKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gKCd4JywxLE5vbmUpKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYmNkJyBub3QgaW4gdSdhYmN4eHh4JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYWInIGluIHUnYWJjZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYWInIGluIHUnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYWInIGluICdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYicgaW4gKDEsTm9uZSx1J2FiJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1JycgaW4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJycgaW4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIHUnYWJkYicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gdSdiZGFiJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiB1J2JkYWJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiB1J2JkYmEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIHUnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2EnIGluIHUnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2EnIG5vdCBpbiB1J2JkYicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2EnIG5vdCBpbiAnYmRiJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgaW4gJ2JkYmEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhJyBpbiAoJ2EnLDEsTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2EnIGluICgxLE5vbmUsJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgaW4gKDEsTm9uZSx1J2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiAoJ2EnLDEsTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gKDEsTm9uZSwnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluICgxLE5vbmUsdSdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgbm90IGluICgneCcsMSx1J3knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gKCd4JywxLE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmNkJyBub3QgaW4gdSdhYmN4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWInIGluIHUnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYWInIGluIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWInIGluICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYicgaW4gKDEsTm9uZSx1J2FiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1JycgaW4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gdSdhYmMnKQogCiAgICAgICAgICMgSWYgdGhlIGZvbGxvd2luZyBmYWlscyBlaXRoZXIKICAgICAgICAgIyB0aGUgY29udGFpbnMgb3BlcmF0b3IgZG9lcyBub3QgcHJvcGFnYXRlIFVuaWNvZGVFcnJvcnMgb3IKICAgICAgICAgIyBzb21lb25lIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGVuY29kaW5nCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgJ2dceGUydGVhdScuX19jb250YWluc19fLCB1J1x4ZTInKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1JycgaW4gJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnJyBpbiB1JycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1JycgaW4gdScnKQotICAgICAgICBzZWxmLmFzc2VydF8odScnIGluICdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJycgaW4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odScnIGluIHUnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnXDAnIG5vdCBpbiAnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdcMCcgbm90IGluIHUnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnXDAnIG5vdCBpbiB1J2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J1wwJyBpbiAnXDBhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ1wwJyBpbiB1J1wwYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnXDAnIGluIHUnXDBhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdcMCcgaW4gJ2FiY1wwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdcMCcgaW4gdSdhYmNcMCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J1wwJyBpbiB1J2FiY1wwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgaW4gJ1wwYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiB1J1wwYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgaW4gdSdcMGFiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FzZGYnIGluICdhc2RmJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhc2RmJyBpbiB1J2FzZGYnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhc2RmJyBpbiB1J2FzZGYnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhc2RmJyBub3QgaW4gJ2FzZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYXNkZicgbm90IGluIHUnYXNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYXNkZicgbm90IGluIHUnYXNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYXNkZicgbm90IGluICcnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2FzZGYnIG5vdCBpbiB1JycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FzZGYnIG5vdCBpbiB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1JycgaW4gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJyBpbiB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1JycgaW4gdScnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodScnIGluICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodScnIGluIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXDAnIG5vdCBpbiAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdcMCcgbm90IGluIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXDAnIG5vdCBpbiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1wwJyBpbiAnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1wwJyBpbiB1J1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXDAnIGluIHUnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcMCcgaW4gJ2FiY1wwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdcMCcgaW4gdSdhYmNcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1wwJyBpbiB1J2FiY1wwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgaW4gJ1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiB1J1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgaW4gdSdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FzZGYnIGluICdhc2RmJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhc2RmJyBpbiB1J2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhc2RmJyBpbiB1J2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhc2RmJyBub3QgaW4gJ2FzZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYXNkZicgbm90IGluIHUnYXNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYXNkZicgbm90IGluIHUnYXNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYXNkZicgbm90IGluICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2FzZGYnIG5vdCBpbiB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FzZGYnIG5vdCBpbiB1JycpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1ImFiYyIuX19jb250YWluc19fKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGVfZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5CmluZGV4IDVjMWY0NWIuLjMyNjIwMGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5CkBAIC00MiwxOSArNDIsMTkgQEAKICAgICAjIERvIGFsbCB0aGUgdGVzdHMgd2UgY2FuIGdpdmVuIG9ubHkgYSBzaW5nbGUgZmlsZW5hbWUuICBUaGUgZmlsZSBzaG91bGQKICAgICAjIGV4aXN0LgogICAgIGRlZiBfZG9fc2luZ2xlKHNlbGYsIGZpbGVuYW1lKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLmFjY2VzcyhmaWxlbmFtZSwgb3MuUl9PSykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguaXNmaWxlKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MuYWNjZXNzKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSksIG9zLlJfT0spKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MuYWNjZXNzKGZpbGVuYW1lLCBvcy5SX09LKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5hY2Nlc3Mob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSwgb3MuUl9PSykpCiAgICAgICAgIG9zLmNobW9kKGZpbGVuYW1lLCAwNzc3KQogICAgICAgICBvcy51dGltZShmaWxlbmFtZSwgTm9uZSkKICAgICAgICAgb3MudXRpbWUoZmlsZW5hbWUsICh0aW1lLnRpbWUoKSwgdGltZS50aW1lKCkpKQogICAgICAgICAjIENvcHkvcmVuYW1lIGV0YyB0ZXN0cyB1c2luZyB0aGUgc2FtZSBmaWxlbmFtZQogICAgICAgICBzZWxmLl9kb19jb3B5aXNoKGZpbGVuYW1lLCBmaWxlbmFtZSkKICAgICAgICAgIyBGaWxlbmFtZSBzaG91bGQgYXBwZWFyIGluIGdsb2Igb3V0cHV0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKT09b3MucGF0aC5hYnNwYXRoKGdsb2IuZ2xvYihmaWxlbmFtZSlbMF0pKQogICAgICAgICAjIGJhc2VuYW1lIHNob3VsZCBhcHBlYXIgaW4gbGlzdGRpci4KICAgICAgICAgcGF0aCwgYmFzZSA9IG9zLnBhdGguc3BsaXQob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgYmFzZSA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZEIiwgYmFzZSkKICAgICAgICAgZmlsZV9saXN0ID0gW3VuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZEIiwgZikgZm9yIGYgaW4gZmlsZV9saXN0XQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlIGluIGZpbGVfbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UgaW4gZmlsZV9saXN0KQogCiAgICAgIyBEbyBhcyBtYW55ICJlcXVpdmFsYW5jeScgdGVzdHMgYXMgd2UgY2FuIC0gaWUsIGNoZWNrIHRoYXQgYWx0aG91Z2ggd2UKICAgICAjIGhhdmUgZGlmZmVyZW50IHR5cGVzIGZvciB0aGUgZmlsZW5hbWUsIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KQEAgLTc5LDEyICs3OSwxMiBAQAogICAgICAgICAjIE5vdGUgd2Ugb25seSBjaGVjayAiZmlsZW5hbWUxIGFnYWluc3QgZmlsZW5hbWUyIiAtIHdlIGRvbid0IGJvdGhlcgogICAgICAgICAjIGNoZWNraW5nICJmaWxlbmFtZTIgYWdhaW5zdCAxIiwgYXMgd2UgYXNzdW1lIHdlIGFyZSBjYWxsZWQgYWdhaW4gd2l0aAogICAgICAgICAjIHRoZSBhcmdzIHJldmVyc2VkLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShmaWxlbmFtZTEpIT10eXBlKGZpbGVuYW1lMiksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGZpbGVuYW1lMSkhPXR5cGUoZmlsZW5hbWUyKSwKICAgICAgICAgICAgICAgICAgICAgIk5vIHBvaW50IGNoZWNraW5nIGVxdWl2YWxlbnQgZmlsZW5hbWVzIG9mIHRoZSBzYW1lIHR5cGUiKQogICAgICAgICAjIHN0YXQgYW5kIGxzdGF0IHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0cy4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3Muc3RhdChmaWxlbmFtZTEpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZW5hbWUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChmaWxlbmFtZTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcy5sc3RhdChmaWxlbmFtZTEpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxzdGF0KGZpbGVuYW1lMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxzdGF0KGZpbGVuYW1lMikpCiAgICAgICAgICMgQ29weS9yZW5hbWUgZXRjIHRlc3RzIHVzaW5nIGVxdWl2YWxlbnQgZmlsZW5hbWUKICAgICAgICAgc2VsZi5fZG9fY29weWlzaChmaWxlbmFtZTEsIGZpbGVuYW1lMikKQEAgLTkyLDE5ICs5MiwxOSBAQAogICAgICMgVGVzdHMgdGhhdCBjb3B5LCBtb3ZlLCBldGMgb25lIGZpbGUgdG8gYW5vdGhlci4KICAgICBkZWYgX2RvX2NvcHlpc2goc2VsZiwgZmlsZW5hbWUxLCBmaWxlbmFtZTIpOgogICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIHJlbmFtZSB0aGUgZmlsZSB1c2luZyBlaXRoZXIgbmFtZS4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lMSkpICMgbXVzdCBleGlzdC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lMSkpICMgbXVzdCBleGlzdC4KICAgICAgICAgb3MucmVuYW1lKGZpbGVuYW1lMSwgZmlsZW5hbWUyICsgIi5uZXciKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUxKyIubmV3IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShmaWxlbmFtZTErIi5uZXciKSkKICAgICAgICAgb3MucmVuYW1lKGZpbGVuYW1lMSArICIubmV3IiwgZmlsZW5hbWUyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lMikpCiAKICAgICAgICAgc2h1dGlsLmNvcHkoZmlsZW5hbWUxLCBmaWxlbmFtZTIgKyAiLm5ldyIpCiAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZTEgKyAiLm5ldyIpICMgcmVtb3ZlIHVzaW5nIGVxdWl2IG5hbWUuCiAgICAgICAgICMgQW5kIGEgY291cGxlIG9mIG1vdmVzLCBvbmUgdXNpbmcgZWFjaCBuYW1lLgogICAgICAgICBzaHV0aWwubW92ZShmaWxlbmFtZTEsIGZpbGVuYW1lMiArICIubmV3IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZTIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lMikpCiAgICAgICAgIHNodXRpbC5tb3ZlKGZpbGVuYW1lMSArICIubmV3IiwgZmlsZW5hbWUyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5leGlzdHMoZmlsZW5hbWUxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lMSkpCiAgICAgICAgICMgTm90ZSAtIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc2h1dGlsLm1vdmUsCiAgICAgICAgICMgaXQgdHJpZXMgYSByZW5hbWUgZmlyc3QuICBUaGlzIG9ubHkgZmFpbHMgb24gV2luZG93cyB3aGVuIG9uCiAgICAgICAgICMgZGlmZmVyZW50IGZpbGUgc3lzdGVtcyAtIGFuZCB0aGlzIHRlc3QgY2FuJ3QgZW5zdXJlIHRoYXQuCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgICAgICAgICBjd2RfcmVzdWx0ID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBjd2RfcmVzdWx0KQogICAgICAgICAgICAgICAgIG5hbWVfcmVzdWx0ID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBuYW1lX3Jlc3VsdCkKIAotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG9zLnBhdGguYmFzZW5hbWUoY3dkX3Jlc3VsdCksbmFtZV9yZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmJhc2VuYW1lKGN3ZF9yZXN1bHQpLG5hbWVfcmVzdWx0KQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBvcy5jaGRpcihjd2QpCiAgICAgICAgIGZpbmFsbHk6CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgICAgIHNlbGYuX2RvX3NpbmdsZShmaWxlbmFtZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpKQogICAgICAgICAjIGFuZCBhZ2FpbiB3aXRoIG9zLm9wZW4uCiAgICAgICAgIGYgPSBvcy5vcGVuKGZpbGVuYW1lLCBvcy5PX0NSRUFUKQogICAgICAgICBvcy5jbG9zZShmKQpAQCAtMTU4LDcgKzE1OCw3IEBACiAKICAgICBkZWYgX3Rlc3RfZXF1aXZhbGVudChzZWxmLCBmaWxlbmFtZTEsIGZpbGVuYW1lMik6CiAgICAgICAgIHJlbW92ZV9pZl9leGlzdHMoZmlsZW5hbWUxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUyKSkKICAgICAgICAgZiA9IGZpbGUoZmlsZW5hbWUxLCAidyIpCiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weQppbmRleCBiYWEzNmNiLi45ZDcxMzNiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHkKQEAgLTIzMCw3ICsyMzAsNyBAQAogICAgICAgICAgICAgaWYgZGVjICE9IC0xOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLCBzZWxmLmRiLm51bWVyaWMoYykpCiAgICAgICAgICAgICAgICAgY291bnQgKz0gMQotICAgICAgICBzZWxmLmFzc2VydF8oY291bnQgPj0gMTApICMgc2hvdWxkIGhhdmUgdGVzdGVkIGF0IGxlYXN0IHRoZSBBU0NJSSBkaWdpdHMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50ID49IDEwKSAjIHNob3VsZCBoYXZlIHRlc3RlZCBhdCBsZWFzdCB0aGUgQVNDSUkgZGlnaXRzCiAKICAgICBkZWYgdGVzdF9kaWdpdF9udW1lcmljX2NvbnNpc3RlbnQoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IGRpZ2l0IGFuZCBudW1lcmljIGFyZSBjb25zaXN0ZW50LApAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICAgICAgICBpZiBkZWMgIT0gLTE6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWMsIHNlbGYuZGIubnVtZXJpYyhjKSkKICAgICAgICAgICAgICAgICBjb3VudCArPSAxCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3VudCA+PSAxMCkgIyBzaG91bGQgaGF2ZSB0ZXN0ZWQgYXQgbGVhc3QgdGhlIEFTQ0lJIGRpZ2l0cworICAgICAgICBzZWxmLmFzc2VydFRydWUoY291bnQgPj0gMTApICMgc2hvdWxkIGhhdmUgdGVzdGVkIGF0IGxlYXN0IHRoZSBBU0NJSSBkaWdpdHMKIAogICAgIGRlZiB0ZXN0X2J1Z18xNzA0NzkzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmRiLmxvb2t1cCgiR09USElDIExFVFRFUiBGQUlIVSIpLCB1J1xVMDAwMTAzNDYnKQpAQCAtMjUxLDEzICsyNTEsMTMgQEAKICAgICBkZWYgdGVzdF91Y2RfNTEwKHNlbGYpOgogICAgICAgICBpbXBvcnQgdW5pY29kZWRhdGEKICAgICAgICAgIyBJbiBVQ0QgNS4xLjAsIGEgbWlycm9yZWQgcHJvcGVydHkgY2hhbmdlZCB3cnQuIFVDRCAzLjIuMAotICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZWRhdGEubWlycm9yZWQodSJcdTBmM2EiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1bmljb2RlZGF0YS51Y2RfM18yXzAubWlycm9yZWQodSJcdTBmM2EiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGVkYXRhLm1pcnJvcmVkKHUiXHUwZjNhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdW5pY29kZWRhdGEudWNkXzNfMl8wLm1pcnJvcmVkKHUiXHUwZjNhIikpCiAgICAgICAgICMgQWxzbywgd2Ugbm93IGhhdmUgdHdvIHdheXMgb2YgcmVwcmVzZW50aW5nCiAgICAgICAgICMgdGhlIHVwcGVyLWNhc2UgbWFwcGluZzogYXMgZGVsdGEsIG9yIGFzIGFic29sdXRlIHZhbHVlCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1ImEiLnVwcGVyKCk9PXUnQScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1Ilx1MWQ3OSIudXBwZXIoKT09dSdcdWE3N2QnKQotICAgICAgICBzZWxmLmFzc2VydF8odSIuIi51cHBlcigpPT11Ii4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSJhIi51cHBlcigpPT11J0EnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSJcdTFkNzkiLnVwcGVyKCk9PXUnXHVhNzdkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUiLiIudXBwZXIoKT09dSIuIikKIAogICAgIGRlZiB0ZXN0X2J1Z181ODI4KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXHUxZDc5Ii5sb3dlcigpLCB1Ilx1MWQ3OSIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliLnB5CmluZGV4IGZmYzJmMzEuLjkzMjBjNjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliLnB5CkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgICMgTWFrZSBzdXJlIG9iamVjdCByZXR1cm5lZCBieSB1cmxvcGVuKCkgaGFzIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwogICAgICAgICBmb3IgYXR0ciBpbiAoInJlYWQiLCAicmVhZGxpbmUiLCAicmVhZGxpbmVzIiwgImZpbGVubyIsCiAgICAgICAgICAgICAgICAgICAgICAiY2xvc2UiLCAiaW5mbyIsICJnZXR1cmwiLCAiZ2V0Y29kZSIsICJfX2l0ZXJfXyIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc2VsZi5yZXR1cm5lZF9vYmosIGF0dHIpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5yZXR1cm5lZF9vYmosIGF0dHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgdXJsb3BlbigpIGxhY2tzICVzIGF0dHJpYnV0ZSIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIpCiAKQEAgLTY2LDcgKzY2LDcgQEAKIAogICAgIGRlZiB0ZXN0X2ZpbGVubyhzZWxmKToKICAgICAgICAgZmlsZV9udW0gPSBzZWxmLnJldHVybmVkX29iai5maWxlbm8oKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShmaWxlX251bSwgaW50KSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZmlsZV9udW0sIGludCksCiAgICAgICAgICAgICAgICAgICAgICAiZmlsZW5vKCkgZGlkIG5vdCByZXR1cm4gYW4gaW50IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5yZWFkKGZpbGVfbnVtLCBsZW4oc2VsZi50ZXh0KSksIHNlbGYudGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhZGluZyBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGZpbGVubygpICIKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgICAgc2VsZi5yZXR1cm5lZF9vYmouY2xvc2UoKQogCiAgICAgZGVmIHRlc3RfaW5mbyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc2VsZi5yZXR1cm5lZF9vYmouaW5mbygpLCBtaW1ldG9vbHMuTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYucmV0dXJuZWRfb2JqLmluZm8oKSwgbWltZXRvb2xzLk1lc3NhZ2UpKQogCiAgICAgZGVmIHRlc3RfZ2V0dXJsKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmV0dXJuZWRfb2JqLmdldHVybCgpLCBzZWxmLnBhdGhuYW1lKQpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgICMgYSBoZWFkZXJzIHZhbHVlIGlzIHJldHVybmVkLgogICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJscmV0cmlldmUoImZpbGU6JXMiICUgdGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJlc3VsdFsxXSwgbWltZXRvb2xzLk1lc3NhZ2UpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyZXN1bHRbMV0sIG1pbWV0b29scy5NZXNzYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGdldCBhIG1pbWV0b29scy5NZXNzYWdlIGluc3RhbmNlIGFzIHNlY29uZCAiCiAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgdmFsdWUiKQogCkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybHJldHJpZXZlKHNlbGYuY29uc3RydWN0TG9jYWxGaWxlVXJsKAogICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiksIHNlY29uZF90ZW1wKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF90ZW1wLCByZXN1bHRbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzZWNvbmRfdGVtcCksICJjb3B5IG9mIHRoZSBmaWxlIHdhcyBub3QgIgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2Vjb25kX3RlbXApLCAiY29weSBvZiB0aGUgZmlsZSB3YXMgbm90ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hZGUiKQogICAgICAgICBGSUxFID0gZmlsZShzZWNvbmRfdGVtcCwgJ3JiJykKICAgICAgICAgdHJ5OgpAQCAtMjU0LDkgKzI1NCw5IEBACiAgICAgZGVmIHRlc3RfcmVwb3J0aG9vayhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVwb3J0aG9vayB3b3Jrcy4KICAgICAgICAgZGVmIGhvb2t0ZXN0ZXIoY291bnQsIGJsb2NrX3NpemUsIHRvdGFsX3NpemUsIGNvdW50X2hvbGRlcj1bMF0pOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoY291bnQsIGludCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShibG9ja19zaXplLCBpbnQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodG90YWxfc2l6ZSwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGNvdW50LCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmxvY2tfc2l6ZSwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHRvdGFsX3NpemUsIGludCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBjb3VudF9ob2xkZXJbMF0pCiAgICAgICAgICAgICBjb3VudF9ob2xkZXJbMF0gPSBjb3VudF9ob2xkZXJbMF0gKyAxCiAgICAgICAgIHNlY29uZF90ZW1wID0gIiVzLjIiICUgdGVzdF9zdXBwb3J0LlRFU1RGTgpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAgICAgICAgIGV4cGVjdF9zb21ld2hlcmUgPSBbIjFzdD0xIiwgIjJuZD0yIiwgIjNyZD0zIl0KICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbikKICAgICAgICAgZm9yIGV4cGVjdGVkIGluIGV4cGVjdF9zb21ld2hlcmU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0ZWQgaW4gcmVzdWx0LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkIGluIHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGluZyAlczogJXMgbm90IGZvdW5kIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfdHlwZSwgZXhwZWN0ZWQsIHJlc3VsdCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCcmJyksIDIsCkBAIC00OTYsNyArNDk2LDcgQEAKICAgICAgICAgYW1wX2xvY2F0aW9uID0gcmVzdWx0LmluZGV4KCcmJykKICAgICAgICAgb25fYW1wX2xlZnQgPSByZXN1bHRbYW1wX2xvY2F0aW9uIC0gMV0KICAgICAgICAgb25fYW1wX3JpZ2h0ID0gcmVzdWx0W2FtcF9sb2NhdGlvbiArIDFdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvbl9hbXBfbGVmdC5pc2RpZ2l0KCkgYW5kIG9uX2FtcF9yaWdodC5pc2RpZ2l0KCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvbl9hbXBfbGVmdC5pc2RpZ2l0KCkgYW5kIG9uX2FtcF9yaWdodC5pc2RpZ2l0KCksCiAgICAgICAgICAgICAgICAgICAgICAidGVzdGluZyAlczogJyYnIG5vdCBsb2NhdGVkIGluIHByb3BlciBwbGFjZSBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgKHRlc3RfdHlwZSwgcmVzdWx0KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgKDUgKiAzKSArIDIsICM1IGNoYXJzIHBlciB0aGluZyBhbmQgYW1wcwpAQCAtNTM0LDcgKzUzNCw3IEBACiAgICAgICAgIHJlc3VsdCA9IHVybGxpYi51cmxlbmNvZGUoZ2l2ZW4sIFRydWUpCiAgICAgICAgIGZvciB2YWx1ZSBpbiBnaXZlblsic2VxdWVuY2UiXToKICAgICAgICAgICAgIGV4cGVjdCA9ICJzZXF1ZW5jZT0lcyIgJSB2YWx1ZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdCBpbiByZXN1bHQsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0IGluIHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgbm90IGZvdW5kIGluICVzIiAlIChleHBlY3QsIHJlc3VsdCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCcmJyksIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIDIgJyYncywgZ290ICVzIiAlIHJlc3VsdC5jb3VudCgnJicpKQpAQCAtNjYxLDcgKzY2MSw3IEBACiAjICAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgogIyAgICAgICAgICMgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpcyBpZ25vcmVkCiAjICAgICAgICAgaW1wb3J0IHNvY2tldAotIyAgICAgICAgIHNlbGYuYXNzZXJ0Xyhzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorIyAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogIyAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICMgICAgICAgICB0cnk6CiAjICAgICAgICAgICAgIGZ0cCA9IHVybGxpYi5mdHB3cmFwcGVyKCJteXVzZXIiLCAibXlwYXNzIiwgImxvY2FsaG9zdCIsIDkwOTMsIFtdKQpAQCAtNjczLDcgKzY3Myw3IEBACiAjICAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogIyAgICAgICAgICMgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpcyB1c2VkCiAjICAgICAgICAgaW1wb3J0IHNvY2tldAotIyAgICAgICAgIHNlbGYuYXNzZXJ0Xyhzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorIyAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogIyAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICMgICAgICAgICB0cnk6CiAjICAgICAgICAgICAgIGZ0cCA9IHVybGxpYi5mdHB3cmFwcGVyKCJteXVzZXIiLCAibXlwYXNzIiwgImxvY2FsaG9zdCIsIDkwOTMsIFtdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IDllZGQ3YzIuLjFkY2Q2MTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTUyMSwxNSArNTIxLDE1IEBACiAgICAgICAgICAgICAgICAgIyAqX3JlcXVlc3QKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoYW5kbGVyLCBuYW1lKSwgY2FsbHNbaV0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXJncyksIDEpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYXJnc1swXSwgUmVxdWVzdCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYXJnc1swXSwgUmVxdWVzdCkpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICMgKl9yZXNwb25zZQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGhhbmRsZXIsIG5hbWUpLCBjYWxsc1tpXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcmdzKSwgMikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShhcmdzWzBdLCBSZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhcmdzWzBdLCBSZXF1ZXN0KSkKICAgICAgICAgICAgICAgICAjIHJlc3BvbnNlIGZyb20gb3BlbmVyLm9wZW4gaXMgTm9uZSwgYmVjYXVzZSB0aGVyZSdzIG5vCiAgICAgICAgICAgICAgICAgIyBoYW5kbGVyIHRoYXQgZGVmaW5lcyBodHRwX29wZW4gdG8gaGFuZGxlIGl0Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFyZ3NbMV0gaXMgTm9uZSBvcgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhcmdzWzFdIGlzIE5vbmUgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShhcmdzWzFdLCBNb2NrUmVzcG9uc2UpKQogCiAKQEAgLTU4MCw3ICs1ODAsNyBAQAogICAgICAgICAgICAgcmVxLnRpbWVvdXQgPSBOb25lCiAgICAgICAgICAgICByID0gaC5mdHBfb3BlbihyZXEpCiAgICAgICAgICAgICAjIGZ0cCBhdXRoZW50aWNhdGlvbiBub3QgeWV0IGltcGxlbWVudGVkIGJ5IEZUUEhhbmRsZXIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhoLnVzZXIgPT0gaC5wYXNzd2QgPT0gIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaC51c2VyID09IGgucGFzc3dkID09ICIiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmhvc3QsIHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3QpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnBvcnQsIHBvcnQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZGlycywgZGlycykKQEAgLTY3NCw5ICs2NzQsOSBAQAogICAgICAgICAgICAgICAgIGguZmlsZV9vcGVuKHJlcSkKICAgICAgICAgICAgICMgWFhYWCByZW1vdmUgT1NFcnJvciB3aGVuIGJ1ZyBmaXhlZAogICAgICAgICAgICAgZXhjZXB0ICh1cmxsaWIyLlVSTEVycm9yLCBPU0Vycm9yKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGZ0cCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZ0cCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG8ucmVxIGlzIHJlcSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoby5yZXEgaXMgcmVxKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnR5cGUsICJmdHAiKQogCiAgICAgZGVmIHRlc3RfaHR0cChzZWxmKToKQEAgLTc1MSw4ICs3NTEsOCBAQAogICAgICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKICAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQogICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOiAgIyBHRVQKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIkNvbnRlbnQtbGVuZ3RoIiBub3QgaW4gcmVxLnVucmVkaXJlY3RlZF9oZHJzKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiQ29udGVudC10eXBlIiBub3QgaW4gcmVxLnVucmVkaXJlY3RlZF9oZHJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiQ29udGVudC1sZW5ndGgiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJDb250ZW50LXR5cGUiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCiAgICAgICAgICAgICBlbHNlOiAgIyBQT1NUCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtbGVuZ3RoIl0sICIwIikKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC10eXBlIl0sCkBAIC04MDcsMTkgKzgwNywxOSBAQAogICAgICAgICAjIGFsbCAyeHggYXJlIHBhc3NlZCB0aHJvdWdoCiAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIsIHVybCkKICAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyIGlzIG5ld3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyIGlzIG5ld3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCiAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAyLCAiQWNjZXB0ZWQiLCB7fSwgIiIsIHVybCkKICAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyIGlzIG5ld3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyIGlzIG5ld3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCiAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjA2LCAiUGFydGlhbCBjb250ZW50Iiwge30sICIiLCB1cmwpCiAgICAgICAgIG5ld3IgPSBoLmh0dHBfcmVzcG9uc2UocmVxLCByKQotICAgICAgICBzZWxmLmFzc2VydF8ociBpcyBuZXdyKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIobywgInByb3RvIikpICAjIG8uZXJyb3Igbm90IGNhbGxlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUociBpcyBuZXdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIobywgInByb3RvIikpICAjIG8uZXJyb3Igbm90IGNhbGxlZAogICAgICAgICAjIGFueXRoaW5nIGVsc2UgY2FsbHMgby5lcnJvciAoYW5kIE1vY2tPcGVuZXIgcmV0dXJucyBOb25lLCBoZXJlKQogICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDUwMiwgIkJhZCBnYXRld2F5Iiwge30sICIiLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoLmh0dHBfcmVzcG9uc2UocmVxLCByKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLnByb3RvLCAiaHR0cCIpICAjIG8uZXJyb3IgY2FsbGVkCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5hcmdzLCAocmVxLCByLCA1MDIsICJCYWQgZ2F0ZXdheSIsIHt9KSkKIApAQCAtODMxLDEyICs4MzEsMTIgQEAKICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIpCiAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIpCiAgICAgICAgIG5ld3JlcSA9IGguaHR0cF9yZXF1ZXN0KHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNqLmFjaF9yZXEgaXMgcmVxIGlzIG5ld3JlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNqLmFjaF9yZXEgaXMgcmVxIGlzIG5ld3JlcSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxLmdldF9vcmlnaW5fcmVxX2hvc3QoKSwgImV4YW1wbGUuY29tIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCByZXEuaXNfdW52ZXJpZmlhYmxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVxLmlzX3VudmVyaWZpYWJsZSgpKQogICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNqLmVjX3JlcSBpcyByZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjai5lY19yIGlzIHIgaXMgbmV3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNqLmVjX3JlcSBpcyByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjai5lY19yIGlzIHIgaXMgbmV3cikKIAogICAgIGRlZiB0ZXN0X3JlZGlyZWN0KHNlbGYpOgogICAgICAgICBmcm9tX3VybCA9ICJodHRwOi8vZXhhbXBsZS5jb20vYS5odG1sIgpAQCAtODU4LDEyICs4NTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tIZWFkZXJzKHsibG9jYXRpb24iOiB0b191cmx9KSkKICAgICAgICAgICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICMgMzA3IGluIHJlc3BvbnNlIHRvIFBPU1QgcmVxdWlyZXMgdXNlciBPSwotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY29kZSA9PSAzMDcgYW5kIGRhdGEgaXMgbm90IE5vbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlID09IDMwNyBhbmQgZGF0YSBpcyBub3QgTm9uZSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9mdWxsX3VybCgpLCB0b191cmwpCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9tZXRob2QoKSwgIkdFVCIpCiAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IG8ucmVxLmhhc19kYXRhKCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgby5yZXEuaGFzX2RhdGEoKSkKIAogICAgICAgICAgICAgICAgICMgbm93IGl0J3MgYSBHRVQsIHRoZXJlIHNob3VsZCBub3QgYmUgaGVhZGVycyByZWdhcmRpbmcgY29udGVudAogICAgICAgICAgICAgICAgICMgKHBvc3NpYmx5IGRyYWdnZWQgZnJvbSBiZWZvcmUgYmVpbmcgYSBQT1NUKQpAQCAtODczLDggKzg3Myw4IEBACiAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmhlYWRlcnNbIk5vbnNlbnNlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlraW5nPXdpdGhob2xkIikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIlNwYW0iIG5vdCBpbiBvLnJlcS5oZWFkZXJzKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiU3BhbSIgbm90IGluIG8ucmVxLnVucmVkaXJlY3RlZF9oZHJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiU3BhbSIgbm90IGluIG8ucmVxLmhlYWRlcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJTcGFtIiBub3QgaW4gby5yZXEudW5yZWRpcmVjdGVkX2hkcnMpCiAKICAgICAgICAgIyBsb29wIGRldGVjdGlvbgogICAgICAgICByZXEgPSBSZXF1ZXN0KGZyb21fdXJsKQpAQCAtOTIwLDcgKzkyMCw3IEBACiAgICAgICAgIGNwID0gdXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKGNqKQogICAgICAgICBvID0gYnVpbGRfdGVzdF9vcGVuZXIoaGgsIGhkZWgsIGhyaCwgY3ApCiAgICAgICAgIG8ub3BlbigiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhoLnJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoaC5yZXEuaGFzX2hlYWRlcigiQ29va2llIikpCiAKICAgICBkZWYgdGVzdF9wcm94eShzZWxmKToKICAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKQEAgLTExMTcsNyArMTExNyw3IEBACiAgICAgICAgICAgICBpZiBoLl9fY2xhc3NfXyA9PSBoYW5kbGVyX2NsYXNzOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRmFsc2UpCiAKIGNsYXNzIFJlcXVlc3RUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTExMzIsMTAgKzExMzIsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiR0VUIiwgc2VsZi5nZXQuZ2V0X21ldGhvZCgpKQogCiAgICAgZGVmIHRlc3RfYWRkX2RhdGEoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgc2VsZi5nZXQuaGFzX2RhdGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmdldC5oYXNfZGF0YSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJHRVQiLCBzZWxmLmdldC5nZXRfbWV0aG9kKCkpCiAgICAgICAgIHNlbGYuZ2V0LmFkZF9kYXRhKCJzcGFtIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZ2V0Lmhhc19kYXRhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmdldC5oYXNfZGF0YSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJQT1NUIiwgc2VsZi5nZXQuZ2V0X21ldGhvZCgpKQogCiAgICAgZGVmIHRlc3RfZ2V0X2Z1bGxfdXJsKHNlbGYpOgpAQCAtMTE1OCw5ICsxMTU4LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgid3d3LnB5dGhvbi5vcmciLCByZXEuZ2V0X2hvc3QoKSkKIAogICAgIGRlZiB0ZXN0X3Byb3h5KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHNlbGYuZ2V0Lmhhc19wcm94eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuZ2V0Lmhhc19wcm94eSgpKQogICAgICAgICBzZWxmLmdldC5zZXRfcHJveHkoInd3dy5wZXJsLm9yZyIsICJodHRwIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZ2V0Lmhhc19wcm94eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5nZXQuaGFzX3Byb3h5KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInd3dy5weXRob24ub3JnIiwgc2VsZi5nZXQuZ2V0X29yaWdpbl9yZXFfaG9zdCgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ3d3cucGVybC5vcmciLCBzZWxmLmdldC5nZXRfaG9zdCgpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKaW5kZXggMDA0OThlYy4uMTcyOWQ1ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQpAQCAtNDM0LDEwICs0MzQsMTAgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIyLnVybG9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQogICAgICAgICAgICAgZm9yIGF0dHIgaW4gKCJyZWFkIiwgImNsb3NlIiwgImluZm8iLCAiZ2V0dXJsIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9wZW5fdXJsLCBhdHRyKSwgIm9iamVjdCByZXR1cm5lZCBmcm9tICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybG9wZW4gbGFja3MgdGhlICVzIGF0dHJpYnV0ZSIgJSBhdHRyKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvcGVuX3VybC5yZWFkKCksICJjYWxsaW5nICdyZWFkJyBmYWlsZWQiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVuX3VybC5yZWFkKCksICJjYWxsaW5nICdyZWFkJyBmYWlsZWQiKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCiAgICAgICAgIGZpbmFsbHk6CkBAIC00NDksNyArNDQ5LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIyLnVybG9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQogICAgICAgICAgICAgaW5mb19vYmogPSBvcGVuX3VybC5pbmZvKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGluZm9fb2JqLCBtaW1ldG9vbHMuTWVzc2FnZSksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShpbmZvX29iaiwgbWltZXRvb2xzLk1lc3NhZ2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgJ2luZm8nIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbWV0b29scy5NZXNzYWdlIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0c3VidHlwZSgpLCAicGxhaW4iKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CmluZGV4IGI0ZTZhZTUuLjk3ODg2NzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKQEAgLTgxLDE1ICs4MSwxNSBAQAogICAgICAgICAjIGRlbHZlIGRlZXAgaW50byByZXNwb25zZSB0byBmZXRjaCBzb2NrZXQuX3NvY2tldG9iamVjdAogICAgICAgICByZXNwb25zZSA9IF91cmxvcGVuX3dpdGhfcmV0cnkoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQogICAgICAgICBhYnVzZWRfZmlsZW9iamVjdCA9IHJlc3BvbnNlLmZwCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhYnVzZWRfZmlsZW9iamVjdC5fX2NsYXNzX18gaXMgc29ja2V0Ll9maWxlb2JqZWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJ1c2VkX2ZpbGVvYmplY3QuX19jbGFzc19fIGlzIHNvY2tldC5fZmlsZW9iamVjdCkKICAgICAgICAgaHR0cHJlc3BvbnNlID0gYWJ1c2VkX2ZpbGVvYmplY3QuX3NvY2sKLSAgICAgICAgc2VsZi5hc3NlcnRfKGh0dHByZXNwb25zZS5fX2NsYXNzX18gaXMgaHR0cGxpYi5IVFRQUmVzcG9uc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShodHRwcmVzcG9uc2UuX19jbGFzc19fIGlzIGh0dHBsaWIuSFRUUFJlc3BvbnNlKQogICAgICAgICBmaWxlb2JqZWN0ID0gaHR0cHJlc3BvbnNlLmZwCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmaWxlb2JqZWN0Ll9fY2xhc3NfXyBpcyBzb2NrZXQuX2ZpbGVvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlb2JqZWN0Ll9fY2xhc3NfXyBpcyBzb2NrZXQuX2ZpbGVvYmplY3QpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmaWxlb2JqZWN0LmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmaWxlb2JqZWN0LmNsb3NlZCkKICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oZmlsZW9iamVjdC5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlb2JqZWN0LmNsb3NlZCkKIAogY2xhc3MgT3RoZXJOZXR3b3JrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgICAgICAgICAgICAgIGlmIGV4cGVjdGVkX2VycjoKICAgICAgICAgICAgICAgICAgICAgbXNnID0gKCJEaWRuJ3QgZ2V0IGV4cGVjdGVkIGVycm9yKHMpICVzIGZvciAlcyAlcywgZ290ICVzOiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdGVkX2VyciwgdXJsLCByZXEsIHR5cGUoZXJyKSwgZXJyKSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpLCBtc2cpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGVyciwgZXhwZWN0ZWRfZXJyKSwgbXNnKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoKToKICAgICAgICAgICAgICAgICAgICAgYnVmID0gZi5yZWFkKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKaW5kZXggZmZiOGI5OC4uN2FiMmFhMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKQEAgLTYwLDEwICs2MCwxMCBAQAogICAgICAgICBvcGVuX3VybCA9IHNlbGYudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCiAgICAgICAgIGZvciBhdHRyIGluICgicmVhZCIsICJyZWFkbGluZSIsICJyZWFkbGluZXMiLCAiZmlsZW5vIiwgImNsb3NlIiwKICAgICAgICAgICAgICAgICAgICAgICJpbmZvIiwgImdldHVybCIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmxvcGVuIGxhY2tzIHRoZSAlcyBhdHRyaWJ1dGUiICUgYXR0cikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9wZW5fdXJsLnJlYWQoKSwgImNhbGxpbmcgJ3JlYWQnIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3Blbl91cmwucmVhZCgpLCAiY2FsbGluZyAncmVhZCcgZmFpbGVkIikKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9wZW5fdXJsLmNsb3NlKCkKIApAQCAtNzEsOSArNzEsOSBAQAogICAgICAgICAjIFRlc3QgYm90aCByZWFkbGluZSBhbmQgcmVhZGxpbmVzLgogICAgICAgICBvcGVuX3VybCA9IHNlbGYudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG9wZW5fdXJsLnJlYWRsaW5lKCksIGJhc2VzdHJpbmcpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob3Blbl91cmwucmVhZGxpbmUoKSwgYmFzZXN0cmluZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG9wZW5fdXJsLnJlYWRsaW5lcygpLCBsaXN0KSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9wZW5fdXJsLnJlYWRsaW5lcygpLCBsaXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzIGRpZCBub3QgcmV0dXJuIGEgbGlzdCIpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoaW5mb19vYmosIG1pbWV0b29scy5NZXNzYWdlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGluZm9fb2JqLCBtaW1ldG9vbHMuTWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuIGluc3RhbmNlIG9mICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibWltZXRvb2xzLk1lc3NhZ2UiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvX29iai5nZXRzdWJ0eXBlKCksICJodG1sIikKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgICAgICBmZCA9IG9wZW5fdXJsLmZpbGVubygpCiAgICAgICAgIEZJTEUgPSBvcy5mZG9wZW4oZmQpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhGSUxFLnJlYWQoKSwgInJlYWRpbmcgZnJvbSBmaWxlIGNyZWF0ZWQgdXNpbmcgZmQgIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEZJTEUucmVhZCgpLCAicmVhZGluZyBmcm9tIGZpbGUgY3JlYXRlZCB1c2luZyBmZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCBieSBmaWxlbm8gZmFpbGVkIikKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIEZJTEUuY2xvc2UoKQpAQCAtMTQ4LDExICsxNDgsMTEgQEAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKICAgICAgICAgIyBUZXN0IGJhc2ljIGZ1bmN0aW9uYWxpdHkuCiAgICAgICAgIGZpbGVfbG9jYXRpb24saW5mbyA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoZmlsZV9sb2NhdGlvbiksICJmaWxlIGxvY2F0aW9uIHJldHVybmVkIGJ5IgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZV9sb2NhdGlvbiksICJmaWxlIGxvY2F0aW9uIHJldHVybmVkIGJ5IgogICAgICAgICAgICAgICAgICAgICAgICAgIiB1cmxyZXRyaWV2ZSBpcyBub3QgYSB2YWxpZCBwYXRoIikKICAgICAgICAgRklMRSA9IGZpbGUoZmlsZV9sb2NhdGlvbikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKEZJTEUucmVhZCgpLCAicmVhZGluZyBmcm9tIHRoZSBmaWxlIGxvY2F0aW9uIHJldHVybmVkIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEZJTEUucmVhZCgpLCAicmVhZGluZyBmcm9tIHRoZSBmaWxlIGxvY2F0aW9uIHJldHVybmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICIgYnkgdXJscmV0cmlldmUgZmFpbGVkIikKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIEZJTEUuY2xvc2UoKQpAQCAtMTYzLDEwICsxNjMsMTAgQEAKICAgICAgICAgZmlsZV9sb2NhdGlvbixpbmZvID0gc2VsZi51cmxyZXRyaWV2ZSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xvY2F0aW9uLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoZmlsZV9sb2NhdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmaWxlX2xvY2F0aW9uKSkKICAgICAgICAgRklMRSA9IGZpbGUoZmlsZV9sb2NhdGlvbikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKEZJTEUucmVhZCgpLCAicmVhZGluZyBmcm9tIHRlbXBvcmFyeSBmaWxlIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gdGVtcG9yYXJ5IGZpbGUgZmFpbGVkIikKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIEZJTEUuY2xvc2UoKQogICAgICAgICAgICAgb3MudW5saW5rKGZpbGVfbG9jYXRpb24pCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgaGVhZGVyIHJldHVybmVkIGFzIDJuZCB2YWx1ZSBmcm9tIHVybHJldHJpZXZlIGlzIGdvb2QuCiAgICAgICAgIGZpbGVfbG9jYXRpb24sIGhlYWRlciA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQogICAgICAgICBvcy51bmxpbmsoZmlsZV9sb2NhdGlvbikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoaGVhZGVyLCBtaW1ldG9vbHMuTWVzc2FnZSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGhlYWRlciwgbWltZXRvb2xzLk1lc3NhZ2UpLAogICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgbWltZXRvb2xzLk1lc3NhZ2UiKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CmluZGV4IDA4MThlOTguLmM4NmE3NzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQpAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0KCkuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpLCBkNCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVc2VyRGljdC5Vc2VyRGljdC5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSwgMSksIGQ1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0KCkuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCksIDEpLCBkNSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUxLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSBpcyBub3QgdTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHUxLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgVXNlckRpY3QuVXNlckRpY3QpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh1Mi5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSksIFVzZXJEaWN0Lkl0ZXJhYmxlVXNlckRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodTEuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpIGlzIG5vdCB1MSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodTEuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpLCBVc2VyRGljdC5Vc2VyRGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHUyLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgVXNlckRpY3QuSXRlcmFibGVVc2VyRGljdCkpCiAKICAgICAgICAgIyBUZXN0IF9fcmVwcl9fCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUwKSwgc3RyKGQwKSkKQEAgLTk1LDggKzk1LDggQEAKIAogICAgICAgICAjIFRlc3QgaGFzX2tleSBhbmQgImluIi4KICAgICAgICAgZm9yIGkgaW4gdTIua2V5cygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHUyLmhhc19rZXkoaSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaSBpbiB1MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1Mi5oYXNfa2V5KGkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gdTIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUxLmhhc19rZXkoaSksIGQxLmhhc19rZXkoaSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgaW4gdTEsIGkgaW4gZDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUwLmhhc19rZXkoaSksIGQwLmhhc19rZXkoaSkpCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgIyBUZXN0IHNldGRlZmF1bHQKICAgICAgICAgdCA9IFVzZXJEaWN0LlVzZXJEaWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnNldGRlZmF1bHQoIngiLCA0MiksIDQyKQotICAgICAgICBzZWxmLmFzc2VydF8odC5oYXNfa2V5KCJ4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0Lmhhc19rZXkoIngiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnNldGRlZmF1bHQoIngiLCAyMyksIDQyKQogCiAgICAgICAgICMgVGVzdCBwb3AKQEAgLTE2MSw4ICsxNjEsOCBAQAogICAgICAgICBkID0gRCh7MTogMiwgMzogNH0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxXSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzNdLCA0KQotICAgICAgICBzZWxmLmFzc2VydF8oMiBub3QgaW4gZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDIgbm90IGluIGQua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMiBub3QgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgbm90IGluIGQua2V5cygpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMl0sIDQyKQogICAgICAgICBjbGFzcyBFKFVzZXJEaWN0LlVzZXJEaWN0KToKICAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgpAQCAtMjY5LDEyICsyNjksMTIgQEAKIAogICAgICAgICAjIyBOb3csIHRlc3QgdGhlIERpY3RNaXhpbiBtZXRob2RzIG9uZSBieSBvbmUKICAgICAgICAgIyBoYXNfa2V5Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLmhhc19rZXkoMTApKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHMuaGFzX2tleSgyMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmhhc19rZXkoMTApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHMuaGFzX2tleSgyMCkpCiAKICAgICAgICAgIyBfX2NvbnRhaW5zX18KLSAgICAgICAgc2VsZi5hc3NlcnRfKDEwIGluIHMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygyMCBub3QgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEwIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyMCBub3QgaW4gcykKIAogICAgICAgICAjIF9faXRlcl9fCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2sgZm9yIGsgaW4gc10sIFsxMCwgMzBdKQpAQCAtMzA5LDcgKzMwOSw3IEBACiAKICAgICAgICAgIyBwb3AKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnBvcCgxMCksICd0ZW4nKQotICAgICAgICBzZWxmLmFzc2VydF8oMTAgbm90IGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxMCBub3QgaW4gcykKICAgICAgICAgc1sxMF0gPSAndGVuJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9wKCJ4IiwgMSksIDEpCiAgICAgICAgIHNbIngiXSA9IDQyCkBAIC0zMTcsNyArMzE3LDcgQEAKIAogICAgICAgICAjIHBvcGl0ZW0KICAgICAgICAgaywgdiA9IHMucG9waXRlbSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhrIG5vdCBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoayBub3QgaW4gcykKICAgICAgICAgc1trXSA9IHYKIAogICAgICAgICAjIGNsZWFyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKaW5kZXggNGJiMGM0NS4uYjk5NTgxZCAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIHMgPSBzZWxmLnR5cGUydGVzdCgiZm9vYmFyIikKICAgICAgICAgczIgPSBzLmltbXV0YWJsZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgczIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHMyLCBVc2VyU3RyaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoczIsIFVzZXJTdHJpbmcpKQogCiAgICAgZGVmIHRlc3RfaWFkZChzZWxmKToKICAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb28iKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91dWlkLnB5IGIvTGliL3Rlc3QvdGVzdF91dWlkLnB5CmluZGV4IGFiOTI2YWUuLmRjMjhiMWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXVpZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3V1aWQucHkKQEAgLTI4OCw4ICsyODgsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXZlcnNhbF9sb2NhbF9iaXQsIDAsIG1lc3NhZ2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobm9kZSwgMCwgbWVzc2FnZSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChub2RlLCAweGZmZmZmZmZmZmZmZkwsIG1lc3NhZ2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IG5vZGUsIG1lc3NhZ2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub2RlIDwgKDFMIDw8IDQ4KSwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gbm9kZSwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vZGUgPCAoMUwgPDwgNDgpLCBtZXNzYWdlKQogCiAgICAgICAgIFRlc3RVVUlELnNvdXJjZTJub2RlW3NvdXJjZV0gPSBub2RlCiAgICAgICAgIGlmIFRlc3RVVUlELmxhc3Rfbm9kZToKQEAgLTMzMSw4ICszMzEsOCBAQAogCiAgICAgZGVmIHRlc3RfcmFuZG9tX2dldG5vZGUoc2VsZik6CiAgICAgICAgIG5vZGUgPSB1dWlkLl9yYW5kb21fZ2V0bm9kZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IG5vZGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub2RlIDwgKDFMIDw8NDgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBub2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm9kZSA8ICgxTCA8PDQ4KSkKIAogICAgIGRlZiB0ZXN0X3VuaXhkbGxfZ2V0bm9kZShzZWxmKToKICAgICAgICAgaW1wb3J0IHN5cwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKaW5kZXggOTc2NDc4My4uY2EyNzUxOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CkBAIC04Myw5ICs4Myw5IEBACiAgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCiAgICAgICAgICAgICBtZXNzYWdlID0gIkZpbHRlclRlc3RzLnRlc3RfYWx3YXlzIgogICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybihtZXNzYWdlLCBVc2VyV2FybmluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtZXNzYWdlLCB3Wy0xXS5tZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UsIHdbLTFdLm1lc3NhZ2UpCiAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKG1lc3NhZ2UsIFVzZXJXYXJuaW5nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdbLTFdLm1lc3NhZ2UsIG1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKIAogICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CiAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgICAgIHRleHQgPSAnaGFuZGxlIG5vcm1hbGx5JwogICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksIHRleHQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8od1stMV0uY2F0ZWdvcnkgaXMgVXNlcldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod1stMV0uY2F0ZWdvcnkgaXMgVXNlcldhcm5pbmcpCiAKICAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiIiwgV2FybmluZywgIiIsIDApCiAgICAgICAgICAgICB0ZXh0ID0gJ2ZpbHRlcmVkIG91dCcKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgICAgICAgICAgdGV4dCA9ICdub25tYXRjaGluZyB0ZXh0JwogICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksIHRleHQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8od1stMV0uY2F0ZWdvcnkgaXMgVXNlcldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod1stMV0uY2F0ZWdvcnkgaXMgVXNlcldhcm5pbmcpCiAKIGNsYXNzIENGaWx0ZXJUZXN0cyhCYXNlVGVzdCwgRmlsdGVyVGVzdHMpOgogICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgICAgICAgICAgICAgIHRleHQgPSAnbXVsdGkgJWQnICVpICAjIERpZmZlcmVudCB0ZXh0IG9uIGVhY2ggY2FsbC4KICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksIHRleHQpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdbLTFdLmNhdGVnb3J5IGlzIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKIAogICAgIGRlZiB0ZXN0X2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICB3aXRoIHdhcm5pbmdzX3N0YXRlKHNlbGYubW9kdWxlKToKQEAgLTM5Nyw3ICszOTcsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQogICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJvbmNlIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCiAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgImZpbGUiLCA0MikKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKICAgICAgICAgICAgICAgICBkZWwgd1s6XQogICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICJmaWxlIiwgNDIpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHcpLCAwKQpAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUub25jZXJlZ2lzdHJ5ID0ge30KICAgICAgICAgICAgICAgICBfX3dhcm5pbmdyZWdpc3RyeV9fID0ge30KICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKCdvbmNlcmVnaXN0cnkgdGVzdCcpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod1stMV0ubWVzc2FnZS5hcmdzLCBtZXNzYWdlLmFyZ3MpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5tZXNzYWdlLmFyZ3MsIG1lc3NhZ2UuYXJncykKICAgICAgICAgICAgICAgICAjIFJlbW92YWwgb2Ygb25jZXJlZ2lzdHJ5IGlzIG9rYXkuCiAgICAgICAgICAgICAgICAgZGVsIHdbOl0KICAgICAgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUub25jZXJlZ2lzdHJ5CkBAIC00NTksNyArNDU5LDcgQEAKICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNhcHR1cmVkX291dHB1dCgnc3RkZXJyJykgYXMgc3RyZWFtOgogICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKICAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJlYW0uZ2V0dmFsdWUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGV4dCBpbiByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXh0IGluIHJlc3VsdCkKIAogICAgIGRlZiB0ZXN0X3Nob3d3YXJuaW5nX25vdF9jYWxsYWJsZShzZWxmKToKICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpOgpAQCAtNDgwLDE5ICs0ODAsMTkgQEAKICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNhcHR1cmVkX291dHB1dCgnc3RkZXJyJykgYXMgc3RyZWFtOgogICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIodGV4dCkKICAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJlYW0uZ2V0dmFsdWUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQuY291bnQoJ1xuJyksIDIsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCdcbicpLCAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgbmV3bGluZXMgaW4gJXIiICUgcmVzdWx0KQogICAgICAgICBmaXJzdF9saW5lLCBzZWNvbmRfbGluZSA9IHJlc3VsdC5zcGxpdCgnXG4nLCAxKQogICAgICAgICBleHBlY3RlZF9maWxlID0gb3MucGF0aC5zcGxpdGV4dCh3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fKVswXSArICcucHknCiAgICAgICAgIGZpcnN0X2xpbmVfcGFydHMgPSBmaXJzdF9saW5lLnJzcGxpdCgnOicsIDMpCiAgICAgICAgIHBhdGgsIGxpbmUsIHdhcm5pbmdfY2xhc3MsIG1lc3NhZ2UgPSBmaXJzdF9saW5lX3BhcnRzCiAgICAgICAgIGxpbmUgPSBpbnQobGluZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0ZWRfZmlsZSwgcGF0aCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2FybmluZ19jbGFzcywgJyAnICsgVXNlcldhcm5pbmcuX19uYW1lX18pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1lc3NhZ2UsICcgJyArIHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmlsZSwgcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YXJuaW5nX2NsYXNzLCAnICcgKyBVc2VyV2FybmluZy5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCAnICcgKyB0ZXh0KQogICAgICAgICBleHBlY3RlZF9saW5lID0gJyAgJyArIGxpbmVjYWNoZS5nZXRsaW5lKHBhdGgsIGxpbmUpLnN0cmlwKCkgKyAnXG4nCiAgICAgICAgIGFzc2VydCBleHBlY3RlZF9saW5lCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlY29uZF9saW5lLCBleHBlY3RlZF9saW5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9saW5lLCBleHBlY3RlZF9saW5lKQogCiAKIGNsYXNzIFdhcm5pbmdzRGlzcGxheVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTUwOSwxMyArNTA5LDEzIEBACiAgICAgICAgIGZvcm1hdCA9ICIlczolczogJXM6ICVzXG4gICVzXG4iCiAgICAgICAgIGV4cGVjdCA9IGZvcm1hdCAlIChmaWxlX25hbWUsIGxpbmVfbnVtLCBjYXRlZ29yeS5fX25hbWVfXywgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2xpbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdCwgc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0pKQogICAgICAgICAjIFRlc3QgdGhlICdsaW5lJyBhcmd1bWVudC4KICAgICAgICAgZmlsZV9saW5lICs9ICIgZm9yIHRoZSB3aW4hIgogICAgICAgICBleHBlY3QgPSBmb3JtYXQgJSAoZmlsZV9uYW1lLCBsaW5lX251bSwgY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9saW5lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3QsIHNlbGYubW9kdWxlLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHNlbGYubW9kdWxlLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LCBmaWxlX25hbWUsIGxpbmVfbnVtLCBmaWxlX2xpbmUpKQogCiAgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmcoc2VsZik6CkBAIC01MjksNyArNTI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW0pCiAgICAgICAgIHNlbGYubW9kdWxlLnNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlX25hbWUsIGxpbmVfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX29iamVjdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfb2JqZWN0LmdldHZhbHVlKCksIGV4cGVjdCkKICAgICAgICAgIyBUZXN0ICdsaW5lJyBhcmd1bWVudC4KICAgICAgICAgZXhwZWN0ZWRfZmlsZV9saW5lICs9ICJmb3IgdGhlIHdpbiEiCiAgICAgICAgIGV4cGVjdCA9IHNlbGYubW9kdWxlLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVfbmFtZSwKQEAgLTUzNyw3ICs1MzcsNyBAQAogICAgICAgICBmaWxlX29iamVjdCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfb2JqZWN0LCBleHBlY3RlZF9maWxlX2xpbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdCwgZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGZpbGVfb2JqZWN0LmdldHZhbHVlKCkpCiAKIGNsYXNzIENXYXJuaW5nc0Rpc3BsYXlUZXN0cyhCYXNlVGVzdCwgV2FybmluZ3NEaXNwbGF5VGVzdHMpOgogICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKQEAgLTU1NywyMCArNTU3LDIwIEBACiAgICAgICAgICMgRW5zdXJlIGJvdGggc2hvd3dhcm5pbmcgYW5kIGZpbHRlcnMgYXJlIHJlc3RvcmVkIHdoZW4gcmVjb3JkaW5nCiAgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPVRydWUpOgogICAgICAgICAgICAgd21vZC5maWx0ZXJzID0gd21vZC5zaG93d2FybmluZyA9IG9iamVjdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQotICAgICAgICBzZWxmLmFzc2VydF8od21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKICAgICAgICAgIyBTYW1lIHRlc3QsIGJ1dCB3aXRoIHJlY29yZGluZyBkaXNhYmxlZAogICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXdtb2QsIHJlY29yZD1GYWxzZSk6CiAgICAgICAgICAgICB3bW9kLmZpbHRlcnMgPSB3bW9kLnNob3d3YXJuaW5nID0gb2JqZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQogCiAgICAgZGVmIHRlc3RfY2F0Y2hfd2FybmluZ3NfcmVjb3JkaW5nKHNlbGYpOgogICAgICAgICB3bW9kID0gc2VsZi5tb2R1bGUKICAgICAgICAgIyBFbnN1cmUgd2FybmluZ3MgYXJlIHJlY29yZGVkIHdoZW4gcmVxdWVzdGVkCiAgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPVRydWUpIGFzIHc6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcsIFtdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodykgaXMgbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHcpIGlzIGxpc3QpCiAgICAgICAgICAgICB3bW9kLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKICAgICAgICAgICAgIHdtb2Qud2FybigiZm9vIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbLTFdLm1lc3NhZ2UpLCAiZm9vIikKQEAgLTU4Myw4ICs1ODMsOCBAQAogICAgICAgICAjIEVuc3VyZSB3YXJuaW5ncyBhcmUgbm90IHJlY29yZGVkIHdoZW4gbm90IHJlcXVlc3RlZAogICAgICAgICBvcmlnX3Nob3d3YXJuaW5nID0gd21vZC5zaG93d2FybmluZwogICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXdtb2QsIHJlY29yZD1GYWxzZSkgYXMgdzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3IGlzIE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8od21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHcgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCiAKICAgICBkZWYgdGVzdF9jYXRjaF93YXJuaW5nc19yZWVudHJ5X2d1YXJkKHNlbGYpOgogICAgICAgICB3bW9kID0gc2VsZi5tb2R1bGUKQEAgLTYwNSwxNyArNjA1LDE3IEBACiAgICAgICAgIG9yaWdfc2hvd3dhcm5pbmcgPSB3bW9kLnNob3d3YXJuaW5nCiAgICAgICAgICMgRW5zdXJlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vdCB0byByZWNvcmQgd2FybmluZ3MKICAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kKSBhcyB3OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHcgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8od21vZC5maWx0ZXJzIGlzIG5vdCBvcmlnX2ZpbHRlcnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHcgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG5vdCBvcmlnX2ZpbHRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQogICAgICAgICBpZiB3bW9kIGlzIHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddOgogICAgICAgICAgICAgIyBFbnN1cmUgdGhlIGRlZmF1bHQgbW9kdWxlIGlzIHRoaXMgb25lCiAgICAgICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MoKSBhcyB3OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3IGlzIE5vbmUpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8od21vZC5maWx0ZXJzIGlzIG5vdCBvcmlnX2ZpbHRlcnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8od21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodyBpcyBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBub3Qgb3JpZ19maWx0ZXJzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCiAKICAgICBkZWYgdGVzdF9jaGVja193YXJuaW5ncyhzZWxmKToKICAgICAgICAgIyBFeHBsaWNpdCB0ZXN0cyBmb3IgdGhlIHRlc3Rfc3VwcG9ydCBjb252ZW5pZW5jZSB3cmFwcGVyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkgYi9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKaW5kZXggYWVhZmRkYS4uZWQ2MzE0NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQpAQCAtNzAsMTEgKzcwLDExIEBACiAgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgZGVsIG8KLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZjEoKSBpcyBOb25lLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMSgpIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZjIoKSBpcyBOb25lLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMigpIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY2JjYWxsZWQgPT0gMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMiwKICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBub3QgY2FsbGVkIHRoZSByaWdodCBudW1iZXIgb2YgdGltZXMiKQogCiAgICAgZGVmIHRlc3RfbXVsdGlwbGVfc2VsZnJlZl9jYWxsYmFja3Moc2VsZik6CkBAIC0xMDgsMTUgKzEwOCwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3ZWFrcmVmLlJlZmVyZW5jZUVycm9yLCBjaGVjaywgcmVmMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2Vha3JlZi5SZWZlcmVuY2VFcnJvciwgY2hlY2ssIHJlZjIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IsIGJvb2wsIHdlYWtyZWYucHJveHkoQygpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY2JjYWxsZWQgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMikKIAogICAgIGRlZiBjaGVja19iYXNpY19yZWYoc2VsZiwgZmFjdG9yeSk6CiAgICAgICAgIG8gPSBmYWN0b3J5KCkKICAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZigpIGlzIG5vdCBOb25lLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmKCkgaXMgbm90IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAid2VhayByZWZlcmVuY2UgdG8gbGl2ZSBvYmplY3Qgc2hvdWxkIGJlIGxpdmUiKQogICAgICAgICBvMiA9IHJlZigpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhvIGlzIG8yLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyBvMiwKICAgICAgICAgICAgICAgICAgICAgICI8cmVmPigpIHNob3VsZCByZXR1cm4gb3JpZ2luYWwgb2JqZWN0IGlmIGxpdmUiKQogCiAgICAgZGVmIGNoZWNrX2Jhc2ljX2NhbGxiYWNrKHNlbGYsIGZhY3RvcnkpOgpAQCAtMTI0LDkgKzEyNCw5IEBACiAgICAgICAgIG8gPSBmYWN0b3J5KCkKICAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgZGVsIG8KLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY2JjYWxsZWQgPT0gMSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMSwKICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBkaWQgbm90IHByb3Blcmx5IHNldCAnY2JjYWxsZWQnIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZigpIGlzIE5vbmUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgInJlZjIgc2hvdWxkIGJlIGRlYWQgYWZ0ZXIgZGVsZXRpbmcgb2JqZWN0IHJlZmVyZW5jZSIpCiAKICAgICBkZWYgdGVzdF9yZWZfcmV1c2Uoc2VsZik6CkBAIC0xMzYsMTkgKzEzNiwxOSBAQAogICAgICAgICAjIGJldHdlZW4gdGhlc2UgdHdvOyBpdCBzaG91bGQgbWFrZSBubyBkaWZmZXJlbmNlCiAgICAgICAgIHByb3h5ID0gd2Vha3JlZi5wcm94eShvKQogICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZjEgaXMgcmVmMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZjEgaXMgcmVmMiwKICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2Ugb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBiZSByZS11c2VkIikKIAogICAgICAgICBvID0gQygpCiAgICAgICAgIHByb3h5ID0gd2Vha3JlZi5wcm94eShvKQogICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZWYxIGlzIHJlZjIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxIGlzIHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIG9iamVjdCB3L291dCBjYWxsYmFjayBzaG91bGQgYmUgcmUtdXNlZCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMiwKICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB3ZWFrIHJlZiBjb3VudCBmb3Igb2JqZWN0IikKICAgICAgICAgZGVsIHByb3h5Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAxLAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB3ZWFrIHJlZiBjb3VudCBmb3Igb2JqZWN0IGFmdGVyIGRlbGV0aW5nIHByb3h5IikKIAogICAgIGRlZiB0ZXN0X3Byb3h5X3JldXNlKHNlbGYpOgpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgIHByb3h5MSA9IHdlYWtyZWYucHJveHkobykKICAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobykKICAgICAgICAgcHJveHkyID0gd2Vha3JlZi5wcm94eShvKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkxIGlzIHByb3h5MiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5MSBpcyBwcm94eTIsCiAgICAgICAgICAgICAgICAgICAgICAicHJveHkgb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBoYXZlIGJlZW4gcmUtdXNlZCIpCiAKICAgICBkZWYgdGVzdF9iYXNpY19wcm94eShzZWxmKToKQEAgLTE2NSwxNCArMTY1LDE0IEBACiAKICAgICAgICAgTCA9IFVzZXJMaXN0LlVzZXJMaXN0KCkKICAgICAgICAgcCA9IHdlYWtyZWYucHJveHkoTCkKLSAgICAgICAgc2VsZi5mYWlsSWYocCwgInByb3h5IGZvciBlbXB0eSBVc2VyTGlzdCBzaG91bGQgYmUgZmFsc2UiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHAsICJwcm94eSBmb3IgZW1wdHkgVXNlckxpc3Qgc2hvdWxkIGJlIGZhbHNlIikKICAgICAgICAgcC5hcHBlbmQoMTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocCwgInByb3h5IGZvciBub24tZW1wdHkgVXNlckxpc3Qgc2hvdWxkIGJlIHRydWUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocCwgInByb3h5IGZvciBub24tZW1wdHkgVXNlckxpc3Qgc2hvdWxkIGJlIHRydWUiKQogICAgICAgICBwWzpdID0gWzIsIDNdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwKSwgMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDMgaW4gcCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDMgaW4gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICJwcm94eSBkaWRuJ3Qgc3VwcG9ydCBfX2NvbnRhaW5zX18oKSBwcm9wZXJseSIpCiAgICAgICAgIHBbMV0gPSA1CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTFsxXSwgNSkKQEAgLTIyNiwxOSArMjI2LDE5IEBACiAgICAgICAgIG8gPSBPYmplY3QoMSkKICAgICAgICAgcDEgPSBtYWtlcmVmKG8sIE5vbmUpCiAgICAgICAgIHAyID0gbWFrZXJlZihvLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8ocDEgaXMgcDIsICJib3RoIGNhbGxiYWNrcyB3ZXJlIE5vbmUgaW4gdGhlIEMgQVBJIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiYm90aCBjYWxsYmFja3Mgd2VyZSBOb25lIGluIHRoZSBDIEFQSSIpCiAgICAgICAgIGRlbCBwMSwgcDIKICAgICAgICAgcDEgPSBtYWtlcmVmKG8pCiAgICAgICAgIHAyID0gbWFrZXJlZihvLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8ocDEgaXMgcDIsICJjYWxsYmFja3Mgd2VyZSBOVUxMLCBOb25lIGluIHRoZSBDIEFQSSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwMSBpcyBwMiwgImNhbGxiYWNrcyB3ZXJlIE5VTEwsIE5vbmUgaW4gdGhlIEMgQVBJIikKICAgICAgICAgZGVsIHAxLCBwMgogICAgICAgICBwMSA9IG1ha2VyZWYobykKICAgICAgICAgcDIgPSBtYWtlcmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwMSBpcyBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTlVMTCBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocDEgaXMgcDIsICJib3RoIGNhbGxiYWNrcyB3ZXJlIE5VTEwgaW4gdGhlIEMgQVBJIikKICAgICAgICAgZGVsIHAxLCBwMgogICAgICAgICBwMSA9IG1ha2VyZWYobywgTm9uZSkKICAgICAgICAgcDIgPSBtYWtlcmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwMSBpcyBwMiwgImNhbGxiYWNrcyB3ZXJlIE5vbmUsIE5VTEwgaW4gdGhlIEMgQVBJIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiY2FsbGJhY2tzIHdlcmUgTm9uZSwgTlVMTCBpbiB0aGUgQyBBUEkiKQogCiAgICAgZGVmIHRlc3RfY2FsbGFibGVfcHJveHkoc2VsZik6CiAgICAgICAgIG8gPSBDYWxsYWJsZSgpCkBAIC0yNDYsMTMgKzI0NiwxMyBAQAogCiAgICAgICAgIHNlbGYuY2hlY2tfcHJveHkobywgcmVmMSkKIAotICAgICAgICBzZWxmLmFzc2VydF8odHlwZShyZWYxKSBpcyB3ZWFrcmVmLkNhbGxhYmxlUHJveHlUeXBlLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZWYxKSBpcyB3ZWFrcmVmLkNhbGxhYmxlUHJveHlUeXBlLAogICAgICAgICAgICAgICAgICAgICAgInByb3h5IGlzIG5vdCBvZiBjYWxsYWJsZSB0eXBlIikKICAgICAgICAgcmVmMSgndHdpbmtpZXMhJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG8uYmFyID09ICd0d2lua2llcyEnLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoby5iYXIgPT0gJ3R3aW5raWVzIScsCiAgICAgICAgICAgICAgICAgICAgICAiY2FsbCB0aHJvdWdoIHByb3h5IG5vdCBwYXNzZWQgdGhyb3VnaCB0byBvcmlnaW5hbCIpCiAgICAgICAgIHJlZjEoeD0nU3BsYXQuJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG8uYmFyID09ICdTcGxhdC4nLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoby5iYXIgPT0gJ1NwbGF0LicsCiAgICAgICAgICAgICAgICAgICAgICAiY2FsbCB0aHJvdWdoIHByb3h5IG5vdCBwYXNzZWQgdGhyb3VnaCB0byBvcmlnaW5hbCIpCiAKICAgICAgICAgIyBleHBlY3QgZHVlIHRvIHRvbyBmZXcgYXJncwpAQCAtMjYzLDI0ICsyNjMsMjQgQEAKIAogICAgIGRlZiBjaGVja19wcm94eShzZWxmLCBvLCBwcm94eSk6CiAgICAgICAgIG8uZm9vID0gMQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkuZm9vID09IDEsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5mb28gPT0gMSwKICAgICAgICAgICAgICAgICAgICAgICJwcm94eSBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBhZGRpdGlvbiIpCiAgICAgICAgIG8uZm9vID0gMgotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkuZm9vID09IDIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5mb28gPT0gMiwKICAgICAgICAgICAgICAgICAgICAgICJwcm94eSBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBtb2RpZmljYXRpb24iKQogICAgICAgICBkZWwgby5mb28KLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoYXNhdHRyKHByb3h5LCAnZm9vJyksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihwcm94eSwgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIHJlbW92YWwiKQogCiAgICAgICAgIHByb3h5LmZvbyA9IDEKLSAgICAgICAgc2VsZi5hc3NlcnRfKG8uZm9vID09IDEsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLmZvbyA9PSAxLAogICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBhZGRpdGlvbiB2aWEgcHJveHkiKQogICAgICAgICBwcm94eS5mb28gPSAyCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgby5mb28gPT0gMiwKICAgICAgICAgICAgICJvYmplY3QgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uIHZpYSBwcm94eSIpCiAgICAgICAgIGRlbCBwcm94eS5mb28KLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoYXNhdHRyKG8sICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG8sICdmb28nKSwKICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgcmVtb3ZhbCB2aWEgcHJveHkiKQogCiAgICAgZGVmIHRlc3RfcHJveHlfZGVsZXRpb24oc2VsZik6CkBAIC0zMDQsMjEgKzMwNCwyMSBAQAogICAgICAgICBvID0gQygpCiAgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvKQogICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAyLAogICAgICAgICAgICAgICAgICAgICAgImdvdCB3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2Ugb2JqZWN0cyIpCiAKICAgICAgICAgcHJveHkxID0gd2Vha3JlZi5wcm94eShvKQogICAgICAgICBwcm94eTIgPSB3ZWFrcmVmLnByb3h5KG8sIHNlbGYuY2FsbGJhY2spCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSA0LAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gNCwKICAgICAgICAgICAgICAgICAgICAgICJnb3Qgd3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlIG9iamVjdHMiKQogCiAgICAgICAgIGRlbCByZWYxLCByZWYyLCBwcm94eTEsIHByb3h5MgotICAgICAgICBzZWxmLmFzc2VydF8od2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDAsCiAgICAgICAgICAgICAgICAgICAgICAid2VhayByZWZlcmVuY2Ugb2JqZWN0cyBub3QgdW5saW5rZWQgZnJvbSIKICAgICAgICAgICAgICAgICAgICAgICIgcmVmZXJlbnQgd2hlbiBkaXNjYXJkZWQuIikKIAogICAgICAgICAjIGFzc3VtZXMgaW50cyBkbyBub3Qgc3VwcG9ydCB3ZWFrcmVmcwotICAgICAgICBzZWxmLmFzc2VydF8od2Vha3JlZi5nZXR3ZWFrcmVmY291bnQoMSkgPT0gMCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KDEpID09IDAsCiAgICAgICAgICAgICAgICAgICAgICAiZ290IHdyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZSBvYmplY3RzIGZvciBpbnQiKQogCiAgICAgZGVmIHRlc3RfZ2V0d2Vha3JlZnMoc2VsZik6CkBAIC0zMjYsMjIgKzMyNiwyMiBAQAogICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCiAgICAgICAgIGRlbCByZWYxCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pID09IFtyZWYyXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW3JlZjJdLAogICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCIpCiAKICAgICAgICAgbyA9IEMoKQogICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCiAgICAgICAgIGRlbCByZWYyCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pID09IFtyZWYxXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW3JlZjFdLAogICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCIpCiAKICAgICAgICAgZGVsIHJlZjEKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pID09IFtdLAogICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBub3QgY2xlYXJlZCIpCiAKICAgICAgICAgIyBhc3N1bWVzIGludHMgZG8gbm90IHN1cHBvcnQgd2Vha3JlZnMKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZnMoMSkgPT0gW10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZzKDEpID09IFtdLAogICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCBmb3IgaW50IikKIAogICAgIGRlZiB0ZXN0X25ld3N0eWxlX251bWJlcl9vcHMoc2VsZik6CkBAIC0zNDksOCArMzQ5LDggQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZiA9IEYoMi4wKQogICAgICAgICBwID0gd2Vha3JlZi5wcm94eShmKQotICAgICAgICBzZWxmLmFzc2VydF8ocCArIDEuMCA9PSAzLjApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygxLjAgKyBwID09IDMuMCkgICMgdGhpcyB1c2VkIHRvIFNFR1YKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAgKyAxLjAgPT0gMy4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMS4wICsgcCA9PSAzLjApICAjIHRoaXMgdXNlZCB0byBTRUdWCiAKICAgICBkZWYgdGVzdF9jYWxsYmFja3NfcHJvdGVjdGVkKHNlbGYpOgogICAgICAgICAjIENhbGxiYWNrcyBwcm90ZWN0ZWQgZnJvbSBhbHJlYWR5LXNldCBleGNlcHRpb25zPwpAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgICAgIGMud3IgPSB3ZWFrcmVmLnJlZihkLCBjYWxsYmFjaykgICAgICMgdGhpcyB3b24ndCB0cmlnZ2VyCiAgICAgICAgIGQud3IgPSB3ZWFrcmVmLnJlZihjYWxsYmFjaywgZC5jYikgICMgZGl0dG8KICAgICAgICAgZXh0ZXJuYWxfd3IgPSB3ZWFrcmVmLnJlZihjYWxsYmFjaywgc2FmZV9jYWxsYmFjaykgICMgYnV0IHRoaXMgd2lsbAotICAgICAgICBzZWxmLmFzc2VydF8oZXh0ZXJuYWxfd3IoKSBpcyBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVybmFsX3dyKCkgaXMgY2FsbGJhY2spCiAKICAgICAgICAgIyBUaGUgd2Vha3JlZnMgYXR0YWNoZWQgdG8gYyBhbmQgZCBzaG91bGQgZ2V0IGNsZWFyZWQsIHNvIHRoYXQKICAgICAgICAgIyBDLmNiIGlzIG5ldmVyIGNhbGxlZC4gIEJ1dCBleHRlcm5hbF93ciBpc24ndCBwYXJ0IG9mIHRoZSBjeWNsaWMKQEAgLTY4NiwxMiArNjg2LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKE15UmVmLCBzZWxmKS5fX2NhbGxfXygpCiAgICAgICAgIG8gPSBPYmplY3QoImZvbyIpCiAgICAgICAgIG1yID0gTXlSZWYobywgdmFsdWU9MjQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtcigpIGlzIG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtci5jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtcigpIGlzIG8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtci5jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXIudmFsdWUsIDI0KQogICAgICAgICBkZWwgbwotICAgICAgICBzZWxmLmFzc2VydF8obXIoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8obXIuY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXIoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXIuY2FsbGVkKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmc19kb250X3JlcGxhY2Vfc3RhbmRhcmRfcmVmcyhzZWxmKToKICAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgpAQCAtNjk5LDE2ICs2OTksMTYgQEAKICAgICAgICAgbyA9IE9iamVjdCg0MikKICAgICAgICAgcjEgPSBNeVJlZihvKQogICAgICAgICByMiA9IHdlYWtyZWYucmVmKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMSBpcyBub3QgcjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSBpcyBub3QgcjIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSwgW3IyLCByMV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobyksIDIpCiAgICAgICAgIHIzID0gTXlSZWYobykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMykKICAgICAgICAgcmVmcyA9IHdlYWtyZWYuZ2V0d2Vha3JlZnMobykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVmcyksIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMiBpcyByZWZzWzBdKQotICAgICAgICBzZWxmLmFzc2VydF8ocjEgaW4gcmVmc1sxOl0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMyBpbiByZWZzWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIyIGlzIHJlZnNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSBpbiByZWZzWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIzIGluIHJlZnNbMTpdKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmc19kb250X2NvbmZsYXRlX2NhbGxiYWNrcyhzZWxmKToKICAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgpAQCAtNzE2LDEwICs3MTYsMTAgQEAKICAgICAgICAgbyA9IE9iamVjdCg0MikKICAgICAgICAgcjEgPSBNeVJlZihvLCBpZCkKICAgICAgICAgcjIgPSBNeVJlZihvLCBzdHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMSBpcyBub3QgcjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSBpcyBub3QgcjIpCiAgICAgICAgIHJlZnMgPSB3ZWFrcmVmLmdldHdlYWtyZWZzKG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMSBpbiByZWZzKQotICAgICAgICBzZWxmLmFzc2VydF8ocjIgaW4gcmVmcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGluIHJlZnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMiBpbiByZWZzKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmc193aXRoX3Nsb3RzKHNlbGYpOgogICAgICAgICBjbGFzcyBNeVJlZih3ZWFrcmVmLnJlZik6CkBAIC03MzYsNyArNzM2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNsb3QxLCAiYWJjIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNsb3QyLCAiZGVmIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLm1ldGgoKSwgImFiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbElmKGhhc2F0dHIociwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihyLCAiX19kaWN0X18iKSkKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlZnNfd2l0aF9jeWNsZShzZWxmKToKICAgICAgICAgIyBCdWcgIzMxMTAKQEAgLTc5NCwyMyArNzk0LDIzIEBACiAgICAgICAgICMKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX3ZhbHVlZF9kaWN0KCkKICAgICAgICAgZm9yIG8gaW4gb2JqZWN0czoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAxLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gJXIhIiAlIG8pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obyBpcyBkaWN0W28uYXJnXSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIGRpY3Rbby5hcmddLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBvYmplY3QgcmV0dXJuZWQgYnkgd2VhayBkaWN0ISIpCiAgICAgICAgIGl0ZW1zMSA9IGRpY3QuaXRlbXMoKQogICAgICAgICBpdGVtczIgPSBkaWN0LmNvcHkoKS5pdGVtcygpCiAgICAgICAgIGl0ZW1zMS5zb3J0KCkKICAgICAgICAgaXRlbXMyLnNvcnQoKQotICAgICAgICBzZWxmLmFzc2VydF8oaXRlbXMxID09IGl0ZW1zMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW1zMSA9PSBpdGVtczIsCiAgICAgICAgICAgICAgICAgICAgICAiY2xvbmluZyBvZiB3ZWFrLXZhbHVlZCBkaWN0aW9uYXJ5IGRpZCBub3Qgd29yayEiKQogICAgICAgICBkZWwgaXRlbXMxLCBpdGVtczIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkaWN0KSA9PSBzZWxmLkNPVU5UKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IHNlbGYuQ09VTlQpCiAgICAgICAgIGRlbCBvYmplY3RzWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZGljdCkgPT0gKHNlbGYuQ09VTlQgLSAxKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkaWN0KSA9PSAoc2VsZi5DT1VOVCAtIDEpLAogICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIG9iamVjdCBkaWQgbm90IGNhdXNlIGRpY3Rpb25hcnkgdXBkYXRlIikKICAgICAgICAgZGVsIG9iamVjdHMsIG8KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkaWN0KSA9PSAwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IDAsCiAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgdGhlIHZhbHVlcyBkaWQgbm90IGNsZWFyIHRoZSBkaWN0aW9uYXJ5IikKICAgICAgICAgIyByZWdyZXNzaW9uIG9uIFNGIGJ1ZyAjNDQ3MTUyOgogICAgICAgICBkaWN0ID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKQEAgLTgyNSwyNiArODI1LDI2IEBACiAgICAgICAgICMKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQogICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlcyB0byAlciEiICUgbykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvLmFyZyBpcyBkaWN0W29dLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8uYXJnIGlzIGRpY3Rbb10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG9iamVjdCByZXR1cm5lZCBieSB3ZWFrIGRpY3QhIikKICAgICAgICAgaXRlbXMxID0gZGljdC5pdGVtcygpCiAgICAgICAgIGl0ZW1zMiA9IGRpY3QuY29weSgpLml0ZW1zKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChpdGVtczEpID09IHNldChpdGVtczIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KGl0ZW1zMSkgPT0gc2V0KGl0ZW1zMiksCiAgICAgICAgICAgICAgICAgICAgICAiY2xvbmluZyBvZiB3ZWFrLWtleWVkIGRpY3Rpb25hcnkgZGlkIG5vdCB3b3JrISIpCiAgICAgICAgIGRlbCBpdGVtczEsIGl0ZW1zMgotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRpY3QpID09IHNlbGYuQ09VTlQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gc2VsZi5DT1VOVCkKICAgICAgICAgZGVsIG9iamVjdHNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkaWN0KSA9PSAoc2VsZi5DT1VOVCAtIDEpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IChzZWxmLkNPVU5UIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgb2JqZWN0IGRpZCBub3QgY2F1c2UgZGljdGlvbmFyeSB1cGRhdGUiKQogICAgICAgICBkZWwgb2JqZWN0cywgbwotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRpY3QpID09IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUga2V5cyBkaWQgbm90IGNsZWFyIHRoZSBkaWN0aW9uYXJ5IikKICAgICAgICAgbyA9IE9iamVjdCg0MikKICAgICAgICAgZGljdFtvXSA9ICJXaGF0IGlzIHRoZSBtZWFuaW5nIG9mIHRoZSB1bml2ZXJzZT8iCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkaWN0Lmhhc19rZXkobykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZGljdC5oYXNfa2V5KDM0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShvKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkaWN0Lmhhc19rZXkoMzQpKQogCiAgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9pdGVycyhzZWxmKToKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQpAQCAtODU2LDggKzg1Niw4IEBACiAgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQogICAgICAgICBmb3Igd3IgaW4gcmVmczoKICAgICAgICAgICAgIG9iID0gd3IoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3QuaGFzX2tleShvYikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob2IgaW4gZGljdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0Lmhhc19rZXkob2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iIGluIGRpY3QpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYl0pCiAgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKQEAgLTg2Nyw4ICs4NjcsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGRpY3QuaXRlcmtleXJlZnMoKSkpLCBsZW4ob2JqZWN0cykpCiAgICAgICAgIGZvciB3ciBpbiBkaWN0Lml0ZXJrZXlyZWZzKCk6CiAgICAgICAgICAgICBvYiA9IHdyKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkaWN0Lmhhc19rZXkob2IpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9iIGluIGRpY3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdC5oYXNfa2V5KG9iKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvYiBpbiBkaWN0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2JdKQogICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvYmplY3RzMiksIDApCkBAIC05MDMsMzcgKzkwMywzNyBAQAogICAgICAgICBpdGVtcyA9IGRpY3QuaXRlbXMoKQogICAgICAgICBmb3IgaXRlbSBpbiBkaWN0Lml0ZXJpdGVtcygpOgogICAgICAgICAgICAgaXRlbXMucmVtb3ZlKGl0ZW0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oaXRlbXMpID09IDAsICJpdGVyaXRlbXMoKSBkaWQgbm90IHRvdWNoIGFsbCBpdGVtcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oaXRlbXMpID09IDAsICJpdGVyaXRlbXMoKSBkaWQgbm90IHRvdWNoIGFsbCBpdGVtcyIpCiAKICAgICAgICAgIyBrZXkgaXRlcmF0b3IsIHZpYSBfX2l0ZXJfXygpOgogICAgICAgICBrZXlzID0gZGljdC5rZXlzKCkKICAgICAgICAgZm9yIGsgaW4gZGljdDoKICAgICAgICAgICAgIGtleXMucmVtb3ZlKGspCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oa2V5cykgPT0gMCwgIl9faXRlcl9fKCkgZGlkIG5vdCB0b3VjaCBhbGwga2V5cyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oa2V5cykgPT0gMCwgIl9faXRlcl9fKCkgZGlkIG5vdCB0b3VjaCBhbGwga2V5cyIpCiAKICAgICAgICAgIyBrZXkgaXRlcmF0b3IsIHZpYSBpdGVya2V5cygpOgogICAgICAgICBrZXlzID0gZGljdC5rZXlzKCkKICAgICAgICAgZm9yIGsgaW4gZGljdC5pdGVya2V5cygpOgogICAgICAgICAgICAga2V5cy5yZW1vdmUoaykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihrZXlzKSA9PSAwLCAiaXRlcmtleXMoKSBkaWQgbm90IHRvdWNoIGFsbCBrZXlzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihrZXlzKSA9PSAwLCAiaXRlcmtleXMoKSBkaWQgbm90IHRvdWNoIGFsbCBrZXlzIikKIAogICAgICAgICAjIHZhbHVlIGl0ZXJhdG9yOgogICAgICAgICB2YWx1ZXMgPSBkaWN0LnZhbHVlcygpCiAgICAgICAgIGZvciB2IGluIGRpY3QuaXRlcnZhbHVlcygpOgogICAgICAgICAgICAgdmFsdWVzLnJlbW92ZSh2KQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHZhbHVlcykgPT0gMCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih2YWx1ZXMpID09IDAsCiAgICAgICAgICAgICAgICAgICAgICAiaXRlcnZhbHVlcygpIGRpZCBub3QgdG91Y2ggYWxsIHZhbHVlcyIpCiAKICAgICBkZWYgdGVzdF9tYWtlX3dlYWtfa2V5ZWRfZGljdF9mcm9tX2RpY3Qoc2VsZik6CiAgICAgICAgIG8gPSBPYmplY3QoMykKICAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoe286MzY0fSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3Rbb10gPT0gMzY0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdFtvXSA9PSAzNjQpCiAKICAgICBkZWYgdGVzdF9tYWtlX3dlYWtfa2V5ZWRfZGljdF9mcm9tX3dlYWtfa2V5ZWRfZGljdChzZWxmKToKICAgICAgICAgbyA9IE9iamVjdCgzKQogICAgICAgICBkaWN0ID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSh7bzozNjR9KQogICAgICAgICBkaWN0MiA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoZGljdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3Rbb10gPT0gMzY0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdFtvXSA9PSAzNjQpCiAKICAgICBkZWYgbWFrZV93ZWFrX2tleWVkX2RpY3Qoc2VsZik6CiAgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKQEAgLTk1MywxOSArOTUzLDE5IEBACiAgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQogICAgICAgICB3ZWFrZGljdFtrZXkxXSA9IHZhbHVlMQogICAgICAgICB3ZWFrZGljdFtrZXkyXSA9IHZhbHVlMgotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHdlYWtkaWN0KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSAyKQogICAgICAgICBrLCB2ID0gd2Vha2RpY3QucG9waXRlbSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4od2Vha2RpY3QpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4od2Vha2RpY3QpID09IDEpCiAgICAgICAgIGlmIGsgaXMga2V5MToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHZhbHVlMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHZhbHVlMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMikKICAgICAgICAgaywgdiA9IHdlYWtkaWN0LnBvcGl0ZW0oKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHdlYWtkaWN0KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSAwKQogICAgICAgICBpZiBrIGlzIGtleTE6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpcyB2YWx1ZTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTEpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpcyB2YWx1ZTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTIpCiAKICAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kaWN0X3BvcGl0ZW0oc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcG9waXRlbSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCkBAIC05NzYsMjEgKzk3NiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQygpLCAidmFsdWUgMSIsIEMoKSwgInZhbHVlIDIiKQogCiAgICAgZGVmIGNoZWNrX3NldGRlZmF1bHQoc2VsZiwga2xhc3MsIGtleSwgdmFsdWUxLCB2YWx1ZTIpOgotICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUxIGlzIG5vdCB2YWx1ZTIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZTEgaXMgbm90IHZhbHVlMiwKICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHRlc3QiCiAgICAgICAgICAgICAgICAgICAgICAiIC0tIHZhbHVlIHBhcmFtZXRlcnMgbXVzdCBiZSBkaXN0aW5jdCBvYmplY3RzIikKICAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCiAgICAgICAgIG8gPSB3ZWFrZGljdC5zZXRkZWZhdWx0KGtleSwgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydF8obyBpcyB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrZGljdC5oYXNfa2V5KGtleSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrZGljdC5nZXQoa2V5KSBpcyB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrZGljdFtrZXldIGlzIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8gaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuaGFzX2tleShrZXkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuZ2V0KGtleSkgaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3Rba2V5XSBpcyB2YWx1ZTEpCiAKICAgICAgICAgbyA9IHdlYWtkaWN0LnNldGRlZmF1bHQoa2V5LCB2YWx1ZTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhvIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0Lmhhc19rZXkoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0LmdldChrZXkpIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0W2tleV0gaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5oYXNfa2V5KGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5nZXQoa2V5KSBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdFtrZXldIGlzIHZhbHVlMSkKIAogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3Rfc2V0ZGVmYXVsdChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19zZXRkZWZhdWx0KHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwKQEAgLTEwMDcsMTkgKzEwMDcsMTkgQEAKICAgICAgICAgIwogICAgICAgICB3ZWFrZGljdCA9IGtsYXNzKCkKICAgICAgICAgd2Vha2RpY3QudXBkYXRlKGRpY3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4od2Vha2RpY3QpID09IGxlbihkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gbGVuKGRpY3QpKQogICAgICAgICBmb3IgayBpbiB3ZWFrZGljdC5rZXlzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZGljdC5oYXNfa2V5KGspLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAibXlzdGVyaW91cyBuZXcga2V5IGFwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdC5nZXQoaykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHdlYWtkaWN0W2tdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgd2Vha2RpY3QuZ2V0KGspKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgd2Vha2RpY3Rba10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB3ZWFrZGljdC5nZXQoaykpCiAgICAgICAgIGZvciBrIGluIGRpY3Qua2V5cygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0Lmhhc19rZXkoayksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuaGFzX2tleShrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAib3JpZ2luYWwga2V5IGRpc2FwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdFtrXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgd2Vha2RpY3Rba10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpcyB3ZWFrZGljdC5nZXQoaykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB3ZWFrZGljdFtrXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0LmdldChrKSkKIAogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3RfdXBkYXRlKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VwZGF0ZSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCkBAIC0xMDM1LDEwICsxMDM1LDEwIEBACiAgICAgICAgIG8yID0gT2JqZWN0KCcyJykKICAgICAgICAgZFtvMV0gPSAnc29tZXRoaW5nJwogICAgICAgICBkW28yXSA9ICdzb21ldGhpbmcnCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZCkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkKSA9PSAyKQogICAgICAgICBkZWwgZFtvMV0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5rZXlzKCkgPT0gW28yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5rZXlzKCkgPT0gW28yXSkKIAogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RlbGl0ZW0oc2VsZik6CiAgICAgICAgIGQgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQpAQCAtMTA0NiwxMCArMTA0NiwxMCBAQAogICAgICAgICBvMiA9IE9iamVjdCgnMicpCiAgICAgICAgIGRbJ3NvbWV0aGluZyddID0gbzEKICAgICAgICAgZFsnc29tZXRoaW5nIGVsc2UnXSA9IG8yCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZCkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkKSA9PSAyKQogICAgICAgICBkZWwgZFsnc29tZXRoaW5nJ10KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5pdGVtcygpID09IFsoJ3NvbWV0aGluZyBlbHNlJywgbzIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5pdGVtcygpID09IFsoJ3NvbWV0aGluZyBlbHNlJywgbzIpXSkKIAogICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfYmFkX2RlbGl0ZW0oc2VsZik6CiAgICAgICAgIGQgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weSBiL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQppbmRleCBiNmQ5OTRiLi5kYjgyMTM5IDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5CkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCAoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKSkKICAgICAgICAgICAgIHJldHVybiBbIkhlbGxvLCB3b3JsZCEiXQogICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayh2YWxpZGF0b3IoYmFkX2FwcCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvdXQuZW5kc3dpdGgoCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdXQuZW5kc3dpdGgoCiAgICAgICAgICAgICAiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuICBQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4iCiAgICAgICAgICkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCkBAIC0xNzgsMTQgKzE3OCwxNCBAQAogICAgICAgICBlbnYgPSB7fQogICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQogICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLFN0cmluZ0lPKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKGVudltrZXldLFN0cmluZ0lPKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGVudltrZXldLFN0cmluZ0lPKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52W2tleV0sdmFsdWUpCiAKICAgICAgICAgIyBDaGVjayBleGlzdGluZyB2YWx1ZQogICAgICAgICBlbnYgPSB7a2V5OmFsdH0KICAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVudltrZXldIGlzIGFsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVudltrZXldIGlzIGFsdCkKIAogICAgIGRlZiBjaGVja0Nyb3NzRGVmYXVsdChzZWxmLGtleSx2YWx1ZSwqKmt3KToKICAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQpAQCAtMjEyLDE1ICsyMTIsMTUgQEAKICAgICAgICAgY29tcGFyZV9nZW5lcmljX2l0ZXIobWFrZV9pdCxtYXRjaCkKIAogICAgICAgICBpdCA9IG1ha2VfaXQoKQotICAgICAgICBzZWxmLmZhaWxJZihpdC5maWxlbGlrZS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXQuZmlsZWxpa2UuY2xvc2VkKQogCiAgICAgICAgIGZvciBpdGVtIGluIGl0OgogICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIHNlbGYuZmFpbElmKGl0LmZpbGVsaWtlLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpdC5maWxlbGlrZS5jbG9zZWQpCiAKICAgICAgICAgaXQuY2xvc2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXQuZmlsZWxpa2UuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXQuZmlsZWxpa2UuY2xvc2VkKQogCiAKICAgICBkZWYgdGVzdFNpbXBsZVNoaWZ0cyhzZWxmKToKQEAgLTMxOCwxNCArMzE4LDE0IEBACiAgICAgICAgICAgICAiVEUgVHJhaWxlcnMgVHJhbnNmZXItRW5jb2RpbmcgVXBncmFkZSIKICAgICAgICAgKS5zcGxpdCgpOgogICAgICAgICAgICAgZm9yIGFsdCBpbiBob3AsIGhvcC50aXRsZSgpLCBob3AudXBwZXIoKSwgaG9wLmxvd2VyKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1dGlsLmlzX2hvcF9ieV9ob3AoYWx0KSkKIAogICAgICAgICAjIE5vdCBjb21wcmVoZW5zaXZlLCBqdXN0IGEgZmV3IHJhbmRvbSBoZWFkZXIgbmFtZXMKICAgICAgICAgZm9yIGhvcCBpbiAoCiAgICAgICAgICAgICAiQWNjZXB0IENhY2hlLUNvbnRyb2wgRGF0ZSBQcmFnbWEgVHJhaWxlciBWaWEgV2FybmluZyIKICAgICAgICAgKS5zcGxpdCgpOgogICAgICAgICAgICAgZm9yIGFsdCBpbiBob3AsIGhvcC50aXRsZSgpLCBob3AudXBwZXIoKSwgaG9wLmxvd2VyKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYodXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1dGlsLmlzX2hvcF9ieV9ob3AoYWx0KSkKIAogY2xhc3MgSGVhZGVyVGVzdHMoVGVzdENhc2UpOgogCkBAIC0zMzYsMTcgKzMzNiwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkua2V5cygpLCBbJ3gnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLnZhbHVlcygpLCBbJ3knXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLml0ZW1zKCksIHRlc3QpCi0gICAgICAgIHNlbGYuZmFpbElmKEhlYWRlcnModGVzdCkuaXRlbXMoKSBpcyB0ZXN0KSAgIyBtdXN0IGJlIGNvcHkhCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoSGVhZGVycyh0ZXN0KS5pdGVtcygpIGlzIHRlc3QpICAjIG11c3QgYmUgY29weSEKIAogICAgICAgICBoPUhlYWRlcnMoW10pCiAgICAgICAgIGRlbCBoWydmb28nXSAgICMgc2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvcgogCiAgICAgICAgIGhbJ0ZvbyddID0gJ2JhcicKICAgICAgICAgZm9yIG0gaW4gaC5oYXNfa2V5LCBoLl9fY29udGFpbnNfXywgaC5nZXQsIGguZ2V0X2FsbCwgaC5fX2dldGl0ZW1fXzoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtKCdmb28nKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtKCdGb28nKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtKCdGT08nKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKG0oJ2JhcicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0oJ2ZvbycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0oJ0ZvbycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0oJ0ZPTycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtKCdiYXInKSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbJ2ZvbyddLCdiYXInKQogICAgICAgICBoWydmb28nXSA9ICdiYXonCkBAIC00MjgsNyArNDI4LDcgQEAKICAgICAgICAgICAgIGlmIG5vdCBlbXB0eS5oYXNfa2V5KGspOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52W2tdLHYpCiAgICAgICAgIGZvciBrLHYgaW4gZW1wdHkuaXRlbXMoKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbnYuaGFzX2tleShrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnYuaGFzX2tleShrKSkKIAogICAgIGRlZiB0ZXN0RW52aXJvbihzZWxmKToKICAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFg9IlkiKQpAQCAtNDQxLDcgKzQ0MSw3IEBACiAgICAgICAgIGggPSBCYXNlQ0dJSGFuZGxlcihOb25lLE5vbmUsTm9uZSx7fSkKICAgICAgICAgaC5zZXR1cF9lbnZpcm9uKCkKICAgICAgICAgZm9yIGtleSBpbiAnd3NnaS51cmxfc2NoZW1lJywgJ3dzZ2kuaW5wdXQnLCAnd3NnaS5lcnJvcnMnOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGguZW52aXJvbi5oYXNfa2V5KGtleSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaC5lbnZpcm9uLmhhc19rZXkoa2V5KSkKIAogICAgIGRlZiB0ZXN0U2NoZW1lKHNlbGYpOgogICAgICAgICBoPVRlc3RIYW5kbGVyKEhUVFBTPSJvbiIpOyBoLnNldHVwX2Vudmlyb24oKQpAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgICAgICAgICAiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIKICAgICAgICAgICAgICJcclxuJXMiICUgKGguZXJyb3Jfc3RhdHVzLGxlbihoLmVycm9yX2JvZHkpLGguZXJyb3JfYm9keSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKTw+LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLnN0ZGVyci5nZXR2YWx1ZSgpLmZpbmQoIkFzc2VydGlvbkVycm9yIik8Pi0xKQogCiAgICAgZGVmIHRlc3RFcnJvckFmdGVyT3V0cHV0KHNlbGYpOgogICAgICAgICBNU0cgPSAiU29tZSBvdXRwdXQgaGFzIGJlZW4gc2VudCIKQEAgLTUyOSw3ICs1MjksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCiAgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgogICAgICAgICAgICAgIlxyXG4iK01TRykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKTw+LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLnN0ZGVyci5nZXR2YWx1ZSgpLmZpbmQoIkFzc2VydGlvbkVycm9yIik8Pi0xKQogCiAKICAgICBkZWYgdGVzdEhlYWRlckZvcm1hdHMoc2VsZik6CkBAIC01NjgsNyArNTY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG89PSJIVFRQLzAuOSI6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksIiIpCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUubWF0Y2goc3RkcGF0JSh2ZXJzaW9uLHN3KSwgaC5zdGRvdXQuZ2V0dmFsdWUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ZHBhdCUodmVyc2lvbixzdyksIGguc3Rkb3V0LmdldHZhbHVlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3hkcmxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5CmluZGV4IDhmYzg4YTUuLmFiNmU0NjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5CkBAIC0zMCwxNSArMzAsMTUgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19pbnQoKSwgNDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3VpbnQoKSwgOSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVwLnVucGFja19ib29sKCkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVwLnVucGFja19ib29sKCkgaXMgVHJ1ZSkKIAogICAgICAgICAjIHJlbWVtYmVyIHBvc2l0aW9uCiAgICAgICAgIHBvcyA9IHVwLmdldF9wb3NpdGlvbigpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXAudW5wYWNrX2Jvb2woKSBpcyBGYWxzZSkKIAogICAgICAgICAjIHJld2luZCBhbmQgdW5wYWNrIGFnYWluCiAgICAgICAgIHVwLnNldF9wb3NpdGlvbihwb3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXAudW5wYWNrX2Jvb2woKSBpcyBGYWxzZSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja191aHlwZXIoKSwgNDVMKQogICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHVwLnVucGFja19mbG9hdCgpLCAxLjkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbHJwYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CmluZGV4IGNlNTYxZjQuLmZmMGRlYzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CkBAIC03MSwyMSArNzEsMjEgQEAKICAgICBkZWYgdGVzdF9jbXBfZGF0ZXRpbWVfRGF0ZVRpbWUoc2VsZik6CiAgICAgICAgIG5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCiAgICAgICAgIGR0ID0geG1scnBjbGliLkRhdGVUaW1lKG5vdy50aW1ldHVwbGUoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGR0ID09IG5vdykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdyA9PSBkdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0ID09IG5vdykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdyA9PSBkdCkKICAgICAgICAgdGhlbiA9IG5vdyArIGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTQpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0aGVuID49IGR0KQotICAgICAgICBzZWxmLmFzc2VydF8oZHQgPCB0aGVuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGhlbiA+PSBkdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0IDwgdGhlbikKIAogICAgIGRlZiB0ZXN0X2J1Z18xMTY0OTEyIChzZWxmKToKICAgICAgICAgZCA9IHhtbHJwY2xpYi5EYXRlVGltZSgpCiAgICAgICAgICgobmV3X2QsKSwgZHVtbXkpID0geG1scnBjbGliLmxvYWRzKHhtbHJwY2xpYi5kdW1wcygoZCwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RyZXNwb25zZT1UcnVlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobmV3X2QudmFsdWUsIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG5ld19kLnZhbHVlLCBzdHIpKQogCiAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgb3V0cHV0IG9mIGR1bXBzKCkgaXMgc3RpbGwgYW4gOC1iaXQgc3RyaW5nCiAgICAgICAgIHMgPSB4bWxycGNsaWIuZHVtcHMoKG5ld19kLCksIG1ldGhvZHJlc3BvbnNlPVRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHMsIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHMsIHN0cikpCiAKICAgICBkZWYgdGVzdF9uZXdzdHlsZV9jbGFzcyhzZWxmKToKICAgICAgICAgY2xhc3MgVChvYmplY3QpOgpAQCAtMTc1LDEwICsxNzUsMTAgQEAKICAgICAgICAgaXRlbXMgPSBkLml0ZW1zKCkKICAgICAgICAgaWYgaGF2ZV91bmljb2RlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocywgdSJhYmMgXHg5NSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzLCB1bmljb2RlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHMsIHVuaWNvZGUpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaXRlbXMsIFsodSJkZWYgXHg5NiIsIHUiZ2hpIFx4OTciKV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShpdGVtc1swXVswXSwgdW5pY29kZSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShpdGVtc1swXVsxXSwgdW5pY29kZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShpdGVtc1swXVswXSwgdW5pY29kZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShpdGVtc1swXVsxXSwgdW5pY29kZSkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLCAiYWJjIFx4YzJceDk1IikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGl0ZW1zLCBbKCJkZWYgXHhjMlx4OTYiLCAiZ2hpIFx4YzJceDk3IildKQpAQCAtNTExLDcgKzUxMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIucmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlLCBzdHIsICdfX2FkZCcpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKFNpbXBsZVhNTFJQQ1NlcnZlci5yZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoc3RyLCAndGl0bGUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFNpbXBsZVhNTFJQQ1NlcnZlci5yZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoc3RyLCAndGl0bGUnKSkKICAgICAgICAgIyBHZXQgdGhlIHRlc3QgdG8gcnVuIGZhc3RlciBieSBzZW5kaW5nIGEgcmVxdWVzdCB3aXRoIHRlc3Rfc2ltcGxlMS4KICAgICAgICAgIyBUaGlzIGF2b2lkcyB3YWl0aW5nIGZvciB0aGUgc29ja2V0IHRpbWVvdXQuCiAgICAgICAgIHNlbGYudGVzdF9zaW1wbGUxKCkKQEAgLTgzOCw3ICs4MzgsNyBAQAogICAgICAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCJYLVRlc3QiLCAidGVzdF9jdXN0b21fdXNlcl9hZ2VudCIpCiAKICAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiWC1UZXN0OiB0ZXN0X2N1c3RvbV91c2VyX2FnZW50XHJcbiIgaW4gcmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlgtVGVzdDogdGVzdF9jdXN0b21fdXNlcl9hZ2VudFxyXG4iIGluIHJlcSkKIAogICAgIGRlZiB0ZXN0X3NlbmRfaG9zdChzZWxmKToKICAgICAgICAgY2xhc3MgVGVzdFRyYW5zcG9ydChGYWtlVHJhbnNwb3J0KToKQEAgLTg0OCw3ICs4NDgsNyBAQAogICAgICAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCJYLVRlc3QiLCAidGVzdF9zZW5kX2hvc3QiKQogCiAgICAgICAgIHJlcSA9IHNlbGYuaXNzdWVfcmVxdWVzdChUZXN0VHJhbnNwb3J0KQotICAgICAgICBzZWxmLmFzc2VydF8oIlgtVGVzdDogdGVzdF9zZW5kX2hvc3RcclxuIiBpbiByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiWC1UZXN0OiB0ZXN0X3NlbmRfaG9zdFxyXG4iIGluIHJlcSkKIAogICAgIGRlZiB0ZXN0X3NlbmRfcmVxdWVzdChzZWxmKToKICAgICAgICAgY2xhc3MgVGVzdFRyYW5zcG9ydChGYWtlVHJhbnNwb3J0KToKQEAgLTg1OCw3ICs4NTgsNyBAQAogICAgICAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCJYLVRlc3QiLCAidGVzdF9zZW5kX3JlcXVlc3QiKQogCiAgICAgICAgIHJlcSA9IHNlbGYuaXNzdWVfcmVxdWVzdChUZXN0VHJhbnNwb3J0KQotICAgICAgICBzZWxmLmFzc2VydF8oIlgtVGVzdDogdGVzdF9zZW5kX3JlcXVlc3RcclxuIiBpbiByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiWC1UZXN0OiB0ZXN0X3NlbmRfcmVxdWVzdFxyXG4iIGluIHJlcSkKIAogICAgIGRlZiB0ZXN0X3NlbmRfY29udGVudChzZWxmKToKICAgICAgICAgY2xhc3MgVGVzdFRyYW5zcG9ydChGYWtlVHJhbnNwb3J0KToKQEAgLTg2OCw3ICs4NjgsNyBAQAogICAgICAgICAgICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuc2VuZF9jb250ZW50KHNlbGYsIGNvbm4sIGJvZHkpCiAKICAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiWC1UZXN0OiB0ZXN0X3NlbmRfY29udGVudFxyXG4iIGluIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJYLVRlc3Q6IHRlc3Rfc2VuZF9jb250ZW50XHJcbiIgaW4gcmVxKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgeG1scnBjX3Rlc3RzID0gW1hNTFJQQ1Rlc3RDYXNlLCBIZWxwZXJUZXN0Q2FzZSwgRGF0ZVRpbWVUZXN0Q2FzZSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeHJhbmdlLnB5IGIvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKaW5kZXggN2UyYTFhMy4uYTBiOTRmYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKQEAgLTI2LDE4ICsyNiwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeHJhbmdlKGErNCwgYSwgLTIpKSwgW2ErNCwgYSsyXSkKIAogICAgICAgICBzZXEgPSBsaXN0KHhyYW5nZShhLCBiLCBjKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaW4gc2VxKQotICAgICAgICBzZWxmLmFzc2VydF8oYiBub3QgaW4gc2VxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIG5vdCBpbiBzZXEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCiAKICAgICAgICAgc2VxID0gbGlzdCh4cmFuZ2UoYiwgYSwgLWMpKQotICAgICAgICBzZWxmLmFzc2VydF8oYiBpbiBzZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIG5vdCBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgbm90IGluIHNlcSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKIAogICAgICAgICBzZXEgPSBsaXN0KHhyYW5nZSgtYSwgLWIsIC1jKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC1hIGluIHNlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC1iIG5vdCBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtYSBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtYiBub3QgaW4gc2VxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXEpLCAyKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeHJhbmdlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CmluZGV4IGNiOGJhMTAuLjBiMDcyN2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTY0LDkgKzY0LDkgQEAKICAgICAgICAgbGluZXMgPSBkaXJlY3Rvcnkuc3BsaXRsaW5lcygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsaW5lcyksIDQpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdGaWxlIE5hbWUnIGluIGxpbmVzWzBdKQotICAgICAgICBzZWxmLmFzc2VydF8oJ01vZGlmaWVkJyBpbiBsaW5lc1swXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdTaXplJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGaWxlIE5hbWUnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ01vZGlmaWVkJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdTaXplJyBpbiBsaW5lc1swXSkKIAogICAgICAgICBmbiwgZGF0ZSwgdGltZSwgc2l6ZSA9IGxpbmVzWzFdLnNwbGl0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZm4sICdhbm90aGVyLm5hbWUnKQpAQCAtNzYsMTcgKzc2LDE3IEBACiAgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CiAgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmFtZXMpLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8oVEVTVEZOIGluIG5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygic3RyZmlsZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJzdHJmaWxlIiBpbiBuYW1lcykKIAogICAgICAgICAjIENoZWNrIGluZm9saXN0CiAgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQogICAgICAgICBuYW1lcyA9IFsgaS5maWxlbmFtZSBmb3IgaSBpbiBpbmZvcyBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInN0cmZpbGUiIGluIG5hbWVzKQogICAgICAgICBmb3IgaSBpbiBpbmZvczoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKIApAQCAtMTQ1LDExICsxNDUsMTEgQEAKICAgICAgICAgZGF0YSA9ICIiCiAgICAgICAgIGZvciBpbmZvIGluIGluZm9zOgogICAgICAgICAgICAgZGF0YSArPSB6aXBmcC5vcGVuKGluZm8pLnJlYWQoKQotICAgICAgICBzZWxmLmFzc2VydF8oZGF0YSA9PSAiZm9vYmFyIiBvciBkYXRhID09ICJiYXJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YSA9PSAiZm9vYmFyIiBvciBkYXRhID09ICJiYXJmb28iKQogICAgICAgICBkYXRhID0gIiIKICAgICAgICAgZm9yIGluZm8gaW4gaW5mb3M6CiAgICAgICAgICAgICBkYXRhICs9IHppcGZwLnJlYWQoaW5mbykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRhdGEgPT0gImZvb2JhciIgb3IgZGF0YSA9PSAiYmFyZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGEgPT0gImZvb2JhciIgb3IgZGF0YSA9PSAiYmFyZm9vIikKICAgICAgICAgemlwZnAuY2xvc2UoKQogCiAgICAgZGVmIHppcFJhbmRvbU9wZW5UZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKQEAgLTQ1MSw5ICs0NTEsOSBAQAogICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKIAotICAgICAgICBzZWxmLmFzc2VydF8oJ0ZpbGUgTmFtZScgaW4gbGluZXNbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnTW9kaWZpZWQnIGluIGxpbmVzWzBdKQotICAgICAgICBzZWxmLmFzc2VydF8oJ1NpemUnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0ZpbGUgTmFtZScgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnTW9kaWZpZWQnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1NpemUnIGluIGxpbmVzWzBdKQogCiAgICAgICAgIGZuLCBkYXRlLCB0aW1lLCBzaXplID0gbGluZXNbMV0uc3BsaXQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmbiwgJ2Fub3RoZXIubmFtZScpCkBAIC00NjMsMTcgKzQ2MywxNyBAQAogICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAogICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVEVTVEZOIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgic3RyZmlsZSIgaW4gbmFtZXMpCiAKICAgICAgICAgIyBDaGVjayBpbmZvbGlzdAogICAgICAgICBpbmZvcyA9IHppcGZwLmluZm9saXN0KCkKICAgICAgICAgbmFtZXMgPSBbIGkuZmlsZW5hbWUgZm9yIGkgaW4gaW5mb3MgXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmFtZXMpLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8oVEVTVEZOIGluIG5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygic3RyZmlsZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJzdHJmaWxlIiBpbiBuYW1lcykKICAgICAgICAgZm9yIGkgaW4gaW5mb3M6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCiAKQEAgLTUyMyw4ICs1MjMsOCBAQAogICAgICAgICB6aXBmcC53cml0ZXB5KGZuKQogCiAgICAgICAgIGJuID0gb3MucGF0aC5iYXNlbmFtZShmbikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGJuIG5vdCBpbiB6aXBmcC5uYW1lbGlzdCgpKQotICAgICAgICBzZWxmLmFzc2VydF8oYm4gKyAnbycgaW4gemlwZnAubmFtZWxpc3QoKSBvciBibiArICdjJyBpbiB6aXBmcC5uYW1lbGlzdCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm4gbm90IGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yIGJuICsgJ2MnIGluIHppcGZwLm5hbWVsaXN0KCkpCiAgICAgICAgIHppcGZwLmNsb3NlKCkKIAogCkBAIC01MzYsOCArNTM2LDggQEAKICAgICAgICAgemlwZnAud3JpdGVweShmbiwgInRlc3RwYWNrYWdlIikKIAogICAgICAgICBibiA9ICIlcy8lcyIlKCJ0ZXN0cGFja2FnZSIsIG9zLnBhdGguYmFzZW5hbWUoZm4pKQotICAgICAgICBzZWxmLmFzc2VydF8oYm4gbm90IGluIHppcGZwLm5hbWVsaXN0KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yIGJuICsgJ2MnIGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShibiBub3QgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKICAgICAgICAgemlwZnAuY2xvc2UoKQogCiAgICAgZGVmIHRlc3RXcml0ZVB5dGhvblBhY2thZ2Uoc2VsZik6CkBAIC01NDksOCArNTQ5LDggQEAKIAogICAgICAgICAjIENoZWNrIGZvciBhIGNvdXBsZSBvZiBtb2R1bGVzIGF0IGRpZmZlcmVudCBsZXZlbHMgb2YgdGhlIGhpZWFyYXJjaHkKICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZW1haWwvX19pbml0X18ucHlvJyBpbiBuYW1lcyBvciAnZW1haWwvX19pbml0X18ucHljJyBpbiBuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdlbWFpbC9taW1lL3RleHQucHlvJyBpbiBuYW1lcyBvciAnZW1haWwvbWltZS90ZXh0LnB5YycgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZW1haWwvX19pbml0X18ucHlvJyBpbiBuYW1lcyBvciAnZW1haWwvX19pbml0X18ucHljJyBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdlbWFpbC9taW1lL3RleHQucHlvJyBpbiBuYW1lcyBvciAnZW1haWwvbWltZS90ZXh0LnB5YycgaW4gbmFtZXMpCiAKICAgICBkZWYgdGVzdFdyaXRlUHl0aG9uRGlyZWN0b3J5KHNlbGYpOgogICAgICAgICBvcy5ta2RpcihURVNURk4yKQpAQCAtNTcxLDkgKzU3MSw5IEBACiAgICAgICAgICAgICB6aXBmcC53cml0ZXB5KFRFU1RGTjIpCiAKICAgICAgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdtb2QxLnB5YycgaW4gbmFtZXMgb3IgJ21vZDEucHlvJyBpbiBuYW1lcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnbW9kMi5weWMnIGluIG5hbWVzIG9yICdtb2QyLnB5bycgaW4gbmFtZXMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ21vZDIudHh0JyBub3QgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ21vZDEucHljJyBpbiBuYW1lcyBvciAnbW9kMS5weW8nIGluIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdtb2QyLnB5YycgaW4gbmFtZXMgb3IgJ21vZDIucHlvJyBpbiBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnbW9kMi50eHQnIG5vdCBpbiBuYW1lcykKIAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yKQpAQCAtNjExLDcgKzYxMSw3IEBACiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCAoZXJybm8sIGVycm1zZyk6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ0NvdWxkIG5vdCBhcHBlbmQgZGF0YSB0byBhIG5vbi1leGlzdGVudCB6aXAgZmlsZS4nKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhURVNURk4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoVEVTVEZOKSkKIAogICAgICAgICB6ZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sICdyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6Zi5yZWFkKGZpbGVuYW1lKSwgY29udGVudCkKQEAgLTY0MCwxOSArNjQwLDE5IEBACiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3IikgYXMgZnA6CiAgICAgICAgICAgICBmcC53cml0ZSgidGhpcyBpcyBub3QgYSBsZWdhbCB6aXAgZmlsZVxuIikKICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKFRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjaGspCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2hrKQogICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUgb2JqZWN0CiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGZwOgogICAgICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjaGspCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNoaykKICAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAgIGZwID0gU3RyaW5nSU8oKQogICAgICAgICBmcC53cml0ZSgidGhpcyBpcyBub3QgYSBsZWdhbCB6aXAgZmlsZVxuIikKICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNoaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjaGspCiAgICAgICAgIGZwLnNlZWsoMCwwKQogICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoZnApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY2hrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNoaykKIAogICAgIGRlZiB0ZXN0SXNaaXBWYWxpZEZpbGUoc2VsZik6CiAgICAgICAgICMgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IHRoZSBpc196aXBmaWxlIGZ1bmN0aW9uIGNvcnJlY3RseSBpZGVudGlmaWVzCkBAIC02NjMsMjEgKzY2MywyMSBAQAogICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQogICAgICAgICB6aXBmLmNsb3NlKCkKICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKFRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNoaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKICAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlIG9iamVjdAogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAicmIiKSBhcyBmcDoKICAgICAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGspCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hrKQogICAgICAgICAgICAgZnAuc2VlaygwLDApCiAgICAgICAgICAgICB6aXBfY29udGVudHMgPSBmcC5yZWFkKCkKICAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlLWxpa2Ugb2JqZWN0CiAgICAgICAgIGZwID0gU3RyaW5nSU8oKQogICAgICAgICBmcC53cml0ZSh6aXBfY29udGVudHMpCiAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNoaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKICAgICAgICAgZnAuc2VlaygwLDApCiAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNoaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKIAogICAgIGRlZiB0ZXN0Tm9uRXhpc3RlbnRGaWxlUmFpc2VzSU9FcnJvcihzZWxmKToKICAgICAgICAgIyBtYWtlIHN1cmUgd2UgZG9uJ3QgcmFpc2UgYW4gQXR0cmlidXRlRXJyb3Igd2hlbiBhIHBhcnRpYWxseS1jb25zdHJ1Y3RlZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQppbmRleCAxNTQzYjNiLi4zMDcyMjMwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQpAQCAtMjkwLDcgKzI5MCw3IEBACiAgICAgICAgICAgICB6LmNsb3NlKCkKICAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGF0YSwgemkuZ2V0X2RhdGEobmFtZSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ3ppcGltcG9ydGVyIG9iamVjdCcgaW4gcmVwcih6aSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3ppcGltcG9ydGVyIG9iamVjdCcgaW4gcmVwcih6aSkpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICB6LmNsb3NlKCkKICAgICAgICAgICAgIG9zLnJlbW92ZShURU1QX1pJUCkKQEAgLTM3Miw3ICszNzIsNyBAQAogCiAgICAgICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgcHJpbnRfdGIodGIsIDEsIHMpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5nZXR2YWx1ZSgpLmVuZHN3aXRoKHJhaXNlX3NyYykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXR2YWx1ZSgpLmVuZHN3aXRoKHJhaXNlX3NyYykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVGhpcyBvdWdodCB0byBiZSBpbXBvc3NpYmxlIikKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKaW5kZXggYjQxNmI4MS4uMWYwMjc4NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICAgICAgICAgICAgICBwcmludCAiRXhwZWN0ZWQgbGluZSIsIGV4cGVjdGVkCiAgICAgICAgICAgICAgICAgcHJpbnQgIkdvdCBzdGRvdXQ6IgogICAgICAgICAgICAgICAgIHByaW50IGRhdGEKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhleHBlY3RlZCBpbiBkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkIGluIGRhdGEpCiAgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBfbWFrZV90ZXN0X3ppcChkLCAidGVzdF96aXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X25hbWUsICdfX21haW5fXy5weScpCiAgICAgICAgICAgICBleGl0X2NvZGUsIGRhdGEgPSBfcnVuX3B5dGhvbih6aXBfbmFtZSkKQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ICJFeHBlY3RlZCBsaW5lIiwgZXhwZWN0ZWQKICAgICAgICAgICAgICAgICBwcmludCAiR290IHN0ZG91dDoiCiAgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkIGluIGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgaW4gZGF0YSkKIAogICAgIGRlZiB0ZXN0X3BkYl9pc3N1ZTQyMDEoc2VsZik6CiAgICAgICAgIHRlc3Rfc3JjID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKQEAgLTIxNSwxMyArMjE1LDEzIEBACiAgICAgICAgICAgICBwID0gX3NwYXduX3B5dGhvbihzY3JpcHRfbmFtZSkKICAgICAgICAgICAgIHAuc3RkaW4ud3JpdGUoJ2xcbicpCiAgICAgICAgICAgICBkYXRhID0gX2tpbGxfcHl0aG9uKHApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oc2NyaXB0X25hbWUgaW4gZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzY3JpcHRfbmFtZSBpbiBkYXRhKQogICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gX21ha2VfdGVzdF96aXAoZCwgInRlc3RfemlwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9uYW1lLCAnX19tYWluX18ucHknKQogICAgICAgICAgICAgcCA9IF9zcGF3bl9weXRob24oemlwX25hbWUpCiAgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdsXG4nKQogICAgICAgICAgICAgZGF0YSA9IF9raWxsX3B5dGhvbihwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJ1bl9uYW1lIGluIGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocnVuX25hbWUgaW4gZGF0YSkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3psaWIucHkgYi9MaWIvdGVzdC90ZXN0X3psaWIucHkKaW5kZXggY2JmODQ0Zi4uZjFmOWQzOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQpAQCAtMTAsNyArMTAsNyBAQAogICAgICMgY2hlY2tzdW0gdGVzdCBjYXNlcwogICAgIGRlZiB0ZXN0X2NyYzMyc3RhcnQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMigiIiksIHpsaWIuY3JjMzIoIiIsIDApKQotICAgICAgICBzZWxmLmFzc2VydF8oemxpYi5jcmMzMigiYWJjIiwgMHhmZmZmZmZmZikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6bGliLmNyYzMyKCJhYmMiLCAweGZmZmZmZmZmKSkKIAogICAgIGRlZiB0ZXN0X2NyYzMyZW1wdHkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMigiIiwgMCksIDApCkBAIC0xOSw3ICsxOSw3IEBACiAKICAgICBkZWYgdGVzdF9hZGxlcjMyc3RhcnQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5hZGxlcjMyKCIiKSwgemxpYi5hZGxlcjMyKCIiLCAxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHpsaWIuYWRsZXIzMigiYWJjIiwgMHhmZmZmZmZmZikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6bGliLmFkbGVyMzIoImFiYyIsIDB4ZmZmZmZmZmYpKQogCiAgICAgZGVmIHRlc3RfYWRsZXIzMmVtcHR5KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuYWRsZXIzMigiIiwgMCksIDApCkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICAgICAgd2hpbGUgY2I6CiAgICAgICAgICAgICAjbWF4X2xlbmd0aCA9IDEgKyBsZW4oY2IpLy8xMAogICAgICAgICAgICAgY2h1bmsgPSBkY28uZGVjb21wcmVzcyhjYiwgZGN4KQotICAgICAgICAgICAgc2VsZi5mYWlsSWYobGVuKGNodW5rKSA+IGRjeCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKGNodW5rKSA+IGRjeCwKICAgICAgICAgICAgICAgICAgICAgJ2NodW5rIHRvbyBiaWcgKCVkPiVkKScgJSAobGVuKGNodW5rKSwgZGN4KSkKICAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNodW5rKQogICAgICAgICAgICAgY2IgPSBkY28udW5jb25zdW1lZF90YWlsCkBAIC0yMzMsNyArMjMzLDcgQEAKICAgICAgICAgd2hpbGUgY2I6CiAgICAgICAgICAgICBtYXhfbGVuZ3RoID0gMSArIGxlbihjYikvLzEwCiAgICAgICAgICAgICBjaHVuayA9IGRjby5kZWNvbXByZXNzKGNiLCBtYXhfbGVuZ3RoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYobGVuKGNodW5rKSA+IG1heF9sZW5ndGgsCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihjaHVuaykgPiBtYXhfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2NodW5rIHRvbyBiaWcgKCVkPiVkKScgJSAobGVuKGNodW5rKSxtYXhfbGVuZ3RoKSkKICAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNodW5rKQogICAgICAgICAgICAgY2IgPSBkY28udW5jb25zdW1lZF90YWlsCkBAIC0yNDIsNyArMjQyLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHdoaWxlIGNodW5rOgogICAgICAgICAgICAgICAgIGNodW5rID0gZGNvLmRlY29tcHJlc3MoJycsIG1heF9sZW5ndGgpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYobGVuKGNodW5rKSA+IG1heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oY2h1bmspID4gbWF4X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmsgdG9vIGJpZyAoJWQ+JWQpJyAlIChsZW4oY2h1bmspLG1heF9sZW5ndGgpKQogICAgICAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNodW5rKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4oYnVmcyksICdXcm9uZyBkYXRhIHJldHJpZXZlZCcpCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICAgICAgIyBjYXVzZWQgYSBjb3JlIGR1bXAuKQogCiAgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvLmZsdXNoKCkpICAjIFJldHVybnMgYSB6bGliIGhlYWRlcgorICAgICAgICBzZWxmLmFzc2VydFRydWUoY28uZmx1c2goKSkgICMgUmV0dXJucyBhIHpsaWIgaGVhZGVyCiAgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLmZsdXNoKCksICIiKSAjIFJldHVybnMgbm90aGluZwogCg==