ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CmluZGV4IDhkZDZkZTYuLmUyZmE5ZmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQpAQCAtMzYsNyArMzYsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEwKSwgc3RyKGwwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEwKSwgcmVwcihsMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYGEyYCwgYGwyYCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEyKSwgcmVwcihsMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEyKSwgIlswLCAxLCAyXSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhMiksICJbMCwgMSwgMl0iKQogCkBAIC00MjEsNiArNDIxLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdS5yZXZlcnNlLCA0MikKIAogICAgIGRlZiB0ZXN0X3NvcnQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAgICAgKCJ0aGUgY21wIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3Rfc29ydCgpCisKKyAgICBkZWYgX3Rlc3Rfc29ydChzZWxmKToKICAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAwXSkKICAgICAgICAgdS5zb3J0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBbMCwgMV0pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5IGIvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weQppbmRleCBmYmRiM2QxLi40OWY2Mzc5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkKQEAgLTEsNiArMSw3IEBACiAjIHRlc3RzIGNvbW1vbiB0byBkaWN0IGFuZCBVc2VyRGljdAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgVXNlckRpY3QKK2ltcG9ydCB0ZXN0X3N1cHBvcnQKIAogCiBjbGFzcyBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTQsMTMgKzU1LDE3IEBACiAgICAgICAgICNsZW4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocCksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsZW4oc2VsZi5yZWZlcmVuY2UpKQotICAgICAgICAjaGFzX2tleQorICAgICAgICAjaW4KICAgICAgICAgZm9yIGsgaW4gc2VsZi5yZWZlcmVuY2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KGspKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBkKQogICAgICAgICBmb3IgayBpbiBzZWxmLm90aGVyOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoaykpCiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGssIGQpCisgICAgICAgICNoYXNfa2V5CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MocXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBmb3IgayBpbiBzZWxmLnJlZmVyZW5jZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KGspKQorICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5vdGhlcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGQuaGFzX2tleShrKSkKICAgICAgICAgI2NtcAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChwLHApLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkLGQpLCAwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weSBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKaW5kZXggZDEwMjU1ZC4uNDc3NGM2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQorKysgYi9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CkBAIC0xMzcsMTIgKzEzNywxMCBAQAogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAotICAgICAgICBUZXN0U3RyaW5nSU8sCi0gICAgICAgIFRlc3RjU3RyaW5nSU8sCi0gICAgICAgIFRlc3RCdWZmZXJTdHJpbmdJTywKLSAgICAgICAgVGVzdEJ1ZmZlcmNTdHJpbmdJTwotICAgICkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RTdHJpbmdJTywgVGVzdGNTdHJpbmdJTykKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QnVmZmVyU3RyaW5nSU8sIFRlc3RCdWZmZXJjU3RyaW5nSU8pCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CmluZGV4IDliMjg5YWIuLjZhNTczZTEgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQpAQCAtNzQ5LDcgKzc0OSw4IEBACiAKICAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCi0gICAgICAgIGIgPSBidWZmZXIoYSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgYiA9IGJ1ZmZlcihhKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIGEudG9zdHJpbmcoKVswXSkKIAogICAgIGRlZiB0ZXN0X3dlYWtyZWYoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CmluZGV4IDI5MzVhMGMuLjJlZTlkMmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CkBAIC0zMDIsNyArMzAyLDkgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChBU1RfVGVzdHMsIEFTVEhlbHBlcnNfVGVzdCkKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEFTVF9UZXN0cywgQVNUSGVscGVyc19UZXN0KQogCiBkZWYgbWFpbigpOgogICAgIGlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weSBiL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CmluZGV4IDY0ZGE2NTUuLjAyOTJhOTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CkBAIC0xLDYgKzEsNiBAQAogIyBBdWdtZW50ZWQgYXNzaWdubWVudCB0ZXN0LgogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfcHkza193YXJuaW5ncwogaW1wb3J0IHVuaXR0ZXN0CiAKIApAQCAtMzI0LDcgKzMyNCw4IEBACiAnJycuc3BsaXRsaW5lcygpKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KEF1Z0Fzc2lnblRlc3QpCisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCgiY2xhc3NpYyBpbnQgZGl2aXNpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KEF1Z0Fzc2lnblRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5IGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKaW5kZXggZjBhNTE1NC4uMWY3ZmQ2YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKQEAgLTk3LDIxICs5NywyMSBAQAogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmLCBzaXplKToKICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3V0Zi04JykKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8gNiArIDIsIG1lbXVzZT0yKQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDYgKyAyLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9lbmNvZGVfcmF3X3VuaWNvZGVfZXNjYXBlKHNlbGYsIHNpemUpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAncmF3X3VuaWNvZGVfZXNjYXBlJykKICAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgogICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CiAKLSAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvIDUgKyA3MCwgbWVtdXNlPTMpCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLy8gNSArIDcwLCBtZW11c2U9MykKICAgICBkZWYgdGVzdF9lbmNvZGVfdXRmNyhzZWxmLCBzaXplKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3V0ZjcnKQogICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CiAgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8gNCArIDUsIG1lbXVzZT02KQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDQgKyA1LCBtZW11c2U9NikKICAgICBkZWYgdGVzdF9lbmNvZGVfdXRmMzIoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICd1dGYzMicsIGV4cGVjdGVkc2l6ZT00KnNpemUrNCkKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIGRlZiB0ZXN0X2RlY29kZWFzY2lpKHNlbGYsIHNpemUpOgogICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAnYXNjaWknLCBjPSdBJykKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8gNSwgbWVtdXNlPTYrMikKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvLyA1LCBtZW11c2U9NisyKQogICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVwcl9vZmx3KHNlbGYsIHNpemUpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzID0gdSJcdUFBQUEiKnNpemUKQEAgLTUxNiw3ICs1MTYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCdcXCcpLCBzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcwJyksIHNpemUgKiAyKQogCi0gICAgQGJpZ21lbXRlc3QobWluc2l6ZT0yKiozMiAvIDUsIG1lbXVzZT02KzIpCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT0yKiozMiAvLyA1LCBtZW11c2U9NisyKQogICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVwcihzZWxmLCBzaXplKToKICAgICAgICAgcyA9IHUiXHVBQUFBIiAqIHNpemUKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXByKHMpKSA+IHNpemUpCkBAIC0xMDUzLDcgKzEwNTMsOCBAQAogICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHLCBtZW11c2U9NCkKICAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGIgPSBidWZmZXIoIkFBQUEiKSpzaXplCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgYiA9IGJ1ZmZlcigiQUFBQSIpKnNpemUKICAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgogICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jvb2wucHkgYi9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKaW5kZXggZTM0MmQ3Yi4uNzQ2NGM3MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ib29sLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQpAQCAtODUsMTAgKzg1LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UqMSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZSoxLCBGYWxzZSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUvMSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdChUcnVlLzEsIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UvMSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZS8xLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLy8xLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUvLzEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UvLzEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoRmFsc2UvLzEsIEZhbHNlKQogCiAgICAgICAgIGZvciBiIGluIEZhbHNlLCBUcnVlOgogICAgICAgICAgICAgZm9yIGkgaW4gMCwgMSwgMjoKQEAgLTE2Miw4ICsxNjIsOSBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGhhc2F0dHIoW10sICJ3b2JibGUiKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9jYWxsYWJsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZShsZW4pLCBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydElzKGNhbGxhYmxlKDEpLCBGYWxzZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZShsZW4pLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZSgxKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9pc2luc3RhbmNlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoVHJ1ZSwgYm9vbCksIFRydWUpCkBAIC0xNzgsOCArMTc5LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNzdWJjbGFzcyhpbnQsIGJvb2wpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2hhc2tleShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh7fS5oYXNfa2V5KDEpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh7MToxfS5oYXNfa2V5KDEpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4ge30sIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4gezE6MX0sIFRydWUpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoe30uaGFzX2tleSgxKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHsxOjF9Lmhhc19rZXkoMSksIFRydWUpCiAKICAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoInh5eiIuZW5kc3dpdGgoInoiKSwgVHJ1ZSkKQEAgLTI1MSw4ICsyNTUsOSBAQAogICAgICAgICBpbXBvcnQgb3BlcmF0b3IKICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci50cnV0aCgwKSwgRmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IudHJ1dGgoMSksIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNDYWxsYWJsZSgwKSwgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNDYWxsYWJsZShsZW4pLCBUcnVlKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzQ2FsbGFibGUoMCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc0NhbGxhYmxlKGxlbiksIFRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNOdW1iZXJUeXBlKE5vbmUpLCBGYWxzZSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc051bWJlclR5cGUoMCksIFRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3Iubm90XygxKSwgRmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1ZmZlci5weSBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CmluZGV4IDNiZWRlODguLjZiZGMzNGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CkBAIC0yMyw3ICsyMyw5IEBACiAKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQnVmZmVyVGVzdHMpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJ1ZmZlclRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggYWM5ZDg1ZC4uMDU2ODZiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMywxNCArMywxMCBAQAogaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZjbXAsIGhhdmVfdW5pY29kZSwgVEVTVEZOLCB1bmxpbmssIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl91bml0dGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3VuaXR0ZXN0LCBjaGVja19weTNrX3dhcm5pbmdzCiBmcm9tIG9wZXJhdG9yIGltcG9ydCBuZWcKIAotaW1wb3J0IHN5cywgd2FybmluZ3MsIGNTdHJpbmdJTywgcmFuZG9tLCBVc2VyRGljdAotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJoZXguLi9vY3QuLiBvZiBuZWdhdGl2ZSBpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRnV0dXJlV2FybmluZywgX19uYW1lX18pCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAidW5pdHRlc3QiKQoraW1wb3J0IHN5cywgY1N0cmluZ0lPLCByYW5kb20sIFVzZXJEaWN0CiAKICMgY291bnQgdGhlIG51bWJlciBvZiB0ZXN0IHJ1bnMuCiAjIHVzZWQgdG8gc2tpcCBydW5uaW5nIHRlc3RfZXhlY2ZpbGUoKSBtdWx0aXBsZSB0aW1lcwpAQCAtNDE5LDcgKzQxNSw5IEBACiAgICAgZi53cml0ZSgneiA9IHorMVxuJykKICAgICBmLndyaXRlKCd6ID0geioyXG4nKQogICAgIGYuY2xvc2UoKQotICAgIGV4ZWNmaWxlKFRFU1RGTikKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBleGVjZmlsZShURVNURk4pCiAKICAgICBkZWYgdGVzdF9leGVjZmlsZShzZWxmKToKICAgICAgICAgZ2xvYmFsIG51bXJ1bnMKQEAgLTE1NDIsMTcgKzE1NDAsMjQgQEAKICAgICAgICAgZGF0YSA9ICdUaGUgcXVpY2sgQnJvd24gZm94IEp1bXBlZCBvdmVyIFRoZSBsYXp5IERvZycuc3BsaXQoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNvcnRlZCwgZGF0YSwgTm9uZSwgbGFtYmRhIHgseTogMCkKIAorZGVmIF9ydW5fdW5pdHRlc3QoKmFyZ3MpOgorICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiLisgbm90IHN1cHBvcnRlZCBpbiAzLngiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCIuKyBpcyByZW5hbWVkIHRvIGltcC5yZWxvYWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCJjbGFzc2ljIGludCBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoKmFyZ3MpCisKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgICB0ZXN0X2NsYXNzZXMgPSAoQnVpbHRpblRlc3QsIFRlc3RTb3J0ZWQpCiAKLSAgICBydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICBfcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCiAKICAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKICAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKICAgICAgICAgaW1wb3J0IGdjCiAgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKLSAgICAgICAgICAgIHJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgX3J1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQogICAgICAgICAgICAgZ2MuY29sbGVjdCgpCiAgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCiAgICAgICAgIHByaW50IGNvdW50cwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9jYWxsLnB5CmluZGV4IGYzYzdjOGMuLmQwNmMyYzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhbGwucHkKQEAgLTEyLDcgKzEyLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5oYXNfa2V5KQogCiAgICAgZGVmIHRlc3RfdmFyYXJnczEoc2VsZik6Ci0gICAgICAgIHt9Lmhhc19rZXkoMCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAge30uaGFzX2tleSgwKQogCiAgICAgZGVmIHRlc3RfdmFyYXJnczIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30uaGFzX2tleSwgMCwgMSkKQEAgLTI0LDExICsyNSwxMyBAQAogICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIHRlc3RfdmFyYXJnczFfZXh0KHNlbGYpOgotICAgICAgICB7fS5oYXNfa2V5KCooMCwpKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB7fS5oYXNfa2V5KCooMCwpKQogCiAgICAgZGVmIHRlc3RfdmFyYXJnczJfZXh0KHNlbGYpOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB7fS5oYXNfa2V5KCooMSwgMikpCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAge30uaGFzX2tleSgqKDEsIDIpKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weSBiL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKaW5kZXggZmM2MWQyMS4uOTE0ZWE3MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKHRlc3RtZSwgMSkpXSkKIAogICAgICAgICBjYWxsTHN0WzpdID0gW10KLSAgICAgICAgdGVzdG1lIDw+IDEgICMgWFhYIGtpbGwgdGhpcyBpbiBweTNrCisgICAgICAgIGV2YWwoJ3Rlc3RtZSA8PiAxJykgICMgWFhYIGtpbGwgdGhpcyBpbiBweTNrCiAgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCiAKICAgICAgICAgY2FsbExzdFs6XSA9IFtdCkBAIC00MjcsNyArNDI3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKDEsIHRlc3RtZSkpXSkKIAogICAgICAgICBjYWxsTHN0WzpdID0gW10KLSAgICAgICAgMSA8PiB0ZXN0bWUKKyAgICAgICAgZXZhbCgnMSA8PiB0ZXN0bWUnKQogICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQogCiAgICAgICAgIGNhbGxMc3RbOl0gPSBbXQpAQCAtNjE2LDcgKzYxNiwxMSBAQAogICAgICAgICBoYXNoKGEuZikKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ2xhc3NUZXN0cykKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCIuK19fKGdldHxzZXR8ZGVsKXNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNsYXNzaWMgaW50IGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiPD4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENsYXNzVGVzdHMpCiAKIGlmIF9fbmFtZV9fPT0nX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2N0eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfY3R5cGVzLnB5CmluZGV4IDg1ZjEzN2UuLmYyZjM2YzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY3R5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY3R5cGVzLnB5CkBAIC0xLDE1ICsxLDE3IEBACiBpbXBvcnQgdW5pdHRlc3QKIAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUsIGNoZWNrX3B5M2tfd2FybmluZ3MKICNTa2lwIHRlc3RzIGlmIF9jdHlwZXMgbW9kdWxlIGRvZXMgbm90IGV4aXN0CiBpbXBvcnRfbW9kdWxlKCdfY3R5cGVzJykKIAotaW1wb3J0IGN0eXBlcy50ZXN0CiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICBza2lwcGVkLCB0ZXN0Y2FzZXMgPSBjdHlwZXMudGVzdC5nZXRfdGVzdHMoY3R5cGVzLnRlc3QsICJ0ZXN0XyoucHkiLCB2ZXJib3NpdHk9MCkKLSAgICBzdWl0ZXMgPSBbdW5pdHRlc3QubWFrZVN1aXRlKHQpIGZvciB0IGluIHRlc3RjYXNlc10KLSAgICBydW5fdW5pdHRlc3QodW5pdHRlc3QuVGVzdFN1aXRlKHN1aXRlcykpCisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiY2xhc3NpYyAoaW50fGxvbmcpIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIGltcG9ydCBjdHlwZXMudGVzdAorICAgICAgICBza2lwcGVkLCB0ZXN0Y2FzZXMgPSBjdHlwZXMudGVzdC5nZXRfdGVzdHMoY3R5cGVzLnRlc3QsICJ0ZXN0XyoucHkiLCB2ZXJib3NpdHk9MCkKKyAgICAgICAgc3VpdGVzID0gW3VuaXR0ZXN0Lm1ha2VTdWl0ZSh0KSBmb3IgdCBpbiB0ZXN0Y2FzZXNdCisgICAgICAgIHJ1bl91bml0dGVzdCh1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVzKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggNTM2ZDcwYS4uYmZmODhiYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC00NjIyLDkgKzQ2MjIsMTQgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgIyBSdW4gYWxsIGxvY2FsIHRlc3QgY2FzZXMsIHdpdGggUFR5cGVzTG9uZ0luaXRUZXN0IGZpcnN0LgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUFR5cGVzTG9uZ0luaXRUZXN0LCBPcGVyYXRvcnNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NQcm9wZXJ0aWVzQW5kTWV0aG9kcywgRGljdFByb3h5VGVzdHMpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiY2xhc3NpYyAoaW50fGxvbmcpIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiY29lcmNlLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoIk92ZXJyaWRpbmcgX19jbXBfXyAiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCIuK19fKGdldHxzZXR8ZGVsKXNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAjIFJ1biBhbGwgbG9jYWwgdGVzdCBjYXNlcywgd2l0aCBQVHlwZXNMb25nSW5pdFRlc3QgZmlyc3QuCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUFR5cGVzTG9uZ0luaXRUZXN0LCBPcGVyYXRvcnNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzUHJvcGVydGllc0FuZE1ldGhvZHMsIERpY3RQcm94eVRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggNDI2YjMzZi4uZmFhOTlhYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtMjE2OSw3ICsyMTY5LDcgQEAKICAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KIAogKE5vdGU6IHdlJ2xsIGJlIGNsZWFyaW5nIGRvY3Rlc3QubWFzdGVyIGFmdGVyIGVhY2ggY2FsbCB0bwotYGRvY3Rlc3QudGVzdGZpbGVgLCB0byBzdXByZXNzIHdhcm5pbmdzIGFib3V0IG11bHRpcGxlIHRlc3RzIHdpdGggdGhlCitgZG9jdGVzdC50ZXN0ZmlsZWAsIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IG11bHRpcGxlIHRlc3RzIHdpdGggdGhlCiBzYW1lIG5hbWUuKQogCiBHbG9iYWxzIG1heSBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGdsb2JzYCBhbmQgYGV4dHJhZ2xvYnNgIHBhcmFtZXRlcnM6CkBAIC0yMzMzLDEyICsyMzMzLDYgQEAKICMgdGhhdCB0aGVzZSB1c2UgdGhlIGRlcHJlY2F0ZWQgZG9jdGVzdC5UZXN0ZXIsIHNvIHNob3VsZCBnbyBhd2F5IChvcgogIyBiZSByZXdyaXR0ZW4pIHNvbWVkYXkuCiAKLSMgSWdub3JlIGFsbCB3YXJuaW5ncyBhYm91dCB0aGUgdXNlIG9mIGNsYXNzIFRlc3RlciBpbiB0aGlzIG1vZHVsZS4KLSMgTm90ZSB0aGF0IHRoZSBuYW1lIG9mIHRoaXMgbW9kdWxlIG1heSBkaWZmZXIgZGVwZW5kaW5nIG9uIGhvdyBpdCdzCi0jIGltcG9ydGVkLCBzbyB0aGUgdXNlIG9mIF9fbmFtZV9fIGlzIGltcG9ydGFudC4KLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY2xhc3MgVGVzdGVyIiwgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgX19uYW1lX18sIDApCi0KIGRlZiBvbGRfdGVzdDEoKTogciIiIgogPj4+IGZyb20gZG9jdGVzdCBpbXBvcnQgVGVzdGVyCiA+Pj4gdCA9IFRlc3RlcihnbG9icz17J3gnOiA0Mn0sIHZlcmJvc2U9MCkKQEAgLTI0NjIsOSArMjQ1NiwxNiBAQAogZGVmIHRlc3RfbWFpbigpOgogICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgaW4gZG9jdGVzdCBpdHNlbGY6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KGRvY3Rlc3QsIHZlcmJvc2l0eT1UcnVlKQotICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgZGVmaW5lZCBoZXJlOgorCiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RvY3Rlc3QKLSAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgIyBJZ25vcmUgYWxsIHdhcm5pbmdzIGFib3V0IHRoZSB1c2Ugb2YgY2xhc3MgVGVzdGVyIGluIHRoaXMgbW9kdWxlLgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImNsYXNzIFRlc3RlciBpcyBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGRlZmluZWQgaGVyZToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCiAKIGltcG9ydCB0cmFjZSwgc3lzCiBkZWYgdGVzdF9jb3ZlcmFnZShjb3ZlcmRpcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5IGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQppbmRleCBmYWM2ODQ1Li5hZmQ3NjAxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKQEAgLTM1Niw3ICszNTYsMTAgQEAKICAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLm5sYXJnZXN0LCBzZWxmLm1vZHVsZS5uc21hbGxlc3QpOgogICAgICAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKICAgICAgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIEwsIFIpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMiwgZyhzKSksIGYoMixzKSkKKyAgICAgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImNvbXBhcmluZyB1bmVxdWFsIHR5cGVzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1UcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigyLCBnKHMpKSwgZigyLHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigyLCBTKHMpKSwgW10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCAyLCBYKHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMiwgTihzKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCBlNjA3YWYyLi4zODlkYWU3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC00LDEwICs0LDEzIEBACiBpbXBvcnQgaW5zcGVjdAogaW1wb3J0IGRhdGV0aW1lCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19weTNrX3dhcm5pbmdzCiAKLWZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIgYXMgbW9kCi1mcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyMiBhcyBtb2QyCit3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgIHF1aWV0PVRydWUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIgYXMgbW9kCisgICAgZnJvbSB0ZXN0IGltcG9ydCBpbnNwZWN0X2ZvZGRlcjIgYXMgbW9kMgogCiAjIEMgbW9kdWxlIGZvciB0ZXN0X2ZpbmRzb3VyY2VfYmluYXJ5CiBpbXBvcnQgdW5pY29kZWRhdGEKQEAgLTI5LDcgKzMyLDcgQEAKIGltcG9ydCBfX2J1aWx0aW5fXwogCiB0cnk6Ci0gICAgMS8wCisgICAgMSAvLyAwCiBleGNlcHQ6CiAgICAgdGIgPSBzeXMuZXhjX3RyYWNlYmFjawogCkBAIC00MjAsMTEgKzQyMywxNCBAQAogICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKIAogICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfc3VibGlzdG9mb25lKHNlbGYpOgotICAgICAgICBkZWYgc3VibGlzdE9mT25lKChmb28sKSk6IHJldHVybiAxCi0gICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhzdWJsaXN0T2ZPbmUsIFtbJ2ZvbyddXSkKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgICAgICgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAgICAgKCJwYXJlbnRoZXNpemVkIGFyZ3VtZW50IG5hbWVzIGFyZSBpbnZhbGlkIiwgU3ludGF4V2FybmluZykpOgorICAgICAgICAgICAgZXhlYyAnZGVmIHN1Ymxpc3RPZk9uZSgoZm9vLCkpOiByZXR1cm4gMScKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhzdWJsaXN0T2ZPbmUsIFtbJ2ZvbyddXSkKIAotICAgICAgICBkZWYgZmFrZVN1Ymxpc3RPZk9uZSgoZm9vKSk6IHJldHVybiAxCi0gICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhmYWtlU3VibGlzdE9mT25lLCBbJ2ZvbyddKQorICAgICAgICAgICAgZXhlYyAnZGVmIGZha2VTdWJsaXN0T2ZPbmUoKGZvbykpOiByZXR1cm4gMScKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhmYWtlU3VibGlzdE9mT25lLCBbJ2ZvbyddKQogCiAgICAgZGVmIHRlc3RfY2xhc3NpZnlfb2xkc3R5bGUoc2VsZik6CiAgICAgICAgIGNsYXNzIEE6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKaW5kZXggY2RhODE5NC4uZWYxOWQxZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQpAQCAtMSw3ICsxLDggQEAKICMgVGVzdCBpdGVyYXRvcnMuCiAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaywgaGF2ZV91bmljb2RlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRFU1RGTiwgdW5saW5rLCBoYXZlX3VuaWNvZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3B5M2tfd2FybmluZ3MKIAogIyBUZXN0IHJlc3VsdCBvZiB0cmlwbGUgbG9vcCAodG9vIGJpZyB0byBpbmxpbmUpCiBUUklQTEVUUyA9IFsoMCwgMCwgMCksICgwLCAwLCAxKSwgKDAsIDAsIDIpLApAQCAtMzk2LDIxICszOTcsMjQgQEAKIAogICAgICMgVGVzdCBtYXAoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCiAgICAgZGVmIHRlc3RfYnVpbHRpbl9tYXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKE5vbmUsIFNlcXVlbmNlQ2xhc3MoNSkpLCByYW5nZSg1KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAobGFtYmRhIHg6IHgrMSwgU2VxdWVuY2VDbGFzcyg1KSksIHJhbmdlKDEsIDYpKQogCiAgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBkKSwgZC5rZXlzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKGxhbWJkYSBrLCBkPWQ6IChrLCBkW2tdKSwgZCksIGQuaXRlbXMoKSkKICAgICAgICAgZGtleXMgPSBkLmtleXMoKQogICAgICAgICBleHBlY3RlZCA9IFsoaSA8IGxlbihkKSBhbmQgZGtleXNbaV0gb3IgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICBpIDwgbGVuKGQpIGFuZCBka2V5c1tpXSBvciBOb25lKQogICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KV0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAoTm9uZSwgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VDbGFzcyg1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcihkLml0ZXJrZXlzKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgICAgICAjIERlcHJlY2F0ZWQgbWFwKE5vbmUsIC4uLikKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBTZXF1ZW5jZUNsYXNzKDUpKSwgcmFuZ2UoNSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBkKSwgZC5rZXlzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VDbGFzcyg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIoZC5pdGVya2V5cygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQogCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQogICAgICAgICB0cnk6CkBAIC01MDYsNyArNTEwLDExIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoeCwgeSksIGV4cGVjdGVkKQogCiAgICAgIyBUZXN0IHJlZHVjZXMoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCi0gICAgZGVmIHRlc3RfYnVpbHRpbl9yZWR1Y2Uoc2VsZik6CisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9idWlsdGluX3JlZHVjZShzZWxmKToKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2J1aWx0aW5fcmVkdWNlKCkKKworICAgIGRlZiBfdGVzdF9idWlsdGluX3JlZHVjZShzZWxmKToKICAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgYWRkCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU2VxdWVuY2VDbGFzcyg1KSksIDEwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoNSksIDQyKSwgNTIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKaW5kZXggZTdiZWRlYi4uNTk5NjdlYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQpAQCAtNTc0LDExICs1NzQsMTIgQEAKICAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGksIGoKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVstNUw6N0xdLCAoLTUsIDcpKQotICAgICAgICAjIHVzZSB0aGUgY2xhbXBpbmcgZWZmZWN0IHRvIHRlc3QgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGxvbmdzCi0gICAgICAgICMgdGhhdCBmaXQgYSBQeV9zc2l6ZV90Ci0gICAgICAgIHNsaWNlbWluLCBzbGljZW1heCA9IFgoKVstMkwqKjEwMDoyTCoqMTAwXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVtzbGljZW1pbjpzbGljZW1heF0sIChzbGljZW1pbiwgc2xpY2VtYXgpKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVstNUw6N0xdLCAoLTUsIDcpKQorICAgICAgICAgICAgIyB1c2UgdGhlIGNsYW1waW5nIGVmZmVjdCB0byB0ZXN0IHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBsb25ncworICAgICAgICAgICAgIyB0aGF0IGZpdCBhIFB5X3NzaXplX3QKKyAgICAgICAgICAgIHNsaWNlbWluLCBzbGljZW1heCA9IFgoKVstMkwqKjEwMDoyTCoqMTAwXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKClbc2xpY2VtaW46c2xpY2VtYXhdLCAoc2xpY2VtaW4sIHNsaWNlbWF4KSkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXN0cyBvZiBhdXRvIGludC0+bG9uZyBjb252ZXJzaW9uCiAKQEAgLTYxNiw4ICs2MTcsOSBAQAogICAgICAgICAgICAgICAgIGNoZWNraXQoeCwgJyonLCB5KQogCiAgICAgICAgICAgICAgICAgaWYgeToKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvIGxvbmd5Ci0gICAgICAgICAgICAgICAgICAgIGdvdCA9IHggLyB5CisgICAgICAgICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZ3ggLyBsb25neQorICAgICAgICAgICAgICAgICAgICAgICAgZ290ID0geCAvIHkKICAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnLycsIHkpCiAKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvLyBsb25neQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5IGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CmluZGV4IDc2NjkxODIuLjdlMjE4NjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKQEAgLTEyOSw3ICsxMjksOSBAQAogCiAgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgogICAgICAgICBmb3IgcyBpbiBbIiIsICJBbmRy6CBQcmV2aW4iLCAiYWJjIiwgIiAiKjEwMDAwXToKLSAgICAgICAgICAgIGIgPSBidWZmZXIocykKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICAgICAgYiA9IGJ1ZmZlcihzKQogICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCiAgICAgICAgICAgICBtYXJzaGFsLmR1bXAoYiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKaW5kZXggNmU1ODVjMS4uYzFhYjM5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKQEAgLTIwMjMsNyArMjAyMyw5IEBACiAKICAgICBsb2FkVGVzdHNGcm9tVGVzdENhc2UgPSB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShsb2FkVGVzdHNGcm9tVGVzdENhc2UodGMpIGZvciB0YyBpbiB0ZXN0Y2FzZXMpCi0gICAgcnVuKHN1aXRlKQorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoIi4rX18oZ2V0fHNldClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgcnVuKHN1aXRlKQogCiAgICAgVGhyZWFkc01peGluLnBvb2wudGVybWluYXRlKCkKICAgICBQcm9jZXNzZXNNaXhpbi5wb29sLnRlcm1pbmF0ZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQppbmRleCAyNzU4ODU2Li5hNDY1MGY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKQEAgLTE5Miw3ICsxOTIsOSBAQAogICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBkZWYgY2hlY2soc2VsZiwgbywgdik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNDYWxsYWJsZShvKSA9PSBjYWxsYWJsZShvKSA9PSB2KQorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXNDYWxsYWJsZShvKSwgdikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxhYmxlKG8pLCB2KQogICAgICAgICBjaGVjayhzZWxmLCA0LCAwKQogICAgICAgICBjaGVjayhzZWxmLCBvcGVyYXRvci5pc0NhbGxhYmxlLCAxKQogICAgICAgICBjaGVjayhzZWxmLCBDLCAxKQpAQCAtMzA2LDggKzMwOCw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29udGFpbnMsIE5vbmUsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuY29udGFpbnMocmFuZ2UoNCksIDUpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSg0KSwgMikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSg0KSwgNSkpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSg0KSwgNSkpCiAKICAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgogICAgICAgICBhID0gcmFuZ2UoMykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKaW5kZXggODVmNTkzNy4uZDA1ZmVhNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKQEAgLTIwNiwxNyArMjA2LDIwIEBACiAgICAgaW1wb3J0IHN5cwogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAgICAgdGVzdF9jbGFzc2VzID0gKFRlc3RUcmFuZm9ybXMsKQotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKIAotICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZwotICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgotICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgY291bnRzID0gW05vbmVdICogNQotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQotICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCi0gICAgICAgIHByaW50IGNvdW50cworICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwgU3ludGF4V2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKKyAgICAgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICAgICAgaW1wb3J0IGdjCisgICAgICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICBwcmludCBjb3VudHMKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5IGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CmluZGV4IDgyYTVhNmUuLjcwZmEwZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKQEAgLTMyNyw3ICszMjcsMTIgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3AoeCwgeSksIFRydWUpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFZlY3RvclRlc3QsIE51bWJlclRlc3QsIE1pc2NUZXN0LCBEaWN0VGVzdCwgTGlzdFRlc3QpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChWZWN0b3JUZXN0LCBOdW1iZXJUZXN0LCBNaXNjVGVzdCwgTGlzdFRlc3QpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImRpY3QgaW5lcXVhbGl0eSBjb21wYXJpc29ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRGljdFRlc3QpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCAxNTQ4YTY1Li5iMjgwMjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtMTM0NSw2ICsxMzQ1LDEwIEBACiAgICAgICAgIHNlbGYub3RoZXIgPSBvcGVyYXRvci5hZGQKICAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQogCisgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHN1cGVyKFRlc3RPbmx5U2V0c09wZXJhdG9yLCBzZWxmKS50ZXN0X2dlX2d0X2xlX2x0KCkKKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBUZXN0T25seVNldHNUdXBsZShUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldHMucHkgYi9MaWIvdGVzdC90ZXN0X3NldHMucHkKaW5kZXggY2EwNDlhNC4uMDc1NGVkNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQpAQCAtMSwxMyArMSwxMSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAKLWltcG9ydCB3YXJuaW5ncwotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0aGUgc2V0cyBtb2R1bGUgaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsICJ0ZXN0XC50ZXN0X3NldHMiKQotCiBpbXBvcnQgdW5pdHRlc3QsIG9wZXJhdG9yLCBjb3B5LCBwaWNrbGUsIHJhbmRvbQotZnJvbSBzZXRzIGltcG9ydCBTZXQsIEltbXV0YWJsZVNldAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoInNldHMiLCBkZXByZWNhdGVkPVRydWUpCitmcm9tIHNldHMgaW1wb3J0IFNldCwgSW1tdXRhYmxlU2V0CisKIGVtcHR5X3NldCA9IFNldCgpCiAKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTYzOCw2ICs2MzYsMTAgQEAKICAgICAgICAgc2VsZi5vdGhlciA9IG9wZXJhdG9yLmFkZAogICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IEZhbHNlCiAKKyAgICBkZWYgdGVzdF9nZV9ndF9sZV9sdChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc3VwZXIoVGVzdE9ubHlTZXRzT3BlcmF0b3IsIHNlbGYpLnRlc3RfZ2VfZ3RfbGVfbHQoKQorCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIFRlc3RPbmx5U2V0c1R1cGxlKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKQEAgLTY3OSwyMCArNjgxLDE2IEBACiAKICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgogICAgICAgICBkdXAgPSBzZWxmLnNldC5jb3B5KCkKLSAgICAgICAgZHVwX2xpc3QgPSBsaXN0KGR1cCk7IGR1cF9saXN0LnNvcnQoKQotICAgICAgICBzZXRfbGlzdCA9IGxpc3Qoc2VsZi5zZXQpOyBzZXRfbGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwKSwgbGVuKHNlbGYuc2V0KSkKKyAgICAgICAgZHVwX2xpc3QgPSBzb3J0ZWQoZHVwKQorICAgICAgICBzZXRfbGlzdCA9IHNvcnRlZChzZWxmLnNldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZHVwX2xpc3QpKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdXBfbGlzdFtpXSBpcyBzZXRfbGlzdFtpXSkKKyAgICAgICAgZm9yIGksIGVsIGluIGVudW1lcmF0ZShkdXBfbGlzdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGVsLCBzZXRfbGlzdFtpXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKICAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKLSAgICAgICAgIyNwcmludCB0eXBlKGR1cCksIHJlcHIoZHVwKQotICAgICAgICBkdXBfbGlzdCA9IGxpc3QoZHVwKTsgZHVwX2xpc3Quc29ydCgpCi0gICAgICAgIHNldF9saXN0ID0gbGlzdChzZWxmLnNldCk7IHNldF9saXN0LnNvcnQoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXBfbGlzdCksIGxlbihzZXRfbGlzdCkpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkdXBfbGlzdCkpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdXBfbGlzdFtpXSwgc2V0X2xpc3RbaV0pCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoZHVwLCBzZWxmLnNldCkKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC03MTIsNiArNzEwLDEwIEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNldCA9IFNldChbInplcm8iLCAwLCBOb25lXSkKIAorICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHN1cGVyKFRlc3RDb3B5aW5nVHJpcGxlLCBzZWxmKS50ZXN0X2NvcHkoKQorCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIFRlc3RDb3B5aW5nVHVwbGUoVGVzdENvcHlpbmcpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zbGljZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkKaW5kZXggMDhkZThlMy4uYjkyMDhlNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbGljZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NsaWNlLnB5CkBAIC0xMTUsNyArMTE1LDggQEAKICAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKChpLCBqLCBrKSkKIAogICAgICAgICB4ID0gWCgpCi0gICAgICAgIHhbMToyXSA9IDQyCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHhbMToyXSA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRtcCwgWygxLCAyLCA0MildKQogCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCA3NWJkMjU4Li5mNjk5ZTNjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMTIzLDggKzEyMyw5IEBACiAgICAgICAgIHNlbGYuc2VydmVyX3JlYWR5LndhaXQoKQogICAgICAgICBzZWxmLmNsaWVudF9yZWFkeS5zZXQoKQogICAgICAgICBzZWxmLmNsaWVudFNldFVwKCkKLSAgICAgICAgaWYgbm90IGNhbGxhYmxlKHRlc3RfZnVuYyk6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJ0ZXN0X2Z1bmMgbXVzdCBiZSBhIGNhbGxhYmxlIGZ1bmN0aW9uIgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBpZiBub3QgY2FsbGFibGUodGVzdF9mdW5jKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRlc3RfZnVuYyBtdXN0IGJlIGEgY2FsbGFibGUgZnVuY3Rpb24uIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGVzdF9mdW5jKCkKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgc3RyZXJyb3I6CkBAIC0xMzIsNyArMTMzLDcgQEAKICAgICAgICAgc2VsZi5jbGllbnRUZWFyRG93bigpCiAKICAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJjbGllbnRTZXRVcCBtdXN0IGJlIGltcGxlbWVudGVkLiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiY2xpZW50U2V0VXAgbXVzdCBiZSBpbXBsZW1lbnRlZC4iKQogCiAgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmRvbmUuc2V0KCkKQEAgLTI4Miw4ICsyODMsOCBAQAogICAgICAgICAgICAgICAgIG9yaWcgPSBzeXMuZ2V0cmVmY291bnQoX19uYW1lX18pCiAgICAgICAgICAgICAgICAgc29ja2V0LmdldG5hbWVpbmZvKF9fbmFtZV9fLDApCiAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgICAgIGlmIHN5cy5nZXRyZWZjb3VudChfX25hbWVfXykgPD4gb3JpZzoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKSwgb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQogCiAgICAgZGVmIHRlc3RJbnRlcnByZXRlckNyYXNoKHNlbGYpOgogICAgICAgICAjIE1ha2luZyBzdXJlIGdldG5hbWVpbmZvIGRvZXNuJ3QgY3Jhc2ggdGhlIGludGVycHJldGVyCkBAIC0xMjM0LDcgKzEyMzUsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQogCiAgICAgZGVmIF90ZXN0UmVjdkludG9BcnJheShzZWxmKToKLSAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKICAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChidWYpCiAKICAgICBkZWYgdGVzdFJlY3ZJbnRvQnl0ZWFycmF5KHNlbGYpOgpAQCAtMTI2Myw3ICsxMjY1LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKIAogICAgIGRlZiBfdGVzdFJlY3ZGcm9tSW50b0FycmF5KHNlbGYpOgotICAgICAgICBidWYgPSBidWZmZXIoTVNHKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBidWYgPSBidWZmZXIoTVNHKQogICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKGJ1ZikKIAogICAgIGRlZiB0ZXN0UmVjdkZyb21JbnRvQnl0ZWFycmF5KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CmluZGV4IGE2MWZiOTYuLmQ3NWFiYzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvcnQucHkKQEAgLTE4NSw3ICsxODUsNyBAQAogICAgIGRlZiB0ZXN0X3N0YWJpbGl0eShzZWxmKToKICAgICAgICAgZGF0YSA9IFsocmFuZG9tLnJhbmRyYW5nZSgxMDApLCBpKSBmb3IgaSBpbiB4cmFuZ2UoMjAwKV0KICAgICAgICAgY29weSA9IGRhdGFbOl0KLSAgICAgICAgZGF0YS5zb3J0KGtleT1sYW1iZGEgKHgseSk6IHgpICAjIHNvcnQgb24gdGhlIHJhbmRvbSBmaXJzdCBmaWVsZAorICAgICAgICBkYXRhLnNvcnQoa2V5PWxhbWJkYSB4OiB4WzBdKSAgICMgc29ydCBvbiB0aGUgcmFuZG9tIGZpcnN0IGZpZWxkCiAgICAgICAgIGNvcHkuc29ydCgpICAgICAgICAgICAgICAgICAgICAgIyBzb3J0IHVzaW5nIGJvdGggZmllbGRzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgY29weSkgICAgIyBzaG91bGQgZ2V0IHRoZSBzYW1lIHJlc3VsdAogCkBAIC0yMDcsNyArMjA3LDcgQEAKICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgd3JhcHBlciBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgIGRhdGEgPSByYW5nZSgtMiwyKQogICAgICAgICBkdXAgPSBkYXRhWzpdCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBkYXRhLnNvcnQsIE5vbmUsIGxhbWJkYSB4OiAxL3gpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBkYXRhLnNvcnQsIE5vbmUsIGxhbWJkYSB4OiAxIC8vIHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZHVwKQogCiAgICAgZGVmIHRlc3Rfa2V5X3dpdGhfbXV0YXRpb24oc2VsZik6CkBAIC0yNzQsMTcgKzI3NCwxOSBAQAogICAgICAgICBUZXN0QnVncywKICAgICApCiAKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKIAotICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZwotICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgotICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgY291bnRzID0gW05vbmVdICogNQotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgotICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQotICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCi0gICAgICAgIHByaW50IGNvdW50cworICAgICAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICAgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIHByaW50IGNvdW50cwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CmluZGV4IGQ0NTIzMTcuLmYyOTlkMzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CkBAIC04MDUsNyArODA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHBwcmludC5wZm9ybWF0KGNlcnQpICsgJ1xuJykKICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkNvbm5lY3Rpb24gY2lwaGVyIGlzICIgKyBzdHIoY2lwaGVyKSArICcuXG4nKQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2VydC5oYXNfa2V5KCdzdWJqZWN0Jyk6CisgICAgICAgICAgICAgICAgICAgIGlmICdzdWJqZWN0JyBub3QgaW4gY2VydDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBzdWJqZWN0IGZpZWxkIGluIGNlcnRpZmljYXRlOiAlcy4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChjZXJ0KSkKQEAgLTk2Nyw3ICs5NjcsOCBAQAogICAgICAgICAgICAgICAgICMgbm93IGZldGNoIHRoZSBzYW1lIGRhdGEgZnJvbSB0aGUgSFRUUFMgc2VydmVyCiAgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vMTI3LjAuMC4xOiVkLyVzJyAlICgKICAgICAgICAgICAgICAgICAgICAgc2VydmVyLnBvcnQsIG9zLnBhdGguc3BsaXQoQ0VSVEZJTEUpWzFdKQotICAgICAgICAgICAgICAgIGYgPSB1cmxsaWIudXJsb3Blbih1cmwpCisgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgICAgICBmID0gdXJsbGliLnVybG9wZW4odXJsKQogICAgICAgICAgICAgICAgIGRsZW4gPSBmLmluZm8oKS5nZXRoZWFkZXIoImNvbnRlbnQtbGVuZ3RoIikKICAgICAgICAgICAgICAgICBpZiBkbGVuIGFuZCAoaW50KGRsZW4pID4gMCk6CiAgICAgICAgICAgICAgICAgICAgIGQyID0gZi5yZWFkKGludChkbGVuKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggMjExOGM2Mi4uODk5ZGI2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTU1Miw3ICs1NTIsOSBAQAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3ludGF4VGVzdENhc2UpCiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N5bnRheAotICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3N5bnRheCwgdmVyYm9zaXR5PVRydWUpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3Rfc3ludGF4LCB2ZXJib3NpdHk9VHJ1ZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKaW5kZXggZTRiNGI1Yi4uMjFlOGI5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CkBAIC0xLDYgKzEsNyBAQAogIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCA2LCBidWlsdC1pbiB0eXBlcwogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZSwgcnVuX3dpdGhfbG9jYWxlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZSwgcnVuX3dpdGhfbG9jYWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19weTNrX3dhcm5pbmdzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKIGltcG9ydCBsb2NhbGUKQEAgLTc0MSw3ICs3NDIsMTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMCwgJywnICsgY29kZSkKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHJ1bl91bml0dGVzdChUeXBlc1Rlc3RzKQorICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNsYXNzaWMgbG9uZyBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoVHlwZXNUZXN0cykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weSBiL0xpYi90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHkKaW5kZXggMGE5MjE5Ny4uYThmYzI4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5CkBAIC0xLDQgKzEsNCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3B5M2tfd2FybmluZ3MKIGltcG9ydCB1bml0dGVzdAogCiBjbGFzcyBUZXN0SW1wbGVtZW50YXRpb25Db21wYXJpc29ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0zMiw3ICszMiw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnX2NlbGwgIT0gaF9jZWxsKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KFRlc3RJbXBsZW1lbnRhdGlvbkNvbXBhcmlzb25zKQorICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICBydW5fdW5pdHRlc3QoVGVzdEltcGxlbWVudGF0aW9uQ29tcGFyaXNvbnMpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHkgYi9MaWIvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5CmluZGV4IDYzYzZmZTguLjRlY2EzMWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weQpAQCAtODAsNyArODAsOCBAQAogCiAgICAgZGVmIHRlc3RfZXhlY2ZpbGUoc2VsZik6CiAgICAgICAgIG5hbWVzcGFjZSA9IHt9Ci0gICAgICAgIGV4ZWNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sIG5hbWVzcGFjZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgZXhlY2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgbmFtZXNwYWNlKQogICAgICAgICBmdW5jID0gbmFtZXNwYWNlWydsaW5lMyddCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYy5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8sIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlWydsaW5lNCddLCBGQVRYKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKaW5kZXggNDgyMTQ5OC4uZDVjZWNkOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgICMgVGVzdCBfX3JlcHJfXwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1MCksIHN0cihkMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1MSksIHJlcHIoZDEpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGB1MmAsIGBkMmApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1MiksIHJlcHIoZDIpKQogCiAgICAgICAgICMgVGVzdCBfX2NtcF9fIGFuZCBfX2xlbl9fCiAgICAgICAgIGFsbCA9IFtkMCwgZDEsIGQyLCB1LCB1MCwgdTEsIHUyLCB1dSwgdXUwLCB1dTEsIHV1Ml0KQEAgLTk1LDEyICs5NSwxMyBAQAogCiAgICAgICAgICMgVGVzdCBoYXNfa2V5IGFuZCAiaW4iLgogICAgICAgICBmb3IgaSBpbiB1Mi5rZXlzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodTIuaGFzX2tleShpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgdTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUxLmhhc19rZXkoaSksIGQxLmhhc19rZXkoaSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgaW4gdTEsIGkgaW4gZDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUwLmhhc19rZXkoaSksIGQwLmhhc19rZXkoaSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgaW4gdTAsIGkgaW4gZDApCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUyLmhhc19rZXkoaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MS5oYXNfa2V5KGkpLCBkMS5oYXNfa2V5KGkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKIAogICAgICAgICAjIFRlc3QgdXBkYXRlCiAgICAgICAgIHQgPSBVc2VyRGljdC5Vc2VyRGljdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQppbmRleCBlZDNlNTU5Li4zYjYwMWJjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKQEAgLTUzLDcgKzUzLDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVyKFQoKDEsMikpKS5uZXh0KCksICIwISEhIikKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVXNlckxpc3RUZXN0KQorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoIi4rX18oZ2V0fHNldHxkZWwpc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVXNlckxpc3RUZXN0KQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkgYi9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKaW5kZXggNjdhYmQwZC4uNTM2YTk4NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQpAQCAtNTQsMTAgKzU0LDEwIEBACiAgICAgICAgICMgTGl2ZSByZWZlcmVuY2U6CiAgICAgICAgIG8gPSBDKCkKICAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihvKQotICAgICAgICBgd3JgCisgICAgICAgIHJlcHIod3IpCiAgICAgICAgICMgRGVhZCByZWZlcmVuY2U6CiAgICAgICAgIGRlbCBvCi0gICAgICAgIGB3cmAKKyAgICAgICAgcmVwcih3cikKIAogICAgIGRlZiB0ZXN0X2Jhc2ljX2NhbGxiYWNrKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2Jhc2ljX2NhbGxiYWNrKEMpCkBAIC0xNjksNyArMTY5LDggQEAKICAgICAgICAgcC5hcHBlbmQoMTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCAxKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocCwgInByb3h5IGZvciBub24tZW1wdHkgVXNlckxpc3Qgc2hvdWxkIGJlIHRydWUiKQotICAgICAgICBwWzpdID0gWzIsIDNdCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHBbOl0gPSBbMiwgM10KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oTCksIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCAyKQogICAgICAgICBzZWxmLmFzc2VydEluKDMsIHAsICJwcm94eSBkaWRuJ3Qgc3VwcG9ydCBfX2NvbnRhaW5zX18oKSBwcm9wZXJseSIpCkBAIC0xODIsMTAgKzE4MywxMSBAQAogICAgICAgICAjIyBzZWxmLmFzc2VydEVxdWFsKHJlcHIoTDIpLCByZXByKHAyKSkKICAgICAgICAgTDMgPSBVc2VyTGlzdC5Vc2VyTGlzdChyYW5nZSgxMCkpCiAgICAgICAgIHAzID0gd2Vha3JlZi5wcm94eShMMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s6XSwgcDNbOl0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbNTpdLCBwM1s1Ol0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbOjVdLCBwM1s6NV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbMjo1XSwgcDNbMjo1XSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s6XSwgcDNbOl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzU6XSwgcDNbNTpdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s6NV0sIHAzWzo1XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbMjo1XSwgcDNbMjo1XSkKIAogICAgIGRlZiB0ZXN0X3Byb3h5X3VuaWNvZGUoc2VsZik6CiAgICAgICAgICMgU2VlIGJ1ZyA1MDM3CkBAIC04MzEsNyArODMzLDcgQEAKICAgICBkZWYgdGVzdF93ZWFrX2tleXMoc2VsZik6CiAgICAgICAgICMKICAgICAgICAgIyAgVGhpcyBleGVyY2lzZXMgZC5jb3B5KCksIGQuaXRlbXMoKSwgZFtdID0gdiwgZFtdLCBkZWwgZFtdLAotICAgICAgICAjICBsZW4oZCksIGQuaGFzX2tleSgpLgorICAgICAgICAjICBsZW4oZCksIGluIGQuCiAgICAgICAgICMKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQogICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgpAQCAtODUzLDggKzg1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgdGhlIGtleXMgZGlkIG5vdCBjbGVhciB0aGUgZGljdGlvbmFyeSIpCiAgICAgICAgIG8gPSBPYmplY3QoNDIpCiAgICAgICAgIGRpY3Rbb10gPSAiV2hhdCBpcyB0aGUgbWVhbmluZyBvZiB0aGUgdW5pdmVyc2U/IgotICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdC5oYXNfa2V5KG8pKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRpY3QuaGFzX2tleSgzNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obywgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigzNCwgZGljdCkKIAogICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfaXRlcnMoc2VsZik6CiAgICAgICAgIGRpY3QsIG9iamVjdHMgPSBzZWxmLm1ha2Vfd2Vha19rZXllZF9kaWN0KCkKQEAgLTg2Niw3ICs4NjgsNiBAQAogICAgICAgICBvYmplY3RzMiA9IGxpc3Qob2JqZWN0cykKICAgICAgICAgZm9yIHdyIGluIHJlZnM6CiAgICAgICAgICAgICBvYiA9IHdyKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0Lmhhc19rZXkob2IpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihvYiwgZGljdCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iXSkKICAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKQEAgLTg3Nyw3ICs4NzgsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGRpY3QuaXRlcmtleXJlZnMoKSkpLCBsZW4ob2JqZWN0cykpCiAgICAgICAgIGZvciB3ciBpbiBkaWN0Lml0ZXJrZXlyZWZzKCk6CiAgICAgICAgICAgICBvYiA9IHdyKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0Lmhhc19rZXkob2IpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihvYiwgZGljdCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iXSkKICAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKQEAgLTk5MSwxNiArOTkxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAiIC0tIHZhbHVlIHBhcmFtZXRlcnMgbXVzdCBiZSBkaXN0aW5jdCBvYmplY3RzIikKICAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCiAgICAgICAgIG8gPSB3ZWFrZGljdC5zZXRkZWZhdWx0KGtleSwgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5oYXNfa2V5KGtleSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5nZXQoa2V5KSBpcyB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdFtrZXldIGlzIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvLCB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCB3ZWFrZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3ZWFrZGljdC5nZXQoa2V5KSwgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydElzKHdlYWtkaWN0W2tleV0sIHZhbHVlMSkKIAogICAgICAgICBvID0gd2Vha2RpY3Quc2V0ZGVmYXVsdChrZXksIHZhbHVlMikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8gaXMgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuaGFzX2tleShrZXkpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuZ2V0KGtleSkgaXMgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3Rba2V5XSBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobywgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydEluKGtleSwgd2Vha2RpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2Vha2RpY3QuZ2V0KGtleSksIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3ZWFrZGljdFtrZXldLCB2YWx1ZTEpCiAKICAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kaWN0X3NldGRlZmF1bHQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfc2V0ZGVmYXVsdCh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCkBAIC0xMDEyLDI0ICsxMDEyLDI0IEBACiAKICAgICBkZWYgY2hlY2tfdXBkYXRlKHNlbGYsIGtsYXNzLCBkaWN0KToKICAgICAgICAgIwotICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLnVwZGF0ZSgpLCBsZW4oZCksIGQua2V5cygpLCBkLmhhc19rZXkoKSwKKyAgICAgICAgIyAgVGhpcyBleGVyY2lzZXMgZC51cGRhdGUoKSwgbGVuKGQpLCBkLmtleXMoKSwgaW4gZCwKICAgICAgICAgIyAgZC5nZXQoKSwgZFtdLgogICAgICAgICAjCiAgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQogICAgICAgICB3ZWFrZGljdC51cGRhdGUoZGljdCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gbGVuKGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3ZWFrZGljdCksIGxlbihkaWN0KSkKICAgICAgICAgZm9yIGsgaW4gd2Vha2RpY3Qua2V5cygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShrKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAibXlzdGVyaW91cyBuZXcga2V5IGFwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdC5nZXQoaykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0W2tdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgd2Vha2RpY3QuZ2V0KGspKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB3ZWFrZGljdFtrXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModiwgd2Vha2RpY3QuZ2V0KGspKQogICAgICAgICBmb3IgayBpbiBkaWN0LmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5oYXNfa2V5KGspLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCB3ZWFrZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAib3JpZ2luYWwga2V5IGRpc2FwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdFtrXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgd2Vha2RpY3Rba10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB3ZWFrZGljdC5nZXQoaykpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHYsIHdlYWtkaWN0W2tdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB3ZWFrZGljdC5nZXQoaykpCiAKICAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kaWN0X3VwZGF0ZShzZWxmKToKICAgICAgICAgc2VsZi5jaGVja191cGRhdGUod2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5LApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKaW5kZXggN2UyYzI4My4uOTYwZjNjMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgaW5zcGVjdAogaW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IHBkYgoraW1wb3J0IHdhcm5pbmdzCiBmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgKHNwYXduX3B5dGhvbiwga2lsbF9weXRob24sIHJ1bl9weXRob24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGlyLCBtYWtlX3NjcmlwdCwgbWFrZV96aXBfc2NyaXB0KQogCkBAIC0xNjYsOCArMTY3LDE1IEBACiAgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X3Rlc3RmaWxlLAogICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF91bml0dGVzdF9yZXBvcnRmbGFncywKICAgICAgICAgICAgIF0KLSAgICAgICAgICAgIGZvciBvYmogaW4ga25vd25fZ29vZF90ZXN0czoKLSAgICAgICAgICAgICAgICBfcnVuX29iamVjdF9kb2N0ZXN0KG9iaiwgdGVzdF96aXBwZWRfZG9jdGVzdCkKKyAgICAgICAgICAgICMgTmVlZGVkIGZvciB0ZXN0X0RvY1Rlc3RQYXJzZXIgYW5kIHRlc3RfZGVidWcKKyAgICAgICAgICAgIHdpdGggdGVzdC50ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICAgICAgICAgKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgICAgICAgICAoImV4ZWNmaWxlLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgICAgICMgSWdub3JlIGFsbCB3YXJuaW5ncyBhYm91dCB0aGUgdXNlIG9mIGNsYXNzIFRlc3RlciBpbiB0aGlzIG1vZHVsZS4KKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImNsYXNzIFRlc3RlciBpcyBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgZm9yIG9iaiBpbiBrbm93bl9nb29kX3Rlc3RzOgorICAgICAgICAgICAgICAgICAgICBfcnVuX29iamVjdF9kb2N0ZXN0KG9iaiwgdGVzdF96aXBwZWRfZG9jdGVzdCkKIAogICAgIGRlZiB0ZXN0X2RvY3Rlc3RfbWFpbl9pc3N1ZTQxOTcoc2VsZik6CiAgICAgICAgIHRlc3Rfc3JjID0gdGV4dHdyYXAuZGVkZW50KCIiIlwK