ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CmluZGV4IDZkNGM0ZmUuLjgzMjdhYTEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMSw3ICsxLDcgQEAKICMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQogIyBweXNxbGl0ZTIvdGVzdC9kYmFwaS5weTogdGVzdHMgZm9yIERCLUFQSSBjb21wbGlhbmNlCiAjCi0jIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICMKQEAgLTIyMywxMiArMjIzLDQxIEBACiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAorICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbUxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIFsiZm9vIl0pCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVBhcmFtU2VxdWVuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEwob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHggPT0gMAorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIEwoKSkKKyAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisKICAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCB7Im5hbWUiOiAiZm9vIn0pCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQogCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nX01hcHBpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEQoZGljdCk6CisgICAgICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKKworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgRCgpKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKwogICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1Rvb0xpdHRsZUFyZ3Moc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHRyeToKQEAgLTM3OCw2ICs0MDcsMTIgQEAKICAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoMTAwKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIFtdKQogCisgICAgZGVmIENoZWNrRmV0Y2htYW55S3dBcmcoc2VsZik6CisgICAgICAgICIiIkNoZWNrcyBpZiBmZXRjaG1hbnkgd29ya3Mgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cyIiIgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KHNpemU9MTAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKwogICAgIGRlZiBDaGVja0ZldGNoYWxsKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQpAQCAtNjA5LDIwICs2NDQsNiBAQAogICAgICAgICByZXMgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIDUpCiAKLSAgICBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdVbmljb2RlKHNlbGYpOgotICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQotICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKLSAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoIiIiCi0gICAgICAgICAgICBjcmVhdGUgdGFibGUgYShpKTsKLSAgICAgICAgICAgIGluc2VydCBpbnRvIGEoaSkgdmFsdWVzICg1KTsKLSAgICAgICAgICAgIHNlbGVjdCBpIGZyb20gYTsKLSAgICAgICAgICAgIGRlbGV0ZSBmcm9tIGE7Ci0gICAgICAgICAgICBpbnNlcnQgaW50byBhKGkpIHZhbHVlcyAoNik7Ci0gICAgICAgICAgICAiIiIpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIGEiKQotICAgICAgICByZXMgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIDYpCi0KICAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvckluY29tcGxldGUoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CmluZGV4IGE5YTgyOGYuLmJjNTZjYWEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKQEAgLTEsNyArMSw3IEBACiAjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KICMgcHlzcWxpdGUyL3Rlc3QvZmFjdG9yeS5weTogdGVzdHMgZm9yIHRoZSB2YXJpb3VzIGZhY3RvcmllcyBpbiBweXNxbGl0ZQogIwotIyBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogIwpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKaW5kZXggMjhmMjQwNC4uNjg3MmZkNiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CkBAIC0xLDcgKzEsNyBAQAogIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiAjIHB5c3FsaXRlMi90ZXN0L2hvb2tzLnB5OiB0ZXN0cyBmb3IgdmFyaW91cyBTUUxpdGUtc3BlY2lmaWMgaG9va3MKICMKLSMgQ29weXJpZ2h0IChDKSAyMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICMKQEAgLTEwNSw5ICsxMDUsODAgQEAKICAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uc3RhcnRzd2l0aCgibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2UiKToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIE9wZXJhdGlvbmFsRXJyb3IgcmFpc2VkIikKIAorY2xhc3MgUHJvZ3Jlc3NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIENoZWNrUHJvZ3Jlc3NIYW5kbGVyVXNlZChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCB0aGUgcHJvZ3Jlc3MgaGFuZGxlciBpcyBpbnZva2VkIG9uY2UgaXQgaXMgc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQorICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKKyAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQorICAgICAgICBjb24uZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28oYSwgYikKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByb2dyZXNzX2NhbGxzKQorCisKKyAgICBkZWYgQ2hlY2tPcGNvZGVDb3VudChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCB0aGUgb3Bjb2RlIGFyZ3VtZW50IGlzIHJlc3BlY3RlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KKyAgICAgICAgZGVmIHByb2dyZXNzKCk6CisgICAgICAgICAgICBwcm9ncmVzc19jYWxscy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKKyAgICAgICAgY3VycyA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vIChhLCBiKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBmaXJzdF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKKyAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDIpCisgICAgICAgIGN1cnMuZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlY29uZF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZpcnN0X2NvdW50ID4gc2Vjb25kX2NvdW50KQorCisgICAgZGVmIENoZWNrQ2FuY2VsT3BlcmF0aW9uKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlIHN0b3BzIHRoZSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCisgICAgICAgIGRlZiBwcm9ncmVzcygpOgorICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCisgICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwKKyAgICAgICAgICAgIGN1cnMuZXhlY3V0ZSwKKyAgICAgICAgICAgICJjcmVhdGUgdGFibGUgYmFyIChhLCBiKSIpCisKKyAgICBkZWYgQ2hlY2tDbGVhckhhbmRsZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgc2V0dGluZyB0aGUgcHJvZ3Jlc3MgaGFuZGxlciB0byBOb25lIGNsZWFycyB0aGUgcHJldmlvdXNseSBzZXQgaGFuZGxlci4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGFjdGlvbiA9IDAKKyAgICAgICAgZGVmIHByb2dyZXNzKCk6CisgICAgICAgICAgICBhY3Rpb24gPSAxCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihOb25lLCAxKQorICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0IDEgdW5pb24gc2VsZWN0IDIgdW5pb24gc2VsZWN0IDMiKS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFjdGlvbiwgMCwgInByb2dyZXNzIGhhbmRsZXIgd2FzIG5vdCBjbGVhcmVkIikKKwogZGVmIHN1aXRlKCk6CiAgICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQotICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbGxhdGlvbl9zdWl0ZSwpKQorICAgIHByb2dyZXNzX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFByb2dyZXNzVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCBwcm9ncmVzc19zdWl0ZSkpCiAKIGRlZiB0ZXN0KCk6CiAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CmluZGV4IDRhNjhkOWQuLjVlODlhNmMgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKQEAgLTIxLDYgKzIxLDcgQEAKICMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCitpbXBvcnQgZGF0ZXRpbWUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCiAKQEAgLTc5LDYgKzgwLDY3IEBACiAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAKKyAgICBkZWYgQ2hlY2tTdGF0ZW1lbnRGaW5hbGl6YXRpb25PbkNsb3NlRGIoc2VsZik6CisgICAgICAgICMgcHlzcWxpdGUgdmVyc2lvbnMgPD0gMi4zLjMgb25seSBmaW5hbGl6ZWQgc3RhdGVtZW50cyBpbiB0aGUgc3RhdGVtZW50CisgICAgICAgICMgY2FjaGUgd2hlbiBjbG9zaW5nIHRoZSBkYXRhYmFzZS4gc3RhdGVtZW50cyB0aGF0IHdlcmUgc3RpbGwKKyAgICAgICAgIyByZWZlcmVuY2VkIGluIGN1cnNvcnMgd2VyZW4ndCBjbG9zZWQgYW4gY291bGQgcHJvdm9rZSAiCisgICAgICAgICMgIk9wZXJhdGlvbmFsRXJyb3I6IFVuYWJsZSB0byBjbG9zZSBkdWUgdG8gdW5maW5hbGlzZWQgc3RhdGVtZW50cyIuCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1cnNvcnMgPSBbXQorICAgICAgICAjIGRlZmF1bHQgc3RhdGVtZW50IGNhY2hlIHNpemUgaXMgMTAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwNSk6CisgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgIGN1cnNvcnMuYXBwZW5kKGN1cikKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgMSB4IHVuaW9uIHNlbGVjdCAiICsgc3RyKGkpKQorICAgICAgICBjb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrT25Db25mbGljdFJvbGxiYWNrKHNlbGYpOgorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAyLCAyKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4LCB1bmlxdWUoeCkgb24gY29uZmxpY3Qgcm9sbGJhY2spIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKDEpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKDEpIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMikiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY29tbWl0KCkKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJweXNxbGl0ZSBrbmV3IG5vdGhpbmcgYWJvdXQgdGhlIGltcGxpY2l0IFJPTExCQUNLIikKKworICAgIGRlZiBDaGVja1dvcmthcm91bmRGb3JCdWdneVNxbGl0ZVRyYW5zZmVyQmluZGluZ3Moc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBweXNxbGl0ZSB3b3VsZCBjcmFzaCB3aXRoIG9sZGVyIFNRTGl0ZSB2ZXJzaW9ucyB1bmxlc3MKKyAgICAgICAgYSB3b3JrYXJvdW5kIGlzIGltcGxlbWVudGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIpIikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiZHJvcCB0YWJsZSBmb28iKQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGJhcikiKQorCisgICAgZGVmIENoZWNrRW1wdHlTdGF0ZW1lbnQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBweXNxbGl0ZSB1c2VkIHRvIHNlZ2ZhdWx0IHdpdGggU1FMaXRlIHZlcnNpb25zIDMuNS54LiBUaGVzZSByZXR1cm4gTlVMTAorICAgICAgICBmb3IgIm5vLW9wZXJhdGlvbiIgc3RhdGVtZW50cworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiIikKKworICAgIGRlZiBDaGVja1R5cGVNYXBVc2FnZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHB5c3FsaXRlIHVudGlsIDIuNC4xIGRpZCBub3QgcmVidWlsZCB0aGUgcm93X2Nhc3RfbWFwIHdoZW4gcmVjb21waWxpbmcKKyAgICAgICAgYSBzdGF0ZW1lbnQuIFRoaXMgdGVzdCBleGhpYml0cyB0aGUgcHJvYmxlbS4KKyAgICAgICAgIiIiCisgICAgICAgIFNFTEVDVCA9ICJzZWxlY3QgKiBmcm9tIGZvbyIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IixkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0RFQ0xUWVBFUykKKyAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyIHRpbWVzdGFtcCkiKQorICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKGJhcikgdmFsdWVzICg/KSIsIChkYXRldGltZS5kYXRldGltZS5ub3coKSwpKQorICAgICAgICBjb24uZXhlY3V0ZShTRUxFQ1QpCisgICAgICAgIGNvbi5leGVjdXRlKCJkcm9wIHRhYmxlIGZvbyIpCisgICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGJhciBpbnRlZ2VyKSIpCisgICAgICAgIGNvbi5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oYmFyKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgY29uLmV4ZWN1dGUoU0VMRUNUKQorCiAgICAgZGVmIENoZWNrRXJyb3JNc2dEZWNvZGVFcnJvcihzZWxmKToKICAgICAgICAgIyBXaGVuIHBvcnRpbmcgdGhlIG1vZHVsZSB0byBQeXRob24gMy4wLCB0aGUgZXJyb3IgbWVzc2FnZSBhYm91dAogICAgICAgICAjIGRlY29kaW5nIGVycm9ycyBkaXNhcHBlYXJlZC4gVGhpcyB2ZXJpZmllcyB0aGV5J3JlIGJhY2sgYWdhaW4uCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CmluZGV4IDllZGM0YWMuLmRhNWJkMjEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CkBAIC0xLDcgKzEsNyBAQAogIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiAjIHB5c3FsaXRlMi90ZXN0L3RyYW5zYWN0aW9ucy5weTogdGVzdHMgdHJhbnNhY3Rpb25zCiAjCi0jIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAjCkBAIC0xMjIsNiArMTIyLDIzIEBACiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogCisgICAgZGVmIENoZWNrTG9ja2luZyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgdGVzdHMgdGhlIGltcHJvdmVkIGNvbmN1cnJlbmN5IHdpdGggcHlzcWxpdGUgMi4zLjQuIFlvdSBuZWVkZWQKKyAgICAgICAgdG8gcm9sbCBiYWNrIGNvbjIgYmVmb3JlIHlvdSBjb3VsZCBjb21taXQgY29uMS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICAjIE5PIHNlbGYuY29uMi5yb2xsYmFjaygpIEhFUkUhISEKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisKIGNsYXNzIFNwZWNpYWxDb21tYW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKaW5kZXggNDZiZWQ3ZC4uY2U3NDBhNSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0yMSw3ICsyMSw3IEBACiAjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAotaW1wb3J0IGJ6MiwgZGF0ZXRpbWUKK2ltcG9ydCB6bGliLCBkYXRldGltZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKIApAQCAtMjIxLDExICsyMjEsMTMgQEAKICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdCh4IGZvbykiKQogCi0gICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXSA9IGxhbWJkYSB4OiBiIjwiICsgeCArIGIiPiIKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdID0gbGFtYmRhIHg6ICJbJXNdIiAlIHguZGVjb2RlKCJhc2NpaSIpCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXSA9IGxhbWJkYSB4OiAiPCVzPiIgJSB4LmRlY29kZSgiYXNjaWkiKQogICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRVhDIl0gPSBsYW1iZGEgeDogNS8wCiAgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCMUIxIl0gPSBsYW1iZGEgeDogIk1BUktFUiIKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXQogICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJBUiJdCiAgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRVhDIl0KICAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCMUIxIl0KQEAgLTI1Miw3ICsyNTQsNyBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoInh4eCIsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgnc2VsZWN0IHggYXMgInggW2Jhcl0iIGZyb20gdGVzdCcpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBiIjx4eHg+IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAiPHh4eD4iKQogCiAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHN0cmlwcGluZyBvZiBjb2xuYW1lcyB3b3Jrcy4gRXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QKICAgICAgICAgIyB3aGl0ZXNwYWNlIHNob3VsZCBiZSBzdHJpcHBlZC4KQEAgLTI5Nyw3ICsyOTksNyBAQAogCiBjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIGNvbnZlcnQocyk6Ci0gICAgICAgIHJldHVybiBiejIuZGVjb21wcmVzcyhzKQorICAgICAgICByZXR1cm4gemxpYi5kZWNvbXByZXNzKHMpCiAgICAgY29udmVydCA9IHN0YXRpY21ldGhvZChjb252ZXJ0KQogCiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMzA5LDcgKzMxMSw3IEBACiAKICAgICBkZWYgQ2hlY2tCaW5hcnlJbnB1dEZvckNvbnZlcnRlcihzZWxmKToKICAgICAgICAgdGVzdGRhdGEgPSBiImFiY2RlZmciICogMTAKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5jb24uZXhlY3V0ZSgnc2VsZWN0ID8gYXMgInggW2Jpbl0iJywgKG1lbW9yeXZpZXcoYnoyLmNvbXByZXNzKHRlc3RkYXRhKSksKSkuZmV0Y2hvbmUoKVswXQorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbi5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbYmluXSInLCAobWVtb3J5dmlldyh6bGliLmNvbXByZXNzKHRlc3RkYXRhKSksKSkuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0ZXN0ZGF0YSwgcmVzdWx0KQogCiBjbGFzcyBEYXRlVGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTM0MSw3ICszNDMsOCBAQAogICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxKToKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIG5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLnV0Y25vdygpCisgICAgICAgICMgU1FMaXRlJ3MgY3VycmVudF90aW1lc3RhbXAgdXNlcyBVVEMgdGltZSwgd2hpbGUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgdXNlcyBsb2NhbCB0aW1lLgorICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKGN1cnJlbnRfdGltZXN0YW1wKSIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgICB0cyA9IHNlbGYuY3VyLmZldGNob25lKClbMF0K