ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L1JFQURNRSBiL0xpYi90ZXN0L1JFQURNRQppbmRleCA0OTZjNDAwLi4yN2Y2OTZjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9SRUFETUUKKysrIGIvTGliL3Rlc3QvUkVBRE1FCkBAIC0zNzksOCArMzc5LDggQEAKICAgICAgIHBvaW50IG51bWJlcnMgd2hlbiB5b3UgZXhwZWN0IHRoZW0gdG8gb25seSBiZSBhcHByb3hpbWF0ZWx5IGVxdWFsCiAgICAgICB3aXRoaW5nIGEgZnV6eiBmYWN0b3IgKGBgdGVzdF9zdXBwb3J0LkZVWlpgYCwgd2hpY2ggZGVmYXVsdHMgdG8gMWUtNikuCiAKLSAgICAqIGBgY2hlY2tfc3ludGF4KHN0YXRlbWVudClgYCAtIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgKm5vdCoKLSAgICAgIGNvcnJlY3QgUHl0aG9uIHN5bnRheC4KKyAgICAqIGBgY2hlY2tfc3ludGF4X2Vycm9yKHRlc3RjYXNlLCBzdGF0ZW1lbnQpYGAgLSBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgIHN0YXRlbWVudCBpcyAqbm90KiBjb3JyZWN0IFB5dGhvbiBzeW50YXguCiAKIAogUHl0aG9uIGFuZCBDIHN0YXRlbWVudCBjb3ZlcmFnZSByZXN1bHRzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIGF0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9ib2d1c19zcmVfYnl0ZWNvZGUucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9ib2d1c19zcmVfYnl0ZWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmYzczMAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2JvZ3VzX3NyZV9ieXRlY29kZS5weQpAQCAtMCwwICsxLDQ3IEBACisiIiIKK1RoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGluICdfc3JlJyBjYW4gc2VnZmF1bHQgd2hlbiBpbnRlcnByZXRpbmcKK2JvZ3VzIGJ5dGVjb2RlLgorCitJdCBpcyB1bmNsZWFyIHdoZXRoZXIgdGhpcyBpcyBhIHJlYWwgYnVnIG9yIGEgIndvbid0IGZpeCIgY2FzZSBsaWtlCitib2d1c19jb2RlX29iai5weSwgYmVjYXVzZSBpdCByZXF1aXJlcyBieXRlY29kZSB0aGF0IGlzIGJ1aWx0IGJ5IGhhbmQsCithcyBvcHBvc2VkIHRvIGNvbXBpbGVkIGJ5ICdyZScgZnJvbSBhIHN0cmluZy1zb3VyY2UgcmVnZXhwLiAgVGhlCitkaWZmZXJlbmNlIHdpdGggYm9ndXNfY29kZV9vYmosIHRob3VnaCwgaXMgdGhhdCB0aGUgb25seSBleGlzdGluZyByZWdleHAKK2NvbXBpbGVyIGlzIHdyaXR0ZW4gaW4gUHl0aG9uLCBzbyB0aGF0IHRoZSBDIGNvZGUgaGFzIG5vIGNob2ljZSBidXQKK2FjY2VwdCBhcmJpdHJhcnkgYnl0ZWNvZGUgZnJvbSBQeXRob24tbGV2ZWwuCisKK1RoZSB0ZXN0IGJlbG93IGJ1aWxkcyBhbmQgcnVucyByYW5kb20gYnl0ZWNvZGVzIHVudGlsICdtYXRjaCcgY3Jhc2hlcworUHl0aG9uLiAgSSBoYXZlIG5vdCBpbnZlc3RpZ2F0ZWQgd2h5IGV4YWN0bHkgc2VnZmF1bHRzIG9jY3VyIG5vciBob3cKK2hhcmQgdGhleSB3b3VsZCBiZSB0byBmaXguICBIZXJlIGFyZSBhIGZldyBleGFtcGxlcyBvZiAnY29kZScgdGhhdAorc2VnZmF1bHQgZm9yIG1lOgorCisgICAgWzIxLCA1MDgxNCwgOCwgMjksIDE2XQorICAgIFsyMSwgMzk2NywgMjYsIDEwLCAyMywgNTQxMTNdCisgICAgWzI5LCAyMywgMCwgMiwgNV0KKyAgICBbMzEsIDY0MzUxLCAwLCAyOCwgMywgMjIyODEsIDIwLCA0NDYzLCA5LCAyNSwgNTkxNTQsIDE1MjQ1LCAyLAorICAgICAgICAgICAgICAgICAgMTYzNDMsIDMsIDExNjAwLCAyNDM4MCwgMTAsIDM3NTU2LCAxMCwgMzEsIDE1LCAzMV0KKworSGVyZSBpcyBhbHNvIGEgJ2NvZGUnIHRoYXQgdHJpZ2dlcnMgYW4gaW5maW5pdGUgdW5pbnRlcnJ1cHRpYmxlIGxvb3A6CisKKyAgICBbMjksIDEsIDgsIDIxLCAxLCA0MzA4MywgNl0KKworIiIiCisKK2ltcG9ydCBfc3JlLCByYW5kb20KKworZGVmIHBpY2soKToKKyAgICBuID0gcmFuZG9tLnJhbmRyYW5nZSgtNjU1MzYsIDY1NTM2KQorICAgIGlmIG4gPCAwOgorICAgICAgICBuICY9IDMxCisgICAgcmV0dXJuIG4KKworc3MgPSBbIiIsICJ3b3JsZCIsICJ4IiAqIDUwMF0KKword2hpbGUgMToKKyAgICBjb2RlID0gW3BpY2soKSBmb3IgaSBpbiByYW5nZShyYW5kb20ucmFuZHJhbmdlKDUsIDI1KSldCisgICAgcHJpbnQgY29kZQorICAgIHBhdCA9IF9zcmUuY29tcGlsZShOb25lLCAwLCBjb2RlKQorICAgIGZvciBzIGluIHNzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXQubWF0Y2gocykKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2luZmluaXRlX2xvb3BfcmUucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9sb29wX3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWNjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9sb29wX3JlLnB5CkBAIC0wLDAgKzEsMTYgQEAKKworIyBUaGlzIHdhcyB0YWtlbiBmcm9tIGh0dHA6Ly9weXRob24ub3JnL3NmLzE1NDE2OTcKKyMgSXQncyBub3QgdGVjaG5pY2FsbHkgYSBjcmFzaGVyLiAgSXQgbWF5IG5vdCBldmVuIHRydWx5IGJlIGluZmluaXRlLAorIyBob3dldmVyLCBJIGhhdmVuJ3Qgd2FpdGVkIGEgbG9uZyB0aW1lIHRvIHNlZSB0aGUgcmVzdWx0LiAgSXQgdGFrZXMKKyMgMTAwJSBvZiBDUFUgd2hpbGUgcnVubmluZyB0aGlzIGFuZCBzaG91bGQgYmUgZml4ZWQuCisKK2ltcG9ydCByZQorc3RhcnR0YWcgPSByZS5jb21waWxlKHInPFthLXpBLVpdWy1fLjphLXpBLVowLTldKlxzKignCisgICAgICAgIHInXHMqKFthLXpBLVpfXVstOi5hLXpBLVpfMC05XSopKFxzKj1ccyonCisgICAgICAgIHInKFwnW15cJ10qXCd8IlteIl0qInxbLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+QF0nCisgICAgICAgIHInW11bXC1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKig/PVtccz4vPF0pKSk/JworICAgIHInKSpccyovP1xzKig/PVs8Pl0pJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmb28gPSAnPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZScKKyAgICBzdGFydHRhZy5tYXRjaChmb28pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9sb29zaW5nX21yb19yZWYucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9sb29zaW5nX21yb19yZWYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiODA0NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2xvb3NpbmdfbXJvX3JlZi5weQpAQCAtMCwwICsxLDM2IEBACisiIiIKK1RoZXJlIGlzIGEgd2F5IHRvIHB1dCBrZXlzIG9mIGFueSB0eXBlIGluIGEgdHlwZSdzIGRpY3Rpb25hcnkuCitJIHRoaW5rIHRoaXMgYWxsb3dzIHZhcmlvdXMga2luZHMgb2YgY3Jhc2hlcywgYnV0IHNvIGZhciBJIGhhdmUgb25seQorZm91bmQgYSBjb252b2x1dGVkIGF0dGFjayBvZiBfUHlUeXBlX0xvb2t1cCgpLCB3aGljaCB1c2VzIHRoZSBtcm8gb2YgdGhlCit0eXBlIHdpdGhvdXQgaG9sZGluZyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gaXQuICBQcm9iYWJseSB3b3JrcyB3aXRoCitzdXBlci5fX2dldGF0dHJpYnV0ZV9fKCkgdG9vLCB3aGljaCB1c2VzIHRoZSBzYW1lIGtpbmQgb2YgY29kZS4KKyIiIgorCitjbGFzcyBNeUtleShvYmplY3QpOgorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goJ215a2V5JykKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyB0aGUgZm9sbG93aW5nIGxpbmUgZGVjcmVmcyB0aGUgcHJldmlvdXMgWC5fX21yb19fCisgICAgICAgIFguX19iYXNlc19fID0gKEJhc2UyLCkKKyAgICAgICAgIyB0cmFzaCBhbGwgdHVwbGVzIG9mIGxlbmd0aCAzLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaXRlbXMgb2YKKyAgICAgICAgIyB0aGUgcHJldmlvdXMgWC5fX21yb19fIGFyZSByZWFsbHkgZ2FyYmFnZQorICAgICAgICB6ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICB6LmFwcGVuZCgoaSwgTm9uZSwgTm9uZSkpCisgICAgICAgIHJldHVybiAtMQorCisKK2NsYXNzIEJhc2Uob2JqZWN0KToKKyAgICBteWtleSA9ICdmcm9tIEJhc2UnCisKK2NsYXNzIEJhc2UyKG9iamVjdCk6CisgICAgbXlrZXkgPSAnZnJvbSBCYXNlMicKKworY2xhc3MgWChCYXNlKToKKyAgICAjIHlvdSBjYW4ndCBhZGQgYSBub24tc3RyaW5nIGtleSB0byBYLl9fZGljdF9fLCBidXQgaXQgY2FuIGJlCisgICAgIyB0aGVyZSBmcm9tIHRoZSBiZWdpbm5pbmcgOi0pCisgICAgbG9jYWxzKClbTXlLZXkoKV0gPSA1CisKK3ByaW50IFgubXlrZXkKKyMgSSBnZXQgYSBzZWdmYXVsdCwgb3IgYSBzbGlnaHRseSB3cm9uZyBhc3NlcnRpb24gZXJyb3IgaW4gYSBkZWJ1ZyBidWlsZC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CmluZGV4IDQ1M2M1MWMuLmZjMWE2YzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQpAQCAtMjY5LDcgKzI2OSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5pbnNlcnQpCiAKICAgICBkZWYgdGVzdF9wb3Aoc2VsZik6Ci0gICAgICAgIGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAogICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWy0xLCAwLCAxXSkKICAgICAgICAgYS5wb3AoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFstMSwgMF0pCkBAIC0yODEsOCArMjgwLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5wb3ApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5wb3AsIDQyLCA0MikKICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxMCwgMjAsIDMwLCA0MF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5wb3AoRGVjaW1hbCgyKSksIDIwKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLnBvcCwgRGVjaW1hbCgyNSkpCiAKICAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CiAgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMCwgMV0pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9NaW1lV3JpdGVyIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfTWltZVdyaXRlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5N2Q5My4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9NaW1lV3JpdGVyCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLXRlc3RfTWltZVdyaXRlcgotRnJvbTogYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cwotRGF0ZTogTW9uIEZlYiAxMiAxNzoyMTo0OCBFU1QgMTk5NgotVG86IGtzcy1zdWJtaXRAY25yaS5yZXN0b24udmEudXMKLU1JTUUtVmVyc2lvbjogMS4wCi1Db250ZW50LVR5cGU6IG11bHRpcGFydC9rbm93Ym90OwotICAgIGJvdW5kYXJ5PSI4MDFzcGFtOTk5IjsKLSAgICB2ZXJzaW9uPSIwLjEiCi0KLVRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCi0KLS0tODAxc3BhbTk5OQotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1tZXRhZGF0YTsKLSAgICBib3VuZGFyeT0iODAyc3BhbTk5OSIKLQotCi0tLTgwMnNwYW05OTkKLUNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKLUtQLU1ldGFkYXRhLVR5cGU6IHNpbXBsZQotS1AtQWNjZXNzOiByZWFkLW9ubHkKLQotS1BNRC1JbnRlcnByZXRlcjogcHl0aG9uCi1LUE1ELUludGVycHJldGVyLVZlcnNpb246IDEuMwotS1BNRC1Pd25lci1OYW1lOiBCYXJyeSBXYXJzYXcKLUtQTUQtT3duZXItUmVuZGV6dm91czogYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cwotS1BNRC1Ib21lLUtTUzoga3NzLmNucmkucmVzdG9uLnZhLnVzCi1LUE1ELUlkZW50aWZpZXI6IGhkbDovL2Nucmkua3NzL215X2ZpcnN0X2tub3dib3QKLUtQTUQtTGF1bmNoLURhdGU6IE1vbiBGZWIgMTIgMTY6Mzk6MDMgRVNUIDE5OTYKLQotLS04MDJzcGFtOTk5Ci1Db250ZW50LVR5cGU6IHRleHQvaXNsCi1LUC1NZXRhZGF0YS1UeXBlOiBjb21wbGV4Ci1LUC1NZXRhZGF0YS1LZXk6IGNvbm5lY3Rpb24KLUtQLUFjY2VzczogcmVhZC1vbmx5Ci1LUC1Db25uZWN0aW9uLURlc2NyaXB0aW9uOiBCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzCi1LUC1Db25uZWN0aW9uLUlkOiBCNAotS1AtQ29ubmVjdGlvbi1EaXJlY3Rpb246IGNsaWVudAotCi1JTlRFUkZBQ0UgU2VsbGVyLTE7Ci0KLVRZUEUgU2VsbGVyID0gT0JKRUNUCi0gICAgRE9DVU1FTlRBVElPTiAiQSBzaW1wbGUgU2VsbGVyIGludGVyZmFjZSB0byB0ZXN0IElMVSIKLSAgICBNRVRIT0RTCi0gICAgICAgICAgICBwcmljZSgpOklOVEVHRVIsCi0gICAgRU5EOwotCi0tLTgwMnNwYW05OTkKLUNvbnRlbnQtVHlwZTogbWVzc2FnZS9leHRlcm5hbC1ib2R5OwotICAgIGFjY2Vzcy10eXBlPSJVUkwiOwotICAgIFVSTD0iaGRsOi8vY25yaS5rc3MvZ2VuZXJpYy1rbm93Ym90IgotCi1Db250ZW50LVR5cGU6IHRleHQvaXNsCi1LUC1NZXRhZGF0YS1UeXBlOiBjb21wbGV4Ci1LUC1NZXRhZGF0YS1LZXk6IGdlbmVyaWMtaW50ZXJmYWNlCi1LUC1BY2Nlc3M6IHJlYWQtb25seQotS1AtQ29ubmVjdGlvbi1EZXNjcmlwdGlvbjogR2VuZXJpYyBJbnRlcmZhY2UgZm9yIEFsbCBLbm93Ym90cwotS1AtQ29ubmVjdGlvbi1JZDogZ2VuZXJpYy1rcAotS1AtQ29ubmVjdGlvbi1EaXJlY3Rpb246IGNsaWVudAotCi0KLS0tODAyc3BhbTk5OS0tCi0KLS0tODAxc3BhbTk5OQotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1jb2RlOwotICAgIGJvdW5kYXJ5PSI4MDNzcGFtOTk5IgotCi0KLS0tODAzc3BhbTk5OQotQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCi1LUC1Nb2R1bGUtTmFtZTogQnV5ZXJLUAotCi1jbGFzcyBCdXllcjoKLSAgICBkZWYgX19zZXR1cF9fKHNlbGYsIG1heHByaWNlKToKLSAgICAgICAgc2VsZi5fbWF4cHJpY2UgPSBtYXhwcmljZQotCi0gICAgZGVmIF9fbWFpbl9fKHNlbGYsIGtvcyk6Ci0gICAgICAgICIiIkVudHJ5IHBvaW50IHVwb24gYXJyaXZhbCBhdCBhIG5ldyBLT1MuIiIiCi0gICAgICAgIGJyb2tlciA9IGtvcy5icm9rZXIoKQotICAgICAgICAjIEI0ID09IEJhcnJ5J3MgQmlnIEJhc3MgQnVzaW5lc3MgOi0pCi0gICAgICAgIHNlbGxlciA9IGJyb2tlci5sb29rdXAoJ1NlbGxlcl8xLlNlbGxlcicsICdCNCcpCi0gICAgICAgIGlmIHNlbGxlcjoKLSAgICAgICAgICAgIHByaWNlID0gc2VsbGVyLnByaWNlKCkKLSAgICAgICAgICAgIHByaW50ICdTZWxsZXIgd2FudHMgJCcsIHByaWNlLCAnLi4uICcKLSAgICAgICAgICAgIGlmIHByaWNlID4gc2VsZi5fbWF4cHJpY2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ3RvbyBtdWNoIScKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIkknbGwgdGFrZSBpdCEiCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAnbm8gc2VsbGVyIGZvdW5kIGhlcmUnCi0KLS0tODAzc3BhbTk5OS0tCi0KLS0tODAxc3BhbTk5OQotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1zdGF0ZTsKLSAgICBib3VuZGFyeT0iODA0c3BhbTk5OSIKLUtQLU1haW4tTW9kdWxlOiBtYWluCi0KLQotLS04MDRzcGFtOTk5Ci1Db250ZW50LVR5cGU6IHRleHQvcGxhaW4KLUtQLU1vZHVsZS1OYW1lOiBtYWluCi0KLSMgaW5zdGFudGlhdGUgYSBidXllciBpbnN0YW5jZSBhbmQgcHV0IGl0IGluIGEgbWFnaWMgcGxhY2UgZm9yIHRoZSBLT1MKLSMgdG8gZmluZC4KLV9fa3BfXyA9IEJ1eWVyKCkKLV9fa3BfXy5fX3NldHVwX18oNTAwKQotCi0tLTgwNHNwYW05OTktLQotCi0tLTgwMXNwYW05OTktLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY2dpIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVkZGZhLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2NnaQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLXRlc3RfY2dpCi0nJyA9PiBbXQotJyYnID0+IFtdCi0nJiYnID0+IFtdCi0nPScgPT4gWygnJywgJycpXQotJz1hJyA9PiBbKCcnLCAnYScpXQotJ2EnID0+IFsoJ2EnLCAnJyldCi0nYT0nID0+IFsoJ2EnLCAnJyldCi0nYT0nID0+IFsoJ2EnLCAnJyldCi0nJmE9YicgPT4gWygnYScsICdiJyldCi0nYT1hK2ImYj1iK2MnID0+IFsoJ2EnLCAnYSBiJyksICgnYicsICdiIGMnKV0KLSdhPTEmYT0yJyA9PiBbKCdhJywgJzEnKSwgKCdhJywgJzInKV0KLScnCi0nJicKLScmJicKLSc7JwotJzsmOycKLSc9JwotJz0mPScKLSc9Oz0nCi0nPWEnCi0nJj1hJwotJz1hJicKLSc9JmEnCi0nYj1hJwotJ2IrPWEnCi0nYT1iPWEnCi0nYT0rYj1hJwotJyZiPWEnCi0nYiY9YScKLSdhPWErYiZiPWIrYycKLSdhPWErYiZhPWIrYScKLSd4PTEmeT0yLjAmej0yLTMuJTJiMCcKLSd4PTE7eT0yLjAmej0yLTMuJTJiMCcKLSd4PTE7eT0yLjA7ej0yLTMuJTJiMCcKLSdIYmM1MTYxMTY4YzU0MjMzMzYzMzMxNWRlZTExODIyMjc6a2V5X3N0b3JlX3NlcWlkPTQwMDAwNiZjdXllcj1yJnZpZXc9YnVzdG9tZXImb3JkZXJfaWQ9MGJiMmUyNDg2Mzg4MzNkNDhjYjdmZWQzMDAwMDBmMWImZXhwaXJlPTk2NDU0NjI2MyZsb2JhbGU9ZW4tVVMma2lkPTEzMDAwMy4zMDAwMzgmc3M9ZW52JwotJ2dyb3VwX2lkPTU0NzAmc2V0PWN1c3RvbSZfYXNzaWduZWRfdG89MzEzOTImX3N0YXR1cz0xJl9jYXRlZ29yeT0xMDAmU1VCTUlUPUJyb3dzZScKLVRlc3RpbmcgbG9nCi1UZXN0aW5nIGluaXRsb2cgMQotVGVzdGluZyBsb2cgMgotVGVzdCBGaWVsZFN0b3JhZ2UgbWV0aG9kcyB0aGF0IHVzZSByZWFkbGluZQotVGVzdCBiYXNpYyBGaWVsZFN0b3JhZ2UgbXVsdGlwYXJ0IHBhcnNpbmcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2Nvb2tpZSBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2Nvb2tpZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjNzMyOC4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb29raWUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi10ZXN0X2Nvb2tpZQotPFNpbXBsZUNvb2tpZTogY2hpcHM9J2Fob3knIHZpZW5uYT0nZmluZ2VyJz4KLVNldC1Db29raWU6IGNoaXBzPWFob3kKLVNldC1Db29raWU6IHZpZW5uYT1maW5nZXIKLSAgY2hpcHMgJ2Fob3knICdhaG95JwotU2V0LUNvb2tpZTogY2hpcHM9YWhveQotICB2aWVubmEgJ2ZpbmdlcicgJ2ZpbmdlcicKLVNldC1Db29raWU6IHZpZW5uYT1maW5nZXIKLTxTaW1wbGVDb29raWU6IGtlZWJsZXI9J0U9bWMyOyBMPSJMb3ZlcyI7IGZ1ZGdlPVxuOyc+Ci1TZXQtQ29va2llOiBrZWVibGVyPSJFPW1jMjsgTD1cIkxvdmVzXCI7IGZ1ZGdlPVwwMTI7IgotICBrZWVibGVyICdFPW1jMjsgTD0iTG92ZXMiOyBmdWRnZT1cbjsnICdFPW1jMjsgTD0iTG92ZXMiOyBmdWRnZT1cbjsnCi1TZXQtQ29va2llOiBrZWVibGVyPSJFPW1jMjsgTD1cIkxvdmVzXCI7IGZ1ZGdlPVwwMTI7IgotPFNpbXBsZUNvb2tpZToga2VlYmxlcj0nRT1tYzInPgotU2V0LUNvb2tpZToga2VlYmxlcj1FPW1jMgotICBrZWVibGVyICdFPW1jMicgJ0U9bWMyJwotU2V0LUNvb2tpZToga2VlYmxlcj1FPW1jMgotU2V0LUNvb2tpZTogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBQYXRoPS9hY21lCi0KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgICAgICA8IS0tIGJlZ2luIGhpZGluZwotICAgICAgICBkb2N1bWVudC5jb29raWUgPSAiQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBQYXRoPS9hY21lOyBWZXJzaW9uPTEiOwotICAgICAgICAvLyBlbmQgaGlkaW5nIC0tPgotICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgCi0KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgICAgICA8IS0tIGJlZ2luIGhpZGluZwotICAgICAgICBkb2N1bWVudC5jb29raWUgPSAiQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBQYXRoPS9hY21lIjsKLSAgICAgICAgLy8gZW5kIGhpZGluZyAtLT4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIAotSWYgYW55dGhpbmcgYmxvd3MgdXAgYWZ0ZXIgdGhpcyBsaW5lLCBpdCdzIGZyb20gQ29va2llJ3MgZG9jdGVzdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2dsb2JhbCBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2dsb2JhbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyN2EyOS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9nbG9iYWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXRlc3RfZ2xvYmFsCi1nb3QgU3ludGF4RXJyb3IgYXMgZXhwZWN0ZWQKLWdvdCBTeW50YXhFcnJvciBhcyBleHBlY3RlZAotZ290IFN5bnRheEVycm9yIGFzIGV4cGVjdGVkCi1hcyBleHBlY3RlZCwgbm8gU3ludGF4RXJyb3IKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2dyYW1tYXIgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9ncmFtbWFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDMzMjc2Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2dyYW1tYXIKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi10ZXN0X2dyYW1tYXIKLTEuIFBhcnNlcgotMS4xIFRva2VucwotMS4xLjEgQmFja3NsYXNoZXMKLTEuMS4yIE51bWVyaWMgbGl0ZXJhbHMKLTEuMS4yLjEgUGxhaW4gaW50ZWdlcnMKLTEuMS4yLjIgTG9uZyBpbnRlZ2VycwotMS4xLjIuMyBGbG9hdGluZyBwb2ludAotMS4xLjMgU3RyaW5nIGxpdGVyYWxzCi0xLjEuNCBFbGxpcHNpcyBsaXRlcmFsCi0xLjIgR3JhbW1hcgotc2luZ2xlX2lucHV0Ci1maWxlX2lucHV0Ci1leHByX2lucHV0Ci1ldmFsX2lucHV0Ci1mdW5jZGVmCi1sYW1iZGVmCi1zaW1wbGVfc3RtdAotZXhwcl9zdG10Ci1wcmludF9zdG10Ci0xIDIgMwotMSAyIDMKLTEgMSAxCi1leHRlbmRlZCBwcmludF9zdG10Ci0xIDIgMwotMSAyIDMKLTEgMSAxCi1oZWxsbyB3b3JsZAotZGVsX3N0bXQKLXBhc3Nfc3RtdAotZmxvd19zdG10Ci1icmVha19zdG10Ci1jb250aW51ZV9zdG10Ci1jb250aW51ZSArIHRyeS9leGNlcHQgb2sKLWNvbnRpbnVlICsgdHJ5L2ZpbmFsbHkgb2sKLXRlc3RpbmcgY29udGludWUgYW5kIGJyZWFrIGluIHRyeS9leGNlcHQgaW4gbG9vcAotcmV0dXJuX3N0bXQKLXlpZWxkX3N0bXQKLXJhaXNlX3N0bXQKLWltcG9ydF9uYW1lCi1pbXBvcnRfZnJvbQotZ2xvYmFsX3N0bXQKLWFzc2VydF9zdG10Ci1pZl9zdG10Ci13aGlsZV9zdG10Ci1mb3Jfc3RtdAotdHJ5X3N0bXQKLXN1aXRlCi10ZXN0Ci1jb21wYXJpc29uCi1iaW5hcnkgbWFzayBvcHMKLXNoaWZ0IG9wcwotYWRkaXRpdmUgb3BzCi1tdWx0aXBsaWNhdGl2ZSBvcHMKLXVuYXJ5IG9wcwotc2VsZWN0b3JzCi0KLVsxLCAoMSwpLCAoMSwgMiksICgxLCAyLCAzKV0KLWF0b21zCi1jbGFzc2RlZgotWydBcHBsZScsICdCYW5hbmEnLCAnQ29jbyAgbnV0J10KLVszLCA2LCA5LCAxMiwgMTVdCi1bMywgNCwgNV0KLVsoMSwgJ0FwcGxlJyksICgxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLCAoMiwgJ0FwcGxlJyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLCAoMywgJ0FwcGxlJyksICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLCAoNCwgJ0FwcGxlJyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLCAoNSwgJ0FwcGxlJyksICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXQotWygxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwgKDMsICdCYW5hbmEnKSwgKDMsICdDb2NvbnV0JyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLCAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0KLVtbMV0sIFsxLCAxXSwgWzEsIDIsIDRdLCBbMSwgMywgOSwgMjddLCBbMSwgNCwgMTYsIDY0LCAyNTZdXQotW0ZhbHNlLCBGYWxzZSwgRmFsc2VdCi1bWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0KLVsoJ0JvZWluZycsICdBaXJsaW5lcicpLCAoJ0JvZWluZycsICdFbmdpbmUnKSwgKCdGb3JkJywgJ0VuZ2luZScpLCAoJ01hY2RvbmFsZHMnLCAnQ2hlZXNlYnVyZ2VyJyldCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9odHRwbGliIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfaHR0cGxpYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyYjg3Ni4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9odHRwbGliCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotdGVzdF9odHRwbGliCi1yZXBseTogJ0hUVFAvMS4xIDIwMCBPa1xyXG4nCi1UZXh0Ci1yZXBseTogJ0hUVFAvMS4xIDQwMC4xMDAgTm90IE9rXHJcbicKLUJhZFN0YXR1c0xpbmUgcmFpc2VkIGFzIGV4cGVjdGVkCi1JbnZhbGlkVVJMIHJhaXNlZCBhcyBleHBlY3RlZAotSW52YWxpZFVSTCByYWlzZWQgYXMgZXhwZWN0ZWQKLXJlcGx5OiAnSFRUUC8xLjEgMjAwIE9LXHJcbicKLWhlYWRlcjogU2V0LUNvb2tpZTogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCi1oZWFkZXI6IFNldC1Db29raWU6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSIKLXJlcGx5OiAnSFRUUC8xLjEgMjAwIE9LXHJcbicKLWhlYWRlcjogQ29udGVudC1MZW5ndGg6IDE0NDMyCi0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X21hdGggYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9tYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzhmNzdjLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X21hdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi10ZXN0X21hdGgKLW1hdGggbW9kdWxlLCB0ZXN0aW5nIHdpdGggZXBzIDFlLTA1Ci1jb25zdGFudHMKLWFjb3MKLWFzaW4KLWF0YW4KLWF0YW4yCi1jZWlsCi1jb3MKLWNvc2gKLWRlZ3JlZXMKLWV4cAotZmFicwotZmxvb3IKLWZtb2QKLWZyZXhwCi1oeXBvdAotbGRleHAKLWxvZwotbG9nMTAKLW1vZGYKLXBvdwotcmFkaWFucwotc2luCi1zaW5oCi1zcXJ0Ci10YW4KLXRhbmgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X21tYXAgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9tbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDVmODQwLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X21tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi10ZXN0X21tYXAKLTx0eXBlICdtbWFwLm1tYXAnPgotICBQb3NpdGlvbiBvZiBmb286IDEuMCBwYWdlcwotICBMZW5ndGggb2YgZmlsZTogMi4wIHBhZ2VzCi0gIENvbnRlbnRzIG9mIGJ5dGUgMDogJ1x4MDAnCi0gIENvbnRlbnRzIG9mIGZpcnN0IDMgYnl0ZXM6ICdceDAwXHgwMFx4MDAnCi0KLSAgTW9kaWZ5aW5nIGZpbGUncyBjb250ZW50Li4uCi0gIENvbnRlbnRzIG9mIGJ5dGUgMDogJzMnCi0gIENvbnRlbnRzIG9mIGZpcnN0IDMgYnl0ZXM6ICczXHgwMFx4MDAnCi0gIENvbnRlbnRzIG9mIHNlY29uZCBwYWdlOiAnXHgwMGZvb2Jhclx4MDAnCi0gIFJlZ2V4IG1hdGNoIG9uIG1tYXAgKHBhZ2Ugc3RhcnQsIGxlbmd0aCBvZiBtYXRjaCk6IDEuMCA2Ci0gIFNlZWsgdG8gemVyb3RoIGJ5dGUKLSAgU2VlayB0byA0Mm5kIGJ5dGUKLSAgU2VlayB0byBsYXN0IGJ5dGUKLSAgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4KLSAgVHJ5IHRvIHNlZWsgYmV5b25kIGVuZCBvZiBtbWFwLi4uCi0gIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uCi0gIEF0dGVtcHRpbmcgcmVzaXplKCkKLSAgQ3JlYXRpbmcgMTAgYnl0ZSB0ZXN0IGRhdGEgZmlsZS4KLSAgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19SRUFECi0gIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSBzbGljZSBhc3NpZ25lZC4KLSAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIGl0ZW0gYXNzaWduZWQuCi0gIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSB3cml0ZSgpIHRvLgotICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGVfYnl0ZSgpIHRvLgotICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgcmVzaXplZC4KLSAgT3BlbmluZyBtbWFwIHdpdGggc2l6ZSB0b28gYmlnCi0gIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfV1JJVEUKLSAgTW9kaWZ5aW5nIHdyaXRlLXRocm91Z2ggbWVtb3J5IG1hcC4KLSAgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19DT1BZCi0gIE1vZGlmeWluZyBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAuCi0gIEVuc3VyaW5nIGNvcHktb24td3JpdGUgbWFwcyBjYW5ub3QgYmUgcmVzaXplZC4KLSAgRW5zdXJpbmcgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyIHJhaXNlcyBleGNlcHRpb24uCi0gIFRyeSBvcGVuaW5nIGEgYmFkIGZpbGUgZGVzY3JpcHRvci4uLgotICBFbnN1cmluZyB0aGF0IHBhc3NpbmcgMCBhcyBtYXAgbGVuZ3RoIHNldHMgbWFwIHNpemUgdG8gY3VycmVudCBmaWxlIHNpemUuCi0gIEVuc3VyaW5nIHRoYXQgcGFzc2luZyAwIGFzIG1hcCBsZW5ndGggc2V0cyBtYXAgc2l6ZSB0byBjdXJyZW50IGZpbGUgc2l6ZS4KLSAgYW5vbnltb3VzIG1tYXAubW1hcCgtMSwgUEFHRVNJWkUpLi4uCi0gVGVzdCBwYXNzZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X25pcyBiL0xpYi90ZXN0L291dHB1dC90ZXN0X25pcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1M2FiNC4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9uaXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXRlc3RfbmlzCi1uaXMubWFwcygpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9vcGNvZGVzIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3Bjb2RlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4NTU3MS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9vcGNvZGVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi10ZXN0X29wY29kZXMKLTIuIE9wY29kZXMKLVhYWCBOb3QgeWV0IGZ1bGx5IGltcGxlbWVudGVkCi0yLjEgdHJ5IGluc2lkZSBmb3IgbG9vcAotMi4yIHJhaXNlIGNsYXNzIGV4Y2VwdGlvbnMKLTIuMyBjb21wYXJpbmcgZnVuY3Rpb24gb2JqZWN0cwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3BlbnB0eSBiL0xpYi90ZXN0L291dHB1dC90ZXN0X29wZW5wdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjhiNWUuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3BlbnB0eQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotdGVzdF9vcGVucHR5Ci1QaW5nIQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfcG9sbCBiL0xpYi90ZXN0L291dHB1dC90ZXN0X3BvbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjFkMzcuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfcG9sbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXRlc3RfcG9sbAotUnVubmluZyBwb2xsIHRlc3QgMQotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotIFRoaXMgaXMgYSB0ZXN0LgotUG9sbCB0ZXN0IDEgY29tcGxldGUKLVJ1bm5pbmcgcG9sbCB0ZXN0IDIKLVBvbGwgdGVzdCAyIGNvbXBsZXRlCi1SdW5uaW5nIHBvbGwgdGVzdCAzCi1Qb2xsIHRlc3QgMyBjb21wbGV0ZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfcmVnZXggYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9yZWdleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlYjI2Zi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9yZWdleAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXRlc3RfcmVnZXgKLW5vIG1hdGNoOiAtMQotc3VjY2Vzc2Z1bCBzZWFyY2g6IDYKLWNhdWdodCBleHBlY3RlZCBleGNlcHRpb24KLWZhaWxlZCBhd2sgc3ludGF4OiAtMQotc3VjY2Vzc2Z1bCBhd2sgc3ludGF4OiAyCi1mYWlsZWQgYXdrIHN5bnRheDogLTEKLW1hdGNoaW5nIHdpdGggZ3JvdXAgbmFtZXMgYW5kIGNvbXBpbGUoKQotLTEKLWNhdWdodCBleHBlY3RlZCBleGNlcHRpb24KLW1hdGNoaW5nIHdpdGggZ3JvdXAgbmFtZXMgYW5kIHN5bWNvbXAoKQotNwotODAxIDk5OQotODAxCi0oJzgwMScsICc5OTknKQotKCc4MDEnLCAnOTk5JykKLXJlYWxwYXQ6IFwoWzAtOV0rXCkgKlwoWzAtOV0rXCkKLWdyb3VwaW5kZXg6IHsnb25lJzogMSwgJ3R3byc6IDJ9Ci1ub3QgY2FzZSBmb2xkZWQgc2VhcmNoOiAtMQotY2FzZSBmb2xkZWQgc2VhcmNoOiA2Ci1fX21lbWJlcnNfXzogWydsYXN0JywgJ3JlZ3MnLCAndHJhbnNsYXRlJywgJ2dyb3VwaW5kZXgnLCAncmVhbHBhdCcsICdnaXZlbnBhdCddCi1yZWdzOiAoKDYsIDExKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSkKLWxhc3Q6IEhFTExPIFdPUkxECi10cmFuc2xhdGU6IDI1NgotZ2l2ZW5wYXQ6IHdvcmxkCi1tYXRjaCB3aXRoIHBvczogLTEKLXNlYXJjaCB3aXRoIHBvczogMTgKLWJvZ3VzIGdyb3VwOiAoJ3dvcmxkJywgTm9uZSwgTm9uZSkKLW5vIG5hbWU6IGNhdWdodCBleHBlY3RlZCBleGNlcHRpb24KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3Njb3BlIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfc2NvcGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzllNDQuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfc2NvcGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi10ZXN0X3Njb3BlCi0xLiBzaW1wbGUgbmVzdGluZwotMi4gZXh0cmEgbmVzdGluZwotMy4gc2ltcGxlIG5lc3RpbmcgKyByZWJpbmRpbmcKLTQuIG5lc3Rpbmcgd2l0aCBnbG9iYWwgYnV0IG5vIGZyZWUKLTUuIG5lc3RpbmcgdGhyb3VnaCBjbGFzcwotNi4gbmVzdGluZyBwbHVzIGZyZWUgcmVmIHRvIGdsb2JhbAotNy4gbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUKLTguIG1peGVkIGZyZWV2YXJzIGFuZCBjZWxsdmFycwotOS4gZnJlZSB2YXJpYWJsZSBpbiBtZXRob2QKLTEwLiByZWN1cnNpb24KLTExLiB1bm9wdGltaXplZCBuYW1lc3BhY2VzCi0xMi4gbGFtYmRhcwotMTMuIFVuYm91bmRMb2NhbAotMTQuIGNvbXBsZXggZGVmaW5pdGlvbnMKLTE1LiBzY29wZSBvZiBnbG9iYWwgc3RhdGVtZW50cwotMTYuIGNoZWNrIGxlYWtzCi0xNy4gY2xhc3MgYW5kIGdsb2JhbAotMTguIHZlcmlmeSB0aGF0IGxvY2FscygpIHdvcmtzCi0xOS4gdmFyIGlzIGJvdW5kIGFuZCBmcmVlIGluIGNsYXNzCi0yMC4gaW50ZXJhY3Rpb24gd2l0aCB0cmFjZSBmdW5jdGlvbgotMjAuIGV2YWwgYW5kIGV4ZWMgd2l0aCBmcmVlIHZhcmlhYmxlcwotMjEuIGxpc3QgY29tcHJlaGVuc2lvbiB3aXRoIGxvY2FsIHZhcmlhYmxlcwotMjIuIGV2YWwgd2l0aCBmcmVlIHZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdG9rZW5pemUgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF90b2tlbml6ZQppbmRleCAwYzE0MzA4Li40YTNkNThjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF90b2tlbml6ZQorKysgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF90b2tlbml6ZQpAQCAtMSwxNSArMSwyMyBAQAogdGVzdF90b2tlbml6ZQotMSwwLTEsMzU6CUNPTU1FTlQJIiMgVGVzdHMgZm9yIHRoZSAndG9rZW5pemUnIG1vZHVsZS5cbiIKLTIsMC0yLDQzOglDT01NRU5UCScjIExhcmdlIGJpdHMgc3RvbGVuIGZyb20gdGVzdF9ncmFtbWFyLnB5LiBcbicKKzEsMC0xLDM0OglDT01NRU5UCSIjIFRlc3RzIGZvciB0aGUgJ3Rva2VuaXplJyBtb2R1bGUuIgorMSwzNC0xLDM1OglOTAknXG4nCisyLDAtMiw0MjoJQ09NTUVOVAknIyBMYXJnZSBiaXRzIHN0b2xlbiBmcm9tIHRlc3RfZ3JhbW1hci5weS4gJworMiw0Mi0yLDQzOglOTAknXG4nCiAzLDAtMywxOglOTAknXG4nCi00LDAtNCwxMToJQ09NTUVOVAknIyBDb21tZW50c1xuJworNCwwLTQsMTA6CUNPTU1FTlQJJyMgQ29tbWVudHMnCis0LDEwLTQsMTE6CU5MCSdcbicKIDUsMC01LDM6CVNUUklORwknIiMiJwogNSwzLTUsNDoJTkVXTElORQknXG4nCi02LDAtNiwzOglDT01NRU5UCSIjJ1xuIgotNywwLTcsMzoJQ09NTUVOVAknIyJcbicKLTgsMC04LDM6CUNPTU1FTlQJJyNcXFxuJwotOSw3LTksOToJQ09NTUVOVAknI1xuJwotMTAsNC0xMCwxMDoJQ09NTUVOVAknIyBhYmNcbicKKzYsMC02LDI6CUNPTU1FTlQJIiMnIgorNiwyLTYsMzoJTkwJJ1xuJworNywwLTcsMjoJQ09NTUVOVAknIyInCis3LDItNywzOglOTAknXG4nCis4LDAtOCwyOglDT01NRU5UCScjXFwnCis4LDItOCwzOglOTAknXG4nCis5LDctOSw4OglDT01NRU5UCScjJworOSw4LTksOToJTkwJJ1xuJworMTAsNC0xMCw5OglDT01NRU5UCScjIGFiYycKKzEwLDktMTAsMTA6CU5MCSdcbicKIDExLDAtMTIsNDoJU1RSSU5HCSInJycjXG4jJycnIgogMTIsNC0xMiw1OglORVdMSU5FCSdcbicKIDEzLDAtMTMsMToJTkwJJ1xuJwpAQCAtMTksNyArMjcsOCBAQAogMTQsNy0xNCw4OglDT01NRU5UCScjJwogMTQsOC0xNCw5OglORVdMSU5FCSdcbicKIDE1LDAtMTUsMToJTkwJJ1xuJwotMTYsMC0xNiwyNToJQ09NTUVOVAknIyBCYWxhbmNpbmcgY29udGludWF0aW9uXG4nCisxNiwwLTE2LDI0OglDT01NRU5UCScjIEJhbGFuY2luZyBjb250aW51YXRpb24nCisxNiwyNC0xNiwyNToJTkwJJ1xuJwogMTcsMC0xNywxOglOTAknXG4nCiAxOCwwLTE4LDE6CU5BTUUJJ2EnCiAxOCwyLTE4LDM6CU9QCSc9JwpAQCAtOTMsNyArMTAyLDggQEAKIDI5LDItMjksMzoJT1AJJyknCiAyOSwzLTI5LDQ6CU5FV0xJTkUJJ1xuJwogMzAsMC0zMCwxOglOTAknXG4nCi0zMSwwLTMxLDM3OglDT01NRU5UCScjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjpcbicKKzMxLDAtMzEsMzY6CUNPTU1FTlQJJyMgQmFja3NsYXNoIG1lYW5zIGxpbmUgY29udGludWF0aW9uOicKKzMxLDM2LTMxLDM3OglOTAknXG4nCiAzMiwwLTMyLDE6CU5BTUUJJ3gnCiAzMiwyLTMyLDM6CU9QCSc9JwogMzIsNC0zMiw1OglOVU1CRVIJJzEnCkBAIC0xMDEsMTMgKzExMSwxNSBAQAogMzMsMi0zMywzOglOVU1CRVIJJzEnCiAzMywzLTMzLDQ6CU5FV0xJTkUJJ1xuJwogMzQsMC0zNCwxOglOTAknXG4nCi0zNSwwLTM1LDU1OglDT01NRU5UCScjIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlxcXG4nCiszNSwwLTM1LDU0OglDT01NRU5UCScjIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlxcJworMzUsNTQtMzUsNTU6CU5MCSdcbicKIDM2LDAtMzYsMToJTkFNRQkneCcKIDM2LDItMzYsMzoJT1AJJz0nCiAzNiw0LTM2LDU6CU5VTUJFUgknMCcKIDM2LDUtMzYsNjoJTkVXTElORQknXG4nCiAzNywwLTM3LDE6CU5MCSdcbicKLTM4LDAtMzgsMjA6CUNPTU1FTlQJJyMgT3JkaW5hcnkgaW50ZWdlcnNcbicKKzM4LDAtMzgsMTk6CUNPTU1FTlQJJyMgT3JkaW5hcnkgaW50ZWdlcnMnCiszOCwxOS0zOCwyMDoJTkwJJ1xuJwogMzksMC0zOSw0OglOVU1CRVIJJzB4ZmYnCiAzOSw1LTM5LDc6CU9QCSchPScKIDM5LDgtMzksMTE6CU5VTUJFUgknMjU1JwpAQCAtMTM4LDcgKzE1MCw4IEBACiA0NCwxNS00NCwxNjoJTlVNQkVSCScxJwogNDQsMTYtNDQsMTc6CU5FV0xJTkUJJ1xuJwogNDUsMC00NSwxOglOTAknXG4nCi00NiwwLTQ2LDE2OglDT01NRU5UCScjIExvbmcgaW50ZWdlcnNcbicKKzQ2LDAtNDYsMTU6CUNPTU1FTlQJJyMgTG9uZyBpbnRlZ2VycycKKzQ2LDE1LTQ2LDE2OglOTAknXG4nCiA0NywwLTQ3LDE6CU5BTUUJJ3gnCiA0NywyLTQ3LDM6CU9QCSc9JwogNDcsNC00Nyw2OglOVU1CRVIJJzBMJwpAQCAtMTcyLDcgKzE4NSw4IEBACiA1NCw0LTU0LDM1OglOVU1CRVIJJzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGwnCiA1NCwzNS01NCwzNjoJTkVXTElORQknXG4nCiA1NSwwLTU1LDE6CU5MCSdcbicKLTU2LDAtNTYsMjU6CUNPTU1FTlQJJyMgRmxvYXRpbmctcG9pbnQgbnVtYmVyc1xuJworNTYsMC01NiwyNDoJQ09NTUVOVAknIyBGbG9hdGluZy1wb2ludCBudW1iZXJzJworNTYsMjQtNTYsMjU6CU5MCSdcbicKIDU3LDAtNTcsMToJTkFNRQkneCcKIDU3LDItNTcsMzoJT1AJJz0nCiA1Nyw0LTU3LDg6CU5VTUJFUgknMy4xNCcKQEAgLTE4NSw3ICsxOTksOCBAQAogNTksMi01OSwzOglPUAknPScKIDU5LDQtNTksOToJTlVNQkVSCScwLjMxNCcKIDU5LDktNTksMTA6CU5FV0xJTkUJJ1xuJwotNjAsMC02MCwxODoJQ09NTUVOVAknIyBYWFggeCA9IDAwMC4zMTRcbicKKzYwLDAtNjAsMTc6CUNPTU1FTlQJJyMgWFhYIHggPSAwMDAuMzE0JworNjAsMTctNjAsMTg6CU5MCSdcbicKIDYxLDAtNjEsMToJTkFNRQkneCcKIDYxLDItNjEsMzoJT1AJJz0nCiA2MSw0LTYxLDg6CU5VTUJFUgknLjMxNCcKQEAgLTIxOSw3ICsyMzQsOCBAQAogNjgsNC02OCw5OglOVU1CRVIJJzMuMWU0JwogNjgsOS02OCwxMDoJTkVXTElORQknXG4nCiA2OSwwLTY5LDE6CU5MCSdcbicKLTcwLDAtNzAsMTg6CUNPTU1FTlQJJyMgU3RyaW5nIGxpdGVyYWxzXG4nCis3MCwwLTcwLDE3OglDT01NRU5UCScjIFN0cmluZyBsaXRlcmFscycKKzcwLDE3LTcwLDE4OglOTAknXG4nCiA3MSwwLTcxLDE6CU5BTUUJJ3gnCiA3MSwyLTcxLDM6CU9QCSc9JwogNzEsNC03MSw2OglTVFJJTkcJIicnIgpAQCAtMzY3LDcgKzM4Myw4IEBACiAxMjUsNi0xMjYsMzoJU1RSSU5HCSJ1UicnJ3NwYW1cbicnJyIKIDEyNiwzLTEyNiw0OglORVdMSU5FCSdcbicKIDEyNywwLTEyNywxOglOTAknXG4nCi0xMjgsMC0xMjgsMTQ6CUNPTU1FTlQJJyMgSW5kZW50YXRpb25cbicKKzEyOCwwLTEyOCwxMzoJQ09NTUVOVAknIyBJbmRlbnRhdGlvbicKKzEyOCwxMy0xMjgsMTQ6CU5MCSdcbicKIDEyOSwwLTEyOSwyOglOQU1FCSdpZicKIDEyOSwzLTEyOSw0OglOVU1CRVIJJzEnCiAxMjksNC0xMjksNToJT1AJJzonCkBAIC00MzksNyArNDU2LDggQEAKIDE0MiwxNC0xNDIsMTU6CU5VTUJFUgknMicKIDE0MiwxNS0xNDIsMTY6CU5FV0xJTkUJJ1xuJwogMTQzLDAtMTQzLDE6CU5MCSdcbicKLTE0NCwwLTE0NCwxMjoJQ09NTUVOVAknIyBPcGVyYXRvcnNcbicKKzE0NCwwLTE0NCwxMToJQ09NTUVOVAknIyBPcGVyYXRvcnMnCisxNDQsMTEtMTQ0LDEyOglOTAknXG4nCiAxNDUsMC0xNDUsMToJTkwJJ1xuJwogMTQ2LDAtMTQ2LDA6CURFREVOVAknJwogMTQ2LDAtMTQ2LDA6CURFREVOVAknJwpAQCAtNTAxLDcgKzUxOSw4IEBACiAxNDksMjctMTQ5LDI4OglPUAknKScKIDE0OSwyOC0xNDksMjk6CU5FV0xJTkUJJ1xuJwogMTUwLDAtMTUwLDE6CU5MCSdcbicKLTE1MSwwLTE1MSwxMzoJQ09NTUVOVAknIyBjb21wYXJpc29uXG4nCisxNTEsMC0xNTEsMTI6CUNPTU1FTlQJJyMgY29tcGFyaXNvbicKKzE1MSwxMi0xNTEsMTM6CU5MCSdcbicKIDE1MiwwLTE1MiwyOglOQU1FCSdpZicKIDE1MiwzLTE1Miw0OglOVU1CRVIJJzEnCiAxNTIsNS0xNTIsNjoJT1AJJzwnCkBAIC01MzIsNyArNTUxLDggQEAKIDE1Miw2Ny0xNTIsNzE6CU5BTUUJJ3Bhc3MnCiAxNTIsNzEtMTUyLDcyOglORVdMSU5FCSdcbicKIDE1MywwLTE1MywxOglOTAknXG4nCi0xNTQsMC0xNTQsOToJQ09NTUVOVAknIyBiaW5hcnlcbicKKzE1NCwwLTE1NCw4OglDT01NRU5UCScjIGJpbmFyeScKKzE1NCw4LTE1NCw5OglOTAknXG4nCiAxNTUsMC0xNTUsMToJTkFNRQkneCcKIDE1NSwyLTE1NSwzOglPUAknPScKIDE1NSw0LTE1NSw1OglOVU1CRVIJJzEnCkBAIC01NTIsNyArNTcyLDggQEAKIDE1Nyw4LTE1Nyw5OglOVU1CRVIJJzEnCiAxNTcsOS0xNTcsMTA6CU5FV0xJTkUJJ1xuJwogMTU4LDAtMTU4LDE6CU5MCSdcbicKLTE1OSwwLTE1OSw4OglDT01NRU5UCScjIHNoaWZ0XG4nCisxNTksMC0xNTksNzoJQ09NTUVOVAknIyBzaGlmdCcKKzE1OSw3LTE1OSw4OglOTAknXG4nCiAxNjAsMC0xNjAsMToJTkFNRQkneCcKIDE2MCwyLTE2MCwzOglPUAknPScKIDE2MCw0LTE2MCw1OglOVU1CRVIJJzEnCkBAIC01NjIsNyArNTgzLDggQEAKIDE2MCwxNC0xNjAsMTU6CU5VTUJFUgknMScKIDE2MCwxNS0xNjAsMTY6CU5FV0xJTkUJJ1xuJwogMTYxLDAtMTYxLDE6CU5MCSdcbicKLTE2MiwwLTE2MiwxMToJQ09NTUVOVAknIyBhZGRpdGl2ZVxuJworMTYyLDAtMTYyLDEwOglDT01NRU5UCScjIGFkZGl0aXZlJworMTYyLDEwLTE2MiwxMToJTkwJJ1xuJwogMTYzLDAtMTYzLDE6CU5BTUUJJ3gnCiAxNjMsMi0xNjMsMzoJT1AJJz0nCiAxNjMsNC0xNjMsNToJTlVNQkVSCScxJwpAQCAtNTc2LDcgKzU5OCw4IEBACiAxNjMsMjAtMTYzLDIxOglOVU1CRVIJJzEnCiAxNjMsMjEtMTYzLDIyOglORVdMSU5FCSdcbicKIDE2NCwwLTE2NCwxOglOTAknXG4nCi0xNjUsMC0xNjUsMTc6CUNPTU1FTlQJJyMgbXVsdGlwbGljYXRpdmVcbicKKzE2NSwwLTE2NSwxNjoJQ09NTUVOVAknIyBtdWx0aXBsaWNhdGl2ZScKKzE2NSwxNi0xNjUsMTc6CU5MCSdcbicKIDE2NiwwLTE2NiwxOglOQU1FCSd4JwogMTY2LDItMTY2LDM6CU9QCSc9JwogMTY2LDQtMTY2LDU6CU5VTUJFUgknMScKQEAgLTU4OCw3ICs2MTEsOCBAQAogMTY2LDE2LTE2NiwxNzoJTlVNQkVSCScxJwogMTY2LDE3LTE2NiwxODoJTkVXTElORQknXG4nCiAxNjcsMC0xNjcsMToJTkwJJ1xuJwotMTY4LDAtMTY4LDg6CUNPTU1FTlQJJyMgdW5hcnlcbicKKzE2OCwwLTE2OCw3OglDT01NRU5UCScjIHVuYXJ5JworMTY4LDctMTY4LDg6CU5MCSdcbicKIDE2OSwwLTE2OSwxOglOQU1FCSd4JwogMTY5LDItMTY5LDM6CU9QCSc9JwogMTY5LDQtMTY5LDU6CU9QCSd+JwpAQCAtNjI2LDcgKzY1MCw4IEBACiAxNzAsMjQtMTcwLDI1OglOVU1CRVIJJzEnCiAxNzAsMjUtMTcwLDI2OglORVdMSU5FCSdcbicKIDE3MSwwLTE3MSwxOglOTAknXG4nCi0xNzIsMC0xNzIsMTE6CUNPTU1FTlQJJyMgc2VsZWN0b3JcbicKKzE3MiwwLTE3MiwxMDoJQ09NTUVOVAknIyBzZWxlY3RvcicKKzE3MiwxMC0xNzIsMTE6CU5MCSdcbicKIDE3MywwLTE3Myw2OglOQU1FCSdpbXBvcnQnCiAxNzMsNy0xNzMsMTA6CU5BTUUJJ3N5cycKIDE3MywxMC0xNzMsMTE6CU9QCScsJwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdHlwZXMgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF90eXBlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5Y2UwZC4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF90eXBlcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXRlc3RfdHlwZXMKLTYuIEJ1aWx0LWluIHR5cGVzCi02LjEgVHJ1dGggdmFsdWUgdGVzdGluZwotNi4yIEJvb2xlYW4gb3BlcmF0aW9ucwotNi4zIENvbXBhcmlzb25zCi02LjQgTnVtZXJpYyB0eXBlcyAobW9zdGx5IGNvbnZlcnNpb25zKQotNi40LjEgMzItYml0IGludGVnZXJzCi02LjQuMiBMb25nIGludGVnZXJzCi02LjQuMyBGbG9hdGluZyBwb2ludCBudW1iZXJzCi02LjUgU2VxdWVuY2UgdHlwZXMKLTYuNS4xIFN0cmluZ3MKLTYuNS4yIFR1cGxlcyBbc2VlIHRlc3RfdHVwbGUucHldCi02LjUuMyBMaXN0cyBbc2VlIHRlc3RfbGlzdC5weV0KLTYuNiBNYXBwaW5ncyA9PSBEaWN0aW9uYXJpZXMgW3NlZSB0ZXN0X2RpY3QucHldCi1CdWZmZXJzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF94ZHJsaWIgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF94ZHJsaWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmNhYTkuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfeGRybGliCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotdGVzdF94ZHJsaWIKLXBhY2sgdGVzdCAwIHN1Y2NlZWRlZAotcGFjayB0ZXN0IDEgc3VjY2VlZGVkCi1wYWNrIHRlc3QgMiBzdWNjZWVkZWQKLXBhY2sgdGVzdCAzIHN1Y2NlZWRlZAotcGFjayB0ZXN0IDQgc3VjY2VlZGVkCi1wYWNrIHRlc3QgNSBzdWNjZWVkZWQKLXBhY2sgdGVzdCA2IHN1Y2NlZWRlZAotcGFjayB0ZXN0IDcgc3VjY2VlZGVkCi1wYWNrIHRlc3QgOCBzdWNjZWVkZWQKLXVucGFjayB0ZXN0IDAgc3VjY2VlZGVkIDogOQotdW5wYWNrIHRlc3QgMSBzdWNjZWVkZWQgOiBUcnVlCi11bnBhY2sgdGVzdCAyIHN1Y2NlZWRlZCA6IEZhbHNlCi11bnBhY2sgdGVzdCAzIHN1Y2NlZWRlZCA6IDQ1Ci11bnBhY2sgdGVzdCA0IHN1Y2NlZWRlZCA6IDEuODk5OTk5OTc2MTYKLXVucGFjayB0ZXN0IDUgc3VjY2VlZGVkIDogMS45Ci11bnBhY2sgdGVzdCA2IHN1Y2NlZWRlZCA6IGhlbGxvIHdvcmxkCi11bnBhY2sgdGVzdCA3IHN1Y2NlZWRlZCA6IFswLCAxLCAyLCAzLCA0XQotdW5wYWNrIHRlc3QgOCBzdWNjZWVkZWQgOiBbJ3doYXQnLCAnaXMnLCAnaGFwbmluJywgJ2RvY3RvciddCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5IGIvTGliL3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weQppbmRleCA3ZTM3Yzg1Li4wNGFmY2JkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5CisrKyBiL0xpYi90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHkKQEAgLTksMTkgKzksMTQgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAotY2xhc3MgVGVzdEJ1ZzEzODUwNDAodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0U3ludGF4RXJyb3Ioc2VsZik6Ci0gICAgICAgIGltcG9ydCBjb21waWxlcgotCi0gICAgICAgICMgVGhlIGZvbGxvd2luZyBzbmlwcGV0IGdpdmVzIGEgU3ludGF4RXJyb3IgaW4gdGhlIGludGVycHJldGVyCi0gICAgICAgICMKLSAgICAgICAgIyBJZiB5b3UgY29tcGlsZSBhbmQgZXhlYyBpdCwgdGhlIGNhbGwgZm9vKDcpIHJldHVybnMgKDcsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlci5jb21waWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmIGZvbyhhPTEsIGIpOiByZXR1cm4gYSwgYlxuXG4iLCAiPHN0cmluZz4iLCAiZXhlYyIpCisjCisjIE5vIHRlc3QgY2FzZXMgZm9yIG91dHN0YW5kaW5nIGJ1Z3MgYXQgdGhlIG1vbWVudC4KKyMKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QnVnMTM4NTA0MCkKKyAgICAjdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgpCisgICAgcGFzcwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zZ21sX2lucHV0Lmh0bWwgYi9MaWIvdGVzdC9zZ21sX2lucHV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkMmU2YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3NnbWxfaW5wdXQuaHRtbApAQCAtMCwwICsxLDIxMiBAQAorPGh0bWw+CisgPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvZm9ybWF0ZS5jc3MiPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9ImpzL2Zsb3R0ZW4uanMiPjwvc2NyaXB0PgorIDwvaGVhZD4KKyA8Ym9keT4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPUphdmFTY3JpcHQ+IGlmIChwYXJlbnQuZnJhbWVzLmxlbmd0aCA9PSAwKSB7IHRvcC5sb2NhdGlvbi5ocmVmID0gImh0dHA6Ly9lcy5vZ2FtZS5vcmcvIjsgfSA8L3NjcmlwdD4gPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CitmdW5jdGlvbiBoYWhhKHoxKSB7CisgIGV2YWwoImxvY2F0aW9uPSciK3oxLm9wdGlvbnNbejEuc2VsZWN0ZWRJbmRleF0udmFsdWUrIiciKTsKK30KKzwvc2NyaXB0PgorPGNlbnRlcj4KKzx0YWJsZT4KKyA8dHI+CisgIDx0ZD48L3RkPgorICA8dGQ+CisgICA8Y2VudGVyPgorICAgPHRhYmxlPgorICAgIDx0cj4KKyAgICAgPHRkPjxpbWcgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvcGxhbmV0ZW4vc21hbGwvc19kc2NoanVuZ2VscGxhbmV0MDQuanBnIiB3aWR0aD0iNTAiIGhlaWdodD0iNTAiPjwvdGQ+CisgICAgIDx0ZD4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgorICAgICAgIDxzZWxlY3Qgc2l6ZT0iMSIgb25jaGFuZ2U9ImhhaGEodGhpcykiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzM4NzUzNDEmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgc2VsZWN0ZWQ+QWxpZW4gc2V4IGZyaWVuZCAgICBbMjoyNTA6Nl08L29wdGlvbj4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii9nYW1lL2Zsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyZjcD0zMzkwNTEwMCZtb2RlPUZsb3R0ZSZnaWQ9Jm1lc3NhZ2V6aWVsPSZyZT0wIiA+MTk4OSAgICBbMjoyNDg6MTRdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzQ1NzA4MDgmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPjE5OTAgICAgWzI6MjQ4OjZdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzQ1NzA4NTgmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPjE5OTEgICAgWzI6MjU0OjZdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzQ1NzI5MjkmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPkNvbG9uaWEgICAgWzI6MjUzOjEyXTwvb3B0aW9uPiAKKyAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgPC90YWJsZT4KKyAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICA8L2NlbnRlcj4KKyAgPC90ZD4KKyAgPHRkPgorICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+CisgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvaW1hZ2VzL21ldGFsbC5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPgorICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2ltYWdlcy9rcmlzdGFsbC5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPgorICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2ltYWdlcy9kZXV0ZXJpdW0uZ2lmIiB3aWR0aD0iNDIiIGhlaWdodD0iMjIiPgorICAgICA8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4KKyAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9pbWFnZXMvZW5lcmdpZS5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PGk+PGI+Jm5ic3A7Jm5ic3A7PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48aT48Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+TWV0YWw8L2ZvbnQ+PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48aT48Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+Q3Jpc3RhbDwvZm9udD48L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxpPjxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5EZXV0ZXJpbzwvZm9udD48L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxpPjxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5FbmVyZ+1hPC9mb250PjwvYj48L2k+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxpPjxiPiZuYnNwOyZuYnNwOzwvYj48L2k+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjE2MC42MzY8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4zLjQwNjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjM5LjIzMDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxmb250IGNvbG9yPSNmZjAwMDA+LTgwPC9mb250Pi8zLjk2NTwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48L3RkPgorICAgIDwvdHI+CisgICA8L3RhYmxlPgorICA8L3RyPgorIDwvdGFibGU+CisgIDwvY2VudGVyPgorPGJyIC8+CisgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorICA8IS0tCisgICAgIGZ1bmN0aW9uIGxpbmtfdG9fZ2FtZXBheSgpIHsKKyAgICBzZWxmLmxvY2F0aW9uID0gImh0dHBzOi8vd3d3LmdhbWVwYXkuZGUvP2xhbmc9ZXMmc2VydmVySUQ9OCZ1c2VySUQ9MTI5MzYwJmdhbWVJRD1vZ2FtZSZndWk9djImY2hrc3VtPWE5NzUxYWZhOWUzN2U2YjFiODI2MzU2YmNjYTQ1Njc1IjsKKyAgfQorLy8tLT4KKyAgPC9zY3JpcHQ+Cis8Y2VudGVyPgorICA8dGFibGUgd2lkdGg9IjUxOSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjEiPgorICAgPHRyIGhlaWdodD0iMjAiPgorICA8dGQgY29sc3Bhbj0iOCIgY2xhc3M9ImMiPkZsb3RhcyAobWF4LiA5KTwvdGQ+CisgICA8L3RyPgorICAgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPk51bS48L3RoPgorICAgIDx0aD5NaXNp8248L3RoPgorICAgIDx0aD5DYW50aWRhZDwvdGg+CisgICAgPHRoPkNvbWllbnpvPC90aD4KKyAgICA8dGg+U2FsaWRhPC90aD4KKyAgICA8dGg+T2JqZXRpdm88L3RoPgorICAgIDx0aD5MbGVnYWRhPC90aD4KKyAgICA8dGg+T3JkZW48L3RoPiAgIAorICAgPC90cj4KKyAgICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD4xPC90aD4KKyAgICA8dGg+ICAKKyAgICAgIDxhIHRpdGxlPSIiPkVzcGlvbmFqZTwvYT4KKyAgICAgIDxhIHRpdGxlPSJGbG90YSBlbiBlbCBwbGFuZXRhIj4oRik8L2E+CisgICAgPC90aD4KKyAgICA8dGg+IDxhIHRpdGxlPSJTb25kYSBkZSBlc3Bpb25hamU6IDMgCisiPjM8L2E+PC90aD4KKyAgICA8dGg+WzI6MjUwOjZdPC90aD4KKyAgICA8dGg+V2VkIEF1ZyA5IDE4OjAwOjAyPC90aD4KKyAgICA8dGg+WzI6MjQyOjVdPC90aD4KKyAgICA8dGg+V2VkIEF1ZyA5IDE4OjAxOjAyPC90aD4KKyAgICA8dGg+CisgICAgICAgICA8Zm9ybSBhY3Rpb249ImZsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyIgbWV0aG9kPSJQT1NUIj4KKwk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcmRlcl9yZXR1cm4iIHZhbHVlPSIyNTA1NDQ5MCIgLz4KKyAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudmlhciBkZSByZWdyZXNvIiAvPgorICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+MjwvdGg+CisgICAgPHRoPiAgCisgICAgICA8YSB0aXRsZT0iIj5Fc3Bpb25hamU8L2E+CisgICAgICA8YSB0aXRsZT0iVm9sdmVyIGFsIHBsYW5ldGEiPihWKTwvYT4KKyAgICA8L3RoPgorICAgIDx0aD4gPGEgdGl0bGU9IlNvbmRhIGRlIGVzcGlvbmFqZTogMyAKKyI+MzwvYT48L3RoPgorICAgIDx0aD5bMjoyNTA6Nl08L3RoPgorICAgIDx0aD5XZWQgQXVnIDkgMTc6NTk6NTU8L3RoPgorICAgIDx0aD5bMjoyNDI6MV08L3RoPgorICAgIDx0aD5XZWQgQXVnIDkgMTg6MDE6NTU8L3RoPgorICAgIDx0aD4KKyAgICAgICAgICAgIDwvdGg+CisgICA8L3RyPgorICA8L3RhYmxlPgorCisKKyAgCis8Zm9ybSBhY3Rpb249ImZsb3R0ZW4yLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyIgbWV0aG9kPSJQT1NUIj4KKyAgPHRhYmxlIHdpZHRoPSI1MTkiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KKyAgICAgICA8dHIgaGVpZ2h0PSIyMCI+CisgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iYyI+TnVldmEgbWlzafNuOiBlbGVnaXIgbmF2ZXM8L3RkPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgPHRoPk5hdmVzPC90aD4KKyAgPHRoPkRpc3BvbmlibGVzPC90aD4KKzwhLS0gICAgPHRoPkdlc2NoLjwvdGg+IC0tPgorICAgIDx0aD4tPC90aD4KKyAgICA8dGg+LTwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiA4NTAwIj5OYXZlIHBlcXVl8WEgZGUgY2FyZ2E8L2E+PC90aD4gCisgICAgPHRoPjEwPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIwMiIgdmFsdWU9IjEwIi8+PC90aD4KKzwhLS0gICAgPHRoPjg1MDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjAyIiB2YWx1ZT0iMTAiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMDIiIHZhbHVlPSI4NTAwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjAyIiB2YWx1ZT0iNTAwMCIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjAyJyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMDIiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJOYXZlIHBlcXVl8WEgZGUgY2FyZ2EgMTAiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMTI3NTAiPk5hdmUgZ3JhbmRlIGRlIGNhcmdhPC9hPjwvdGg+IAorICAgIDx0aD4xOTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMDMiIHZhbHVlPSIxOSIvPjwvdGg+Cis8IS0tICAgIDx0aD4xMjc1MCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMDMiIHZhbHVlPSI1MCIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIwMyIgdmFsdWU9IjEyNzUwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjAzIiB2YWx1ZT0iMjUwMDAiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIwMycpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjAzIiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iTmF2ZSBncmFuZGUgZGUgY2FyZ2EgMTkiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMjcwMDAiPkNydWNlcm88L2E+PC90aD4gCisgICAgPHRoPjY8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtYXhzaGlwMjA2IiB2YWx1ZT0iNiIvPjwvdGg+Cis8IS0tICAgIDx0aD4yNzAwMCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMDYiIHZhbHVlPSIzMDAiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMDYiIHZhbHVlPSIyNzAwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIwNiIgdmFsdWU9IjgwMCIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjA2Jyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMDYiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJDcnVjZXJvIDYiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMzQwMCI+UmVjaWNsYWRvcjwvYT48L3RoPiAKKyAgICA8dGg+MTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMDkiIHZhbHVlPSIxIi8+PC90aD4KKzwhLS0gICAgPHRoPjM0MDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjA5IiB2YWx1ZT0iMzAwIi8+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWVkMjA5IiB2YWx1ZT0iMzQwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIwOSIgdmFsdWU9IjIwMDAwIiAvPjwvdGg+CisgICAgIDx0aD48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXAoJ3NoaXAyMDknKTsiID5t4Xg8L2E+IDwvdGg+CisgICAgIDx0aD48aW5wdXQgbmFtZT0ic2hpcDIwOSIgc2l6ZT0iMTAiIHZhbHVlPSIwIiBhbHQ9IlJlY2ljbGFkb3IgMSIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiAxNzAwMDAwMDAiPlNvbmRhIGRlIGVzcGlvbmFqZTwvYT48L3RoPiAKKyAgICA8dGg+MTM5PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIxMCIgdmFsdWU9IjEzOSIvPjwvdGg+Cis8IS0tICAgIDx0aD4xNzAwMDAwMDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjEwIiB2YWx1ZT0iMSIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIxMCIgdmFsdWU9IjE3MDAwMDAwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIxMCIgdmFsdWU9IjUiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIxMCcpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjEwIiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iU29uZGEgZGUgZXNwaW9uYWplIDEzOSIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICA8dGggY29sc3Bhbj0iMiI+PGEgaHJlZj0iamF2YXNjcmlwdDpub1NoaXBzKCk7IiA+TmluZ3VuYSBuYXZlPC9hPjwvdGg+CisgIDx0aCBjb2xzcGFuPSIyIj48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXBzKCk7IiA+VG9kYXMgbGFzIG5hdmVzPC9hPjwvdGg+CisgICA8L3RyPgorICAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGggY29sc3Bhbj0iNCI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNvbnRpbnVhciIgLz48L3RoPgorICAgPC90cj4KKzx0cj48dGggY29sc3Bhbj00PgorPGlmcmFtZSBpZD0nYTQ0ZmI1MjInIG5hbWU9J2E0NGZiNTIyJyBzcmM9J2h0dHA6Ly9hZHMuZ2FtZWZvcmdlYWRzLmRlL2FkZnJhbWUucGhwP249YTQ0ZmI1MjImYW1wO3doYXQ9em9uZTo1NzgnIGZyYW1lc3BhY2luZz0nMCcgZnJhbWVib3JkZXI9J25vJyBzY3JvbGxpbmc9J25vJyB3aWR0aD0nNDY4JyBoZWlnaHQ9JzYwJz48L2lmcmFtZT4KKzxicj48Y2VudGVyPjwvY2VudGVyPjwvYnI+Cis8L3RoPjwvdHI+Cis8L2Zvcm0+Cis8L3RhYmxlPgorIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weSBiL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQppbmRleCA3MzQ0N2FkLi4xYWE2OGRlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKKysrIGIvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CkBAIC0xMDY5LDcgKzEwNjksNyBAQAogICAgICAgICAjIGZyb20gcmF5bW9uZCdzIG9yaWdpbmFsIHNwZWNpZmljYXRpb24KICAgICAgICAgUyA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcnCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ2h0dHAnLCAnOi8vJywgJ3d3dy5weXRob24ub3JnJyksIFMsICdycGFydGl0aW9uJywgJzovLycpCi0gICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycsICcnLCAnJyksIFMsICdycGFydGl0aW9uJywgJz8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCcnLCAnJywgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycpLCBTLCAncnBhcnRpdGlvbicsICc/JykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnJywgJ2h0dHA6Ly8nLCAnd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnaHR0cDovLycpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ2h0dHA6Ly93d3cucHl0aG9uLicsICdvcmcnLCAnJyksIFMsICdycGFydGl0aW9uJywgJ29yZycpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfTWltZVdyaXRlci5weSBiL0xpYi90ZXN0L3Rlc3RfTWltZVdyaXRlci5weQppbmRleCA1MDQxMTA1Li5mZWNhMTYzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X01pbWVXcml0ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5CkBAIC03LDYgKzcsOCBAQAogCiAiIiIKIAoraW1wb3J0IHVuaXR0ZXN0LCBzeXMsIFN0cmluZ0lPCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogZnJvbSBNaW1lV3JpdGVyIGltcG9ydCBNaW1lV3JpdGVyCiAKQEAgLTc3LDk0ICs3OSwyMTMgQEAKICAgICAgICAgXQogCiAKLWRlZiBtYWluKCk6Ci0gICAgaW1wb3J0IHN5cworT1VUUFVUID0gJycnXAorRnJvbTogYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cworRGF0ZTogTW9uIEZlYiAxMiAxNzoyMTo0OCBFU1QgMTk5NgorVG86IGtzcy1zdWJtaXRAY25yaS5yZXN0b24udmEudXMKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9rbm93Ym90OworICAgIGJvdW5kYXJ5PSI4MDFzcGFtOTk5IjsKKyAgICB2ZXJzaW9uPSIwLjEiCiAKLSAgICAjIFRvcGxldmVsIGhlYWRlcnMKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCiAKLSAgICB0b3BsZXZlbCA9IE1pbWVXcml0ZXIoc3lzLnN0ZG91dCkKLSAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIkZyb20iLCAiYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cyIpCi0gICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJEYXRlIiwgIk1vbiBGZWIgMTIgMTc6MjE6NDggRVNUIDE5OTYiKQotICAgIHRvcGxldmVsLmFkZGhlYWRlcigiVG8iLCAia3NzLXN1Ym1pdEBjbnJpLnJlc3Rvbi52YS51cyIpCi0gICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJNSU1FLVZlcnNpb24iLCAiMS4wIikKLQotICAgICMgVG9wbGV2ZWwgYm9keSBwYXJ0cwotCi0gICAgZiA9IHRvcGxldmVsLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdCIsICI4MDFzcGFtOTk5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoInZlcnNpb24iLCAiMC4xIildLCBwcmVmaXg9MCkKLSAgICBmLndyaXRlKCJUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LlxuIikKLQotICAgICMgRmlyc3QgdG9wbGV2ZWwgYm9keSBwYXJ0OiBtZXRhZGF0YQotCi0gICAgbWQgPSB0b3BsZXZlbC5uZXh0cGFydCgpCi0gICAgbWQuc3RhcnRtdWx0aXBhcnRib2R5KCJrbm93Ym90LW1ldGFkYXRhIiwgIjgwMnNwYW05OTkiKQotCi0gICAgIyBNZXRhZGF0YSBwYXJ0IDEKLQotICAgIG1kMSA9IG1kLm5leHRwYXJ0KCkKLSAgICBtZDEuYWRkaGVhZGVyKCJLUC1NZXRhZGF0YS1UeXBlIiwgInNpbXBsZSIpCi0gICAgbWQxLmFkZGhlYWRlcigiS1AtQWNjZXNzIiwgInJlYWQtb25seSIpCi0gICAgbSA9IE1pbWVXcml0ZXIobWQxLnN0YXJ0Ym9keSgibWVzc2FnZS9yZmM4MjIiKSkKLSAgICBmb3Iga2V5LCB2YWx1ZSBpbiBTSU1QTEVfTUVUQURBVEE6Ci0gICAgICAgIG0uYWRkaGVhZGVyKCJLUE1ELSIgKyBrZXksIHZhbHVlKQotICAgIG0uZmx1c2hoZWFkZXJzKCkKLSAgICBkZWwgbWQxCi0KLSAgICAjIE1ldGFkYXRhIHBhcnQgMgotCi0gICAgbWQyID0gbWQubmV4dHBhcnQoKQotICAgIGZvciBrZXksIHZhbHVlIGluIENPTVBMRVhfTUVUQURBVEE6Ci0gICAgICAgIG1kMi5hZGRoZWFkZXIoIktQLSIgKyBrZXksIHZhbHVlKQotICAgIGYgPSBtZDIuc3RhcnRib2R5KCJ0ZXh0L2lzbCIpCi0gICAgZi53cml0ZShTRUxMRVIpCi0gICAgZGVsIG1kMgotCi0gICAgIyBNZXRhZGF0YSBwYXJ0IDMKLQotICAgIG1kMyA9IG1kLm5leHRwYXJ0KCkKLSAgICBmID0gbWQzLnN0YXJ0Ym9keSgibWVzc2FnZS9leHRlcm5hbC1ib2R5IiwKLSAgICAgICAgICAgICAgICAgICAgICBbKCJhY2Nlc3MtdHlwZSIsICJVUkwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKCJVUkwiLCAiaGRsOi8vY25yaS5rc3MvZ2VuZXJpYy1rbm93Ym90IildKQotICAgIG0gPSBNaW1lV3JpdGVyKGYpCi0gICAgZm9yIGtleSwgdmFsdWUgaW4gRVhURVJOQUxfTUVUQURBVEE6Ci0gICAgICAgIG1kMy5hZGRoZWFkZXIoIktQLSIgKyBrZXksIHZhbHVlKQotICAgIG1kMy5zdGFydGJvZHkoInRleHQvaXNsIikKLSAgICAjIFBoYW50b20gYm9keSBkb2Vzbid0IG5lZWQgdG8gYmUgd3JpdHRlbgotCi0gICAgbWQubGFzdHBhcnQoKQotCi0gICAgIyBTZWNvbmQgdG9wbGV2ZWwgYm9keSBwYXJ0OiBjb2RlCi0KLSAgICBjb2RlID0gdG9wbGV2ZWwubmV4dHBhcnQoKQotICAgIGNvZGUuc3RhcnRtdWx0aXBhcnRib2R5KCJrbm93Ym90LWNvZGUiLCAiODAzc3BhbTk5OSIpCi0KLSAgICAjIENvZGU6IGJ1eWVyIHByb2dyYW0gc291cmNlCi0KLSAgICBidXllciA9IGNvZGUubmV4dHBhcnQoKQotICAgIGJ1eWVyLmFkZGhlYWRlcigiS1AtTW9kdWxlLU5hbWUiLCAiQnV5ZXJLUCIpCi0gICAgZiA9IGJ1eWVyLnN0YXJ0Ym9keSgidGV4dC9wbGFpbiIpCi0gICAgZi53cml0ZShCVVlFUikKLQotICAgIGNvZGUubGFzdHBhcnQoKQotCi0gICAgIyBUaGlyZCB0b3BsZXZlbCBib2R5IHBhcnQ6IHN0YXRlCi0KLSAgICBzdGF0ZSA9IHRvcGxldmVsLm5leHRwYXJ0KCkKLSAgICBzdGF0ZS5hZGRoZWFkZXIoIktQLU1haW4tTW9kdWxlIiwgIm1haW4iKQotICAgIHN0YXRlLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1zdGF0ZSIsICI4MDRzcGFtOTk5IikKLQotICAgICMgU3RhdGU6IGEgYnVuY2ggb2YgYXNzaWdubWVudHMKLQotICAgIHN0ID0gc3RhdGUubmV4dHBhcnQoKQotICAgIHN0LmFkZGhlYWRlcigiS1AtTW9kdWxlLU5hbWUiLCAibWFpbiIpCi0gICAgZiA9IHN0LnN0YXJ0Ym9keSgidGV4dC9wbGFpbiIpCi0gICAgZi53cml0ZShTVEFURSkKLQotICAgIHN0YXRlLmxhc3RwYXJ0KCkKLQotICAgICMgRW5kIHRvcGxldmVsIGJvZHkgcGFydHMKLQotICAgIHRvcGxldmVsLmxhc3RwYXJ0KCkKKy0tODAxc3BhbTk5OQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1tZXRhZGF0YTsKKyAgICBib3VuZGFyeT0iODAyc3BhbTk5OSIKIAogCi1tYWluKCkKKy0tODAyc3BhbTk5OQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorS1AtTWV0YWRhdGEtVHlwZTogc2ltcGxlCitLUC1BY2Nlc3M6IHJlYWQtb25seQorCitLUE1ELUludGVycHJldGVyOiBweXRob24KK0tQTUQtSW50ZXJwcmV0ZXItVmVyc2lvbjogMS4zCitLUE1ELU93bmVyLU5hbWU6IEJhcnJ5IFdhcnNhdworS1BNRC1Pd25lci1SZW5kZXp2b3VzOiBid2Fyc2F3QGNucmkucmVzdG9uLnZhLnVzCitLUE1ELUhvbWUtS1NTOiBrc3MuY25yaS5yZXN0b24udmEudXMKK0tQTUQtSWRlbnRpZmllcjogaGRsOi8vY25yaS5rc3MvbXlfZmlyc3Rfa25vd2JvdAorS1BNRC1MYXVuY2gtRGF0ZTogTW9uIEZlYiAxMiAxNjozOTowMyBFU1QgMTk5NgorCistLTgwMnNwYW05OTkKK0NvbnRlbnQtVHlwZTogdGV4dC9pc2wKK0tQLU1ldGFkYXRhLVR5cGU6IGNvbXBsZXgKK0tQLU1ldGFkYXRhLUtleTogY29ubmVjdGlvbgorS1AtQWNjZXNzOiByZWFkLW9ubHkKK0tQLUNvbm5lY3Rpb24tRGVzY3JpcHRpb246IEJhcnJ5J3MgQmlnIEJhc3MgQnVzaW5lc3MKK0tQLUNvbm5lY3Rpb24tSWQ6IEI0CitLUC1Db25uZWN0aW9uLURpcmVjdGlvbjogY2xpZW50CisKK0lOVEVSRkFDRSBTZWxsZXItMTsKKworVFlQRSBTZWxsZXIgPSBPQkpFQ1QKKyAgICBET0NVTUVOVEFUSU9OICJBIHNpbXBsZSBTZWxsZXIgaW50ZXJmYWNlIHRvIHRlc3QgSUxVIgorICAgIE1FVEhPRFMKKyAgICAgICAgICAgIHByaWNlKCk6SU5URUdFUiwKKyAgICBFTkQ7CisKKy0tODAyc3BhbTk5OQorQ29udGVudC1UeXBlOiBtZXNzYWdlL2V4dGVybmFsLWJvZHk7CisgICAgYWNjZXNzLXR5cGU9IlVSTCI7CisgICAgVVJMPSJoZGw6Ly9jbnJpLmtzcy9nZW5lcmljLWtub3dib3QiCisKK0NvbnRlbnQtVHlwZTogdGV4dC9pc2wKK0tQLU1ldGFkYXRhLVR5cGU6IGNvbXBsZXgKK0tQLU1ldGFkYXRhLUtleTogZ2VuZXJpYy1pbnRlcmZhY2UKK0tQLUFjY2VzczogcmVhZC1vbmx5CitLUC1Db25uZWN0aW9uLURlc2NyaXB0aW9uOiBHZW5lcmljIEludGVyZmFjZSBmb3IgQWxsIEtub3dib3RzCitLUC1Db25uZWN0aW9uLUlkOiBnZW5lcmljLWtwCitLUC1Db25uZWN0aW9uLURpcmVjdGlvbjogY2xpZW50CisKKworLS04MDJzcGFtOTk5LS0KKworLS04MDFzcGFtOTk5CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9rbm93Ym90LWNvZGU7CisgICAgYm91bmRhcnk9IjgwM3NwYW05OTkiCisKKworLS04MDNzcGFtOTk5CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0tQLU1vZHVsZS1OYW1lOiBCdXllcktQCisKK2NsYXNzIEJ1eWVyOgorICAgIGRlZiBfX3NldHVwX18oc2VsZiwgbWF4cHJpY2UpOgorICAgICAgICBzZWxmLl9tYXhwcmljZSA9IG1heHByaWNlCisKKyAgICBkZWYgX19tYWluX18oc2VsZiwga29zKToKKyAgICAgICAgIiIiRW50cnkgcG9pbnQgdXBvbiBhcnJpdmFsIGF0IGEgbmV3IEtPUy4iIiIKKyAgICAgICAgYnJva2VyID0ga29zLmJyb2tlcigpCisgICAgICAgICMgQjQgPT0gQmFycnkncyBCaWcgQmFzcyBCdXNpbmVzcyA6LSkKKyAgICAgICAgc2VsbGVyID0gYnJva2VyLmxvb2t1cCgnU2VsbGVyXzEuU2VsbGVyJywgJ0I0JykKKyAgICAgICAgaWYgc2VsbGVyOgorICAgICAgICAgICAgcHJpY2UgPSBzZWxsZXIucHJpY2UoKQorICAgICAgICAgICAgcHJpbnQgJ1NlbGxlciB3YW50cyAkJywgcHJpY2UsICcuLi4gJworICAgICAgICAgICAgaWYgcHJpY2UgPiBzZWxmLl9tYXhwcmljZToKKyAgICAgICAgICAgICAgICBwcmludCAndG9vIG11Y2ghJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAiSSdsbCB0YWtlIGl0ISIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdubyBzZWxsZXIgZm91bmQgaGVyZScKKworLS04MDNzcGFtOTk5LS0KKworLS04MDFzcGFtOTk5CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9rbm93Ym90LXN0YXRlOworICAgIGJvdW5kYXJ5PSI4MDRzcGFtOTk5IgorS1AtTWFpbi1Nb2R1bGU6IG1haW4KKworCistLTgwNHNwYW05OTkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorS1AtTW9kdWxlLU5hbWU6IG1haW4KKworIyBpbnN0YW50aWF0ZSBhIGJ1eWVyIGluc3RhbmNlIGFuZCBwdXQgaXQgaW4gYSBtYWdpYyBwbGFjZSBmb3IgdGhlIEtPUworIyB0byBmaW5kLgorX19rcF9fID0gQnV5ZXIoKQorX19rcF9fLl9fc2V0dXBfXyg1MDApCisKKy0tODA0c3BhbTk5OS0tCisKKy0tODAxc3BhbTk5OS0tCisnJycKKworY2xhc3MgTWltZXdyaXRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGJ1ZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKworICAgICAgICAjIFRvcGxldmVsIGhlYWRlcnMKKworICAgICAgICB0b3BsZXZlbCA9IE1pbWVXcml0ZXIoYnVmKQorICAgICAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIkZyb20iLCAiYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cyIpCisgICAgICAgIHRvcGxldmVsLmFkZGhlYWRlcigiRGF0ZSIsICJNb24gRmViIDEyIDE3OjIxOjQ4IEVTVCAxOTk2IikKKyAgICAgICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJUbyIsICJrc3Mtc3VibWl0QGNucmkucmVzdG9uLnZhLnVzIikKKyAgICAgICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJNSU1FLVZlcnNpb24iLCAiMS4wIikKKworICAgICAgICAjIFRvcGxldmVsIGJvZHkgcGFydHMKKworICAgICAgICBmID0gdG9wbGV2ZWwuc3RhcnRtdWx0aXBhcnRib2R5KCJrbm93Ym90IiwgIjgwMXNwYW05OTkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoInZlcnNpb24iLCAiMC4xIildLCBwcmVmaXg9MCkKKyAgICAgICAgZi53cml0ZSgiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC5cbiIpCisKKyAgICAgICAgIyBGaXJzdCB0b3BsZXZlbCBib2R5IHBhcnQ6IG1ldGFkYXRhCisKKyAgICAgICAgbWQgPSB0b3BsZXZlbC5uZXh0cGFydCgpCisgICAgICAgIG1kLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1tZXRhZGF0YSIsICI4MDJzcGFtOTk5IikKKworICAgICAgICAjIE1ldGFkYXRhIHBhcnQgMQorCisgICAgICAgIG1kMSA9IG1kLm5leHRwYXJ0KCkKKyAgICAgICAgbWQxLmFkZGhlYWRlcigiS1AtTWV0YWRhdGEtVHlwZSIsICJzaW1wbGUiKQorICAgICAgICBtZDEuYWRkaGVhZGVyKCJLUC1BY2Nlc3MiLCAicmVhZC1vbmx5IikKKyAgICAgICAgbSA9IE1pbWVXcml0ZXIobWQxLnN0YXJ0Ym9keSgibWVzc2FnZS9yZmM4MjIiKSkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gU0lNUExFX01FVEFEQVRBOgorICAgICAgICAgICAgbS5hZGRoZWFkZXIoIktQTUQtIiArIGtleSwgdmFsdWUpCisgICAgICAgIG0uZmx1c2hoZWFkZXJzKCkKKyAgICAgICAgZGVsIG1kMQorCisgICAgICAgICMgTWV0YWRhdGEgcGFydCAyCisKKyAgICAgICAgbWQyID0gbWQubmV4dHBhcnQoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBDT01QTEVYX01FVEFEQVRBOgorICAgICAgICAgICAgbWQyLmFkZGhlYWRlcigiS1AtIiArIGtleSwgdmFsdWUpCisgICAgICAgIGYgPSBtZDIuc3RhcnRib2R5KCJ0ZXh0L2lzbCIpCisgICAgICAgIGYud3JpdGUoU0VMTEVSKQorICAgICAgICBkZWwgbWQyCisKKyAgICAgICAgIyBNZXRhZGF0YSBwYXJ0IDMKKworICAgICAgICBtZDMgPSBtZC5uZXh0cGFydCgpCisgICAgICAgIGYgPSBtZDMuc3RhcnRib2R5KCJtZXNzYWdlL2V4dGVybmFsLWJvZHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJhY2Nlc3MtdHlwZSIsICJVUkwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgiVVJMIiwgImhkbDovL2Nucmkua3NzL2dlbmVyaWMta25vd2JvdCIpXSkKKyAgICAgICAgbSA9IE1pbWVXcml0ZXIoZikKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gRVhURVJOQUxfTUVUQURBVEE6CisgICAgICAgICAgICBtZDMuYWRkaGVhZGVyKCJLUC0iICsga2V5LCB2YWx1ZSkKKyAgICAgICAgbWQzLnN0YXJ0Ym9keSgidGV4dC9pc2wiKQorICAgICAgICAjIFBoYW50b20gYm9keSBkb2Vzbid0IG5lZWQgdG8gYmUgd3JpdHRlbgorCisgICAgICAgIG1kLmxhc3RwYXJ0KCkKKworICAgICAgICAjIFNlY29uZCB0b3BsZXZlbCBib2R5IHBhcnQ6IGNvZGUKKworICAgICAgICBjb2RlID0gdG9wbGV2ZWwubmV4dHBhcnQoKQorICAgICAgICBjb2RlLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1jb2RlIiwgIjgwM3NwYW05OTkiKQorCisgICAgICAgICMgQ29kZTogYnV5ZXIgcHJvZ3JhbSBzb3VyY2UKKworICAgICAgICBidXllciA9IGNvZGUubmV4dHBhcnQoKQorICAgICAgICBidXllci5hZGRoZWFkZXIoIktQLU1vZHVsZS1OYW1lIiwgIkJ1eWVyS1AiKQorICAgICAgICBmID0gYnV5ZXIuc3RhcnRib2R5KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgZi53cml0ZShCVVlFUikKKworICAgICAgICBjb2RlLmxhc3RwYXJ0KCkKKworICAgICAgICAjIFRoaXJkIHRvcGxldmVsIGJvZHkgcGFydDogc3RhdGUKKworICAgICAgICBzdGF0ZSA9IHRvcGxldmVsLm5leHRwYXJ0KCkKKyAgICAgICAgc3RhdGUuYWRkaGVhZGVyKCJLUC1NYWluLU1vZHVsZSIsICJtYWluIikKKyAgICAgICAgc3RhdGUuc3RhcnRtdWx0aXBhcnRib2R5KCJrbm93Ym90LXN0YXRlIiwgIjgwNHNwYW05OTkiKQorCisgICAgICAgICMgU3RhdGU6IGEgYnVuY2ggb2YgYXNzaWdubWVudHMKKworICAgICAgICBzdCA9IHN0YXRlLm5leHRwYXJ0KCkKKyAgICAgICAgc3QuYWRkaGVhZGVyKCJLUC1Nb2R1bGUtTmFtZSIsICJtYWluIikKKyAgICAgICAgZiA9IHN0LnN0YXJ0Ym9keSgidGV4dC9wbGFpbiIpCisgICAgICAgIGYud3JpdGUoU1RBVEUpCisKKyAgICAgICAgc3RhdGUubGFzdHBhcnQoKQorCisgICAgICAgICMgRW5kIHRvcGxldmVsIGJvZHkgcGFydHMKKworICAgICAgICB0b3BsZXZlbC5sYXN0cGFydCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYuZ2V0dmFsdWUoKSwgT1VUUFVUKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE1pbWV3cml0ZXJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5IGIvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQppbmRleCBjYzMzNjdmLi45Zjc5YjAyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgZXEoZi5nZXR2YWx1ZSgpLCAnYWJjZGUnKQogICAgICAgICBmLndyaXRlKCd4eXonKQogICAgICAgICBlcShmLmdldHZhbHVlKCksICdhYmNkZXh5eicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGYudHJ1bmNhdGUsIC0xKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi53cml0ZSwgJ2Zyb2JuaXR6JykKIApAQCAtMTIwLDYgKzEyMSwyOCBAQAogY2xhc3MgVGVzdGNTdHJpbmdJTyhUZXN0R2VuZXJpY1N0cmluZ0lPKToKICAgICBNT0RVTEUgPSBjU3RyaW5nSU8KIAorICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisKKyAgICAgICAgaWYgbm90IHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6IHJldHVybgorCisgICAgICAgICMgVGhlIGNTdHJpbmdJTyBtb2R1bGUgY29udmVydHMgVW5pY29kZSBzdHJpbmdzIHRvIGNoYXJhY3RlcgorICAgICAgICAjIHN0cmluZ3Mgd2hlbiB3cml0aW5nIHRoZW0gdG8gY1N0cmluZ0lPIG9iamVjdHMuCisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGlzIHdvcmtzLgorCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIGYud3JpdGUodW5pY29kZShzZWxmLl9saW5lWzo1XSkpCisgICAgICAgIHMgPSBmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAnYWJjZGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGVzLlN0cmluZ1R5cGUpCisKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKHVuaWNvZGUoc2VsZi5fbGluZVs6NV0pKQorICAgICAgICBzID0gZi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgJ2FiY2RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlcy5TdHJpbmdUeXBlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc2VsZi5NT0RVTEUuU3RyaW5nSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUoJ1x4ZjQnLCAnbGF0aW4tMScpKQorCiBpbXBvcnQgc3lzCiBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICMgSnl0aG9uIGRvZXNuJ3QgaGF2ZSBhIGJ1ZmZlciBvYmplY3QsIHNvIHdlIGp1c3QgZG8gYSB1c2VsZXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkgYi9MaWIvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKaW5kZXggN2QyYjJhZS4uNTBhMmM3NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQpAQCAtMSw1OSArMSw2MyBAQAogIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgdmVyaWZ5Ci1mcm9tIHR5cGVzIGltcG9ydCBUdXBsZVR5cGUsIFN0cmluZ1R5cGUsIEludFR5cGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCBfX2Z1dHVyZV9fCiAKIEdPT0RfU0VSSUFMUyA9ICgiYWxwaGEiLCAiYmV0YSIsICJjYW5kaWRhdGUiLCAiZmluYWwiKQogCiBmZWF0dXJlcyA9IF9fZnV0dXJlX18uYWxsX2ZlYXR1cmVfbmFtZXMKIAotIyBWZXJpZnkgdGhhdCBhbGxfZmVhdHVyZV9uYW1lcyBhcHBlYXJzIGNvcnJlY3QuCi1naXZlbl9mZWF0dXJlX25hbWVzID0gZmVhdHVyZXNbOl0KLWZvciBuYW1lIGluIGRpcihfX2Z1dHVyZV9fKToKLSAgICBvYmogPSBnZXRhdHRyKF9fZnV0dXJlX18sIG5hbWUsIE5vbmUpCi0gICAgaWYgb2JqIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9iaiwgX19mdXR1cmVfXy5fRmVhdHVyZSk6Ci0gICAgICAgIHZlcmlmeShuYW1lIGluIGdpdmVuX2ZlYXR1cmVfbmFtZXMsCi0gICAgICAgICAgICAgICAiJXIgc2hvdWxkIGhhdmUgYmVlbiBpbiBhbGxfZmVhdHVyZV9uYW1lcyIgJSBuYW1lKQotICAgICAgICBnaXZlbl9mZWF0dXJlX25hbWVzLnJlbW92ZShuYW1lKQotdmVyaWZ5KGxlbihnaXZlbl9mZWF0dXJlX25hbWVzKSA9PSAwLAotICAgICAgICJhbGxfZmVhdHVyZV9uYW1lcyBoYXMgdG9vIG11Y2g6ICVyIiAlIGdpdmVuX2ZlYXR1cmVfbmFtZXMpCi1kZWwgZ2l2ZW5fZmVhdHVyZV9uYW1lcworY2xhc3MgRnV0dXJlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLWZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgotICAgIHZhbHVlID0gZ2V0YXR0cihfX2Z1dHVyZV9fLCBmZWF0dXJlKQotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICJDaGVja2luZyBfX2Z1dHVyZV9fICIsIGZlYXR1cmUsICJ2YWx1ZSIsIHZhbHVlCisgICAgZGVmIHRlc3RfbmFtZXMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgYWxsX2ZlYXR1cmVfbmFtZXMgYXBwZWFycyBjb3JyZWN0LgorICAgICAgICBnaXZlbl9mZWF0dXJlX25hbWVzID0gZmVhdHVyZXNbOl0KKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKF9fZnV0dXJlX18pOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihfX2Z1dHVyZV9fLCBuYW1lLCBOb25lKQorICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9iaiwgX19mdXR1cmVfXy5fRmVhdHVyZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgICAgICAgICBuYW1lIGluIGdpdmVuX2ZlYXR1cmVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICIlciBzaG91bGQgaGF2ZSBiZWVuIGluIGFsbF9mZWF0dXJlX25hbWVzIiAlIG5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZ2l2ZW5fZmVhdHVyZV9uYW1lcy5yZW1vdmUobmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2l2ZW5fZmVhdHVyZV9uYW1lcyksIDAsCisgICAgICAgICAgICAgICAiYWxsX2ZlYXR1cmVfbmFtZXMgaGFzIHRvbyBtdWNoOiAlciIgJSBnaXZlbl9mZWF0dXJlX25hbWVzKQogCi0gICAgb3B0aW9uYWwgPSB2YWx1ZS5nZXRPcHRpb25hbFJlbGVhc2UoKQotICAgIG1hbmRhdG9yeSA9IHZhbHVlLmdldE1hbmRhdG9yeVJlbGVhc2UoKQorICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgorICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9fZnV0dXJlX18sIGZlYXR1cmUpCiAKLSAgICB2ZXJpZnkodHlwZShvcHRpb25hbCkgaXMgVHVwbGVUeXBlLCAib3B0aW9uYWwgaXNuJ3QgdHVwbGUiKQotICAgIHZlcmlmeShsZW4ob3B0aW9uYWwpID09IDUsICJvcHRpb25hbCBpc24ndCA1LXR1cGxlIikKLSAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsID0gb3B0aW9uYWwKLSAgICB2ZXJpZnkodHlwZShtYWpvcikgaXMgSW50VHlwZSwgIm9wdGlvbmFsIG1ham9yIGlzbid0IGludCIpCi0gICAgdmVyaWZ5KHR5cGUobWlub3IpIGlzIEludFR5cGUsICJvcHRpb25hbCBtaW5vciBpc24ndCBpbnQiKQotICAgIHZlcmlmeSh0eXBlKG1pY3JvKSBpcyBJbnRUeXBlLCAib3B0aW9uYWwgbWljcm8gaXNuJ3QgaW50IikKLSAgICB2ZXJpZnkoaXNpbnN0YW5jZShsZXZlbCwgYmFzZXN0cmluZyksICJvcHRpb25hbCBsZXZlbCBpc24ndCBzdHJpbmciKQotICAgIHZlcmlmeShsZXZlbCBpbiBHT09EX1NFUklBTFMsCi0gICAgICAgICAgICJvcHRpb25hbCBsZXZlbCBzdHJpbmcgaGFzIHVua25vd24gdmFsdWUiKQotICAgIHZlcmlmeSh0eXBlKHNlcmlhbCkgaXMgSW50VHlwZSwgIm9wdGlvbmFsIHNlcmlhbCBpc24ndCBpbnQiKQorICAgICAgICAgICAgb3B0aW9uYWwgPSB2YWx1ZS5nZXRPcHRpb25hbFJlbGVhc2UoKQorICAgICAgICAgICAgbWFuZGF0b3J5ID0gdmFsdWUuZ2V0TWFuZGF0b3J5UmVsZWFzZSgpCiAKLSAgICB2ZXJpZnkodHlwZShtYW5kYXRvcnkpIGlzIFR1cGxlVHlwZSBvcgotICAgICAgICAgICBtYW5kYXRvcnkgaXMgTm9uZSwgIm1hbmRhdG9yeSBpc24ndCB0dXBsZSBvciBOb25lIikKLSAgICBpZiBtYW5kYXRvcnkgaXMgbm90IE5vbmU6Ci0gICAgICAgIHZlcmlmeShsZW4obWFuZGF0b3J5KSA9PSA1LCAibWFuZGF0b3J5IGlzbid0IDUtdHVwbGUiKQotICAgICAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsID0gbWFuZGF0b3J5Ci0gICAgICAgIHZlcmlmeSh0eXBlKG1ham9yKSBpcyBJbnRUeXBlLCAibWFuZGF0b3J5IG1ham9yIGlzbid0IGludCIpCi0gICAgICAgIHZlcmlmeSh0eXBlKG1pbm9yKSBpcyBJbnRUeXBlLCAibWFuZGF0b3J5IG1pbm9yIGlzbid0IGludCIpCi0gICAgICAgIHZlcmlmeSh0eXBlKG1pY3JvKSBpcyBJbnRUeXBlLCAibWFuZGF0b3J5IG1pY3JvIGlzbid0IGludCIpCi0gICAgICAgIHZlcmlmeShpc2luc3RhbmNlKGxldmVsLCBiYXNlc3RyaW5nKSwgIm1hbmRhdG9yeSBsZXZlbCBpc24ndCBzdHJpbmciKQotICAgICAgICB2ZXJpZnkobGV2ZWwgaW4gR09PRF9TRVJJQUxTLAotICAgICAgICAgICAgICAgIm1hbmRhdG9yeSBzZXJpYWwgc3RyaW5nIGhhcyB1bmtub3duIHZhbHVlIikKLSAgICAgICAgdmVyaWZ5KHR5cGUoc2VyaWFsKSBpcyBJbnRUeXBlLCAibWFuZGF0b3J5IHNlcmlhbCBpc24ndCBpbnQiKQotICAgICAgICB2ZXJpZnkob3B0aW9uYWwgPCBtYW5kYXRvcnksCi0gICAgICAgICAgICAgICAib3B0aW9uYWwgbm90IGxlc3MgdGhhbiBtYW5kYXRvcnksIGFuZCBtYW5kYXRvcnkgbm90IE5vbmUiKQorICAgICAgICAgICAgYSA9IHNlbGYuYXNzZXJ0XworICAgICAgICAgICAgZSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgICAgIGRlZiBjaGVjayh0LCBuYW1lKToKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UodCwgdHVwbGUpLCAiJXMgaXNuJ3QgdHVwbGUiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBlKGxlbih0KSwgNSwgIiVzIGlzbid0IDUtdHVwbGUiICUgbmFtZSkKKyAgICAgICAgICAgICAgICAobWFqb3IsIG1pbm9yLCBtaWNybywgbGV2ZWwsIHNlcmlhbCkgPSB0CisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKG1ham9yLCBpbnQpLCAiJXMgbWFqb3IgaXNuJ3QgaW50IiAgJSBuYW1lKQorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZShtaW5vciwgaW50KSwgIiVzIG1pbm9yIGlzbid0IGludCIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZShtaWNybywgaW50KSwgIiVzIG1pY3JvIGlzbid0IGludCIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZShsZXZlbCwgYmFzZXN0cmluZyksCisgICAgICAgICAgICAgICAgICAgICIlcyBsZXZlbCBpc24ndCBzdHJpbmciICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGxldmVsIGluIEdPT0RfU0VSSUFMUywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzIGxldmVsIHN0cmluZyBoYXMgdW5rbm93biB2YWx1ZSIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZShzZXJpYWwsIGludCksICIlcyBzZXJpYWwgaXNuJ3QgaW50IiAlIG5hbWUpCiAKLSAgICB2ZXJpZnkoaGFzYXR0cih2YWx1ZSwgImNvbXBpbGVyX2ZsYWciKSwKLSAgICAgICAgICAgImZlYXR1cmUgaXMgbWlzc2luZyBhIC5jb21waWxlcl9mbGFnIGF0dHIiKQotICAgIHZlcmlmeSh0eXBlKGdldGF0dHIodmFsdWUsICJjb21waWxlcl9mbGFnIikpIGlzIEludFR5cGUsCi0gICAgICAgICAgICIuY29tcGlsZXJfZmxhZyBpc24ndCBpbnQiKQorICAgICAgICAgICAgY2hlY2sob3B0aW9uYWwsICJvcHRpb25hbCIpCisgICAgICAgICAgICBpZiBtYW5kYXRvcnkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY2hlY2sobWFuZGF0b3J5LCAibWFuZGF0b3J5IikKKyAgICAgICAgICAgICAgICBhKG9wdGlvbmFsIDwgbWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWwgbm90IGxlc3MgdGhhbiBtYW5kYXRvcnksIGFuZCBtYW5kYXRvcnkgbm90IE5vbmUiKQorCisgICAgICAgICAgICBhKGhhc2F0dHIodmFsdWUsICJjb21waWxlcl9mbGFnIiksCisgICAgICAgICAgICAgICAgICAgImZlYXR1cmUgaXMgbWlzc2luZyBhIC5jb21waWxlcl9mbGFnIGF0dHIiKQorICAgICAgICAgICAgYShpc2luc3RhbmNlKGdldGF0dHIodmFsdWUsICJjb21waWxlcl9mbGFnIiksIGludCksCisgICAgICAgICAgICAgICAgICAgIi5jb21waWxlcl9mbGFnIGlzbid0IGludCIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZ1dHVyZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CmluZGV4IDZhZGJmMzMuLjVjNzliNDggMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQpAQCAtODUsNiArODUsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKIAorICAgIGRlZiB0ZXN0X2RlZXBjb3B5KHNlbGYpOgorICAgICAgICBpbXBvcnQgY29weQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBiID0gY29weS5kZWVwY29weShhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgogICAgICAgICBmb3IgcHJvdG9jb2wgaW4gKDAsIDEsIDIpOgogICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CmluZGV4IDhkZjQ1MDQuLjgyNzJhZDkgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImJpbmFzY2lpLmEyYl9xcCgqKnsxOjF9KSBkaWRuJ3QgcmFpc2UgVHlwZUVycm9yIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfcXAoIj0gIiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl9xcCgiPSAiKSwgIj0gIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfcXAoIj09IiksICI9IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfcXAoIj1BWCIpLCAiPUFYIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiaW5hc2NpaS5iMmFfcXAsIGZvbz0iYmFyIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2J1ZmlvLnB5CmluZGV4IDYxMWNkNjkuLjE0YTkyNmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWZpby5weQpAQCAtMSw2MCArMSw2NiBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCBUZXN0RmFpbGVkLCBURVNURk4KK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogIyBTaW1wbGUgdGVzdCB0byBlbnN1cmUgdGhhdCBvcHRpbWl6YXRpb25zIGluIGZpbGVvYmplY3QuYyBkZWxpdmVyCiAjIHRoZSBleHBlY3RlZCByZXN1bHRzLiAgRm9yIGJlc3QgdGVzdGluZywgcnVuIHRoaXMgdW5kZXIgYSBkZWJ1Zy1idWlsZAogIyBQeXRob24gdG9vICh0byBleGVyY2lzZSBhc3NlcnRzIGluIHRoZSBDIGNvZGUpLgogCi0jIFJlcGVhdCBzdHJpbmcgJ3BhdHRlcm4nIGFzIG9mdGVuIGFzIG5lZWRlZCB0byByZWFjaCB0b3RhbCBsZW5ndGgKLSMgJ2xlbmd0aCcuICBUaGVuIGNhbGwgdHJ5X29uZSB3aXRoIHRoYXQgc3RyaW5nLCBhIHN0cmluZyBvbmUgbGFyZ2VyCi0jIHRoYW4gdGhhdCwgYW5kIGEgc3RyaW5nIG9uZSBzbWFsbGVyIHRoYW4gdGhhdC4gIFRoZSBtYWluIGRyaXZlcgotIyBmZWVkcyB0aGlzIGFsbCBzbWFsbCBzaXplcyBhbmQgdmFyaW91cyBwb3dlcnMgb2YgMiwgc28gd2UgZXhlcmNpc2UKLSMgYWxsIGxpa2VseSBzdGRpbyBidWZmZXIgc2l6ZXMsIGFuZCAib2ZmIGJ5IG9uZSIgZXJyb3JzIG9uIGJvdGgKLSMgc2lkZXMuCi1kZWYgZHJpdmVfb25lKHBhdHRlcm4sIGxlbmd0aCk6Ci0gICAgcSwgciA9IGRpdm1vZChsZW5ndGgsIGxlbihwYXR0ZXJuKSkKLSAgICB0ZXN0c3RyaW5nID0gcGF0dGVybiAqIHEgKyBwYXR0ZXJuWzpyXQotICAgIHZlcmlmeShsZW4odGVzdHN0cmluZykgPT0gbGVuZ3RoKQotICAgIHRyeV9vbmUodGVzdHN0cmluZykKLSAgICB0cnlfb25lKHRlc3RzdHJpbmcgKyAieCIpCi0gICAgdHJ5X29uZSh0ZXN0c3RyaW5nWzotMV0pCitsZW5ndGhzID0gcmFuZ2UoMSwgMjU3KSArIFs1MTIsIDEwMDAsIDEwMjQsIDIwNDgsIDQwOTYsIDgxOTIsIDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYzODQsIDMyNzY4LCA2NTUzNiwgMTAwMDAwMF0KIAotIyBXcml0ZSBzICsgIlxuIiArIHMgdG8gZmlsZSwgdGhlbiBvcGVuIGl0IGFuZCBlbnN1cmUgdGhhdCBzdWNjZXNzaXZlCi0jIC5yZWFkbGluZSgpcyBkZWxpdmVyIHdoYXQgd2Ugd3JvdGUuCi1kZWYgdHJ5X29uZShzKToKLSAgICAjIFNpbmNlIEMgZG9lc24ndCBndWFyYW50ZWUgd2UgY2FuIHdyaXRlL3JlYWQgYXJiaXRyYXJ5IGJ5dGVzIGluIHRleHQKLSAgICAjIGZpbGVzLCB1c2UgYmluYXJ5IG1vZGUuCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAid2IiKQotICAgICMgd3JpdGUgb25jZSB3aXRoIFxuIGFuZCBvbmNlIHdpdGhvdXQKLSAgICBmLndyaXRlKHMpCi0gICAgZi53cml0ZSgiXG4iKQotICAgIGYud3JpdGUocykKLSAgICBmLmNsb3NlKCkKLSAgICBmID0gb3BlbihURVNURk4sICJyYiIpCi0gICAgbGluZSA9IGYucmVhZGxpbmUoKQotICAgIGlmIGxpbmUgIT0gcyArICJcbiI6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIkV4cGVjdGVkICVyIGdvdCAlciIgJSAocyArICJcbiIsIGxpbmUpKQotICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKLSAgICBpZiBsaW5lICE9IHM6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIkV4cGVjdGVkICVyIGdvdCAlciIgJSAocywgbGluZSkpCi0gICAgbGluZSA9IGYucmVhZGxpbmUoKQotICAgIGlmIGxpbmU6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIkV4cGVjdGVkIEVPRiBidXQgZ290ICVyIiAlIGxpbmUpCi0gICAgZi5jbG9zZSgpCitjbGFzcyBCdWZmZXJTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRyeV9vbmUoc2VsZiwgcyk6CisgICAgICAgICMgV3JpdGUgcyArICJcbiIgKyBzIHRvIGZpbGUsIHRoZW4gb3BlbiBpdCBhbmQgZW5zdXJlIHRoYXQgc3VjY2Vzc2l2ZQorICAgICAgICAjIC5yZWFkbGluZSgpcyBkZWxpdmVyIHdoYXQgd2Ugd3JvdGUuCiAKLSMgQSBwYXR0ZXJuIHdpdGggcHJpbWUgbGVuZ3RoLCB0byBhdm9pZCBzaW1wbGUgcmVsYXRpb25zaGlwcyB3aXRoCi0jIHN0ZGlvIGJ1ZmZlciBzaXplcy4KLXByaW1lcGF0ID0gIjEyMzQ1Njc4OTBcMDBcMDFcMDJcMDNcMDRcMDVcMDYiCisgICAgICAgICMgU2luY2UgQyBkb2Vzbid0IGd1YXJhbnRlZSB3ZSBjYW4gd3JpdGUvcmVhZCBhcmJpdHJhcnkgYnl0ZXMgaW4gdGV4dAorICAgICAgICAjIGZpbGVzLCB1c2UgYmluYXJ5IG1vZGUuCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgd3JpdGUgb25jZSB3aXRoIFxuIGFuZCBvbmNlIHdpdGhvdXQKKyAgICAgICAgICAgIGYud3JpdGUocykKKyAgICAgICAgICAgIGYud3JpdGUoIlxuIikKKyAgICAgICAgICAgIGYud3JpdGUocykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgcyArICJcbiIpCisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHMpCisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGxpbmUpICMgTXVzdCBiZSBhdCBFT0YKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKIAotbnVsbHBhdCA9ICJcMCIgKiAxMDAwCisgICAgZGVmIGRyaXZlX29uZShzZWxmLCBwYXR0ZXJuKToKKyAgICAgICAgZm9yIGxlbmd0aCBpbiBsZW5ndGhzOgorICAgICAgICAgICAgIyBSZXBlYXQgc3RyaW5nICdwYXR0ZXJuJyBhcyBvZnRlbiBhcyBuZWVkZWQgdG8gcmVhY2ggdG90YWwgbGVuZ3RoCisgICAgICAgICAgICAjICdsZW5ndGgnLiAgVGhlbiBjYWxsIHRyeV9vbmUgd2l0aCB0aGF0IHN0cmluZywgYSBzdHJpbmcgb25lIGxhcmdlcgorICAgICAgICAgICAgIyB0aGFuIHRoYXQsIGFuZCBhIHN0cmluZyBvbmUgc21hbGxlciB0aGFuIHRoYXQuICBUcnkgdGhpcyB3aXRoIGFsbAorICAgICAgICAgICAgIyBzbWFsbCBzaXplcyBhbmQgdmFyaW91cyBwb3dlcnMgb2YgMiwgc28gd2UgZXhlcmNpc2UgYWxsIGxpa2VseQorICAgICAgICAgICAgIyBzdGRpbyBidWZmZXIgc2l6ZXMsIGFuZCAib2ZmIGJ5IG9uZSIgZXJyb3JzIG9uIGJvdGggc2lkZXMuCisgICAgICAgICAgICBxLCByID0gZGl2bW9kKGxlbmd0aCwgbGVuKHBhdHRlcm4pKQorICAgICAgICAgICAgdGVzdHN0cmluZyA9IHBhdHRlcm4gKiBxICsgcGF0dGVybls6cl0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RzdHJpbmcpLCBsZW5ndGgpCisgICAgICAgICAgICBzZWxmLnRyeV9vbmUodGVzdHN0cmluZykKKyAgICAgICAgICAgIHNlbGYudHJ5X29uZSh0ZXN0c3RyaW5nICsgIngiKQorICAgICAgICAgICAgc2VsZi50cnlfb25lKHRlc3RzdHJpbmdbOi0xXSkKIAotdHJ5OgotICAgIGZvciBzaXplIGluIHJhbmdlKDEsIDI1NykgKyBbNTEyLCAxMDAwLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLCAxMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAxNjM4NCwgMzI3NjgsIDY1NTM2LCAxMDAwMDAwXToKLSAgICAgICAgZHJpdmVfb25lKHByaW1lcGF0LCBzaXplKQotICAgICAgICBkcml2ZV9vbmUobnVsbHBhdCwgc2l6ZSkKLWZpbmFsbHk6Ci0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgb3MKLSAgICAgICAgb3MudW5saW5rKFRFU1RGTikKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKKyAgICBkZWYgdGVzdF9wcmltZXBhdChzZWxmKToKKyAgICAgICAgIyBBIHBhdHRlcm4gd2l0aCBwcmltZSBsZW5ndGgsIHRvIGF2b2lkIHNpbXBsZSByZWxhdGlvbnNoaXBzIHdpdGgKKyAgICAgICAgIyBzdGRpbyBidWZmZXIgc2l6ZXMuCisgICAgICAgIHNlbGYuZHJpdmVfb25lKCIxMjM0NTY3ODkwXDAwXDAxXDAyXDAzXDA0XDA1XDA2IikKKworICAgIGRlZiB0ZXN0X251bGxwYXQoc2VsZik6CisgICAgICAgIHNlbGYuZHJpdmVfb25lKCJcMCIgKiAxMDAwKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCdWZmZXJTaXplVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IDdiMjQ1ZDEuLjM4NTAzMWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTExNiw2ICsxMTYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygwKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMTIzNCksIDEyMzQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKC0xMjM0KSwgMTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicygtc3lzLm1heGludC0xKSA+IDApCiAgICAgICAgICMgZmxvYXQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMC4wKSwgMC4wKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygzLjE0KSwgMy4xNCkKQEAgLTE1NSw2ICsxNTYsMTEgQEAKICAgICAgICAgUyA9IFsxMCwgMjAsIDMwXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueSh4ID4gNDIgZm9yIHggaW4gUyksIEZhbHNlKQogCisgICAgZGVmIHRlc3RfbmVnKHNlbGYpOgorICAgICAgICB4ID0gLXN5cy5tYXhpbnQtMQorICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC14LCBzeXMubWF4aW50KzEpCisKICAgICBkZWYgdGVzdF9jYWxsYWJsZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRfKGNhbGxhYmxlKGxlbikpCiAgICAgICAgIGRlZiBmKCk6IHBhc3MKQEAgLTY4Niw5ICs2OTIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKIAogICAgICAgICBzID0gcmVwcigtMS1zeXMubWF4aW50KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChzKSsxLCAtc3lzLm1heGludCkKKyAgICAgICAgeCA9IGludChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgrMSwgLXN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHgsIGludCkpCiAgICAgICAgICMgc2hvdWxkIHJldHVybiBsb25nCi0gICAgICAgIGludChzWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoc1sxOl0pLCBzeXMubWF4aW50KzEpCiAKICAgICAgICAgIyBzaG91bGQgcmV0dXJuIGxvbmcKICAgICAgICAgeCA9IGludCgxZTEwMCkKQEAgLTcwNiw2ICs3MTQsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTIzXDAnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICc1MycsIDQwKQogCisgICAgICAgICMgU0YgYnVnIDE1NDU0OTc6IGVtYmVkZGVkIE5VTHMgd2VyZSBub3QgZGV0ZWN0ZWQgd2l0aAorICAgICAgICAjIGV4cGxpY2l0IGJhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTIzXDAnLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTIzXHgwMCAyNDUnLCAyMCkKKwogICAgICAgICB4ID0gaW50KCcxJyAqIDYwMCkKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgbG9uZykpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9jZmdwYXJzZXIucHkKaW5kZXggNjZmZWNmMS4uMzk3OWYxNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jZmdwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jZmdwYXJzZXIucHkKQEAgLTEsOSArMSwyOSBAQAogaW1wb3J0IENvbmZpZ1BhcnNlcgogaW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBVc2VyRGljdAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCitjbGFzcyBTb3J0ZWREaWN0KFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuZGF0YS5pdGVtcygpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuZGF0YS5rZXlzKCkKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pdGVtcygpCisgICAgICAgIHJldHVybiBbaVsxXSBmb3IgaSBpbiB2YWx1ZXNdCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOiByZXR1cm4gaXRlcihzZWxmLml0ZW1zKCkpCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOiByZXR1cm4gaXRlcihzZWxmLmtleXMoKSkKKyAgICBfX2l0ZXJfXyA9IGl0ZXJrZXlzCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6IHJldHVybiBpdGVyKHNlbGYudmFsdWVzKCkpCiAKIGNsYXNzIFRlc3RDYXNlQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIG5ld2NvbmZpZyhzZWxmLCBkZWZhdWx0cz1Ob25lKToKQEAgLTQxNCwxMiArNDM0LDM2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24yIiwgMS4wKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMiIsIG9iamVjdCgpKQogCitjbGFzcyBTb3J0ZWRUZXN0Q2FzZShSYXdDb25maWdQYXJzZXJUZXN0Q2FzZSk6CisgICAgZGVmIG5ld2NvbmZpZyhzZWxmLCBkZWZhdWx0cz1Ob25lKToKKyAgICAgICAgc2VsZi5jZiA9IHNlbGYuY29uZmlnX2NsYXNzKGRlZmF1bHRzPWRlZmF1bHRzLCBkaWN0X3R5cGU9U29ydGVkRGljdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY2YKKworICAgIGRlZiB0ZXN0X3NvcnRlZChzZWxmKToKKyAgICAgICAgc2VsZi5mcm9tc3RyaW5nKCJbYl1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvND0xXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAibzM9MlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm8yPTNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvMT00XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiW2FdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiaz12XG4iKSAgICAgICAgCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5jZi53cml0ZShvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiW2FdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJrID0gdlxuXG4iICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAiW2JdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvMSA9IDRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm8yID0gM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibzMgPSAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvNCA9IDFcblxuIikKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgIENvbmZpZ1BhcnNlclRlc3RDYXNlLAogICAgICAgICBSYXdDb25maWdQYXJzZXJUZXN0Q2FzZSwKLSAgICAgICAgU2FmZUNvbmZpZ1BhcnNlclRlc3RDYXNlCisgICAgICAgIFNhZmVDb25maWdQYXJzZXJUZXN0Q2FzZSwKKyAgICAgICAgU29ydGVkVGVzdENhc2UKICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NnaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CmluZGV4IGY5M2ZhNTUuLjUyZTVlOTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CkBAIC0xLDggKzEsOSBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJib3NlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIGltcG9ydCBjZ2kKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKIGNsYXNzIEhhY2tlZFN5c01vZHVsZToKQEAgLTEyNywxMTkgKzEyOCwxMjQgQEAKIGRlZiBmaXJzdF9zZWNvbmRfZWx0cyhsaXN0KToKICAgICByZXR1cm4gbWFwKGxhbWJkYSBwOihwWzBdLCBwWzFdWzBdKSwgbGlzdCkKIAotZGVmIG1haW4oKToKLSAgICBmb3Igb3JpZywgZXhwZWN0IGluIHBhcnNlX3FzbF90ZXN0X2Nhc2VzOgotICAgICAgICByZXN1bHQgPSBjZ2kucGFyc2VfcXNsKG9yaWcsIGtlZXBfYmxhbmtfdmFsdWVzPVRydWUpCi0gICAgICAgIHByaW50IHJlcHIob3JpZyksICc9PicsIHJlc3VsdAotICAgICAgICB2ZXJpZnkocmVzdWx0ID09IGV4cGVjdCwgIkVycm9yIHBhcnNpbmcgJXMiICUgcmVwcihvcmlnKSkKK2NsYXNzIENnaVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIGZvciBvcmlnLCBleHBlY3QgaW4gcGFyc2Vfc3RyaWN0X3Rlc3RfY2FzZXM6Ci0gICAgICAgICMgVGVzdCBiYXNpYyBwYXJzaW5nCi0gICAgICAgIHByaW50IHJlcHIob3JpZykKLSAgICAgICAgZCA9IGRvX3Rlc3Qob3JpZywgIkdFVCIpCi0gICAgICAgIHZlcmlmeShkID09IGV4cGVjdCwgIkVycm9yIHBhcnNpbmcgJXMiICUgcmVwcihvcmlnKSkKLSAgICAgICAgZCA9IGRvX3Rlc3Qob3JpZywgIlBPU1QiKQotICAgICAgICB2ZXJpZnkoZCA9PSBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCisgICAgZGVmIHRlc3RfcXNsKHNlbGYpOgorICAgICAgICBmb3Igb3JpZywgZXhwZWN0IGluIHBhcnNlX3FzbF90ZXN0X2Nhc2VzOgorICAgICAgICAgICAgcmVzdWx0ID0gY2dpLnBhcnNlX3FzbChvcmlnLCBrZWVwX2JsYW5rX3ZhbHVlcz1UcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdCwgIkVycm9yIHBhcnNpbmcgJXMiICUgcmVwcihvcmlnKSkKIAotICAgICAgICBlbnYgPSB7J1FVRVJZX1NUUklORyc6IG9yaWd9Ci0gICAgICAgIGZjZCA9IGNnaS5Gb3JtQ29udGVudERpY3QoZW52KQotICAgICAgICBzZCA9IGNnaS5TdkZvcm1Db250ZW50RGljdChlbnYpCi0gICAgICAgIGZzID0gY2dpLkZpZWxkU3RvcmFnZShlbnZpcm9uPWVudikKLSAgICAgICAgaWYgdHlwZShleHBlY3QpID09IHR5cGUoe30pOgotICAgICAgICAgICAgIyB0ZXN0IGRpY3QgaW50ZXJmYWNlCi0gICAgICAgICAgICB2ZXJpZnkobGVuKGV4cGVjdCkgPT0gbGVuKGZjZCkpCi0gICAgICAgICAgICB2ZXJpZnkobm9ybShleHBlY3Qua2V5cygpKSA9PSBub3JtKGZjZC5rZXlzKCkpKQotICAgICAgICAgICAgdmVyaWZ5KG5vcm0oZXhwZWN0LnZhbHVlcygpKSA9PSBub3JtKGZjZC52YWx1ZXMoKSkpCi0gICAgICAgICAgICB2ZXJpZnkobm9ybShleHBlY3QuaXRlbXMoKSkgPT0gbm9ybShmY2QuaXRlbXMoKSkpCi0gICAgICAgICAgICB2ZXJpZnkoZmNkLmdldCgibm9uZXhpc3RlbnQgZmllbGQiLCAiZGVmYXVsdCIpID09ICJkZWZhdWx0IikKLSAgICAgICAgICAgIHZlcmlmeShsZW4oc2QpID09IGxlbihmcykpCi0gICAgICAgICAgICB2ZXJpZnkobm9ybShzZC5rZXlzKCkpID09IG5vcm0oZnMua2V5cygpKSkKLSAgICAgICAgICAgIHZlcmlmeShmcy5nZXR2YWx1ZSgibm9uZXhpc3RlbnQgZmllbGQiLCAiZGVmYXVsdCIpID09ICJkZWZhdWx0IikKLSAgICAgICAgICAgICMgdGVzdCBpbmRpdmlkdWFsIGZpZWxkcwotICAgICAgICAgICAgZm9yIGtleSBpbiBleHBlY3Qua2V5cygpOgotICAgICAgICAgICAgICAgIGV4cGVjdF92YWwgPSBleHBlY3Rba2V5XQotICAgICAgICAgICAgICAgIHZlcmlmeShrZXkgaW4gZmNkKQotICAgICAgICAgICAgICAgIHZlcmlmeShub3JtKGZjZFtrZXldKSA9PSBub3JtKGV4cGVjdFtrZXldKSkKLSAgICAgICAgICAgICAgICB2ZXJpZnkoZmNkLmdldChrZXksICJkZWZhdWx0IikgPT0gZmNkW2tleV0pCi0gICAgICAgICAgICAgICAgdmVyaWZ5KGtleSBpbiBmcykKLSAgICAgICAgICAgICAgICBpZiBsZW4oZXhwZWN0X3ZhbCkgPiAxOgotICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdmFsdWUgPSAwCisgICAgZGVmIHRlc3Rfc3RyaWN0KHNlbGYpOgorICAgICAgICBmb3Igb3JpZywgZXhwZWN0IGluIHBhcnNlX3N0cmljdF90ZXN0X2Nhc2VzOgorICAgICAgICAgICAgIyBUZXN0IGJhc2ljIHBhcnNpbmcKKyAgICAgICAgICAgIGQgPSBkb190ZXN0KG9yaWcsICJHRVQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCisgICAgICAgICAgICBkID0gZG9fdGVzdChvcmlnLCAiUE9TVCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV4cGVjdCwgIkVycm9yIHBhcnNpbmcgJXMiICUgcmVwcihvcmlnKSkKKworICAgICAgICAgICAgZW52ID0geydRVUVSWV9TVFJJTkcnOiBvcmlnfQorICAgICAgICAgICAgZmNkID0gY2dpLkZvcm1Db250ZW50RGljdChlbnYpCisgICAgICAgICAgICBzZCA9IGNnaS5TdkZvcm1Db250ZW50RGljdChlbnYpCisgICAgICAgICAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZW52aXJvbj1lbnYpCisgICAgICAgICAgICBpZiB0eXBlKGV4cGVjdCkgPT0gdHlwZSh7fSk6CisgICAgICAgICAgICAgICAgIyB0ZXN0IGRpY3QgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXhwZWN0KSwgbGVuKGZjZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKGV4cGVjdC5rZXlzKCkpLCBub3JtKGZjZC5rZXlzKCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShleHBlY3QudmFsdWVzKCkpLCBub3JtKGZjZC52YWx1ZXMoKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKGV4cGVjdC5pdGVtcygpKSwgbm9ybShmY2QuaXRlbXMoKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmY2QuZ2V0KCJub25leGlzdGVudCBmaWVsZCIsICJkZWZhdWx0IiksICJkZWZhdWx0IikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZCksIGxlbihmcykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKHNkLmtleXMoKSksIG5vcm0oZnMua2V5cygpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzLmdldHZhbHVlKCJub25leGlzdGVudCBmaWVsZCIsICJkZWZhdWx0IiksICJkZWZhdWx0IikKKyAgICAgICAgICAgICAgICAjIHRlc3QgaW5kaXZpZHVhbCBmaWVsZHMKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGV4cGVjdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdF92YWwgPSBleHBlY3Rba2V5XQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGZjZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKGZjZFtrZXldKSwgbm9ybShleHBlY3Rba2V5XSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmNkLmdldChrZXksICJkZWZhdWx0IiksIGZjZFtrZXldKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGZzKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZXhwZWN0X3ZhbCkgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3ZhbHVlID0gMAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3ZhbHVlID0gMQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZFtrZXldCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoc2luZ2xlX3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZShrZXkpLCBleHBlY3RfdmFsKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBleHBlY3RfdmFsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZShrZXkpLCBleHBlY3RfdmFsWzBdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm0oc2QuZ2V0bGlzdChrZXkpKSwgbm9ybShleHBlY3RfdmFsKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2luZ2xlX3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKHNkLnZhbHVlcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9lbHRzKG5vcm0oZXhwZWN0LnZhbHVlcygpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm0oc2QuaXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc2Vjb25kX2VsdHMobm9ybShleHBlY3QuaXRlbXMoKSkpKQorCisgICAgZGVmIHRlc3Rfd2VpcmRfZm9ybWNvbnRlbnRkaWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIHdlaXJkIEZvcm1Db250ZW50RGljdCBjbGFzc2VzCisgICAgICAgIGVudiA9IHsnUVVFUllfU1RSSU5HJzogIng9MSZ5PTIuMCZ6PTItMy4lMmIwJjE9MWFiYyJ9CisgICAgICAgIGV4cGVjdCA9IHsneCc6IDEsICd5JzogMi4wLCAneic6ICcyLTMuKzAnLCAnMSc6ICcxYWJjJ30KKyAgICAgICAgZCA9IGNnaS5JbnRlcnBGb3JtQ29udGVudERpY3QoZW52KQorICAgICAgICBmb3IgaywgdiBpbiBleHBlY3QuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtrXSwgdikKKyAgICAgICAgZm9yIGssIHYgaW4gZC5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3Rba10sIHYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShleHBlY3QudmFsdWVzKCkpLCBub3JtKGQudmFsdWVzKCkpKQorCisgICAgZGVmIHRlc3RfbG9nKHNlbGYpOgorICAgICAgICBjZ2kubG9nKCJUZXN0aW5nIikKKworICAgICAgICBjZ2kubG9nZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGluaXRsb2cgMSIpCisgICAgICAgIGNnaS5sb2coIiVzIiwgIlRlc3RpbmcgbG9nIDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNnaS5sb2dmcC5nZXR2YWx1ZSgpLCAiVGVzdGluZyBpbml0bG9nIDFcblRlc3RpbmcgbG9nIDJcbiIpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCIvZGV2L251bGwiKToKKyAgICAgICAgICAgIGNnaS5sb2dmcCA9IE5vbmUKKyAgICAgICAgICAgIGNnaS5sb2dmaWxlID0gIi9kZXYvbnVsbCIKKyAgICAgICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGxvZyAzIikKKyAgICAgICAgICAgIGNnaS5sb2coIlRlc3RpbmcgbG9nIDQiKQorCisgICAgZGVmIHRlc3RfZmllbGRzdG9yYWdlX3JlYWRsaW5lKHNlbGYpOgorICAgICAgICAjIEZpZWxkU3RvcmFnZSB1c2VzIHJlYWRsaW5lLCB3aGljaCBoYXMgdGhlIGNhcGFjaXR5IHRvIHJlYWQgYWxsCisgICAgICAgICMgY29udGVudHMgb2YgdGhlIGlucHV0IGZpbGUgaW50byBtZW1vcnk7IHdlIHVzZSByZWFkbGluZSdzIHNpemUgYXJndW1lbnQKKyAgICAgICAgIyB0byBwcmV2ZW50IHRoYXQgZm9yIGZpbGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gYW55IG5ld2xpbmVzIGluCisgICAgICAgICMgbm9uLUdFVC9IRUFEIHJlcXVlc3RzCisgICAgICAgIGNsYXNzIFRlc3RSZWFkbGluZUZpbGU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICAgICAgICAgIHNlbGYubnVtY2FsbHMgPSAwCisKKyAgICAgICAgICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYubnVtY2FsbHMgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGUucmVhZGxpbmUoc2l6ZSkKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdmFsdWUgPSAxCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZFtrZXldCi0gICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHZlcmlmeShub3Qgc2luZ2xlX3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICB2ZXJpZnkoZnMuZ2V0dmFsdWUoa2V5KSA9PSBleHBlY3RfdmFsKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHZlcmlmeShzaW5nbGVfdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHZlcmlmeSh2YWwgPT0gZXhwZWN0X3ZhbFswXSkKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5KGZzLmdldHZhbHVlKGtleSkgPT0gZXhwZWN0X3ZhbFswXSkKLSAgICAgICAgICAgICAgICB2ZXJpZnkobm9ybShzZC5nZXRsaXN0KGtleSkpID09IG5vcm0oZXhwZWN0X3ZhbCkpCi0gICAgICAgICAgICAgICAgaWYgc2luZ2xlX3ZhbHVlOgotICAgICAgICAgICAgICAgICAgICB2ZXJpZnkobm9ybShzZC52YWx1ZXMoKSkgPT0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZWx0cyhub3JtKGV4cGVjdC52YWx1ZXMoKSkpKQotICAgICAgICAgICAgICAgICAgICB2ZXJpZnkobm9ybShzZC5pdGVtcygpKSA9PSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zZWNvbmRfZWx0cyhub3JtKGV4cGVjdC5pdGVtcygpKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGUucmVhZGxpbmUoKQogCi0gICAgIyBUZXN0IHRoZSB3ZWlyZCBGb3JtQ29udGVudERpY3QgY2xhc3NlcwotICAgIGVudiA9IHsnUVVFUllfU1RSSU5HJzogIng9MSZ5PTIuMCZ6PTItMy4lMmIwJjE9MWFiYyJ9Ci0gICAgZXhwZWN0ID0geyd4JzogMSwgJ3knOiAyLjAsICd6JzogJzItMy4rMCcsICcxJzogJzFhYmMnfQotICAgIGQgPSBjZ2kuSW50ZXJwRm9ybUNvbnRlbnREaWN0KGVudikKLSAgICBmb3IgaywgdiBpbiBleHBlY3QuaXRlbXMoKToKLSAgICAgICAgdmVyaWZ5KGRba10gPT0gdikKLSAgICBmb3IgaywgdiBpbiBkLml0ZW1zKCk6Ci0gICAgICAgIHZlcmlmeShleHBlY3Rba10gPT0gdikKLSAgICB2ZXJpZnkobm9ybShleHBlY3QudmFsdWVzKCkpID09IG5vcm0oZC52YWx1ZXMoKSkpCisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgZmlsZSA9IHNlbGYuX19kaWN0X19bJ2ZpbGUnXQorICAgICAgICAgICAgICAgIGEgPSBnZXRhdHRyKGZpbGUsIG5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYSwgaW50KToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBhKQorICAgICAgICAgICAgICAgIHJldHVybiBhCiAKLSAgICBwcmludCAiVGVzdGluZyBsb2ciCi0gICAgY2dpLmxvZygiVGVzdGluZyIpCi0gICAgY2dpLmxvZ2ZwID0gc3lzLnN0ZG91dAotICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGluaXRsb2cgMSIpCi0gICAgY2dpLmxvZygiJXMiLCAiVGVzdGluZyBsb2cgMiIpCi0gICAgaWYgb3MucGF0aC5leGlzdHMoIi9kZXYvbnVsbCIpOgotICAgICAgICBjZ2kubG9nZnAgPSBOb25lCi0gICAgICAgIGNnaS5sb2dmaWxlID0gIi9kZXYvbnVsbCIKLSAgICAgICAgY2dpLmluaXRsb2coIiVzIiwgIlRlc3RpbmcgbG9nIDMiKQotICAgICAgICBjZ2kubG9nKCJUZXN0aW5nIGxvZyA0IikKKyAgICAgICAgZiA9IFRlc3RSZWFkbGluZUZpbGUodGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpKQorICAgICAgICBmLndyaXRlKCd4JyAqIDI1NiAqIDEwMjQpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBlbnYgPSB7J1JFUVVFU1RfTUVUSE9EJzonUFVUJ30KKyAgICAgICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGZwPWYsIGVudmlyb249ZW52KQorICAgICAgICAjIGlmIHdlJ3JlIG5vdCBjaHVua2luZyBwcm9wZXJseSwgcmVhZGxpbmUgaXMgb25seSBjYWxsZWQgdHdpY2UKKyAgICAgICAgIyAoYnkgcmVhZF9iaW5hcnkpOyBpZiB3ZSBhcmUgY2h1bmtpbmcgcHJvcGVybHksIGl0IHdpbGwgYmUgY2FsbGVkIDUgdGltZXMKKyAgICAgICAgIyBhcyBsb25nIGFzIHRoZSBjaHVua3NpemUgaXMgMSA8PCAxNi4KKyAgICAgICAgc2VsZi5hc3NlcnRfKGYubnVtY2FsbHMgPiAyKQogCi0gICAgcHJpbnQgIlRlc3QgRmllbGRTdG9yYWdlIG1ldGhvZHMgdGhhdCB1c2UgcmVhZGxpbmUiCi0gICAgIyBGaWVsZFN0b3JhZ2UgdXNlcyByZWFkbGluZSwgd2hpY2ggaGFzIHRoZSBjYXBhY2l0eSB0byByZWFkIGFsbAotICAgICMgY29udGVudHMgb2YgdGhlIGlucHV0IGZpbGUgaW50byBtZW1vcnk7IHdlIHVzZSByZWFkbGluZSdzIHNpemUgYXJndW1lbnQKLSAgICAjIHRvIHByZXZlbnQgdGhhdCBmb3IgZmlsZXMgdGhhdCBkbyBub3QgY29udGFpbiBhbnkgbmV3bGluZXMgaW4KLSAgICAjIG5vbi1HRVQvSEVBRCByZXF1ZXN0cwotICAgIGNsYXNzIFRlc3RSZWFkbGluZUZpbGU6Ci0gICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlKToKLSAgICAgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKLSAgICAgICAgICAgIHNlbGYubnVtY2FsbHMgPSAwCi0KLSAgICAgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6Ci0gICAgICAgICAgICBzZWxmLm51bWNhbGxzICs9IDEKLSAgICAgICAgICAgIGlmIHNpemU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkbGluZShzaXplKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKCkKLQotICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Ci0gICAgICAgICAgICBmaWxlID0gc2VsZi5fX2RpY3RfX1snZmlsZSddCi0gICAgICAgICAgICBhID0gZ2V0YXR0cihmaWxlLCBuYW1lKQotICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYSwgaW50KToKLSAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGEpCi0gICAgICAgICAgICByZXR1cm4gYQotCi0gICAgZiA9IFRlc3RSZWFkbGluZUZpbGUodGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpKQotICAgIGYud3JpdGUoJ3gnICogMjU2ICogMTAyNCkKLSAgICBmLnNlZWsoMCkKLSAgICBlbnYgPSB7J1JFUVVFU1RfTUVUSE9EJzonUFVUJ30KLSAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZnA9ZiwgZW52aXJvbj1lbnYpCi0gICAgIyBpZiB3ZSdyZSBub3QgY2h1bmtpbmcgcHJvcGVybHksIHJlYWRsaW5lIGlzIG9ubHkgY2FsbGVkIHR3aWNlCi0gICAgIyAoYnkgcmVhZF9iaW5hcnkpOyBpZiB3ZSBhcmUgY2h1bmtpbmcgcHJvcGVybHksIGl0IHdpbGwgYmUgY2FsbGVkIDUgdGltZXMKLSAgICAjIGFzIGxvbmcgYXMgdGhlIGNodW5rc2l6ZSBpcyAxIDw8IDE2LgotICAgIHZlcmlmeShmLm51bWNhbGxzID4gMikKLQotICAgIHByaW50ICJUZXN0IGJhc2ljIEZpZWxkU3RvcmFnZSBtdWx0aXBhcnQgcGFyc2luZyIKLSAgICBlbnYgPSB7J1JFUVVFU1RfTUVUSE9EJzonUE9TVCcsICdDT05URU5UX1RZUEUnOidtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQnLCAnQ09OVEVOVF9MRU5HVEgnOic1NTgnfQotICAgIHBvc3RkYXRhID0gIiIiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQKKyAgICBkZWYgdGVzdF9maWVsZHN0b3JhZ2VfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICAjVGVzdCBiYXNpYyBGaWVsZFN0b3JhZ2UgbXVsdGlwYXJ0IHBhcnNpbmcKKyAgICAgICAgZW52ID0geydSRVFVRVNUX01FVEhPRCc6J1BPU1QnLCAnQ09OVEVOVF9UWVBFJzonbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0JywgJ0NPTlRFTlRfTEVOR1RIJzonNTU4J30KKyAgICAgICAgcG9zdGRhdGEgPSAiIiItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NAogQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJpZCIKIAogMTIzNApAQCAtMjU5LDE1ICsyNjUsMTkgQEAKICBBZGRceDIwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NC0tCiAiIiIKLSAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZnA9U3RyaW5nSU8ocG9zdGRhdGEpLCBlbnZpcm9uPWVudikKLSAgICB2ZXJpZnkobGVuKGZzLmxpc3QpID09IDQpCi0gICAgZXhwZWN0ID0gW3snbmFtZSc6J2lkJywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicxMjM0J30sCi0gICAgICAgICAgICAgIHsnbmFtZSc6J3RpdGxlJywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicnfSwKLSAgICAgICAgICAgICAgeyduYW1lJzonZmlsZScsICdmaWxlbmFtZSc6J3Rlc3QudHh0JywndmFsdWUnOidUZXN0aW5nIDEyMy5cbid9LAotICAgICAgICAgICAgICB7J25hbWUnOidzdWJtaXQnLCAnZmlsZW5hbWUnOk5vbmUsICd2YWx1ZSc6JyBBZGQgJ31dCi0gICAgZm9yIHggaW4gcmFuZ2UobGVuKGZzLmxpc3QpKToKLSAgICAgICAgZm9yIGssIGV4cCBpbiBleHBlY3RbeF0uaXRlbXMoKToKLSAgICAgICAgICAgIGdvdCA9IGdldGF0dHIoZnMubGlzdFt4XSwgaykKLSAgICAgICAgICAgIHZlcmlmeShnb3QgPT0gZXhwKQorICAgICAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZnA9U3RyaW5nSU8ocG9zdGRhdGEpLCBlbnZpcm9uPWVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGZzLmxpc3QpLCA0KQorICAgICAgICBleHBlY3QgPSBbeyduYW1lJzonaWQnLCAnZmlsZW5hbWUnOk5vbmUsICd2YWx1ZSc6JzEyMzQnfSwKKyAgICAgICAgICAgICAgICAgIHsnbmFtZSc6J3RpdGxlJywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicnfSwKKyAgICAgICAgICAgICAgICAgIHsnbmFtZSc6J2ZpbGUnLCAnZmlsZW5hbWUnOid0ZXN0LnR4dCcsJ3ZhbHVlJzonVGVzdGluZyAxMjMuXG4nfSwKKyAgICAgICAgICAgICAgICAgIHsnbmFtZSc6J3N1Ym1pdCcsICdmaWxlbmFtZSc6Tm9uZSwgJ3ZhbHVlJzonIEFkZCAnfV0KKyAgICAgICAgZm9yIHggaW4gcmFuZ2UobGVuKGZzLmxpc3QpKToKKyAgICAgICAgICAgIGZvciBrLCBleHAgaW4gZXhwZWN0W3hdLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZ290ID0gZ2V0YXR0cihmcy5saXN0W3hdLCBrKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGdvdCwgZXhwKQogCi1tYWluKCkKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ2dpVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkgYi9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CmluZGV4IGYzMzQ2MmEuLjMyMDFkZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQpAQCAtMTg2LDYgKzE4NiwxNCBAQAogCiAjIExpc3QvZGljdCBvcGVyYXRpb25zCiAKK2NsYXNzIEVtcHR5OiBwYXNzCisKK3RyeToKKyAgICAxIGluIEVtcHR5KCkKKyAgICBwcmludCAnZmFpbGVkLCBzaG91bGQgaGF2ZSByYWlzZWQgVHlwZUVycm9yJworZXhjZXB0IFR5cGVFcnJvcjoKKyAgICBwYXNzCisKIDEgaW4gdGVzdG1lCiAKIHRlc3RtZVsxXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKaW5kZXggMWJmODU4My4uYzU1OGYxYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CkBAIC0zMiw2ICszMiw3IEBACiAgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhXHVmZmZkIiksCiAgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTgwNGEiKSwKICAgICAgICAgKCJceDgzXHgzNFx4ODNceDMxIiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAodSJcdTMwZmIiLCAic3RyaWN0IiwgTm9uZSksCiAgICAgKQogCiBjbGFzcyBUZXN0X0dCMTgwMzAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC00NSw2ICs0Niw3IEBACiAgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhXHVmZmZkIiksCiAgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTgwNGEiKSwKICAgICAgICAgKCJhYmNceDg0XHgzOVx4ODRceDM5XHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhIiksCisgICAgICAgICh1Ilx1MzBmYiIsICJzdHJpY3QiLCAiXHg4MTlceGE3OSIpLAogICAgICkKICAgICBoYXNfaXNvMTA2NDYgPSBUcnVlCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggODE1Mzk3OS4uM2M4MDBmOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTQyNSw2ICs0MjUsMTAgQEAKICAgICAgICAgICAgIF0KICAgICAgICAgKQogCisgICAgZGVmIHRlc3RfYnVnMTYwMTUwMShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzE2MDE1MDE6IGNoZWNrIHRoYXQgdGhlIGNvZGVjIHdvcmtzIHdpdGggYSBidWZmZXIKKyAgICAgICAgdW5pY29kZSgiXHhlZlx4YmJceGJmIiwgInV0Zi04LXNpZyIpCisKIGNsYXNzIEVzY2FwZURlY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb2RlY3MuZXNjYXBlX2RlY29kZSgiIiksICgiIiwgMCkpCkBAIC05MTAsNiArOTE0LDE4IEBACiAgICAgICAgIGYgPSBzZWxmLnJlYWRlcihzZWxmLnN0cmVhbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5yZWFkbGluZXMoKSwgW3UnXHVkNTVjXG4nLCB1J1x1YWUwMCddKQogCitjbGFzcyBFbmNvZGVkRmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygnXHhlZFx4OTVceDljXG5ceGVhXHhiOFx4ODAnKQorICAgICAgICBlZiA9IGNvZGVjcy5FbmNvZGVkRmlsZShmLCAndXRmLTE2LWxlJywgJ3V0Zi04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZWYucmVhZCgpLCAnXFxceGQ1XG5ceDAwXHgwMFx4YWUnKQorCisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGVmID0gY29kZWNzLkVuY29kZWRGaWxlKGYsICd1dGYtOCcsICdsYXRpbjEnKQorICAgICAgICBlZi53cml0ZSgnXHhjM1x4YmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLmdldHZhbHVlKCksICdceGZjJykKKwogY2xhc3MgU3RyMlN0clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKQEAgLTEwNTAsNiArMTA2NiwxNCBAQAogICAgICJwdW55Y29kZSIsCiAgICAgInVuaWNvZGVfaW50ZXJuYWwiCiBdCiticm9rZW5faW5jcmVtZW50YWxfY29kZXJzID0gYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zWzpdCisKKyMgVGhlIGZvbGxvd2luZyBlbmNvZGluZ3Mgb25seSBzdXBwb3J0ICJzdHJpY3QiIG1vZGUKK29ubHlfc3RyaWN0X21vZGUgPSBbCisgICAgImlkbmEiLAorICAgICJ6bGliX2NvZGVjIiwKKyAgICAiYnoyX2NvZGVjIiwKK10KIAogdHJ5OgogICAgIGltcG9ydCBiejIKQEAgLTEwOTksNiArMTEyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gcmVhZGVyLnJlYWQoKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKIAorICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIGJyb2tlbl9pbmNyZW1lbnRhbF9jb2RlcnM6CiAgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgKGZldGNoZWQgdmlhIHRoZSBQeXRob24KICAgICAgICAgICAgICAgICAjIGFuZCBDIEFQSSkgYW5kIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKICAgICAgICAgICAgICAgICB0cnk6CkBAIC0xMTM5LDYgKzExNjQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdSIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoY29kZWNzLml0ZXJlbmNvZGUodSIiLCBlbmNvZGluZyksIGVuY29kaW5nKSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHUiIikKIAorICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiBvbmx5X3N0cmljdF9tb2RlOgorICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGluY3JlbWVudGFsIGRlY29kZXIvZW5jb2RlciB3aXRoIGVycm9ycyBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBjZW5jb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcsICJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6ICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIuam9pbihlbmNvZGVyLmVuY29kZShjKSBmb3IgYyBpbiBzKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpKCJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIi5qb2luKGRlY29kZXIuZGVjb2RlKGMpIGZvciBjIGluIGVuY29kZWRyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIi5qb2luKGNlbmNvZGVyLmVuY29kZShjKSBmb3IgYyBpbiBzKQorICAgICAgICAgICAgICAgICAgICAgICAgY2RlY29kZXIgPSBfdGVzdGNhcGkuY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nLCAiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIuam9pbihjZGVjb2Rlci5kZWNvZGUoYykgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKwogICAgIGRlZiB0ZXN0X3NlZWsoc2VsZik6CiAgICAgICAgICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKICAgICAgICAgcyA9IHUiJXNcbiVzXG4iICUgKDEwMCp1ImFiYzEyMyIsIDEwMCp1ImRlZjQ1NiIpCkBAIC0xMjE0LDYgKzEyNTcsMTkgQEAKICAgICAgICAgICAgICh1IiIsIGxlbihhbGxieXRlcykpCiAgICAgICAgICkKIAorY2xhc3MgV2l0aFN0bXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGVkZmlsZShzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJceGMzXHhiYyIpCisgICAgICAgIHdpdGggY29kZWNzLkVuY29kZWRGaWxlKGYsICJsYXRpbi0xIiwgInV0Zi04IikgYXMgZWY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlZi5yZWFkKCksICJceGZjIikKKworICAgIGRlZiB0ZXN0X3N0cmVhbXJlYWRlcndyaXRlcihzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJceGMzXHhiYyIpCisgICAgICAgIGluZm8gPSBjb2RlY3MubG9va3VwKCJ1dGYtOCIpCisgICAgICAgIHdpdGggY29kZWNzLlN0cmVhbVJlYWRlcldyaXRlcihmLCBpbmZvLnN0cmVhbXJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyZWFtd3JpdGVyLCAnc3RyaWN0JykgYXMgc3J3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3J3LnJlYWQoKSwgdSJceGZjIikKKwogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKQEAgLTEyMzQsMTAgKzEyOTAsMTIgQEAKICAgICAgICAgSUROQUNvZGVjVGVzdCwKICAgICAgICAgQ29kZWNzTW9kdWxlVGVzdCwKICAgICAgICAgU3RyZWFtUmVhZGVyVGVzdCwKKyAgICAgICAgRW5jb2RlZEZpbGVUZXN0LAogICAgICAgICBTdHIyU3RyVGVzdCwKICAgICAgICAgQmFzaWNVbmljb2RlVGVzdCwKICAgICAgICAgQmFzaWNTdHJUZXN0LAotICAgICAgICBDaGFybWFwVGVzdAorICAgICAgICBDaGFybWFwVGVzdCwKKyAgICAgICAgV2l0aFN0bXRUZXN0LAogICAgICkKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weSBiL0xpYi90ZXN0L3Rlc3RfY29tcGxleF9hcmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDUwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQpAQCAtMCwwICsxLDkxIEBACisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgQ29tcGxleEFyZ3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2soc2VsZiwgZnVuYywgZXhwZWN0ZWQsICphcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCphcmdzKSwgZXhwZWN0ZWQpCisKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGVzdGVkIGJlbG93IGFzIGxhbWJkYXMgdG9vLiAgSWYgeW91IGFkZCBhIGZ1bmN0aW9uIHRlc3QsCisgICAgIyBhbHNvIGFkZCBhIHNpbWlsYXIgbGFtYmRhIHRlc3QuCisKKyAgICBkZWYgdGVzdF9mdW5jX3BhcmVuc19ub191bnBhY2tpbmcoc2VsZik6CisgICAgICAgIGRlZiBmKCgoKCh4KSkpKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMSwgMSkKKyAgICAgICAgIyBJbm5lciBwYXJlbnMgYXJlIGVsaWRlZCwgc2FtZSBhczogZih4LCkKKyAgICAgICAgZGVmIGYoKCh4KSksKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAyLCAyKQorCisgICAgZGVmIHRlc3RfZnVuY18xKHNlbGYpOgorICAgICAgICBkZWYgZigoKCgoeCksKSkpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAzLCAoMywpKQorICAgICAgICBkZWYgZigoKCgoeCkpLCkpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA0LCAoNCwpKQorICAgICAgICBkZWYgZigoKCgoeCkpKSwpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA1LCAoNSwpKQorICAgICAgICBkZWYgZigoKHgpLCkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDYsICg2LCkpCisKKyAgICBkZWYgdGVzdF9mdW5jXzIoc2VsZik6CisgICAgICAgIGRlZiBmKCgoKCh4KSksKSwpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAyLCAoKDIsKSwpKQorCisgICAgZGVmIHRlc3RfZnVuY18zKHNlbGYpOgorICAgICAgICBkZWYgZigoKCgoKHgpKSwpLCksKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKCgoMywpLCksKSkKKworICAgIGRlZiB0ZXN0X2Z1bmNfY29tcGxleChzZWxmKToKKyAgICAgICAgZGVmIGYoKCgoKCh4KSksKSwpLCksIGEsIGIsIGMpOiByZXR1cm4geCwgYSwgYiwgYworICAgICAgICBzZWxmLmNoZWNrKGYsICgzLCA5LCA4LCA3KSwgKCgoMywpLCksKSwgOSwgOCwgNykKKworICAgICAgICBkZWYgZigoKCgoKCh4KSksKSksKSwpLCBhLCBiLCBjKTogcmV0dXJuIHgsIGEsIGIsIGMKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZGVmIGYoYSwgYiwgYywgKCgoKCgoeCkpLCkpLCksKSk6IHJldHVybiBhLCBiLCBjLCB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgKDksIDgsIDcsIDMpLCA5LCA4LCA3LCAoKCgzLCksKSwpKQorCisgICAgIyBEdXBsaWNhdGUgdGhlIHRlc3RzIGFib3ZlLCBidXQgZm9yIGxhbWJkYS4gIElmIHlvdSBhZGQgYSBsYW1iZGEgdGVzdCwKKyAgICAjIGFsc28gYWRkIGEgc2ltaWxhciBmdW5jdGlvbiB0ZXN0IGFib3ZlLgorCisgICAgZGVmIHRlc3RfbGFtYmRhX3BhcmVuc19ub191bnBhY2tpbmcoc2VsZik6CisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSkpKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAxLCAxKQorICAgICAgICAjIElubmVyIHBhcmVucyBhcmUgZWxpZGVkLCBzYW1lIGFzOiBmKHgsKQorICAgICAgICBmID0gbGFtYmRhICgoeCkpLDogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDIsIDIpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfMShzZWxmKToKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpLCkpKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAzLCAoMywpKQorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpLCkpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDQsICg0LCkpCisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSkpLCkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNSwgKDUsKSkKKyAgICAgICAgZiA9IGxhbWJkYSAoKCh4KSwpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDYsICg2LCkpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfMihzZWxmKToKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSwpLCkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgKCgyLCksKSkKKworICAgIGRlZiB0ZXN0X2xhbWJkYV8zKHNlbGYpOgorICAgICAgICBmID0gbGFtYmRhICgoKCgoKHgpKSwpLCksKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAzLCAoKCgzLCksKSwpKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX2NvbXBsZXgoc2VsZik6CisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSksKSwpLCksIGEsIGIsIGM6ICh4LCBhLCBiLCBjKQorICAgICAgICBzZWxmLmNoZWNrKGYsICgzLCA5LCA4LCA3KSwgKCgoMywpLCksKSwgOSwgOCwgNykKKworICAgICAgICBmID0gbGFtYmRhICgoKCgoKHgpKSwpKSwpLCksIGEsIGIsIGM6ICh4LCBhLCBiLCBjKQorICAgICAgICBzZWxmLmNoZWNrKGYsICgzLCA5LCA4LCA3KSwgKCgoMywpLCksKSwgOSwgOCwgNykKKworICAgICAgICBmID0gbGFtYmRhIGEsIGIsIGMsICgoKCgoKHgpKSwpKSwpLCk6IChhLCBiLCBjLCB4KQorICAgICAgICBzZWxmLmNoZWNrKGYsICg5LCA4LCA3LCAzKSwgOSwgOCwgNywgKCgoMywpLCksKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb21wbGV4QXJnc1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKaW5kZXggMmNmMzlhZS4uNzQ3Nzg1ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtMzMwLDMyICszMzAsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIHNlbGYuYm9pbGVyUGxhdGUobG9jaywgbG9ja2VkKQogCi1jbGFzcyBEZWNpbWFsQ29udGV4dFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgICMgWFhYIFNvbWVib2R5IHNob3VsZCB3cml0ZSBtb3JlIHRob3JvdWdoIHRlc3RzIGZvciB0aGlzCi0KLSAgICBkZWYgdGVzdEJhc2ljKHNlbGYpOgotICAgICAgICBjdHggPSBkZWNpbWFsLmdldGNvbnRleHQoKQotICAgICAgICBvcmlnX2NvbnRleHQgPSBjdHguY29weSgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGN0eC5wcmVjID0gc2F2ZV9wcmVjID0gZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYyArIDUKLSAgICAgICAgICAgIHdpdGggZGVjaW1hbC5FeHRlbmRlZENvbnRleHQuZ2V0X21hbmFnZXIoKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLCBzYXZlX3ByZWMpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgd2l0aCBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5nZXRfbWFuYWdlcigpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKLSAgICAgICAgICAgICAgICAgICAgMS8wCi0gICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLCBzYXZlX3ByZWMpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGRlY2ltYWwuc2V0Y29udGV4dChvcmlnX2NvbnRleHQpCi0KLQogIyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSB0ZXN0IGFjdHVhbGx5IHJ1biB1bmRlciByZWdydGVzdC5weSEKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fc3VpdGUoCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weSBiL0xpYi90ZXN0L3Rlc3RfY29va2llLnB5CmluZGV4IGMyMGJlZWUuLmU3YzBjZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29va2llLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29va2llLnB5CkBAIC0xLDYgKzEsNyBAQAogIyBTaW1wbGUgdGVzdCBzdWl0ZSBmb3IgQ29va2llLnB5CiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyYm9zZSwgcnVuX2RvY3Rlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IENvb2tpZQogCiBpbXBvcnQgd2FybmluZ3MKQEAgLTgsNDMgKzksNzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICIuKiBjbGFzcyBpcyBpbnNlY3VyZS4qIiwKICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKIAotIyBDdXJyZW50bHkgdGhpcyBvbmx5IHRlc3RzIFNpbXBsZUNvb2tpZQorY2xhc3MgQ29va2llVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgQ3VycmVudGx5IHRoaXMgb25seSB0ZXN0cyBTaW1wbGVDb29raWUKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgY2FzZXMgPSBbCisgICAgICAgICAgICB7ICdkYXRhJzogJ2NoaXBzPWFob3k7IHZpZW5uYT1maW5nZXInLAorICAgICAgICAgICAgICAnZGljdCc6IHsnY2hpcHMnOidhaG95JywgJ3ZpZW5uYSc6J2Zpbmdlcid9LAorICAgICAgICAgICAgICAncmVwcic6ICI8U2ltcGxlQ29va2llOiBjaGlwcz0nYWhveScgdmllbm5hPSdmaW5nZXInPiIsCisgICAgICAgICAgICAgICdvdXRwdXQnOiAnU2V0LUNvb2tpZTogY2hpcHM9YWhveVxuU2V0LUNvb2tpZTogdmllbm5hPWZpbmdlcicsCisgICAgICAgICAgICB9LAogCi1jYXNlcyA9IFsKLSAgICAoJ2NoaXBzPWFob3k7IHZpZW5uYT1maW5nZXInLCB7J2NoaXBzJzonYWhveScsICd2aWVubmEnOidmaW5nZXInfSksCi0gICAgKCdrZWVibGVyPSJFPW1jMjsgTD1cXCJMb3Zlc1xcIjsgZnVkZ2U9XFwwMTI7IicsCi0gICAgIHsna2VlYmxlcicgOiAnRT1tYzI7IEw9IkxvdmVzIjsgZnVkZ2U9XDAxMjsnfSksCisgICAgICAgICAgICB7ICdkYXRhJzogJ2tlZWJsZXI9IkU9bWMyOyBMPVxcIkxvdmVzXFwiOyBmdWRnZT1cXDAxMjsiJywKKyAgICAgICAgICAgICAgJ2RpY3QnOiB7J2tlZWJsZXInIDogJ0U9bWMyOyBMPSJMb3ZlcyI7IGZ1ZGdlPVwwMTI7J30sCisgICAgICAgICAgICAgICdyZXByJzogJycnPFNpbXBsZUNvb2tpZToga2VlYmxlcj0nRT1tYzI7IEw9IkxvdmVzIjsgZnVkZ2U9XFxuOyc+JycnLAorICAgICAgICAgICAgICAnb3V0cHV0JzogJ1NldC1Db29raWU6IGtlZWJsZXI9IkU9bWMyOyBMPVxcIkxvdmVzXFwiOyBmdWRnZT1cXDAxMjsiJywKKyAgICAgICAgICAgIH0sCiAKLSAgICAjIENoZWNrIGlsbGVnYWwgY29va2llcyB0aGF0IGhhdmUgYW4gJz0nIGNoYXIgaW4gYW4gdW5xdW90ZWQgdmFsdWUKLSAgICAoJ2tlZWJsZXI9RT1tYzInLCB7J2tlZWJsZXInIDogJ0U9bWMyJ30pCi0gICAgXQorICAgICAgICAgICAgIyBDaGVjayBpbGxlZ2FsIGNvb2tpZXMgdGhhdCBoYXZlIGFuICc9JyBjaGFyIGluIGFuIHVucXVvdGVkIHZhbHVlCisgICAgICAgICAgICB7ICdkYXRhJzogJ2tlZWJsZXI9RT1tYzInLAorICAgICAgICAgICAgICAnZGljdCc6IHsna2VlYmxlcicgOiAnRT1tYzInfSwKKyAgICAgICAgICAgICAgJ3JlcHInOiAiPFNpbXBsZUNvb2tpZToga2VlYmxlcj0nRT1tYzInPiIsCisgICAgICAgICAgICAgICdvdXRwdXQnOiAnU2V0LUNvb2tpZToga2VlYmxlcj1FPW1jMicsCisgICAgICAgICAgICB9CisgICAgICAgIF0KIAotZm9yIGRhdGEsIGRpY3QgaW4gY2FzZXM6Ci0gICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKSA7IEMubG9hZChkYXRhKQotICAgIHByaW50IHJlcHIoQykKLSAgICBwcmludCBDLm91dHB1dChzZXA9J1xuJykKLSAgICBmb3IgaywgdiBpbiBzb3J0ZWQoZGljdC5pdGVyaXRlbXMoKSk6Ci0gICAgICAgIHByaW50ICcgJywgaywgcmVwciggQ1trXS52YWx1ZSApLCByZXByKHYpCi0gICAgICAgIHZlcmlmeShDW2tdLnZhbHVlID09IHYpCi0gICAgICAgIHByaW50IENba10KKyAgICAgICAgZm9yIGNhc2UgaW4gY2FzZXM6CisgICAgICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgICAgICBDLmxvYWQoY2FzZVsnZGF0YSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKEMpLCBjYXNlWydyZXByJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMub3V0cHV0KHNlcD0nXG4nKSwgY2FzZVsnb3V0cHV0J10pCisgICAgICAgICAgICBmb3IgaywgdiBpbiBzb3J0ZWQoY2FzZVsnZGljdCddLml0ZXJpdGVtcygpKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENba10udmFsdWUsIHYpCiAKLUMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKLUMubG9hZCgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPTE7IFBhdGg9L2FjbWUnKQorICAgIGRlZiB0ZXN0X2xvYWQoc2VsZik6CisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249MTsgUGF0aD0vYWNtZScpCiAKLXZlcmlmeShDWydDdXN0b21lciddLnZhbHVlID09ICdXSUxFX0VfQ09ZT1RFJykKLXZlcmlmeShDWydDdXN0b21lciddWyd2ZXJzaW9uJ10gPT0gJzEnKQotdmVyaWZ5KENbJ0N1c3RvbWVyJ11bJ3BhdGgnXSA9PSAnL2FjbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ10udmFsdWUsICdXSUxFX0VfQ09ZT1RFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWyd2ZXJzaW9uJ10sICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWydwYXRoJ10sICcvYWNtZScpCiAKLXByaW50IEMub3V0cHV0KFsncGF0aCddKQotcHJpbnQgQy5qc19vdXRwdXQoKQotcHJpbnQgQy5qc19vdXRwdXQoWydwYXRoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5vdXRwdXQoWydwYXRoJ10pLAorICAgICAgICAgICAgJ1NldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgUGF0aD0vYWNtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5qc19vdXRwdXQoKSwgIiIiCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgPCEtLSBiZWdpbiBoaWRpbmcKKyAgICAgICAgZG9jdW1lbnQuY29va2llID0gIkN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgUGF0aD0vYWNtZTsgVmVyc2lvbj0xIjsKKyAgICAgICAgLy8gZW5kIGhpZGluZyAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmpzX291dHB1dChbJ3BhdGgnXSksICIiIgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwhLS0gYmVnaW4gaGlkaW5nCisgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICJDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFBhdGg9L2FjbWUiOworICAgICAgICAvLyBlbmQgaGlkaW5nIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgIiIiKQogCi0jIFRyeSBjb29raWUgd2l0aCBxdW90ZWQgbWV0YS1kYXRhCi1DID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCi1DLmxvYWQoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCi12ZXJpZnkoQ1snQ3VzdG9tZXInXS52YWx1ZSA9PSAnV0lMRV9FX0NPWU9URScpCi12ZXJpZnkoQ1snQ3VzdG9tZXInXVsndmVyc2lvbiddID09ICcxJykKLXZlcmlmeShDWydDdXN0b21lciddWydwYXRoJ10gPT0gJy9hY21lJykKKyAgICBkZWYgdGVzdF9xdW90ZWRfbWV0YShzZWxmKToKKyAgICAgICAgIyBUcnkgY29va2llIHdpdGggcXVvdGVkIG1ldGEtZGF0YQorICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgIEMubG9hZCgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddLnZhbHVlLCAnV0lMRV9FX0NPWU9URScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsndmVyc2lvbiddLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsncGF0aCddLCAnL2FjbWUnKQogCi1wcmludCAiSWYgYW55dGhpbmcgYmxvd3MgdXAgYWZ0ZXIgdGhpcyBsaW5lLCBpdCdzIGZyb20gQ29va2llJ3MgZG9jdGVzdC4iCi1ydW5fZG9jdGVzdChDb29raWUpCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KENvb2tpZVRlc3RzKQorICAgIHJ1bl9kb2N0ZXN0KENvb2tpZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKaW5kZXggNzY1YmRhZi4uMzMyOTEwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC04NTIsNiArODUyLDcgQEAKICAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwNSwgMywgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCJtOiVtIGQ6JWQgeToleSIpLCAibTowMyBkOjAyIHk6MDUiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoIiIpLCAiIikgIyBTRiBidWcgIzc2MTMzNworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoJ3gnKjEwMDApLCAneCcqMTAwMCkgIyBTRiBidWcgIzE1NTY3ODQKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUpICMgbmVlZHMgYW4gYXJnCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5zdHJmdGltZSwgIm9uZSIsICJ0d28iKSAjIHRvbyBtYW55IGFyZ3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCA1NWE1M2QzLi41MGRmOTNkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0yMyw2ICsyMyw3IEBACiB5b3UncmUgd29ya2luZyB0aHJvdWdoIElETEUsIHlvdSBjYW4gaW1wb3J0IHRoaXMgdGVzdCBtb2R1bGUgYW5kIGNhbGwgdGVzdF9tYWluKCkKIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuCiAiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgZ2xvYgpAQCAtMTA1Nyw2ICsxMDU4LDMyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYy5mbGFncyksIGlkKGQuZmxhZ3MpKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMudHJhcHMpLCBpZChkLnRyYXBzKSkKIAorY2xhc3MgV2l0aFN0YXRlbWVudFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgQ2FuJ3QgZG8gdGhlc2UgYXMgZG9jc3RyaW5ncyB1bnRpbCBQeXRob24gMi42CisgICAgIyBhcyBkb2N0ZXN0IGNhbid0IGhhbmRsZSBfX2Z1dHVyZV9fIHN0YXRlbWVudHMKKworICAgIGRlZiB0ZXN0X2xvY2FsY29udGV4dChzZWxmKToKKyAgICAgICAgIyBVc2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGNvbnRleHQgaW4gdGhlIGJsb2NrCisgICAgICAgIG9yaWdfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KCkgYXMgZW50ZXJfY3R4OgorICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhvcmlnX2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKworICAgIGRlZiB0ZXN0X2xvY2FsY29udGV4dGFyZyhzZWxmKToKKyAgICAgICAgIyBVc2UgYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBjb250ZXh0IGluIHRoZSBibG9jaworICAgICAgICBvcmlnX2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBuZXdfY3R4ID0gQ29udGV4dChwcmVjPTQyKQorICAgICAgICB3aXRoIGxvY2FsY29udGV4dChuZXdfY3R4KSBhcyBlbnRlcl9jdHg6CisgICAgICAgICAgICBzZXRfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIGZpbmFsX2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBzZWxmLmFzc2VydF8ob3JpZ19jdHggaXMgZmluYWxfY3R4LCAnZGlkIG5vdCByZXN0b3JlIGNvbnRleHQgY29ycmVjdGx5JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldF9jdHgucHJlYyA9PSBuZXdfY3R4LnByZWMsICdkaWQgbm90IHNldCBjb3JyZWN0IGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydF8obmV3X2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKwogZGVmIHRlc3RfbWFpbihhcml0aD1GYWxzZSwgdmVyYm9zZT1Ob25lKToKICAgICAiIiIgRXhlY3V0ZSB0aGUgdGVzdHMuCiAKQEAgLTEwNzcsNiArMTEwNCw3IEBACiAgICAgICAgIERlY2ltYWxQeXRob25BUEl0ZXN0cywKICAgICAgICAgQ29udGV4dEFQSXRlc3RzLAogICAgICAgICBEZWNpbWFsVGVzdCwKKyAgICAgICAgV2l0aFN0YXRlbWVudFRlc3QsCiAgICAgXQogCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggZDNhZTQ1NS4uMjk2OGUzZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC0yMDE3LDYgKzIwMTcsMTMgQEAKIAogICAgIHZlcmlzKFN1Yi50ZXN0KCksIEJhc2UuYVByb3ApCiAKKyAgICAjIFZlcmlmeSB0aGF0IHN1cGVyKCkgZG9lc24ndCBhbGxvdyBrZXl3b3JkIGFyZ3MKKyAgICB0cnk6CisgICAgICAgIHN1cGVyKEJhc2UsIGt3PTEpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICJzdXBlciBzaG91bGRuJ3QgYWNjZXB0IGtleXdvcmQgYXJncyIKIAogZGVmIGluaGVyaXRzKCk6CiAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlRlc3RpbmcgaW5oZXJpdGFuY2UgZnJvbSBiYXNpYyB0eXBlcy4uLiIKQEAgLTM1MDEsNiArMzUwOCwxMyBAQAogICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAic2hvdWxkbid0IGJlIGFibGUgdG8gYXNzaWduIHRvIGxpc3QuX19iYXNlc19fIgogCiAgICAgdHJ5OgorICAgICAgICBELl9fYmFzZXNfXyA9IChDMiwgbGlzdCkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgYXNzZXJ0IDAsICJiZXN0X2Jhc2UgY2FsY3VsYXRpb24gZm91bmQgd2FudGluZyIKKworICAgIHRyeToKICAgICAgICAgZGVsIEQuX19iYXNlc19fCiAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CmluZGV4IDcxN2VkNWUuLmZmNmNjZGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKQEAgLTQzOSw2ICs0MzksMTYgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbF8oImdbNDJdIGRpZG4ndCByYWlzZSBLZXlFcnJvciIpCiAKKyAgICBkZWYgdGVzdF90dXBsZV9rZXllcnJvcihzZWxmKToKKyAgICAgICAgIyBTRiAjMTU3NjY1NworICAgICAgICBkID0ge30KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZFsoMSwpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJncywgKCgxLCksKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibWlzc2luZyBLZXlFcnJvciIpCisKIAogZnJvbSB0ZXN0IGltcG9ydCBtYXBwaW5nX3Rlc3RzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQppbmRleCBiNWM1Njc2Li5hYmNlNDFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CkBAIC0xOTYsMTcgKzE5NiwyMSBAQAogICAgICAgICAgICAgdGVzdF9jYXBpMigpCiAgICAgICAgICAgICB0ZXN0X2NhcGkzKCkKIAorICAgIGRlZiB0ZXN0X1dpbmRvd3NFcnJvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgV2luZG93c0Vycm9yCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDAxIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cihXaW5kb3dzRXJyb3IoMTAwMSwgIm1lc3NhZ2UiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW0Vycm9yIDEwMDFdIG1lc3NhZ2UiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikuZXJybm8sIDIyKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikud2luZXJyb3IsIDEwMDEpCisKICAgICBkZWYgdGVzdEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICMgdGVzdCB0aGF0IGV4Y2VwdGlvbiBhdHRyaWJ1dGVzIGFyZSBoYXBweQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzdHIodSdIZWxsbyBcdTAwRTEnKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgotICAgICAgICAgICAgc2FtcGxlVW5pY29kZUVuY29kZUVycm9yID0gZQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHVuaWNvZGUoJ1x4ZmYnKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgotICAgICAgICAgICAgc2FtcGxlVW5pY29kZURlY29kZUVycm9yID0gZQogCiAgICAgICAgIGV4Y2VwdGlvbkxpc3QgPSBbCiAgICAgICAgICAgICAoQmFzZUV4Y2VwdGlvbiwgKCksIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCl9KSwKQEAgLTIxOCwxMSArMjIyLDE2IEBACiAgICAgICAgICAgICAoU3lzdGVtRXhpdCwgKCdmb28nLCksCiAgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKSwgJ2NvZGUnIDogJ2Zvbyd9KSwKICAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsKSwKLSAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJ2ZvbycsICdhcmdzJyA6ICgnZm9vJywpfSksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKSwgJ2ZpbGVuYW1lJyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiBOb25lLCAnc3RyZXJyb3InIDogTm9uZX0pLAogICAgICAgICAgICAgKElPRXJyb3IsICgnZm9vJywgJ2JhcicpLAotICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAnYmFyJyl9KSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpLCAnZmlsZW5hbWUnIDogTm9uZSwKKyAgICAgICAgICAgICAgICAgJ2Vycm5vJyA6ICdmb28nLCAnc3RyZXJyb3InIDogJ2Jhcid9KSwKICAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsICdiYXInLCAnYmF6JyksCi0gICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInKX0pLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAnYmFyJyksICdmaWxlbmFtZScgOiAnYmF6JywKKyAgICAgICAgICAgICAgICAgJ2Vycm5vJyA6ICdmb28nLCAnc3RyZXJyb3InIDogJ2Jhcid9KSwKKyAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsICdiYXInLCAnYmF6JywgJ3F1dXgnKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicsICdiYXonLCAncXV1eCcpfSksCiAgICAgICAgICAgICAoRW52aXJvbm1lbnRFcnJvciwgKCdlcnJub1N0cicsICdzdHJFcnJvclN0cicsICdmaWxlbmFtZVN0cicpLAogICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdlcnJub1N0cicsICdzdHJFcnJvclN0cicpLAogICAgICAgICAgICAgICAgICAnc3RyZXJyb3InIDogJ3N0ckVycm9yU3RyJywgJ2Vycm5vJyA6ICdlcnJub1N0cicsCkBAIC0yNDksMTYgKzI1OCwxNiBAQAogICAgICAgICAgICAgICAgICAncHJpbnRfZmlsZV9hbmRfbGluZScgOiBOb25lLCAnbXNnJyA6ICdtc2dTdHInLAogICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogTm9uZSwgJ2xpbmVubycgOiBOb25lLCAnb2Zmc2V0JyA6IE5vbmV9KSwKICAgICAgICAgICAgIChVbmljb2RlRXJyb3IsICgpLCB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgpLH0pLAotICAgICAgICAgICAgKHNhbXBsZVVuaWNvZGVFbmNvZGVFcnJvciwKLSAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnYXNjaWknLCB1J0hlbGxvIFx4ZTEnLCA2LCA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpJyksCi0gICAgICAgICAgICAgICAgICdlbmNvZGluZycgOiAnYXNjaWknLCAnb2JqZWN0JyA6IHUnSGVsbG8gXHhlMScsCi0gICAgICAgICAgICAgICAgICdzdGFydCcgOiA2LCAncmVhc29uJyA6ICdvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpJ30pLAotICAgICAgICAgICAgKHNhbXBsZVVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIChVbmljb2RlRW5jb2RlRXJyb3IsICgnYXNjaWknLCB1J2EnLCAwLCAxLCAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnYXNjaWknLCB1J2EnLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZScpLAorICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnIDogJ2FzY2lpJywgJ29iamVjdCcgOiB1J2EnLAorICAgICAgICAgICAgICAgICAnc3RhcnQnIDogMCwgJ3JlYXNvbicgOiAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnfSksCisgICAgICAgICAgICAoVW5pY29kZURlY29kZUVycm9yLCAoJ2FzY2lpJywgJ1x4ZmYnLCAwLCAxLCAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKICAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnYXNjaWknLCAnXHhmZicsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGluYWwgbm90IGluIHJhbmdlKDEyOCknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogJ1x4ZmYnLAotICAgICAgICAgICAgICAgICAnc3RhcnQnIDogMCwgJ3JlYXNvbicgOiAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSd9KSwKKyAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlJ30pLAogICAgICAgICAgICAgKFVuaWNvZGVUcmFuc2xhdGVFcnJvciwgKHUiXHUzMDQyIiwgMCwgMSwgIm91Y2giKSwKICAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICh1J1x1MzA0MicsIDAsIDEsICdvdWNoJyksCiAgICAgICAgICAgICAgICAgICdvYmplY3QnIDogdSdcdTMwNDInLCAncmVhc29uJyA6ICdvdWNoJywKQEAgLTI3NCwxOCArMjgzLDE0IEBACiAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKLSAgICAgICAgZm9yIGFyZ3MgaW4gZXhjZXB0aW9uTGlzdDoKLSAgICAgICAgICAgIGV4cGVjdGVkID0gYXJnc1stMV0KKyAgICAgICAgZm9yIGV4YywgYXJncywgZXhwZWN0ZWQgaW4gZXhjZXB0aW9uTGlzdDoKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBleGMgPSBhcmdzWzBdCi0gICAgICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4YwotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4YygqYXJnc1sxXSkKKyAgICAgICAgICAgICAgICByYWlzZSBleGMoKmFyZ3MpCiAgICAgICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgICAgICBpZiAoZSBpcyBub3QgZXhjIGFuZCAgICAgIyBuZWVkZWQgZm9yIHNhbXBsZVVuaWNvZGUgZXJyb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlKGUpIGlzIG5vdCBleGMpOgorICAgICAgICAgICAgICAgIGlmIHR5cGUoZSkgaXMgbm90IGV4YzoKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAjIFZlcmlmeSBtb2R1bGUgbmFtZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHR5cGUoZSkuX19tb2R1bGVfXywgJ2V4Y2VwdGlvbnMnKQogICAgICAgICAgICAgICAgICMgVmVyaWZ5IG5vIHJlZiBsZWFrcyBpbiBFeGNfc3RyKCkKICAgICAgICAgICAgICAgICBzID0gc3RyKGUpCiAgICAgICAgICAgICAgICAgZm9yIGNoZWNrQXJnTmFtZSBpbiBleHBlY3RlZDoKQEAgLTMzMiw2ICszMzcsMTUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBnKQogCisgICAgZGVmIHRlc3RVbmljb2RlU3RyVXNhZ2Uoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGJvdGggaW5zdGFuY2VzIGFuZCBjbGFzc2VzIGhhdmUgYSBzdHIgYW5kIHVuaWNvZGUKKyAgICAgICAgIyByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cihFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModW5pY29kZShFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyKEV4Y2VwdGlvbignYScpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHVuaWNvZGUoRXhjZXB0aW9uKHUnYScpKSkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KEV4Y2VwdGlvblRlc3RzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5IGIvTGliL3Rlc3QvdGVzdF9mY250bC5weQppbmRleCA1OGE1N2I1Li4yZDgwMGIyIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKQEAgLTI1LDcgKzI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywgJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywKICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JywKICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0JywKLSAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QnLCAnb3BlbmJzZDInLCAnb3BlbmJzZDMnKToKKyAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QnLCAnb3BlbmJzZDInLCAnb3BlbmJzZDMnLCAnb3BlbmJzZDQnKToKICAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSA9PSA4OgogICAgICAgICBvZmZfdCA9ICdsJwogICAgICAgICBwaWRfdCA9ICdpJwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQppbmRleCBhOWIzMTcwLi44YmY1ZDZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQpAQCAtMjE5LDggKzIxOSw4IEBACiAgICAgdGVzdF9leGModW5pY29kZSgnYWJjICVcdTMwMDAnLCdyYXctdW5pY29kZS1lc2NhcGUnKSwgMSwgVmFsdWVFcnJvciwKICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciAnPycgKDB4MzAwMCkgYXQgaW5kZXggNSIpCiAKLXRlc3RfZXhjKCclZCcsICcxJywgVHlwZUVycm9yLCAiaW50IGFyZ3VtZW50IHJlcXVpcmVkIikKLXRlc3RfZXhjKCclZycsICcxJywgVHlwZUVycm9yLCAiZmxvYXQgYXJndW1lbnQgcmVxdWlyZWQiKQordGVzdF9leGMoJyVkJywgJzEnLCBUeXBlRXJyb3IsICJpbnQgYXJndW1lbnQgcmVxdWlyZWQsIG5vdCBzdHIiKQordGVzdF9leGMoJyVnJywgJzEnLCBUeXBlRXJyb3IsICJmbG9hdCBhcmd1bWVudCByZXF1aXJlZCwgbm90IHN0ciIpCiB0ZXN0X2V4Yygnbm8gZm9ybWF0JywgJzEnLCBUeXBlRXJyb3IsCiAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBzdHJpbmcgZm9ybWF0dGluZyIpCiB0ZXN0X2V4Yygnbm8gZm9ybWF0JywgdScxJywgVHlwZUVycm9yLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQppbmRleCAwMWQ2Y2QyLi5lZGMxN2ZjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQpAQCAtMjEwLDYgKzIxMCwxMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuYXR0ciwgJ1RoaXMgaXMgYSBkaWZmZXJlbnQgdGVzdCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5kaWN0X2F0dHIsIGYuZGljdF9hdHRyKQogCisgICAgZGVmIHRlc3RfYnVpbHRpbl91cGRhdGUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgYnVnICMxNTc2MjQxCisgICAgICAgIGRlZiB3cmFwcGVyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZ1bmN0b29scy51cGRhdGVfd3JhcHBlcih3cmFwcGVyLCBtYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX25hbWVfXywgJ21heCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh3cmFwcGVyLl9fZG9jX18uc3RhcnRzd2l0aCgnbWF4KCcpKQogCiBjbGFzcyBUZXN0V3JhcHMoVGVzdFVwZGF0ZVdyYXBwZXIpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Z1dHVyZS5weSBiL0xpYi90ZXN0L3Rlc3RfZnV0dXJlLnB5CmluZGV4IGY1NDYyZTIuLjlhNWY4MjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnV0dXJlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnV0dXJlLnB5CkBAIC04Miw2ICs4MiwyNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gZGlkbid0IG9jY3VyIikKIAorICAgIGRlZiB0ZXN0X3BhcnNlcmhhY2soc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IHRoZSBwYXJzZXIuYzo6ZnV0dXJlX2hhY2sgZnVuY3Rpb24gd29ya3MgYXMgZXhwZWN0ZWQKKyAgICAgICAgIyBOb3RlOiBhbHRob3VnaCB0aGlzIHRlc3QgbXVzdCBwYXNzLCBpdCdzIG5vdCB0ZXN0aW5nIHRoZSBvcmlnaW5hbAorICAgICAgICAjICAgICAgIGJ1ZyBhcyBvZiAyLjYgc2luY2UgdGhlIHdpdGggc3RhdGVtZW50IGlzIG5vdCBvcHRpb25hbCBhbmQKKyAgICAgICAgIyAgICAgICB0aGUgcGFyc2VyIGhhY2sgZGlzYWJsZWQuIElmIGEgbmV3IGtleXdvcmQgaXMgaW50cm9kdWNlZCBpbgorICAgICAgICAjICAgICAgIDIuNiwgY2hhbmdlIHRoaXMgdG8gcmVmZXIgdG8gdGhlIG5ldyBmdXR1cmUgaW1wb3J0LgorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uLCB3aXRoX3N0YXRlbWVudDsgd2l0aCA9IDAiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInN5bnRheCBlcnJvciBkaWRuJ3Qgb2NjdXIiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMoImZyb20gX19mdXR1cmVfXyBpbXBvcnQgKHdpdGhfc3RhdGVtZW50LCBkaXZpc2lvbik7IHdpdGggPSAwIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzeW50YXggZXJyb3IgZGlkbid0IG9jY3VyIikKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGdXR1cmVUZXN0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M0NjA3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQpAQCAtMCwwICsxLDE4NCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IG9zCitpbXBvcnQgZ2VuZXJpY3BhdGgKKworY2xhc3MgQWxsQ29tbW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0SXMoc2VsZiwgYSwgYik6CisgICAgICAgIHNlbGYuYXNzZXJ0XyhhIGlzIGIpCisKKyAgICBkZWYgdGVzdF9jb21tb25wcmVmaXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZW5lcmljcGF0aC5jb21tb25wcmVmaXgoW10pLAorICAgICAgICAgICAgIiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2VuZXJpY3BhdGguY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbnNvbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKSwKKyAgICAgICAgICAgICIvaG9tZS9zd2VuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZW5lcmljcGF0aC5jb21tb25wcmVmaXgoWyIvaG9tZS9zd2VuL3NwYW0iLCAiL2hvbWUvc3dlbi9lZ2dzIl0pLAorICAgICAgICAgICAgIi9ob21lL3N3ZW4vIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZW5lcmljcGF0aC5jb21tb25wcmVmaXgoWyIvaG9tZS9zd2VuL3NwYW0iLCAiL2hvbWUvc3dlbi9zcGFtIl0pLAorICAgICAgICAgICAgIi9ob21lL3N3ZW4vc3BhbSIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZ2V0c2l6ZShzZWxmKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZW5lcmljcGF0aC5nZXRzaXplKHRlc3Rfc3VwcG9ydC5URVNURk4pLCAzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2VkOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF90aW1lKHNlbGYpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiYWIiKQorICAgICAgICAgICAgZi53cml0ZSgiYmFyIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIGQgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsICJmb29iYXIiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguZ2V0Y3RpbWUodGVzdF9zdXBwb3J0LlRFU1RGTikgPD0KKyAgICAgICAgICAgICAgICBnZW5lcmljcGF0aC5nZXRtdGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2VkOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9leGlzdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTiksIFRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdlbmVyaWNwYXRoLmV4aXN0cykKKworICAgIGRlZiB0ZXN0X2lzZGlyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmlzZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmlzZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBUcnVlKQorICAgICAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2VuZXJpY3BhdGguaXNkaXIpCisKKyAgICBkZWYgdGVzdF9pc2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIFRydWUpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmlzZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZW5lcmljcGF0aC5pc2RpcikKKworICAgICAgICBkZWYgdGVzdF9zYW1lZmlsZShzZWxmKToKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsICJ3YiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKAorICAgICAgICAgICAgICAgICAgICBnZW5lcmljcGF0aC5zYW1lZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGxpbmtzLCBhc3N1bWUgdGhhdCBvcy5zdGF0IGRvZXNuJ3QgcmV0dXJuIHJlc29uYWJsZQorICAgICAgICAgICAgICAgICMgaW5vZGUgaW5mb3JtYXRpb24gYW5kIHRodXMsIHRoYXQgc2FtZWZpbGUoKSBkb2Vzbid0IHdvcmsKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgorICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguc2FtZWZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKQorICAgICAgICAgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiLCAid2IiKQorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCJiYXIiKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLnNhbWVmaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIikKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdlbmVyaWNwYXRoLnNhbWVmaWxlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChBbGxDb21tb25UZXN0KQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nbG9iYWwucHkgYi9MaWIvdGVzdC90ZXN0X2dsb2JhbC5weQppbmRleCA0Y2M5NTNjLi4yMmU0YjI1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dsb2JhbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dsb2JhbC5weQpAQCAtMSw1MSArMSw1MSBAQAogIiIiVmVyaWZ5IHRoYXQgd2FybmluZ3MgYXJlIGlzc3VlZCBmb3IgZ2xvYmFsIHN0YXRlbWVudHMgZm9sbG93aW5nIHVzZS4iIiIKIAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2hlY2tfc3ludGF4Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3N5bnRheF9lcnJvcgoraW1wb3J0IHVuaXR0ZXN0CiAKIGltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgbW9kdWxlPSI8dGVzdCBzdHJpbmc+IikKIAotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgbW9kdWxlPSI8dGVzdCBjb2RlPiIpCitjbGFzcyBHbG9iYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLWRlZiBjb21waWxlX2FuZF9jaGVjayh0ZXh0LCBzaG91bGRfZmFpbD0xKToKLSAgICB0cnk6Ci0gICAgICAgIGNvbXBpbGUodGV4dCwgIjx0ZXN0IGNvZGU+IiwgImV4ZWMiKQotICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgbXNnOgotICAgICAgICBpZiBzaG91bGRfZmFpbDoKLSAgICAgICAgICAgIHByaW50ICJnb3QgU3ludGF4RXJyb3IgYXMgZXhwZWN0ZWQiCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAicmFpc2VkIHVuZXhwZWN0ZWQgU3ludGF4RXJyb3I6IiwgdGV4dAotICAgIGVsc2U6Ci0gICAgICAgIGlmIHNob3VsZF9mYWlsOgotICAgICAgICAgICAgcHJpbnQgInNob3VsZCBoYXZlIHJhaXNlZCBTeW50YXhFcnJvcjoiLCB0ZXh0Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiYXMgZXhwZWN0ZWQsIG5vIFN5bnRheEVycm9yIgotCi1wcm9nX3RleHRfMSA9ICIiIgorICAgIGRlZiB0ZXN0MShzZWxmKToKKyAgICAgICAgcHJvZ190ZXh0XzEgPSAiIiJcCiBkZWYgd3JvbmcxKCk6CiAgICAgYSA9IDEKICAgICBiID0gMgogICAgIGdsb2JhbCBhCiAgICAgZ2xvYmFsIGIKICIiIgotY29tcGlsZV9hbmRfY2hlY2socHJvZ190ZXh0XzEpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCBwcm9nX3RleHRfMSkKIAotcHJvZ190ZXh0XzIgPSAiIiIKKyAgICBkZWYgdGVzdDIoc2VsZik6CisgICAgICAgIHByb2dfdGV4dF8yID0gIiIiXAogZGVmIHdyb25nMigpOgogICAgIHByaW50IHgKICAgICBnbG9iYWwgeAogIiIiCi1jb21waWxlX2FuZF9jaGVjayhwcm9nX3RleHRfMikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsIHByb2dfdGV4dF8yKQogCi1wcm9nX3RleHRfMyA9ICIiIgorICAgIGRlZiB0ZXN0MyhzZWxmKToKKyAgICAgICAgcHJvZ190ZXh0XzMgPSAiIiJcCiBkZWYgd3JvbmczKCk6CiAgICAgcHJpbnQgeAogICAgIHggPSAyCiAgICAgZ2xvYmFsIHgKICIiIgotY29tcGlsZV9hbmRfY2hlY2socHJvZ190ZXh0XzMpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCBwcm9nX3RleHRfMykKIAotcHJvZ190ZXh0XzQgPSAiIiIKKyAgICBkZWYgdGVzdDQoc2VsZik6CisgICAgICAgIHByb2dfdGV4dF80ID0gIiIiXAogZ2xvYmFsIHgKIHggPSAyCiAiIiIKLWNvbXBpbGVfYW5kX2NoZWNrKHByb2dfdGV4dF80LCAwKQorICAgICAgICAjIHRoaXMgc2hvdWxkIHdvcmsKKyAgICAgICAgY29tcGlsZShwcm9nX3RleHRfNCwgIjx0ZXN0IHN0cmluZz4iLCAiZXhlYyIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChHbG9iYWxUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IGNhODRjNTYuLmY0YTA0NzggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTgsODMwICs4LDg5NyBAQAogIyByZWdyZXNzaW9uIHRlc3QsIHRoZSBmaWx0ZXJ3YXJuaW5ncygpIGNhbGwgaGFzIGJlZW4gYWRkZWQgdG8KICMgcmVncnRlc3QucHkuCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQsIHZlcmlmeSwgdmVyZXEsIGNoZWNrX3N5bnRheAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19zeW50YXhfZXJyb3IKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cworIyB0ZXN0aW5nIGltcG9ydCAqCitmcm9tIHN5cyBpbXBvcnQgKgogCi1wcmludCAnMS4gUGFyc2VyJworY2xhc3MgVG9rZW5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLXByaW50ICcxLjEgVG9rZW5zJworICAgIGRlZiB0ZXN0QmFja3NsYXNoKHNlbGYpOgorICAgICAgICAjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjoKKyAgICAgICAgeCA9IDEgXAorICAgICAgICArIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMiwgJ2JhY2tzbGFzaCBmb3IgbGluZSBjb250aW51YXRpb24nKQogCi1wcmludCAnMS4xLjEgQmFja3NsYXNoZXMnCisgICAgICAgICMgQmFja3NsYXNoIGRvZXMgbm90IG1lYW5zIGNvbnRpbnVhdGlvbiBpbiBjb21tZW50cyA6XAorICAgICAgICB4ID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCAwLCAnYmFja3NsYXNoIGVuZGluZyBjb21tZW50JykKIAotIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246Ci14ID0gMSBcCi0rIDEKLWlmIHggIT0gMjogcmFpc2UgVGVzdEZhaWxlZCwgJ2JhY2tzbGFzaCBmb3IgbGluZSBjb250aW51YXRpb24nCisgICAgZGVmIHRlc3RQbGFpbkludGVnZXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygweGZmLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAzNzcsIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMjE0NzQ4MzY0NywgMDE3Nzc3Nzc3Nzc3KQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgbWF4aW50CisgICAgICAgIGlmIG1heGludCA9PSAyMTQ3NDgzNjQ3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDctMSwgLTAyMDAwMDAwMDAwMCkKKyAgICAgICAgICAgICMgWFhYIC0yMTQ3NDgzNjQ4CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMDM3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICcyMTQ3NDgzNjQ4JywgJzA0MDAwMDAwMDAwMCcsICcweDEwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxpZiBtYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKC05MjIzMzcyMDM2ODU0Nzc1ODA3LTEsIC0wMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMHhmZmZmZmZmZmZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICc5MjIzMzcyMDM2ODU0Nzc1ODA4JywgJzAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgXAorICAgICAgICAgICAgICAgICAgICAgJzB4MTAwMDAwMDAwMDAwMDAwMDAnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2YWwocykKKyAgICAgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPdmVyZmxvd0Vycm9yIG9uIGh1Z2UgaW50ZWdlciBsaXRlcmFsICVyIiAlIHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1dlaXJkIG1heGludCB2YWx1ZSAlcicgJSBtYXhpbnQpCiAKLSMgQmFja3NsYXNoIGRvZXMgbm90IG1lYW5zIGNvbnRpbnVhdGlvbiBpbiBjb21tZW50cyA6XAoteCA9IDAKLWlmIHggIT0gMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2JhY2tzbGFzaCBlbmRpbmcgY29tbWVudCcKKyAgICBkZWYgdGVzdExvbmdJbnRlZ2VycyhzZWxmKToKKyAgICAgICAgeCA9IDBMCisgICAgICAgIHggPSAwbAorICAgICAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZmZmTAorICAgICAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZmZmbAorICAgICAgICB4ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3TAorICAgICAgICB4ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3bAorICAgICAgICB4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwTAorICAgICAgICB4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwbAogCi1wcmludCAnMS4xLjIgTnVtZXJpYyBsaXRlcmFscycKKyAgICBkZWYgdGVzdEZsb2F0cyhzZWxmKToKKyAgICAgICAgeCA9IDMuMTQKKyAgICAgICAgeCA9IDMxNC4KKyAgICAgICAgeCA9IDAuMzE0CisgICAgICAgICMgWFhYIHggPSAwMDAuMzE0CisgICAgICAgIHggPSAuMzE0CisgICAgICAgIHggPSAzZTE0CisgICAgICAgIHggPSAzRTE0CisgICAgICAgIHggPSAzZS0xNAorICAgICAgICB4ID0gM2UrMTQKKyAgICAgICAgeCA9IDMuZTE0CisgICAgICAgIHggPSAuM2UxNAorICAgICAgICB4ID0gMy4xZTQKIAotcHJpbnQgJzEuMS4yLjEgUGxhaW4gaW50ZWdlcnMnCi1pZiAweGZmICE9IDI1NTogcmFpc2UgVGVzdEZhaWxlZCwgJ2hleCBpbnQnCi1pZiAwMzc3ICE9IDI1NTogcmFpc2UgVGVzdEZhaWxlZCwgJ29jdGFsIGludCcKLWlmICAyMTQ3NDgzNjQ3ICAgIT0gMDE3Nzc3Nzc3Nzc3OiByYWlzZSBUZXN0RmFpbGVkLCAnbGFyZ2UgcG9zaXRpdmUgaW50JwotdHJ5OgotICAgIGZyb20gc3lzIGltcG9ydCBtYXhpbnQKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBtYXhpbnQgPSAyMTQ3NDgzNjQ3Ci1pZiBtYXhpbnQgPT0gMjE0NzQ4MzY0NzoKLSAgICAjIFRoZSBmb2xsb3dpbmcgdGVzdCB3aWxsIHN0YXJ0IHRvIGZhaWwgaW4gUHl0aG9uIDIuNDsKLSAgICAjIGNoYW5nZSB0aGUgMDIwMDAwMDAwMDAwIHRvIC0wMjAwMDAwMDAwMDAKLSAgICBpZiAtMjE0NzQ4MzY0Ny0xICE9IC0wMjAwMDAwMDAwMDA6IHJhaXNlIFRlc3RGYWlsZWQsICdtYXggbmVnYXRpdmUgaW50JwotICAgICMgWFhYIC0yMTQ3NDgzNjQ4Ci0gICAgaWYgMDM3Nzc3Nzc3Nzc3IDwgMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xhcmdlIG9jdCcKLSAgICBpZiAweGZmZmZmZmZmIDwgMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xhcmdlIGhleCcKLSAgICBmb3IgcyBpbiAnMjE0NzQ4MzY0OCcsICcwNDAwMDAwMDAwMDAnLCAnMHgxMDAwMDAwMDAnOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB4ID0gZXZhbChzKQotICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgICAgIHByaW50ICJPdmVyZmxvd0Vycm9yIG9uIGh1Z2UgaW50ZWdlciBsaXRlcmFsICIgKyByZXByKHMpCi1lbGlmIGV2YWwoJ21heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3Jyk6Ci0gICAgaWYgZXZhbCgnLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSAhPSAtMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgJ21heCBuZWdhdGl2ZSBpbnQnCi0gICAgaWYgZXZhbCgnMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcnKSA8IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdsYXJnZSBvY3QnCi0gICAgaWYgZXZhbCgnMHhmZmZmZmZmZmZmZmZmZmZmJykgPCAwOiByYWlzZSBUZXN0RmFpbGVkLCAnbGFyZ2UgaGV4JwotICAgIGZvciBzIGluICc5MjIzMzcyMDM2ODU0Nzc1ODA4JywgJzAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgXAotICAgICAgICAgICAgICcweDEwMDAwMDAwMDAwMDAwMDAwJzoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgeCA9IGV2YWwocykKLSAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgICAgICBwcmludCAiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAiICsgcmVwcihzKQotZWxzZToKLSAgICBwcmludCAnV2VpcmQgbWF4aW50IHZhbHVlJywgbWF4aW50Ci0KLXByaW50ICcxLjEuMi4yIExvbmcgaW50ZWdlcnMnCi14ID0gMEwKLXggPSAwbAoteCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkwKLXggPSAweGZmZmZmZmZmZmZmZmZmZmZsCi14ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3TAoteCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N2wKLXggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBMCi14ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwbAotCi1wcmludCAnMS4xLjIuMyBGbG9hdGluZyBwb2ludCcKLXggPSAzLjE0Ci14ID0gMzE0LgoteCA9IDAuMzE0Ci0jIFhYWCB4ID0gMDAwLjMxNAoteCA9IC4zMTQKLXggPSAzZTE0Ci14ID0gM0UxNAoteCA9IDNlLTE0Ci14ID0gM2UrMTQKLXggPSAzLmUxNAoteCA9IC4zZTE0Ci14ID0gMy4xZTQKLQotcHJpbnQgJzEuMS4zIFN0cmluZyBsaXRlcmFscycKLQoteCA9ICcnOyB5ID0gIiI7IHZlcmlmeShsZW4oeCkgPT0gMCBhbmQgeCA9PSB5KQoteCA9ICdcJyc7IHkgPSAiJyI7IHZlcmlmeShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCi14ID0gJyInOyB5ID0gIlwiIjsgdmVyaWZ5KGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzNCkKLXggPSAiZG9lc24ndCBcInNocmlua1wiIGRvZXMgaXQiCi15ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCi12ZXJpZnkobGVuKHgpID09IDI0IGFuZCB4ID09IHkpCi14ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgoteSA9ICdkb2VzICJzaHJpbmsiIGRvZXNuXCd0IGl0JwotdmVyaWZ5KGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQoteCA9ICIiIgorICAgIGRlZiB0ZXN0U3RyaW5nTGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHggPSAnJzsgeSA9ICIiOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDAgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICdcJyc7IHkgPSAiJyI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCisgICAgICAgIHggPSAnIic7IHkgPSAiXCIiOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM0KQorICAgICAgICB4ID0gImRvZXNuJ3QgXCJzaHJpbmtcIiBkb2VzIGl0IgorICAgICAgICB5ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICJkb2VzIFwic2hyaW5rXCIgZG9lc24ndCBpdCIKKyAgICAgICAgeSA9ICdkb2VzICJzaHJpbmsiIGRvZXNuXCd0IGl0JworICAgICAgICBzZWxmLmFzc2VydF8obGVuKHgpID09IDI0IGFuZCB4ID09IHkpCisgICAgICAgIHggPSAiIiIKIFRoZSAicXVpY2siCiBicm93biBmb3gKIGp1bXBzIG92ZXIKIHRoZSAnbGF6eScgZG9nLgogIiIiCi15ID0gJ1xuVGhlICJxdWljayJcbmJyb3duIGZveFxuanVtcHMgb3ZlclxudGhlIFwnbGF6eVwnIGRvZy5cbicKLXZlcmlmeSh4ID09IHkpCi15ID0gJycnCisgICAgICAgIHkgPSAnXG5UaGUgInF1aWNrIlxuYnJvd24gZm94XG5qdW1wcyBvdmVyXG50aGUgXCdsYXp5XCcgZG9nLlxuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorICAgICAgICB5ID0gJycnCiBUaGUgInF1aWNrIgogYnJvd24gZm94CiBqdW1wcyBvdmVyCiB0aGUgJ2xhenknIGRvZy4KLScnJzsgdmVyaWZ5KHggPT0geSkKLXkgPSAiXG5cCisnJycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICJcblwKIFRoZSBcInF1aWNrXCJcblwKIGJyb3duIGZveFxuXAoganVtcHMgb3ZlclxuXAogdGhlICdsYXp5JyBkb2cuXG5cCi0iOyB2ZXJpZnkoeCA9PSB5KQoteSA9ICdcblwKKyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICdcblwKIFRoZSBcInF1aWNrXCJcblwKIGJyb3duIGZveFxuXAoganVtcHMgb3ZlclxuXAogdGhlIFwnbGF6eVwnIGRvZy5cblwKLSc7IHZlcmlmeSh4ID09IHkpCisnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisKKyAgICBkZWYgdGVzdEVsbGlwc2lzKHNlbGYpOgorICAgICAgICB4ID0gLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIEVsbGlwc2lzKQorCitjbGFzcyBHcmFtbWFyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBzaW5nbGVfaW5wdXQ6IE5FV0xJTkUgfCBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQgTkVXTElORQorICAgICMgWFhYIGNhbid0IHRlc3QgaW4gYSBzY3JpcHQgLS0gdGhpcyBydWxlIGlzIG9ubHkgdXNlZCB3aGVuIGludGVyYWN0aXZlCisKKyAgICAjIGZpbGVfaW5wdXQ6IChORVdMSU5FIHwgc3RtdCkqIEVORE1BUktFUgorICAgICMgQmVpbmcgdGVzdGVkIGFzIHRoaXMgdmVyeSBtb21lbnQgdGhpcyB2ZXJ5IG1vZHVsZQorCisgICAgIyBleHByX2lucHV0OiB0ZXN0bGlzdCBORVdMSU5FCisgICAgIyBYWFggSGFyZCB0byB0ZXN0IC0tIHVzZWQgb25seSBpbiBjYWxscyB0byBpbnB1dCgpCisKKyAgICBkZWYgdGVzdEV2YWxJbnB1dChzZWxmKToKKyAgICAgICAgIyB0ZXN0bGlzdCBFTkRNQVJLRVIKKyAgICAgICAgeCA9IGV2YWwoJzEsIDAgb3IgMScpCisKKyAgICBkZWYgdGVzdEZ1bmNkZWYoc2VsZik6CisgICAgICAgICMjIyAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgJzonIHN1aXRlCisgICAgICAgICMjIyBwYXJhbWV0ZXJzOiAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKKyAgICAgICAgIyMjIHZhcmFyZ3NsaXN0OiAoZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgorICAgICAgICAjIyMgICAgICAgICAgICgnKicgKE5BTUV8JywnIGZwZGVmIFsnPScgdGVzdF0pIFsnLCcgKCcqKid8JyonICcqJykgTkFNRV0KKyAgICAgICAgIyMjICAgICAgICAgICAgfCAoJyoqJ3wnKicgJyonKSBOQU1FKQorICAgICAgICAjIyMgICAgICAgICAgICB8IGZwZGVmIFsnPScgdGVzdF0gKCcsJyBmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10KKyAgICAgICAgIyMjIGZwZGVmOiBOQU1FIHwgJygnIGZwbGlzdCAnKScKKyAgICAgICAgIyMjIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCisgICAgICAgICMjIyBhcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IHwgKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCisgICAgICAgICMjIyBhcmd1bWVudDogW3Rlc3QgJz0nXSB0ZXN0ICAgIyBSZWFsbHkgW2tleXdvcmQgJz0nXSB0ZXN0CisgICAgICAgIGRlZiBmMSgpOiBwYXNzCisgICAgICAgIGYxKCkKKyAgICAgICAgZjEoKigpKQorICAgICAgICBmMSgqKCksICoqe30pCisgICAgICAgIGRlZiBmMihvbmVfYXJndW1lbnQpOiBwYXNzCisgICAgICAgIGRlZiBmMyh0d28sIGFyZ3VtZW50cyk6IHBhc3MKKyAgICAgICAgZGVmIGY0KHR3bywgKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKSk6IHBhc3MKKyAgICAgICAgZGVmIGY1KChjb21wb3VuZCwgZmlyc3QpLCB0d28pOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYyLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdvbmVfYXJndW1lbnQnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCd0d28nLCAnYXJndW1lbnRzJykpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgKCd0d28nLCAnKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0JywpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICgnKGNvbXBvdW5kLCBmaXJzdCknLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAoJ3R3bycsICcuMScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsICAnbGlzdCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgKCcuMCcsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKKyAgICAgICAgZGVmIGExKG9uZV9hcmcsKTogcGFzcworICAgICAgICBkZWYgYTIodHdvLCBhcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIHYwKCpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjEoYSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MihhLCBiLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYzKGEsIChiLCBjKSwgKnJlc3QpOiByZXR1cm4gYSwgYiwgYywgcmVzdAorCisgICAgICAgIGYxKCkKKyAgICAgICAgZjIoMSkKKyAgICAgICAgZjIoMSwpCisgICAgICAgIGYzKDEsIDIpCisgICAgICAgIGYzKDEsIDIsKQorICAgICAgICBmNCgxLCAoMiwgKDMsIDQpKSkKKyAgICAgICAgdjAoKQorICAgICAgICB2MCgxKQorICAgICAgICB2MCgxLCkKKyAgICAgICAgdjAoMSwyKQorICAgICAgICB2MCgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MSgxKQorICAgICAgICB2MSgxLCkKKyAgICAgICAgdjEoMSwyKQorICAgICAgICB2MSgxLDIsMykKKyAgICAgICAgdjEoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjIoMSwyKQorICAgICAgICB2MigxLDIsMykKKyAgICAgICAgdjIoMSwyLDMsNCkKKyAgICAgICAgdjIoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjMoMSwoMiwzKSkKKyAgICAgICAgdjMoMSwoMiwzKSw0KQorICAgICAgICB2MygxLCgyLDMpLDQsNSw2LDcsOCw5LDApCisKKyAgICAgICAgIyBjZXZhbCB1bnBhY2tzIHRoZSBmb3JtYWwgYXJndW1lbnRzIGludG8gdGhlIGZpcnN0IGFyZ2NvdW50IG5hbWVzOworICAgICAgICAjIHRodXMsIHRoZSBuYW1lcyBuZXN0ZWQgaW5zaWRlIHR1cGxlcyBtdXN0IGFwcGVhciBhZnRlciB0aGVzZSBuYW1lcy4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdhJywgJyhiLCBjKScsICdyZXN0JywgJ2InLCAnYycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ2EnLCAnLjEnLCAncmVzdCcsICdiJywgJ2MnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjMoMSwgKDIsIDMpLCA0KSwgKDEsIDIsIDMsICg0LCkpKQorICAgICAgICBkZWYgZDAxKGE9MSk6IHBhc3MKKyAgICAgICAgZDAxKCkKKyAgICAgICAgZDAxKDEpCisgICAgICAgIGQwMSgqKDEsKSkKKyAgICAgICAgZDAxKCoqeydhJzoyfSkKKyAgICAgICAgZGVmIGQxMShhLCBiPTEpOiBwYXNzCisgICAgICAgIGQxMSgxKQorICAgICAgICBkMTEoMSwgMikKKyAgICAgICAgZDExKDEsICoqeydiJzoyfSkKKyAgICAgICAgZGVmIGQyMShhLCBiLCBjPTEpOiBwYXNzCisgICAgICAgIGQyMSgxLCAyKQorICAgICAgICBkMjEoMSwgMiwgMykKKyAgICAgICAgZDIxKCooMSwgMiwgMykpCisgICAgICAgIGQyMSgxLCAqKDIsIDMpKQorICAgICAgICBkMjEoMSwgMiwgKigzLCkpCisgICAgICAgIGQyMSgxLCAyLCAqKnsnYyc6M30pCisgICAgICAgIGRlZiBkMDIoYT0xLCBiPTIpOiBwYXNzCisgICAgICAgIGQwMigpCisgICAgICAgIGQwMigxKQorICAgICAgICBkMDIoMSwgMikKKyAgICAgICAgZDAyKCooMSwgMikpCisgICAgICAgIGQwMigxLCAqKDIsKSkKKyAgICAgICAgZDAyKDEsICoqeydiJzoyfSkKKyAgICAgICAgZDAyKCoqeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgZGVmIGQxMihhLCBiPTEsIGM9Mik6IHBhc3MKKyAgICAgICAgZDEyKDEpCisgICAgICAgIGQxMigxLCAyKQorICAgICAgICBkMTIoMSwgMiwgMykKKyAgICAgICAgZGVmIGQyMihhLCBiLCBjPTEsIGQ9Mik6IHBhc3MKKyAgICAgICAgZDIyKDEsIDIpCisgICAgICAgIGQyMigxLCAyLCAzKQorICAgICAgICBkMjIoMSwgMiwgMywgNCkKKyAgICAgICAgZGVmIGQwMXYoYT0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDAxdigpCisgICAgICAgIGQwMXYoMSkKKyAgICAgICAgZDAxdigxLCAyKQorICAgICAgICBkMDF2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQwMXYoKigxLCkpCisgICAgICAgIGQwMXYoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExdihhLCBiPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMTF2KDEpCisgICAgICAgIGQxMXYoMSwgMikKKyAgICAgICAgZDExdigxLCAyLCAzKQorICAgICAgICBkZWYgZDIxdihhLCBiLCBjPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMjF2KDEsIDIpCisgICAgICAgIGQyMXYoMSwgMiwgMykKKyAgICAgICAgZDIxdigxLCAyLCAzLCA0KQorICAgICAgICBkMjF2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMXYoMSwgMiwgKip7J2MnOiAzfSkKKyAgICAgICAgZGVmIGQwMnYoYT0xLCBiPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMDJ2KCkKKyAgICAgICAgZDAydigxKQorICAgICAgICBkMDJ2KDEsIDIpCisgICAgICAgIGQwMnYoMSwgMiwgMykKKyAgICAgICAgZDAydigxLCAqKDIsIDMsIDQpKQorICAgICAgICBkMDJ2KCoqeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgZGVmIGQxMnYoYSwgYj0xLCBjPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMTJ2KDEpCisgICAgICAgIGQxMnYoMSwgMikKKyAgICAgICAgZDEydigxLCAyLCAzKQorICAgICAgICBkMTJ2KDEsIDIsIDMsIDQpCisgICAgICAgIGQxMnYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDEydigxLCAyLCAqKDMsIDQsIDUpKQorICAgICAgICBkMTJ2KDEsICooMiwpLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDIydihhLCBiLCBjPTEsIGQ9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMnYoMSwgMikKKyAgICAgICAgZDIydigxLCAyLCAzKQorICAgICAgICBkMjJ2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCwgNSkKKyAgICAgICAgZDIydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMjJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQyMnYoMSwgKigyLCAzKSwgKip7J2QnOiA0fSkKKyAgICAgICAgZGVmIGQzMXYoKHgpKTogcGFzcworICAgICAgICBkMzF2KDEpCisgICAgICAgIGRlZiBkMzJ2KCh4LCkpOiBwYXNzCisgICAgICAgIGQzMnYoKDEsKSkKKyAgICAgICAgIyBrZXl3b3JkIG9ubHkgYXJndW1lbnQgdGVzdHMKKyAgICAgICAgZGVmIHBvczBrZXkxKCosIGtleSk6IHJldHVybiBrZXkKKyAgICAgICAgcG9zMGtleTEoa2V5PTEwMCkKKyAgICAgICAgZGVmIHBvczJrZXkyKHAxLCBwMiwgKiwgazEsIGsyPTEwMCk6IHJldHVybiBwMSxwMixrMSxrMgorICAgICAgICBwb3Mya2V5MigxLCAyLCBrMT0xMDApCisgICAgICAgIHBvczJrZXkyKDEsIDIsIGsxPTEwMCwgazI9MjAwKQorICAgICAgICBwb3Mya2V5MigxLCAyLCBrMj0xMDAsIGsxPTIwMCkKKyAgICAgICAgZGVmIHBvczJrZXkyZGljdChwMSwgcDIsICosIGsxPTEwMCwgazIsICoqa3dhcmcpOiByZXR1cm4gcDEscDIsazEsazIsa3dhcmcKKyAgICAgICAgcG9zMmtleTJkaWN0KDEsMixrMj0xMDAsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCkKKyAgICAgICAgcG9zMmtleTJkaWN0KDEsMix0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwLCBrMj0xMDApCisKKyAgICBkZWYgdGVzdExhbWJkZWYoc2VsZik6CisgICAgICAgICMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CisgICAgICAgIGwxID0gbGFtYmRhIDogMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsMSgpLCAwKQorICAgICAgICBsMiA9IGxhbWJkYSA6IGFbZF0gIyBYWFgganVzdCB0ZXN0aW5nIHRoZSBleHByZXNzaW9uCisgICAgICAgIGwzID0gbGFtYmRhIDogWzIgPCB4IGZvciB4IGluIFstMSwgMywgMExdXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsMygpLCBbMCwgMSwgMF0pCisgICAgICAgIGw0ID0gbGFtYmRhIHggPSBsYW1iZGEgeSA9IGxhbWJkYSB6PTEgOiB6IDogeSgpIDogeCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw0KCksIDEpCisgICAgICAgIGw1ID0gbGFtYmRhIHgsIHksIHo9MjogeCArIHkgKyB6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw1KDEsIDIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNSgxLCAyLCAzKSwgNikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJsYW1iZGEgeDogeCA9IDIiKQorICAgICAgICBsNiA9IGxhbWJkYSB4LCB5LCAqLCBrPTIwOiB4K3kraworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNigxLDIpLCAxKzIrMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw2KDEsMixrPTEwKSwgMSsyKzEwKQogCiAKLXByaW50ICcxLjEuNCBFbGxpcHNpcyBsaXRlcmFsJworICAgICMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdwogCi14ID0gLi4uCi12ZXJpZnkoeCA9PSBFbGxpcHNpcykKKyAgICBkZWYgdGVzdFNpbXBsZVN0bXQoc2VsZik6CisgICAgICAgICMjIyBzaW1wbGVfc3RtdDogc21hbGxfc3RtdCAoJzsnIHNtYWxsX3N0bXQpKiBbJzsnXQorICAgICAgICB4ID0gMTsgcGFzczsgZGVsIHgKKyAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgIyB2ZXJpZnkgc3RhdG1lbnRzIHRoYXQgZW5kIHdpdGggc2VtaS1jb2xvbnMKKyAgICAgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeDsKKyAgICAgICAgZm9vKCkKIAorICAgICMjIyBzbWFsbF9zdG10OiBleHByX3N0bXQgfCBwcmludF9zdG10ICB8IHBhc3Nfc3RtdCB8IGRlbF9zdG10IHwgZmxvd19zdG10IHwgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IGFjY2Vzc19zdG10IAorICAgICMgVGVzdGVkIGJlbG93CiAKLXByaW50ICcxLjIgR3JhbW1hcicKKyAgICBkZWYgdGVzdEV4cHJTdG10KHNlbGYpOgorICAgICAgICAjIChleHBybGlzdCAnPScpKiBleHBybGlzdAorICAgICAgICAxCisgICAgICAgIDEsIDIsIDMKKyAgICAgICAgeCA9IDEKKyAgICAgICAgeCA9IDEsIDIsIDMKKyAgICAgICAgeCA9IHkgPSB6ID0gMSwgMiwgMworICAgICAgICB4LCB5LCB6ID0gMSwgMiwgMworICAgICAgICBhYmMgPSBhLCBiLCBjID0geCwgeSwgeiA9IHh5eiA9IDEsIDIsICgzLCA0KQogCi1wcmludCAnc2luZ2xlX2lucHV0JyAjIE5FV0xJTkUgfCBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQgTkVXTElORQotIyBYWFggY2FuJ3QgdGVzdCBpbiBhIHNjcmlwdCAtLSB0aGlzIHJ1bGUgaXMgb25seSB1c2VkIHdoZW4gaW50ZXJhY3RpdmUKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJ4ICsgMSA9IDEiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImEgKyAxID0gYiArIDIiKQogCi1wcmludCAnZmlsZV9pbnB1dCcgIyAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKLSMgQmVpbmcgdGVzdGVkIGFzIHRoaXMgdmVyeSBtb21lbnQgdGhpcyB2ZXJ5IG1vZHVsZQorICAgIGRlZiB0ZXN0UHJpbnRTdG10KHNlbGYpOgorICAgICAgICAjICdwcmludCcgKHRlc3QgJywnKSogW3Rlc3RdCisgICAgICAgIGltcG9ydCBTdHJpbmdJTwogCi1wcmludCAnZXhwcl9pbnB1dCcgIyB0ZXN0bGlzdCBORVdMSU5FCi0jIFhYWCBIYXJkIHRvIHRlc3QgLS0gdXNlZCBvbmx5IGluIGNhbGxzIHRvIGlucHV0KCkKKyAgICAgICAgIyBDYW4ndCB0ZXN0IHByaW50aW5nIHRvIHJlYWwgc3Rkb3V0IHdpdGhvdXQgY29tcGFyaW5nIG91dHB1dAorICAgICAgICAjIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdW5pdHRlc3QuCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogCi1wcmludCAnZXZhbF9pbnB1dCcgIyB0ZXN0bGlzdCBFTkRNQVJLRVIKLXggPSBldmFsKCcxLCAwIG9yIDEnKQorICAgICAgICBwcmludCAxLCAyLCAzCisgICAgICAgIHByaW50IDEsIDIsIDMsCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50IDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCAwIG9yIDEKIAotcHJpbnQgJ2Z1bmNkZWYnCi0jIyMgJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQotIyMjIHBhcmFtZXRlcnM6ICcoJyBbdmFyYXJnc2xpc3RdICcpJwotIyMjIHZhcmFyZ3NsaXN0OiAoZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKiAKLSMjIyAgICAgICAgICAgKCcqJyAoTkFNRXwnLCcgZnBkZWYgWyc9JyB0ZXN0XSkgWycsJyAoJyoqJ3wnKicgJyonKSBOQU1FXQotIyMjICAgICAgICAgICAgfCAoJyoqJ3wnKicgJyonKSBOQU1FKQotIyMjICAgICAgICAgICAgfCBmcGRlZiBbJz0nIHRlc3RdICgnLCcgZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddCi0jIyMgZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJwotIyMjIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCi0jIyMgYXJnbGlzdDogKGFyZ3VtZW50ICcsJykqIChhcmd1bWVudCB8IConIHRlc3QgWycsJyAnKionIHRlc3RdIHwgJyoqJyB0ZXN0KQotIyMjIGFyZ3VtZW50OiBbdGVzdCAnPSddIHRlc3QgICAjIFJlYWxseSBba2V5d29yZCAnPSddIHRlc3QKLWRlZiBmMSgpOiBwYXNzCi1mMSgpCi1mMSgqKCkpCi1mMSgqKCksICoqe30pCi1kZWYgZjIob25lX2FyZ3VtZW50KTogcGFzcwotZGVmIGYzKHR3bywgYXJndW1lbnRzKTogcGFzcwotZGVmIGY0KHR3bywgKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKSk6IHBhc3MKLWRlZiBmNSgoY29tcG91bmQsIGZpcnN0KSwgdHdvKTogcGFzcwotdmVyZXEoZjIuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ29uZV9hcmd1bWVudCcsKSkKLXZlcmVxKGYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCd0d28nLCAnYXJndW1lbnRzJykpCi1pZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgotICAgIHZlcmVxKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKLSAgICAgICAgICAgKCd0d28nLCAnKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAnbGlzdCcsKSkKLSAgICB2ZXJlcShmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCi0gICAgICAgICAgICgnKGNvbXBvdW5kLCBmaXJzdCknLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCi1lbHNlOgotICAgIHZlcmVxKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKLSAgICAgICAgICAoJ3R3bycsICcuMScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsICAnbGlzdCcpKQotICAgIHZlcmVxKGY1LmZ1bmNfY29kZS5jb192YXJuYW1lcywKLSAgICAgICAgICAoJy4wJywgJ3R3bycsICdjb21wb3VuZCcsICdmaXJzdCcpKQotZGVmIGExKG9uZV9hcmcsKTogcGFzcwotZGVmIGEyKHR3bywgYXJncywpOiBwYXNzCi1kZWYgdjAoKnJlc3QpOiBwYXNzCi1kZWYgdjEoYSwgKnJlc3QpOiBwYXNzCi1kZWYgdjIoYSwgYiwgKnJlc3QpOiBwYXNzCi1kZWYgdjMoYSwgKGIsIGMpLCAqcmVzdCk6IHJldHVybiBhLCBiLCBjLCByZXN0Ci0jIGNldmFsIHVucGFja3MgdGhlIGZvcm1hbCBhcmd1bWVudHMgaW50byB0aGUgZmlyc3QgYXJnY291bnQgbmFtZXM7Ci0jIHRodXMsIHRoZSBuYW1lcyBuZXN0ZWQgaW5zaWRlIHR1cGxlcyBtdXN0IGFwcGVhciBhZnRlciB0aGVzZSBuYW1lcy4KLWlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6Ci0gICAgdmVyaWZ5KHYzLmZ1bmNfY29kZS5jb192YXJuYW1lcyA9PSAoJ2EnLCAnKGIsIGMpJywgJ3Jlc3QnLCAnYicsICdjJykpCi1lbHNlOgotICAgIHZlcmVxKHYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdhJywgJy4xJywgJ3Jlc3QnLCAnYicsICdjJykpCi12ZXJpZnkodjMoMSwgKDIsIDMpLCA0KSA9PSAoMSwgMiwgMywgKDQsKSkpCi1kZWYgZDAxKGE9MSk6IHBhc3MKLWQwMSgpCi1kMDEoMSkKLWQwMSgqKDEsKSkKLWQwMSgqKnsnYSc6Mn0pCi1kZWYgZDExKGEsIGI9MSk6IHBhc3MKLWQxMSgxKQotZDExKDEsIDIpCi1kMTEoMSwgKip7J2InOjJ9KQotZGVmIGQyMShhLCBiLCBjPTEpOiBwYXNzCi1kMjEoMSwgMikKLWQyMSgxLCAyLCAzKQotZDIxKCooMSwgMiwgMykpCi1kMjEoMSwgKigyLCAzKSkKLWQyMSgxLCAyLCAqKDMsKSkKLWQyMSgxLCAyLCAqKnsnYyc6M30pCi1kZWYgZDAyKGE9MSwgYj0yKTogcGFzcwotZDAyKCkKLWQwMigxKQotZDAyKDEsIDIpCi1kMDIoKigxLCAyKSkKLWQwMigxLCAqKDIsKSkKLWQwMigxLCAqKnsnYic6Mn0pCi1kMDIoKip7J2EnOiAxLCAnYic6IDJ9KQotZGVmIGQxMihhLCBiPTEsIGM9Mik6IHBhc3MKLWQxMigxKQotZDEyKDEsIDIpCi1kMTIoMSwgMiwgMykKLWRlZiBkMjIoYSwgYiwgYz0xLCBkPTIpOiBwYXNzCi1kMjIoMSwgMikKLWQyMigxLCAyLCAzKQotZDIyKDEsIDIsIDMsIDQpCi1kZWYgZDAxdihhPTEsICpyZXN0KTogcGFzcwotZDAxdigpCi1kMDF2KDEpCi1kMDF2KDEsIDIpCi1kMDF2KCooMSwgMiwgMywgNCkpCi1kMDF2KCooMSwpKQotZDAxdigqKnsnYSc6Mn0pCi1kZWYgZDExdihhLCBiPTEsICpyZXN0KTogcGFzcwotZDExdigxKQotZDExdigxLCAyKQotZDExdigxLCAyLCAzKQotZGVmIGQyMXYoYSwgYiwgYz0xLCAqcmVzdCk6IHBhc3MKLWQyMXYoMSwgMikKLWQyMXYoMSwgMiwgMykKLWQyMXYoMSwgMiwgMywgNCkKLWQyMXYoKigxLCAyLCAzLCA0KSkKLWQyMXYoMSwgMiwgKip7J2MnOiAzfSkKLWRlZiBkMDJ2KGE9MSwgYj0yLCAqcmVzdCk6IHBhc3MKLWQwMnYoKQotZDAydigxKQotZDAydigxLCAyKQotZDAydigxLCAyLCAzKQotZDAydigxLCAqKDIsIDMsIDQpKQotZDAydigqKnsnYSc6IDEsICdiJzogMn0pCi1kZWYgZDEydihhLCBiPTEsIGM9MiwgKnJlc3QpOiBwYXNzCi1kMTJ2KDEpCi1kMTJ2KDEsIDIpCi1kMTJ2KDEsIDIsIDMpCi1kMTJ2KDEsIDIsIDMsIDQpCi1kMTJ2KCooMSwgMiwgMywgNCkpCi1kMTJ2KDEsIDIsICooMywgNCwgNSkpCi1kMTJ2KDEsICooMiwpLCAqKnsnYyc6IDN9KQotZGVmIGQyMnYoYSwgYiwgYz0xLCBkPTIsICpyZXN0KTogcGFzcwotZDIydigxLCAyKQotZDIydigxLCAyLCAzKQotZDIydigxLCAyLCAzLCA0KQotZDIydigxLCAyLCAzLCA0LCA1KQotZDIydigqKDEsIDIsIDMsIDQpKQotZDIydigxLCAyLCAqKDMsIDQsIDUpKQotZDIydigxLCAqKDIsIDMpLCAqKnsnZCc6IDR9KQotZGVmIGQzMXYoKHgpKTogcGFzcwotZDMxdigxKQotZGVmIGQzMnYoKHgsKSk6IHBhc3MKLWQzMnYoKDEsKSkKLSNrZXl3b3JkIG9ubHkgYXJndW1lbnQgdGVzdHMKLWRlZiBwb3Mwa2V5MSgqLCBrZXkpOiByZXR1cm4ga2V5Ci1wb3Mwa2V5MShrZXk9MTAwKQotZGVmIHBvczJrZXkyKHAxLCBwMiwgKiwgazEsIGsyPTEwMCk6IHJldHVybiBwMSxwMixrMSxrMgotcG9zMmtleTIoMSwgMiwgazE9MTAwKQotcG9zMmtleTIoMSwgMiwgazE9MTAwLCBrMj0yMDApCi1wb3Mya2V5MigxLCAyLCBrMj0xMDAsIGsxPTIwMCkKLWRlZiBwb3Mya2V5MmRpY3QocDEsIHAyLCAqLCBrMT0xMDAsIGsyLCAqKmt3YXJnKTogcmV0dXJuIHAxLHAyLGsxLGsyLGt3YXJnCi1wb3Mya2V5MmRpY3QoMSwyLGsyPTEwMCx0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwKQotcG9zMmtleTJkaWN0KDEsMix0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwLCBrMj0xMDApCisgICAgICAgICMgJ3ByaW50JyAnPj4nIHRlc3QgJywnCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMywKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxCiAKLSMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0Ci1wcmludCAnbGFtYmRlZicKLWwxID0gbGFtYmRhIDogMAotdmVyaWZ5KGwxKCkgPT0gMCkKLWwyID0gbGFtYmRhIDogYVtkXSAjIFhYWCBqdXN0IHRlc3RpbmcgdGhlIGV4cHJlc3Npb24KLWwzID0gbGFtYmRhIDogWzIgPCB4IGZvciB4IGluIFstMSwgMywgMExdXQotdmVyaWZ5KGwzKCkgPT0gWzAsIDEsIDBdKQotbDQgPSBsYW1iZGEgeCA9IGxhbWJkYSB5ID0gbGFtYmRhIHo9MSA6IHogOiB5KCkgOiB4KCkKLXZlcmlmeShsNCgpID09IDEpCi1sNSA9IGxhbWJkYSB4LCB5LCB6PTI6IHggKyB5ICsgegotdmVyaWZ5KGw1KDEsIDIpID09IDUpCi12ZXJpZnkobDUoMSwgMiwgMykgPT0gNikKLWNoZWNrX3N5bnRheCgibGFtYmRhIHg6IHggPSAyIikKLWw2ID0gbGFtYmRhIHgsIHksICosIGs9MjA6IHgreStrCi12ZXJpZnkobDYoMSwyKSA9PSAxKzIrMjApCi12ZXJpZnkobDYoMSwyLGs9MTApID09IDErMisxMCkKKyAgICAgICAgIyB0ZXN0IHByaW50aW5nIHRvIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEd1bHA6CisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgbXNnKTogcGFzcwogCi0jIyMgc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10Ci0jIFRlc3RlZCBiZWxvdworICAgICAgICBndWxwID0gR3VscCgpCisgICAgICAgIHByaW50ID4+IGd1bHAsIDEsIDIsIDMKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMSwgMiwgMywKKyAgICAgICAgcHJpbnQgPj4gZ3VscAorICAgICAgICBwcmludCA+PiBndWxwLCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMCBvciAxCiAKLSMjIyBzaW1wbGVfc3RtdDogc21hbGxfc3RtdCAoJzsnIHNtYWxsX3N0bXQpKiBbJzsnXQotcHJpbnQgJ3NpbXBsZV9zdG10JwoteCA9IDE7IHBhc3M7IGRlbCB4Ci1kZWYgZm9vKCk6Ci0gICAgIyB2ZXJpZnkgc3RhdG1lbnRzIHRoYXQgZW5kIHdpdGggc2VtaS1jb2xvbnMKLSAgICB4ID0gMTsgcGFzczsgZGVsIHg7Ci1mb28oKQorICAgICAgICAjIHRlc3QgcHJpbnQgPj4gTm9uZQorICAgICAgICBkZWYgZHJpdmVyKCk6CisgICAgICAgICAgICBvbGRzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gR3VscCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVsbG1lKEd1bHAoKSkKKyAgICAgICAgICAgICAgICB0ZWxsbWUoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkc3Rkb3V0CiAKLSMjIyBzbWFsbF9zdG10OiBleHByX3N0bXQgfCBwcmludF9zdG10ICB8IHBhc3Nfc3RtdCB8IGRlbF9zdG10IHwgZmxvd19zdG10IHwgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IGFjY2Vzc19zdG10IHwgZXhlY19zdG10Ci0jIFRlc3RlZCBiZWxvdworICAgICAgICAjIHdlIHNob3VsZCBzZWUgdGhpcyBvbmNlCisgICAgICAgIGRlZiB0ZWxsbWUoZmlsZT1zeXMuc3Rkb3V0KToKKyAgICAgICAgICAgIHByaW50ID4+IGZpbGUsICdoZWxsbyB3b3JsZCcKIAotcHJpbnQgJ2V4cHJfc3RtdCcgIyAoZXhwcmxpc3QgJz0nKSogZXhwcmxpc3QKLTEKLTEsIDIsIDMKLXggPSAxCi14ID0gMSwgMiwgMwoteCA9IHkgPSB6ID0gMSwgMiwgMwoteCwgeSwgeiA9IDEsIDIsIDMKLWFiYyA9IGEsIGIsIGMgPSB4LCB5LCB6ID0geHl6ID0gMSwgMiwgKDMsIDQpCi0jIE5CIHRoZXNlIHZhcmlhYmxlcyBhcmUgZGVsZXRlZCBiZWxvdworICAgICAgICBkcml2ZXIoKQogCi1jaGVja19zeW50YXgoInggKyAxID0gMSIpCi1jaGVja19zeW50YXgoImEgKyAxID0gYiArIDIiKQorICAgICAgICAjIHdlIHNob3VsZCBub3Qgc2VlIHRoaXMgYXQgYWxsCisgICAgICAgIGRlZiB0ZWxsbWUoZmlsZT1Ob25lKToKKyAgICAgICAgICAgIHByaW50ID4+IGZpbGUsICdnb29kYnllIHVuaXZlcnNlJwogCi1wcmludCAncHJpbnRfc3RtdCcgIyAncHJpbnQnICh0ZXN0ICcsJykqIFt0ZXN0XQotcHJpbnQgMSwgMiwgMwotcHJpbnQgMSwgMiwgMywKLXByaW50Ci1wcmludCAwIG9yIDEsIDAgb3IgMSwKLXByaW50IDAgb3IgMQorICAgICAgICBkcml2ZXIoKQogCi1wcmludCAnZXh0ZW5kZWQgcHJpbnRfc3RtdCcgIyAncHJpbnQnICc+PicgdGVzdCAnLCcKLWltcG9ydCBzeXMKLXByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMKLXByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMsCi1wcmludCA+PiBzeXMuc3Rkb3V0Ci1wcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEsIDAgb3IgMSwKLXByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSwgJycnXAorMSAyIDMKKzEgMiAzCisxIDEgMQorMSAyIDMKKzEgMiAzCisxIDEgMQoraGVsbG8gd29ybGQKKycnJykKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKLSMgdGVzdCBwcmludGluZyB0byBhbiBpbnN0YW5jZQotY2xhc3MgR3VscDoKLSAgICBkZWYgd3JpdGUoc2VsZiwgbXNnKTogcGFzcworICAgICAgICAjIHN5bnRheCBlcnJvcnMKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICdwcmludCAsJykKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICdwcmludCA+PiB4LCcpCiAKLWd1bHAgPSBHdWxwKCkKLXByaW50ID4+IGd1bHAsIDEsIDIsIDMKLXByaW50ID4+IGd1bHAsIDEsIDIsIDMsCi1wcmludCA+PiBndWxwCi1wcmludCA+PiBndWxwLCAwIG9yIDEsIDAgb3IgMSwKLXByaW50ID4+IGd1bHAsIDAgb3IgMQorICAgIGRlZiB0ZXN0RGVsU3RtdChzZWxmKToKKyAgICAgICAgIyAnZGVsJyBleHBybGlzdAorICAgICAgICBhYmMgPSBbMSwyLDNdCisgICAgICAgIHgsIHksIHogPSBhYmMKKyAgICAgICAgeHl6ID0geCwgeSwgegogCi0jIHRlc3QgcHJpbnQgPj4gTm9uZQotZGVmIGRyaXZlcigpOgotICAgIG9sZHN0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICBzeXMuc3Rkb3V0ID0gR3VscCgpCi0gICAgdHJ5OgotICAgICAgICB0ZWxsbWUoR3VscCgpKQotICAgICAgICB0ZWxsbWUoKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHN5cy5zdGRvdXQgPSBvbGRzdGRvdXQKKyAgICAgICAgZGVsIGFiYworICAgICAgICBkZWwgeCwgeSwgKHosIHh5eikKIAotIyB3ZSBzaG91bGQgc2VlIHRoaXMgb25jZQotZGVmIHRlbGxtZShmaWxlPXN5cy5zdGRvdXQpOgotICAgIHByaW50ID4+IGZpbGUsICdoZWxsbyB3b3JsZCcKKyAgICBkZWYgdGVzdFBhc3NTdG10KHNlbGYpOgorICAgICAgICAjICdwYXNzJworICAgICAgICBwYXNzCiAKLWRyaXZlcigpCisgICAgIyBmbG93X3N0bXQ6IGJyZWFrX3N0bXQgfCBjb250aW51ZV9zdG10IHwgcmV0dXJuX3N0bXQgfCByYWlzZV9zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKIAotIyB3ZSBzaG91bGQgbm90IHNlZSB0aGlzIGF0IGFsbAotZGVmIHRlbGxtZShmaWxlPU5vbmUpOgotICAgIHByaW50ID4+IGZpbGUsICdnb29kYnllIHVuaXZlcnNlJworICAgIGRlZiB0ZXN0QnJlYWtTdG10KHNlbGYpOgorICAgICAgICAjICdicmVhaycKKyAgICAgICAgd2hpbGUgMTogYnJlYWsKIAotZHJpdmVyKCkKKyAgICBkZWYgdGVzdENvbnRpbnVlU3RtdChzZWxmKToKKyAgICAgICAgIyAnY29udGludWUnCisgICAgICAgIGkgPSAxCisgICAgICAgIHdoaWxlIGk6IGkgPSAwOyBjb250aW51ZQogCi0jIHN5bnRheCBlcnJvcnMKLWNoZWNrX3N5bnRheCgncHJpbnQgLCcpCi1jaGVja19zeW50YXgoJ3ByaW50ID4+IHgsJykKKyAgICAgICAgbXNnID0gIiIKKyAgICAgICAgd2hpbGUgbm90IG1zZzoKKyAgICAgICAgICAgIG1zZyA9ICJvayIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIG1zZyA9ICJjb250aW51ZSBmYWlsZWQgdG8gY29udGludWUgaW5zaWRlIHRyeSIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBtc2cgPSAiY29udGludWUgaW5zaWRlIHRyeSBjYWxsZWQgZXhjZXB0IGJsb2NrIgorICAgICAgICBpZiBtc2cgIT0gIm9rIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCiAKLXByaW50ICdkZWxfc3RtdCcgIyAnZGVsJyBleHBybGlzdAotZGVsIGFiYwotZGVsIHgsIHksICh6LCB4eXopCisgICAgICAgIG1zZyA9ICIiCisgICAgICAgIHdoaWxlIG5vdCBtc2c6CisgICAgICAgICAgICBtc2cgPSAiZmluYWxseSBibG9jayBub3QgY2FsbGVkIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG1zZyA9ICJvayIKKyAgICAgICAgaWYgbXNnICE9ICJvayI6CisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQogCi1wcmludCAncGFzc19zdG10JyAjICdwYXNzJwotcGFzcworICAgIGRlZiB0ZXN0X2JyZWFrX2NvbnRpbnVlX2xvb3Aoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IHdhcnJhbnRzIGFuIGV4cGxhbmF0aW9uLiBJdCBpcyBhIHRlc3Qgc3BlY2lmaWNhbGx5IGZvciBTRiBidWdzCisgICAgICAgICMgIzQ2MzM1OSBhbmQgIzQ2MjkzNy4gVGhlIGJ1ZyBpcyB0aGF0IGEgJ2JyZWFrJyBzdGF0ZW1lbnQgZXhlY3V0ZWQgb3IKKyAgICAgICAgIyBleGNlcHRpb24gcmFpc2VkIGluc2lkZSBhIHRyeS9leGNlcHQgaW5zaWRlIGEgbG9vcCwgKmFmdGVyKiBhIGNvbnRpbnVlCisgICAgICAgICMgc3RhdGVtZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGluIHRoYXQgbG9vcCwgd2lsbCBjYXVzZSB0aGUgd3JvbmcgbnVtYmVyIG9mCisgICAgICAgICMgYXJndW1lbnRzIHRvIGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciByZXNldCB0bworICAgICAgICAjIGEgdmVyeSBzbWFsbCBudW1iZXIgKHVzdWFsbHkgMC4pIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGZvbGxvd2luZyB0ZXN0CisgICAgICAgICMgKm11c3QqIHdyaXR0ZW4gYXMgYSBmdW5jdGlvbiwgYW5kIHRoZSB0cmFja2luZyB2YXJzICptdXN0KiBiZSBmdW5jdGlvbgorICAgICAgICAjIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBPdGhlcndpc2UsIHRoZSB0ZXN0IHdpbGwgbG9vcCBhbmQgbG9vcC4KIAotcHJpbnQgJ2Zsb3dfc3RtdCcgIyBicmVha19zdG10IHwgY29udGludWVfc3RtdCB8IHJldHVybl9zdG10IHwgcmFpc2Vfc3RtdAotIyBUZXN0ZWQgYmVsb3cKKyAgICAgICAgZGVmIHRlc3RfaW5uZXIoZXh0cmFfYnVybmluZ19vaWwgPSAxLCBjb3VudD0wKToKKyAgICAgICAgICAgIGJpZ19oaXBwbyA9IDIKKyAgICAgICAgICAgIHdoaWxlIGJpZ19oaXBwbzoKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBleHRyYV9idXJuaW5nX29pbCBhbmQgYmlnX2hpcHBvID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9idXJuaW5nX29pbCAtPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBiaWdfaGlwcG8gLT0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGlmIGNvdW50ID4gMiBvciBiaWdfaGlwcG8gIT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNvbnRpbnVlIHRoZW4gYnJlYWsgaW4gdHJ5L2V4Y2VwdCBpbiBsb29wIGJyb2tlbiEiKQorICAgICAgICB0ZXN0X2lubmVyKCkKIAotcHJpbnQgJ2JyZWFrX3N0bXQnICMgJ2JyZWFrJwotd2hpbGUgMTogYnJlYWsKKyAgICBkZWYgdGVzdFJldHVybihzZWxmKToKKyAgICAgICAgIyAncmV0dXJuJyBbdGVzdGxpc3RdCisgICAgICAgIGRlZiBnMSgpOiByZXR1cm4KKyAgICAgICAgZGVmIGcyKCk6IHJldHVybiAxCisgICAgICAgIGcxKCkKKyAgICAgICAgeCA9IGcyKCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJjbGFzcyBmb286cmV0dXJuIDEiKQogCi1wcmludCAnY29udGludWVfc3RtdCcgIyAnY29udGludWUnCi1pID0gMQotd2hpbGUgaTogaSA9IDA7IGNvbnRpbnVlCisgICAgZGVmIHRlc3RZaWVsZChzZWxmKToKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJjbGFzcyBmb286eWllbGQgMSIpCiAKLW1zZyA9ICIiCi13aGlsZSBub3QgbXNnOgotICAgIG1zZyA9ICJjb250aW51ZSArIHRyeS9leGNlcHQgb2siCi0gICAgdHJ5OgotICAgICAgICBjb250aW51ZQotICAgICAgICBtc2cgPSAiY29udGludWUgZmFpbGVkIHRvIGNvbnRpbnVlIGluc2lkZSB0cnkiCi0gICAgZXhjZXB0OgotICAgICAgICBtc2cgPSAiY29udGludWUgaW5zaWRlIHRyeSBjYWxsZWQgZXhjZXB0IGJsb2NrIgotcHJpbnQgbXNnCisgICAgZGVmIHRlc3RSYWlzZShzZWxmKToKKyAgICAgICAgIyAncmFpc2UnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICB0cnk6IHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2p1c3QgdGVzdGluZycKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjogcGFzcworICAgICAgICB0cnk6IHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDogcGFzcwogCi1tc2cgPSAiIgotd2hpbGUgbm90IG1zZzoKLSAgICBtc2cgPSAiZmluYWxseSBibG9jayBub3QgY2FsbGVkIgotICAgIHRyeToKLSAgICAgICAgY29udGludWUKLSAgICBmaW5hbGx5OgotICAgICAgICBtc2cgPSAiY29udGludWUgKyB0cnkvZmluYWxseSBvayIKLXByaW50IG1zZworICAgIGRlZiB0ZXN0SW1wb3J0KHNlbGYpOgorICAgICAgICAjICdpbXBvcnQnIGRvdHRlZF9hc19uYW1lcworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGltcG9ydCB0aW1lLCBzeXMKKyAgICAgICAgIyAnZnJvbScgZG90dGVkX25hbWUgJ2ltcG9ydCcgKCcqJyB8ICcoJyBpbXBvcnRfYXNfbmFtZXMgJyknIHwgaW1wb3J0X2FzX25hbWVzKQorICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgZnJvbSB0aW1lIGltcG9ydCAodGltZSkKKyAgICAgICAgIyBub3QgdGVzdGFibGUgaW5zaWRlIGEgZnVuY3Rpb24sIGJ1dCBhbHJlYWR5IGRvbmUgYXQgdG9wIG9mIHRoZSBtb2R1bGUKKyAgICAgICAgIyBmcm9tIHN5cyBpbXBvcnQgKgorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgcGF0aCwgYXJndgorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndiwpCiAKKyAgICBkZWYgdGVzdEdsb2JhbChzZWxmKToKKyAgICAgICAgIyAnZ2xvYmFsJyBOQU1FICgnLCcgTkFNRSkqCisgICAgICAgIGdsb2JhbCBhCisgICAgICAgIGdsb2JhbCBhLCBiCisgICAgICAgIGdsb2JhbCBvbmUsIHR3bywgdGhyZWUsIGZvdXIsIGZpdmUsIHNpeCwgc2V2ZW4sIGVpZ2h0LCBuaW5lLCB0ZW4KIAotIyBUaGlzIHRlc3Qgd2FycmFudHMgYW4gZXhwbGFuYXRpb24uIEl0IGlzIGEgdGVzdCBzcGVjaWZpY2FsbHkgZm9yIFNGIGJ1Z3MKLSMgIzQ2MzM1OSBhbmQgIzQ2MjkzNy4gVGhlIGJ1ZyBpcyB0aGF0IGEgJ2JyZWFrJyBzdGF0ZW1lbnQgZXhlY3V0ZWQgb3IKLSMgZXhjZXB0aW9uIHJhaXNlZCBpbnNpZGUgYSB0cnkvZXhjZXB0IGluc2lkZSBhIGxvb3AsICphZnRlciogYSBjb250aW51ZQotIyBzdGF0ZW1lbnQgaGFzIGJlZW4gZXhlY3V0ZWQgaW4gdGhhdCBsb29wLCB3aWxsIGNhdXNlIHRoZSB3cm9uZyBudW1iZXIgb2YKLSMgYXJndW1lbnRzIHRvIGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciByZXNldCB0bwotIyBhIHZlcnkgc21hbGwgbnVtYmVyICh1c3VhbGx5IDAuKSBCZWNhdXNlIG9mIHRoaXMsIHRoZSBmb2xsb3dpbmcgdGVzdAotIyAqbXVzdCogd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLCBhbmQgdGhlIHRyYWNraW5nIHZhcnMgKm11c3QqIGJlIGZ1bmN0aW9uCi0jIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBPdGhlcndpc2UsIHRoZSB0ZXN0IHdpbGwgbG9vcCBhbmQgbG9vcC4KLQotcHJpbnQgInRlc3RpbmcgY29udGludWUgYW5kIGJyZWFrIGluIHRyeS9leGNlcHQgaW4gbG9vcCIKLWRlZiB0ZXN0X2JyZWFrX2NvbnRpbnVlX2xvb3AoZXh0cmFfYnVybmluZ19vaWwgPSAxLCBjb3VudD0wKToKLSAgICBiaWdfaGlwcG8gPSAyCi0gICAgd2hpbGUgYmlnX2hpcHBvOgotICAgICAgICBjb3VudCArPSAxCisgICAgZGVmIHRlc3RBc3NlcnQoc2VsZik6CisgICAgICAgICMgYXNzZXJ0X3N0bXQ6ICdhc3NlcnQnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICBhc3NlcnQgMQorICAgICAgICBhc3NlcnQgMSwgMQorICAgICAgICBhc3NlcnQgbGFtYmRhIHg6eAorICAgICAgICBhc3NlcnQgMSwgbGFtYmRhIHg6eCsxCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIGV4dHJhX2J1cm5pbmdfb2lsIGFuZCBiaWdfaGlwcG8gPT0gMToKLSAgICAgICAgICAgICAgICBleHRyYV9idXJuaW5nX29pbCAtPSAxCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGJpZ19oaXBwbyAtPSAxCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByYWlzZQotICAgIGlmIGNvdW50ID4gMiBvciBiaWdfaGlwcG8gIT0gMToKLSAgICAgICAgcHJpbnQgImNvbnRpbnVlIHRoZW4gYnJlYWsgaW4gdHJ5L2V4Y2VwdCBpbiBsb29wIGJyb2tlbiEiCi10ZXN0X2JyZWFrX2NvbnRpbnVlX2xvb3AoKQorICAgICAgICAgICAgYXNzZXJ0IDAsICJtc2ciCisgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGUuYXJnc1swXSwgIm1zZyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJBc3NlcnRpb25FcnJvciBub3QgcmFpc2VkIGJ5IGFzc2VydCAwIikKIAotcHJpbnQgJ3JldHVybl9zdG10JyAjICdyZXR1cm4nIFt0ZXN0bGlzdF0KLWRlZiBnMSgpOiByZXR1cm4KLWRlZiBnMigpOiByZXR1cm4gMQotZzEoKQoteCA9IGcyKCkKLWNoZWNrX3N5bnRheCgiY2xhc3MgZm9vOnJldHVybiAxIikKKyAgICAjIyMgY29tcG91bmRfc3RtdDogaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmCisgICAgIyBUZXN0ZWQgYmVsb3cKIAotcHJpbnQgJ3lpZWxkX3N0bXQnCi1jaGVja19zeW50YXgoImNsYXNzIGZvbzp5aWVsZCAxIikKKyAgICBkZWYgdGVzdElmKHNlbGYpOgorICAgICAgICAjICdpZicgdGVzdCAnOicgc3VpdGUgKCdlbGlmJyB0ZXN0ICc6JyBzdWl0ZSkqIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICBpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKIAotcHJpbnQgJ3JhaXNlX3N0bXQnICMgJ3JhaXNlJyB0ZXN0IFsnLCcgdGVzdF0KLXRyeTogcmFpc2UgUnVudGltZUVycm9yLCAnanVzdCB0ZXN0aW5nJwotZXhjZXB0IFJ1bnRpbWVFcnJvcjogcGFzcwotdHJ5OiByYWlzZSBLZXlib2FyZEludGVycnVwdAotZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiBwYXNzCisgICAgZGVmIHRlc3RXaGlsZShzZWxmKToKKyAgICAgICAgIyAnd2hpbGUnIHRlc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICB3aGlsZSAwOiBwYXNzCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcwogCi1wcmludCAnaW1wb3J0X25hbWUnICMgJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGltZSwgc3lzCi1wcmludCAnaW1wb3J0X2Zyb20nICMgJ2Zyb20nIGRvdHRlZF9uYW1lICdpbXBvcnQnICgnKicgfCAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykKLWZyb20gdGltZSBpbXBvcnQgdGltZQotZnJvbSB0aW1lIGltcG9ydCAodGltZSkKLWZyb20gc3lzIGltcG9ydCAqCi1mcm9tIHN5cyBpbXBvcnQgcGF0aCwgYXJndgotZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2KQotZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2LCkKKyAgICBkZWYgdGVzdEZvcihzZWxmKToKKyAgICAgICAgIyAnZm9yJyBleHBybGlzdCAnaW4nIGV4cHJsaXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgZm9yIGkgaW4gMSwgMiwgMzogcGFzcworICAgICAgICBmb3IgaSwgaiwgayBpbiAoKTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGNsYXNzIFNxdWFyZXM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4KToKKyAgICAgICAgICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICAgICAgICAgIHNlbGYuc29mYXIgPSBbXQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zb2ZhcikKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBub3QgMCA8PSBpIDwgc2VsZi5tYXg6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICAgICAgd2hpbGUgbiA8PSBpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChuKm4pCisgICAgICAgICAgICAgICAgICAgIG4gPSBuKzEKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQorICAgICAgICBuID0gMAorICAgICAgICBmb3IgeCBpbiBTcXVhcmVzKDEwKTogbiA9IG4reAorICAgICAgICBpZiBuICE9IDI4NToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZm9yIG92ZXIgZ3Jvd2luZyBzZXF1ZW5jZScpCiAKLXByaW50ICdnbG9iYWxfc3RtdCcgIyAnZ2xvYmFsJyBOQU1FICgnLCcgTkFNRSkqCi1kZWYgZigpOgotICAgIGdsb2JhbCBhCi0gICAgZ2xvYmFsIGEsIGIKLSAgICBnbG9iYWwgb25lLCB0d28sIHRocmVlLCBmb3VyLCBmaXZlLCBzaXgsIHNldmVuLCBlaWdodCwgbmluZSwgdGVuCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciB4LCBpbiBbKDEsKSwgKDIsKSwgKDMsKV06CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbMSwgMiwgM10pCiAKLXByaW50ICJhc3NlcnRfc3RtdCIgIyBhc3NlcnRfc3RtdDogJ2Fzc2VydCcgdGVzdCBbJywnIHRlc3RdCi1hc3NlcnQgMQotYXNzZXJ0IDEsIDEKLWFzc2VydCBsYW1iZGEgeDp4Ci1hc3NlcnQgMSwgbGFtYmRhIHg6eCsxCisgICAgZGVmIHRlc3RUcnkoc2VsZik6CisgICAgICAgICMjIyB0cnlfc3RtdDogJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICAjIyMgICAgICAgICB8ICd0cnknICc6JyBzdWl0ZSAnZmluYWxseScgJzonIHN1aXRlCisgICAgICAgICMjIyBleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbZXhwciBbJywnIGV4cHJdXQorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgRU9GRXJyb3I6IHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOiBwYXNzCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsIG1zZzogcGFzcworICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKTogcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKSwgbXNnOiBwYXNzCisgICAgICAgIHRyeTogcGFzcworICAgICAgICBmaW5hbGx5OiBwYXNzCiAKLSMjIyBjb21wb3VuZF9zdG10OiBpZl9zdG10IHwgd2hpbGVfc3RtdCB8IGZvcl9zdG10IHwgdHJ5X3N0bXQgfCBmdW5jZGVmIHwgY2xhc3NkZWYKLSMgVGVzdGVkIGJlbG93CisgICAgZGVmIHRlc3RTdWl0ZShzZWxmKToKKyAgICAgICAgIyBzaW1wbGVfc3RtdCB8IE5FV0xJTkUgSU5ERU5UIE5FV0xJTkUqIChzdG10IE5FV0xJTkUqKSsgREVERU5UCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgaWYgMToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgMToKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMKIAotcHJpbnQgJ2lmX3N0bXQnICMgJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCi1pZiAxOiBwYXNzCi1pZiAxOiBwYXNzCi1lbHNlOiBwYXNzCi1pZiAwOiBwYXNzCi1lbGlmIDA6IHBhc3MKLWlmIDA6IHBhc3MKLWVsaWYgMDogcGFzcwotZWxpZiAwOiBwYXNzCi1lbGlmIDA6IHBhc3MKLWVsc2U6IHBhc3MKKyAgICBkZWYgdGVzdFRlc3Qoc2VsZik6CisgICAgICAgICMjIyBhbmRfdGVzdCAoJ29yJyBhbmRfdGVzdCkqCisgICAgICAgICMjIyBhbmRfdGVzdDogbm90X3Rlc3QgKCdhbmQnIG5vdF90ZXN0KSoKKyAgICAgICAgIyMjIG5vdF90ZXN0OiAnbm90JyBub3RfdGVzdCB8IGNvbXBhcmlzb24KKyAgICAgICAgaWYgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIG9yIDE6IHBhc3MKKyAgICAgICAgaWYgbm90IG5vdCBub3QgMTogcGFzcworICAgICAgICBpZiBub3QgMSBhbmQgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIGFuZCAxIG9yIDEgYW5kIDEgYW5kIDEgb3Igbm90IDEgYW5kIDE6IHBhc3MKIAotcHJpbnQgJ3doaWxlX3N0bXQnICMgJ3doaWxlJyB0ZXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KLXdoaWxlIDA6IHBhc3MKLXdoaWxlIDA6IHBhc3MKLWVsc2U6IHBhc3MKKyAgICBkZWYgdGVzdENvbXBhcmlzb24oc2VsZik6CisgICAgICAgICMjIyBjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgorICAgICAgICAjIyMgY29tcF9vcDogJzwnfCc+J3wnPT0nfCc+PSd8Jzw9J3wnIT0nfCdpbid8J25vdCcgJ2luJ3wnaXMnfCdpcycgJ25vdCcKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICB4ID0gKDEgPT0gMSkKKyAgICAgICAgaWYgMSA9PSAxOiBwYXNzCisgICAgICAgIGlmIDEgIT0gMTogcGFzcworICAgICAgICBpZiAxIDwgMTogcGFzcworICAgICAgICBpZiAxID4gMTogcGFzcworICAgICAgICBpZiAxIDw9IDE6IHBhc3MKKyAgICAgICAgaWYgMSA+PSAxOiBwYXNzCisgICAgICAgIGlmIDEgaXMgMTogcGFzcworICAgICAgICBpZiAxIGlzIG5vdCAxOiBwYXNzCisgICAgICAgIGlmIDEgaW4gKCk6IHBhc3MKKyAgICAgICAgaWYgMSBub3QgaW4gKCk6IHBhc3MKKyAgICAgICAgaWYgMSA8IDEgPiAxID09IDEgPj0gMSA8PSAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxOiBwYXNzCiAKLXByaW50ICdmb3Jfc3RtdCcgIyAnZm9yJyBleHBybGlzdCAnaW4nIGV4cHJsaXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KLWZvciBpIGluIDEsIDIsIDM6IHBhc3MKLWZvciBpLCBqLCBrIGluICgpOiBwYXNzCi1lbHNlOiBwYXNzCi1jbGFzcyBTcXVhcmVzOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgotICAgICAgICBzZWxmLm1heCA9IG1heAotICAgICAgICBzZWxmLnNvZmFyID0gW10KLSAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNvZmFyKQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKLSAgICAgICAgaWYgbm90IDAgPD0gaSA8IHNlbGYubWF4OiByYWlzZSBJbmRleEVycm9yCi0gICAgICAgIG4gPSBsZW4oc2VsZi5zb2ZhcikKLSAgICAgICAgd2hpbGUgbiA8PSBpOgotICAgICAgICAgICAgc2VsZi5zb2Zhci5hcHBlbmQobipuKQotICAgICAgICAgICAgbiA9IG4rMQotICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQotbiA9IDAKLWZvciB4IGluIFNxdWFyZXMoMTApOiBuID0gbit4Ci1pZiBuICE9IDI4NTogcmFpc2UgVGVzdEZhaWxlZCwgJ2ZvciBvdmVyIGdyb3dpbmcgc2VxdWVuY2UnCisgICAgZGVmIHRlc3RCaW5hcnlNYXNrT3BzKHNlbGYpOgorICAgICAgICB4ID0gMSAmIDEKKyAgICAgICAgeCA9IDEgXiAxCisgICAgICAgIHggPSAxIHwgMQogCi1yZXN1bHQgPSBbXQotZm9yIHgsIGluIFsoMSwpLCAoMiwpLCAoMywpXToKLSAgICByZXN1bHQuYXBwZW5kKHgpCi12ZXJlcShyZXN1bHQsIFsxLCAyLCAzXSkKKyAgICBkZWYgdGVzdFNoaWZ0T3BzKHNlbGYpOgorICAgICAgICB4ID0gMSA8PCAxCisgICAgICAgIHggPSAxID4+IDEKKyAgICAgICAgeCA9IDEgPDwgMSA+PiAxCiAKLXByaW50ICd0cnlfc3RtdCcKLSMjIyB0cnlfc3RtdDogJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQotIyMjICAgICAgICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQotIyMjIGV4Y2VwdF9jbGF1c2U6ICdleGNlcHQnIFtleHByIFsnLCcgZXhwcl1dCi10cnk6Ci0gICAgMS8wCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBwYXNzCi10cnk6IDEvMAotZXhjZXB0IEVPRkVycm9yOiBwYXNzCi1leGNlcHQgVHlwZUVycm9yLCBtc2c6IHBhc3MKLWV4Y2VwdCBSdW50aW1lRXJyb3IsIG1zZzogcGFzcwotZXhjZXB0OiBwYXNzCi1lbHNlOiBwYXNzCi10cnk6IDEvMAotZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvcik6IHBhc3MKLXRyeTogMS8wCi1leGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKSwgbXNnOiBwYXNzCi10cnk6IHBhc3MKLWZpbmFsbHk6IHBhc3MKKyAgICBkZWYgdGVzdEFkZGl0aXZlT3BzKHNlbGYpOgorICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSArIDEKKyAgICAgICAgeCA9IDEgLSAxIC0gMQorICAgICAgICB4ID0gMSAtIDEgKyAxIC0gMSArIDEKIAotcHJpbnQgJ3N1aXRlJyAjIHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgTkVXTElORSogKHN0bXQgTkVXTElORSopKyBERURFTlQKLWlmIDE6IHBhc3MKLWlmIDE6Ci0gICAgcGFzcwotaWYgMToKLSAgICAjCi0gICAgIwotICAgICMKLSAgICBwYXNzCi0gICAgcGFzcwotICAgICMKLSAgICBwYXNzCi0gICAgIworICAgIGRlZiB0ZXN0TXVsdGlwbGljYXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxICogMQorICAgICAgICB4ID0gMSAvIDEKKyAgICAgICAgeCA9IDEgJSAxCisgICAgICAgIHggPSAxIC8gMSAqIDEgJSAxCiAKLXByaW50ICd0ZXN0JwotIyMjIGFuZF90ZXN0ICgnb3InIGFuZF90ZXN0KSoKLSMjIyBhbmRfdGVzdDogbm90X3Rlc3QgKCdhbmQnIG5vdF90ZXN0KSoKLSMjIyBub3RfdGVzdDogJ25vdCcgbm90X3Rlc3QgfCBjb21wYXJpc29uCi1pZiBub3QgMTogcGFzcwotaWYgMSBhbmQgMTogcGFzcwotaWYgMSBvciAxOiBwYXNzCi1pZiBub3Qgbm90IG5vdCAxOiBwYXNzCi1pZiBub3QgMSBhbmQgMSBhbmQgMTogcGFzcwotaWYgMSBhbmQgMSBvciAxIGFuZCAxIGFuZCAxIG9yIG5vdCAxIGFuZCAxOiBwYXNzCisgICAgZGVmIHRlc3RVbmFyeU9wcyhzZWxmKToKKyAgICAgICAgeCA9ICsxCisgICAgICAgIHggPSAtMQorICAgICAgICB4ID0gfjEKKyAgICAgICAgeCA9IH4xIF4gMSAmIDEgfCAxICYgMSBeIC0xCisgICAgICAgIHggPSAtMSoxLzEgKyAxKjEgLSAtLS0xKjEKIAotcHJpbnQgJ2NvbXBhcmlzb24nCi0jIyMgY29tcGFyaXNvbjogZXhwciAoY29tcF9vcCBleHByKSoKLSMjIyBjb21wX29wOiAnPCd8Jz4nfCc9PSd8Jz49J3wnPD0nfCchPSd8J2luJ3wnbm90JyAnaW4nfCdpcyd8J2lzJyAnbm90JwotaWYgMTogcGFzcwoteCA9ICgxID09IDEpCi1pZiAxID09IDE6IHBhc3MKLWlmIDEgIT0gMTogcGFzcwotaWYgMSA8IDE6IHBhc3MKLWlmIDEgPiAxOiBwYXNzCi1pZiAxIDw9IDE6IHBhc3MKLWlmIDEgPj0gMTogcGFzcwotaWYgMSBpcyAxOiBwYXNzCi1pZiAxIGlzIG5vdCAxOiBwYXNzCi1pZiAxIGluICgpOiBwYXNzCi1pZiAxIG5vdCBpbiAoKTogcGFzcwotaWYgMSA8IDEgPiAxID09IDEgPj0gMSA8PSAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxOiBwYXNzCisgICAgZGVmIHRlc3RTZWxlY3RvcnMoc2VsZik6CisgICAgICAgICMjIyB0cmFpbGVyOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgc3Vic2NyaXB0ICddJyB8ICcuJyBOQU1FCisgICAgICAgICMjIyBzdWJzY3JpcHQ6IGV4cHIgfCBbZXhwcl0gJzonIFtleHByXQogCi1wcmludCAnYmluYXJ5IG1hc2sgb3BzJwoteCA9IDEgJiAxCi14ID0gMSBeIDEKLXggPSAxIHwgMQorICAgICAgICBpbXBvcnQgc3lzLCB0aW1lCisgICAgICAgIGMgPSBzeXMucGF0aFswXQorICAgICAgICB4ID0gdGltZS50aW1lKCkKKyAgICAgICAgeCA9IHN5cy5tb2R1bGVzWyd0aW1lJ10udGltZSgpCisgICAgICAgIGEgPSAnMDEyMzQnCisgICAgICAgIGMgPSBhWzBdCisgICAgICAgIGMgPSBhWy0xXQorICAgICAgICBzID0gYVswOjVdCisgICAgICAgIHMgPSBhWzo1XQorICAgICAgICBzID0gYVswOl0KKyAgICAgICAgcyA9IGFbOl0KKyAgICAgICAgcyA9IGFbLTU6XQorICAgICAgICBzID0gYVs6LTFdCisgICAgICAgIHMgPSBhWy00Oi0zXQorICAgICAgICAjIEEgcm91Z2ggdGVzdCBvZiBTRiBidWcgMTMzMzk4Mi4gIGh0dHA6Ly9weXRob24ub3JnL3NmLzEzMzM5ODIKKyAgICAgICAgIyBUaGUgdGVzdGluZyBoZXJlIGlzIGZhaXJseSBpbmNvbXBsZXRlLgorICAgICAgICAjIFRlc3QgY2FzZXMgc2hvdWxkIGluY2x1ZGU6IGNvbW1hcyB3aXRoIDEgYW5kIDIgY29sb25zCisgICAgICAgIGQgPSB7fQorICAgICAgICBkWzFdID0gMQorICAgICAgICBkWzEsXSA9IDIKKyAgICAgICAgZFsxLDJdID0gMworICAgICAgICBkWzEsMiwzXSA9IDQKKyAgICAgICAgTCA9IGxpc3QoZCkKKyAgICAgICAgTC5zb3J0KGtleT1sYW1iZGEgeDogeCBpZiBpc2luc3RhbmNlKHgsIHR1cGxlKSBlbHNlICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdHIoTCksICdbMSwgKDEsKSwgKDEsIDIpLCAoMSwgMiwgMyldJykKIAotcHJpbnQgJ3NoaWZ0IG9wcycKLXggPSAxIDw8IDEKLXggPSAxID4+IDEKLXggPSAxIDw8IDEgPj4gMQorICAgIGRlZiB0ZXN0QXRvbXMoc2VsZik6CisgICAgICAgICMjIyBhdG9tOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgW3Rlc3RsaXN0XSAnXScgfCAneycgW2RpY3RzZXRtYWtlcl0gJ30nIHwgTkFNRSB8IE5VTUJFUiB8IFNUUklORworICAgICAgICAjIyMgZGljdHNldG1ha2VyOiAodGVzdCAnOicgdGVzdCAoJywnIHRlc3QgJzonIHRlc3QpKiBbJywnXSkgfCAodGVzdCAoJywnIHRlc3QpKiBbJywnXSkKIAotcHJpbnQgJ2FkZGl0aXZlIG9wcycKLXggPSAxCi14ID0gMSArIDEKLXggPSAxIC0gMSAtIDEKLXggPSAxIC0gMSArIDEgLSAxICsgMQorICAgICAgICB4ID0gKDEpCisgICAgICAgIHggPSAoMSBvciAyIG9yIDMpCisgICAgICAgIHggPSAoMSBvciAyIG9yIDMsIDIsIDMpCiAKLXByaW50ICdtdWx0aXBsaWNhdGl2ZSBvcHMnCi14ID0gMSAqIDEKLXggPSAxIC8gMQoteCA9IDEgJSAxCi14ID0gMSAvIDEgKiAxICUgMQorICAgICAgICB4ID0gW10KKyAgICAgICAgeCA9IFsxXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzLCAyLCAzXQorICAgICAgICB4ID0gW10KIAotcHJpbnQgJ3VuYXJ5IG9wcycKLXggPSArMQoteCA9IC0xCi14ID0gfjEKLXggPSB+MSBeIDEgJiAxIHwgMSAmIDEgXiAtMQoteCA9IC0xKjEvMSArIDEqMSAtIC0tLTEqMQorICAgICAgICB4ID0ge30KKyAgICAgICAgeCA9IHsnb25lJzogMX0KKyAgICAgICAgeCA9IHsnb25lJzogMSx9CisgICAgICAgIHggPSB7J29uZScgb3IgJ3R3byc6IDEgb3IgMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDJ9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyLH0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNCwgJ2ZpdmUnOiA1LCAnc2l4JzogNn0KIAotcHJpbnQgJ3NlbGVjdG9ycycKLSMjIyB0cmFpbGVyOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgc3Vic2NyaXB0ICddJyB8ICcuJyBOQU1FCi0jIyMgc3Vic2NyaXB0OiBleHByIHwgW2V4cHJdICc6JyBbZXhwcl0KLWYxKCkKLWYyKDEpCi1mMigxLCkKLWYzKDEsIDIpCi1mMygxLCAyLCkKLWY0KDEsICgyLCAoMywgNCkpKQotdjAoKQotdjAoMSkKLXYwKDEsKQotdjAoMSwyKQotdjAoMSwyLDMsNCw1LDYsNyw4LDksMCkKLXYxKDEpCi12MSgxLCkKLXYxKDEsMikKLXYxKDEsMiwzKQotdjEoMSwyLDMsNCw1LDYsNyw4LDksMCkKLXYyKDEsMikKLXYyKDEsMiwzKQotdjIoMSwyLDMsNCkKLXYyKDEsMiwzLDQsNSw2LDcsOCw5LDApCi12MygxLCgyLDMpKQotdjMoMSwoMiwzKSw0KQotdjMoMSwoMiwzKSw0LDUsNiw3LDgsOSwwKQotcHJpbnQKLWltcG9ydCBzeXMsIHRpbWUKLWMgPSBzeXMucGF0aFswXQoteCA9IHRpbWUudGltZSgpCi14ID0gc3lzLm1vZHVsZXNbJ3RpbWUnXS50aW1lKCkKLWEgPSAnMDEyMzQnCi1jID0gYVswXQotYyA9IGFbLTFdCi1zID0gYVswOjVdCi1zID0gYVs6NV0KLXMgPSBhWzA6XQotcyA9IGFbOl0KLXMgPSBhWy01Ol0KLXMgPSBhWzotMV0KLXMgPSBhWy00Oi0zXQotIyBBIHJvdWdoIHRlc3Qgb2YgU0YgYnVnIDEzMzM5ODIuICBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMzMzOTgyCi0jIFRoZSB0ZXN0aW5nIGhlcmUgaXMgZmFpcmx5IGluY29tcGxldGUuCi0jIFRlc3QgY2FzZXMgc2hvdWxkIGluY2x1ZGU6IGNvbW1hcyB3aXRoIDEgYW5kIDIgY29sb25zCi1kID0ge30KLWRbMV0gPSAxCi1kWzEsXSA9IDIKLWRbMSwyXSA9IDMKLWRbMSwyLDNdID0gNAotTCA9IGxpc3QoZCkKLUwuc29ydChrZXk9bGFtYmRhIHg6IHggaWYgaXNpbnN0YW5jZSh4LCB0dXBsZSkgZWxzZSAoKSkKLXByaW50IEwKKyAgICAgICAgeCA9IHsnb25lJ30KKyAgICAgICAgeCA9IHsnb25lJywgMSx9CisgICAgICAgIHggPSB7J29uZScsICd0d28nLCAndGhyZWUnfQorICAgICAgICB4ID0gezIsIDMsIDQsfQorCisgICAgICAgIHggPSB4CisgICAgICAgIHggPSAneCcKKyAgICAgICAgeCA9IDEyMworCisgICAgIyMjIGV4cHJsaXN0OiBleHByICgnLCcgZXhwcikqIFsnLCddCisgICAgIyMjIHRlc3RsaXN0OiB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddCisgICAgIyBUaGVzZSBoYXZlIGJlZW4gZXhlcmNpc2VkIGVub3VnaCBhYm92ZQorCisgICAgZGVmIHRlc3RDbGFzc2RlZihzZWxmKToKKyAgICAgICAgIyAnY2xhc3MnIE5BTUUgWycoJyBbdGVzdGxpc3RdICcpJ10gJzonIHN1aXRlCisgICAgICAgIGNsYXNzIEI6IHBhc3MKKyAgICAgICAgY2xhc3MgQjIoKTogcGFzcworICAgICAgICBjbGFzcyBDMShCKTogcGFzcworICAgICAgICBjbGFzcyBDMihCKTogcGFzcworICAgICAgICBjbGFzcyBEKEMxLCBDMiwgQik6IHBhc3MKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBtZXRoMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIG1ldGgyKHNlbGYsIGFyZyk6IHBhc3MKKyAgICAgICAgICAgIGRlZiBtZXRoMyhzZWxmLCBhMSwgYTIpOiBwYXNzCisKKyAgICBkZWYgdGVzdExpc3Rjb21wcyhzZWxmKToKKyAgICAgICAgIyBsaXN0IGNvbXByZWhlbnNpb24gdGVzdHMKKyAgICAgICAgbnVtcyA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzdHJzID0gWyJBcHBsZSIsICJCYW5hbmEiLCAiQ29jb251dCJdCisgICAgICAgIHNwY3MgPSBbIiAgQXBwbGUiLCAiIEJhbmFuYSAiLCAiQ29jbyAgbnV0ICAiXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGNzXSwgWydBcHBsZScsICdCYW5hbmEnLCAnQ29jbyAgbnV0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzMgKiB4IGZvciB4IGluIG51bXNdLCBbMywgNiwgOSwgMTIsIDE1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCBpbiBudW1zIGlmIHggPiAyXSwgWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdBcHBsZScpLCAoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdBcHBsZScpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdBcHBsZScpLCAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdBcHBsZScpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdBcHBsZScpLCAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIFtmIGZvciBmIGluIHN0cnMgaWYgIm4iIGluIGZdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdCYW5hbmEnKSwgKDEsICdDb2NvbnV0JyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwgKDQsICdCYW5hbmEnKSwgKDQsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGxhbWJkYSBhOlthKippIGZvciBpIGluIHJhbmdlKGErMSldKShqKSBmb3IgaiBpbiByYW5nZSg1KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW1sxXSwgWzEsIDFdLCBbMSwgMiwgNF0sIFsxLCAzLCA5LCAyN10sIFsxLCA0LCAxNiwgNjQsIDI1Nl1dKQorCisgICAgICAgIGRlZiB0ZXN0X2luX2Z1bmMobCk6CisgICAgICAgICAgICByZXR1cm4gWzAgPCB4IDwgMyBmb3IgeCBpbiBsIGlmIHggPiAyXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9pbl9mdW5jKG51bXMpLCBbRmFsc2UsIEZhbHNlLCBGYWxzZV0pCisKKyAgICAgICAgZGVmIHRlc3RfbmVzdGVkX2Zyb250KCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtbeSBmb3IgeSBpbiBbeCwgeCArIDFdXSBmb3IgeCBpbiBbMSwzLDVdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKQorCisgICAgICAgIHRlc3RfbmVzdGVkX2Zyb250KCkKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIltpLCBzIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10iKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIlt4IGlmIHldIikKKworICAgICAgICBzdXBwbGllcnMgPSBbCisgICAgICAgICAgKDEsICJCb2VpbmciKSwKKyAgICAgICAgICAoMiwgIkZvcmQiKSwKKyAgICAgICAgICAoMywgIk1hY2RvbmFsZHMiKQorICAgICAgICBdCisKKyAgICAgICAgcGFydHMgPSBbCisgICAgICAgICAgKDEwLCAiQWlybGluZXIiKSwKKyAgICAgICAgICAoMjAsICJFbmdpbmUiKSwKKyAgICAgICAgICAoMzAsICJDaGVlc2VidXJnZXIiKQorICAgICAgICBdCisKKyAgICAgICAgc3VwcGFydCA9IFsKKyAgICAgICAgICAoMSwgMTApLCAoMSwgMjApLCAoMiwgMjApLCAoMywgMzApCisgICAgICAgIF0KKworICAgICAgICB4ID0gWworICAgICAgICAgIChzbmFtZSwgcG5hbWUpCisgICAgICAgICAgICBmb3IgKHNubywgc25hbWUpIGluIHN1cHBsaWVycworICAgICAgICAgICAgICBmb3IgKHBubywgcG5hbWUpIGluIHBhcnRzCisgICAgICAgICAgICAgICAgZm9yIChzcF9zbm8sIHNwX3BubykgaW4gc3VwcGFydAorICAgICAgICAgICAgICAgICAgaWYgc25vID09IHNwX3NubyBhbmQgcG5vID09IHNwX3BubworICAgICAgICBdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbKCdCb2VpbmcnLCAnQWlybGluZXInKSwgKCdCb2VpbmcnLCAnRW5naW5lJyksICgnRm9yZCcsICdFbmdpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdNYWNkb25hbGRzJywgJ0NoZWVzZWJ1cmdlcicpXSkKKworICAgIGRlZiB0ZXN0R2VuZXhwcyhzZWxmKToKKyAgICAgICAgIyBnZW5lcmF0b3IgZXhwcmVzc2lvbiB0ZXN0cworICAgICAgICBnID0gKFt4IGZvciB4IGluIHJhbmdlKDEwKV0gZm9yIHggaW4gcmFuZ2UoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5uZXh0KCksIFt4IGZvciB4IGluIHJhbmdlKDEwKV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGcubmV4dCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uJykKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZyA9IChhIGZvciBkIGluIGEpCisgICAgICAgICAgICBnLm5leHQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzaG91bGQgcHJvZHVjZSBUeXBlRXJyb3InKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJyksIFsoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eSddKQorCisgICAgICAgIGEgPSBbeCBmb3IgeCBpbiByYW5nZSgxMCldCisgICAgICAgIGIgPSAoeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiBhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYiksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KioyIGZvciB4IGluIHJhbmdlKDEwKSksIHN1bShbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIpLCBzdW0oW3gqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gcmFuZ2UoMTApKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiBbeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpXSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkpIGlmIFRydWUpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpIGlmIEZhbHNlKSBpZiBUcnVlKSwgMCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmb28oeCBmb3IgeCBpbiByYW5nZSgxMCksIDEwMCkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbygxMDAsIHggZm9yIHggaW4gcmFuZ2UoMTApKSIpCisKKyAgICBkZWYgdGVzdENvbXByZWhlbnNpb25TcGVjaWFscyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGZvciBvdXRtb3N0IGl0ZXJhYmxlIHByZWNvbXB1dGF0aW9uCisgICAgICAgIHggPSAxMDsgZyA9IChpIGZvciBpIGluIHJhbmdlKHgpKTsgeCA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChnKSksIDEwKQorCisgICAgICAgICMgVGhpcyBzaG91bGQgaG9sZCwgc2luY2Ugd2UncmUgb25seSBwcmVjb21wdXRpbmcgb3V0bW9zdCBpdGVyYWJsZS4KKyAgICAgICAgeCA9IDEwOyB0ID0gRmFsc2U7IGcgPSAoKGksaikgZm9yIGkgaW4gcmFuZ2UoeCkgaWYgdCBmb3IgaiBpbiByYW5nZSh4KSkKKyAgICAgICAgeCA9IDU7IHQgPSBUcnVlOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSxqKSBmb3IgaSBpbiByYW5nZSgxMCkgZm9yIGogaW4gcmFuZ2UoNSldLCBsaXN0KGcpKQorCisgICAgICAgICMgR3JhbW1hciBhbGxvd3MgbXVsdGlwbGUgYWRqYWNlbnQgJ2lmJ3MgaW4gbGlzdGNvbXBzIGFuZCBnZW5leHBzLAorICAgICAgICAjIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMpLCBbMSwgNSwgN10pCisKKyAgICAgICAgIyB2ZXJpZnkgdW5wYWNraW5nIHNpbmdsZSBlbGVtZW50IHR1cGxlcyBpbiBsaXN0Y29tcC9nZW5leHAuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3ggZm9yIHgsIGluIFsoNCwpLCAoNSwpLCAoNiwpXV0sIFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHggZm9yIHgsIGluIFsoNywpLCAoOCwpLCAoOSwpXSksIFs3LCA4LCA5XSkKKworICAgIGRlZiB0ZXN0SWZFbHNlRXhwcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCisgICAgICAgIGRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKKyAgICAgICAgICAgICJoZWxwZXIgdG8gY2hlY2sgdGhhdCBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIGlzIGRvbmUgY29ycmVjdGx5IgorICAgICAgICAgICAgcHJpbnQgeAorICAgICAgICAgICAgcmV0dXJuIHJldAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gbGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gKGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSkgaWYgeCgpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoRmFsc2UpIGZvciB4IGluIChsYW1iZGEgeDogRmFsc2UgaWYgeCBlbHNlIFRydWUsIGxhbWJkYSB4OiBUcnVlIGlmIHggZWxzZSBGYWxzZSkgaWYgeChGYWxzZSkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayAxIiwgMCkpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChfY2hlY2tldmFsKCJjaGVjayAyIiwgMCkgaWYgMCBlbHNlIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGFuZCA2IGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoKDUgYW5kIDYpIGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgKDYgaWYgMSBlbHNlIDEpKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciBfY2hlY2tldmFsKCJjaGVjayAzIiwgMikgaWYgMCBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxIG9yIF9jaGVja2V2YWwoImNoZWNrIDQiLCAyKSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNSIsIDMpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciA1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA2IiwgMykpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAxIGVsc2UgMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgKyAxIGlmIDEgZWxzZSAyKSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAtIDEgaWYgMSBlbHNlIDIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICogMiBpZiAxIGVsc2UgNCksIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IC8gMiBpZiAxIGVsc2UgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgPCA0IGlmIDAgZWxzZSAyKSwgMikKIAogCi1wcmludCAnYXRvbXMnCi0jIyMgYXRvbTogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIFt0ZXN0bGlzdF0gJ10nIHwgJ3snIFtkaWN0c2V0bWFrZXJdICd9JyB8IE5BTUUgfCBOVU1CRVIgfCBTVFJJTkcKLSMjIyBkaWN0c2V0bWFrZXI6ICh0ZXN0ICc6JyB0ZXN0ICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSB8ICh0ZXN0ICgnLCcgdGVzdCkqIFsnLCddKQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUb2tlblRlc3RzLCBHcmFtbWFyVGVzdHMpCiAKLXggPSAoMSkKLXggPSAoMSBvciAyIG9yIDMpCi14ID0gKDEgb3IgMiBvciAzLCAyLCAzKQotCi14ID0gW10KLXggPSBbMV0KLXggPSBbMSBvciAyIG9yIDNdCi14ID0gWzEgb3IgMiBvciAzLCAyLCAzXQoteCA9IFtdCi0KLXggPSB7fQoteCA9IHsnb25lJzogMX0KLXggPSB7J29uZSc6IDEsfQoteCA9IHsnb25lJyBvciAndHdvJzogMSBvciAyfQoteCA9IHsnb25lJzogMSwgJ3R3byc6IDJ9Ci14ID0geydvbmUnOiAxLCAndHdvJzogMix9Ci14ID0geydvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMywgJ2ZvdXInOiA0LCAnZml2ZSc6IDUsICdzaXgnOiA2fQotCi14ID0geydvbmUnfQoteCA9IHsnb25lJywgMSx9Ci14ID0geydvbmUnLCAndHdvJywgJ3RocmVlJ30KLXggPSB7MiwgMywgNCx9Ci0KLXggPSB4Ci14ID0gJ3gnCi14ID0gMTIzCi0KLSMjIyBleHBybGlzdDogZXhwciAoJywnIGV4cHIpKiBbJywnXQotIyMjIHRlc3RsaXN0OiB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddCi0jIFRoZXNlIGhhdmUgYmVlbiBleGVyY2lzZWQgZW5vdWdoIGFib3ZlCi0KLXByaW50ICdjbGFzc2RlZicgIyAnY2xhc3MnIE5BTUUgWycoJyBbdGVzdGxpc3RdICcpJ10gJzonIHN1aXRlCi1jbGFzcyBCOiBwYXNzCi1jbGFzcyBCMigpOiBwYXNzCi1jbGFzcyBDMShCKTogcGFzcwotY2xhc3MgQzIoQik6IHBhc3MKLWNsYXNzIEQoQzEsIEMyLCBCKTogcGFzcwotY2xhc3MgQzoKLSAgICBkZWYgbWV0aDEoc2VsZik6IHBhc3MKLSAgICBkZWYgbWV0aDIoc2VsZiwgYXJnKTogcGFzcwotICAgIGRlZiBtZXRoMyhzZWxmLCBhMSwgYTIpOiBwYXNzCi0KLSMgbGlzdCBjb21wcmVoZW5zaW9uIHRlc3RzCi1udW1zID0gWzEsIDIsIDMsIDQsIDVdCi1zdHJzID0gWyJBcHBsZSIsICJCYW5hbmEiLCAiQ29jb251dCJdCi1zcGNzID0gWyIgIEFwcGxlIiwgIiBCYW5hbmEgIiwgIkNvY28gIG51dCAgIl0KLQotcHJpbnQgW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGNzXQotcHJpbnQgWzMgKiB4IGZvciB4IGluIG51bXNdCi1wcmludCBbeCBmb3IgeCBpbiBudW1zIGlmIHggPiAyXQotcHJpbnQgWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdCi1wcmludCBbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gW2YgZm9yIGYgaW4gc3RycyBpZiAibiIgaW4gZl1dCi1wcmludCBbKGxhbWJkYSBhOlthKippIGZvciBpIGluIHJhbmdlKGErMSldKShqKSBmb3IgaiBpbiByYW5nZSg1KV0KLQotZGVmIHRlc3RfaW5fZnVuYyhsKToKLSAgICByZXR1cm4gWzAgPCB4IDwgMyBmb3IgeCBpbiBsIGlmIHggPiAyXQotCi1wcmludCB0ZXN0X2luX2Z1bmMobnVtcykKLQotZGVmIHRlc3RfbmVzdGVkX2Zyb250KCk6Ci0gICAgcHJpbnQgW1t5IGZvciB5IGluIFt4LCB4ICsgMV1dIGZvciB4IGluIFsxLDMsNV1dCi0KLXRlc3RfbmVzdGVkX2Zyb250KCkKLQotY2hlY2tfc3ludGF4KCJbaSwgcyBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdIikKLWNoZWNrX3N5bnRheCgiW3ggaWYgeV0iKQotCi1zdXBwbGllcnMgPSBbCi0gICgxLCAiQm9laW5nIiksCi0gICgyLCAiRm9yZCIpLAotICAoMywgIk1hY2RvbmFsZHMiKQotXQotCi1wYXJ0cyA9IFsKLSAgKDEwLCAiQWlybGluZXIiKSwKLSAgKDIwLCAiRW5naW5lIiksCi0gICgzMCwgIkNoZWVzZWJ1cmdlciIpCi1dCi0KLXN1cHBhcnQgPSBbCi0gICgxLCAxMCksICgxLCAyMCksICgyLCAyMCksICgzLCAzMCkKLV0KLQotcHJpbnQgWwotICAoc25hbWUsIHBuYW1lKQotICAgIGZvciAoc25vLCBzbmFtZSkgaW4gc3VwcGxpZXJzCi0gICAgICBmb3IgKHBubywgcG5hbWUpIGluIHBhcnRzCi0gICAgICAgIGZvciAoc3Bfc25vLCBzcF9wbm8pIGluIHN1cHBhcnQKLSAgICAgICAgICBpZiBzbm8gPT0gc3Bfc25vIGFuZCBwbm8gPT0gc3BfcG5vCi1dCi0KLSMgZ2VuZXJhdG9yIGV4cHJlc3Npb24gdGVzdHMKLWcgPSAoW3ggZm9yIHggaW4gcmFuZ2UoMTApXSBmb3IgeCBpbiByYW5nZSgxKSkKLXZlcmlmeShnLm5leHQoKSA9PSBbeCBmb3IgeCBpbiByYW5nZSgxMCldKQotdHJ5OgotICAgIGcubmV4dCgpCi0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3Nob3VsZCBwcm9kdWNlIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uJwotZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgcGFzcwotCi1hID0gMQotdHJ5OgotICAgIGcgPSAoYSBmb3IgZCBpbiBhKQotICAgIGcubmV4dCgpCi0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3Nob3VsZCBwcm9kdWNlIFR5cGVFcnJvcicKLWV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgcGFzcwotCi12ZXJpZnkobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJykgPT0gWyh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnXSkKLXZlcmlmeShsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eScpID09IFsoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknXSkKLQotYSA9IFt4IGZvciB4IGluIHJhbmdlKDEwKV0KLWIgPSAoeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiBhKSkKLXZlcmlmeShzdW0oYikgPT0gc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQotCi12ZXJpZnkoc3VtKHgqKjIgZm9yIHggaW4gcmFuZ2UoMTApKSA9PSBzdW0oW3gqKjIgZm9yIHggaW4gcmFuZ2UoMTApXSkpCi12ZXJpZnkoc3VtKHgqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyKSA9PSBzdW0oW3gqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyXSkpCi12ZXJpZnkoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gcmFuZ2UoMTApKSkgPT0gc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQotdmVyaWZ5KHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSkpKSA9PSBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCi12ZXJpZnkoc3VtKHggZm9yIHggaW4gW3kgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApKV0pID09IHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKLXZlcmlmeShzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkpIGlmIFRydWUpID09IHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKLXZlcmlmeShzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkgaWYgRmFsc2UpIGlmIFRydWUpID09IDApCi1jaGVja19zeW50YXgoImZvbyh4IGZvciB4IGluIHJhbmdlKDEwKSwgMTAwKSIpCi1jaGVja19zeW50YXgoImZvbygxMDAsIHggZm9yIHggaW4gcmFuZ2UoMTApKSIpCi0KLSMgdGVzdCBmb3Igb3V0bW9zdCBpdGVyYWJsZSBwcmVjb21wdXRhdGlvbgoteCA9IDEwOyBnID0gKGkgZm9yIGkgaW4gcmFuZ2UoeCkpOyB4ID0gNQotdmVyaWZ5KGxlbihsaXN0KGcpKSA9PSAxMCkKLQotIyBUaGlzIHNob3VsZCBob2xkLCBzaW5jZSB3ZSdyZSBvbmx5IHByZWNvbXB1dGluZyBvdXRtb3N0IGl0ZXJhYmxlLgoteCA9IDEwOyB0ID0gRmFsc2U7IGcgPSAoKGksaikgZm9yIGkgaW4gcmFuZ2UoeCkgaWYgdCBmb3IgaiBpbiByYW5nZSh4KSkKLXggPSA1OyB0ID0gVHJ1ZTsKLXZlcmlmeShbKGksaikgZm9yIGkgaW4gcmFuZ2UoMTApIGZvciBqIGluIHJhbmdlKDUpXSA9PSBsaXN0KGcpKQotCi0jIEdyYW1tYXIgYWxsb3dzIG11bHRpcGxlIGFkamFjZW50ICdpZidzIGluIGxpc3Rjb21wcyBhbmQgZ2VuZXhwcywKLSMgZXZlbiB0aG91Z2ggaXQncyBzaWxseS4gTWFrZSBzdXJlIGl0IHdvcmtzIChpZmVsc2UgYnJva2UgdGhpcy4pCi12ZXJpZnkoWyB4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyBdLCBbMSwgNSwgN10pCi12ZXJpZnkoKHggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHggJSAyIGlmIHggJSAzKSwgWzEsIDUsIDddKQotCi0jIFRlc3QgaWZlbHNlIGV4cHJlc3Npb25zIGluIHZhcmlvdXMgY2FzZXMKLWRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKLSAgICAiaGVscGVyIHRvIGNoZWNrIHRoYXQgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBkb25lIGNvcnJlY3RseSIKLSAgICBwcmludCB4Ci0gICAgcmV0dXJuIHJldAotCi12ZXJpZnkoWyB4KCkgZm9yIHggaW4gbGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlIGlmIHgoKSBdID09IFtUcnVlXSkKLXZlcmlmeShbIHgoKSBmb3IgeCBpbiAobGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlKSBpZiB4KCkgXSA9PSBbVHJ1ZV0pCi12ZXJpZnkoWyB4KEZhbHNlKSBmb3IgeCBpbiAobGFtYmRhIHg6IEZhbHNlIGlmIHggZWxzZSBUcnVlLCBsYW1iZGEgeDogVHJ1ZSBpZiB4IGVsc2UgRmFsc2UpIGlmIHgoRmFsc2UpIF0gPT0gW1RydWVdKQotdmVyaWZ5KCg1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayAxIiwgMCkpID09IDUpCi12ZXJpZnkoKF9jaGVja2V2YWwoImNoZWNrIDIiLCAwKSBpZiAwIGVsc2UgNSkgPT0gNSkKLXZlcmlmeSgoNSBhbmQgNiBpZiAwIGVsc2UgMSkgPT0gMSkKLXZlcmlmeSgoKDUgYW5kIDYpIGlmIDAgZWxzZSAxKSA9PSAxKQotdmVyaWZ5KCg1IGFuZCAoNiBpZiAxIGVsc2UgMSkpID09IDYpCi12ZXJpZnkoKDAgb3IgX2NoZWNrZXZhbCgiY2hlY2sgMyIsIDIpIGlmIDAgZWxzZSAzKSA9PSAzKQotdmVyaWZ5KCgxIG9yIF9jaGVja2V2YWwoImNoZWNrIDQiLCAyKSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNSIsIDMpKSA9PSAxKQotdmVyaWZ5KCgwIG9yIDUgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDYiLCAzKSkgPT0gNSkKLXZlcmlmeSgobm90IDUgaWYgMSBlbHNlIDEpID09IEZhbHNlKQotdmVyaWZ5KChub3QgNSBpZiAwIGVsc2UgMSkgPT0gMSkKLXZlcmlmeSgoNiArIDEgaWYgMSBlbHNlIDIpID09IDcpCi12ZXJpZnkoKDYgLSAxIGlmIDEgZWxzZSAyKSA9PSA1KQotdmVyaWZ5KCg2ICogMiBpZiAxIGVsc2UgNCkgPT0gMTIpCi12ZXJpZnkoKDYgLyAyIGlmIDEgZWxzZSAzKSA9PSAzKQotdmVyaWZ5KCg2IDwgNCBpZiAwIGVsc2UgMikgPT0gMikKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weSBiL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQppbmRleCAwZjhlMDNlLi45OTg5YTkyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2d6aXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nemlwLnB5CkBAIC0xMjgsNiArMTI4LDE3IEBACiAgICAgICAgICAgICBmLnNlZWsobmV3cG9zKSAgIyBwb3NpdGl2ZSBzZWVrCiAgICAgICAgIGYuY2xvc2UoKQogCisgICAgZGVmIHRlc3Rfc2Vla193aGVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgICMgVHJ5IHNlZWsod2hlbmNlPTEpLCByZWFkIHRlc3QKKworICAgICAgICBmID0gZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lKQorICAgICAgICBmLnJlYWQoMTApCisgICAgICAgIGYuc2VlaygxMCwgd2hlbmNlPTEpCisgICAgICAgIHkgPSBmLnJlYWQoMTApCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5LCBkYXRhMVsyMDozMF0pCisgICAgICAgIAogICAgIGRlZiB0ZXN0X3NlZWtfd3JpdGUoc2VsZik6CiAgICAgICAgICMgVHJ5IHNlZWssIHdyaXRlIHRlc3QKICAgICAgICAgZiA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3cnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CmluZGV4IDkwYmFlODguLjkwYTRlNTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKQEAgLTEwLDkgKzEwLDEwIEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQsIGZpbGVjbGFzcz1TdHJpbmdJTy5TdHJpbmdJTyk6CiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKICAgICAgICAgc2VsZi5maWxlY2xhc3MgPSBmaWxlY2xhc3MKKyAgICAgICAgc2VsZi5kYXRhID0gJycKIAogICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYuZGF0YSArPSBkYXRhCiAKICAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZSwgYnVmc2l6ZT1Ob25lKToKICAgICAgICAgaWYgbW9kZSAhPSAncicgYW5kIG1vZGUgIT0gJ3JiJzoKQEAgLTcwLDEwMyArNzEsODYgQEAKICAgICAgICAgICAgICAgICBjb25uLnJlcXVlc3QoJ1BPU1QnLCAnLycsIGJvZHksIGhlYWRlcnMpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLl9idWZmZXIuY291bnRbaGVhZGVyLmxvd2VyKCldLCAxKQogCi0jIENvbGxlY3Qgb3V0cHV0IHRvIGEgYnVmZmVyIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb3BlIHdpdGggbGluZS1lbmRpbmcKLSMgaXNzdWVzIGFjcm9zcyBwbGF0Zm9ybXMuICBTcGVjaWZpY2FsbHksIHRoZSBoZWFkZXJzIHdpbGwgaGF2ZSBcclxuIHBhaXJzCi0jIGFuZCBzb21lIHBsYXRmb3JtcyB3aWxsIHN0cmlwIHRoZW0gZnJvbSB0aGUgb3V0cHV0IGZpbGUuCitjbGFzcyBCYXNpY1Rlc3QoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3N0YXR1c19saW5lcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IEhUVFAgc3RhdHVzIGxpbmVzCiAKLWRlZiB0ZXN0KCk6Ci0gICAgYnVmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQotICAgIF9zdGRvdXQgPSBzeXMuc3Rkb3V0Ci0gICAgdHJ5OgotICAgICAgICBzeXMuc3Rkb3V0ID0gYnVmCi0gICAgICAgIF90ZXN0KCkKLSAgICBmaW5hbGx5OgotICAgICAgICBzeXMuc3Rkb3V0ID0gX3N0ZG91dAotCi0gICAgIyBwcmludCBpbmRpdmlkdWFsIGxpbmVzIHdpdGggZW5kaW5ncyBzdHJpcHBlZAotICAgIHMgPSBidWYuZ2V0dmFsdWUoKQotICAgIGZvciBsaW5lIGluIHMuc3BsaXQoIlxuIik6Ci0gICAgICAgIHByaW50IGxpbmUuc3RyaXAoKQotCi1kZWYgX3Rlc3QoKToKLSAgICAjIFRlc3QgSFRUUCBzdGF0dXMgbGluZXMKLQotICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rXHJcblxyXG5UZXh0IgotICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCi0gICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIDEpCi0gICAgcmVzcC5iZWdpbigpCi0gICAgcHJpbnQgcmVzcC5yZWFkKCkKLSAgICByZXNwLmNsb3NlKCkKLQotICAgIGJvZHkgPSAiSFRUUC8xLjEgNDAwLjEwMCBOb3QgT2tcclxuXHJcblRleHQiCi0gICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKLSAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgMSkKLSAgICB0cnk6CisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rXHJcblxyXG5UZXh0IgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKICAgICAgICAgcmVzcC5iZWdpbigpCi0gICAgZXhjZXB0IGh0dHBsaWIuQmFkU3RhdHVzTGluZToKLSAgICAgICAgcHJpbnQgIkJhZFN0YXR1c0xpbmUgcmFpc2VkIGFzIGV4cGVjdGVkIgotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJFeHBlY3QgQmFkU3RhdHVzTGluZSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoKSwgJ1RleHQnKQorICAgICAgICByZXNwLmNsb3NlKCkKIAotICAgICMgQ2hlY2sgaW52YWxpZCBob3N0X3BvcnQKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSA0MDAuMTAwIE5vdCBPa1xyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuQmFkU3RhdHVzTGluZSwgcmVzcC5iZWdpbikKIAotICAgIGZvciBocCBpbiAoInd3dy5weXRob24ub3JnOmFiYyIsICJ3d3cucHl0aG9uLm9yZzoiKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaCA9IGh0dHBsaWIuSFRUUChocCkKLSAgICAgICAgZXhjZXB0IGh0dHBsaWIuSW52YWxpZFVSTDoKLSAgICAgICAgICAgIHByaW50ICJJbnZhbGlkVVJMIHJhaXNlZCBhcyBleHBlY3RlZCIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICJFeHBlY3QgSW52YWxpZFVSTCIKKyAgICBkZWYgdGVzdF9ob3N0X3BvcnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgaW52YWxpZCBob3N0X3BvcnQKIAotICAgIGZvciBocCxoLHAgaW4gKCgiW2ZlODA6OjIwNzplOWZmOmZlOWJdOjgwMDAiLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsIDgwMDApLAotICAgICAgICAgICAgICAgICAgICgid3d3LnB5dGhvbi5vcmc6ODAiLCAid3d3LnB5dGhvbi5vcmciLCA4MCksCi0gICAgICAgICAgICAgICAgICAgKCJ3d3cucHl0aG9uLm9yZyIsICJ3d3cucHl0aG9uLm9yZyIsIDgwKSwKLSAgICAgICAgICAgICAgICAgICAoIltmZTgwOjoyMDc6ZTlmZjpmZTliXSIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwgODApKToKLSAgICAgICAgdHJ5OgorICAgICAgICBmb3IgaHAgaW4gKCJ3d3cucHl0aG9uLm9yZzphYmMiLCAid3d3LnB5dGhvbi5vcmc6Iik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhodHRwbGliLkludmFsaWRVUkwsIGh0dHBsaWIuSFRUUCwgaHApCisKKyAgICAgICAgZm9yIGhwLCBoLCBwIGluICgoIltmZTgwOjoyMDc6ZTlmZjpmZTliXTo4MDAwIiwgImZlODA6OjIwNzplOWZmOmZlOWIiLCA4MDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInd3dy5weXRob24ub3JnOjgwIiwgInd3dy5weXRob24ub3JnIiwgODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgid3d3LnB5dGhvbi5vcmciLCAid3d3LnB5dGhvbi5vcmciLCA4MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl0iLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsIDgwKSk6CiAgICAgICAgICAgICBodHRwID0gaHR0cGxpYi5IVFRQKGhwKQotICAgICAgICBleGNlcHQgaHR0cGxpYi5JbnZhbGlkVVJMOgotICAgICAgICAgICAgcHJpbnQgIkludmFsaWRVUkwgcmFpc2VkIGVycm9uZW91c2x5IgotICAgICAgICBjID0gaHR0cC5fY29ubgotICAgICAgICBpZiBoICE9IGMuaG9zdDogcmFpc2UgQXNzZXJ0aW9uRXJyb3IsICgiSG9zdCBpbmNvcnJlY3RseSBwYXJzZWQiLCBoLCBjLmhvc3QpCi0gICAgICAgIGlmIHAgIT0gYy5wb3J0OiByYWlzZSBBc3NlcnRpb25FcnJvciwgKCJQb3J0IGluY29ycmVjdGx5IHBhcnNlZCIsIHAsIGMuaG9zdCkKKyAgICAgICAgICAgIGMgPSBodHRwLl9jb25uCisgICAgICAgICAgICBpZiBoICE9IGMuaG9zdDogc2VsZi5mYWlsKCJIb3N0IGluY29ycmVjdGx5IHBhcnNlZDogJXMgIT0gJXMiICUgKGgsIGMuaG9zdCkpCisgICAgICAgICAgICBpZiBwICE9IGMucG9ydDogc2VsZi5mYWlsKCJQb3J0IGluY29ycmVjdGx5IHBhcnNlZDogJXMgIT0gJXMiICUgKHAsIGMuaG9zdCkpCiAKLSAgICAjIHRlc3QgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBtZXNzYWdlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBmaWVsZCBuYW1lLgotICAgIHRleHQgPSAoJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCi0gICAgICAgICAgICAnU2V0LUNvb2tpZTogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiXHJcbicKLSAgICAgICAgICAgICdTZXQtQ29va2llOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsnCi0gICAgICAgICAgICAnIFBhdGg9Ii9hY21lIlxyXG4nCi0gICAgICAgICAgICAnXHJcbicKLSAgICAgICAgICAgICdObyBib2R5XHJcbicpCi0gICAgaGRyID0gKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInCi0gICAgICAgICAgICcsICcKLSAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQotICAgIHMgPSBGYWtlU29ja2V0KHRleHQpCi0gICAgciA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHMsIDEpCi0gICAgci5iZWdpbigpCi0gICAgY29va2llcyA9IHIuZ2V0aGVhZGVyKCJTZXQtQ29va2llIikKLSAgICBpZiBjb29raWVzICE9IGhkcjoKLSAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IsICJtdWx0aXBsZSBoZWFkZXJzIG5vdCBjb21iaW5lZCBwcm9wZXJseSIKKyAgICBkZWYgdGVzdF9yZXNwb25zZV9oZWFkZXJzKHNlbGYpOgorICAgICAgICAjIHRlc3QgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBtZXNzYWdlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBmaWVsZCBuYW1lLgorICAgICAgICB0ZXh0ID0gKCdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgICAgICdTZXQtQ29va2llOiBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSJcclxuJworICAgICAgICAgICAgICAgICdTZXQtQ29va2llOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsnCisgICAgICAgICAgICAgICAgJyBQYXRoPSIvYWNtZSJcclxuJworICAgICAgICAgICAgICAgICdcclxuJworICAgICAgICAgICAgICAgICdObyBib2R5XHJcbicpCisgICAgICAgIGhkciA9ICgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJworICAgICAgICAgICAgICAgJywgJworICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQorICAgICAgICBzID0gRmFrZVNvY2tldCh0ZXh0KQorICAgICAgICByID0gaHR0cGxpYi5IVFRQUmVzcG9uc2UocykKKyAgICAgICAgci5iZWdpbigpCisgICAgICAgIGNvb2tpZXMgPSByLmdldGhlYWRlcigiU2V0LUNvb2tpZSIpCisgICAgICAgIGlmIGNvb2tpZXMgIT0gaGRyOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJtdWx0aXBsZSBoZWFkZXJzIG5vdCBjb21iaW5lZCBwcm9wZXJseSIpCiAKLSAgICAjIFRlc3QgdGhhdCB0aGUgbGlicmFyeSBkb2Vzbid0IGF0dGVtcHQgdG8gcmVhZCBhbnkgZGF0YQotICAgICMgZnJvbSBhIEhFQUQgcmVxdWVzdC4gIChUaWNrbGVzIFNGIGJ1ZyAjNjIyMDQyLikKLSAgICBzb2NrID0gRmFrZVNvY2tldCgKLSAgICAgICAgJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCi0gICAgICAgICdDb250ZW50LUxlbmd0aDogMTQ0MzJcclxuJwotICAgICAgICAnXHJcbicsCi0gICAgICAgIE5vRU9GU3RyaW5nSU8pCi0gICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIDEsIG1ldGhvZD0iSEVBRCIpCi0gICAgcmVzcC5iZWdpbigpCi0gICAgaWYgcmVzcC5yZWFkKCkgIT0gIiI6Ci0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAiRGlkIG5vdCBleHBlY3QgcmVzcG9uc2UgZnJvbSBIRUFEIHJlcXVlc3QiCi0gICAgcmVzcC5jbG9zZSgpCisgICAgZGVmIHRlc3RfcmVhZF9oZWFkKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgbGlicmFyeSBkb2Vzbid0IGF0dGVtcHQgdG8gcmVhZCBhbnkgZGF0YQorICAgICAgICAjIGZyb20gYSBIRUFEIHJlcXVlc3QuICAoVGlja2xlcyBTRiBidWcgIzYyMjA0Mi4pCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KAorICAgICAgICAgICAgJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCisgICAgICAgICAgICAnQ29udGVudC1MZW5ndGg6IDE0NDMyXHJcbicKKyAgICAgICAgICAgICdcclxuJywKKyAgICAgICAgICAgIE5vRU9GU3RyaW5nSU8pCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCBtZXRob2Q9IkhFQUQiKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgaWYgcmVzcC5yZWFkKCkgIT0gIiI6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgZXhwZWN0IHJlc3BvbnNlIGZyb20gSEVBRCByZXF1ZXN0IikKKyAgICAgICAgcmVzcC5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9zZW5kX2ZpbGUoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ0dFVCAvZm9vIEhUVFAvMS4xXHJcbkhvc3Q6IGV4YW1wbGUuY29tXHJcbicgXAorICAgICAgICAgICAgICAgICAgICdBY2NlcHQtRW5jb2Rpbmc6IGlkZW50aXR5XHJcbkNvbnRlbnQtTGVuZ3RoOicKKworICAgICAgICBib2R5ID0gb3BlbihfX2ZpbGVfXywgJ3JiJykKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgY29ubi5zb2NrID0gc29jaworICAgICAgICBjb25uLnJlcXVlc3QoJ0dFVCcsICcvZm9vJywgYm9keSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2suZGF0YS5zdGFydHN3aXRoKGV4cGVjdGVkKSkKIAogY2xhc3MgT2ZmbGluZVRlc3QoVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3Jlc3BvbnNlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaHR0cGxpYi5yZXNwb25zZXNbaHR0cGxpYi5OT1RfRk9VTkRdLCAiTm90IEZvdW5kIikKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgotICAgIHRlc3RzID0gW0hlYWRlclRlc3RzLE9mZmxpbmVUZXN0XQotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSGVhZGVyVGVzdHMsIE9mZmxpbmVUZXN0LCBCYXNpY1Rlc3QpCiAKLXRlc3QoKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXAucHkgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQppbmRleCA4OTNiYTI0Li42MmIxNGUwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQpAQCAtMSw0MyArMSw0NyBAQAogaW1wb3J0IGltcAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgVGVzdFNraXBwZWQKLXRyeToKLSAgICBpbXBvcnQgdGhyZWFkCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcmFpc2UgVGVzdFNraXBwZWQoInRlc3Qgb25seSB2YWxpZCB3aGVuIHRocmVhZCBzdXBwb3J0IGlzIGF2YWlsYWJsZSIpCitpbXBvcnQgdGhyZWFkCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLWRlZiB2ZXJpZnlfbG9ja19zdGF0ZShleHBlY3RlZCk6Ci0gICAgaWYgaW1wLmxvY2tfaGVsZCgpICE9IGV4cGVjdGVkOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCBpbXAubG9ja19oZWxkKCkgdG8gYmUgJXIiICUgZXhwZWN0ZWQpCiAKLWRlZiB0ZXN0TG9jaygpOgotICAgIExPT1BTID0gNTAKK2NsYXNzIExvY2tUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICAjIFRoZSBpbXBvcnQgbG9jayBtYXkgYWxyZWFkeSBiZSBoZWxkLCBlLmcuIGlmIHRoZSB0ZXN0IHN1aXRlIGlzIHJ1bgotICAgICMgdmlhICJpbXBvcnQgdGVzdC5hdXRvdGVzdCIuCi0gICAgbG9ja19oZWxkX2F0X3N0YXJ0ID0gaW1wLmxvY2tfaGVsZCgpCi0gICAgdmVyaWZ5X2xvY2tfc3RhdGUobG9ja19oZWxkX2F0X3N0YXJ0KQorICAgICIiIlZlcnkgYmFzaWMgdGVzdCBvZiBpbXBvcnQgbG9jayBmdW5jdGlvbnMuIiIiCiAKLSAgICBmb3IgaSBpbiByYW5nZShMT09QUyk6Ci0gICAgICAgIGltcC5hY3F1aXJlX2xvY2soKQotICAgICAgICB2ZXJpZnlfbG9ja19zdGF0ZShUcnVlKQorICAgIGRlZiB2ZXJpZnlfbG9ja19zdGF0ZShzZWxmLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGltcC5sb2NrX2hlbGQoKSwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpbXAubG9ja19oZWxkKCkgdG8gYmUgJXIiICUgZXhwZWN0ZWQpCisgICAgZGVmIHRlc3RMb2NrKHNlbGYpOgorICAgICAgICBMT09QUyA9IDUwCiAKLSAgICBmb3IgaSBpbiByYW5nZShMT09QUyk6Ci0gICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorICAgICAgICAjIFRoZSBpbXBvcnQgbG9jayBtYXkgYWxyZWFkeSBiZSBoZWxkLCBlLmcuIGlmIHRoZSB0ZXN0IHN1aXRlIGlzIHJ1bgorICAgICAgICAjIHZpYSAiaW1wb3J0IHRlc3QuYXV0b3Rlc3QiLgorICAgICAgICBsb2NrX2hlbGRfYXRfc3RhcnQgPSBpbXAubG9ja19oZWxkKCkKKyAgICAgICAgc2VsZi52ZXJpZnlfbG9ja19zdGF0ZShsb2NrX2hlbGRfYXRfc3RhcnQpCiAKLSAgICAjIFRoZSBvcmlnaW5hbCBzdGF0ZSBzaG91bGQgYmUgcmVzdG9yZWQgbm93LgotICAgIHZlcmlmeV9sb2NrX3N0YXRlKGxvY2tfaGVsZF9hdF9zdGFydCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTE9PUFMpOgorICAgICAgICAgICAgaW1wLmFjcXVpcmVfbG9jaygpCisgICAgICAgICAgICBzZWxmLnZlcmlmeV9sb2NrX3N0YXRlKFRydWUpCiAKLSAgICBpZiBub3QgbG9ja19oZWxkX2F0X3N0YXJ0OgotICAgICAgICB0cnk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKExPT1BTKToKICAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQotICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgicmVsZWFzZV9sb2NrKCkgd2l0aG91dCBsb2NrIHNob3VsZCByYWlzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW50aW1lRXJyb3IiKQorCisgICAgICAgICMgVGhlIG9yaWdpbmFsIHN0YXRlIHNob3VsZCBiZSByZXN0b3JlZCBub3cuCisgICAgICAgIHNlbGYudmVyaWZ5X2xvY2tfc3RhdGUobG9ja19oZWxkX2F0X3N0YXJ0KQorCisgICAgICAgIGlmIG5vdCBsb2NrX2hlbGRfYXRfc3RhcnQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWxlYXNlX2xvY2soKSB3aXRob3V0IGxvY2sgc2hvdWxkIHJhaXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVudGltZUVycm9yIikKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3RMb2NrKCkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgICAgIExvY2tUZXN0cywKKyAgICAgICAgICAgICkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQppbmRleCBiNjRjMjNiLi5lMzczNzhmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQpAQCAtMSwyMSArMSwxMSBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBUZXN0RmFpbGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAogCitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHN5cwogaW1wb3J0IHB5X2NvbXBpbGUKIAotIyBCcmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhhdCBpbXBvcnQgaXMgY2FzZS1zZW5zaXRpdmU6ICBpZiB3ZSBnb3QgdGhpcwotIyBmYXIsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCAicmFuZG9tIiBleGlzdHMuCi10cnk6Ci0gICAgaW1wb3J0IFJBbkRvTQotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCgiaW1wb3J0IG9mIFJBbkRvTSBzaG91bGQgaGF2ZSBmYWlsZWQgKGNhc2UgbWlzbWF0Y2gpIikKLQotIyBBbm90aGVyIGJyaWVmIGRpZ3Jlc3Npb24gdG8gdGVzdCB0aGUgYWNjdXJhY3kgb2YgbWFuaWZlc3QgZmxvYXQgY29uc3RhbnRzLgotZnJvbSB0ZXN0IGltcG9ydCBkb3VibGVfY29uc3QgICMgZG9uJ3QgYmxpbmsgLS0gdGhhdCAqd2FzKiB0aGUgdGVzdAogCiBkZWYgcmVtb3ZlX2ZpbGVzKG5hbWUpOgogICAgIGZvciBmIGluIChuYW1lICsgb3MuZXh0c2VwICsgInB5IiwKQEAgLTI2LDE5OSArMTYsMjA2IEBACiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgogICAgICAgICAgICAgb3MucmVtb3ZlKGYpCiAKLWRlZiB0ZXN0X3dpdGhfZXh0ZW5zaW9uKGV4dCk6ICMgZXh0IG5vcm1hbGx5ICIucHkiOyBwZXJoYXBzICIucHl3IgotICAgIHNvdXJjZSA9IFRFU1RGTiArIGV4dAotICAgIHB5byA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweW8iCi0gICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKLSAgICAgICAgcHljID0gVEVTVEZOICsgIiRweS5jbGFzcyIKLSAgICBlbHNlOgotICAgICAgICBweWMgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHljIgogCi0gICAgZiA9IG9wZW4oc291cmNlLCAidyIpCi0gICAgcHJpbnQgPj4gZiwgIiMgVGhpcyB0ZXN0cyBQeXRob24ncyBhYmlsaXR5IHRvIGltcG9ydCBhIiwgZXh0LCAiZmlsZS4iCi0gICAgYSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKLSAgICBiID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwKQotICAgIHByaW50ID4+IGYsICJhID0iLCBhCi0gICAgcHJpbnQgPj4gZiwgImIgPSIsIGIKLSAgICBmLmNsb3NlKCkKK2NsYXNzIEltcG9ydFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgdHJ5OgorICAgIGRlZiB0ZXN0Q2FzZVNlbnNpdGl2aXR5KHNlbGYpOgorICAgICAgICAjIEJyaWVmIGRpZ3Jlc3Npb24gdG8gdGVzdCB0aGF0IGltcG9ydCBpcyBjYXNlLXNlbnNpdGl2ZTogIGlmIHdlIGdvdCB0aGlzCisgICAgICAgICMgZmFyLCB3ZSBrbm93IGZvciBzdXJlIHRoYXQgInJhbmRvbSIgZXhpc3RzLgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbXBvcnQgZnJvbSAlcyBmYWlsZWQ6ICVzIiAlIChleHQsIGVycikpCi0KLSAgICAgICAgaWYgbW9kLmEgIT0gYSBvciBtb2QuYiAhPSBiOgotICAgICAgICAgICAgcHJpbnQgYSwgIiE9IiwgbW9kLmEKLSAgICAgICAgICAgIHByaW50IGIsICIhPSIsIG1vZC5iCi0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2R1bGUgbG9hZGVkICglcykgYnV0IGNvbnRlbnRzIGludmFsaWQiICUgbW9kKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIG9zLnVubGluayhzb3VyY2UpCi0KLSAgICB0cnk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlbG9hZChtb2QpCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW1wb3J0IGZyb20gLnB5Yy8ucHlvIGZhaWxlZDogJXMiICUgZXJyKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLnVubGluayhweWMpCi0gICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MudW5saW5rKHB5bykKLSAgICAgICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBkZWwgc3lzLm1vZHVsZXNbVEVTVEZOXQotCi1zeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQotdHJ5OgotICAgIHRlc3Rfd2l0aF9leHRlbnNpb24ob3MuZXh0c2VwICsgInB5IikKLSAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6Ci0gICAgICAgIGZvciBleHQgaW4gIi5QWSIsICIuUHkiLCAiLnBZIiwgIi5weXciLCAiLlBZVyIsICIucFl3IjoKLSAgICAgICAgICAgIHRlc3Rfd2l0aF9leHRlbnNpb24oZXh0KQotZmluYWxseToKLSAgICBkZWwgc3lzLnBhdGhbMF0KLQotIyBWZXJpZnkgdGhhdCB0aGUgaW1wIG1vZHVsZSBjYW4gY29ycmVjdGx5IGxvYWQgYW5kIGZpbmQgLnB5IGZpbGVzCi1pbXBvcnQgaW1wCi14ID0gaW1wLmZpbmRfbW9kdWxlKCJvcyIpCi1vcyA9IGltcC5sb2FkX21vZHVsZSgib3MiLCAqeCkKLQotZGVmIHRlc3RfbW9kdWxlX3dpdGhfbGFyZ2Vfc3RhY2sobW9kdWxlKToKLSAgICAjIGNyZWF0ZSBtb2R1bGUgdy9saXN0IG9mIDY1MDAwIGVsZW1lbnRzIHRvIHRlc3QgYnVnICM1NjE4NTgKLSAgICBmaWxlbmFtZSA9IG1vZHVsZSArIG9zLmV4dHNlcCArICdweScKLQotICAgICMgY3JlYXRlIGEgZmlsZSB3aXRoIGEgbGlzdCBvZiA2NTAwMCBlbGVtZW50cwotICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAndysnKQotICAgIGYud3JpdGUoJ2QgPSBbXG4nKQotICAgIGZvciBpIGluIHJhbmdlKDY1MDAwKToKLSAgICAgICAgZi53cml0ZSgnIiIsXG4nKQotICAgIGYud3JpdGUoJ10nKQotICAgIGYuY2xvc2UoKQotCi0gICAgIyBjb21waWxlICYgcmVtb3ZlIC5weSBmaWxlLCB3ZSBvbmx5IG5lZWQgLnB5YyAob3IgLnB5bykKLSAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3InKQotICAgIHB5X2NvbXBpbGUuY29tcGlsZShmaWxlbmFtZSkKLSAgICBmLmNsb3NlKCkKLSAgICBvcy51bmxpbmsoZmlsZW5hbWUpCi0KLSAgICAjIG5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIGZyb20gY3VycmVudCBkaXIKLSAgICBzeXMucGF0aC5hcHBlbmQoJycpCi0KLSAgICAjIHRoaXMgdXNlZCB0byBjcmFzaAotICAgIGV4ZWMoJ2ltcG9ydCAnICsgbW9kdWxlKQotCi0gICAgIyBjbGVhbnVwCi0gICAgZGVsIHN5cy5wYXRoWy0xXQotICAgIGZvciBleHQgaW4gJ3B5YycsICdweW8nOgotICAgICAgICBmbmFtZSA9IG1vZHVsZSArIG9zLmV4dHNlcCArIGV4dAotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6Ci0gICAgICAgICAgICBvcy51bmxpbmsoZm5hbWUpCi0KLXRlc3RfbW9kdWxlX3dpdGhfbGFyZ2Vfc3RhY2soJ2xvbmdsaXN0JykKLQotZGVmIHRlc3RfZmFpbGluZ19pbXBvcnRfc3RpY2tzKCk6Ci0gICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgotICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQotICAgIHByaW50ID4+IGYsICJhID0gMS8wIgotICAgIGYuY2xvc2UoKQotCi0gICAgIyBOZXcgaW4gMi40LCB3ZSBzaG91bGRuJ3QgYmUgYWJsZSB0byBpbXBvcnQgdGhhdCBubyBtYXR0ZXIgaG93IG9mdGVuCi0gICAgIyB3ZSB0cnkuCi0gICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKLSAgICB0cnk6Ci0gICAgICAgIGZvciBpIGluIDEsIDIsIDM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCi0gICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0gICAgICAgICAgICAgICAgaWYgVEVTVEZOIGluIHN5cy5tb2R1bGVzOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJkYW1hZ2VkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyIsIGkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIndhcyBhYmxlIHRvIGltcG9ydCBhIGRhbWFnZWQgbW9kdWxlIiwgaSkKLSAgICBmaW5hbGx5OgotICAgICAgICBzeXMucGF0aC5wb3AoMCkKLSAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKLQotdGVzdF9mYWlsaW5nX2ltcG9ydF9zdGlja3MoKQotCi1kZWYgdGVzdF9mYWlsaW5nX3JlbG9hZCgpOgotICAgICMgQSBmYWlsaW5nIHJlbG9hZCBzaG91bGQgbGVhdmUgdGhlIG1vZHVsZSBvYmplY3QgaW4gc3lzLm1vZHVsZXMuCi0gICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgotICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQotICAgIHByaW50ID4+IGYsICJhID0gMSIKLSAgICBwcmludCA+PiBmLCAiYiA9IDIiCi0gICAgZi5jbG9zZSgpCi0KLSAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQotICAgIHRyeToKLSAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCi0gICAgICAgIGlmIFRFU1RGTiBub3QgaW4gc3lzLm1vZHVsZXM6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMiKQotICAgICAgICBpZiBtb2QuYSAhPSAxIG9yIG1vZC5iICE9IDI6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQotCi0gICAgICAgICMgT24gV2luWFAsIGp1c3QgcmVwbGFjaW5nIHRoZSAucHkgZmlsZSB3YXNuJ3QgZW5vdWdoIHRvCi0gICAgICAgICMgY29udmluY2UgcmVsb2FkKCkgdG8gcmVwYXJzZSBpdC4gIE1heWJlIHRoZSB0aW1lc3RhbXAgZGlkbid0Ci0gICAgICAgICMgbW92ZSBlbm91Z2guICBXZSBmb3JjZSBpdCB0byBnZXQgcmVwYXJzZWQgYnkgcmVtb3ZpbmcgdGhlCi0gICAgICAgICMgY29tcGlsZWQgZmlsZSB0b28uCi0gICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCi0KLSAgICAgICAgIyBOb3cgZGFtYWdlIHRoZSBtb2R1bGUuCi0gICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQotICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEwIgotICAgICAgICBwcmludCA+PiBmLCAiYiA9IDIwLy8wIgotICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVsb2FkKG1vZCkKLSAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgaW1wb3J0IFJBbkRvTQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ3YXMgYWJsZSB0byByZWxvYWQgYSBkYW1hZ2VkIG1vZHVsZSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBvZiBSQW5Eb00gc2hvdWxkIGhhdmUgZmFpbGVkIChjYXNlIG1pc21hdGNoKSIpCiAKLSAgICAgICAgIyBCdXQgd2Ugc3RpbGwgZXhwZWN0IHRoZSBtb2R1bGUgdG8gYmUgaW4gc3lzLm1vZHVsZXMuCi0gICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzLmdldChURVNURk4pCi0gICAgICAgIGlmIG1vZCBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiZXhwZWN0ZWQgbW9kdWxlIHRvIHN0aWxsIGJlIGluIHN5cy5tb2R1bGVzIikKLSAgICAgICAgIyBXZSBzaG91bGQgaGF2ZSByZXBsYWNlZCBhIHcvIDEwLCBidXQgdGhlIG9sZCBiIHZhbHVlIHNob3VsZAotICAgICAgICAjIHN0aWNrLgotICAgICAgICBpZiBtb2QuYSAhPSAxMCBvciBtb2QuYiAhPSAyOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKyAgICBkZWYgdGVzdERvdWJsZUNvbnN0KHNlbGYpOgorICAgICAgICAjIEFub3RoZXIgYnJpZWYgZGlncmVzc2lvbiB0byB0ZXN0IHRoZSBhY2N1cmFjeSBvZiBtYW5pZmVzdCBmbG9hdCBjb25zdGFudHMuCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgZG91YmxlX2NvbnN0ICAjIGRvbid0IGJsaW5rIC0tIHRoYXQgKndhcyogdGhlIHRlc3QKIAotICAgIGZpbmFsbHk6Ci0gICAgICAgIHN5cy5wYXRoLnBvcCgwKQotICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQotICAgICAgICBpZiBURVNURk4gaW4gc3lzLm1vZHVsZXM6Ci0gICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbVEVTVEZOXQorICAgIGRlZiB0ZXN0SW1wb3J0KHNlbGYpOgorICAgICAgICBkZWYgdGVzdF93aXRoX2V4dGVuc2lvbihleHQpOgorICAgICAgICAgICAgIyBleHQgbm9ybWFsbHkgIi5weSI7IHBlcmhhcHMgIi5weXciCisgICAgICAgICAgICBzb3VyY2UgPSBURVNURk4gKyBleHQKKyAgICAgICAgICAgIHB5byA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweW8iCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgICAgIHB5YyA9IFRFU1RGTiArICIkcHkuY2xhc3MiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHB5YyA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweWMiCiAKLXRlc3RfZmFpbGluZ19yZWxvYWQoKQorICAgICAgICAgICAgZiA9IG9wZW4oc291cmNlLCAidyIpCisgICAgICAgICAgICBwcmludCA+PiBmLCAiIyBUaGlzIHRlc3RzIFB5dGhvbidzIGFiaWxpdHkgdG8gaW1wb3J0IGEiLCBleHQsICJmaWxlLiIKKyAgICAgICAgICAgIGEgPSByYW5kb20ucmFuZHJhbmdlKDEwMDApCisgICAgICAgICAgICBiID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwKQorICAgICAgICAgICAgcHJpbnQgPj4gZiwgImEgPSIsIGEKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJiID0iLCBiCisgICAgICAgICAgICBmLmNsb3NlKCkKIAotZGVmIHRlc3RfaW1wb3J0X25hbWVfYmluZGluZygpOgotICAgICMgaW1wb3J0IHgueS56IGJpbmRzIHggaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlCi0gICAgaW1wb3J0IHRlc3QgYXMgeAotICAgIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAotICAgIGFzc2VydCB4IGlzIHRlc3QsIHguX19uYW1lX18KLSAgICBhc3NlcnQgaGFzYXR0cih0ZXN0LnRlc3Rfc3VwcG9ydCwgIl9fZmlsZV9fIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBmcm9tICVzIGZhaWxlZDogJXMiICUgKGV4dCwgZXJyKSkKIAotICAgICMgaW1wb3J0IHgueS56IGFzIHcgYmluZHMgeiBhcyB3Ci0gICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0IGFzIHkKLSAgICBhc3NlcnQgeSBpcyB0ZXN0LnRlc3Rfc3VwcG9ydCwgeS5fX25hbWVfXworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5hLCBhLAorICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGxvYWRlZCAoJXMpIGJ1dCBjb250ZW50cyBpbnZhbGlkIiAlIG1vZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2QuYiwgYiwKKyAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBsb2FkZWQgKCVzKSBidXQgY29udGVudHMgaW52YWxpZCIgJSBtb2QpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzb3VyY2UpCiAKLXRlc3RfaW1wb3J0X25hbWVfYmluZGluZygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZWxvYWQobW9kKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBmcm9tIC5weWMvLnB5byBmYWlsZWQ6ICVzIiAlIGVycikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocHljKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocHlvKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW1RFU1RGTl0KIAotZGVmIHRlc3RfaW1wb3J0X2luaXRsZXNzX2RpcmVjdG9yeV93YXJuaW5nKCk6Ci0gICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgb2xkZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Vycm9yJywgSW1wb3J0V2FybmluZyk7Ci0gICAgdHJ5OgotICAgICAgICAjIEp1c3QgYSByYW5kb20gbm9uLXBhY2thZ2UgZGlyZWN0b3J5IHdlIGFsd2F5cyBleHBlY3QgdG8gYmUKLSAgICAgICAgIyBzb21ld2hlcmUgaW4gc3lzLnBhdGguLi4KLSAgICAgICAgX19pbXBvcnRfXygic2l0ZS1wYWNrYWdlcyIpCi0gICAgZXhjZXB0IEltcG9ydFdhcm5pbmc6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcgotICAgIGZpbmFsbHk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBvbGRmaWx0ZXJzCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3Rfd2l0aF9leHRlbnNpb24ob3MuZXh0c2VwICsgInB5IikKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKToKKyAgICAgICAgICAgICAgICBmb3IgZXh0IGluICIuUFkiLCAiLlB5IiwgIi5wWSIsICIucHl3IiwgIi5QWVciLCAiLnBZdyI6CisgICAgICAgICAgICAgICAgICAgIHRlc3Rfd2l0aF9leHRlbnNpb24oZXh0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCiAKLXRlc3RfaW1wb3J0X2luaXRsZXNzX2RpcmVjdG9yeV93YXJuaW5nKCkKKyAgICBkZWYgdGVzdEltcE1vZHVsZShzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgaW1wIG1vZHVsZSBjYW4gY29ycmVjdGx5IGxvYWQgYW5kIGZpbmQgLnB5IGZpbGVzCisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgeCA9IGltcC5maW5kX21vZHVsZSgib3MiKQorICAgICAgICBvcyA9IGltcC5sb2FkX21vZHVsZSgib3MiLCAqeCkKKworICAgIGRlZiB0ZXN0X21vZHVsZV93aXRoX2xhcmdlX3N0YWNrKHNlbGYsIG1vZHVsZT0nbG9uZ2xpc3QnKToKKyAgICAgICAgIyBjcmVhdGUgbW9kdWxlIHcvbGlzdCBvZiA2NTAwMCBlbGVtZW50cyB0byB0ZXN0IGJ1ZyAjNTYxODU4CisgICAgICAgIGZpbGVuYW1lID0gbW9kdWxlICsgb3MuZXh0c2VwICsgJ3B5JworCisgICAgICAgICMgY3JlYXRlIGEgZmlsZSB3aXRoIGEgbGlzdCBvZiA2NTAwMCBlbGVtZW50cworICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3crJykKKyAgICAgICAgZi53cml0ZSgnZCA9IFtcbicpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDY1MDAwKToKKyAgICAgICAgICAgIGYud3JpdGUoJyIiLFxuJykKKyAgICAgICAgZi53cml0ZSgnXScpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgY29tcGlsZSAmIHJlbW92ZSAucHkgZmlsZSwgd2Ugb25seSBuZWVkIC5weWMgKG9yIC5weW8pCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShmaWxlbmFtZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworICAgICAgICAjIG5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIGZyb20gY3VycmVudCBkaXIKKyAgICAgICAgc3lzLnBhdGguYXBwZW5kKCcnKQorCisgICAgICAgICMgdGhpcyB1c2VkIHRvIGNyYXNoCisgICAgICAgIGV4ZWMoJ2ltcG9ydCAnICsgbW9kdWxlKQorCisgICAgICAgICMgY2xlYW51cAorICAgICAgICBkZWwgc3lzLnBhdGhbLTFdCisgICAgICAgIGZvciBleHQgaW4gJ3B5YycsICdweW8nOgorICAgICAgICAgICAgZm5hbWUgPSBtb2R1bGUgKyBvcy5leHRzZXAgKyBleHQKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuYW1lKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm5hbWUpCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX2ltcG9ydF9zdGlja3Moc2VsZik6CisgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgZiA9IG9wZW4oc291cmNlLCAidyIpCisgICAgICAgIHByaW50ID4+IGYsICJhID0gMS8wIgorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIE5ldyBpbiAyLjQsIHdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGltcG9ydCB0aGF0IG5vIG1hdHRlciBob3cgb2Z0ZW4KKyAgICAgICAgIyB3ZSB0cnkuCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIDEsIDIsIDM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIFRFU1RGTiBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZGFtYWdlZCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMgb24gJWkuIHRyeSIgJSBpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid2FzIGFibGUgdG8gaW1wb3J0IGEgZGFtYWdlZCBtb2R1bGUgb24gJWkuIHRyeSIgJSBpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnBhdGgucG9wKDApCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZmFpbGluZ19yZWxvYWQoc2VsZik6CisgICAgICAgICMgQSBmYWlsaW5nIHJlbG9hZCBzaG91bGQgbGVhdmUgdGhlIG1vZHVsZSBvYmplY3QgaW4gc3lzLm1vZHVsZXMuCisgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgZiA9IG9wZW4oc291cmNlLCAidyIpCisgICAgICAgIHByaW50ID4+IGYsICJhID0gMSIKKyAgICAgICAgcHJpbnQgPj4gZiwgImIgPSAyIgorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gc3lzLm1vZHVsZXMsICJleHBlY3RlZCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmEsIDEsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmIsIDIsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorCisgICAgICAgICAgICAjIE9uIFdpblhQLCBqdXN0IHJlcGxhY2luZyB0aGUgLnB5IGZpbGUgd2Fzbid0IGVub3VnaCB0bworICAgICAgICAgICAgIyBjb252aW5jZSByZWxvYWQoKSB0byByZXBhcnNlIGl0LiAgTWF5YmUgdGhlIHRpbWVzdGFtcCBkaWRuJ3QKKyAgICAgICAgICAgICMgbW92ZSBlbm91Z2guICBXZSBmb3JjZSBpdCB0byBnZXQgcmVwYXJzZWQgYnkgcmVtb3ZpbmcgdGhlCisgICAgICAgICAgICAjIGNvbXBpbGVkIGZpbGUgdG9vLgorICAgICAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKKworICAgICAgICAgICAgIyBOb3cgZGFtYWdlIHRoZSBtb2R1bGUuCisgICAgICAgICAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJhID0gMTAiCisgICAgICAgICAgICBwcmludCA+PiBmLCAiYiA9IDIwLy8wIgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCByZWxvYWQsIG1vZCkKKworICAgICAgICAgICAgIyBCdXQgd2Ugc3RpbGwgZXhwZWN0IHRoZSBtb2R1bGUgdG8gYmUgaW4gc3lzLm1vZHVsZXMuCisgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlcy5nZXQoVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYobW9kIGlzIE5vbmUsICJleHBlY3RlZCBtb2R1bGUgdG8gc3RpbGwgYmUgaW4gc3lzLm1vZHVsZXMiKQorCisgICAgICAgICAgICAjIFdlIHNob3VsZCBoYXZlIHJlcGxhY2VkIGEgdy8gMTAsIGJ1dCB0aGUgb2xkIGIgdmFsdWUgc2hvdWxkCisgICAgICAgICAgICAjIHN0aWNrLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmEsIDEwLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5iLCAyLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnBhdGgucG9wKDApCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorICAgICAgICAgICAgaWYgVEVTVEZOIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tURVNURk5dCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbmFtZV9iaW5kaW5nKHNlbGYpOgorICAgICAgICAjIGltcG9ydCB4LnkueiBiaW5kcyB4IGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZQorICAgICAgICBpbXBvcnQgdGVzdCBhcyB4CisgICAgICAgIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB0ZXN0LCB4Ll9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cih0ZXN0LnRlc3Rfc3VwcG9ydCwgIl9fZmlsZV9fIikpCisKKyAgICAgICAgIyBpbXBvcnQgeC55LnogYXMgdyBiaW5kcyB6IGFzIHcKKyAgICAgICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0IGFzIHkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgdGVzdC50ZXN0X3N1cHBvcnQsIHkuX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoc2VsZik6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICBvbGRmaWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQorICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Vycm9yJywgSW1wb3J0V2FybmluZyk7CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSnVzdCBhIHJhbmRvbSBub24tcGFja2FnZSBkaXJlY3Rvcnkgd2UgYWx3YXlzIGV4cGVjdCB0byBiZQorICAgICAgICAgICAgIyBzb21ld2hlcmUgaW4gc3lzLnBhdGguLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydFdhcm5pbmcsIF9faW1wb3J0X18sICJzaXRlLXBhY2thZ2VzIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBvbGRmaWx0ZXJzCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBydW5fdW5pdHRlc3QoSW1wb3J0VGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IGU1OTQ2ZTkuLjA3MWU1MjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTE4MCw3ICsxODAsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldGNvbW1lbnRzKG1vZC5TdHVwaWRHaXQpLCAnIyBsaW5lIDIwXG4nKQogCiAgICAgZGVmIHRlc3RfZ2V0bW9kdWxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIGFjdHVhbCBtb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShtb2QpLCBtb2QpCisgICAgICAgICMgQ2hlY2sgY2xhc3MgKHVzZXMgX19tb2R1bGVfXyBhdHRyaWJ1dGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kLlN0dXBpZEdpdCksIG1vZCkKKyAgICAgICAgIyBDaGVjayBhIG1ldGhvZCAobm8gX19tb2R1bGVfXyBhdHRyaWJ1dGUsIGZhbGxzIGJhY2sgdG8gZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kLlN0dXBpZEdpdC5hYnVzZSksIG1vZCkKKyAgICAgICAgIyBEbyBpdCBhZ2FpbiAoY2hlY2sgdGhlIGNhY2hpbmcgaXNuJ3QgYnJva2VuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZC5TdHVwaWRHaXQuYWJ1c2UpLCBtb2QpCisgICAgICAgICMgQ2hlY2sgYSBidWlsdGluCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUoc3RyKSwgc3lzLm1vZHVsZXNbIl9fYnVpbHRpbl9fIl0pCisgICAgICAgICMgQ2hlY2sgZmlsZW5hbWUgb3ZlcnJpZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShOb25lLCBtb2RmaWxlKSwgbW9kKQogCiAgICAgZGVmIHRlc3RfZ2V0c291cmNlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKGdpdC5hYnVzZSwgMjksIDM5KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQppbmRleCA4ZjhmYzczLi44ZTExMThhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQpAQCAtNjEsNiArNjEsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoMyknKQogICAgICAgICBjLm5leHQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdjb3VudCg0KScpCisgICAgICAgIGMgPSBjb3VudCgtOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoLTkpJykKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5leHQoKSwgLTgpCiAKICAgICBkZWYgdGVzdF9jeWNsZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDEwLCBjeWNsZSgnYWJjJykpLCBsaXN0KCdhYmNhYmNhYmNhJykpCkBAIC0zNzUsNiArMzc5LDcgQEAKIAogICAgICAgICAjIHRlc3QgdmFsdWVzIG9mIG4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0ZWUsICdhYmMnLCAnaW52YWxpZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRlZSwgW10sIC0xKQogICAgICAgICBmb3IgbiBpbiB4cmFuZ2UoNSk6CiAgICAgICAgICAgICByZXN1bHQgPSB0ZWUoJ2FiYycsIG4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgdHVwbGUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKaW5kZXggOTJmZTdhMS4uZTBjNzgxZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQpAQCAtMjQ3LDE3ICsyNDcsMjMgQEAKICAgICAgICAgICAgICJsb25nKC1zeXMubWF4aW50LTEpICE9IC1zeXMubWF4aW50LTEiKQogCiAgICAgICAgICMgbG9uZyAtPiBpbnQgc2hvdWxkIG5vdCBmYWlsIGZvciBodWdlcG9zX2FzbG9uZyBvciBodWdlbmVnX2FzbG9uZworICAgICAgICB4ID0gaW50KGh1Z2Vwb3NfYXNsb25nKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChodWdlcG9zX2FzbG9uZyksIGh1Z2Vwb3MsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGh1Z2Vwb3MsCiAgICAgICAgICAgICAgICAgICAiY29udmVydGluZyBzeXMubWF4aW50IHRvIGxvbmcgYW5kIGJhY2sgdG8gaW50IGZhaWxzIikKICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImludChsb25nKHN5cy5tYXhpbnQpKSBvdmVyZmxvd2VkISIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHgsIGludCk6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJpbnQobG9uZyhzeXMubWF4aW50KSkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgaW50IikKKyAgICAgICAgeCA9IGludChodWdlbmVnX2FzbG9uZykKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoaHVnZW5lZ19hc2xvbmcpLCBodWdlbmVnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBodWdlbmVnLAogICAgICAgICAgICAgICAgICAgImNvbnZlcnRpbmcgLXN5cy5tYXhpbnQtMSB0byBsb25nIGFuZCBiYWNrIHRvIGludCBmYWlscyIpCiAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZygtc3lzLm1heGludC0xKSkgb3ZlcmZsb3dlZCEiKQotCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHgsIGludCk6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJpbnQobG9uZygtc3lzLm1heGludC0xKSkgc2hvdWxkIGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgaW50IikKICAgICAgICAgIyBidXQgbG9uZyAtPiBpbnQgc2hvdWxkIG92ZXJmbG93IGZvciBodWdlcG9zKzEgYW5kIGh1Z2VuZWctMQogICAgICAgICB4ID0gaHVnZXBvc19hc2xvbmcgKyAxCiAgICAgICAgIHRyeToKQEAgLTI4Miw2ICsyODgsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoeSkgaXMgbG9uZywKICAgICAgICAgICAgICJvdmVyZmxvd2luZyBpbnQgY29udmVyc2lvbiBtdXN0IHJldHVybiBsb25nIG5vdCBsb25nIHN1YnR5cGUiKQogCisgICAgICAgICMgbG9uZyAtPiBQeV9zc2l6ZV90IGNvbnZlcnNpb24KKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaSwgagorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpWy01TDo3TF0sICgtNSwgNykpCisgICAgICAgICMgdXNlIHRoZSBjbGFtcGluZyBlZmZlY3QgdG8gdGVzdCB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgbG9uZ3MKKyAgICAgICAgIyB0aGF0IGZpdCBhIFB5X3NzaXplX3QKKyAgICAgICAgc2xpY2VtaW4sIHNsaWNlbWF4ID0gWCgpWy0yTCoqMTAwOjJMKioxMDBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpW3NsaWNlbWluOnNsaWNlbWF4XSwgKHNsaWNlbWluLCBzbGljZW1heCkpCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGVzdHMgb2YgYXV0byBpbnQtPmxvbmcgY29udmVyc2lvbgogCiAgICAgZGVmIHRlc3RfYXV0b19vdmVyZmxvdyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCAxODM3MzA2Li5kZWY1OGNjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC02NjYsNiArNjY2LDE5IEBACiAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKICAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCiAKKyAgICBkZWYgdGVzdF9mb2xkZXIgKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU2OTc5MDogdmVyaWZ5IHRoYXQgZm9sZGVycyByZXR1cm5lZCBieSAuZ2V0X2ZvbGRlcigpCisgICAgICAgICMgdXNlIHRoZSBzYW1lIGZhY3RvcnkgZnVuY3Rpb24uCisgICAgICAgIGRlZiBkdW1teV9mYWN0b3J5IChzKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGJveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1kdW1teV9mYWN0b3J5KQorICAgICAgICBmb2xkZXIgPSBib3guYWRkX2ZvbGRlcignZm9sZGVyMScpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIuX2ZhY3RvcnkgaXMgZHVtbXlfZmFjdG9yeSkKKyAgICAgICAgCisgICAgICAgIGZvbGRlcjFfYWxpYXMgPSBib3guZ2V0X2ZvbGRlcignZm9sZGVyMScpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIxX2FsaWFzLl9mYWN0b3J5IGlzIGR1bW15X2ZhY3RvcnkpCisKKyAgICAgICAgCiAKIGNsYXNzIF9UZXN0TWJveE1NREYoVGVzdE1haWxib3gpOgogCkBAIC03NDAsNiArNzUzLDIyIEBACiAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKICAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCiAKKyAgICBkZWYgdGVzdF9yZWxvY2soc2VsZik6CisgICAgICAgICMgVGVzdCBjYXNlIGZvciBidWcgIzE1NzU1MDY6IHRoZSBtYWlsYm94IGNsYXNzIHdhcyBsb2NraW5nIHRoZQorICAgICAgICAjIHdyb25nIGZpbGUgb2JqZWN0IGluIGl0cyBmbHVzaCgpIG1ldGhvZC4KKyAgICAgICAgbXNnID0gIlN1YmplY3Q6IHN1YlxuXG5ib2R5XG4iCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKG1zZykKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKworICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQobXNnKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll9sb2NrZWQpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisKKwogCiBjbGFzcyBUZXN0TWJveChfVGVzdE1ib3hNTURGKToKIApAQCAtNzY2LDcgKzc5NSwxMSBAQAogCiAgICAgZGVmIHRlc3RfZ2V0X2ZvbGRlcihzZWxmKToKICAgICAgICAgIyBPcGVuIGZvbGRlcnMKLSAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBkZWYgZHVtbXlfZmFjdG9yeSAocyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGR1bW15X2ZhY3RvcnkpCisgICAgICAgIAorICAgICAgICBuZXdfZm9sZGVyID0gc2VsZi5fYm94LmFkZF9mb2xkZXIoJ2Zvby5iYXInKQogICAgICAgICBmb2xkZXIwID0gc2VsZi5fYm94LmdldF9mb2xkZXIoJ2Zvby5iYXInKQogICAgICAgICBmb2xkZXIwLmFkZChzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQogICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2Zvby5iYXInKSkpCkBAIC03NzQsNiArODA3LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIxLmdldF9zdHJpbmcoZm9sZGVyMS5rZXlzKClbMF0pID09IFwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ2JhcicpCiAKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1Njk3OTA6IHZlcmlmeSB0aGF0IGZvbGRlcnMgcmV0dXJuZWQgYnkgLmdldF9mb2xkZXIoKQorICAgICAgICAjIHVzZSB0aGUgc2FtZSBmYWN0b3J5IGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydF8obmV3X2ZvbGRlci5fZmFjdG9yeSBpcyBzZWxmLl9ib3guX2ZhY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIwLl9mYWN0b3J5IGlzIHNlbGYuX2JveC5fZmFjdG9yeSkKKwogICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CiAgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCkBAIC04NDIsNiArODgwLDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CiAgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6WzEsIDIsIDNdLCAndW5zZWVuJzpbMV0sICdiYXInOlszXSwgJ3JlcGxpZWQnOlszXX0pCiAKKyAgICAgICAgIyBUZXN0IGNhc2UgZm9yIHBhY2tpbmcgd2hpbGUgaG9sZGluZyB0aGUgbWFpbGJveCBsb2NrZWQuCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIGtleTMgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkwKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTIpCisgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAgc2VsZi5fYm94LnBhY2soKQorICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpbMSwgMiwgMywgNCwgNV0sCisgICAgICAgICAgICAgICAgICAgICAgJ3Vuc2Vlbic6WzFdLCAnYmFyJzpbM10sICdyZXBsaWVkJzpbM119KQorICAgICAgICAKICAgICBkZWYgX2dldF9sb2NrX3BhdGgoc2VsZik6CiAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy5taF9zZXF1ZW5jZXMubG9jaycpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQppbmRleCBhMDkyMjY1Li5hNDVmYzM0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CkBAIC0xLDIwOCArMSwyNDEgQEAKICMgUHl0aG9uIHRlc3Qgc2V0IC0tIG1hdGggbW9kdWxlCiAjIFhYWFggU2hvdWxkIG5vdCBkbyB0ZXN0cyBhcm91bmQgemVybyBvbmx5CiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQsIHZlcmJvc2UKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgdmVyYm9zZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgbWF0aAogCiBzZXBzPScxZS0wNScKIGVwcyA9IGV2YWwoc2VwcykKLXByaW50ICdtYXRoIG1vZHVsZSwgdGVzdGluZyB3aXRoIGVwcycsIHNlcHMKLWltcG9ydCBtYXRoCiAKLWRlZiB0ZXN0aXQobmFtZSwgdmFsdWUsIGV4cGVjdGVkKToKLSAgICBpZiBhYnModmFsdWUtZXhwZWN0ZWQpID4gZXBzOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAnJXMgcmV0dXJuZWQgJWYsIGV4cGVjdGVkICVmJyVcCi0gICAgICAgICAgICAgIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpCitjbGFzcyBNYXRoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi1wcmludCAnY29uc3RhbnRzJwotdGVzdGl0KCdwaScsIG1hdGgucGksIDMuMTQxNTkyNikKLXRlc3RpdCgnZScsIG1hdGguZSwgMi43MTgyODE4KQorICAgIGRlZiBmdGVzdChzZWxmLCBuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpOgorICAgICAgICBpZiBhYnModmFsdWUtZXhwZWN0ZWQpID4gZXBzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCclcyByZXR1cm5lZCAlZiwgZXhwZWN0ZWQgJWYnJVwKKyAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgdmFsdWUsIGV4cGVjdGVkKSkKIAotcHJpbnQgJ2Fjb3MnCi10ZXN0aXQoJ2Fjb3MoLTEpJywgbWF0aC5hY29zKC0xKSwgbWF0aC5waSkKLXRlc3RpdCgnYWNvcygwKScsIG1hdGguYWNvcygwKSwgbWF0aC5waS8yKQotdGVzdGl0KCdhY29zKDEpJywgbWF0aC5hY29zKDEpLCAwKQorICAgIGRlZiB0ZXN0Q29uc3RhbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmZ0ZXN0KCdwaScsIG1hdGgucGksIDMuMTQxNTkyNikKKyAgICAgICAgc2VsZi5mdGVzdCgnZScsIG1hdGguZSwgMi43MTgyODE4KQogCi1wcmludCAnYXNpbicKLXRlc3RpdCgnYXNpbigtMSknLCBtYXRoLmFzaW4oLTEpLCAtbWF0aC5waS8yKQotdGVzdGl0KCdhc2luKDApJywgbWF0aC5hc2luKDApLCAwKQotdGVzdGl0KCdhc2luKDEpJywgbWF0aC5hc2luKDEpLCBtYXRoLnBpLzIpCisgICAgZGVmIHRlc3RBY29zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYWNvcykKKyAgICAgICAgc2VsZi5mdGVzdCgnYWNvcygtMSknLCBtYXRoLmFjb3MoLTEpLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKDApJywgbWF0aC5hY29zKDApLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3MoMSknLCBtYXRoLmFjb3MoMSksIDApCiAKLXByaW50ICdhdGFuJwotdGVzdGl0KCdhdGFuKC0xKScsIG1hdGguYXRhbigtMSksIC1tYXRoLnBpLzQpCi10ZXN0aXQoJ2F0YW4oMCknLCBtYXRoLmF0YW4oMCksIDApCi10ZXN0aXQoJ2F0YW4oMSknLCBtYXRoLmF0YW4oMSksIG1hdGgucGkvNCkKKyAgICBkZWYgdGVzdEFzaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hc2luKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luKC0xKScsIG1hdGguYXNpbigtMSksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW4oMCknLCBtYXRoLmFzaW4oMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW4oMSknLCBtYXRoLmFzaW4oMSksIG1hdGgucGkvMikKIAotcHJpbnQgJ2F0YW4yJwotdGVzdGl0KCdhdGFuMigtMSwgMCknLCBtYXRoLmF0YW4yKC0xLCAwKSwgLW1hdGgucGkvMikKLXRlc3RpdCgnYXRhbjIoLTEsIDEpJywgbWF0aC5hdGFuMigtMSwgMSksIC1tYXRoLnBpLzQpCi10ZXN0aXQoJ2F0YW4yKDAsIDEpJywgbWF0aC5hdGFuMigwLCAxKSwgMCkKLXRlc3RpdCgnYXRhbjIoMSwgMSknLCBtYXRoLmF0YW4yKDEsIDEpLCBtYXRoLnBpLzQpCi10ZXN0aXQoJ2F0YW4yKDEsIDApJywgbWF0aC5hdGFuMigxLCAwKSwgbWF0aC5waS8yKQorICAgIGRlZiB0ZXN0QXRhbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmF0YW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oLTEpJywgbWF0aC5hdGFuKC0xKSwgLW1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbigwKScsIG1hdGguYXRhbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbigxKScsIG1hdGguYXRhbigxKSwgbWF0aC5waS80KQogCi1wcmludCAnY2VpbCcKLXRlc3RpdCgnY2VpbCgwLjUpJywgbWF0aC5jZWlsKDAuNSksIDEpCi10ZXN0aXQoJ2NlaWwoMS4wKScsIG1hdGguY2VpbCgxLjApLCAxKQotdGVzdGl0KCdjZWlsKDEuNSknLCBtYXRoLmNlaWwoMS41KSwgMikKLXRlc3RpdCgnY2VpbCgtMC41KScsIG1hdGguY2VpbCgtMC41KSwgMCkKLXRlc3RpdCgnY2VpbCgtMS4wKScsIG1hdGguY2VpbCgtMS4wKSwgLTEpCi10ZXN0aXQoJ2NlaWwoLTEuNSknLCBtYXRoLmNlaWwoLTEuNSksIC0xKQorICAgIGRlZiB0ZXN0QXRhbjIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hdGFuMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTEsIDApJywgbWF0aC5hdGFuMigtMSwgMCksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0xLCAxKScsIG1hdGguYXRhbjIoLTEsIDEpLCAtbWF0aC5waS80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigwLCAxKScsIG1hdGguYXRhbjIoMCwgMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDEsIDEpJywgbWF0aC5hdGFuMigxLCAxKSwgbWF0aC5waS80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigxLCAwKScsIG1hdGguYXRhbjIoMSwgMCksIG1hdGgucGkvMikKIAotcHJpbnQgJ2NvcycKLXRlc3RpdCgnY29zKC1waS8yKScsIG1hdGguY29zKC1tYXRoLnBpLzIpLCAwKQotdGVzdGl0KCdjb3MoMCknLCBtYXRoLmNvcygwKSwgMSkKLXRlc3RpdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCkKLXRlc3RpdCgnY29zKHBpKScsIG1hdGguY29zKG1hdGgucGkpLCAtMSkKKyAgICBkZWYgdGVzdENlaWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5jZWlsKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKDAuNSknLCBtYXRoLmNlaWwoMC41KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgxLjApJywgbWF0aC5jZWlsKDEuMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoMS41KScsIG1hdGguY2VpbCgxLjUpLCAyKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKC0wLjUpJywgbWF0aC5jZWlsKC0wLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKC0xLjApJywgbWF0aC5jZWlsKC0xLjApLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgtMS41KScsIG1hdGguY2VpbCgtMS41KSwgLTEpCiAKLXByaW50ICdjb3NoJwotdGVzdGl0KCdjb3NoKDApJywgbWF0aC5jb3NoKDApLCAxKQotdGVzdGl0KCdjb3NoKDIpLTIqY29zaCgxKSoqMicsIG1hdGguY29zaCgyKS0yKm1hdGguY29zaCgxKSoqMiwgLTEpICMgVGhhbmtzIHRvIExhbWJlcnQKKyAgICBkZWYgdGVzdENvcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvcykKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKC1waS8yKScsIG1hdGguY29zKC1tYXRoLnBpLzIpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoMCknLCBtYXRoLmNvcygwKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpKScsIG1hdGguY29zKG1hdGgucGkpLCAtMSkKIAotcHJpbnQgJ2RlZ3JlZXMnCi10ZXN0aXQoJ2RlZ3JlZXMocGkpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkpLCAxODAuMCkKLXRlc3RpdCgnZGVncmVlcyhwaS8yKScsIG1hdGguZGVncmVlcyhtYXRoLnBpLzIpLCA5MC4wKQotdGVzdGl0KCdkZWdyZWVzKC1waS80KScsIG1hdGguZGVncmVlcygtbWF0aC5waS80KSwgLTQ1LjApCisgICAgZGVmIHRlc3RDb3NoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY29zaCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zaCgwKScsIG1hdGguY29zaCgwKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zaCgyKS0yKmNvc2goMSkqKjInLCBtYXRoLmNvc2goMiktMiptYXRoLmNvc2goMSkqKjIsIC0xKSAjIFRoYW5rcyB0byBMYW1iZXJ0CiAKLXByaW50ICdleHAnCi10ZXN0aXQoJ2V4cCgtMSknLCBtYXRoLmV4cCgtMSksIDEvbWF0aC5lKQotdGVzdGl0KCdleHAoMCknLCBtYXRoLmV4cCgwKSwgMSkKLXRlc3RpdCgnZXhwKDEpJywgbWF0aC5leHAoMSksIG1hdGguZSkKKyAgICBkZWYgdGVzdERlZ3JlZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5kZWdyZWVzKQorICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKHBpKScsIG1hdGguZGVncmVlcyhtYXRoLnBpKSwgMTgwLjApCisgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMocGkvMiknLCBtYXRoLmRlZ3JlZXMobWF0aC5waS8yKSwgOTAuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcygtcGkvNCknLCBtYXRoLmRlZ3JlZXMoLW1hdGgucGkvNCksIC00NS4wKQogCi1wcmludCAnZmFicycKLXRlc3RpdCgnZmFicygtMSknLCBtYXRoLmZhYnMoLTEpLCAxKQotdGVzdGl0KCdmYWJzKDApJywgbWF0aC5mYWJzKDApLCAwKQotdGVzdGl0KCdmYWJzKDEpJywgbWF0aC5mYWJzKDEpLCAxKQorICAgIGRlZiB0ZXN0RXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZXhwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdleHAoLTEpJywgbWF0aC5leHAoLTEpLCAxL21hdGguZSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZXhwKDApJywgbWF0aC5leHAoMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2V4cCgxKScsIG1hdGguZXhwKDEpLCBtYXRoLmUpCiAKLXByaW50ICdmbG9vcicKLXRlc3RpdCgnZmxvb3IoMC41KScsIG1hdGguZmxvb3IoMC41KSwgMCkKLXRlc3RpdCgnZmxvb3IoMS4wKScsIG1hdGguZmxvb3IoMS4wKSwgMSkKLXRlc3RpdCgnZmxvb3IoMS41KScsIG1hdGguZmxvb3IoMS41KSwgMSkKLXRlc3RpdCgnZmxvb3IoLTAuNSknLCBtYXRoLmZsb29yKC0wLjUpLCAtMSkKLXRlc3RpdCgnZmxvb3IoLTEuMCknLCBtYXRoLmZsb29yKC0xLjApLCAtMSkKLXRlc3RpdCgnZmxvb3IoLTEuNSknLCBtYXRoLmZsb29yKC0xLjUpLCAtMikKKyAgICBkZWYgdGVzdEZhYnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mYWJzKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmYWJzKC0xKScsIG1hdGguZmFicygtMSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2ZhYnMoMCknLCBtYXRoLmZhYnMoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2ZhYnMoMSknLCBtYXRoLmZhYnMoMSksIDEpCiAKLXByaW50ICdmbW9kJwotdGVzdGl0KCdmbW9kKDEwLDEpJywgbWF0aC5mbW9kKDEwLDEpLCAwKQotdGVzdGl0KCdmbW9kKDEwLDAuNSknLCBtYXRoLmZtb2QoMTAsMC41KSwgMCkKLXRlc3RpdCgnZm1vZCgxMCwxLjUpJywgbWF0aC5mbW9kKDEwLDEuNSksIDEpCi10ZXN0aXQoJ2Ztb2QoLTEwLDEpJywgbWF0aC5mbW9kKC0xMCwxKSwgMCkKLXRlc3RpdCgnZm1vZCgtMTAsMC41KScsIG1hdGguZm1vZCgtMTAsMC41KSwgMCkKLXRlc3RpdCgnZm1vZCgtMTAsMS41KScsIG1hdGguZm1vZCgtMTAsMS41KSwgLTEpCisgICAgZGVmIHRlc3RGbG9vcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZsb29yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigwLjUpJywgbWF0aC5mbG9vcigwLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigxLjApJywgbWF0aC5mbG9vcigxLjApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigxLjUpJywgbWF0aC5mbG9vcigxLjUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigtMC41KScsIG1hdGguZmxvb3IoLTAuNSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigtMS4wKScsIG1hdGguZmxvb3IoLTEuMCksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigtMS41KScsIG1hdGguZmxvb3IoLTEuNSksIC0yKQogCi1wcmludCAnZnJleHAnCi1kZWYgdGVzdGZyZXhwKG5hbWUsIChtYW50LCBleHApLCAoZW1hbnQsIGVleHApKToKLSAgICBpZiBhYnMobWFudC1lbWFudCkgPiBlcHMgb3IgZXhwICE9IGVleHA6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICclcyByZXR1cm5lZCAlciwgZXhwZWN0ZWQgJXInJVwKLSAgICAgICAgICAgICAgKG5hbWUsIChtYW50LCBleHApLCAoZW1hbnQsZWV4cCkpCisgICAgZGVmIHRlc3RGbW9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZm1vZCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgxMCwxKScsIG1hdGguZm1vZCgxMCwxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgxMCwwLjUpJywgbWF0aC5mbW9kKDEwLDAuNSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoMTAsMS41KScsIG1hdGguZm1vZCgxMCwxLjUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKC0xMCwxKScsIG1hdGguZm1vZCgtMTAsMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoLTEwLDAuNSknLCBtYXRoLmZtb2QoLTEwLDAuNSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoLTEwLDEuNSknLCBtYXRoLmZtb2QoLTEwLDEuNSksIC0xKQogCi10ZXN0ZnJleHAoJ2ZyZXhwKC0xKScsIG1hdGguZnJleHAoLTEpLCAoLTAuNSwgMSkpCi10ZXN0ZnJleHAoJ2ZyZXhwKDApJywgbWF0aC5mcmV4cCgwKSwgKDAsIDApKQotdGVzdGZyZXhwKCdmcmV4cCgxKScsIG1hdGguZnJleHAoMSksICgwLjUsIDEpKQotdGVzdGZyZXhwKCdmcmV4cCgyKScsIG1hdGguZnJleHAoMiksICgwLjUsIDIpKQorICAgIGRlZiB0ZXN0RnJleHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mcmV4cCkKIAotcHJpbnQgJ2h5cG90JwotdGVzdGl0KCdoeXBvdCgwLDApJywgbWF0aC5oeXBvdCgwLDApLCAwKQotdGVzdGl0KCdoeXBvdCgzLDQpJywgbWF0aC5oeXBvdCgzLDQpLCA1KQorICAgICAgICBkZWYgdGVzdGZyZXhwKG5hbWUsIChtYW50LCBleHApLCAoZW1hbnQsIGVleHApKToKKyAgICAgICAgICAgIGlmIGFicyhtYW50LWVtYW50KSA+IGVwcyBvciBleHAgIT0gZWV4cDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlciclXAorICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgKG1hbnQsIGV4cCksIChlbWFudCxlZXhwKSkpCiAKLXByaW50ICdsZGV4cCcKLXRlc3RpdCgnbGRleHAoMCwxKScsIG1hdGgubGRleHAoMCwxKSwgMCkKLXRlc3RpdCgnbGRleHAoMSwxKScsIG1hdGgubGRleHAoMSwxKSwgMikKLXRlc3RpdCgnbGRleHAoMSwtMSknLCBtYXRoLmxkZXhwKDEsLTEpLCAwLjUpCi10ZXN0aXQoJ2xkZXhwKC0xLDEpJywgbWF0aC5sZGV4cCgtMSwxKSwgLTIpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoLTEpJywgbWF0aC5mcmV4cCgtMSksICgtMC41LCAxKSkKKyAgICAgICAgdGVzdGZyZXhwKCdmcmV4cCgwKScsIG1hdGguZnJleHAoMCksICgwLCAwKSkKKyAgICAgICAgdGVzdGZyZXhwKCdmcmV4cCgxKScsIG1hdGguZnJleHAoMSksICgwLjUsIDEpKQorICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKDIpJywgbWF0aC5mcmV4cCgyKSwgKDAuNSwgMikpCiAKLXByaW50ICdsb2cnCi10ZXN0aXQoJ2xvZygxL2UpJywgbWF0aC5sb2coMS9tYXRoLmUpLCAtMSkKLXRlc3RpdCgnbG9nKDEpJywgbWF0aC5sb2coMSksIDApCi10ZXN0aXQoJ2xvZyhlKScsIG1hdGgubG9nKG1hdGguZSksIDEpCi10ZXN0aXQoJ2xvZygzMiwyKScsIG1hdGgubG9nKDMyLDIpLCA1KQotdGVzdGl0KCdsb2coMTAqKjQwLCAxMCknLCBtYXRoLmxvZygxMCoqNDAsIDEwKSwgNDApCi10ZXN0aXQoJ2xvZygxMCoqNDAsIDEwKioyMCknLCBtYXRoLmxvZygxMCoqNDAsIDEwKioyMCksIDIpCisgICAgZGVmIHRlc3RIeXBvdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmh5cG90KQorICAgICAgICBzZWxmLmZ0ZXN0KCdoeXBvdCgwLDApJywgbWF0aC5oeXBvdCgwLDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdoeXBvdCgzLDQpJywgbWF0aC5oeXBvdCgzLDQpLCA1KQogCi1wcmludCAnbG9nMTAnCi10ZXN0aXQoJ2xvZzEwKDAuMSknLCBtYXRoLmxvZzEwKDAuMSksIC0xKQotdGVzdGl0KCdsb2cxMCgxKScsIG1hdGgubG9nMTAoMSksIDApCi10ZXN0aXQoJ2xvZzEwKDEwKScsIG1hdGgubG9nMTAoMTApLCAxKQorICAgIGRlZiB0ZXN0TGRleHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sZGV4cCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbGRleHAoMCwxKScsIG1hdGgubGRleHAoMCwxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbGRleHAoMSwxKScsIG1hdGgubGRleHAoMSwxKSwgMikKKyAgICAgICAgc2VsZi5mdGVzdCgnbGRleHAoMSwtMSknLCBtYXRoLmxkZXhwKDEsLTEpLCAwLjUpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKC0xLDEpJywgbWF0aC5sZGV4cCgtMSwxKSwgLTIpCiAKLXByaW50ICdtb2RmJwotZGVmIHRlc3Rtb2RmKG5hbWUsICh2MSwgdjIpLCAoZTEsIGUyKSk6Ci0gICAgaWYgYWJzKHYxLWUxKSA+IGVwcyBvciBhYnModjItZTIpOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyVcCi0gICAgICAgICAgICAgIChuYW1lLCAodjEsdjIpLCAoZTEsZTIpKQorICAgIGRlZiB0ZXN0TG9nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMS9lKScsIG1hdGgubG9nKDEvbWF0aC5lKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygxKScsIG1hdGgubG9nKDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coZSknLCBtYXRoLmxvZyhtYXRoLmUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMzIsMiknLCBtYXRoLmxvZygzMiwyKSwgNSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEwKio0MCwgMTApJywgbWF0aC5sb2coMTAqKjQwLCAxMCksIDQwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMTAqKjQwLCAxMCoqMjApJywgbWF0aC5sb2coMTAqKjQwLCAxMCoqMjApLCAyKQogCi10ZXN0bW9kZignbW9kZigxLjUpJywgbWF0aC5tb2RmKDEuNSksICgwLjUsIDEuMCkpCi10ZXN0bW9kZignbW9kZigtMS41KScsIG1hdGgubW9kZigtMS41KSwgKC0wLjUsIC0xLjApKQorICAgIGRlZiB0ZXN0TG9nMTAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sb2cxMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMC4xKScsIG1hdGgubG9nMTAoMC4xKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzEwKDEpJywgbWF0aC5sb2cxMCgxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMTApJywgbWF0aC5sb2cxMCgxMCksIDEpCiAKLXByaW50ICdwb3cnCi10ZXN0aXQoJ3BvdygwLDEpJywgbWF0aC5wb3coMCwxKSwgMCkKLXRlc3RpdCgncG93KDEsMCknLCBtYXRoLnBvdygxLDApLCAxKQotdGVzdGl0KCdwb3coMiwxKScsIG1hdGgucG93KDIsMSksIDIpCi10ZXN0aXQoJ3BvdygyLC0xKScsIG1hdGgucG93KDIsLTEpLCAwLjUpCisgICAgZGVmIHRlc3RNb2RmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubW9kZikKIAotcHJpbnQgJ3JhZGlhbnMnCi10ZXN0aXQoJ3JhZGlhbnMoMTgwKScsIG1hdGgucmFkaWFucygxODApLCBtYXRoLnBpKQotdGVzdGl0KCdyYWRpYW5zKDkwKScsIG1hdGgucmFkaWFucyg5MCksIG1hdGgucGkvMikKLXRlc3RpdCgncmFkaWFucygtNDUpJywgbWF0aC5yYWRpYW5zKC00NSksIC1tYXRoLnBpLzQpCisgICAgICAgIGRlZiB0ZXN0bW9kZihuYW1lLCAodjEsIHYyKSwgKGUxLCBlMikpOgorICAgICAgICAgICAgaWYgYWJzKHYxLWUxKSA+IGVwcyBvciBhYnModjItZTIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyVcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCAodjEsdjIpLCAoZTEsZTIpKSkKIAotcHJpbnQgJ3NpbicKLXRlc3RpdCgnc2luKDApJywgbWF0aC5zaW4oMCksIDApCi10ZXN0aXQoJ3NpbihwaS8yKScsIG1hdGguc2luKG1hdGgucGkvMiksIDEpCi10ZXN0aXQoJ3NpbigtcGkvMiknLCBtYXRoLnNpbigtbWF0aC5waS8yKSwgLTEpCisgICAgICAgIHRlc3Rtb2RmKCdtb2RmKDEuNSknLCBtYXRoLm1vZGYoMS41KSwgKDAuNSwgMS4wKSkKKyAgICAgICAgdGVzdG1vZGYoJ21vZGYoLTEuNSknLCBtYXRoLm1vZGYoLTEuNSksICgtMC41LCAtMS4wKSkKIAotcHJpbnQgJ3NpbmgnCi10ZXN0aXQoJ3NpbmgoMCknLCBtYXRoLnNpbmgoMCksIDApCi10ZXN0aXQoJ3NpbmgoMSkqKjItY29zaCgxKSoqMicsIG1hdGguc2luaCgxKSoqMi1tYXRoLmNvc2goMSkqKjIsIC0xKQotdGVzdGl0KCdzaW5oKDEpK3NpbmgoLTEpJywgbWF0aC5zaW5oKDEpK21hdGguc2luaCgtMSksIDApCisgICAgZGVmIHRlc3RQb3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5wb3cpCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygwLDEpJywgbWF0aC5wb3coMCwxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDEsMCknLCBtYXRoLnBvdygxLDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdwb3coMiwxKScsIG1hdGgucG93KDIsMSksIDIpCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygyLC0xKScsIG1hdGgucG93KDIsLTEpLCAwLjUpCiAKLXByaW50ICdzcXJ0JwotdGVzdGl0KCdzcXJ0KDApJywgbWF0aC5zcXJ0KDApLCAwKQotdGVzdGl0KCdzcXJ0KDEpJywgbWF0aC5zcXJ0KDEpLCAxKQotdGVzdGl0KCdzcXJ0KDQpJywgbWF0aC5zcXJ0KDQpLCAyKQorICAgIGRlZiB0ZXN0UmFkaWFucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnJhZGlhbnMpCisgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoMTgwKScsIG1hdGgucmFkaWFucygxODApLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKDkwKScsIG1hdGgucmFkaWFucyg5MCksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucygtNDUpJywgbWF0aC5yYWRpYW5zKC00NSksIC1tYXRoLnBpLzQpCiAKLXByaW50ICd0YW4nCi10ZXN0aXQoJ3RhbigwKScsIG1hdGgudGFuKDApLCAwKQotdGVzdGl0KCd0YW4ocGkvNCknLCBtYXRoLnRhbihtYXRoLnBpLzQpLCAxKQotdGVzdGl0KCd0YW4oLXBpLzQpJywgbWF0aC50YW4oLW1hdGgucGkvNCksIC0xKQorICAgIGRlZiB0ZXN0U2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc2luKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4oMCknLCBtYXRoLnNpbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luKHBpLzIpJywgbWF0aC5zaW4obWF0aC5waS8yKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luKC1waS8yKScsIG1hdGguc2luKC1tYXRoLnBpLzIpLCAtMSkKIAotcHJpbnQgJ3RhbmgnCi10ZXN0aXQoJ3RhbmgoMCknLCBtYXRoLnRhbmgoMCksIDApCi10ZXN0aXQoJ3RhbmgoMSkrdGFuaCgtMSknLCBtYXRoLnRhbmgoMSkrbWF0aC50YW5oKC0xKSwgMCkKKyAgICBkZWYgdGVzdFNpbmgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zaW5oKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDApJywgbWF0aC5zaW5oKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDEpKioyLWNvc2goMSkqKjInLCBtYXRoLnNpbmgoMSkqKjItbWF0aC5jb3NoKDEpKioyLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luaCgxKStzaW5oKC0xKScsIG1hdGguc2luaCgxKSttYXRoLnNpbmgoLTEpLCAwKQogCi0jIFJFRF9GTEFHIDE2LU9jdC0yMDAwIFRpbQotIyBXaGlsZSAyLjAgaXMgbW9yZSBjb25zaXN0ZW50IGFib3V0IGV4Y2VwdGlvbnMgdGhhbiBwcmV2aW91cyByZWxlYXNlcywgaXQKLSMgc3RpbGwgZmFpbHMgdGhpcyBwYXJ0IG9mIHRoZSB0ZXN0IG9uIHNvbWUgcGxhdGZvcm1zLiAgRm9yIG5vdywgd2Ugb25seQotIyAqcnVuKiB0ZXN0X2V4Y2VwdGlvbnMoKSBpbiB2ZXJib3NlIG1vZGUsIHNvIHRoYXQgdGhpcyBpc24ndCBub3JtYWxseQotIyB0ZXN0ZWQuCisgICAgZGVmIHRlc3RTcXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc3FydCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc3FydCgwKScsIG1hdGguc3FydCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc3FydCgxKScsIG1hdGguc3FydCgxKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnc3FydCg0KScsIG1hdGguc3FydCg0KSwgMikKIAotZGVmIHRlc3RfZXhjZXB0aW9ucygpOgotICAgIHByaW50ICdleGNlcHRpb25zJwotICAgIHRyeToKLSAgICAgICAgeCA9IG1hdGguZXhwKC0xMDAwMDAwMDAwKQotICAgIGV4Y2VwdDoKLSAgICAgICAgIyBtYXRobW9kdWxlLmMgaXMgZmFpbGluZyB0byB3ZWVkIG91dCB1bmRlcmZsb3dzIGZyb20gbGlibSwgb3IKLSAgICAgICAgIyB3ZSd2ZSBnb3QgYW4gZnAgZm9ybWF0IHdpdGggaHVnZSBkeW5hbWljIHJhbmdlCi0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInVuZGVyZmxvd2luZyBleHAoKSBzaG91bGQgbm90IGhhdmUgcmFpc2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gZXhjZXB0aW9uIikKLSAgICBpZiB4ICE9IDA6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInVuZGVyZmxvd2luZyBleHAoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCAwIikKKyAgICBkZWYgdGVzdFRhbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRhbikKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuKDApJywgbWF0aC50YW4oMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbihwaS80KScsIG1hdGgudGFuKG1hdGgucGkvNCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbigtcGkvNCknLCBtYXRoLnRhbigtbWF0aC5waS80KSwgLTEpCiAKLSAgICAjIElmIHRoaXMgZmFpbHMsIHByb2JhYmx5IHVzaW5nIGEgc3RyaWN0IElFRUUtNzU0IGNvbmZvcm1pbmcgbGlibSwgYW5kIHgKLSAgICAjIGlzICtJbmYgYWZ0ZXJ3YXJkcy4gIEJ1dCBQeXRob24gd2FudHMgb3ZlcmZsb3dzIGRldGVjdGVkIGJ5IGRlZmF1bHQuCi0gICAgdHJ5OgotICAgICAgICB4ID0gbWF0aC5leHAoMTAwMDAwMDAwMCkKLSAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIm92ZXJmbG93aW5nIGV4cCgpIGRpZG4ndCB0cmlnZ2VyIE92ZXJmbG93RXJyb3IiKQorICAgIGRlZiB0ZXN0VGFuaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRhbmgpCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoMCknLCBtYXRoLnRhbmgoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoMSkrdGFuaCgtMSknLCBtYXRoLnRhbmgoMSkrbWF0aC50YW5oKC0xKSwgMCkKIAotICAgICMgSWYgdGhpcyBmYWlscywgaXQgY291bGQgYmUgYSBwdXp6bGUuICBPbmUgb2RkIHBvc3NpYmlsaXR5IGlzIHRoYXQKLSAgICAjIG1hdGhtb2R1bGUuYydzIG1hY3JvcyBhcmUgZ2V0dGluZyBjb25mdXNlZCB3aGlsZSBjb21wYXJpbmcKLSAgICAjIEluZiAoSFVHRV9WQUwpIHRvIGEgTmFOLCBhbmQgYXJ0aWZpY2lhbGx5IHNldHRpbmcgZXJybm8gdG8gRVJBTkdFCi0gICAgIyBhcyBhIHJlc3VsdCAoYW5kIHNvIHJhaXNpbmcgT3ZlcmZsb3dFcnJvciBpbnN0ZWFkKS4KLSAgICB0cnk6Ci0gICAgICAgIHggPSBtYXRoLnNxcnQoLTEuMCkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInNxcnQoLTEpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIikKKyAgICAjIFJFRF9GTEFHIDE2LU9jdC0yMDAwIFRpbQorICAgICMgV2hpbGUgMi4wIGlzIG1vcmUgY29uc2lzdGVudCBhYm91dCBleGNlcHRpb25zIHRoYW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0CisgICAgIyBzdGlsbCBmYWlscyB0aGlzIHBhcnQgb2YgdGhlIHRlc3Qgb24gc29tZSBwbGF0Zm9ybXMuICBGb3Igbm93LCB3ZSBvbmx5CisgICAgIyAqcnVuKiB0ZXN0X2V4Y2VwdGlvbnMoKSBpbiB2ZXJib3NlIG1vZGUsIHNvIHRoYXQgdGhpcyBpc24ndCBub3JtYWxseQorICAgICMgdGVzdGVkLgogCi1pZiB2ZXJib3NlOgotICAgIHRlc3RfZXhjZXB0aW9ucygpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gbWF0aC5leHAoLTEwMDAwMDAwMDApCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBtYXRobW9kdWxlLmMgaXMgZmFpbGluZyB0byB3ZWVkIG91dCB1bmRlcmZsb3dzIGZyb20gbGlibSwgb3IKKyAgICAgICAgICAgICAgICAjIHdlJ3ZlIGdvdCBhbiBmcCBmb3JtYXQgd2l0aCBodWdlIGR5bmFtaWMgcmFuZ2UKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZGVyZmxvd2luZyBleHAoKSBzaG91bGQgbm90IGhhdmUgcmFpc2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIGV4Y2VwdGlvbiIpCisgICAgICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgMCIpCisKKyAgICAgICAgICAgICMgSWYgdGhpcyBmYWlscywgcHJvYmFibHkgdXNpbmcgYSBzdHJpY3QgSUVFRS03NTQgY29uZm9ybWluZyBsaWJtLCBhbmQgeAorICAgICAgICAgICAgIyBpcyArSW5mIGFmdGVyd2FyZHMuICBCdXQgUHl0aG9uIHdhbnRzIG92ZXJmbG93cyBkZXRlY3RlZCBieSBkZWZhdWx0LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBtYXRoLmV4cCgxMDAwMDAwMDAwKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm92ZXJmbG93aW5nIGV4cCgpIGRpZG4ndCB0cmlnZ2VyIE92ZXJmbG93RXJyb3IiKQorCisgICAgICAgICAgICAjIElmIHRoaXMgZmFpbHMsIGl0IGNvdWxkIGJlIGEgcHV6emxlLiAgT25lIG9kZCBwb3NzaWJpbGl0eSBpcyB0aGF0CisgICAgICAgICAgICAjIG1hdGhtb2R1bGUuYydzIG1hY3JvcyBhcmUgZ2V0dGluZyBjb25mdXNlZCB3aGlsZSBjb21wYXJpbmcKKyAgICAgICAgICAgICMgSW5mIChIVUdFX1ZBTCkgdG8gYSBOYU4sIGFuZCBhcnRpZmljaWFsbHkgc2V0dGluZyBlcnJubyB0byBFUkFOR0UKKyAgICAgICAgICAgICMgYXMgYSByZXN1bHQgKGFuZCBzbyByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW5zdGVhZCkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IG1hdGguc3FydCgtMS4wKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNxcnQoLTEpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE1hdGhUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tbWFwLnB5IGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CmluZGV4IGQyYTI0NzcuLjBiNTM4MjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21tYXAucHkKQEAgLTEsMTkwICsxLDE1OCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJlcSwgVEVTVEZOCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAogaW1wb3J0IG1tYXAKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zLCByZQogCiBQQUdFU0laRSA9IG1tYXAuUEFHRVNJWkUKIAotZGVmIHRlc3RfYm90aCgpOgotICAgICJUZXN0IG1tYXAgbW9kdWxlIG9uIFVuaXggc3lzdGVtcyBhbmQgV2luZG93cyIKK2NsYXNzIE1tYXBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICAjIENyZWF0ZSBhIGZpbGUgdG8gYmUgbW1hcCdlZC4KLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgotICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQotICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQogCi0gICAgdHJ5OiAgICAjIHVubGluayBURVNURk4gbm8gbWF0dGVyIHdoYXQKLSAgICAgICAgIyBXcml0ZSAyIHBhZ2VzIHdvcnRoIG9mIGRhdGEgdG8gdGhlIGZpbGUKLSAgICAgICAgZi53cml0ZSgnXDAnKiBQQUdFU0laRSkKLSAgICAgICAgZi53cml0ZSgnZm9vJykKLSAgICAgICAgZi53cml0ZSgnXDAnKiAoUEFHRVNJWkUtMykgKQotICAgICAgICBmLmZsdXNoKCkKLSAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAyICogUEFHRVNJWkUpCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgICAgICMgU2ltcGxlIHNhbml0eSBjaGVja3MKLQotICAgICAgICBwcmludCB0eXBlKG0pICAjIFNGIGJ1ZyAxMjg3MTM6ICBzZWdmYXVsdGVkIG9uIExpbnV4Ci0gICAgICAgIHByaW50ICcgIFBvc2l0aW9uIG9mIGZvbzonLCBtLmZpbmQoJ2ZvbycpIC8gZmxvYXQoUEFHRVNJWkUpLCAncGFnZXMnCi0gICAgICAgIHZlcmVxKG0uZmluZCgnZm9vJyksIFBBR0VTSVpFKQotCi0gICAgICAgIHByaW50ICcgIExlbmd0aCBvZiBmaWxlOicsIGxlbihtKSAvIGZsb2F0KFBBR0VTSVpFKSwgJ3BhZ2VzJwotICAgICAgICB2ZXJlcShsZW4obSksIDIqUEFHRVNJWkUpCi0KLSAgICAgICAgcHJpbnQgJyAgQ29udGVudHMgb2YgYnl0ZSAwOicsIHJlcHIobVswXSkKLSAgICAgICAgdmVyZXEobVswXSwgJ1wwJykKLSAgICAgICAgcHJpbnQgJyAgQ29udGVudHMgb2YgZmlyc3QgMyBieXRlczonLCByZXByKG1bMDozXSkKLSAgICAgICAgdmVyZXEobVswOjNdLCAnXDBcMFwwJykKLQotICAgICAgICAjIE1vZGlmeSB0aGUgZmlsZSdzIGNvbnRlbnQKLSAgICAgICAgcHJpbnQgIlxuICBNb2RpZnlpbmcgZmlsZSdzIGNvbnRlbnQuLi4iCi0gICAgICAgIG1bMF0gPSAnMycKLSAgICAgICAgbVtQQUdFU0laRSArMzogUEFHRVNJWkUgKzMrM10gPSAnYmFyJwotCi0gICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgbW9kaWZpY2F0aW9uIHdvcmtlZAotICAgICAgICBwcmludCAnICBDb250ZW50cyBvZiBieXRlIDA6JywgcmVwcihtWzBdKQotICAgICAgICB2ZXJlcShtWzBdLCAnMycpCi0gICAgICAgIHByaW50ICcgIENvbnRlbnRzIG9mIGZpcnN0IDMgYnl0ZXM6JywgcmVwcihtWzA6M10pCi0gICAgICAgIHZlcmVxKG1bMDozXSwgJzNcMFwwJykKLSAgICAgICAgcHJpbnQgJyAgQ29udGVudHMgb2Ygc2Vjb25kIHBhZ2U6JywgIHJlcHIobVtQQUdFU0laRS0xIDogUEFHRVNJWkUgKyA3XSkKLSAgICAgICAgdmVyZXEobVtQQUdFU0laRS0xIDogUEFHRVNJWkUgKyA3XSwgJ1wwZm9vYmFyXDAnKQotCi0gICAgICAgIG0uZmx1c2goKQotCi0gICAgICAgICMgVGVzdCBkb2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpbiBhbiBtbWFwJ2VkIGZpbGUKLSAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goJ1tBLVphLXpdKycsIG0pCi0gICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6Ci0gICAgICAgICAgICBwcmludCAnICBFUlJPUjogcmVnZXggbWF0Y2ggb24gbW1hcCBmYWlsZWQhJwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oMCkKLSAgICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0Ci0KLSAgICAgICAgICAgIHByaW50ICcgIFJlZ2V4IG1hdGNoIG9uIG1tYXAgKHBhZ2Ugc3RhcnQsIGxlbmd0aCBvZiBtYXRjaCk6JywKLSAgICAgICAgICAgIHByaW50IHN0YXJ0IC8gZmxvYXQoUEFHRVNJWkUpLCBsZW5ndGgKLQotICAgICAgICAgICAgdmVyZXEoc3RhcnQsIFBBR0VTSVpFKQotICAgICAgICAgICAgdmVyZXEoZW5kLCBQQUdFU0laRSArIDYpCi0KLSAgICAgICAgIyB0ZXN0IHNlZWtpbmcgYXJvdW5kICh0cnkgdG8gb3ZlcmZsb3cgdGhlIHNlZWsgaW1wbGVtZW50YXRpb24pCi0gICAgICAgIG0uc2VlaygwLDApCi0gICAgICAgIHByaW50ICcgIFNlZWsgdG8gemVyb3RoIGJ5dGUnCi0gICAgICAgIHZlcmVxKG0udGVsbCgpLCAwKQotICAgICAgICBtLnNlZWsoNDIsMSkKLSAgICAgICAgcHJpbnQgJyAgU2VlayB0byA0Mm5kIGJ5dGUnCi0gICAgICAgIHZlcmVxKG0udGVsbCgpLCA0MikKLSAgICAgICAgbS5zZWVrKDAsMikKLSAgICAgICAgcHJpbnQgJyAgU2VlayB0byBsYXN0IGJ5dGUnCi0gICAgICAgIHZlcmVxKG0udGVsbCgpLCBsZW4obSkpCi0KLSAgICAgICAgcHJpbnQgJyAgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4nCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0uc2VlaygtMSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgJ2V4cGVjdGVkIGEgVmFsdWVFcnJvciBidXQgZGlkIG5vdCBnZXQgaXQnKQotCi0gICAgICAgIHByaW50ICcgIFRyeSB0byBzZWVrIGJleW9uZCBlbmQgb2YgbW1hcC4uLicKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbS5zZWVrKDEsMikKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgJ2V4cGVjdGVkIGEgVmFsdWVFcnJvciBidXQgZGlkIG5vdCBnZXQgaXQnKQotCi0gICAgICAgIHByaW50ICcgIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uJwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtLnNlZWsoLWxlbihtKS0xLDIpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICdleHBlY3RlZCBhIFZhbHVlRXJyb3IgYnV0IGRpZCBub3QgZ2V0IGl0JykKLQotICAgICAgICAjIFRyeSByZXNpemluZyBtYXAKLSAgICAgICAgcHJpbnQgJyAgQXR0ZW1wdGluZyByZXNpemUoKScKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbS5yZXNpemUoNTEyKQotICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6Ci0gICAgICAgICAgICAjIHJlc2l6ZSgpIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgICAgICMgTm8gbWVzc2FnZXMgYXJlIHByaW50ZWQsIHNpbmNlIHRoZSBvdXRwdXQgb2YgdGhpcyB0ZXN0IHN1aXRlCi0gICAgICAgICAgICAjIHdvdWxkIHRoZW4gYmUgZGlmZmVyZW50IGFjcm9zcyBwbGF0Zm9ybXMuCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIHJlc2l6ZSgpIGlzIHN1cHBvcnRlZAotICAgICAgICAgICAgdmVyaWZ5KGxlbihtKSA9PSA1MTIsCi0gICAgICAgICAgICAgICAgICAgICJsZW4obSkgaXMgJWQsIGJ1dCBleHBlY3RpbmcgNTEyIiAlIChsZW4obSksKSApCi0gICAgICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2FuIG5vIGxvbmdlciBzZWVrIGJleW9uZCB0aGUgbmV3IHNpemUuCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbS5zZWVrKDUxMywwKQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB2ZXJpZnkoMCwgJ0NvdWxkIHNlZWsgYmV5b25kIHRoZSBuZXcgc2l6ZScpCi0KLSAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGlzIHRydW5jYXRlZCB0b28KLSAgICAgICAgICAgICMgKGJ1ZyAjNzI4NTE1KQotICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOKQotICAgICAgICAgICAgZi5zZWVrKDAsIDIpCi0gICAgICAgICAgICB2ZXJpZnkoZi50ZWxsKCkgPT0gNTEyLCAnVW5kZXJseWluZyBmaWxlIG5vdCB0cnVuY2F0ZWQnKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICB2ZXJpZnkobS5zaXplKCkgPT0gNTEyLCAnTmV3IHNpemUgbm90IHJlZmxlY3RlZCBpbiBmaWxlJykKLQotICAgICAgICBtLmNsb3NlKCkKLQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgcGFzcwogCi0gICAgIyBUZXN0IGZvciAiYWNjZXNzIiBrZXl3b3JkIHBhcmFtZXRlcgotICAgIHRyeToKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG1tYXAgbW9kdWxlIG9uIFVuaXggc3lzdGVtcyBhbmQgV2luZG93cworCisgICAgICAgICMgQ3JlYXRlIGEgZmlsZSB0byBiZSBtbWFwJ2VkLgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV3JpdGUgMiBwYWdlcyB3b3J0aCBvZiBkYXRhIHRvIHRoZSBmaWxlCisgICAgICAgICAgICBmLndyaXRlKCdcMCcqIFBBR0VTSVpFKQorICAgICAgICAgICAgZi53cml0ZSgnZm9vJykKKyAgICAgICAgICAgIGYud3JpdGUoJ1wwJyogKFBBR0VTSVpFLTMpICkKKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAyICogUEFHRVNJWkUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgIyBTaW1wbGUgc2FuaXR5IGNoZWNrcworCisgICAgICAgICAgICB0cCA9IHN0cih0eXBlKG0pKSAgIyBTRiBidWcgMTI4NzEzOiAgc2VnZmF1bHRlZCBvbiBMaW51eAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoJ2ZvbycpLCBQQUdFU0laRSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obSksIDIqUEFHRVNJWkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswXSwgJ1wwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswOjNdLCAnXDBcMFwwJykKKworICAgICAgICAgICAgIyBNb2RpZnkgdGhlIGZpbGUncyBjb250ZW50CisgICAgICAgICAgICBtWzBdID0gJzMnCisgICAgICAgICAgICBtW1BBR0VTSVpFICszOiBQQUdFU0laRSArMyszXSA9ICdiYXInCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgbW9kaWZpY2F0aW9uIHdvcmtlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzBdLCAnMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMDozXSwgJzNcMFwwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVtQQUdFU0laRS0xIDogUEFHRVNJWkUgKyA3XSwgJ1wwZm9vYmFyXDAnKQorCisgICAgICAgICAgICBtLmZsdXNoKCkKKworICAgICAgICAgICAgIyBUZXN0IGRvaW5nIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGluIGFuIG1tYXAnZWQgZmlsZQorICAgICAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goJ1tBLVphLXpdKycsIG0pCisgICAgICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgncmVnZXggbWF0Y2ggb24gbW1hcCBmYWlsZWQhJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oMCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydAorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydCwgUEFHRVNJWkUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmQsIFBBR0VTSVpFICsgNikKKworICAgICAgICAgICAgIyB0ZXN0IHNlZWtpbmcgYXJvdW5kICh0cnkgdG8gb3ZlcmZsb3cgdGhlIHNlZWsgaW1wbGVtZW50YXRpb24pCisgICAgICAgICAgICBtLnNlZWsoMCwwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgMCkKKyAgICAgICAgICAgIG0uc2Vlayg0MiwxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgNDIpCisgICAgICAgICAgICBtLnNlZWsoMCwyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgbGVuKG0pKQorCisgICAgICAgICAgICAjIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIC0xKQorCisgICAgICAgICAgICAjIFRyeSB0byBzZWVrIGJleW9uZCBlbmQgb2YgbW1hcC4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5zZWVrLCAxLCAyKQorCisgICAgICAgICAgICAjIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIC1sZW4obSktMSwgMikKKworICAgICAgICAgICAgIyBUcnkgcmVzaXppbmcgbWFwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbS5yZXNpemUoNTEyKQorICAgICAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgorICAgICAgICAgICAgICAgICMgcmVzaXplKCkgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICMgTm8gbWVzc2FnZXMgYXJlIHByaW50ZWQsIHNpbmNlIHRoZSBvdXRwdXQgb2YgdGhpcyB0ZXN0IHN1aXRlCisgICAgICAgICAgICAgICAgIyB3b3VsZCB0aGVuIGJlIGRpZmZlcmVudCBhY3Jvc3MgcGxhdGZvcm1zLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyByZXNpemUoKSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtKSwgNTEyKQorICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIHNlZWsgYmV5b25kIHRoZSBuZXcgc2l6ZS4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIDUxMywgMCkKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGlzIHRydW5jYXRlZCB0b28KKyAgICAgICAgICAgICAgICAjIChidWcgIzcyODUxNSkKKyAgICAgICAgICAgICAgICBmID0gb3BlbihURVNURk4pCisgICAgICAgICAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNTEyKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zaXplKCksIDUxMikKKworICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2FjY2Vzc19wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgImFjY2VzcyIga2V5d29yZCBwYXJhbWV0ZXIKICAgICAgICAgbWFwc2l6ZSA9IDEwCi0gICAgICAgIHByaW50ICIgIENyZWF0aW5nIiwgbWFwc2l6ZSwgImJ5dGUgdGVzdCBkYXRhIGZpbGUuIgogICAgICAgICBvcGVuKFRFU1RGTiwgIndiIikud3JpdGUoImEiKm1hcHNpemUpCi0gICAgICAgIHByaW50ICIgIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfUkVBRCIKICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicmIiKQogICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQotICAgICAgICB2ZXJpZnkobVs6XSA9PSAnYScqbWFwc2l6ZSwgIlJlYWRvbmx5IG1lbW9yeSBtYXAgZGF0YSBpbmNvcnJlY3QuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAnYScqbWFwc2l6ZSwgIlJlYWRvbmx5IG1lbW9yeSBtYXAgZGF0YSBpbmNvcnJlY3QuIikKIAotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgc2xpY2UgYXNzaWduZWQuIgorICAgICAgICAjIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSBzbGljZSBhc3NpZ25lZAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtWzpdID0gJ2InKm1hcHNpemUKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKIAotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgaXRlbSBhc3NpZ25lZC4iCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIGl0ZW0gYXNzaWduZWQKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbVswXSA9ICdiJwogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQogCi0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSB3cml0ZSgpIHRvLiIKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGUoKSB0bwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtLnNlZWsoMCwwKQogICAgICAgICAgICAgbS53cml0ZSgnYWJjJykKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKIAotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGVfYnl0ZSgpIHRvLiIKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGVfYnl0ZSgpIHRvCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG0uc2VlaygwLDApCiAgICAgICAgICAgICBtLndyaXRlX2J5dGUoJ2QnKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQogCi0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSByZXNpemVkLiIKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgcmVzaXplZAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtLnJlc2l6ZSgyKm1hcHNpemUpCiAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjogICAjIHJlc2l6ZSBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkCkBAIC0xOTIsMTIgKzE2MCwxMiBAQAogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJBYmxlIHRvIHJlc2l6ZSByZWFkb25seSBtZW1vcnkgbWFwIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQWJsZSB0byByZXNpemUgcmVhZG9ubHkgbWVtb3J5IG1hcCIpCiAgICAgICAgIGRlbCBtLCBmCi0gICAgICAgIHZlcmlmeShvcGVuKFRFU1RGTiwgInJiIikucmVhZCgpID09ICdhJyptYXBzaXplLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZW4oVEVTVEZOLCAicmIiKS5yZWFkKCksICdhJyptYXBzaXplLAogICAgICAgICAgICAgICAgIlJlYWRvbmx5IG1lbW9yeSBtYXAgZGF0YSBmaWxlIHdhcyBtb2RpZmllZCIpCiAKLSAgICAgICAgcHJpbnQgIiAgT3BlbmluZyBtbWFwIHdpdGggc2l6ZSB0b28gYmlnIgorICAgICAgICAjIE9wZW5pbmcgbW1hcCB3aXRoIHNpemUgdG9vIGJpZwogICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCiAgICAgICAgIHRyeToKQEAgLTIwOCwxMSArMTc2LDExIEBACiAgICAgICAgICAgICAjIGxhdGVyIHRlc3RzIGFzc3VtZSB0aGF0IHRoZSBsZW5ndGggaGFzbid0IGNoYW5nZWQuICBXZSBuZWVkIHRvCiAgICAgICAgICAgICAjIHJlcGFpciB0aGF0LgogICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgotICAgICAgICAgICAgICAgIHZlcmlmeSgwLCAiT3BlbmluZyBtbWFwIHdpdGggc2l6ZSsxIHNob3VsZCB3b3JrIG9uIFdpbmRvd3MuIikKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk9wZW5pbmcgbW1hcCB3aXRoIHNpemUrMSBzaG91bGQgd29yayBvbiBXaW5kb3dzLiIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIHdlIGV4cGVjdCBhIFZhbHVlRXJyb3Igb24gVW5peCwgYnV0IG5vdCBvbiBXaW5kb3dzCiAgICAgICAgICAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgotICAgICAgICAgICAgICAgIHZlcmlmeSgwLCAiT3BlbmluZyBtbWFwIHdpdGggc2l6ZSsxIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yLiIpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPcGVuaW5nIG1tYXAgd2l0aCBzaXplKzEgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IuIikKICAgICAgICAgICAgIG0uY2xvc2UoKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgpAQCAtMjIxLDEyICsxODksMTIgQEAKICAgICAgICAgICAgIGYudHJ1bmNhdGUobWFwc2l6ZSkKICAgICAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgICAgIHByaW50ICIgIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfV1JJVEUiCisgICAgICAgICMgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19XUklURQogICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQogICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz1tbWFwLkFDQ0VTU19XUklURSkKLSAgICAgICAgcHJpbnQgIiAgTW9kaWZ5aW5nIHdyaXRlLXRocm91Z2ggbWVtb3J5IG1hcC4iCisgICAgICAgICMgTW9kaWZ5aW5nIHdyaXRlLXRocm91Z2ggbWVtb3J5IG1hcAogICAgICAgICBtWzpdID0gJ2MnKm1hcHNpemUKLSAgICAgICAgdmVyaWZ5KG1bOl0gPT0gJ2MnKm1hcHNpemUsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgJ2MnKm1hcHNpemUsCiAgICAgICAgICAgICAgICAiV3JpdGUtdGhyb3VnaCBtZW1vcnkgbWFwIG1lbW9yeSBub3QgdXBkYXRlZCBwcm9wZXJseS4iKQogICAgICAgICBtLmZsdXNoKCkKICAgICAgICAgbS5jbG9zZSgpCkBAIC0yMzQsNjYgKzIwMiw0NSBAQAogICAgICAgICBmID0gb3BlbihURVNURk4sICdyYicpCiAgICAgICAgIHN0dWZmID0gZi5yZWFkKCkKICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHZlcmlmeShzdHVmZiA9PSAnYycqbWFwc2l6ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHVmZiwgJ2MnKm1hcHNpemUsCiAgICAgICAgICAgICAgICAiV3JpdGUtdGhyb3VnaCBtZW1vcnkgbWFwIGRhdGEgZmlsZSBub3QgdXBkYXRlZCBwcm9wZXJseS4iKQogCi0gICAgICAgIHByaW50ICIgIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfQ09QWSIKKyAgICAgICAgIyBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX0NPUFkKICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfQ09QWSkKLSAgICAgICAgcHJpbnQgIiAgTW9kaWZ5aW5nIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcC4iCisgICAgICAgICMgTW9kaWZ5aW5nIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcAogICAgICAgICBtWzpdID0gJ2QnKm1hcHNpemUKLSAgICAgICAgdmVyaWZ5KG1bOl0gPT0gJ2QnICogbWFwc2l6ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAnZCcgKiBtYXBzaXplLAogICAgICAgICAgICAgICAgIkNvcHktb24td3JpdGUgbWVtb3J5IG1hcCBkYXRhIG5vdCB3cml0dGVuIGNvcnJlY3RseS4iKQogICAgICAgICBtLmZsdXNoKCkKLSAgICAgICAgdmVyaWZ5KG9wZW4oVEVTVEZOLCAicmIiKS5yZWFkKCkgPT0gJ2MnKm1hcHNpemUsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlbihURVNURk4sICJyYiIpLnJlYWQoKSwgJ2MnKm1hcHNpemUsCiAgICAgICAgICAgICAgICAiQ29weS1vbi13cml0ZSB0ZXN0IGRhdGEgZmlsZSBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHByaW50ICIgIEVuc3VyaW5nIGNvcHktb24td3JpdGUgbWFwcyBjYW5ub3QgYmUgcmVzaXplZC4iCi0gICAgICAgICAgICBtLnJlc2l6ZSgyKm1hcHNpemUpCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkNvcHktb24td3JpdGUgbW1hcCByZXNpemUgZGlkIG5vdCByYWlzZSBleGNlcHRpb24uIikKKyAgICAgICAgIyBFbnN1cmluZyBjb3B5LW9uLXdyaXRlIG1hcHMgY2Fubm90IGJlIHJlc2l6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtLnJlc2l6ZSwgMiptYXBzaXplKQogICAgICAgICBkZWwgbSwgZgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwcmludCAiICBFbnN1cmluZyBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIgcmFpc2VzIGV4Y2VwdGlvbi4iCi0gICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQotICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBhY2Nlc3M9NCkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkludmFsaWQgYWNjZXNzIGNvZGUgc2hvdWxkIGhhdmUgcmFpc2VkIGV4Y2VwdGlvbi4iKQorCisgICAgICAgICMgRW5zdXJpbmcgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyIHJhaXNlcyBleGNlcHRpb24KKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW1hcC5tbWFwLCBmLmZpbGVubygpLCBtYXBzaXplLCBhY2Nlc3M9NCkKKyAgICAgICAgZi5jbG9zZSgpCiAKICAgICAgICAgaWYgb3MubmFtZSA9PSAicG9zaXgiOgogICAgICAgICAgICAgIyBUcnkgaW5jb21wYXRpYmxlIGZsYWdzLCBwcm90IGFuZCBhY2Nlc3MgcGFyYW1ldGVycy4KICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBmbGFncz1tbWFwLk1BUF9QUklWQVRFLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW1hcC5tbWFwLCBmLmZpbGVubygpLCBtYXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9bW1hcC5NQVBfUFJJVkFURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Q9bW1hcC5QUk9UX1JFQUQsIGFjY2Vzcz1tbWFwLkFDQ0VTU19XUklURSkKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdmVyaWZ5KDAsICJJbmNvbXBhdGlibGUgcGFyYW1ldGVycyBzaG91bGQgcmFpc2UgVmFsdWVFcnJvci4iKQogICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgZmluYWxseToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCiAKLSAgICBwcmludCAnICBUcnkgb3BlbmluZyBhIGJhZCBmaWxlIGRlc2NyaXB0b3IuLi4nCi0gICAgdHJ5OgotICAgICAgICBtbWFwLm1tYXAoLTIsIDQwOTYpCi0gICAgZXhjZXB0IG1tYXAuZXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICB2ZXJpZnkoMCwgJ2V4cGVjdGVkIGEgbW1hcC5lcnJvciBidXQgZGlkIG5vdCBnZXQgaXQnKQorICAgIGRlZiB0ZXN0X2JhZF9maWxlX2Rlc2Moc2VsZik6CisgICAgICAgICMgVHJ5IG9wZW5pbmcgYSBiYWQgZmlsZSBkZXNjcmlwdG9yLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1tYXAuZXJyb3IsIG1tYXAubW1hcCwgLTIsIDQwOTYpCiAKLSAgICAjIERvIGEgdG91Z2hlciAuZmluZCgpIHRlc3QuICBTRiBidWcgNTE1OTQzIHBvaW50ZWQgb3V0IHRoYXQsIGluIDIuMiwKLSAgICAjIHNlYXJjaGluZyBmb3IgZGF0YSB3aXRoIGVtYmVkZGVkIFwwIGJ5dGVzIGRpZG4ndCB3b3JrLgotICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKyAgICBkZWYgdGVzdF90b3VnaGVyX2ZpbmQoc2VsZik6CisgICAgICAgICMgRG8gYSB0b3VnaGVyIC5maW5kKCkgdGVzdC4gIFNGIGJ1ZyA1MTU5NDMgcG9pbnRlZCBvdXQgdGhhdCwgaW4gMi4yLAorICAgICAgICAjIHNlYXJjaGluZyBmb3IgZGF0YSB3aXRoIGVtYmVkZGVkIFwwIGJ5dGVzIGRpZG4ndCB3b3JrLgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCiAKLSAgICB0cnk6ICAgICMgdW5saW5rIFRFU1RGTiBubyBtYXR0ZXIgd2hhdAogICAgICAgICBkYXRhID0gJ2FhYmFhY1x4MDBkZWVmXHgwMFx4MDBhYVx4MDAnCiAgICAgICAgIG4gPSBsZW4oZGF0YSkKICAgICAgICAgZi53cml0ZShkYXRhKQpAQCAtMzA0LDE3ICsyNTEsMTQgQEAKICAgICAgICAgZm9yIHN0YXJ0IGluIHJhbmdlKG4rMSk6CiAgICAgICAgICAgICBmb3IgZmluaXNoIGluIHJhbmdlKHN0YXJ0LCBuKzEpOgogICAgICAgICAgICAgICAgIHNsaWNlID0gZGF0YVtzdGFydCA6IGZpbmlzaF0KLSAgICAgICAgICAgICAgICB2ZXJlcShtLmZpbmQoc2xpY2UpLCBkYXRhLmZpbmQoc2xpY2UpKQotICAgICAgICAgICAgICAgIHZlcmVxKG0uZmluZChzbGljZSArICd4JyksIC0xKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKHNsaWNlKSwgZGF0YS5maW5kKHNsaWNlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZChzbGljZSArICd4JyksIC0xKQogICAgICAgICBtLmNsb3NlKCkKIAotICAgIGZpbmFsbHk6Ci0gICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgZGVmIHRlc3RfZG91YmxlX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBhIGRvdWJsZSBjbG9zZSBkb2Vzbid0IGNyYXNoIG9uIFNvbGFyaXMgKEJ1ZyMgNjY1OTEzKQorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCiAKLSAgICAjIG1ha2Ugc3VyZSBhIGRvdWJsZSBjbG9zZSBkb2Vzbid0IGNyYXNoIG9uIFNvbGFyaXMgKEJ1ZyMgNjY1OTEzKQotICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKLQotICAgIHRyeTogICAgIyB1bmxpbmsgVEVTVEZOIG5vIG1hdHRlciB3aGF0CiAgICAgICAgIGYud3JpdGUoMioqMTYgKiAnYScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgogICAgICAgICBmLmNsb3NlKCkKIApAQCAtMzI0LDcyICsyNjgsNDYgQEAKICAgICAgICAgbWYuY2xvc2UoKQogICAgICAgICBmLmNsb3NlKCkKIAotICAgIGZpbmFsbHk6Ci0gICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgZGVmIHRlc3RfZW50aXJlX2ZpbGUoc2VsZik6CisgICAgICAgICMgdGVzdCBtYXBwaW5nIG9mIGVudGlyZSBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IgbWFwIGxlbmd0aAorICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3RhdCIpOgorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidysiKQogCi0gICAgIyB0ZXN0IG1hcHBpbmcgb2YgZW50aXJlIGZpbGUgYnkgcGFzc2luZyAwIGZvciBtYXAgbGVuZ3RoCi0gICAgaWYgaGFzYXR0cihvcywgInN0YXQiKToKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCBwYXNzaW5nIDAgYXMgbWFwIGxlbmd0aCBzZXRzIG1hcCBzaXplIHRvIGN1cnJlbnQgZmlsZSBzaXplLiIKLSAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidysiKQotCi0gICAgICAgIHRyeToKICAgICAgICAgICAgIGYud3JpdGUoMioqMTYgKiAnbScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgogICAgICAgICAgICAgZi5jbG9zZSgpCiAKICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInJiKyIpCiAgICAgICAgICAgICBtZiA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwKQotICAgICAgICAgICAgdmVyaWZ5KGxlbihtZikgPT0gMioqMTYsICJNYXAgc2l6ZSBzaG91bGQgZXF1YWwgZmlsZSBzaXplLiIpCi0gICAgICAgICAgICB2ZXJlcShtZi5yZWFkKDIqKjE2KSwgMioqMTYgKiAibSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtZiksIDIqKjE2LCAiTWFwIHNpemUgc2hvdWxkIGVxdWFsIGZpbGUgc2l6ZS4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZi5yZWFkKDIqKjE2KSwgMioqMTYgKiAibSIpCiAgICAgICAgICAgICBtZi5jbG9zZSgpCiAgICAgICAgICAgICBmLmNsb3NlKCkKIAotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICBkZWYgdGVzdF9tb3ZlKHNlbGYpOgorICAgICAgICAjIG1ha2UgbW92ZSB3b3JrcyBldmVyeXdoZXJlICg2NC1iaXQgZm9ybWF0IHByb2JsZW0gZWFybGllcikKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQogCi0gICAgIyB0ZXN0IG1hcHBpbmcgb2YgZW50aXJlIGZpbGUgYnkgcGFzc2luZyAwIGZvciBtYXAgbGVuZ3RoCi0gICAgaWYgaGFzYXR0cihvcywgInN0YXQiKToKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCBwYXNzaW5nIDAgYXMgbWFwIGxlbmd0aCBzZXRzIG1hcCBzaXplIHRvIGN1cnJlbnQgZmlsZSBzaXplLiIKLSAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidysiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKDIqKjE2ICogJ20nKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKLSAgICAgICAgICAgIGYuY2xvc2UoKQotCi0gICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyYisiKQotICAgICAgICAgICAgbWYgPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCkKLSAgICAgICAgICAgIHZlcmlmeShsZW4obWYpID09IDIqKjE2LCAiTWFwIHNpemUgc2hvdWxkIGVxdWFsIGZpbGUgc2l6ZS4iKQotICAgICAgICAgICAgdmVyZXEobWYucmVhZCgyKioxNiksIDIqKjE2ICogIm0iKQotICAgICAgICAgICAgbWYuY2xvc2UoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCi0KLSAgICAjIG1ha2UgbW92ZSB3b3JrcyBldmVyeXdoZXJlICg2NC1iaXQgZm9ybWF0IHByb2JsZW0gZWFybGllcikKLSAgICBmID0gb3BlbihURVNURk4sICd3KycpCi0KLSAgICB0cnk6ICAgICMgdW5saW5rIFRFU1RGTiBubyBtYXR0ZXIgd2hhdAogICAgICAgICBmLndyaXRlKCJBQkNERWFiY2RlIikgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCiAgICAgICAgIGYuZmx1c2goKQogCiAgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDEwKQogICAgICAgICBtZi5tb3ZlKDUsIDAsIDUpCi0gICAgICAgIHZlcmlmeShtZls6XSA9PSAiQUJDREVBQkNERSIsICJNYXAgbW92ZSBzaG91bGQgaGF2ZSBkdXBsaWNhdGVkIGZyb250IDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1mWzpdLCAiQUJDREVBQkNERSIsICJNYXAgbW92ZSBzaG91bGQgaGF2ZSBkdXBsaWNhdGVkIGZyb250IDUiKQogICAgICAgICBtZi5jbG9zZSgpCiAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgZmluYWxseToKLSAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICBkZWYgdGVzdF9hbm9ueW1vdXMoc2VsZik6CisgICAgICAgICMgYW5vbnltb3VzIG1tYXAubW1hcCgtMSwgUEFHRSkKKyAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgUEFHRVNJWkUpCisgICAgICAgIGZvciB4IGluIHhyYW5nZShQQUdFU0laRSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1beF0sICdcMCcsICJhbm9ueW1vdXNseSBtbWFwJ2VkIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvIikKIAotZGVmIHRlc3RfYW5vbigpOgotICAgIHByaW50ICIgIGFub255bW91cyBtbWFwLm1tYXAoLTEsIFBBR0VTSVpFKS4uLiIKLSAgICBtID0gbW1hcC5tbWFwKC0xLCBQQUdFU0laRSkKLSAgICBmb3IgeCBpbiB4cmFuZ2UoUEFHRVNJWkUpOgotICAgICAgICB2ZXJpZnkobVt4XSA9PSAnXDAnLCAiYW5vbnltb3VzbHkgbW1hcCdlZCBjb250ZW50cyBzaG91bGQgYmUgemVybyIpCisgICAgICAgIGZvciB4IGluIHhyYW5nZShQQUdFU0laRSk6CisgICAgICAgICAgICBtW3hdID0gY2ggPSBjaHIoeCAmIDI1NSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVt4XSwgY2gpCiAKLSAgICBmb3IgeCBpbiB4cmFuZ2UoUEFHRVNJWkUpOgotICAgICAgICBtW3hdID0gY2ggPSBjaHIoeCAmIDI1NSkKLSAgICAgICAgdmVyZXEobVt4XSwgY2gpCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE1tYXBUZXN0cykKIAotdGVzdF9ib3RoKCkKLXRlc3RfYW5vbigpCi1wcmludCAnIFRlc3QgcGFzc2VkJworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHkgYi9MaWIvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weQppbmRleCAwYjhlNDUxLi43ZGEyNDFiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weQpAQCAtNTAsNyArNTAsNyBAQAogbWF5YmVfdGVzdF9uZXcgPSBbCiAgICAgImEubW9kdWxlIiwKICAgICBbImEiLCAiYS5tb2R1bGUiLCAic3lzIiwKLSAgICAgImIiXSwKKyAgICAgImIiLCAiX19mdXR1cmVfXyJdLAogICAgIFsiYyJdLCBbImIuc29tZXRoaW5nIl0sCiAgICAgIiIiXAogYS9fX2luaXRfXy5weQpAQCAtNTgsNiArNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGIgaW1wb3J0IHNvbWV0aGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGMgaW1wb3J0IHNvbWV0aGluZwogYi9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKgogIiIiXQogCkBAIC04NiwxMiArODcsMTMgQEAKICAgICAiYS5tb2R1bGUiLAogICAgIFsiYSIsICJhLm1vZHVsZSIsCiAgICAgICJiIiwgImIueCIsICJiLnkiLCAiYi56IiwKLSAgICAgInN5cyIsICJleGNlcHRpb25zIl0sCisgICAgICJfX2Z1dHVyZV9fIiwgInN5cyIsICJleGNlcHRpb25zIl0sCiAgICAgWyJibGFoYmxhaCIsICJ6Il0sIFtdLAogICAgICIiIlwKIG15bW9kdWxlLnB5CiBhL19faW5pdF9fLnB5CiBhL21vZHVsZS5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzICMgc3lzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBibGFoYmxhaCAjIGZhaWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBleGNlcHRpb25zICMgZXhjZXB0aW9ucwpAQCAtMTE1LDcgKzExNyw4IEBACiAKIHJlbGF0aXZlX2ltcG9ydF90ZXN0ID0gWwogICAgICJhLm1vZHVsZSIsCi0gICAgWyJhIiwgImEubW9kdWxlIiwKKyAgICBbIl9fZnV0dXJlX18iLAorICAgICAiYSIsICJhLm1vZHVsZSIsCiAgICAgICJhLmIiLCAiYS5iLnkiLCAiYS5iLnoiLAogICAgICAiYS5iLmMiLCAiYS5iLmMubW9kdWxlQyIsCiAgICAgICJhLmIuYy5kIiwgImEuYi5jLmUiLApAQCAtMTI3LDYgKzEzMCw3IEBACiBhL19faW5pdF9fLnB5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLmIgaW1wb3J0IHksIHogIyBhLmIueSwgYS5iLnoKIGEvbW9kdWxlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0ICMgX19mdXR1cmVfXwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZXhjZXB0aW9ucyAjIGV4Y2VwdGlvbnMKIGEvZXhjZXB0aW9ucy5weQogYS9zeXMucHkKQEAgLTI1Myw2ICsyNTcsNyBAQAogICAgICAgICAgICAgc2VsZi5fZG9fdGVzdChyZWxhdGl2ZV9pbXBvcnRfdGVzdF8yKQogCiBkZWYgdGVzdF9tYWluKCk6CisgICAgZGlzdHV0aWxzLmxvZy5zZXRfdGhyZXNob2xkKGRpc3R1dGlscy5sb2cuV0FSTikKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE1vZHVsZUZpbmRlclRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCA5NWY0YjM4Li5mYjdmODJkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTIwMiw2ICsyMDIsMjIgQEAKICAgICAgICAgdW5pID0gdSc6aHU0OnVuaXRceGU5IGRlIGZhbWlsbGUnCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNvMjAyMmpwMi5kZWNvZGUoJ2lzbzIwMjItanAtMicpLCB1bmkpCiAKKyAgICBkZWYgdGVzdF9pc28yMDIyX2pwX2cwKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxJZignXHgwZScgaW4gdSdcTntTT0ZUIEhZUEhFTn0nLmVuY29kZSgnaXNvLTIwMjItanAtMicpKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gKCdpc28tMjAyMi1qcC0yMDA0JywgJ2lzby0yMDIyLWpwLTMnKToKKyAgICAgICAgICAgIGUgPSB1J1x1MzQwNicuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYoZmlsdGVyKGxhbWJkYSB4OiB4ID49ICdceDgwJywgZSkpCisKKyAgICBkZWYgdGVzdF9idWcxNTcyODMyKHNlbGYpOgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+PSAweDEwMDAwOgorICAgICAgICAgICAgbXl1bmljaHIgPSB1bmljaHIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG15dW5pY2hyID0gbGFtYmRhIHg6IHVuaWNocigweEQ3QzArKHg+PjEwKSkgKyB1bmljaHIoMHhEQzAwKyh4JjB4M0ZGKSkKKworICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoMHgxMDAwMCwgMHgxMTAwMDApOgorICAgICAgICAgICAgIyBBbnkgSVNPIDIwMjIgY29kZWMgd2lsbCBjYXVzZSB0aGUgc2VnZmF1bHQKKyAgICAgICAgICAgIG15dW5pY2hyKHgpLmVuY29kZSgnaXNvXzIwMjJfanAnLCAnaWdub3JlJykKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0X011bHRpYnl0ZUNvZGVjKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXV0YW50cy5weSBiL0xpYi90ZXN0L3Rlc3RfbXV0YW50cy5weQppbmRleCA4YWZkYTc1Li42MjE1MjI2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211dGFudHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdXRhbnRzLnB5CkBAIC05Miw4ICs5Miw4IEBACiAgICAgICAgICMjc2VsZi5oYXNoY29kZSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDAwMCkKIAogICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgIyNyZXR1cm4gc2VsZi5oYXNoY29kZQogICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNvZGUKIAogICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICBtYXliZV9tdXRhdGUoKSAgICMgVGhlIHBvaW50IG9mIHRoZSB0ZXN0LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9uZXcucHkgYi9MaWIvdGVzdC90ZXN0X25ldy5weQppbmRleCAzYzE2YmY1Li5lOTBmZDY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25ldy5weQorKysgYi9MaWIvdGVzdC90ZXN0X25ldy5weQpAQCAtNDcsNiArNDcsMTQgQEAKIGVsc2U6CiAgICAgcmFpc2UgVGVzdEZhaWxlZCwgImRhbmdlcm91cyBpbnN0YW5jZSBtZXRob2QgY3JlYXRpb24gYWxsb3dlZCIKIAorIyBWZXJpZnkgdGhhdCBpbnN0YW5jZW1ldGhvZCgpIGRvZXNuJ3QgYWxsb3cga2V5d29yZCBhcmdzCit0cnk6CisgICAgbmV3Lmluc3RhbmNlbWV0aG9kKGJyZWFrX3lvbGtzLCBjLCBrdz0xKQorZXhjZXB0IFR5cGVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHJhaXNlIFRlc3RGYWlsZWQsICJpbnN0YW5jZW1ldGhvZCBzaG91bGRuJ3QgYWNjZXB0IGtleXdvcmQgYXJncyIKKwogIyBJdCdzIHVuY2xlYXIgd2hhdCB0aGUgc2VtYW50aWNzIHNob3VsZCBiZSBmb3IgYSBjb2RlIG9iamVjdCBjb21waWxlZCBhdAogIyBtb2R1bGUgc2NvcGUsIGJ1dCBib3VuZCBhbmQgcnVuIGluIGEgZnVuY3Rpb24uICBJbiBDUHl0aG9uLCBgYycgaXMgZ2xvYmFsCiAjIChieSBhY2NpZGVudD8pIHdoaWxlIGluIEp5dGhvbiwgYGMnIGlzIGxvY2FsLiAgVGhlIGludGVudCBvZiB0aGUgdGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9uaXMucHkgYi9MaWIvdGVzdC90ZXN0X25pcy5weQppbmRleCBmNTIyNGZlLi41OTA4NjhmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25pcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X25pcy5weQpAQCAtMSwzMiArMSw0MSBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVGVzdEZhaWxlZCwgVGVzdFNraXBwZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgbmlzCiAKLXByaW50ICduaXMubWFwcygpJwotdHJ5OgotICAgIG1hcHMgPSBuaXMubWFwcygpCi1leGNlcHQgbmlzLmVycm9yLCBtc2c6Ci0gICAgIyBOSVMgaXMgcHJvYmFibHkgbm90IGFjdGl2ZSwgc28gdGhpcyB0ZXN0IGlzbid0IHVzZWZ1bAotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsIG1zZwotICAgICMgb25seSBkbyB0aGlzIGlmIHJ1bm5pbmcgdW5kZXIgdGhlIHJlZ3Jlc3Npb24gc3VpdGUKLSAgICByYWlzZSBUZXN0U2tpcHBlZCwgbXNnCitjbGFzcyBOaXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbWFwcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFwcyA9IG5pcy5tYXBzKCkKKyAgICAgICAgZXhjZXB0IG5pcy5lcnJvciwgbXNnOgorICAgICAgICAgICAgIyBOSVMgaXMgcHJvYmFibHkgbm90IGFjdGl2ZSwgc28gdGhpcyB0ZXN0IGlzbid0IHVzZWZ1bAorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIihmYWlsaW5nIGJlY2F1c2Ugb2YgdmVyYm9zZSBtb2RlKSAlcyIgJSBtc2cpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMsIHRoaXMgbWFwIGlzIG9ubHkgYWNjZXNzaWJsZSB0byB0aGUKKyAgICAgICAgICAgICMgc3VwZXIgdXNlcgorICAgICAgICAgICAgbWFwcy5yZW1vdmUoInBhc3N3ZC5hZGp1bmN0LmJ5bmFtZSIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcwogCi1kb25lID0gMAotZm9yIG5pc21hcCBpbiBtYXBzOgotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50IG5pc21hcAotICAgIG1hcHBpbmcgPSBuaXMuY2F0KG5pc21hcCkKLSAgICBmb3IgaywgdiBpbiBtYXBwaW5nLml0ZW1zKCk6Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAnICAgICcsIGssIHYKLSAgICAgICAgaWYgbm90IGs6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiBuaXMubWF0Y2goaywgbmlzbWFwKSAhPSB2OgotICAgICAgICAgICAgcHJpbnQgIk5JUyBtYXRjaCBmYWlsZWQgZm9yIGtleSBgJXMnIGluIG1hcCBgJXMnIiAlIChrLCBuaXNtYXApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIGp1c3QgdGVzdCB0aGUgb25lIGtleSwgb3RoZXJ3aXNlIHRoaXMgdGVzdCBjb3VsZCB0YWtlIGEKLSAgICAgICAgICAgICMgdmVyeSBsb25nIHRpbWUKLSAgICAgICAgICAgIGRvbmUgPSAxCi0gICAgICAgICAgICBicmVhawotICAgIGlmIGRvbmU6Ci0gICAgICAgIGJyZWFrCisgICAgICAgIGRvbmUgPSAwCisgICAgICAgIGZvciBuaXNtYXAgaW4gbWFwczoKKyAgICAgICAgICAgIG1hcHBpbmcgPSBuaXMuY2F0KG5pc21hcCkKKyAgICAgICAgICAgIGZvciBrLCB2IGluIG1hcHBpbmcuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgazoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBuaXMubWF0Y2goaywgbmlzbWFwKSAhPSB2OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5JUyBtYXRjaCBmYWlsZWQgZm9yIGtleSBgJXMnIGluIG1hcCBgJXMnIiAlIChrLCBuaXNtYXApKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMganVzdCB0ZXN0IHRoZSBvbmUga2V5LCBvdGhlcndpc2UgdGhpcyB0ZXN0IGNvdWxkIHRha2UgYQorICAgICAgICAgICAgICAgICAgICAjIHZlcnkgbG9uZyB0aW1lCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBkb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTmlzVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQppbmRleCA3NDIyNjdmLi4xYTJmNWQ2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CkBAIC0xLDEwMSArMSwxMTAgQEAKICMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgMiwgb3Bjb2RlcwogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBPcGNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RyeV9pbnNpZGVfZm9yX2xvb3Aoc2VsZik6CisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIG4gPSBuK2kKKyAgICAgICAgICAgIHRyeTogMS8wCisgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOiBwYXNzCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIHRyeTogcGFzcworICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgICAgICB0cnk6IHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6IHBhc3MKKyAgICAgICAgICAgIG4gPSBuK2kKKyAgICAgICAgaWYgbiAhPSA5MDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgndHJ5IGluc2lkZSBmb3InKQorCisgICAgZGVmIHRlc3RfcmFpc2VfY2xhc3NfZXhjZXB0aW9ucyhzZWxmKToKKworICAgICAgICBjbGFzcyBBQ2xhc3MoRXhjZXB0aW9uKTogcGFzcworICAgICAgICBjbGFzcyBCQ2xhc3MoQUNsYXNzKTogcGFzcworICAgICAgICBjbGFzcyBDQ2xhc3MoRXhjZXB0aW9uKTogcGFzcworICAgICAgICBjbGFzcyBEQ2xhc3MoQUNsYXNzKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZ25vcmUpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEFDbGFzcygpCisgICAgICAgIGV4Y2VwdDogcGFzcworCisgICAgICAgIHRyeTogcmFpc2UgQUNsYXNzKCkKKyAgICAgICAgZXhjZXB0IEFDbGFzczogcGFzcworCisgICAgICAgIHRyeTogcmFpc2UgQkNsYXNzKCkKKyAgICAgICAgZXhjZXB0IEFDbGFzczogcGFzcworCisgICAgICAgIHRyeTogcmFpc2UgQkNsYXNzKCkKKyAgICAgICAgZXhjZXB0IENDbGFzczogc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0OiBwYXNzCisKKyAgICAgICAgYSA9IEFDbGFzcygpCisgICAgICAgIGIgPSBCQ2xhc3MoKQorCisgICAgICAgIHRyeTogcmFpc2UgQUNsYXNzLCBiCisgICAgICAgIGV4Y2VwdCBCQ2xhc3MsIHY6CisgICAgICAgICAgICBpZiB2ICE9IGI6IHNlbGYuZmFpbCgidiE9YiIpCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICB0cnk6IHJhaXNlIGIKKyAgICAgICAgZXhjZXB0IEFDbGFzcywgdjoKKyAgICAgICAgICAgIGlmIHYgIT0gYjogc2VsZi5mYWlsKCJ2IT1iIEFDbGFzcyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgIyBub3QgZW5vdWdoIGFyZ3VtZW50cworICAgICAgICAjI3RyeTogIHJhaXNlIEJDbGFzcywgYQorICAgICAgICAjI2V4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgIyNlbHNlOiBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OiAgcmFpc2UgRENsYXNzLCBhCisgICAgICAgIGV4Y2VwdCBEQ2xhc3MsIHY6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2LCBEQ2xhc3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9vYmplY3RzKHNlbGYpOgorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhOiBOb25lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYTogYScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYTogYScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE9MTogYScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYT0xOiBhJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGE6IDAnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhOiAxJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBiOiBOb25lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYT1Ob25lOiBOb25lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYT0wOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhPTE6IE5vbmUnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCiAKIAotcHJpbnQgJzIuIE9wY29kZXMnCi1wcmludCAnWFhYIE5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQnCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE9wY29kZVRlc3QpCiAKLXByaW50ICcyLjEgdHJ5IGluc2lkZSBmb3IgbG9vcCcKLW4gPSAwCi1mb3IgaSBpbiByYW5nZSgxMCk6Ci0gICAgbiA9IG4raQotICAgIHRyeTogMS8wCi0gICAgZXhjZXB0IE5hbWVFcnJvcjogcGFzcwotICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLSAgICB0cnk6IHBhc3MKLSAgICBleGNlcHQ6IHBhc3MKLSAgICB0cnk6IHBhc3MKLSAgICBmaW5hbGx5OiBwYXNzCi0gICAgbiA9IG4raQotaWYgbiAhPSA5MDoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAndHJ5IGluc2lkZSBmb3InCi0KLQotcHJpbnQgJzIuMiByYWlzZSBjbGFzcyBleGNlcHRpb25zJwotCi1jbGFzcyBBQ2xhc3MoRXhjZXB0aW9uKTogcGFzcwotY2xhc3MgQkNsYXNzKEFDbGFzcyk6IHBhc3MKLWNsYXNzIENDbGFzcyhFeGNlcHRpb24pOiBwYXNzCi1jbGFzcyBEQ2xhc3MoQUNsYXNzKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgaWdub3JlKToKLSAgICAgICAgcGFzcwotCi10cnk6IHJhaXNlIEFDbGFzcygpCi1leGNlcHQ6IHBhc3MKLQotdHJ5OiByYWlzZSBBQ2xhc3MoKQotZXhjZXB0IEFDbGFzczogcGFzcwotCi10cnk6IHJhaXNlIEJDbGFzcygpCi1leGNlcHQgQUNsYXNzOiBwYXNzCi0KLXRyeTogcmFpc2UgQkNsYXNzKCkKLWV4Y2VwdCBDQ2xhc3M6IHJhaXNlIFRlc3RGYWlsZWQKLWV4Y2VwdDogcGFzcwotCi1hID0gQUNsYXNzKCkKLWIgPSBCQ2xhc3MoKQotCi10cnk6IHJhaXNlIEFDbGFzcywgYgotZXhjZXB0IEJDbGFzcywgdjoKLSAgICBpZiB2ICE9IGI6IHJhaXNlIFRlc3RGYWlsZWQsICJ2IT1iIgotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIm5vIGV4Y2VwdGlvbiIKLQotdHJ5OiByYWlzZSBiCi1leGNlcHQgQUNsYXNzLCB2OgotICAgIGlmIHYgIT0gYjogcmFpc2UgVGVzdEZhaWxlZCwgInYhPWIgQUNsYXNzIgotCi0jIG5vdCBlbm91Z2ggYXJndW1lbnRzCi0jI3RyeTogIHJhaXNlIEJDbGFzcywgYQotIyNleGNlcHQgVHlwZUVycm9yOiBwYXNzCi0KLXRyeTogIHJhaXNlIERDbGFzcywgYQotZXhjZXB0IERDbGFzcywgdjoKLSAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBEQ2xhc3MpOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAidiBub3QgRENsYXNzIgotCi1wcmludCAnMi4zIGNvbXBhcmluZyBmdW5jdGlvbiBvYmplY3RzJwotCi1mID0gZXZhbCgnbGFtYmRhOiBOb25lJykKLWcgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkLCAiZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgc2FtZSIKLQotZiA9IGV2YWwoJ2xhbWJkYSBhOiBhJykKLWcgPSBldmFsKCdsYW1iZGEgYTogYScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQsICJmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBzYW1lIgotCi1mID0gZXZhbCgnbGFtYmRhIGE9MTogYScpCi1nID0gZXZhbCgnbGFtYmRhIGE9MTogYScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQsICJmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBzYW1lIgotCi1mID0gZXZhbCgnbGFtYmRhOiAwJykKLWcgPSBldmFsKCdsYW1iZGE6IDEnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkCi0KLWYgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQotZyA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZAotCi1mID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQotZyA9IGV2YWwoJ2xhbWJkYSBiOiBOb25lJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZAotCi1mID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQotZyA9IGV2YWwoJ2xhbWJkYSBhPU5vbmU6IE5vbmUnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkCi0KLWYgPSBldmFsKCdsYW1iZGEgYT0wOiBOb25lJykKLWcgPSBldmFsKCdsYW1iZGEgYT0xOiBOb25lJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGVucHR5LnB5IGIvTGliL3Rlc3QvdGVzdF9vcGVucHR5LnB5CmluZGV4IGE4Yjg1NTAuLjY0NzFmNTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3BlbnB0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wZW5wdHkucHkKQEAgLTEsMTkgKzEsMjMgQEAKICMgVGVzdCB0byBzZWUgaWYgb3BlbnB0eSB3b3Jrcy4gKEJ1dCBkb24ndCB3b3JyeSBpZiBpdCBpc24ndCBhdmFpbGFibGUuKQogCi1pbXBvcnQgb3MKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRlc3RGYWlsZWQsIFRlc3RTa2lwcGVkCitpbXBvcnQgb3MsIHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRlc3RTa2lwcGVkCiAKLXRyeToKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCAiQ2FsbGluZyBvcy5vcGVucHR5KCkiCi0gICAgbWFzdGVyLCBzbGF2ZSA9IG9zLm9wZW5wdHkoKQotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICIobWFzdGVyLCBzbGF2ZSkgPSAoJWQsICVkKSIlKG1hc3Rlciwgc2xhdmUpCi1leGNlcHQgQXR0cmlidXRlRXJyb3I6CitpZiBub3QgaGFzYXR0cihvcywgIm9wZW5wdHkiKToKICAgICByYWlzZSBUZXN0U2tpcHBlZCwgIk5vIG9wZW5wdHkoKSBhdmFpbGFibGUuIgogCi1pZiBub3Qgb3MuaXNhdHR5KHNsYXZlKToKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAiU2xhdmUtZW5kIG9mIHB0eSBpcyBub3QgYSB0ZXJtaW5hbC4iCiAKLW9zLndyaXRlKHNsYXZlLCAnUGluZyEnKQotcHJpbnQgb3MucmVhZChtYXN0ZXIsIDEwMjQpCitjbGFzcyBPcGVucHR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIG1hc3Rlciwgc2xhdmUgPSBvcy5vcGVucHR5KCkKKyAgICAgICAgaWYgbm90IG9zLmlzYXR0eShzbGF2ZSk6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNsYXZlLWVuZCBvZiBwdHkgaXMgbm90IGEgdGVybWluYWwuIikKKworICAgICAgICBvcy53cml0ZShzbGF2ZSwgJ1BpbmchJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5yZWFkKG1hc3RlciwgMTAyNCksICdQaW5nIScpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoT3BlbnB0eVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IGJmMGUxOTYuLjFjODdkMDYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMjIzLDYgKzIyMywyMyBAQAogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCisgICAgZGVmIHRlc3RfdXRpbWVfZGlyKHNlbGYpOgorICAgICAgICBkZWx0YSA9IDEwMDAwMDAKKyAgICAgICAgc3QgPSBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICMgcm91bmQgdG8gaW50LCBiZWNhdXNlIHNvbWUgc3lzdGVtcyBtYXkgc3VwcG9ydCBzdWItc2Vjb25kCisgICAgICAgICMgdGltZSBzdGFtcHMgaW4gc3RhdCwgYnV0IG5vdCBpbiB1dGltZS4KKyAgICAgICAgb3MudXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTiwgKHN0LnN0X2F0aW1lLCBpbnQoc3Quc3RfbXRpbWUtZGVsdGEpKSkKKyAgICAgICAgc3QyID0gb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdDIuc3RfbXRpbWUsIGludChzdC5zdF9tdGltZS1kZWx0YSkpCisKKyAgICAjIFJlc3RyaWN0IHRlc3QgdG8gV2luMzIsIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvdGhlcgorICAgICMgc3lzdGVtcyBzdXBwb3J0IGNlbnRpc2Vjb25kcworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICBkZWYgdGVzdF8xNTY1MTUwKHNlbGYpOgorICAgICAgICAgICAgdDEgPSAxMTU5MTk1MDM5LjI1CisgICAgICAgICAgICBvcy51dGltZShzZWxmLmZuYW1lLCAodDEsIHQxKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9zLnN0YXQoc2VsZi5mbmFtZSkuc3RfbXRpbWUsIHQxKQorCiBmcm9tIHRlc3QgaW1wb3J0IG1hcHBpbmdfdGVzdHMKIAogY2xhc3MgRW52aXJvblRlc3RzKG1hcHBpbmdfdGVzdHMuQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKaW5kZXggOTYzODRjZC4uMGJmMTIxOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKQEAgLTE4Myw2ICsxODMsNDQgQEAKICAgICBkZWYgdGVzdF9hc3NlcnQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImFzc2VydCBhbG8gPCBhaGkgYW5kIGJsbyA8IGJoaVxuIikKIAorICAgIGRlZiB0ZXN0X3Bvc2l0aW9uKHNlbGYpOgorICAgICAgICAjIEFuIGFic29sdXRlbHkgbWluaW1hbCB0ZXN0IG9mIHBvc2l0aW9uIGluZm9ybWF0aW9uLiAgQmV0dGVyCisgICAgICAgICMgdGVzdHMgd291bGQgYmUgYSBiaWcgcHJvamVjdC4KKyAgICAgICAgY29kZSA9ICJkZWYgZih4KTpcbiAgICByZXR1cm4geCArIDFcbiIKKyAgICAgICAgc3QxID0gcGFyc2VyLnN1aXRlKGNvZGUpCisgICAgICAgIHN0MiA9IHN0MS50b3R1cGxlKGxpbmVfaW5mbz0xLCBjb2xfaW5mbz0xKQorCisgICAgICAgIGRlZiB3YWxrKHRyZWUpOgorICAgICAgICAgICAgbm9kZV90eXBlID0gdHJlZVswXQorICAgICAgICAgICAgbmV4dCA9IHRyZWVbMV0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmV4dCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIGZvciBlbHQgaW4gdHJlZVsxOl06CisgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIHdhbGsoZWx0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHgKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgdHJlZQorCisgICAgICAgIHRlcm1pbmFscyA9IGxpc3Qod2FsayhzdDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsKKyAgICAgICAgICAgICgxLCAnZGVmJywgMSwgMCksCisgICAgICAgICAgICAoMSwgJ2YnLCAxLCA0KSwKKyAgICAgICAgICAgICg3LCAnKCcsIDEsIDUpLAorICAgICAgICAgICAgKDEsICd4JywgMSwgNiksCisgICAgICAgICAgICAoOCwgJyknLCAxLCA3KSwKKyAgICAgICAgICAgICgxMSwgJzonLCAxLCA4KSwKKyAgICAgICAgICAgICg0LCAnJywgMSwgOSksCisgICAgICAgICAgICAoNSwgJycsIDIsIC0xKSwKKyAgICAgICAgICAgICgxLCAncmV0dXJuJywgMiwgNCksCisgICAgICAgICAgICAoMSwgJ3gnLCAyLCAxMSksCisgICAgICAgICAgICAoMTQsICcrJywgMiwgMTMpLAorICAgICAgICAgICAgKDIsICcxJywgMiwgMTUpLAorICAgICAgICAgICAgKDQsICcnLCAyLCAxNiksCisgICAgICAgICAgICAoNiwgJycsIDIsIC0xKSwKKyAgICAgICAgICAgICg0LCAnJywgMiwgLTEpLAorICAgICAgICAgICAgKDAsICcnLCAyLCAtMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFscykKKworCiAjCiAjICBTZWNvbmQsIHdlIHRha2UgKmludmFsaWQqIHRyZWVzIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IFBhcnNlckVycm9yCiAjICByZWplY3Rpb25zIGZvciB0aGVtLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQppbmRleCBiZTdkNGU4Li43NzlhMjBhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQpAQCAtMTYwLDYgKzE2MCw0MSBAQAogICAgICAgICBzZWxmLmFzc2VydF8oJyhOb25lKScgbm90IGluIGFzbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDEpCiAKKyAgICBkZWYgdGVzdF9lbGltX2p1bXBfdG9fcmV0dXJuKHNlbGYpOgorICAgICAgICAjIEpVTVBfRk9SV0FSRCB0byBSRVRVUk4gLS0+ICBSRVRVUk4KKyAgICAgICAgZGVmIGYoY29uZCwgdHJ1ZV92YWx1ZSwgZmFsc2VfdmFsdWUpOgorICAgICAgICAgICAgcmV0dXJuIHRydWVfdmFsdWUgaWYgY29uZCBlbHNlIGZhbHNlX3ZhbHVlCisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9GT1JXQVJEJyBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfQUJTT0xVVEUnIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCAyKQorCisgICAgZGVmIHRlc3RfZWxpbV9qdW1wX2FmdGVyX3JldHVybjEoc2VsZik6CisgICAgICAgICMgRWxpbWluYXRlIGRlYWQgY29kZToganVtcHMgaW1tZWRpYXRlbHkgYWZ0ZXIgcmV0dXJucyBjYW4ndCBiZSByZWFjaGVkCisgICAgICAgIGRlZiBmKGNvbmQxLCBjb25kMik6CisgICAgICAgICAgICBpZiBjb25kMTogcmV0dXJuIDEKKyAgICAgICAgICAgIGlmIGNvbmQyOiByZXR1cm4gMgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gMworICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBjb25kMTogcmV0dXJuIDQKKyAgICAgICAgICAgICAgICByZXR1cm4gNQorICAgICAgICAgICAgcmV0dXJuIDYKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9BQlNPTFVURScgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDYpCisKKyAgICBkZWYgdGVzdF9lbGltX2p1bXBfYWZ0ZXJfcmV0dXJuMihzZWxmKToKKyAgICAgICAgIyBFbGltaW5hdGUgZGVhZCBjb2RlOiBqdW1wcyBpbW1lZGlhdGVseSBhZnRlciByZXR1cm5zIGNhbid0IGJlIHJlYWNoZWQKKyAgICAgICAgZGVmIGYoY29uZDEsIGNvbmQyKToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgY29uZDE6IHJldHVybiA0CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9GT1JXQVJEJyBub3QgaW4gYXNtKQorICAgICAgICAjIFRoZXJlIHNob3VsZCBiZSBvbmUganVtcCBmb3IgdGhlIHdoaWxlIGxvb3AuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ0pVTVBfQUJTT0xVVEUnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDIpCiAKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQppbmRleCA3M2NmZmQyLi43NTYxMGI2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQpAQCAtMTUsOCArMTUsNyBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCkpCiAKICAgICBkZWYgdmVyaWZ5X2luc3RhbmNlX2ludGVyZmFjZShzZWxmLCBpbnMpOgotICAgICAgICBmb3IgYXR0ciBpbiAoImFyZ3MiLCAibWVzc2FnZSIsICJfX3N0cl9fIiwgIl9fdW5pY29kZV9fIiwgIl9fcmVwcl9fIiwKLSAgICAgICAgICAgICAgICAiX19nZXRpdGVtX18iKToKKyAgICAgICAgZm9yIGF0dHIgaW4gKCJhcmdzIiwgIm1lc3NhZ2UiLCAiX19zdHJfXyIsICJfX3JlcHJfXyIsICJfX2dldGl0ZW1fXyIpOgogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIoaW5zLCBhdHRyKSwgIiVzIG1pc3NpbmcgJXMgYXR0cmlidXRlIiAlCiAgICAgICAgICAgICAgICAgICAgIChpbnMuX19jbGFzc19fLl9fbmFtZV9fLCBhdHRyKSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9wb2xsLnB5CmluZGV4IDNhNDhiY2UuLjYwY2QzZjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9sbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvbGwucHkKQEAgLTEsNyArMSw3IEBACiAjIFRlc3QgY2FzZSBmb3IgdGhlIG9zLnBvbGwoKSBmdW5jdGlvbgogCi1pbXBvcnQgc3lzLCBvcywgc2VsZWN0LCByYW5kb20KLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyYm9zZSwgVGVzdFNraXBwZWQsIFRFU1RGTgoraW1wb3J0IHN5cywgb3MsIHNlbGVjdCwgcmFuZG9tLCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIFRFU1RGTiwgcnVuX3VuaXR0ZXN0CiAKIHRyeToKICAgICBzZWxlY3QucG9sbApAQCAtMTYsMTc3ICsxNiwxNDEgQEAKICAgICAgICAgICAgIG1hdGNoLmFwcGVuZChmZCkKICAgICByZXR1cm4gbWF0Y2gKIAotZGVmIHRlc3RfcG9sbDEoKToKLSAgICAiIiJCYXNpYyBmdW5jdGlvbmFsIHRlc3Qgb2YgcG9sbCBvYmplY3QKK2NsYXNzIFBvbGxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBDcmVhdGUgYSBidW5jaCBvZiBwaXBlIGFuZCB0ZXN0IHRoYXQgcG9sbCB3b3JrcyB3aXRoIHRoZW0uCi0gICAgIiIiCi0gICAgcHJpbnQgJ1J1bm5pbmcgcG9sbCB0ZXN0IDEnCi0gICAgcCA9IHNlbGVjdC5wb2xsKCkKKyAgICBkZWYgdGVzdF9wb2xsMShzZWxmKToKKyAgICAgICAgIyBCYXNpYyBmdW5jdGlvbmFsIHRlc3Qgb2YgcG9sbCBvYmplY3QKKyAgICAgICAgIyBDcmVhdGUgYSBidW5jaCBvZiBwaXBlIGFuZCB0ZXN0IHRoYXQgcG9sbCB3b3JrcyB3aXRoIHRoZW0uCiAKLSAgICBOVU1fUElQRVMgPSAxMgotICAgIE1TRyA9ICIgVGhpcyBpcyBhIHRlc3QuIgotICAgIE1TR19MRU4gPSBsZW4oTVNHKQotICAgIHJlYWRlcnMgPSBbXQotICAgIHdyaXRlcnMgPSBbXQotICAgIHIydyA9IHt9Ci0gICAgdzJyID0ge30KKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKIAotICAgIGZvciBpIGluIHJhbmdlKE5VTV9QSVBFUyk6Ci0gICAgICAgIHJkLCB3ciA9IG9zLnBpcGUoKQotICAgICAgICBwLnJlZ2lzdGVyKHJkLCBzZWxlY3QuUE9MTElOKQotICAgICAgICBwLnJlZ2lzdGVyKHdyLCBzZWxlY3QuUE9MTE9VVCkKLSAgICAgICAgcmVhZGVycy5hcHBlbmQocmQpCi0gICAgICAgIHdyaXRlcnMuYXBwZW5kKHdyKQotICAgICAgICByMndbcmRdID0gd3IKLSAgICAgICAgdzJyW3dyXSA9IHJkCisgICAgICAgIE5VTV9QSVBFUyA9IDEyCisgICAgICAgIE1TRyA9ICIgVGhpcyBpcyBhIHRlc3QuIgorICAgICAgICBNU0dfTEVOID0gbGVuKE1TRykKKyAgICAgICAgcmVhZGVycyA9IFtdCisgICAgICAgIHdyaXRlcnMgPSBbXQorICAgICAgICByMncgPSB7fQorICAgICAgICB3MnIgPSB7fQogCi0gICAgd2hpbGUgd3JpdGVyczoKLSAgICAgICAgcmVhZHkgPSBwLnBvbGwoKQotICAgICAgICByZWFkeV93cml0ZXJzID0gZmluZF9yZWFkeV9tYXRjaGluZyhyZWFkeSwgc2VsZWN0LlBPTExPVVQpCi0gICAgICAgIGlmIG5vdCByZWFkeV93cml0ZXJzOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gcGlwZXMgcmVhZHkgZm9yIHdyaXRpbmciCi0gICAgICAgIHdyID0gcmFuZG9tLmNob2ljZShyZWFkeV93cml0ZXJzKQotICAgICAgICBvcy53cml0ZSh3ciwgTVNHKQorICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fUElQRVMpOgorICAgICAgICAgICAgcmQsIHdyID0gb3MucGlwZSgpCisgICAgICAgICAgICBwLnJlZ2lzdGVyKHJkLCBzZWxlY3QuUE9MTElOKQorICAgICAgICAgICAgcC5yZWdpc3Rlcih3ciwgc2VsZWN0LlBPTExPVVQpCisgICAgICAgICAgICByZWFkZXJzLmFwcGVuZChyZCkKKyAgICAgICAgICAgIHdyaXRlcnMuYXBwZW5kKHdyKQorICAgICAgICAgICAgcjJ3W3JkXSA9IHdyCisgICAgICAgICAgICB3MnJbd3JdID0gcmQKIAotICAgICAgICByZWFkeSA9IHAucG9sbCgpCi0gICAgICAgIHJlYWR5X3JlYWRlcnMgPSBmaW5kX3JlYWR5X21hdGNoaW5nKHJlYWR5LCBzZWxlY3QuUE9MTElOKQotICAgICAgICBpZiBub3QgcmVhZHlfcmVhZGVyczoKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIHBpcGVzIHJlYWR5IGZvciByZWFkaW5nIgotICAgICAgICByZCA9IHJhbmRvbS5jaG9pY2UocmVhZHlfcmVhZGVycykKLSAgICAgICAgYnVmID0gb3MucmVhZChyZCwgTVNHX0xFTikKLSAgICAgICAgdmVyaWZ5KGxlbihidWYpID09IE1TR19MRU4pCi0gICAgICAgIHByaW50IGJ1ZgotICAgICAgICBvcy5jbG9zZShyMndbcmRdKSA7IG9zLmNsb3NlKCByZCApCi0gICAgICAgIHAudW5yZWdpc3RlciggcjJ3W3JkXSApCi0gICAgICAgIHAudW5yZWdpc3RlciggcmQgKQotICAgICAgICB3cml0ZXJzLnJlbW92ZShyMndbcmRdKQorICAgICAgICBidWZzID0gW10KIAotICAgIHBvbGxfdW5pdF90ZXN0cygpCi0gICAgcHJpbnQgJ1BvbGwgdGVzdCAxIGNvbXBsZXRlJworICAgICAgICB3aGlsZSB3cml0ZXJzOgorICAgICAgICAgICAgcmVhZHkgPSBwLnBvbGwoKQorICAgICAgICAgICAgcmVhZHlfd3JpdGVycyA9IGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIHNlbGVjdC5QT0xMT1VUKQorICAgICAgICAgICAgaWYgbm90IHJlYWR5X3dyaXRlcnM6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gcGlwZXMgcmVhZHkgZm9yIHdyaXRpbmciCisgICAgICAgICAgICB3ciA9IHJhbmRvbS5jaG9pY2UocmVhZHlfd3JpdGVycykKKyAgICAgICAgICAgIG9zLndyaXRlKHdyLCBNU0cpCiAKLWRlZiBwb2xsX3VuaXRfdGVzdHMoKToKLSAgICAjIHJldHVybnMgTlZBTCBmb3IgaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKLSAgICBGRCA9IDQyCi0gICAgdHJ5OgotICAgICAgICBvcy5jbG9zZShGRCkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIHAgPSBzZWxlY3QucG9sbCgpCi0gICAgcC5yZWdpc3RlcihGRCkKLSAgICByID0gcC5wb2xsKCkKLSAgICB2ZXJpZnkoclswXSA9PSAoRkQsIHNlbGVjdC5QT0xMTlZBTCkpCisgICAgICAgICAgICByZWFkeSA9IHAucG9sbCgpCisgICAgICAgICAgICByZWFkeV9yZWFkZXJzID0gZmluZF9yZWFkeV9tYXRjaGluZyhyZWFkeSwgc2VsZWN0LlBPTExJTikKKyAgICAgICAgICAgIGlmIG5vdCByZWFkeV9yZWFkZXJzOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIHBpcGVzIHJlYWR5IGZvciByZWFkaW5nIgorICAgICAgICAgICAgcmQgPSByYW5kb20uY2hvaWNlKHJlYWR5X3JlYWRlcnMpCisgICAgICAgICAgICBidWYgPSBvcy5yZWFkKHJkLCBNU0dfTEVOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgTVNHX0xFTikKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGJ1ZikKKyAgICAgICAgICAgIG9zLmNsb3NlKHIyd1tyZF0pIDsgb3MuY2xvc2UoIHJkICkKKyAgICAgICAgICAgIHAudW5yZWdpc3RlciggcjJ3W3JkXSApCisgICAgICAgICAgICBwLnVucmVnaXN0ZXIoIHJkICkKKyAgICAgICAgICAgIHdyaXRlcnMucmVtb3ZlKHIyd1tyZF0pCiAKLSAgICBmID0gb3BlbihURVNURk4sICd3JykKLSAgICBmZCA9IGYuZmlsZW5vKCkKLSAgICBwID0gc2VsZWN0LnBvbGwoKQotICAgIHAucmVnaXN0ZXIoZikKLSAgICByID0gcC5wb2xsKCkKLSAgICB2ZXJpZnkoclswXVswXSA9PSBmZCkKLSAgICBmLmNsb3NlKCkKLSAgICByID0gcC5wb2xsKCkKLSAgICB2ZXJpZnkoclswXSA9PSAoZmQsIHNlbGVjdC5QT0xMTlZBTCkpCi0gICAgb3MudW5saW5rKFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZzLCBbTVNHXSAqIE5VTV9QSVBFUykKIAotICAgICMgdHlwZSBlcnJvciBmb3IgaW52YWxpZCBhcmd1bWVudHMKLSAgICBwID0gc2VsZWN0LnBvbGwoKQotICAgIHRyeToKLSAgICAgICAgcC5yZWdpc3RlcihwKQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBwcmludCAiQm9ndXMgcmVnaXN0ZXIgY2FsbCBkaWQgbm90IHJhaXNlIFR5cGVFcnJvciIKLSAgICB0cnk6Ci0gICAgICAgIHAudW5yZWdpc3RlcihwKQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBwcmludCAiQm9ndXMgdW5yZWdpc3RlciBjYWxsIGRpZCBub3QgcmFpc2UgVHlwZUVycm9yIgorICAgIGRlZiBwb2xsX3VuaXRfdGVzdHMoc2VsZik6CisgICAgICAgICMgcmV0dXJucyBOVkFMIGZvciBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICBGRCA9IDQyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNsb3NlKEZEKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgcC5yZWdpc3RlcihGRCkKKyAgICAgICAgciA9IHAucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoclswXSwgKEZELCBzZWxlY3QuUE9MTE5WQUwpKQogCi0gICAgIyBjYW4ndCB1bnJlZ2lzdGVyIG5vbi1leGlzdGVudCBvYmplY3QKLSAgICBwID0gc2VsZWN0LnBvbGwoKQotICAgIHRyeToKLSAgICAgICAgcC51bnJlZ2lzdGVyKDMpCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgIkJvZ3VzIHVucmVnaXN0ZXIgY2FsbCBkaWQgbm90IHJhaXNlIEtleUVycm9yIgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgZmQgPSBmLmZpbGVubygpCisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHAucmVnaXN0ZXIoZikKKyAgICAgICAgciA9IHAucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoclswXVswXSwgZmQpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByID0gcC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWzBdLCAoZmQsIHNlbGVjdC5QT0xMTlZBTCkpCisgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKLSAgICAjIFRlc3QgZXJyb3IgY2FzZXMKLSAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKLSAgICBjbGFzcyBOb3BlOgotICAgICAgICBwYXNzCisgICAgICAgICMgdHlwZSBlcnJvciBmb3IgaW52YWxpZCBhcmd1bWVudHMKKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwLnJlZ2lzdGVyLCBwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHAudW5yZWdpc3RlciwgcCkKIAotICAgIGNsYXNzIEFsbW9zdDoKLSAgICAgICAgZGVmIGZpbGVubyhzZWxmKToKLSAgICAgICAgICAgIHJldHVybiAnZmlsZW5vJworICAgICAgICAjIGNhbid0IHVucmVnaXN0ZXIgbm9uLWV4aXN0ZW50IG9iamVjdAorICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcC51bnJlZ2lzdGVyLCAzKQogCi0gICAgdHJ5OgotICAgICAgICBwb2xsc3Rlci5yZWdpc3RlciggTm9wZSgpLCAwICkKLSAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCi0gICAgZWxzZTogcHJpbnQgJ2V4cGVjdGVkIFR5cGVFcnJvciBleGNlcHRpb24sIG5vdCByYWlzZWQnCisgICAgICAgICMgVGVzdCBlcnJvciBjYXNlcworICAgICAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgY2xhc3MgTm9wZToKKyAgICAgICAgICAgIHBhc3MKIAotICAgIHRyeToKLSAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoIEFsbW9zdCgpLCAwICkKLSAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCi0gICAgZWxzZTogcHJpbnQgJ2V4cGVjdGVkIFR5cGVFcnJvciBleGNlcHRpb24sIG5vdCByYWlzZWQnCisgICAgICAgIGNsYXNzIEFsbW9zdDoKKyAgICAgICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlbm8nCiAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb2xsc3Rlci5yZWdpc3RlciwgTm9wZSgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvbGxzdGVyLnJlZ2lzdGVyLCBBbG1vc3QoKSwgMCkKIAotIyBBbm90aGVyIHRlc3QgY2FzZSBmb3IgcG9sbCgpLiAgVGhpcyBpcyBjb3BpZWQgZnJvbSB0aGUgdGVzdCBjYXNlIGZvcgotIyBzZWxlY3QoKSwgbW9kaWZpZWQgdG8gdXNlIHBvbGwoKSBpbnN0ZWFkLgorICAgICMgQW5vdGhlciB0ZXN0IGNhc2UgZm9yIHBvbGwoKS4gIFRoaXMgaXMgY29waWVkIGZyb20gdGhlIHRlc3QgY2FzZSBmb3IKKyAgICAjIHNlbGVjdCgpLCBtb2RpZmllZCB0byB1c2UgcG9sbCgpIGluc3RlYWQuCiAKLWRlZiB0ZXN0X3BvbGwyKCk6Ci0gICAgcHJpbnQgJ1J1bm5pbmcgcG9sbCB0ZXN0IDInCi0gICAgY21kID0gJ2ZvciBpIGluIDAgMSAyIDMgNCA1IDYgNyA4IDk7IGRvIGVjaG8gdGVzdGluZy4uLjsgc2xlZXAgMTsgZG9uZScKLSAgICBwID0gb3MucG9wZW4oY21kLCAncicpCi0gICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCi0gICAgcG9sbHN0ZXIucmVnaXN0ZXIoIHAsIHNlbGVjdC5QT0xMSU4gKQotICAgIGZvciB0b3V0IGluICgwLCAxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNjAwMCkgKyAoLTEsKSoxMDoKLSAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICd0aW1lb3V0ID0nLCB0b3V0Ci0gICAgICAgIGZkbGlzdCA9IHBvbGxzdGVyLnBvbGwodG91dCkKLSAgICAgICAgaWYgKGZkbGlzdCA9PSBbXSk6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmZCwgZmxhZ3MgPSBmZGxpc3RbMF0KLSAgICAgICAgaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTEhVUDoKLSAgICAgICAgICAgIGxpbmUgPSBwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIGxpbmUgIT0gIiI6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ2Vycm9yOiBwaXBlIHNlZW1zIHRvIGJlIGNsb3NlZCwgYnV0IHN0aWxsIHJldHVybnMgZGF0YScKLSAgICAgICAgICAgIGNvbnRpbnVlCisgICAgZGVmIHRlc3RfcG9sbDIoc2VsZik6CisgICAgICAgIGNtZCA9ICdmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDcgOCA5OyBkbyBlY2hvIHRlc3RpbmcuLi47IHNsZWVwIDE7IGRvbmUnCisgICAgICAgIHAgPSBvcy5wb3BlbihjbWQsICdyJykKKyAgICAgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHBvbGxzdGVyLnJlZ2lzdGVyKCBwLCBzZWxlY3QuUE9MTElOICkKKyAgICAgICAgZm9yIHRvdXQgaW4gKDAsIDEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE2MDAwKSArICgtMSwpKjEwOgorICAgICAgICAgICAgZmRsaXN0ID0gcG9sbHN0ZXIucG9sbCh0b3V0KQorICAgICAgICAgICAgaWYgKGZkbGlzdCA9PSBbXSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZkLCBmbGFncyA9IGZkbGlzdFswXQorICAgICAgICAgICAgaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTEhVUDoKKyAgICAgICAgICAgICAgICBsaW5lID0gcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSAhPSAiIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdlcnJvcjogcGlwZSBzZWVtcyB0byBiZSBjbG9zZWQsIGJ1dCBzdGlsbCByZXR1cm5zIGRhdGEnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgICAgZWxpZiBmbGFncyAmIHNlbGVjdC5QT0xMSU46Ci0gICAgICAgICAgICBsaW5lID0gcC5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgICAgIHByaW50IHJlcHIobGluZSkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICdFT0YnCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAnVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBzZWxlY3QucG9sbDonLCBmZGxpc3QKLSAgICBwLmNsb3NlKCkKLSAgICBwcmludCAnUG9sbCB0ZXN0IDIgY29tcGxldGUnCisgICAgICAgICAgICBlbGlmIGZsYWdzICYgc2VsZWN0LlBPTExJTjoKKyAgICAgICAgICAgICAgICBsaW5lID0gcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIHNlbGVjdC5wb2xsOiAlcycgJSBmZGxpc3QpCisgICAgICAgIHAuY2xvc2UoKQogCi1kZWYgdGVzdF9wb2xsMygpOgotICAgICMgdGVzdCBpbnQgb3ZlcmZsb3cKLSAgICBwcmludCAnUnVubmluZyBwb2xsIHRlc3QgMycKLSAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKLSAgICBwb2xsc3Rlci5yZWdpc3RlcigxKQorICAgIGRlZiB0ZXN0X3BvbGwzKHNlbGYpOgorICAgICAgICAjIHRlc3QgaW50IG92ZXJmbG93CisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwb2xsc3Rlci5yZWdpc3RlcigxKQogCi0gICAgdHJ5OgotICAgICAgICBwb2xsc3Rlci5wb2xsKDFMIDw8IDY0KQotICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgJ0V4cGVjdGVkIE92ZXJmbG93RXJyb3Igd2l0aCBleGNlc3NpdmUgdGltZW91dCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIucG9sbCwgMUwgPDwgNjQpCiAKLSAgICB4ID0gMiArIDMKLSAgICBpZiB4ICE9IDU6Ci0gICAgICAgIHByaW50ICdPdmVyZmxvdyBtdXN0IGhhdmUgb2NjdXJyZWQnCi0gICAgcHJpbnQgJ1BvbGwgdGVzdCAzIGNvbXBsZXRlJworICAgICAgICB4ID0gMiArIDMKKyAgICAgICAgaWYgeCAhPSA1OgorICAgICAgICAgICAgc2VsZi5mYWlsKCdPdmVyZmxvdyBtdXN0IGhhdmUgb2NjdXJyZWQnKQogCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFBvbGxUZXN0cykKIAotdGVzdF9wb2xsMSgpCi10ZXN0X3BvbGwyKCkKLXRlc3RfcG9sbDMoKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQppbmRleCAwMTcwM2I1Li43YzlkNGFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQpAQCAtOTUsNiArOTUsOSBAQAogICAgICAgICAgICAgcHlfaXRlbSA9IGdldGF0dHIobW9kdWxlLCBuYW1lKQogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgcHljbGJyLkZ1bmN0aW9uKToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShweV9pdGVtLCAoRnVuY3Rpb25UeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlKSkpCisgICAgICAgICAgICAgICAgaWYgcHlfaXRlbS5fX21vZHVsZV9fICE9IG1vZHVsZU5hbWU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgIyBza2lwIGZ1bmN0aW9ucyB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHB5X2l0ZW0uX19tb2R1bGVfXywgdmFsdWUubW9kdWxlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShweV9pdGVtLCAoQ2xhc3NUeXBlLCB0eXBlKSkpCiAgICAgICAgICAgICAgICAgaWYgcHlfaXRlbS5fX21vZHVsZV9fICE9IG1vZHVsZU5hbWU6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5IGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQppbmRleCBlNGU1OTJhLi43NzdlODVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKQEAgLTEsMTg2ICsxLDE5MCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCBUZXN0RmFpbGVkLCBjaGVja19zeW50YXgsIHZlcmVxCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNoZWNrX3N5bnRheF9lcnJvciwgcnVuX3VuaXR0ZXN0CiAKIGltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIHIiaW1wb3J0IFwqIiwgU3ludGF4V2FybmluZywgIjx0ZXN0IHN0cmluZz4iKQogd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIHIiaW1wb3J0IFwqIiwgU3ludGF4V2FybmluZywgIjxzdHJpbmc+IikKIAotcHJpbnQgIjEuIHNpbXBsZSBuZXN0aW5nIgorY2xhc3MgU2NvcGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLWRlZiBtYWtlX2FkZGVyKHgpOgotICAgIGRlZiBhZGRlcih5KToKLSAgICAgICAgcmV0dXJuIHggKyB5Ci0gICAgcmV0dXJuIGFkZGVyCisgICAgZGVmIHRlc3RTaW1wbGVOZXN0aW5nKHNlbGYpOgogCi1pbmMgPSBtYWtlX2FkZGVyKDEpCi1wbHVzMTAgPSBtYWtlX2FkZGVyKDEwKQotCi12ZXJlcShpbmMoMSksIDIpCi12ZXJlcShwbHVzMTAoLTIpLCA4KQotCi1wcmludCAiMi4gZXh0cmEgbmVzdGluZyIKLQotZGVmIG1ha2VfYWRkZXIyKHgpOgotICAgIGRlZiBleHRyYSgpOiAjIGNoZWNrIGZyZWV2YXJzIHBhc3NpbmcgdGhyb3VnaCBub24tdXNlIHNjb3BlcwotICAgICAgICBkZWYgYWRkZXIoeSk6Ci0gICAgICAgICAgICByZXR1cm4geCArIHkKLSAgICAgICAgcmV0dXJuIGFkZGVyCi0gICAgcmV0dXJuIGV4dHJhKCkKLQotaW5jID0gbWFrZV9hZGRlcjIoMSkKLXBsdXMxMCA9IG1ha2VfYWRkZXIyKDEwKQotCi12ZXJlcShpbmMoMSksIDIpCi12ZXJlcShwbHVzMTAoLTIpLCA4KQotCi1wcmludCAiMy4gc2ltcGxlIG5lc3RpbmcgKyByZWJpbmRpbmciCi0KLWRlZiBtYWtlX2FkZGVyMyh4KToKLSAgICBkZWYgYWRkZXIoeSk6Ci0gICAgICAgIHJldHVybiB4ICsgeQotICAgIHggPSB4ICsgMSAjIGNoZWNrIHRyYWNraW5nIG9mIGFzc2lnbm1lbnQgdG8geCBpbiBkZWZpbmluZyBzY29wZQotICAgIHJldHVybiBhZGRlcgotCi1pbmMgPSBtYWtlX2FkZGVyMygwKQotcGx1czEwID0gbWFrZV9hZGRlcjMoOSkKLQotdmVyZXEoaW5jKDEpLCAyKQotdmVyZXEocGx1czEwKC0yKSwgOCkKLQotcHJpbnQgIjQuIG5lc3Rpbmcgd2l0aCBnbG9iYWwgYnV0IG5vIGZyZWUiCi0KLWRlZiBtYWtlX2FkZGVyNCgpOiAjIFhYWCBhZGQgZXh0YSBsZXZlbCBvZiBpbmRpcmVjdGlvbgotICAgIGRlZiBuZXN0KCk6Ci0gICAgICAgIGRlZiBuZXN0KCk6CisgICAgICAgIGRlZiBtYWtlX2FkZGVyKHgpOgogICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgotICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxfeCArIHkgIyBjaGVjayB0aGF0IHBsYWluIG9sZCBnbG9iYWxzIHdvcmsKKyAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKICAgICAgICAgICAgIHJldHVybiBhZGRlcgotICAgICAgICByZXR1cm4gbmVzdCgpCi0gICAgcmV0dXJuIG5lc3QoKQogCi1nbG9iYWxfeCA9IDEKLWFkZGVyID0gbWFrZV9hZGRlcjQoKQotdmVyZXEoYWRkZXIoMSksIDIpCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXIoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcigxMCkKIAotZ2xvYmFsX3ggPSAxMAotdmVyZXEoYWRkZXIoLTIpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQogCi1wcmludCAiNS4gbmVzdGluZyB0aHJvdWdoIGNsYXNzIgorICAgIGRlZiB0ZXN0RXh0cmFOZXN0aW5nKHNlbGYpOgogCi1kZWYgbWFrZV9hZGRlcjUoeCk6Ci0gICAgY2xhc3MgQWRkZXI6Ci0gICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB5KToKLSAgICAgICAgICAgIHJldHVybiB4ICsgeQotICAgIHJldHVybiBBZGRlcigpCisgICAgICAgIGRlZiBtYWtlX2FkZGVyMih4KToKKyAgICAgICAgICAgIGRlZiBleHRyYSgpOiAjIGNoZWNrIGZyZWV2YXJzIHBhc3NpbmcgdGhyb3VnaCBub24tdXNlIHNjb3BlcworICAgICAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZGVyCisgICAgICAgICAgICByZXR1cm4gZXh0cmEoKQogCi1pbmMgPSBtYWtlX2FkZGVyNSgxKQotcGx1czEwID0gbWFrZV9hZGRlcjUoMTApCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXIyKDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXIyKDEwKQogCi12ZXJlcShpbmMoMSksIDIpCi12ZXJlcShwbHVzMTAoLTIpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQogCi1wcmludCAiNi4gbmVzdGluZyBwbHVzIGZyZWUgcmVmIHRvIGdsb2JhbCIKKyAgICBkZWYgdGVzdFNpbXBsZUFuZFJlYmluZGluZyhzZWxmKToKIAotZGVmIG1ha2VfYWRkZXI2KHgpOgotICAgIGdsb2JhbCBnbG9iYWxfbmVzdF94Ci0gICAgZGVmIGFkZGVyKHkpOgotICAgICAgICByZXR1cm4gZ2xvYmFsX25lc3RfeCArIHkKLSAgICBnbG9iYWxfbmVzdF94ID0geAotICAgIHJldHVybiBhZGRlcgorICAgICAgICBkZWYgbWFrZV9hZGRlcjMoeCk6CisgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgICAgICB4ID0geCArIDEgIyBjaGVjayB0cmFja2luZyBvZiBhc3NpZ25tZW50IHRvIHggaW4gZGVmaW5pbmcgc2NvcGUKKyAgICAgICAgICAgIHJldHVybiBhZGRlcgogCi1pbmMgPSBtYWtlX2FkZGVyNigxKQotcGx1czEwID0gbWFrZV9hZGRlcjYoMTApCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXIzKDApCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXIzKDkpCiAKLXZlcmVxKGluYygxKSwgMTEpICMgdGhlcmUncyBvbmx5IG9uZSBnbG9iYWwKLXZlcmVxKHBsdXMxMCgtMiksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCiAKLXByaW50ICI3LiBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSIKKyAgICBkZWYgdGVzdE5lc3RpbmdHbG9iYWxOb0ZyZWUoc2VsZik6CiAKLWRlZiBmKHgpOgotICAgIGRlZiBnKHkpOgotICAgICAgICB4ID0gNDIgIyBjaGVjayB0aGF0IHRoaXMgbWFza3MgYmluZGluZyBpbiBmKCkKLSAgICAgICAgZGVmIGgoeik6Ci0gICAgICAgICAgICByZXR1cm4geCArIHoKLSAgICAgICAgcmV0dXJuIGgKLSAgICByZXR1cm4gZygyKQorICAgICAgICBkZWYgbWFrZV9hZGRlcjQoKTogIyBYWFggYWRkIGV4dGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24KKyAgICAgICAgICAgIGRlZiBuZXN0KCk6CisgICAgICAgICAgICAgICAgZGVmIG5lc3QoKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbF94ICsgeSAjIGNoZWNrIHRoYXQgcGxhaW4gb2xkIGdsb2JhbHMgd29yaworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdCgpCisgICAgICAgICAgICByZXR1cm4gbmVzdCgpCiAKLXRlc3RfZnVuYyA9IGYoMTApCi12ZXJlcSh0ZXN0X2Z1bmMoNSksIDQ3KQorICAgICAgICBnbG9iYWxfeCA9IDEKKyAgICAgICAgYWRkZXIgPSBtYWtlX2FkZGVyNCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRkZXIoMSksIDIpCiAKLXByaW50ICI4LiBtaXhlZCBmcmVldmFycyBhbmQgY2VsbHZhcnMiCisgICAgICAgIGdsb2JhbF94ID0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZGRlcigtMiksIDgpCiAKLWRlZiBpZGVudGl0eSh4KToKLSAgICByZXR1cm4geAorICAgIGRlZiB0ZXN0TmVzdGluZ1Rocm91Z2hDbGFzcyhzZWxmKToKIAotZGVmIGYoeCwgeSwgeik6Ci0gICAgZGVmIGcoYSwgYiwgYyk6Ci0gICAgICAgIGEgPSBhICsgeCAjIDMKLSAgICAgICAgZGVmIGgoKToKLSAgICAgICAgICAgICMgeiAqICg0ICsgOSkKLSAgICAgICAgICAgICMgMyAqIDEzCi0gICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkoeiAqIChiICsgeSkpCi0gICAgICAgIHkgPSBjICsgeiAjIDkKLSAgICAgICAgcmV0dXJuIGgKLSAgICByZXR1cm4gZworICAgICAgICBkZWYgbWFrZV9hZGRlcjUoeCk6CisgICAgICAgICAgICBjbGFzcyBBZGRlcjoKKyAgICAgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgeSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgICAgICAgcmV0dXJuIEFkZGVyKCkKIAotZyA9IGYoMSwgMiwgMykKLWggPSBnKDIsIDQsIDYpCi12ZXJlcShoKCksIDM5KQorICAgICAgICBpbmMgPSBtYWtlX2FkZGVyNSgxKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyNSgxMCkKIAotcHJpbnQgIjkuIGZyZWUgdmFyaWFibGUgaW4gbWV0aG9kIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQogCi1kZWYgdGVzdCgpOgotICAgIG1ldGhvZF9hbmRfdmFyID0gInZhciIKLSAgICBjbGFzcyBUZXN0OgotICAgICAgICBkZWYgbWV0aG9kX2FuZF92YXIoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gIm1ldGhvZCIKLSAgICAgICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kX2FuZF92YXIKLSAgICAgICAgZGVmIGFjdHVhbF9nbG9iYWwoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gc3RyKCJnbG9iYWwiKQotICAgICAgICBkZWYgc3RyKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQotICAgIHJldHVybiBUZXN0KCkKKyAgICBkZWYgdGVzdE5lc3RpbmdQbHVzRnJlZVJlZlRvR2xvYmFsKHNlbGYpOgogCi10ID0gdGVzdCgpCi12ZXJlcSh0LnRlc3QoKSwgInZhciIpCi12ZXJlcSh0Lm1ldGhvZF9hbmRfdmFyKCksICJtZXRob2QiKQotdmVyZXEodC5hY3R1YWxfZ2xvYmFsKCksICJnbG9iYWwiKQorICAgICAgICBkZWYgbWFrZV9hZGRlcjYoeCk6CisgICAgICAgICAgICBnbG9iYWwgZ2xvYmFsX25lc3RfeAorICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxfbmVzdF94ICsgeQorICAgICAgICAgICAgZ2xvYmFsX25lc3RfeCA9IHgKKyAgICAgICAgICAgIHJldHVybiBhZGRlcgogCi1tZXRob2RfYW5kX3ZhciA9ICJ2YXIiCi1jbGFzcyBUZXN0OgotICAgICMgdGhpcyBjbGFzcyBpcyBub3QgbmVzdGVkLCBzbyB0aGUgcnVsZXMgYXJlIGRpZmZlcmVudAotICAgIGRlZiBtZXRob2RfYW5kX3ZhcihzZWxmKToKLSAgICAgICAgcmV0dXJuICJtZXRob2QiCi0gICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgIHJldHVybiBtZXRob2RfYW5kX3ZhcgotICAgIGRlZiBhY3R1YWxfZ2xvYmFsKHNlbGYpOgotICAgICAgICByZXR1cm4gc3RyKCJnbG9iYWwiKQotICAgIGRlZiBzdHIoc2VsZik6Ci0gICAgICAgIHJldHVybiBzdHIoc2VsZikKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjYoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjYoMTApCiAKLXQgPSBUZXN0KCkKLXZlcmVxKHQudGVzdCgpLCAidmFyIikKLXZlcmVxKHQubWV0aG9kX2FuZF92YXIoKSwgIm1ldGhvZCIpCi12ZXJlcSh0LmFjdHVhbF9nbG9iYWwoKSwgImdsb2JhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAxMSkgIyB0aGVyZSdzIG9ubHkgb25lIGdsb2JhbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCiAKLXByaW50ICIxMC4gcmVjdXJzaW9uIgorICAgIGRlZiB0ZXN0TmVhcmVzdEVuY2xvc2luZ1Njb3BlKHNlbGYpOgogCi1kZWYgZih4KToKLSAgICBkZWYgZmFjdChuKToKLSAgICAgICAgaWYgbiA9PSAwOgotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBuICogZmFjdChuIC0gMSkKLSAgICBpZiB4ID49IDA6Ci0gICAgICAgIHJldHVybiBmYWN0KHgpCi0gICAgZWxzZToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInggbXVzdCBiZSA+PSAwIgorICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKHkpOgorICAgICAgICAgICAgICAgIHggPSA0MiAjIGNoZWNrIHRoYXQgdGhpcyBtYXNrcyBiaW5kaW5nIGluIGYoKQorICAgICAgICAgICAgICAgIGRlZiBoKHopOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geCArIHoKKyAgICAgICAgICAgICAgICByZXR1cm4gaAorICAgICAgICAgICAgcmV0dXJuIGcoMikKIAotdmVyZXEoZig2KSwgNzIwKQorICAgICAgICB0ZXN0X2Z1bmMgPSBmKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfZnVuYyg1KSwgNDcpCisKKyAgICBkZWYgdGVzdE1peGVkRnJlZXZhcnNBbmRDZWxsdmFycyhzZWxmKToKKworICAgICAgICBkZWYgaWRlbnRpdHkoeCk6CisgICAgICAgICAgICByZXR1cm4geAorCisgICAgICAgIGRlZiBmKHgsIHksIHopOgorICAgICAgICAgICAgZGVmIGcoYSwgYiwgYyk6CisgICAgICAgICAgICAgICAgYSA9IGEgKyB4ICMgMworICAgICAgICAgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICAgICAgICAgICMgeiAqICg0ICsgOSkKKyAgICAgICAgICAgICAgICAgICAgIyAzICogMTMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5KHogKiAoYiArIHkpKQorICAgICAgICAgICAgICAgIHkgPSBjICsgeiAjIDkKKyAgICAgICAgICAgICAgICByZXR1cm4gaAorICAgICAgICAgICAgcmV0dXJuIGcKKworICAgICAgICBnID0gZigxLCAyLCAzKQorICAgICAgICBoID0gZygyLCA0LCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgoKSwgMzkpCisKKyAgICBkZWYgdGVzdEZyZWVWYXJJbk1ldGhvZChzZWxmKToKKworICAgICAgICBkZWYgdGVzdCgpOgorICAgICAgICAgICAgbWV0aG9kX2FuZF92YXIgPSAidmFyIgorICAgICAgICAgICAgY2xhc3MgVGVzdDoKKyAgICAgICAgICAgICAgICBkZWYgbWV0aG9kX2FuZF92YXIoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0aG9kIgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kX2FuZF92YXIKKyAgICAgICAgICAgICAgICBkZWYgYWN0dWFsX2dsb2JhbChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cigiZ2xvYmFsIikKKyAgICAgICAgICAgICAgICBkZWYgc3RyKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisgICAgICAgICAgICByZXR1cm4gVGVzdCgpCisKKyAgICAgICAgdCA9IHRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudGVzdCgpLCAidmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1ldGhvZF9hbmRfdmFyKCksICJtZXRob2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuYWN0dWFsX2dsb2JhbCgpLCAiZ2xvYmFsIikKKworICAgICAgICBtZXRob2RfYW5kX3ZhciA9ICJ2YXIiCisgICAgICAgIGNsYXNzIFRlc3Q6CisgICAgICAgICAgICAjIHRoaXMgY2xhc3MgaXMgbm90IG5lc3RlZCwgc28gdGhlIHJ1bGVzIGFyZSBkaWZmZXJlbnQKKyAgICAgICAgICAgIGRlZiBtZXRob2RfYW5kX3ZhcihzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCIKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RfYW5kX3ZhcgorICAgICAgICAgICAgZGVmIGFjdHVhbF9nbG9iYWwoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cigiZ2xvYmFsIikKKyAgICAgICAgICAgIGRlZiBzdHIoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorCisgICAgICAgIHQgPSBUZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRlc3QoKSwgInZhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5tZXRob2RfYW5kX3ZhcigpLCAibWV0aG9kIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmFjdHVhbF9nbG9iYWwoKSwgImdsb2JhbCIpCisKKyAgICBkZWYgdGVzdFJlY3Vyc2lvbihzZWxmKToKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBmYWN0KG4pOgorICAgICAgICAgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAqIGZhY3QobiAtIDEpCisgICAgICAgICAgICBpZiB4ID49IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3QoeCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInggbXVzdCBiZSA+PSAwIgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZig2KSwgNzIwKQogCiAKLXByaW50ICIxMS4gdW5vcHRpbWl6ZWQgbmFtZXNwYWNlcyIKKyAgICBkZWYgdGVzdFVub3B0aW1pemVkTmFtZXNwYWNlcyhzZWxmKToKIAotY2hlY2tfc3ludGF4KCIiIlwKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKIGRlZiB1bm9wdGltaXplZF9jbGFzaDEoc3RyaXApOgogICAgIGRlZiBmKHMpOgogICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgpAQCAtMTg4LDcgKzE5Miw3IEBACiAgICAgcmV0dXJuIGYKICIiIikKIAotY2hlY2tfc3ludGF4KCIiIlwKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKIGRlZiB1bm9wdGltaXplZF9jbGFzaDIoKToKICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgogICAgIGRlZiBmKHMpOgpAQCAtMTk2LDcgKzIwMCw3IEBACiAgICAgcmV0dXJuIGYKICIiIikKIAotY2hlY2tfc3ludGF4KCIiIlwKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKIGRlZiB1bm9wdGltaXplZF9jbGFzaDIoKToKICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgogICAgIGRlZiBnKCk6CkBAIC0yMDUsMjMgKzIwOSwyMyBAQAogICAgICAgICByZXR1cm4gZgogIiIiKQogCi1jaGVja19zeW50YXgoIiIiXAorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAogZGVmIGYoeCk6CiAgICAgZGVmIGcoKToKICAgICAgICAgcmV0dXJuIHgKICAgICBkZWwgeCAjIGNhbid0IGRlbCBuYW1lCiAiIiIpCiAKLWNoZWNrX3N5bnRheCgiIiJcCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCiBkZWYgZigpOgogICAgIGRlZiBnKCk6Ci0gICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgotICAgICAgICAgcmV0dXJuIHN0cmlwICMgZ2xvYmFsIG9yIGxvY2FsPworICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgICAgICByZXR1cm4gc3RyaXAgIyBnbG9iYWwgb3IgbG9jYWw/CiAiIiIpCiAKLSMgYW5kIHZlcmlmeSBhIGZldyBjYXNlcyB0aGF0IHNob3VsZCB3b3JrCisgICAgICAgICMgYW5kIHZlcmlmeSBhIGZldyBjYXNlcyB0aGF0IHNob3VsZCB3b3JrCiAKLWV4ZWMoIiIiCisgICAgICAgIGV4ZWMoIiIiCiBkZWYgbm9wcm9ibGVtMSgpOgogICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCiAgICAgZiA9IGxhbWJkYSB4OngKQEAgLTIzOCw1OSArMjQyLDYwIEBACiAgICAgICAgIHkgPSB4CiAiIiIpCiAKLXByaW50ICIxMi4gbGFtYmRhcyIKKyAgICBkZWYgdGVzdExhbWJkYXMoc2VsZik6CiAKLWYxID0gbGFtYmRhIHg6IGxhbWJkYSB5OiB4ICsgeQotaW5jID0gZjEoMSkKLXBsdXMxMCA9IGYxKDEwKQotdmVyZXEoaW5jKDEpLCAyKQotdmVyZXEocGx1czEwKDUpLCAxNSkKKyAgICAgICAgZjEgPSBsYW1iZGEgeDogbGFtYmRhIHk6IHggKyB5CisgICAgICAgIGluYyA9IGYxKDEpCisgICAgICAgIHBsdXMxMCA9IGYxKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoNSksIDE1KQogCi1mMiA9IGxhbWJkYSB4OiAobGFtYmRhIDogbGFtYmRhIHk6IHggKyB5KSgpCi1pbmMgPSBmMigxKQotcGx1czEwID0gZjIoMTApCi12ZXJlcShpbmMoMSksIDIpCi12ZXJlcShwbHVzMTAoNSksIDE1KQorICAgICAgICBmMiA9IGxhbWJkYSB4OiAobGFtYmRhIDogbGFtYmRhIHk6IHggKyB5KSgpCisgICAgICAgIGluYyA9IGYyKDEpCisgICAgICAgIHBsdXMxMCA9IGYyKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoNSksIDE1KQogCi1mMyA9IGxhbWJkYSB4OiBsYW1iZGEgeTogZ2xvYmFsX3ggKyB5Ci1nbG9iYWxfeCA9IDEKLWluYyA9IGYzKE5vbmUpCi12ZXJlcShpbmMoMiksIDMpCisgICAgICAgIGYzID0gbGFtYmRhIHg6IGxhbWJkYSB5OiBnbG9iYWxfeCArIHkKKyAgICAgICAgZ2xvYmFsX3ggPSAxCisgICAgICAgIGluYyA9IGYzKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDIpLCAzKQogCi1mOCA9IGxhbWJkYSB4LCB5LCB6OiBsYW1iZGEgYSwgYiwgYzogbGFtYmRhIDogeiAqIChiICsgeSkKLWcgPSBmOCgxLCAyLCAzKQotaCA9IGcoMiwgNCwgNikKLXZlcmVxKGgoKSwgMTgpCisgICAgICAgIGY4ID0gbGFtYmRhIHgsIHksIHo6IGxhbWJkYSBhLCBiLCBjOiBsYW1iZGEgOiB6ICogKGIgKyB5KQorICAgICAgICBnID0gZjgoMSwgMiwgMykKKyAgICAgICAgaCA9IGcoMiwgNCwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoKCksIDE4KQogCi1wcmludCAiMTMuIFVuYm91bmRMb2NhbCIKKyAgICBkZWYgdGVzdFVuYm91bmRMb2NhbChzZWxmKToKIAotZGVmIGVycm9ySW5PdXRlcigpOgotICAgIHByaW50IHkKLSAgICBkZWYgaW5uZXIoKToKLSAgICAgICAgcmV0dXJuIHkKLSAgICB5ID0gMQorICAgICAgICBkZWYgZXJyb3JJbk91dGVyKCk6CisgICAgICAgICAgICBwcmludCB5CisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geQorICAgICAgICAgICAgeSA9IDEKIAotZGVmIGVycm9ySW5Jbm5lcigpOgotICAgIGRlZiBpbm5lcigpOgotICAgICAgICByZXR1cm4geQotICAgIGlubmVyKCkKLSAgICB5ID0gMQorICAgICAgICBkZWYgZXJyb3JJbklubmVyKCk6CisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geQorICAgICAgICAgICAgaW5uZXIoKQorICAgICAgICAgICAgeSA9IDEKIAotdHJ5OgotICAgIGVycm9ySW5PdXRlcigpCi1leGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICByYWlzZSBUZXN0RmFpbGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVycm9ySW5PdXRlcigpCisgICAgICAgIGV4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCiAKLXRyeToKLSAgICBlcnJvckluSW5uZXIoKQotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHJhaXNlIFRlc3RGYWlsZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXJyb3JJbklubmVyKCkKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCiAKLSMgdGVzdCBmb3IgYnVnICMxNTAxOTM0OiBpbmNvcnJlY3QgTE9BRC9TVE9SRV9HTE9CQUwgZ2VuZXJhdGlvbgorICAgICAgICAjIHRlc3QgZm9yIGJ1ZyAjMTUwMTkzNDogaW5jb3JyZWN0IExPQUQvU1RPUkVfR0xPQkFMIGdlbmVyYXRpb24KKyAgICAgICAgZXhlYygiIiIKIGdsb2JhbF94ID0gMQogZGVmIGYoKToKICAgICBnbG9iYWxfeCArPSAxCkBAIC0yOTksMzQgKzMwNCwzNiBAQAogZXhjZXB0IFVuYm91bmRMb2NhbEVycm9yOgogICAgIHBhc3MKIGVsc2U6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3Njb3BlIG9mIGdsb2JhbF94IG5vdCBjb3JyZWN0bHkgZGV0ZXJtaW5lZCcKKyAgICBmYWlsKCdzY29wZSBvZiBnbG9iYWxfeCBub3QgY29ycmVjdGx5IGRldGVybWluZWQnKQorIiIiLCB7J2ZhaWwnOiBzZWxmLmZhaWx9KQogCi1wcmludCAiMTQuIGNvbXBsZXggZGVmaW5pdGlvbnMiCisgICAgZGVmIHRlc3RDb21wbGV4RGVmaW5pdGlvbnMoc2VsZik6CiAKLWRlZiBtYWtlUmV0dXJuZXIoKmxzdCk6Ci0gICAgZGVmIHJldHVybmVyKCk6Ci0gICAgICAgIHJldHVybiBsc3QKLSAgICByZXR1cm4gcmV0dXJuZXIKKyAgICAgICAgZGVmIG1ha2VSZXR1cm5lcigqbHN0KToKKyAgICAgICAgICAgIGRlZiByZXR1cm5lcigpOgorICAgICAgICAgICAgICAgIHJldHVybiBsc3QKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5lcgogCi12ZXJlcShtYWtlUmV0dXJuZXIoMSwyLDMpKCksICgxLDIsMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFrZVJldHVybmVyKDEsMiwzKSgpLCAoMSwyLDMpKQogCi1kZWYgbWFrZVJldHVybmVyMigqKmt3YXJncyk6Ci0gICAgZGVmIHJldHVybmVyKCk6Ci0gICAgICAgIHJldHVybiBrd2FyZ3MKLSAgICByZXR1cm4gcmV0dXJuZXIKKyAgICAgICAgZGVmIG1ha2VSZXR1cm5lcjIoKiprd2FyZ3MpOgorICAgICAgICAgICAgZGVmIHJldHVybmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGt3YXJncworICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyCiAKLXZlcmVxKG1ha2VSZXR1cm5lcjIoYT0xMSkoKVsnYSddLCAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlUmV0dXJuZXIyKGE9MTEpKClbJ2EnXSwgMTEpCiAKLWRlZiBtYWtlQWRkUGFpcigoYSwgYikpOgotICAgIGRlZiBhZGRQYWlyKChjLCBkKSk6Ci0gICAgICAgIHJldHVybiAoYSArIGMsIGIgKyBkKQotICAgIHJldHVybiBhZGRQYWlyCisgICAgICAgIGRlZiBtYWtlQWRkUGFpcigoYSwgYikpOgorICAgICAgICAgICAgZGVmIGFkZFBhaXIoKGMsIGQpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKGEgKyBjLCBiICsgZCkKKyAgICAgICAgICAgIHJldHVybiBhZGRQYWlyCiAKLXZlcmVxKG1ha2VBZGRQYWlyKCgxLCAyKSkoKDEwMCwgMjAwKSksICgxMDEsMjAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlQWRkUGFpcigoMSwgMikpKCgxMDAsIDIwMCkpLCAoMTAxLDIwMikpCiAKLXByaW50ICIxNS4gc2NvcGUgb2YgZ2xvYmFsIHN0YXRlbWVudHMiCisgICAgZGVmIHRlc3RTY29wZU9mR2xvYmFsU3RtdChzZWxmKToKICMgRXhhbXBsZXMgcG9zdGVkIGJ5IFNhbXVlbGUgUGVkcm9uaSB0byBweXRob24tZGV2IG9uIDMvMS8yMDAxCiAKKyAgICAgICAgZXhlYygiIiJcCiAjIEkKIHggPSA3CiBkZWYgZigpOgpAQCAtMzM5LDggKzM0Niw4IEBACiAgICAgICAgICAgICByZXR1cm4gaCgpCiAgICAgICAgIHJldHVybiBpKCkKICAgICByZXR1cm4gZygpCi12ZXJlcShmKCksIDcpCi12ZXJlcSh4LCA3KQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDcpCitzZWxmLmFzc2VydEVxdWFsKHgsIDcpCiAKICMgSUkKIHggPSA3CkBAIC0zNTQsOCArMzYxLDggQEAKICAgICAgICAgICAgIHJldHVybiBoKCkKICAgICAgICAgcmV0dXJuIGkoKQogICAgIHJldHVybiBnKCkKLXZlcmVxKGYoKSwgMikKLXZlcmVxKHgsIDcpCitzZWxmLmFzc2VydEVxdWFsKGYoKSwgMikKK3NlbGYuYXNzZXJ0RXF1YWwoeCwgNykKIAogIyBJSUkKIHggPSA3CkBAIC0zNzAsOCArMzc3LDggQEAKICAgICAgICAgICAgIHJldHVybiBoKCkKICAgICAgICAgcmV0dXJuIGkoKQogICAgIHJldHVybiBnKCkKLXZlcmVxKGYoKSwgMikKLXZlcmVxKHgsIDIpCitzZWxmLmFzc2VydEVxdWFsKGYoKSwgMikKK3NlbGYuYXNzZXJ0RXF1YWwoeCwgMikKIAogIyBJVgogeCA9IDcKQEAgLTM4Niw4ICszOTMsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGgoKQogICAgICAgICByZXR1cm4gaSgpCiAgICAgcmV0dXJuIGcoKQotdmVyZXEoZigpLCAyKQotdmVyZXEoeCwgMikKK3NlbGYuYXNzZXJ0RXF1YWwoZigpLCAyKQorc2VsZi5hc3NlcnRFcXVhbCh4LCAyKQogCiAjIFhYWCB3aGF0IGFib3V0IGdsb2JhbCBzdGF0ZW1lbnRzIGluIGNsYXNzIGJsb2Nrcz8KICMgZG8gdGhleSBhZmZlY3QgbWV0aG9kcz8KQEAgLTQwMiwzNCArNDA5LDM2IEBACiAgICAgICAgIHJldHVybiB4CiAKIGcgPSBHbG9iYWwoKQotdmVyZXEoZy5nZXQoKSwgMTMpCitzZWxmLmFzc2VydEVxdWFsKGcuZ2V0KCksIDEzKQogZy5zZXQoMTUpCi12ZXJlcShnLmdldCgpLCAxMykKK3NlbGYuYXNzZXJ0RXF1YWwoZy5nZXQoKSwgMTMpCisiIiIpCiAKLXByaW50ICIxNi4gY2hlY2sgbGVha3MiCisgICAgZGVmIHRlc3RMZWFrcyhzZWxmKToKIAotY2xhc3MgRm9vOgotICAgIGNvdW50ID0gMAorICAgICAgICBjbGFzcyBGb286CisgICAgICAgICAgICBjb3VudCA9IDAKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgRm9vLmNvdW50ICs9IDEKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBGb28uY291bnQgKz0gMQogCi0gICAgZGVmIF9fZGVsX18oc2VsZik6Ci0gICAgICAgIEZvby5jb3VudCAtPSAxCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBGb28uY291bnQgLT0gMQogCi1kZWYgZjEoKToKLSAgICB4ID0gRm9vKCkKLSAgICBkZWYgZjIoKToKLSAgICAgICAgcmV0dXJuIHgKLSAgICBmMigpCisgICAgICAgIGRlZiBmMSgpOgorICAgICAgICAgICAgeCA9IEZvbygpCisgICAgICAgICAgICBkZWYgZjIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgZjIoKQogCi1mb3IgaSBpbiByYW5nZSgxMDApOgotICAgIGYxKCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGYxKCkKIAotdmVyZXEoRm9vLmNvdW50LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZvby5jb3VudCwgMCkKIAotcHJpbnQgIjE3LiBjbGFzcyBhbmQgZ2xvYmFsIgorICAgIGRlZiB0ZXN0Q2xhc3NBbmRHbG9iYWwoc2VsZik6CiAKKyAgICAgICAgZXhlYygiIiJcCiBkZWYgdGVzdCh4KToKICAgICBjbGFzcyBGb286CiAgICAgICAgIGdsb2JhbCB4CkBAIC00MzgsOSArNDQ3LDkgQEAKICAgICByZXR1cm4gRm9vKCkKIAogeCA9IDAKLXZlcmVxKHRlc3QoNikoMiksIDgpCitzZWxmLmFzc2VydEVxdWFsKHRlc3QoNikoMiksIDgpCiB4ID0gLTEKLXZlcmVxKHRlc3QoMykoMiksIDUpCitzZWxmLmFzc2VydEVxdWFsKHRlc3QoMykoMiksIDUpCiAKIGxvb2tlZF91cF9ieV9sb2FkX25hbWUgPSBGYWxzZQogY2xhc3MgWDoKQEAgLTQ0OSwxMDQgKzQ1OCwxMDYgQEAKICAgICBsb2NhbHMoKVsnbG9va2VkX3VwX2J5X2xvYWRfbmFtZSddID0gVHJ1ZQogICAgIHBhc3NlZCA9IGxvb2tlZF91cF9ieV9sb2FkX25hbWUKIAotdmVyaWZ5KFgucGFzc2VkKQorc2VsZi5hc3NlcnRfKFgucGFzc2VkKQorIiIiKQogCi1wcmludCAiMTguIHZlcmlmeSB0aGF0IGxvY2FscygpIHdvcmtzIgorICAgIGRlZiB0ZXN0TG9jYWxzRnVuY3Rpb24oc2VsZik6CiAKLWRlZiBmKHgpOgotICAgIGRlZiBnKHkpOgotICAgICAgICBkZWYgaCh6KToKLSAgICAgICAgICAgIHJldHVybiB5ICsgegotICAgICAgICB3ID0geCArIHkKLSAgICAgICAgeSArPSAzCi0gICAgICAgIHJldHVybiBsb2NhbHMoKQotICAgIHJldHVybiBnCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgZGVmIGcoeSk6CisgICAgICAgICAgICAgICAgZGVmIGgoeik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB5ICsgegorICAgICAgICAgICAgICAgIHcgPSB4ICsgeQorICAgICAgICAgICAgICAgIHkgKz0gMworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbHMoKQorICAgICAgICAgICAgcmV0dXJuIGcKIAotZCA9IGYoMikoNCkKLXZlcmlmeSgnaCcgaW4gZCkKLWRlbCBkWydoJ10KLXZlcmVxKGQsIHsneCc6IDIsICd5JzogNywgJ3cnOiA2fSkKKyAgICAgICAgZCA9IGYoMikoNCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdoJyBpbiBkKQorICAgICAgICBkZWwgZFsnaCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeyd4JzogMiwgJ3knOiA3LCAndyc6IDZ9KQogCi1wcmludCAiMTkuIHZhciBpcyBib3VuZCBhbmQgZnJlZSBpbiBjbGFzcyIKKyAgICBkZWYgdGVzdEJvdW5kQW5kRnJlZShzZWxmKToKKyAgICAgICAgIyB2YXIgaXMgYm91bmQgYW5kIGZyZWUgaW4gY2xhc3MKIAotZGVmIGYoeCk6Ci0gICAgY2xhc3MgQzoKLSAgICAgICAgZGVmIG0oc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4geAotICAgICAgICBhID0geAotICAgIHJldHVybiBDCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgICAgICBkZWYgbShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgICAgICBhID0geAorICAgICAgICAgICAgcmV0dXJuIEMKIAotaW5zdCA9IGYoMykoKQotdmVyZXEoaW5zdC5hLCBpbnN0Lm0oKSkKKyAgICAgICAgaW5zdCA9IGYoMykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3QuYSwgaW5zdC5tKCkpCiAKLXByaW50ICIyMC4gaW50ZXJhY3Rpb24gd2l0aCB0cmFjZSBmdW5jdGlvbiIKKyAgICBkZWYgdGVzdEludGVyYWN0aW9uV2l0aFRyYWNlRnVuYyhzZWxmKToKIAotaW1wb3J0IHN5cwotZGVmIHRyYWNlcihhLGIsYyk6Ci0gICAgcmV0dXJuIHRyYWNlcgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGRlZiB0cmFjZXIoYSxiLGMpOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNlcgogCi1kZWYgYWRhcHRnZXR0ZXIobmFtZSwga2xhc3MsIGdldHRlcik6Ci0gICAga2luZCwgZGVzID0gZ2V0dGVyCi0gICAgaWYga2luZCA9PSAxOiAgICAgICAjIEFWIGhhcHBlbnMgd2hlbiBzdGVwcGluZyBmcm9tIHRoaXMgbGluZSB0byBuZXh0Ci0gICAgICAgIGlmIGRlcyA9PSAiIjoKLSAgICAgICAgICAgIGRlcyA9ICJfJXNfXyVzIiAlIChrbGFzcy5fX25hbWVfXywgbmFtZSkKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBvYmo6IGdldGF0dHIob2JqLCBkZXMpCisgICAgICAgIGRlZiBhZGFwdGdldHRlcihuYW1lLCBrbGFzcywgZ2V0dGVyKToKKyAgICAgICAgICAgIGtpbmQsIGRlcyA9IGdldHRlcgorICAgICAgICAgICAgaWYga2luZCA9PSAxOiAgICAgICAjIEFWIGhhcHBlbnMgd2hlbiBzdGVwcGluZyBmcm9tIHRoaXMgbGluZSB0byBuZXh0CisgICAgICAgICAgICAgICAgaWYgZGVzID09ICIiOgorICAgICAgICAgICAgICAgICAgICBkZXMgPSAiXyVzX18lcyIgJSAoa2xhc3MuX19uYW1lX18sIG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBvYmo6IGdldGF0dHIob2JqLCBkZXMpCiAKLWNsYXNzIFRlc3RDbGFzczoKLSAgICBwYXNzCisgICAgICAgIGNsYXNzIFRlc3RDbGFzczoKKyAgICAgICAgICAgIHBhc3MKIAotc3lzLnNldHRyYWNlKHRyYWNlcikKLWFkYXB0Z2V0dGVyKCJmb28iLCBUZXN0Q2xhc3MsICgxLCAiIikpCi1zeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlcikKKyAgICAgICAgYWRhcHRnZXR0ZXIoImZvbyIsIFRlc3RDbGFzcywgKDEsICIiKSkKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCiAKLXRyeTogc3lzLnNldHRyYWNlKCkKLWV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdzeXMuc2V0dHJhY2UoKSBkaWQgbm90IHJhaXNlIFR5cGVFcnJvcicKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuc2V0dHJhY2UpCiAKLXByaW50ICIyMC4gZXZhbCBhbmQgZXhlYyB3aXRoIGZyZWUgdmFyaWFibGVzIgorICAgIGRlZiB0ZXN0RXZhbEV4ZWNGcmVlVmFycyhzZWxmKToKIAotZGVmIGYoeCk6Ci0gICAgcmV0dXJuIGxhbWJkYTogeCArIDEKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICByZXR1cm4gbGFtYmRhOiB4ICsgMQogCi1nID0gZigzKQotdHJ5OgotICAgIGV2YWwoZy5mdW5jX2NvZGUpCi1leGNlcHQgVHlwZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcHJpbnQgImV2YWwoKSBzaG91bGQgaGF2ZSBmYWlsZWQsIGJlY2F1c2UgY29kZSBjb250YWluZWQgZnJlZSB2YXJzIgorICAgICAgICBnID0gZigzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsIGcuZnVuY19jb2RlKQogCi10cnk6Ci0gICAgZXhlYyhnLmZ1bmNfY29kZSkKLWV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBwcmludCAiZXhlYyBzaG91bGQgaGF2ZSBmYWlsZWQsIGJlY2F1c2UgY29kZSBjb250YWluZWQgZnJlZSB2YXJzIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjKGcuZnVuY19jb2RlLCB7fSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhlYyBzaG91bGQgaGF2ZSBmYWlsZWQsIGJlY2F1c2UgY29kZSBjb250YWluZWQgZnJlZSB2YXJzIikKIAotcHJpbnQgIjIxLiBsaXN0IGNvbXByZWhlbnNpb24gd2l0aCBsb2NhbCB2YXJpYWJsZXMiCisgICAgZGVmIHRlc3RMaXN0Q29tcExvY2FsVmFycyhzZWxmKToKIAotdHJ5OgotICAgIHByaW50IGJhZAotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHByaW50ICJiYWQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCBiYWQKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJiYWQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIgogCi1kZWYgeCgpOgotICAgIFtiYWQgZm9yIHMgaW4gJ2EgYicgZm9yIGJhZCBpbiBzLnNwbGl0KCldCisgICAgICAgIGRlZiB4KCk6CisgICAgICAgICAgICBbYmFkIGZvciBzIGluICdhIGInIGZvciBiYWQgaW4gcy5zcGxpdCgpXQogCi14KCkKLXRyeToKLSAgICBwcmludCBiYWQKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcworICAgICAgICB4KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgYmFkCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCiAKLXByaW50ICIyMi4gZXZhbCB3aXRoIGZyZWUgdmFyaWFibGVzIgorICAgIGRlZiB0ZXN0RXZhbEZyZWVWYXJzKHNlbGYpOgogCi1kZWYgZih4KToKLSAgICBkZWYgZygpOgotICAgICAgICB4Ci0gICAgICAgIGV2YWwoInggKyAxIikKLSAgICByZXR1cm4gZworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICAgICAgeAorICAgICAgICAgICAgICAgIGV2YWwoInggKyAxIikKKyAgICAgICAgICAgIHJldHVybiBnCiAKLWYoNCkoKQorICAgICAgICBmKDQpKCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFNjb3BlVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKaW5kZXggMDM2MjFhNi4uYTQ4MzBkNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKQEAgLTI5OCw2ICsyOTgsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhldHlwZShzZWxmLndvcmQpIG5vdCBpbiBzKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgc2VsZi5zLnJlbW92ZSwgc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCiAKKyAgICBkZWYgdGVzdF9yZW1vdmVfa2V5ZXJyb3JfdW5wYWNraW5nKHNlbGYpOgorICAgICAgICAjIGJ1ZzogIHd3dy5weXRob24ub3JnL3NmLzE1NzY2NTcKKyAgICAgICAgZm9yIHYxIGluIFsnUScsICgxLCldOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYucy5yZW1vdmUodjEpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgdjIgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYxLCB2MikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCkKKwogICAgIGRlZiB0ZXN0X2Rpc2NhcmQoc2VsZik6CiAgICAgICAgIHNlbGYucy5kaXNjYXJkKCdhJykKICAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gc2VsZi5zKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CmluZGV4IDI4YTIxYTQuLmI2OTg2MzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKQEAgLTI4NiwyMSArMjg2LDYgQEAKICAgICAgICAgICAgICgnY29kZXBvaW50JywgJ2NvbnZlcnQnLCA0MiksCiAgICAgICAgICAgICBdKQogCi0gICAgZGVmIHRlc3RfYXR0cl92YWx1ZXNfcXVvdGVkX21hcmt1cChzZWxmKToKLSAgICAgICAgIiIiTXVsdGktbGluZSBhbmQgbWFya3VwIGluIGF0dHJpYnV0ZSB2YWx1ZXMiIiIKLSAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgdGl0bGU9J2Zvb1xuPGJyPmJhcic+dGV4dDwvYT4iIiIsCi0gICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAiZm9vXG48YnI+YmFyIildKSwKLSAgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAotICAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKV0pCi0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdsZXNzIDwgdGhhbic+dGV4dDwvYT4iIiIsCi0gICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAibGVzcyA8IHRoYW4iKV0pLAotICAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCi0gICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpXSkKLSAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgdGl0bGU9J2dyZWF0ZXIgPiB0aGFuJz50ZXh0PC9hPiIiIiwKLSAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ0aXRsZSIsICJncmVhdGVyID4gdGhhbiIpXSksCi0gICAgICAgICAgICAgKCJkYXRhIiwgInRleHQiKSwKLSAgICAgICAgICAgICAoImVuZHRhZyIsICJhIildKQotCiAgICAgZGVmIHRlc3RfYXR0cl9mdW5reV9uYW1lcyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYS5iPSd2JyBjOmQ9diBlLWY9dj4iIiIsIFsKICAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImEuYiIsICJ2IiksICgiYzpkIiwgInYiKSwgKCJlLWYiLCAidiIpXSksCkBAIC0zNzYsNiArMzYxLDE5IEBACiAgICAgICAgICAgICAoJ2RlY2wnLCAnRE9DVFlQRSBkb2MgWzwhQVRUTElTVCBkb2MgYXR0ciAoYSB8IGIpID5dJyksCiAgICAgICAgICAgICBdKQogCisgICAgZGVmIHRlc3RfcmVhZF9jaHVua3Moc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNTQxNjk3LCB0aGlzIGNhdXNlZCBzZ21sIHBhcnNlciB0byBoYW5nCisgICAgICAgICMgSnVzdCB2ZXJpZnkgdGhpcyBjb2RlIGRvZXNuJ3QgY2F1c2UgYSBoYW5nLgorICAgICAgICBDSFVOSyA9IDEwMjQgICMgaW5jcmVhc2luZyB0aGlzIHRvIDgyMTIgbWFrZXMgdGhlIHByb2JsZW0gZ28gYXdheQorCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5maW5kZmlsZSgnc2dtbF9pbnB1dC5odG1sJykpCisgICAgICAgIGZwID0gc2dtbGxpYi5TR01MUGFyc2VyKCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoQ0hVTkspCisgICAgICAgICAgICBmcC5mZWVkKGRhdGEpCisgICAgICAgICAgICBpZiBsZW4oZGF0YSkgIT0gQ0hVTks6CisgICAgICAgICAgICAgICAgYnJlYWsKKwogICAgICMgWFhYIFRoZXNlIHRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBwcmVmaXhpbmcgdGhlaXIgbmFtZXMgd2l0aAogICAgICMgYW4gdW5kZXJzY29yZS4gIFRoZSBmaXJzdCB0d28gZXhlcmNpc2Ugb3V0c3RhbmRpbmcgYnVncyBpbiB0aGUKICAgICAjIHNnbWxsaWIgbW9kdWxlLCBhbmQgdGhlIHRoaXJkIGV4aGliaXRzIHF1ZXN0aW9uYWJsZSBiZWhhdmlvcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaGEucHkgYi9MaWIvdGVzdC90ZXN0X3NoYS5weQppbmRleCBjNDM4Y2M2Li5lYTIyNGU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NoYS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NoYS5weQpAQCAtMTEsOSArMTEsMjMgQEAKIAogY2xhc3MgU0hBVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBjaGVjayhzZWxmLCBkYXRhLCBkaWdlc3QpOgotICAgICAgICBjb21wdXRlZCA9IHNoYS5uZXcoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgIyBDaGVjayBkaWdlc3QgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICAgICAgb2JqID0gc2hhLm5ldyhkYXRhKQorICAgICAgICBjb21wdXRlZCA9IG9iai5oZXhkaWdlc3QoKQogICAgICAgICBzZWxmLmFzc2VydF8oY29tcHV0ZWQgPT0gZGlnZXN0KQogCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIHZhbHVlIGRvZXNuJ3QgY2hhbmdlIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlCisgICAgICAgICMgZGlnZXN0IG9wZXJhdGlvbnMuCisgICAgICAgIGNvbXB1dGVkX2FnYWluID0gb2JqLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21wdXRlZCA9PSBjb21wdXRlZF9hZ2FpbikKKworICAgICAgICAjIENoZWNrIGhleGRpZ2VzdCgpIG91dHB1dCBtYXRjaGVzIGRpZ2VzdCgpJ3Mgb3V0cHV0CisgICAgICAgIGRpZ2VzdCA9IG9iai5kaWdlc3QoKQorICAgICAgICBoZXhkID0gIiIKKyAgICAgICAgZm9yIGMgaW4gZGlnZXN0OgorICAgICAgICAgICAgaGV4ZCArPSAnJTAyeCcgJSBvcmQoYykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXB1dGVkID09IGhleGQpCisKICAgICBkZWYgdGVzdF9jYXNlXzEoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2soImFiYyIsCiAgICAgICAgICAgICAgICAgICAgImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQiKQpAQCAtMjYsNiArNDAsOSBAQAogICAgICAgICBzZWxmLmNoZWNrKCJhIiAqIDEwMDAwMDAsCiAgICAgICAgICAgICAgICAgICAgIjM0YWE5NzNjZDRjNGRhYTRmNjFlZWIyYmRiYWQyNzMxNjUzNDAxNmYiKQogCisgICAgZGVmIHRlc3RfY2FzZV80KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKGNocigweEFBKSAqIDgwLAorICAgICAgICAgICAgICAgICAgICc0Y2EwZWYzOGYxNzk0YjI4YThmOGVlMTEwZWU3OWQ0OGNlMTNiZTI1JykKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU0hBVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZDJhYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weQpAQCAtMCwwICsxLDgwIEBACitmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSwgXAorICAgIENIQVJfTUFYLCBDSEFSX01JTiwgVUNIQVJfTUFYLCBcCisgICAgU0hSVF9NQVgsIFNIUlRfTUlOLCBVU0hSVF9NQVgsIFwKKyAgICBJTlRfTUFYLCBJTlRfTUlOLCBVSU5UX01BWCwgXAorICAgIExPTkdfTUFYLCBMT05HX01JTiwgVUxPTkdfTUFYCisKK2ltcG9ydCB3YXJuaW5ncywgZXhjZXB0aW9ucywgdW5pdHRlc3QsIHRlc3QudGVzdF93YXJuaW5ncworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKwordHM9dGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSgxLDIsMyw0LDUsNiw3LDgsOS45OTk5OSwxMC4xMDEwMTAxMDEwKQorCitjbGFzcyBSZWFkV3JpdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdHlwZXMoc2VsZik6CisgICAgICAgIHRzLlRfQllURT1DSEFSX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX0JZVEUsIENIQVJfTUFYKQorICAgICAgICB0cy5UX0JZVEU9Q0hBUl9NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9CWVRFLCBDSEFSX01JTikKKyAgICAgICAgdHMuVF9VQllURT1VQ0hBUl9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9VQllURSwgVUNIQVJfTUFYKQorCisgICAgICAgIHRzLlRfU0hPUlQ9U0hSVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9TSE9SVCwgU0hSVF9NQVgpCisgICAgICAgIHRzLlRfU0hPUlQ9U0hSVF9NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9TSE9SVCwgU0hSVF9NSU4pCisgICAgICAgIHRzLlRfVVNIT1JUPVVTSFJUX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX1VTSE9SVCwgVVNIUlRfTUFYKQorCisgICAgICAgIHRzLlRfSU5UPUlOVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9JTlQsIElOVF9NQVgpCisgICAgICAgIHRzLlRfSU5UPUlOVF9NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9JTlQsIElOVF9NSU4pCisgICAgICAgIHRzLlRfVUlOVD1VSU5UX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX1VJTlQsIFVJTlRfTUFYKQorCisgICAgICAgIHRzLlRfTE9ORz1MT05HX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX0xPTkcsIExPTkdfTUFYKQorICAgICAgICB0cy5UX0xPTkc9TE9OR19NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9MT05HLCBMT05HX01JTikKKyAgICAgICAgdHMuVF9VTE9ORz1VTE9OR19NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9VTE9ORywgVUxPTkdfTUFYKQorCitjbGFzcyBUZXN0V2FybmluZ3ModGVzdC50ZXN0X3dhcm5pbmdzLlRlc3RNb2R1bGUpOgorICAgIGRlZiBoYXNfd2FybmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3QudGVzdF93YXJuaW5ncy5tc2cuY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucy5SdW50aW1lV2FybmluZy5fX25hbWVfXykKKworICAgIGRlZiB0ZXN0X2J5dGVfbWF4KHNlbGYpOgorICAgICAgICB0cy5UX0JZVEU9Q0hBUl9NQVgrMQorICAgICAgICBzZWxmLmhhc193YXJuZWQoKQorCisgICAgZGVmIHRlc3RfYnl0ZV9taW4oc2VsZik6CisgICAgICAgIHRzLlRfQllURT1DSEFSX01JTi0xCisgICAgICAgIHNlbGYuaGFzX3dhcm5lZCgpCisKKyAgICBkZWYgdGVzdF91Ynl0ZV9tYXgoc2VsZik6CisgICAgICAgIHRzLlRfVUJZVEU9VUNIQVJfTUFYKzEKKyAgICAgICAgc2VsZi5oYXNfd2FybmVkKCkKKworICAgIGRlZiB0ZXN0X3Nob3J0X21heChzZWxmKToKKyAgICAgICAgdHMuVF9TSE9SVD1TSFJUX01BWCsxCisgICAgICAgIHNlbGYuaGFzX3dhcm5lZCgpCisKKyAgICBkZWYgdGVzdF9zaG9ydF9taW4oc2VsZik6CisgICAgICAgIHRzLlRfU0hPUlQ9U0hSVF9NSU4tMQorICAgICAgICBzZWxmLmhhc193YXJuZWQoKQorCisgICAgZGVmIHRlc3RfdXNob3J0X21heChzZWxmKToKKyAgICAgICAgdHMuVF9VU0hPUlQ9VVNIUlRfTUFYKzEKKyAgICAgICAgc2VsZi5oYXNfd2FybmVkKCkKKworCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBSZWFkV3JpdGVUZXN0cywKKyAgICAgICAgVGVzdFdhcm5pbmdzCisgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IDhjOGFjNDAuLjY0ZjhkNDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTIzNCw2ICsyMzQsMTIgQEAKICAgICAgICAgc3RyaXBwZWQgPSByZW1vdmVfc3RkZXJyX2RlYnVnX2RlY29yYXRpb25zKG91dHB1dCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpcHBlZCwgImFwcGxlb3JhbmdlIikKIAorICAgIGRlZiB0ZXN0X3N0ZG91dF9maWxlZGVzX29mX3N0ZG91dChzZWxmKToKKyAgICAgICAgIyBzdGRvdXQgaXMgc2V0IHRvIDEgKCMxNTMxODYyKS4KKyAgICAgICAgY21kID0gciJpbXBvcnQgc3lzLCBvczsgc3lzLmV4aXQob3Mud3JpdGUoc3lzLnN0ZG91dC5maWxlbm8oKSwgJy5cbicpKSIKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBjbWRdLCBzdGRvdXQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmMsIDIpCisKICAgICBkZWYgdGVzdF9jd2Qoc2VsZik6CiAgICAgICAgIHRtcGRpciA9IG9zLmdldGVudigiVEVNUCIsICIvdG1wIikKICAgICAgICAgIyBXZSBjYW5ub3QgdXNlIG9zLnBhdGgucmVhbHBhdGggdG8gY2Fub25pY2FsaXplIHRoZSBwYXRoLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IGQyNjBmYzUuLjI4MjljNTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTI0NCwxMyArMjQ0LDEzIEBACiAgICAgd2l0aGNvbW1hcyA9ICIsICIuam9pbihyZXBycGFpcnMpCiAgICAgcmV0dXJuICJ7JXN9IiAlIHdpdGhjb21tYXMKIAotZGVmIGNoZWNrX3N5bnRheChzdGF0ZW1lbnQpOgorZGVmIGNoZWNrX3N5bnRheF9lcnJvcih0ZXN0Y2FzZSwgc3RhdGVtZW50KToKICAgICB0cnk6Ci0gICAgICAgIGNvbXBpbGUoc3RhdGVtZW50LCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGNvbXBpbGUoc3RhdGVtZW50LCAnPHRlc3Qgc3RyaW5nPicsICdleGVjJykKICAgICBleGNlcHQgU3ludGF4RXJyb3I6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgotICAgICAgICBwcmludCAnTWlzc2luZyBTeW50YXhFcnJvcjogIiVzIicgJSBzdGF0ZW1lbnQKKyAgICAgICAgdGVzdGNhc2UuZmFpbCgnTWlzc2luZyBTeW50YXhFcnJvcjogIiVzIicgJSBzdGF0ZW1lbnQpCiAKIGRlZiBvcGVuX3VybHJlc291cmNlKHVybCk6CiAgICAgaW1wb3J0IHVybGxpYiwgdXJscGFyc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggYWNiM2YxMC4uYTBlYWFjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTIzNSw2ICsyMzUsMTM4IEBACiA+Pj4gZigpICs9IDEKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKIFN5bnRheEVycm9yOiBpbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50ICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMzXT4sIGxpbmUgMSkKKworCitUZXN0IGNvbnRpbnVlIGluIGZpbmFsbHkgaW4gd2VpcmQgY29tYmluYXRpb25zLgorCitjb250aW51ZSBpbiBmb3IgbG9vcCB1bmRlciBmaW5hbGx5IHNob3V1bGQgYmUgb2suCisKKyAgICA+Pj4gZGVmIHRlc3QoKToKKyAgICAuLi4gICAgIHRyeToKKyAgICAuLi4gICAgICAgICBwYXNzCisgICAgLi4uICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgIGZvciBhYmMgaW4gcmFuZ2UoMTApOgorICAgIC4uLiAgICAgICAgICAgICBjb250aW51ZQorICAgIC4uLiAgICAgcHJpbnQgYWJjCisgICAgPj4+IHRlc3QoKQorICAgIDkKKworU3RhcnQgc2ltcGxlLCBhIGNvbnRpbnVlIGluIGEgZmluYWxseSBzaG91bGQgbm90IGJlIGFsbG93ZWQuCisKKyAgICA+Pj4gZGVmIHRlc3QoKToKKyAgICAuLi4gICAgZm9yIGFiYyBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzZdPiwgbGluZSA2KQorCitUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udGludWUgaW4gYSBmaW5hbGx5IHdoaWNoIHNob3VsZCBub3QgYmUgYWxsb3dlZC4KKworICAgID4+PiBkZWYgdGVzdCgpOgorICAgIC4uLiAgICBmb3IgYWJjIGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgICAgY29udGludWUKKyAgICAuLi4gICAgICAgICAgICBleGNlcHQ6CisgICAgLi4uICAgICAgICAgICAgICAgIHBhc3MKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzM3XT4sIGxpbmUgNykKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgcGFzcworICAgIC4uLiAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzhdPiwgbGluZSA1KQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gICAgIGZvciBhIGluICgpOgorICAgIC4uLiAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzldPiwgbGluZSA2KQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gICAgIGZvciBhIGluICgpOgorICAgIC4uLiAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgLi4uICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgICAgICBwYXNzCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0MF0+LCBsaW5lIDcpCisKKyAgICA+Pj4gZGVmIGZvbygpOgorICAgIC4uLiAgZm9yIGEgaW4gKCk6CisgICAgLi4uICAgdHJ5OiBwYXNzCisgICAgLi4uICAgZmluYWxseToKKyAgICAuLi4gICAgdHJ5OgorICAgIC4uLiAgICAgcGFzcworICAgIC4uLiAgICBleGNlcHQ6CisgICAgLi4uICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDFdPiwgbGluZSA4KQorCitUaGVyZSBpcyBvbmUgdGVzdCBmb3IgYSBicmVhayB0aGF0IGlzIG5vdCBpbiBhIGxvb3AuICBUaGUgY29tcGlsZXIKK3VzZXMgYSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiB0cnktZmluYWxseSBhbmQgbG9vcHMsCitzbyB3ZSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBhIGJyZWFrIGlzIGFjdHVhbGx5IGluc2lkZSBhIGxvb3AuICBJZiBpdAoraXNuJ3QsIHRoZXJlIHNob3VsZCBiZSBhIHN5bnRheCBlcnJvci4KKworICAgPj4+IHRyeToKKyAgIC4uLiAgICAgcHJpbnQgMQorICAgLi4uICAgICBicmVhaworICAgLi4uICAgICBwcmludCAyCisgICAuLi4gZmluYWxseToKKyAgIC4uLiAgICAgcHJpbnQgMworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFN5bnRheEVycm9yOiAnYnJlYWsnIG91dHNpZGUgbG9vcCAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0Ml0+LCBsaW5lIDMpCisKK1RoaXMgc2hvdWxkIHByb2JhYmx5IHJhaXNlIGEgYmV0dGVyIGVycm9yIHRoYW4gYSBTeXN0ZW1FcnJvciAob3Igbm9uZSBhdCBhbGwpLgorSW4gMi41IHRoZXJlIHdhcyBhIG1pc3NpbmcgZXhjZXB0aW9uIGFuZCBhbiBhc3NlcnQgd2FzIHRyaWdnZXJlZCBpbiBhIGRlYnVnCitidWlsZC4gIFRoZSBudW1iZXIgb2YgYmxvY2tzIG11c3QgYmUgZ3JlYXRlciB0aGFuIENPX01BWEJMT0NLUy4gIFNGICMxNTY1NTE0CisKKyAgID4+PiB3aGlsZSAxOgorICAgLi4uICB3aGlsZSAyOgorICAgLi4uICAgd2hpbGUgMzoKKyAgIC4uLiAgICB3aGlsZSA0OgorICAgLi4uICAgICB3aGlsZSA1OgorICAgLi4uICAgICAgd2hpbGUgNjoKKyAgIC4uLiAgICAgICB3aGlsZSA4OgorICAgLi4uICAgICAgICB3aGlsZSA5OgorICAgLi4uICAgICAgICAgd2hpbGUgMTA6CisgICAuLi4gICAgICAgICAgd2hpbGUgMTE6CisgICAuLi4gICAgICAgICAgIHdoaWxlIDEyOgorICAgLi4uICAgICAgICAgICAgd2hpbGUgMTM6CisgICAuLi4gICAgICAgICAgICAgd2hpbGUgMTQ6CisgICAuLi4gICAgICAgICAgICAgIHdoaWxlIDE1OgorICAgLi4uICAgICAgICAgICAgICAgd2hpbGUgMTY6CisgICAuLi4gICAgICAgICAgICAgICAgd2hpbGUgMTc6CisgICAuLi4gICAgICAgICAgICAgICAgIHdoaWxlIDE4OgorICAgLi4uICAgICAgICAgICAgICAgICAgd2hpbGUgMTk6CisgICAuLi4gICAgICAgICAgICAgICAgICAgd2hpbGUgMjA6CisgICAuLi4gICAgICAgICAgICAgICAgICAgIHdoaWxlIDIxOgorICAgLi4uICAgICAgICAgICAgICAgICAgICAgd2hpbGUgMjI6CisgICAuLi4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICBTeXN0ZW1FcnJvcjogdG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzCisKICIiIgogCiBpbXBvcnQgcmUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCBhNDdhZmE0Li4wY2ViYjI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0yODAsNiArMjgwLDMyIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZHN0LmFkZGZpbGUodGFyaW5mbywgZikKIAorCitjbGFzcyBXcml0ZTEwMFRlc3QoQmFzZVRlc3QpOgorICAgICMgVGhlIG5hbWUgZmllbGQgaW4gYSB0YXIgaGVhZGVyIHN0b3JlcyBzdHJpbmdzIG9mIGF0IG1vc3QgMTAwIGNoYXJzLgorICAgICMgSWYgYSBzdHJpbmcgaXMgc2hvcnRlciB0aGFuIDEwMCBjaGFycyBpdCBoYXMgdG8gYmUgcGFkZGVkIHdpdGggJ1wwJywKKyAgICAjIHdoaWNoIGltcGxpZXMgdGhhdCBhIHN0cmluZyBvZiBleGFjdGx5IDEwMCBjaGFycyBpcyBzdG9yZWQgd2l0aG91dAorICAgICMgYSB0cmFpbGluZyAnXDAnLgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm5hbWUgPSAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgICAgIHNlbGYubmFtZSArPSAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisKKyAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpLCAidyIpCisgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oc2VsZi5uYW1lKQorICAgICAgICBzZWxmLnRhci5hZGRmaWxlKHQpCisgICAgICAgIHNlbGYudGFyLmNsb3NlKCkKKworICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGFyLmdldG5hbWVzKClbMF0sIHNlbGYubmFtZSwKKyAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHN0b3JlIDEwMCBjaGFyIGZpbGVuYW1lIikKKworCiBjbGFzcyBXcml0ZVNpemUwVGVzdChCYXNlVGVzdCk6CiAgICAgbW9kZSA9ICd3JwogCkBAIC0zNjIsMTMgKzM4OCw2IEBACiAgICAgICAgaXMgdGVzdGVkIGFzIHdlbGwuCiAgICAgIiIiCiAKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSwgInciKQotICAgICAgICBzZWxmLnRhci5wb3NpeCA9IEZhbHNlCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYudGFyLmNsb3NlKCkKLQogICAgIGRlZiBfbGVuZ3RoKHNlbGYsIHMpOgogICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocykgKyAxLCA1MTIpCiAgICAgICAgIGlmIHJlbWFpbmRlcjoKQEAgLTM5NywxMiArNDE2LDIzIEBACiAgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGluawogICAgICAgICAgICAgdGFyaW5mby50eXBlID0gdGFyZmlsZS5MTktUWVBFCiAKLSAgICAgICAgc2VsZi50YXIuYWRkZmlsZSh0YXJpbmZvKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpLCAidyIpCisgICAgICAgIHRhci5wb3NpeCA9IEZhbHNlCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCiAKICAgICAgICAgdjEgPSBzZWxmLl9jYWxjX3NpemUobmFtZSwgbGluaykKLSAgICAgICAgdjIgPSBzZWxmLnRhci5vZmZzZXQKKyAgICAgICAgdjIgPSB0YXIub2Zmc2V0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjEsIHYyLCAiR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCiAKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpKQorICAgICAgICBtZW1iZXIgPSB0YXIubmV4dCgpCisgICAgICAgIHNlbGYuZmFpbElmKG1lbWJlciBpcyBOb25lLCAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8ubmFtZSA9PSBtZW1iZXIubmFtZSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9PSBtZW1iZXIubGlua25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQorCiAgICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyMyhzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbSIpCiAKQEAgLTYyMyw2ICs2NTMsNyBAQAogICAgICAgICBSZWFkQXN0ZXJpc2tUZXN0LAogICAgICAgICBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0LAogICAgICAgICBXcml0ZVRlc3QsCisgICAgICAgIFdyaXRlMTAwVGVzdCwKICAgICAgICAgV3JpdGVTaXplMFRlc3QsCiAgICAgICAgIFdyaXRlU3RyZWFtVGVzdCwKICAgICAgICAgV3JpdGVHTlVMb25nVGVzdCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CmluZGV4IGFlYWE3N2UuLjIwNDdhNjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weQpAQCAtMjcsNyArMjcsNyBAQAogIyBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkIGF0IG9uZSB0aW1lIChzZWUgdWxpbWl0IC1uKQogaWYgc3lzLnBsYXRmb3JtID09ICdtYWMnOgogICAgIFRFU1RfRklMRVMgPSAzMgotZWxpZiBzeXMucGxhdGZvcm0gPT0gJ29wZW5ic2QzJzoKK2VsaWYgc3lzLnBsYXRmb3JtIGluICgnb3BlbmJzZDMnLCAnb3BlbmJzZDQnKToKICAgICBURVNUX0ZJTEVTID0gNDgKIGVsc2U6CiAgICAgVEVTVF9GSUxFUyA9IDEwMApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CmluZGV4IDRmZDc4MzQuLjE4MTI5ZGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKQEAgLTEwMiwxNSArMTAyLDE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpCiAKICAgICBkZWYgdGVzdF9zdHJwdGltZShzZWxmKToKKyAgICAgICAgIyBTaG91bGQgYmUgYWJsZSB0byBnbyByb3VuZC10cmlwIGZyb20gc3RyZnRpbWUgdG8gc3RycHRpbWUgd2l0aG91dAorICAgICAgICAjIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgdHQgPSB0aW1lLmdtdGltZShzZWxmLnQpCiAgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnaicsICdtJywgJ00nLCAncCcsICdTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnLCAndycsICdXJywgJ3gnLCAnWCcsICd5JywgJ1knLCAnWicsICclJyk6Ci0gICAgICAgICAgICBmb3JtYXQgPSAnICUnICsgZGlyZWN0aXZlCisgICAgICAgICAgICBmb3JtYXQgPSAnJScgKyBkaXJlY3RpdmUKKyAgICAgICAgICAgIHN0cmZfb3V0cHV0ID0gdGltZS5zdHJmdGltZShmb3JtYXQsIHR0KQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHRpbWUuc3RycHRpbWUodGltZS5zdHJmdGltZShmb3JtYXQsIHR0KSwgZm9ybWF0KQorICAgICAgICAgICAgICAgIHRpbWUuc3RycHRpbWUoc3RyZl9vdXRwdXQsIGZvcm1hdCkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnY29udmVyc2lvbiBzcGVjaWZpZXI6ICVyIGZhaWxlZC4nICUgZm9ybWF0KQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udmVyc2lvbiBzcGVjaWZpZXIgJXIgZmFpbGVkIHdpdGggJyVzJyBpbnB1dC4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCwgc3RyZl9vdXRwdXQpKQogCiAgICAgZGVmIHRlc3RfYXNjdGltZShzZWxmKToKICAgICAgICAgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKHNlbGYudCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5IGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQppbmRleCBiMDY0OTY3Li5iZTZjMThkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKQEAgLTEsOSArMSw5MyBAQAotaW1wb3J0IG9zLCBnbG9iLCByYW5kb20KKyIiIlRlc3RzIGZvciB0aGUgdG9rZW5pemUgbW9kdWxlLgorCitUaGUgdGVzdHMgd2VyZSBvcmlnaW5hbGx5IHdyaXR0ZW4gaW4gdGhlIG9sZCBQeXRob24gc3R5bGUsIHdoZXJlIHRoZQordGVzdCBvdXRwdXQgd2FzIGNvbXBhcmVkIHRvIGEgZ29sZGVuIGZpbGUuICBUaGlzIGRvY3N0cmluZyByZXByZXNlbnRzCit0aGUgZmlyc3Qgc3RlcHMgdG93YXJkcyByZXdyaXRpbmcgdGhlIGVudGlyZSB0ZXN0IGFzIGEgZG9jdGVzdC4KKworVGhlIHRlc3RzIGNhbiBiZSByZWFsbHkgc2ltcGxlLiAgR2l2ZW4gYSBzbWFsbCBmcmFnbWVudCBvZiBzb3VyY2UKK2NvZGUsIHByaW50IG91dCBhIHRhYmxlIHdpdGggdGhlIHRva2Vucy4gIFRoZSBFTkRNQVJLIGlzIG9taXR0ZWQgZm9yCiticmV2aXR5LgorCis+Pj4gZHVtcF90b2tlbnMoIjEgKyAxIikKK05VTUJFUiAgICAgICcxJyAgICAgICAgICAgKDEsIDApICgxLCAxKQorT1AgICAgICAgICAgJysnICAgICAgICAgICAoMSwgMikgKDEsIDMpCitOVU1CRVIgICAgICAnMScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKworQSBjb21tZW50IGdlbmVyYXRlcyBhIHRva2VuIGhlcmUsIHVubGlrZSBpbiB0aGUgcGFyc2VyIG1vZHVsZS4gIFRoZQorY29tbWVudCB0b2tlbiBpcyBmb2xsb3dlZCBieSBhbiBOTCBvciBhIE5FV0xJTkUgdG9rZW4sIGRlcGVuZGluZyBvbgord2hldGhlciB0aGUgbGluZSBjb250YWlucyB0aGUgY29tcGxldGlvbiBvZiBhIHN0YXRlbWVudC4KKworPj4+IGR1bXBfdG9rZW5zKCJpZiBGYWxzZTpcXG4iCisuLi4gICAgICAgICAgICAgIiAgICAjIE5MXFxuIgorLi4uICAgICAgICAgICAgICIgICAgVHJ1ZSA9IEZhbHNlICMgTkVXTElORVxcbiIpCitOQU1FICAgICAgICAnaWYnICAgICAgICAgICgxLCAwKSAoMSwgMikKK05BTUUgICAgICAgICdGYWxzZScgICAgICAgKDEsIDMpICgxLCA4KQorT1AgICAgICAgICAgJzonICAgICAgICAgICAoMSwgOCkgKDEsIDkpCitORVdMSU5FICAgICAnXFxuJyAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorQ09NTUVOVCAgICAgJyMgTkwnICAgICAgICAoMiwgNCkgKDIsIDgpCitOTCAgICAgICAgICAnXFxuJyAgICAgICAgICAoMiwgOCkgKDIsIDkpCitJTkRFTlQgICAgICAnICAgICcgICAgICAgICgzLCAwKSAoMywgNCkKK05BTUUgICAgICAgICdUcnVlJyAgICAgICAgKDMsIDQpICgzLCA4KQorT1AgICAgICAgICAgJz0nICAgICAgICAgICAoMywgOSkgKDMsIDEwKQorTkFNRSAgICAgICAgJ0ZhbHNlJyAgICAgICAoMywgMTEpICgzLCAxNikKK0NPTU1FTlQgICAgICcjIE5FV0xJTkUnICAgKDMsIDE3KSAoMywgMjYpCitORVdMSU5FICAgICAnXFxuJyAgICAgICAgICAoMywgMjYpICgzLCAyNykKK0RFREVOVCAgICAgICcnICAgICAgICAgICAgKDQsIDApICg0LCAwKQorCisKK1RoZXJlIHdpbGwgYmUgYSBidW5jaCBtb3JlIHRlc3RzIG9mIHNwZWNpZmljIHNvdXJjZSBwYXR0ZXJucy4KKworVGhlIHRva2VuaXplIG1vZHVsZSBhbHNvIGRlZmluZXMgYW4gdW50b2tlbml6ZSBmdW5jdGlvbiB0aGF0IHNob3VsZAorcmVnZW5lcmF0ZSB0aGUgb3JpZ2luYWwgcHJvZ3JhbSB0ZXh0IGZyb20gdGhlIHRva2Vucy4KKworVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgZm9ybWF0dGluZyBwcmFjdGljZXMgdGhhdCBhcmUgZWFzeSB0byBnZXQgcmlnaHQuCisKKz4+PiByb3VuZHRyaXAoImlmIHggPT0gMTpcXG4iCisuLi4gICAgICAgICAgICIgICAgcHJpbnQgeFxcbiIpCitpZiB4ID09IDE6CisgICAgcHJpbnQgeAorCitTb21lIHBlb3BsZSB1c2UgZGlmZmVyZW50IGZvcm1hdHRpbmcgY29udmVudGlvbnMsIHdoaWNoIG1ha2VzCit1bnRva2VuaXplIGEgbGl0dGxlIHRyaWNraWVyLiAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpbnZvbHZlcyB0cmFpbGluZword2hpdGVzcGFjZSBhZnRlciB0aGUgY29sb24uICBOb3RlIHRoYXQgd2UgdXNlIGhleCBlc2NhcGVzIHRvIG1ha2UgdGhlCit0d28gdHJhaWxpbmcgYmxhbmtzIGFwcGFyZW50IGluIHRoZSBleHBlY3RlZCBvdXRwdXQuCisKKz4+PiByb3VuZHRyaXAoImlmICAgeCAgPT0gIDEgIDogIFxcbiIKKy4uLiAgICAgICAgICAgIiAgcHJpbnQgeFxcbiIpCitpZiAgIHggID09ICAxICA6XHgyMFx4MjAKKyAgcHJpbnQgeAorCitDb21tZW50cyBuZWVkIHRvIGdvIGluIHRoZSByaWdodCBwbGFjZS4KKworPj4+IHJvdW5kdHJpcCgiaWYgeCA9PSAxOlxcbiIKKy4uLiAgICAgICAgICAgIiAgICAjIEEgY29tbWVudCBieSBpdHNlbGYuXFxuIgorLi4uICAgICAgICAgICAiICAgIHByaW50IHggICMgQ29tbWVudCBoZXJlLCB0b28uXFxuIgorLi4uICAgICAgICAgICAiICAgICMgQW5vdGhlciBjb21tZW50LlxcbiIKKy4uLiAgICAgICAgICAgImFmdGVyX2lmID0gVHJ1ZVxcbiIpCitpZiB4ID09IDE6CisgICAgIyBBIGNvbW1lbnQgYnkgaXRzZWxmLgorICAgIHByaW50IHggICMgQ29tbWVudCBoZXJlLCB0b28uCisgICAgIyBBbm90aGVyIGNvbW1lbnQuCithZnRlcl9pZiA9IFRydWUKKworPj4+IHJvdW5kdHJpcCgiaWYgKHggICMgVGhlIGNvbW1lbnRzIG5lZWQgdG8gZ28gaW4gdGhlIHJpZ2h0IHBsYWNlXFxuIgorLi4uICAgICAgICAgICAiICAgID09IDEpOlxcbiIKKy4uLiAgICAgICAgICAgIiAgICBwcmludCAneCA9PSAxJ1xcbiIpCitpZiAoeCAgIyBUaGUgY29tbWVudHMgbmVlZCB0byBnbyBpbiB0aGUgcmlnaHQgcGxhY2UKKyAgICA9PSAxKToKKyAgICBwcmludCAneCA9PSAxJworCisiIiIKKworaW1wb3J0IG9zLCBnbG9iLCByYW5kb20sIHRpbWUsIHN5cwogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAodmVyYm9zZSwgZmluZGZpbGUsIGlzX3Jlc291cmNlX2VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEZhaWxlZCkKLWZyb20gdG9rZW5pemUgaW1wb3J0ICh0b2tlbml6ZSwgZ2VuZXJhdGVfdG9rZW5zLCB1bnRva2VuaXplLAotICAgICAgICAgICAgICAgICAgICAgIE5VTUJFUiwgTkFNRSwgT1AsIFNUUklORykKK2Zyb20gdG9rZW5pemUgaW1wb3J0ICh0b2tlbml6ZSwgZ2VuZXJhdGVfdG9rZW5zLCB1bnRva2VuaXplLCB0b2tfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRNQVJLRVIsIE5VTUJFUiwgTkFNRSwgT1AsIFNUUklORywgQ09NTUVOVCkKKworIyBIb3cgbXVjaCB0aW1lIGluIHNlY29uZHMgY2FuIHBhc3MgYmVmb3JlIHdlIHByaW50IGEgJ1N0aWxsIHdvcmtpbmcnIG1lc3NhZ2UuCitfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwgPSA1ICogNjAKIAogIyBUZXN0IHJvdW5kdHJpcCBmb3IgYHVudG9rZW5pemVgLiAgYGZgIGlzIGEgZmlsZSBwYXRoLiAgVGhlIHNvdXJjZSBjb2RlIGluIGYKICMgaXMgdG9rZW5pemVkLCBjb252ZXJ0ZWQgYmFjayB0byBzb3VyY2UgY29kZSB2aWEgdG9rZW5pemUudW50b2tlbml6ZSgpLApAQCAtMjQsNiArMTA4LDIzIEBACiAgICAgaWYgdDEgIT0gdDI6CiAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInVudG9rZW5pemUoKSByb3VuZHRyaXAgZmFpbGVkIGZvciAlciIgJSBmKQogCitkZWYgZHVtcF90b2tlbnMocyk6CisgICAgIiIiUHJpbnQgb3V0IHRoZSB0b2tlbnMgaW4gcyBpbiBhIHRhYmxlIGZvcm1hdC4KKworICAgIFRoZSBFTkRNQVJLRVIgaXMgb21pdHRlZC4KKyAgICAiIiIKKyAgICBmID0gU3RyaW5nSU8ocykKKyAgICBmb3IgdHlwZSwgdG9rZW4sIHN0YXJ0LCBlbmQsIGxpbmUgaW4gZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpOgorICAgICAgICBpZiB0eXBlID09IEVORE1BUktFUjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHR5cGUgPSB0b2tfbmFtZVt0eXBlXQorICAgICAgICBwcmludCAiJSh0eXBlKS0xMC4xMHMgICUodG9rZW4pLTEzLjEzciAlKHN0YXJ0KXMgJShlbmQpcyIgJSBsb2NhbHMoKQorCitkZWYgcm91bmR0cmlwKHMpOgorICAgIGYgPSBTdHJpbmdJTyhzKQorICAgIHNvdXJjZSA9IHVudG9rZW5pemUoZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpKQorICAgIHByaW50IHNvdXJjZSwKKwogIyBUaGlzIGlzIGFuIGV4YW1wbGUgZnJvbSB0aGUgZG9jcywgc2V0IHVwIGFzIGEgZG9jdGVzdC4KIGRlZiBkZWNpc3RtdChzKToKICAgICAiIiJTdWJzdGl0dXRlIERlY2ltYWxzIGZvciBmbG9hdHMgaW4gYSBzdHJpbmcgb2Ygc3RhdGVtZW50cy4KQEAgLTY2LDYgKzE2Nyw4IEBACiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ3N0YXJ0aW5nLi4uJwogCisgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKwogICAgICMgVGhpcyBkaXNwbGF5cyB0aGUgdG9rZW5pemF0aW9uIG9mIHRva2VuaXplX3Rlc3RzLnB5IHRvIHN0ZG91dCwgYW5kCiAgICAgIyByZWdydGVzdC5weSBjaGVja3MgdGhhdCB0aGlzIGVxdWFscyB0aGUgZXhwZWN0ZWQgb3V0cHV0IChpbiB0aGUKICAgICAjIHRlc3Qvb3V0cHV0LyBkaXJlY3RvcnkpLgpAQCAtODUsNiArMTg4LDEyIEBACiAgICAgICAgIHRlc3RmaWxlcyA9IHJhbmRvbS5zYW1wbGUodGVzdGZpbGVzLCAxMCkKIAogICAgIGZvciBmIGluIHRlc3RmaWxlczoKKyAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICBpZiBuZXh0X3RpbWUgPD0gdGltZS50aW1lKCk6CisgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgJyAgdGVzdF9tYWluIHN0aWxsIHdvcmtpbmcsIGJlIHBhdGllbnQuLi4nCisgICAgICAgICAgICBzeXMuX19zdGRvdXRfXy5mbHVzaCgpCisKICAgICAgICAgdGVzdF9yb3VuZHRyaXAoZikKIAogICAgICMgVGVzdCBkZXRlY3RvbiBvZiBJbmRlbnRhdGlvbkVycm9yLgpAQCAtMTA1LDcgKzIxNCw3IEBACiAgICAgIyBSdW4gdGhlIGRvY3Rlc3RzIGluIHRoaXMgbW9kdWxlLgogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF90b2tlbml6ZSAgIyBpLmUuLCB0aGlzIG1vZHVsZQogICAgIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl9kb2N0ZXN0Ci0gICAgcnVuX2RvY3Rlc3QodGVzdF90b2tlbml6ZSkKKyAgICBydW5fZG9jdGVzdCh0ZXN0X3Rva2VuaXplLCB2ZXJib3NlKQogCiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ2ZpbmlzaGVkJwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCA5YmExZGNhLi40OGM1ZDE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMTIyLDYgKzEyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfdmFsdWUpKQogCisgICAgZGVmIHRlc3Rfd2l0aG91dF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGVyciA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIFsnTm9uZVxuJ10pCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUcmFjZWJhY2tDYXNlcykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CmluZGV4IGYwYmRmZGUuLjhkMjY5MTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQpAQCAtMSwyODUgKzEsMjcxIEBACiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDYsIGJ1aWx0LWluIHR5cGVzCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICoKLQotcHJpbnQgJzYuIEJ1aWx0LWluIHR5cGVzJwotCi1wcmludCAnNi4xIFRydXRoIHZhbHVlIHRlc3RpbmcnCi1pZiBOb25lOiByYWlzZSBUZXN0RmFpbGVkLCAnTm9uZSBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCi1pZiAwOiByYWlzZSBUZXN0RmFpbGVkLCAnMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCi1pZiAwTDogcmFpc2UgVGVzdEZhaWxlZCwgJzBMIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKLWlmIDAuMDogcmFpc2UgVGVzdEZhaWxlZCwgJzAuMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCi1pZiAnJzogcmFpc2UgVGVzdEZhaWxlZCwgJ1wnXCcgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJwotaWYgbm90IDE6IHJhaXNlIFRlc3RGYWlsZWQsICcxIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCAxTDogcmFpc2UgVGVzdEZhaWxlZCwgJzFMIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCAxLjA6IHJhaXNlIFRlc3RGYWlsZWQsICcxLjAgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90ICd4JzogcmFpc2UgVGVzdEZhaWxlZCwgJ1wneFwnIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCB7J3gnOiAxfTogcmFpc2UgVGVzdEZhaWxlZCwgJ3tcJ3hcJzogMX0gaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotZGVmIGYoKTogcGFzcwotY2xhc3MgQzogcGFzcworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBoYXZlX3VuaWNvZGUKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwoteCA9IEMoKQotaWYgbm90IGY6IHJhaXNlIFRlc3RGYWlsZWQsICdmIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCBDOiByYWlzZSBUZXN0RmFpbGVkLCAnQyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3Qgc3lzOiByYWlzZSBUZXN0RmFpbGVkLCAnc3lzIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCB4OiByYWlzZSBUZXN0RmFpbGVkLCAneCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCiAKLXByaW50ICc2LjIgQm9vbGVhbiBvcGVyYXRpb25zJwotaWYgMCBvciAwOiByYWlzZSBUZXN0RmFpbGVkLCAnMCBvciAwIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKLWlmIDEgYW5kIDE6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICcxIGFuZCAxIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCAxOiByYWlzZSBUZXN0RmFpbGVkLCAnbm90IDEgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJworY2xhc3MgVHlwZXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLXByaW50ICc2LjMgQ29tcGFyaXNvbnMnCi1pZiAwIDwgMSA8PSAxID09IDEgPj0gMSA+IDAgIT0gMTogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBjb21wYXJpc29ucyBmYWlsZWQnCi1pZiAwTCA8IDFMIDw9IDFMID09IDFMID49IDFMID4gMEwgIT0gMUw6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIGludCBjb21wYXJpc29ucyBmYWlsZWQnCi1pZiAwLjAgPCAxLjAgPD0gMS4wID09IDEuMCA+PSAxLjAgPiAwLjAgIT0gMS4wOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgY29tcGFyaXNvbnMgZmFpbGVkJwotaWYgJycgPCAnYScgPD0gJ2EnID09ICdhJyA8ICdhYmMnIDwgJ2FiZCcgPCAnYic6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdzdHJpbmcgY29tcGFyaXNvbnMgZmFpbGVkJwotaWYgTm9uZSBpcyBOb25lOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnaWRlbnRpdHkgdGVzdCBmYWlsZWQnCisgICAgZGVmIHRlc3RfdHJ1dGhfdmFsdWVzKHNlbGYpOgorICAgICAgICBpZiBOb25lOiBzZWxmLmZhaWwoJ05vbmUgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMDogc2VsZi5mYWlsKCcwIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDBMOiBzZWxmLmZhaWwoJzBMIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDAuMDogc2VsZi5mYWlsKCcwLjAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgJyc6IHNlbGYuZmFpbCgnXCdcJyBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiBub3QgMTogc2VsZi5mYWlsKCcxIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAxTDogc2VsZi5mYWlsKCcxTCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgMS4wOiBzZWxmLmZhaWwoJzEuMCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgJ3gnOiBzZWxmLmZhaWwoJ1wneFwnIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCB7J3gnOiAxfTogc2VsZi5mYWlsKCd7XCd4XCc6IDF9IGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQzogcGFzcworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgaWYgbm90IGY6IHNlbGYuZmFpbCgnZiBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgQzogc2VsZi5mYWlsKCdDIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCBzeXM6IHNlbGYuZmFpbCgnc3lzIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCB4OiBzZWxmLmZhaWwoJ3ggaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKIAotdHJ5OiBmbG9hdCgnJykKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiZmxvYXQoJycpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIgorICAgIGRlZiB0ZXN0X2Jvb2xlYW5fb3BzKHNlbGYpOgorICAgICAgICBpZiAwIG9yIDA6IHNlbGYuZmFpbCgnMCBvciAwIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCcxIGFuZCAxIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAxOiBzZWxmLmZhaWwoJ25vdCAxIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCiAKLXRyeTogZmxvYXQoJzVcMCcpCi1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImZsb2F0KCc1XDAnKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIKKyAgICBkZWYgdGVzdF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgaWYgMCA8IDEgPD0gMSA9PSAxID49IDEgPiAwICE9IDE6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbnQgY29tcGFyaXNvbnMgZmFpbGVkJykKKyAgICAgICAgaWYgMEwgPCAxTCA8PSAxTCA9PSAxTCA+PSAxTCA+IDBMICE9IDFMOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZyBpbnQgY29tcGFyaXNvbnMgZmFpbGVkJykKKyAgICAgICAgaWYgMC4wIDwgMS4wIDw9IDEuMCA9PSAxLjAgPj0gMS4wID4gMC4wICE9IDEuMDogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2Zsb2F0IGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmICcnIDwgJ2EnIDw9ICdhJyA9PSAnYScgPCAnYWJjJyA8ICdhYmQnIDwgJ2InOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnc3RyaW5nIGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmIE5vbmUgaXMgTm9uZTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2lkZW50aXR5IHRlc3QgZmFpbGVkJykKIAotdHJ5OiA1LjAgLyAwLjAKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIjUuMCAvIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiCisgICAgZGVmIHRlc3RfZmxvYXRfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICc1XDAnKQogCi10cnk6IDUuMCAvLyAwLjAKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIjUuMCAvLyAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIgorICAgIGRlZiB0ZXN0X3plcm9fZGl2aXNpb24oc2VsZik6CisgICAgICAgIHRyeTogNS4wIC8gMC4wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUuMCAvIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQogCi10cnk6IDUuMCAlIDAuMAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiNS4wICUgMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIKKyAgICAgICAgdHJ5OiA1LjAgLy8gMC4wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUuMCAvLyAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKIAotdHJ5OiA1IC8gMEwKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIjUgLyAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiCisgICAgICAgIHRyeTogNS4wICUgMC4wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUuMCAlIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQogCi10cnk6IDUgLy8gMEwKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIjUgLy8gMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIgorICAgICAgICB0cnk6IDUgLyAwTAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1IC8gMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKIAotdHJ5OiA1ICUgMEwKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIjUgJSAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiCisgICAgICAgIHRyeTogNSAvLyAwTAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1IC8vIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKLXByaW50ICc2LjQgTnVtZXJpYyB0eXBlcyAobW9zdGx5IGNvbnZlcnNpb25zKScKLWlmIDAgIT0gMEwgb3IgMCAhPSAwLjAgb3IgMEwgIT0gMC4wOiByYWlzZSBUZXN0RmFpbGVkLCAnbWl4ZWQgY29tcGFyaXNvbnMnCi1pZiAxICE9IDFMIG9yIDEgIT0gMS4wIG9yIDFMICE9IDEuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ21peGVkIGNvbXBhcmlzb25zJwotaWYgLTEgIT0gLTFMIG9yIC0xICE9IC0xLjAgb3IgLTFMICE9IC0xLjA6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2ludC9sb25nL2Zsb2F0IHZhbHVlIG5vdCBlcXVhbCcKLSMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIDAKLWlmIGludCgpICE9IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQoKSBkb2VzIG5vdCByZXR1cm4gMCcKLWlmIGxvbmcoKSAhPSAwTDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcoKSBkb2VzIG5vdCByZXR1cm4gMEwnCi1pZiBmbG9hdCgpICE9IDAuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0KCkgZG9lcyBub3QgcmV0dXJuIDAuMCcKLWlmIGludCgxLjkpID09IDEgPT0gaW50KDEuMSkgYW5kIGludCgtMS4xKSA9PSAtMSA9PSBpbnQoLTEuOSk6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQoKSBkb2VzIG5vdCByb3VuZCBwcm9wZXJseScKLWlmIGxvbmcoMS45KSA9PSAxTCA9PSBsb25nKDEuMSkgYW5kIGxvbmcoLTEuMSkgPT0gLTFMID09IGxvbmcoLTEuOSk6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nKCkgZG9lcyBub3Qgcm91bmQgcHJvcGVybHknCi1pZiBmbG9hdCgxKSA9PSAxLjAgYW5kIGZsb2F0KC0xKSA9PSAtMS4wIGFuZCBmbG9hdCgwKSA9PSAwLjA6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCgpIGRvZXMgbm90IHdvcmsgcHJvcGVybHknCi1wcmludCAnNi40LjEgMzItYml0IGludGVnZXJzJwotIyBFbnN1cmUgdGhlIGZpcnN0IDI1NiBpbnRlZ2VycyBhcmUgc2hhcmVkCi1hID0gMjU2Ci1iID0gMTI4KjIKLWlmIGEgaXMgbm90IGI6IHJhaXNlIFRlc3RGYWlsZWQsICcyNTYgaXMgbm90IHNoYXJlZCcKLWlmIDEyICsgMjQgIT0gMzY6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgb3AnCi1pZiAxMiArICgtMjQpICE9IC0xMjogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBvcCcKLWlmICgtMTIpICsgMjQgIT0gMTI6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgb3AnCi1pZiAoLTEyKSArICgtMjQpICE9IC0zNjogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBvcCcKLWlmIG5vdCAxMiA8IDI0OiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG9wJwotaWYgbm90IC0yNCA8IC0xMjogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBvcCcKLSMgVGVzdCBmb3IgYSBwYXJ0aWN1bGFyIGJ1ZyBpbiBpbnRlZ2VyIG11bHRpcGx5Ci14c2l6ZSwgeXNpemUsIHpzaXplID0gMjM4LCAzNTYsIDQKLWlmIG5vdCAoeHNpemUqeXNpemUqenNpemUgPT0genNpemUqeHNpemUqeXNpemUgPT0gMzM4OTEyKToKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG11bCBjb21tdXRhdGl2aXR5JwotIyBBbmQgYW5vdGhlci4KLW0gPSAtc3lzLm1heGludCAtIDEKLWZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKLSAgICBqID0gbSAvLyBkaXZpc29yCi0gICAgcHJvZCA9IGRpdmlzb3IgKiBqCi0gICAgaWYgcHJvZCAhPSBtOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXIgKiAlciA9PSAlciAhPSAlciIgJSAoZGl2aXNvciwgaiwgcHJvZCwgbSkKLSAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBpbnQ6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICgiZXhwZWN0ZWQgdHlwZShwcm9kKSB0byBiZSBpbnQsIG5vdCAlciIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShwcm9kKSkKLSMgQ2hlY2sgZm9yIGV4cGVjdGVkICogb3ZlcmZsb3cgdG8gbG9uZy4KLWZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKLSAgICBqID0gbSAvLyBkaXZpc29yIC0gMQotICAgIHByb2QgPSBkaXZpc29yICogagotICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGxvbmc6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICgiZXhwZWN0ZWQgdHlwZSglcikgdG8gYmUgbG9uZywgbm90ICVyIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZCwgdHlwZShwcm9kKSkpCi0jIENoZWNrIGZvciBleHBlY3RlZCAqIG92ZXJmbG93IHRvIGxvbmcuCi1tID0gc3lzLm1heGludAotZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgotICAgIGogPSBtIC8vIGRpdmlzb3IgKyAxCi0gICAgcHJvZCA9IGRpdmlzb3IgKiBqCi0gICAgaWYgdHlwZShwcm9kKSBpcyBub3QgbG9uZzoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgKCJleHBlY3RlZCB0eXBlKCVyKSB0byBiZSBsb25nLCBub3QgJXIiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9kLCB0eXBlKHByb2QpKSkKKyAgICAgICAgdHJ5OiA1ICUgMEwKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNSAlIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKLXByaW50ICc2LjQuMiBMb25nIGludGVnZXJzJwotaWYgMTJMICsgMjRMICE9IDM2TDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiAxMkwgKyAoLTI0TCkgIT0gLTEyTDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiAoLTEyTCkgKyAyNEwgIT0gMTJMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmICgtMTJMKSArICgtMjRMKSAhPSAtMzZMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmIG5vdCAxMkwgPCAyNEw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgbm90IC0yNEwgPCAtMTJMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLXggPSBzeXMubWF4aW50Ci1pZiBpbnQobG9uZyh4KSkgIT0geDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi10cnk6IHkgPSBpbnQobG9uZyh4KSsxTCkKLWV4Y2VwdCBPdmVyZmxvd0Vycm9yOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmIG5vdCBpc2luc3RhbmNlKHksIGxvbmcpOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLXggPSAteAotaWYgaW50KGxvbmcoeCkpICE9IHg6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwoteCA9IHgtMQotaWYgaW50KGxvbmcoeCkpICE9IHg6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotdHJ5OiB5ID0gaW50KGxvbmcoeCktMUwpCi1leGNlcHQgT3ZlcmZsb3dFcnJvcjogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiBub3QgaXNpbnN0YW5jZSh5LCBsb25nKTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCisgICAgZGVmIHRlc3RfbnVtZXJpY190eXBlcyhzZWxmKToKKyAgICAgICAgaWYgMCAhPSAwTCBvciAwICE9IDAuMCBvciAwTCAhPSAwLjA6IHNlbGYuZmFpbCgnbWl4ZWQgY29tcGFyaXNvbnMnKQorICAgICAgICBpZiAxICE9IDFMIG9yIDEgIT0gMS4wIG9yIDFMICE9IDEuMDogc2VsZi5mYWlsKCdtaXhlZCBjb21wYXJpc29ucycpCisgICAgICAgIGlmIC0xICE9IC0xTCBvciAtMSAhPSAtMS4wIG9yIC0xTCAhPSAtMS4wOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdpbnQvbG9uZy9mbG9hdCB2YWx1ZSBub3QgZXF1YWwnKQorICAgICAgICAjIGNhbGxpbmcgYnVpbHQtaW4gdHlwZXMgd2l0aG91dCBhcmd1bWVudCBtdXN0IHJldHVybiAwCisgICAgICAgIGlmIGludCgpICE9IDA6IHNlbGYuZmFpbCgnaW50KCkgZG9lcyBub3QgcmV0dXJuIDAnKQorICAgICAgICBpZiBsb25nKCkgIT0gMEw6IHNlbGYuZmFpbCgnbG9uZygpIGRvZXMgbm90IHJldHVybiAwTCcpCisgICAgICAgIGlmIGZsb2F0KCkgIT0gMC4wOiBzZWxmLmZhaWwoJ2Zsb2F0KCkgZG9lcyBub3QgcmV0dXJuIDAuMCcpCisgICAgICAgIGlmIGludCgxLjkpID09IDEgPT0gaW50KDEuMSkgYW5kIGludCgtMS4xKSA9PSAtMSA9PSBpbnQoLTEuOSk6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbnQoKSBkb2VzIG5vdCByb3VuZCBwcm9wZXJseScpCisgICAgICAgIGlmIGxvbmcoMS45KSA9PSAxTCA9PSBsb25nKDEuMSkgYW5kIGxvbmcoLTEuMSkgPT0gLTFMID09IGxvbmcoLTEuOSk6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdsb25nKCkgZG9lcyBub3Qgcm91bmQgcHJvcGVybHknKQorICAgICAgICBpZiBmbG9hdCgxKSA9PSAxLjAgYW5kIGZsb2F0KC0xKSA9PSAtMS4wIGFuZCBmbG9hdCgwKSA9PSAwLjA6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdmbG9hdCgpIGRvZXMgbm90IHdvcmsgcHJvcGVybHknKQogCi10cnk6IDUgPDwgLTUKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG5lZ2F0aXZlIHNoaWZ0IDw8JworICAgIGRlZiB0ZXN0X25vcm1hbF9pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhlIGZpcnN0IDI1NiBpbnRlZ2VycyBhcmUgc2hhcmVkCisgICAgICAgIGEgPSAyNTYKKyAgICAgICAgYiA9IDEyOCoyCisgICAgICAgIGlmIGEgaXMgbm90IGI6IHNlbGYuZmFpbCgnMjU2IGlzIG5vdCBzaGFyZWQnKQorICAgICAgICBpZiAxMiArIDI0ICE9IDM2OiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmIDEyICsgKC0yNCkgIT0gLTEyOiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmICgtMTIpICsgMjQgIT0gMTI6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgKC0xMikgKyAoLTI0KSAhPSAtMzY6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgbm90IDEyIDwgMjQ6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgbm90IC0yNCA8IC0xMjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICAjIFRlc3QgZm9yIGEgcGFydGljdWxhciBidWcgaW4gaW50ZWdlciBtdWx0aXBseQorICAgICAgICB4c2l6ZSwgeXNpemUsIHpzaXplID0gMjM4LCAzNTYsIDQKKyAgICAgICAgaWYgbm90ICh4c2l6ZSp5c2l6ZSp6c2l6ZSA9PSB6c2l6ZSp4c2l6ZSp5c2l6ZSA9PSAzMzg5MTIpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdpbnQgbXVsIGNvbW11dGF0aXZpdHknKQorICAgICAgICAjIEFuZCBhbm90aGVyLgorICAgICAgICBtID0gLXN5cy5tYXhpbnQgLSAxCisgICAgICAgIGZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKKyAgICAgICAgICAgIGogPSBtIC8vIGRpdmlzb3IKKyAgICAgICAgICAgIHByb2QgPSBkaXZpc29yICogagorICAgICAgICAgICAgaWYgcHJvZCAhPSBtOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIgKiAlciA9PSAlciAhPSAlciIgJSAoZGl2aXNvciwgaiwgcHJvZCwgbSkpCisgICAgICAgICAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBpbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0eXBlKHByb2QpIHRvIGJlIGludCwgbm90ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUocHJvZCkpCisgICAgICAgICMgQ2hlY2sgZm9yIGV4cGVjdGVkICogb3ZlcmZsb3cgdG8gbG9uZy4KKyAgICAgICAgZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgorICAgICAgICAgICAgaiA9IG0gLy8gZGl2aXNvciAtIDEKKyAgICAgICAgICAgIHByb2QgPSBkaXZpc29yICogagorICAgICAgICAgICAgaWYgdHlwZShwcm9kKSBpcyBub3QgbG9uZzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIHR5cGUoJXIpIHRvIGJlIGxvbmcsIG5vdCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZCwgdHlwZShwcm9kKSkpCisgICAgICAgICMgQ2hlY2sgZm9yIGV4cGVjdGVkICogb3ZlcmZsb3cgdG8gbG9uZy4KKyAgICAgICAgbSA9IHN5cy5tYXhpbnQKKyAgICAgICAgZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgorICAgICAgICAgICAgaiA9IG0gLy8gZGl2aXNvciArIDEKKyAgICAgICAgICAgIHByb2QgPSBkaXZpc29yICogagorICAgICAgICAgICAgaWYgdHlwZShwcm9kKSBpcyBub3QgbG9uZzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIHR5cGUoJXIpIHRvIGJlIGxvbmcsIG5vdCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZCwgdHlwZShwcm9kKSkpCiAKLXRyeTogNUwgPDwgLTVMCi1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgbmVnYXRpdmUgc2hpZnQgPDwnCisgICAgZGVmIHRlc3RfbG9uZ19pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgaWYgMTJMICsgMjRMICE9IDM2TDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgMTJMICsgKC0yNEwpICE9IC0xMkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmICgtMTJMKSArIDI0TCAhPSAxMkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmICgtMTJMKSArICgtMjRMKSAhPSAtMzZMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgMTJMIDwgMjRMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgLTI0TCA8IC0xMkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHggPSBzeXMubWF4aW50CisgICAgICAgIGlmIGludChsb25nKHgpKSAhPSB4OiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB0cnk6IHkgPSBpbnQobG9uZyh4KSsxTCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHksIGxvbmcpOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB4ID0gLXgKKyAgICAgICAgaWYgaW50KGxvbmcoeCkpICE9IHg6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHggPSB4LTEKKyAgICAgICAgaWYgaW50KGxvbmcoeCkpICE9IHg6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHRyeTogeSA9IGludChsb25nKHgpLTFMKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeSwgbG9uZyk6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCiAKLXRyeTogNSA+PiAtNQotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgbmVnYXRpdmUgc2hpZnQgPj4nCisgICAgICAgIHRyeTogNSA8PCAtNQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2ludCBuZWdhdGl2ZSBzaGlmdCA8PCcpCiAKLXRyeTogNUwgPj4gLTVMCi1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgbmVnYXRpdmUgc2hpZnQgPj4nCisgICAgICAgIHRyeTogNUwgPDwgLTVMCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZyBuZWdhdGl2ZSBzaGlmdCA8PCcpCiAKLXByaW50ICc2LjQuMyBGbG9hdGluZyBwb2ludCBudW1iZXJzJwotaWYgMTIuMCArIDI0LjAgIT0gMzYuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IG9wJwotaWYgMTIuMCArICgtMjQuMCkgIT0gLTEyLjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBvcCcKLWlmICgtMTIuMCkgKyAyNC4wICE9IDEyLjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBvcCcKLWlmICgtMTIuMCkgKyAoLTI0LjApICE9IC0zNi4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgb3AnCi1pZiBub3QgMTIuMCA8IDI0LjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBvcCcKLWlmIG5vdCAtMjQuMCA8IC0xMi4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgb3AnCisgICAgICAgIHRyeTogNSA+PiAtNQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2ludCBuZWdhdGl2ZSBzaGlmdCA+PicpCiAKLXByaW50ICc2LjUgU2VxdWVuY2UgdHlwZXMnCisgICAgICAgIHRyeTogNUwgPj4gLTVMCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZyBuZWdhdGl2ZSBzaGlmdCA+PicpCiAKLXByaW50ICc2LjUuMSBTdHJpbmdzJwotaWYgbGVuKCcnKSAhPSAwOiByYWlzZSBUZXN0RmFpbGVkLCAnbGVuKFwnXCcpJwotaWYgbGVuKCdhJykgIT0gMTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xlbihcJ2FcJyknCi1pZiBsZW4oJ2FiY2RlZicpICE9IDY6IHJhaXNlIFRlc3RGYWlsZWQsICdsZW4oXCdhYmNkZWZcJyknCi1pZiAneHl6JyArICdhYmNkZScgIT0gJ3h5emFiY2RlJzogcmFpc2UgVGVzdEZhaWxlZCwgJ3N0cmluZyBjb25jYXRlbmF0aW9uJwotaWYgJ3h5eicqMyAhPSAneHl6eHl6eHl6JzogcmFpc2UgVGVzdEZhaWxlZCwgJ3N0cmluZyByZXBldGl0aW9uICozJwotaWYgMConYWJjZGUnICE9ICcnOiByYWlzZSBUZXN0RmFpbGVkLCAnc3RyaW5nIHJlcGV0aXRpb24gMConCi1pZiBtaW4oJ2FiYycpICE9ICdhJyBvciBtYXgoJ2FiYycpICE9ICdjJzogcmFpc2UgVGVzdEZhaWxlZCwgJ21pbi9tYXggc3RyaW5nJwotaWYgJ2EnIGluICdhYmMnIGFuZCAnYicgaW4gJ2FiYycgYW5kICdjJyBpbiAnYWJjJyBhbmQgJ2QnIG5vdCBpbiAnYWJjJzogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2luL25vdCBpbiBzdHJpbmcnCi14ID0gJ3gnKjEwMwotaWYgJyVzIScleCAhPSB4KychJzogcmFpc2UgVGVzdEZhaWxlZCwgJ25hc3R5IHN0cmluZyBmb3JtYXR0aW5nIGJ1ZycKKyAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CisgICAgICAgIGlmIDEyLjAgKyAyNC4wICE9IDM2LjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiAxMi4wICsgKC0yNC4wKSAhPSAtMTIuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmICgtMTIuMCkgKyAyNC4wICE9IDEyLjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiAoLTEyLjApICsgKC0yNC4wKSAhPSAtMzYuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmIG5vdCAxMi4wIDwgMjQuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmIG5vdCAtMjQuMCA8IC0xMi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKIAotI2V4dGVuZGVkIHNsaWNlcyBmb3Igc3RyaW5ncwotYSA9ICcwMTIzNDU2Nzg5JwotdmVyZXEoYVs6Ol0sIGEpCi12ZXJlcShhWzo6Ml0sICcwMjQ2OCcpCi12ZXJlcShhWzE6OjJdLCAnMTM1NzknKQotdmVyZXEoYVs6Oi0xXSwnOTg3NjU0MzIxMCcpCi12ZXJlcShhWzo6LTJdLCAnOTc1MzEnKQotdmVyZXEoYVszOjotMl0sICczMScpCi12ZXJlcShhWy0xMDA6MTAwOl0sIGEpCi12ZXJlcShhWzEwMDotMTAwOi0xXSwgYVs6Oi0xXSkKLXZlcmVxKGFbLTEwMEw6MTAwTDoyTF0sICcwMjQ2OCcpCisgICAgZGVmIHRlc3Rfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgaWYgbGVuKCcnKSAhPSAwOiBzZWxmLmZhaWwoJ2xlbihcJ1wnKScpCisgICAgICAgIGlmIGxlbignYScpICE9IDE6IHNlbGYuZmFpbCgnbGVuKFwnYVwnKScpCisgICAgICAgIGlmIGxlbignYWJjZGVmJykgIT0gNjogc2VsZi5mYWlsKCdsZW4oXCdhYmNkZWZcJyknKQorICAgICAgICBpZiAneHl6JyArICdhYmNkZScgIT0gJ3h5emFiY2RlJzogc2VsZi5mYWlsKCdzdHJpbmcgY29uY2F0ZW5hdGlvbicpCisgICAgICAgIGlmICd4eXonKjMgIT0gJ3h5enh5enh5eic6IHNlbGYuZmFpbCgnc3RyaW5nIHJlcGV0aXRpb24gKjMnKQorICAgICAgICBpZiAwKidhYmNkZScgIT0gJyc6IHNlbGYuZmFpbCgnc3RyaW5nIHJlcGV0aXRpb24gMConKQorICAgICAgICBpZiBtaW4oJ2FiYycpICE9ICdhJyBvciBtYXgoJ2FiYycpICE9ICdjJzogc2VsZi5mYWlsKCdtaW4vbWF4IHN0cmluZycpCisgICAgICAgIGlmICdhJyBpbiAnYWJjJyBhbmQgJ2InIGluICdhYmMnIGFuZCAnYycgaW4gJ2FiYycgYW5kICdkJyBub3QgaW4gJ2FiYyc6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbi9ub3QgaW4gc3RyaW5nJykKKyAgICAgICAgeCA9ICd4JyoxMDMKKyAgICAgICAgaWYgJyVzIScleCAhPSB4KychJzogc2VsZi5mYWlsKCduYXN0eSBzdHJpbmcgZm9ybWF0dGluZyBidWcnKQogCi1pZiBoYXZlX3VuaWNvZGU6Ci0gICAgYSA9IHVuaWNvZGUoJzAxMjM0NTY3ODknLCAnYXNjaWknKQotICAgIHZlcmVxKGFbOjpdLCBhKQotICAgIHZlcmVxKGFbOjoyXSwgdW5pY29kZSgnMDI0NjgnLCAnYXNjaWknKSkKLSAgICB2ZXJlcShhWzE6OjJdLCB1bmljb2RlKCcxMzU3OScsICdhc2NpaScpKQotICAgIHZlcmVxKGFbOjotMV0sIHVuaWNvZGUoJzk4NzY1NDMyMTAnLCAnYXNjaWknKSkKLSAgICB2ZXJlcShhWzo6LTJdLCB1bmljb2RlKCc5NzUzMScsICdhc2NpaScpKQotICAgIHZlcmVxKGFbMzo6LTJdLCB1bmljb2RlKCczMScsICdhc2NpaScpKQotICAgIHZlcmVxKGFbLTEwMDoxMDA6XSwgYSkKLSAgICB2ZXJlcShhWzEwMDotMTAwOi0xXSwgYVs6Oi0xXSkKLSAgICB2ZXJlcShhWy0xMDBMOjEwMEw6MkxdLCB1bmljb2RlKCcwMjQ2OCcsICdhc2NpaScpKQorICAgICAgICAjZXh0ZW5kZWQgc2xpY2VzIGZvciBzdHJpbmdzCisgICAgICAgIGEgPSAnMDEyMzQ1Njc4OScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6XSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6Ml0sICcwMjQ2OCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxOjoyXSwgJzEzNTc5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTFdLCc5ODc2NTQzMjEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTJdLCAnOTc1MzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMzo6LTJdLCAnMzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMDoxMDA6XSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwMDotMTAwOi0xXSwgYVs6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDBMOjEwMEw6MkxdLCAnMDI0NjgnKQorCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIGEgPSB1bmljb2RlKCcwMTIzNDU2Nzg5JywgJ2FzY2lpJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Ol0sIGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjoyXSwgdW5pY29kZSgnMDI0NjgnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxOjoyXSwgdW5pY29kZSgnMTM1NzknLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0xXSwgdW5pY29kZSgnOTg3NjU0MzIxMCcsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTJdLCB1bmljb2RlKCc5NzUzMScsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzM6Oi0yXSwgdW5pY29kZSgnMzEnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwOjEwMDpdLCBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwMDotMTAwOi0xXSwgYVs6Oi0xXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwTDoxMDBMOjJMXSwgdW5pY29kZSgnMDI0NjgnLCAnYXNjaWknKSkKIAogCi1wcmludCAnNi41LjIgVHVwbGVzIFtzZWUgdGVzdF90dXBsZS5weV0nCisgICAgZGVmIHRlc3RfdHlwZV9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eXBlLCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUsIDEsIDIsIDMsIDQpCiAKLXByaW50ICc2LjUuMyBMaXN0cyBbc2VlIHRlc3RfbGlzdC5weV0nCisgICAgZGVmIHRlc3RfYnVmZmVycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmZmVyLCAnYXNkZicsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ1ZmZlciwgTm9uZSkKIAotcHJpbnQgJzYuNiBNYXBwaW5ncyA9PSBEaWN0aW9uYXJpZXMgW3NlZSB0ZXN0X2RpY3QucHldJworICAgICAgICBhID0gYnVmZmVyKCdhc2RmJykKKyAgICAgICAgaGFzaChhKQorICAgICAgICBiID0gYSAqIDUKKyAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdidWZmZXJzIHNob3VsZCBub3QgYmUgZXF1YWwnKQorICAgICAgICBpZiBzdHIoYikgIT0gKCdhc2RmJyAqIDUpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdyZXBlYXRlZCBidWZmZXIgaGFzIHdyb25nIGNvbnRlbnQnKQorICAgICAgICBpZiBzdHIoYSAqIDApICE9ICcnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdyZXBlYXRlZCBidWZmZXIgemVybyB0aW1lcyBoYXMgd3JvbmcgY29udGVudCcpCisgICAgICAgIGlmIHN0cihhICsgYnVmZmVyKCdkZWYnKSkgIT0gJ2FzZGZkZWYnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb25jYXRlbmF0aW9uIG9mIGJ1ZmZlcnMgeWllbGRzIHdyb25nIGNvbnRlbnQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGEpKSAhPSAnYXNkZic6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBidWZmZXJzIGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYSwgMikpICE9ICdkZic6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3NwZWNpZnlpbmcgYnVmZmVyIG9mZnNldCBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGEsIDAsIDIpKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdzcGVjaWZ5aW5nIGJ1ZmZlciBzaXplIGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYSwgMSwgMikpICE9ICdzZCc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3NwZWNpZnlpbmcgYnVmZmVyIG9mZnNldCBhbmQgc2l6ZSBmYWlsZWQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZmZXIsIGJ1ZmZlcignYXNkZicsIDEpLCAtMSkKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCkpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwLCA1MDAwKSkgIT0gJ2FzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDAsIC0xKSkgIT0gJ2FzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDEsIDIpKSAhPSAncyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnKQogCisgICAgICAgIHRyeTogYVsxXSA9ICdnJworICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiYnVmZmVyIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIpCiAKLXRyeTogdHlwZSgxLCAyKQotZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ3R5cGUoKSwgdy8yIGFyZ3MgZXhwZWN0ZWQgVHlwZUVycm9yJworICAgICAgICB0cnk6IGFbMDoxXSA9ICdnJworICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiYnVmZmVyIHNsaWNlIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIpCiAKLXRyeTogdHlwZSgxLCAyLCAzLCA0KQotZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ3R5cGUoKSwgdy80IGFyZ3MgZXhwZWN0ZWQgVHlwZUVycm9yJworICAgICAgICAjIGFycmF5LmFycmF5KCkgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBjaGFyIGJ1ZmZlciwKKyAgICAgICAgIyBzb21ldGhpbmcgd2hpY2ggaW50KCkgdXNlcyBmb3IgY29udmVyc2lvbi4KKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgIHRyeTogaW50KGJ1ZmZlcihhcnJheS5hcnJheSgnYycpKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoImNoYXIgYnVmZmVyIChhdCBDIGxldmVsKSBub3Qgd29ya2luZyIpCiAKLXByaW50ICdCdWZmZXJzJwotdHJ5OiBidWZmZXIoJ2FzZGYnLCAtMSkKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyKCdhc2RmJywgLTEpIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yIgorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUeXBlc1Rlc3RzKQogCi10cnk6IGJ1ZmZlcihOb25lKQotZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlcihOb25lKSBzaG91bGQgcmFpc2UgVHlwZUVycm9yIgotCi1hID0gYnVmZmVyKCdhc2RmJykKLWhhc2goYSkKLWIgPSBhICogNQotaWYgYSA9PSBiOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdidWZmZXJzIHNob3VsZCBub3QgYmUgZXF1YWwnCi1pZiBzdHIoYikgIT0gKCdhc2RmJyAqIDUpOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdyZXBlYXRlZCBidWZmZXIgaGFzIHdyb25nIGNvbnRlbnQnCi1pZiBzdHIoYSAqIDApICE9ICcnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdyZXBlYXRlZCBidWZmZXIgemVybyB0aW1lcyBoYXMgd3JvbmcgY29udGVudCcKLWlmIHN0cihhICsgYnVmZmVyKCdkZWYnKSkgIT0gJ2FzZGZkZWYnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdjb25jYXRlbmF0aW9uIG9mIGJ1ZmZlcnMgeWllbGRzIHdyb25nIGNvbnRlbnQnCi1pZiBzdHIoYnVmZmVyKGEpKSAhPSAnYXNkZic6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2NvbXBvc2luZyBidWZmZXJzIGZhaWxlZCcKLWlmIHN0cihidWZmZXIoYSwgMikpICE9ICdkZic6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3NwZWNpZnlpbmcgYnVmZmVyIG9mZnNldCBmYWlsZWQnCi1pZiBzdHIoYnVmZmVyKGEsIDAsIDIpKSAhPSAnYXMnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzcGVjaWZ5aW5nIGJ1ZmZlciBzaXplIGZhaWxlZCcKLWlmIHN0cihidWZmZXIoYSwgMSwgMikpICE9ICdzZCc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3NwZWNpZnlpbmcgYnVmZmVyIG9mZnNldCBhbmQgc2l6ZSBmYWlsZWQnCi10cnk6IGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAxKSwgLTEpCi1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAxKSwgLTEpIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yIgotaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCkpICE9ICdhcyc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnCi1pZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwLCA1MDAwKSkgIT0gJ2FzJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcKLWlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDAsIC0xKSkgIT0gJ2FzJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcKLWlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDEsIDIpKSAhPSAncyc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnCi0KLXRyeTogYVsxXSA9ICdnJwotZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlciBhc3NpZ25tZW50IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiCi0KLXRyeTogYVswOjFdID0gJ2cnCi1leGNlcHQgVHlwZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyIHNsaWNlIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIKLQotIyBhcnJheS5hcnJheSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGEgY2hhciBidWZmZXIsCi0jIHNvbWV0aGluZyB3aGljaCBpbnQoKSB1c2VzIGZvciBjb252ZXJzaW9uLgotaW1wb3J0IGFycmF5Ci10cnk6IGludChidWZmZXIoYXJyYXkuYXJyYXkoJ2MnKSkpCi1leGNlcHQgVHlwZUVycm9yIDpwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiY2hhciBidWZmZXIgKGF0IEMgbGV2ZWwpIG5vdCB3b3JraW5nIgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CmluZGV4IDUxN2VjZmQuLjM4ZmY5YWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTkyLDYgKzkyLDkgQEAKICAgICAgICAgICAgICAgICAiXFx4ZmVcXHhmZiciKQogICAgICAgICAgICAgdGVzdHJlcHIgPSByZXByKHUnJy5qb2luKG1hcCh1bmljaHIsIHhyYW5nZSgyNTYpKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RyZXByLCBsYXRpbjFyZXByKQorICAgICAgICAgICAgIyBUZXN0IHJlcHIgd29ya3Mgb24gd2lkZSB1bmljb2RlIGVzY2FwZXMgd2l0aG91dCBvdmVyZmxvdy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1IlxVMDAwMTAwMDAiICogMzkgKyB1Ilx1ZmZmZiIgKiA0MDk2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcih1IlxVMDAwMTAwMDAiICogMzkgKyB1Ilx1ZmZmZiIgKiA0MDk2KSkKIAogICAgIGRlZiB0ZXN0X2l0ZXJhdG9ycyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdW5pY29kZSBvYmplY3RzIGhhdmUgYW4gX19pdGVyX18gbWV0aG9kCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3hkcmxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5CmluZGV4IGU5NTE3YzUuLjhmYzg4YTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5CkBAIC0xLDMgKzEsNTYgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKwogaW1wb3J0IHhkcmxpYgogCi14ZHJsaWIuX3Rlc3QoKQorY2xhc3MgWERSVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF94ZHIoc2VsZik6CisgICAgICAgIHAgPSB4ZHJsaWIuUGFja2VyKCkKKworICAgICAgICBzID0gJ2hlbGxvIHdvcmxkJworICAgICAgICBhID0gWyd3aGF0JywgJ2lzJywgJ2hhcG5pbicsICdkb2N0b3InXQorCisgICAgICAgIHAucGFja19pbnQoNDIpCisgICAgICAgIHAucGFja191aW50KDkpCisgICAgICAgIHAucGFja19ib29sKFRydWUpCisgICAgICAgIHAucGFja19ib29sKEZhbHNlKQorICAgICAgICBwLnBhY2tfdWh5cGVyKDQ1TCkKKyAgICAgICAgcC5wYWNrX2Zsb2F0KDEuOSkKKyAgICAgICAgcC5wYWNrX2RvdWJsZSgxLjkpCisgICAgICAgIHAucGFja19zdHJpbmcocykKKyAgICAgICAgcC5wYWNrX2xpc3QocmFuZ2UoNSksIHAucGFja191aW50KQorICAgICAgICBwLnBhY2tfYXJyYXkoYSwgcC5wYWNrX3N0cmluZykKKworICAgICAgICAjIG5vdyB2ZXJpZnkKKyAgICAgICAgZGF0YSA9IHAuZ2V0X2J1ZmZlcigpCisgICAgICAgIHVwID0geGRybGliLlVucGFja2VyKGRhdGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC5nZXRfcG9zaXRpb24oKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19pbnQoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3VpbnQoKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVwLnVucGFja19ib29sKCkgaXMgVHJ1ZSkKKworICAgICAgICAjIHJlbWVtYmVyIHBvc2l0aW9uCisgICAgICAgIHBvcyA9IHVwLmdldF9wb3NpdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQorCisgICAgICAgICMgcmV3aW5kIGFuZCB1bnBhY2sgYWdhaW4KKyAgICAgICAgdXAuc2V0X3Bvc2l0aW9uKHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVwLnVucGFja19ib29sKCkgaXMgRmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfdWh5cGVyKCksIDQ1TCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCh1cC51bnBhY2tfZmxvYXQoKSwgMS45KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHVwLnVucGFja19kb3VibGUoKSwgMS45KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19zdHJpbmcoKSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfbGlzdCh1cC51bnBhY2tfdWludCksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19hcnJheSh1cC51bnBhY2tfc3RyaW5nKSwgYSkKKyAgICAgICAgdXAuZG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCB1cC51bnBhY2tfdWludCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoWERSVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkgYi9MaWIvdGVzdC90ZXN0X3htbHJwYy5weQppbmRleCA2NGQ4ZmU4Li5jY2MxYjYwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbHJwYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbHJwYy5weQpAQCAtODYsNiArODYsMTUgQEAKICAgICAgICAgcyA9IHhtbHJwY2xpYi5kdW1wcygobmV3X2QsKSwgbWV0aG9kcmVzcG9uc2U9VHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uocywgc3RyKSkKIAorICAgIGRlZiB0ZXN0X25ld3N0eWxlX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBUKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHQgPSBUKCkKKyAgICAgICAgdC54ID0gMTAwCisgICAgICAgIHQueSA9ICJIZWxsbyIKKyAgICAgICAgKCh0MiwpLCBkdW1teSkgPSB4bWxycGNsaWIubG9hZHMoeG1scnBjbGliLmR1bXBzKCh0LCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0MiwgdC5fX2RpY3RfXykKKwogICAgIGRlZiB0ZXN0X2R1bXBfYmlnX2xvbmcoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhtbHJwY2xpYi5kdW1wcywgKDJMKio5OSwpKQogCg==