ZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2d6aXAucnN0IGIvRG9jL2xpYnJhcnkvZ3ppcC5yc3QKaW5kZXggZDI5OGY4OC4uODZiZTNjZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZ3ppcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZ3ppcC5yc3QKQEAgLTEsMTkgKzEsMjIgQEAKLQogOm1vZDpgZ3ppcGAgLS0tIFN1cHBvcnQgZm9yIDpwcm9ncmFtOmBnemlwYCBmaWxlcwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAuLiBtb2R1bGU6OiBnemlwCiAgICA6c3lub3BzaXM6IEludGVyZmFjZXMgZm9yIGd6aXAgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gdXNpbmcgZmlsZSBvYmplY3RzLgogCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNpbXBsZSBpbnRlcmZhY2UgdG8gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MgZmlsZXMganVzdAorbGlrZSB0aGUgR05VIHByb2dyYW1zIDpwcm9ncmFtOmBnemlwYCBhbmQgOnByb2dyYW06YGd1bnppcGAgd291bGQuCiAKLVRoZSBkYXRhIGNvbXByZXNzaW9uIHByb3ZpZGVkIGJ5IHRoZSBgYHpsaWJgYCBtb2R1bGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoYXQKLXVzZWQgYnkgdGhlIEdOVSBjb21wcmVzc2lvbiBwcm9ncmFtIDpwcm9ncmFtOmBnemlwYC4gQWNjb3JkaW5nbHksIHRoZQotOm1vZDpgZ3ppcGAgbW9kdWxlIHByb3ZpZGVzIHRoZSA6Y2xhc3M6YEd6aXBGaWxlYCBjbGFzcyB0byByZWFkIGFuZCB3cml0ZQorVGhlIGRhdGEgY29tcHJlc3Npb24gaXMgcHJvdmlkZWQgYnkgdGhlIDptb2Q6YGB6bGliYGAgbW9kdWxlLgorCitUaGUgOm1vZDpgZ3ppcGAgbW9kdWxlIHByb3ZpZGVzIHRoZSA6Y2xhc3M6YEd6aXBGaWxlYCBjbGFzcyB3aGljaCBpcyBtb2RlbGVkCithZnRlciBQeXRob24ncyBGaWxlIE9iamVjdC4gVGhlIDpjbGFzczpgR3ppcEZpbGVgIGNsYXNzIHJlYWRzIGFuZCB3cml0ZXMKIDpwcm9ncmFtOmBnemlwYFwgLWZvcm1hdCBmaWxlcywgYXV0b21hdGljYWxseSBjb21wcmVzc2luZyBvciBkZWNvbXByZXNzaW5nIHRoZQotZGF0YSBzbyBpdCBsb29rcyBsaWtlIGFuIG9yZGluYXJ5IGZpbGUgb2JqZWN0LiAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgZmlsZQotZm9ybWF0cyB3aGljaCBjYW4gYmUgZGVjb21wcmVzc2VkIGJ5IHRoZSA6cHJvZ3JhbTpgZ3ppcGAgYW5kIDpwcm9ncmFtOmBndW56aXBgCi1wcm9ncmFtcywgc3VjaCAgYXMgdGhvc2UgcHJvZHVjZWQgYnkgOnByb2dyYW06YGNvbXByZXNzYCBhbmQgOnByb2dyYW06YHBhY2tgLAotYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuCitkYXRhIHNvIHRoYXQgaXQgbG9va3MgbGlrZSBhbiBvcmRpbmFyeSBmaWxlIG9iamVjdC4KKworTm90ZSB0aGF0IGFkZGl0aW9uYWwgZmlsZSBmb3JtYXRzIHdoaWNoIGNhbiBiZSBkZWNvbXByZXNzZWQgYnkgdGhlCis6cHJvZ3JhbTpgZ3ppcGAgYW5kIDpwcm9ncmFtOmBndW56aXBgIHByb2dyYW1zLCBzdWNoICBhcyB0aG9zZSBwcm9kdWNlZCBieQorOnByb2dyYW06YGNvbXByZXNzYCBhbmQgOnByb2dyYW06YHBhY2tgLCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1vZHVsZS4KIAogRm9yIG90aGVyIGFyY2hpdmUgZm9ybWF0cywgc2VlIHRoZSA6bW9kOmBiejJgLCA6bW9kOmB6aXBmaWxlYCwgYW5kCiA6bW9kOmB0YXJmaWxlYCBtb2R1bGVzLgpAQCAtNjMsNiArNjYsMzYgQEAKICAgICpjb21wcmVzc2xldmVsKiBkZWZhdWx0cyB0byBgYDlgYC4KIAogCisuLiBfZ3ppcC11c2FnZS1leGFtcGxlczoKKworRXhhbXBsZXMgb2YgdXNhZ2UKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0V4YW1wbGUgb2YgaG93IHRvIHJlYWQgYSBjb21wcmVzc2VkIGZpbGU6OgorCisgICBpbXBvcnQgZ3ppcAorICAgZiA9IGd6aXAub3BlbignL2hvbWUvam9lL2ZpbGUudHh0Lmd6JywgJ3JiJykKKyAgIGZpbGVfY29udGVudCA9IGYucmVhZCgpCisgICBmLmNsb3NlKCkKKworRXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGEgY29tcHJlc3NlZCBHWklQIGZpbGU6OgorCisgICBpbXBvcnQgZ3ppcAorICAgY29udGVudCA9ICJMb3RzIG9mIGNvbnRlbnQgaGVyZSIKKyAgIGYgPSBnemlwLm9wZW4oJy9ob21lL2pvZS9maWxlLnR4dC5neicsICd3YicpCisgICBmLndyaXRlKGNvbnRlbnQpCisgICBmLmNsb3NlKCkKKworRXhhbXBsZSBvZiBob3cgdG8gR1pJUCBjb21wcmVzcyBhbiBleGlzdGluZyBmaWxlOjoKKworICAgaW1wb3J0IGd6aXAKKyAgIGZfaW4gPSBvcGVuKCcvaG9tZS9qb2UvZmlsZS50eHQnLCAncmInKQorICAgZl9vdXQgPSBnemlwLm9wZW4oJy9ob21lL2pvZS9maWxlLnR4dC5neicsICd3YicpCisgICBmX291dC53cml0ZWxpbmVzKGZfaW4pCisgICBmX291dC5jbG9zZSgpCisgICBmX2luLmNsb3NlKCkKKworCiAuLiBzZWVhbHNvOjoKIAogICAgTW9kdWxlIDptb2Q6YHpsaWJgCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zcWxpdGUzLnJzdCBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CmluZGV4IDU1ODU5MzQuLmQ5Y2U3M2UgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CkBAIC0zNzYsNiArMzc2LDI3IEBACiAgICBkZWxldGVkIHNpbmNlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHdhcyBvcGVuZWQuCiAKIAorLi4gYXR0cmlidXRlOjogQ29ubmVjdGlvbi5pdGVyZHVtcAorCisgICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIGR1bXAgdGhlIGRhdGFiYXNlIGluIGFuIFNRTCB0ZXh0IGZvcm1hdC4gIFVzZWZ1bCB3aGVuCisgICBzYXZpbmcgYW4gaW4tbWVtb3J5IGRhdGFiYXNlIGZvciBsYXRlciByZXN0b3JhdGlvbi4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMKKyAgIHRoZSBzYW1lIGNhcGFiaWxpdGllcyBhcyB0aGUgOmtiZDpgLmR1bXBgIGNvbW1hbmQgaW4gdGhlIDpwcm9ncmFtOmBzcWxpdGUzYAorICAgc2hlbGwuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDIuNgorCisgICBFeGFtcGxlOjoKKworICAgICAgIyBDb252ZXJ0IGZpbGUgZXhpc3RpbmdfZGIuZGIgdG8gU1FMIGR1bXAgZmlsZSBkdW1wLnNxbAorICAgICAgaW1wb3J0IHNxbGl0ZTMsIG9zCisKKyAgICAgIGNvbiA9IHNxbGl0ZTMuY29ubmVjdCgnZXhpc3RpbmdfZGIuZGInKQorICAgICAgZnVsbF9kdW1wID0gb3MubGluZXNlcC5qb2luKFtsaW5lIGZvciBsaW5lIGluIGNvbi5pdGVyZHVtcCgpXSkKKyAgICAgIGYgPSBvcGVuKCdkdW1wLnNxbCcsICd3JykKKyAgICAgIGYud3JpdGVsaW5lcyhmdWxsX2R1bXApCisgICAgICBmLmNsb3NlKCkKKworCiAuLiBfc3FsaXRlMy1jdXJzb3Itb2JqZWN0czoKIAogQ3Vyc29yIE9iamVjdHMKZGlmZiAtLWdpdCBhL0luY2x1ZGUvUHl0aG9uLmggYi9JbmNsdWRlL1B5dGhvbi5oCmluZGV4IGQ4YzJhNTYuLmQxNjE0M2IgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvUHl0aG9uLmgKKysrIGIvSW5jbHVkZS9QeXRob24uaApAQCAtMTI0LDcgKzEyNCw3IEBACiAjaWZkZWYgX19DSEFSX1VOU0lHTkVEX18KICNkZWZpbmUgUHlfQ0hBUk1BU0soYykJCShjKQogI2Vsc2UKLSNkZWZpbmUgUHlfQ0hBUk1BU0soYykJCSgoYykgJiAweGZmKQorI2RlZmluZSBQeV9DSEFSTUFTSyhjKQkJKCh1bnNpZ25lZCBjaGFyKSgoYykgJiAweGZmKSkKICNlbmRpZgogCiAjaW5jbHVkZSAicHlmcGUuaCIKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oIGIvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKaW5kZXggYTA1ZTExZi4uNTk4NzNmMiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKKysrIGIvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKQEAgLTQ0LDEzICs0NCwxMyBAQAogCiBleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IF9QeV9jdHlwZV90YWJsZVsyNTZdOwogCi0jZGVmaW5lIElTTE9XRVIoYykgKF9QeV9jdHlwZV90YWJsZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soYyldICYgRkxBR19MT1dFUikKLSNkZWZpbmUgSVNVUFBFUihjKSAoX1B5X2N0eXBlX3RhYmxlWyh1bnNpZ25lZClQeV9DSEFSTUFTSyhjKV0gJiBGTEFHX1VQUEVSKQotI2RlZmluZSBJU0FMUEhBKGMpIChfUHlfY3R5cGVfdGFibGVbKHVuc2lnbmVkKVB5X0NIQVJNQVNLKGMpXSAmIEZMQUdfQUxQSEEpCi0jZGVmaW5lIElTRElHSVQoYykgKF9QeV9jdHlwZV90YWJsZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soYyldICYgRkxBR19ESUdJVCkKLSNkZWZpbmUgSVNYRElHSVQoYykgKF9QeV9jdHlwZV90YWJsZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soYyldICYgRkxBR19YRElHSVQpCi0jZGVmaW5lIElTQUxOVU0oYykgKF9QeV9jdHlwZV90YWJsZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soYyldICYgRkxBR19BTE5VTSkKLSNkZWZpbmUgSVNTUEFDRShjKSAoX1B5X2N0eXBlX3RhYmxlWyh1bnNpZ25lZClQeV9DSEFSTUFTSyhjKV0gJiBGTEFHX1NQQUNFKQorI2RlZmluZSBJU0xPV0VSKGMpIChfUHlfY3R5cGVfdGFibGVbUHlfQ0hBUk1BU0soYyldICYgRkxBR19MT1dFUikKKyNkZWZpbmUgSVNVUFBFUihjKSAoX1B5X2N0eXBlX3RhYmxlW1B5X0NIQVJNQVNLKGMpXSAmIEZMQUdfVVBQRVIpCisjZGVmaW5lIElTQUxQSEEoYykgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBGTEFHX0FMUEhBKQorI2RlZmluZSBJU0RJR0lUKGMpIChfUHlfY3R5cGVfdGFibGVbUHlfQ0hBUk1BU0soYyldICYgRkxBR19ESUdJVCkKKyNkZWZpbmUgSVNYRElHSVQoYykgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBGTEFHX1hESUdJVCkKKyNkZWZpbmUgSVNBTE5VTShjKSAoX1B5X2N0eXBlX3RhYmxlW1B5X0NIQVJNQVNLKGMpXSAmIEZMQUdfQUxOVU0pCisjZGVmaW5lIElTU1BBQ0UoYykgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBGTEFHX1NQQUNFKQogCiAjdW5kZWYgaXNsb3dlcgogI2RlZmluZSBpc2xvd2VyKGMpIHVuZGVmaW5lZF9pc2xvd2VyKGMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9yZWdydGVzdC5weSBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CmluZGV4IDliOGI1NzIuLjAwMGYyNDEgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CkBAIC01MjksNyArNTI5LDYgQEAKICAgICAndGVzdF9zdXBwb3J0JywKICAgICAndGVzdF9mdXR1cmUxJywKICAgICAndGVzdF9mdXR1cmUyJywKLSAgICAndGVzdF9mdXR1cmUzJywKIH0KIAogZGVmIGZpbmR0ZXN0cyh0ZXN0ZGlyPU5vbmUsIHN0ZHRlc3RzPVNURFRFU1RTLCBub3R0ZXN0cz1OT1RURVNUUyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NheC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5CmluZGV4IGE0MTFiZmQuLmViNzk1ODEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5CkBAIC00NDYsNyArNDQ2LDggQEAKIAogICAgICMgPT09PT0gSW5wdXRTb3VyY2Ugc3VwcG9ydAogCi0gICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX2ZpbGVuYW1lKHNlbGYpOgorICAgIGRlZiBYWFh0ZXN0X2V4cGF0X2lucHNvdXJjZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgIyBGSVhNRTogdGVzdCBibG9ja3MgaW5kZWZpbml0ZWx5CiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCkBAIC00NTYsNyArNDU3LDggQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQogCi0gICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX3N5c2lkKHNlbGYpOgorICAgIGRlZiBYWFh0ZXN0X2V4cGF0X2lucHNvdXJjZV9zeXNpZChzZWxmKToKKyAgICAgICAgIyBGSVhNRTogdGVzdCBibG9ja3MgaW5kZWZpbml0ZWx5CiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCkBAIC01MjksNyArNTMxLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VyLmdldFB1YmxpY0lkKCksIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlci5nZXRMaW5lTnVtYmVyKCksIDEpCiAKLSAgICBkZWYgdGVzdF9leHBhdF9sb2NhdG9yX3dpdGhpbmZvKHNlbGYpOgorICAgIGRlZiBYWFh0ZXN0X2V4cGF0X2xvY2F0b3Jfd2l0aGluZm8oc2VsZik6CisgICAgICAgICMgRklYTUU6IHRlc3QgYmxvY2tzIGluZGVmaW5pdGVseQogICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQpAQCAtNjg0LDcgKzY4Nyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFNBWFBhcnNlRXhjZXB0aW9uLCBwYXJzZXIucGFyc2UsIHNpbykKIAogCi1kZWYgdW5pdHRlc3RfbWFpbigpOgorZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChNYWtlUGFyc2VyVGVzdCwKICAgICAgICAgICAgICAgICAgU2F4dXRpbHNUZXN0LAogICAgICAgICAgICAgICAgICBYbWxnZW5UZXN0LApAQCAtNjkzLDQgKzY5Niw0IEBACiAgICAgICAgICAgICAgICAgIFhtbFJlYWRlclRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdW5pdHRlc3RfbWFpbigpCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKaW5kZXggZDNiODcwZi4uMmJlYzM3MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKQEAgLTUsOCArNSw5IEBACiAKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzZWxlY3QKLWltcG9ydCB0aW1lCiBpbXBvcnQgdGhyZWFkLCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCiBpbXBvcnQgUXVldWUKIGltcG9ydCBzeXMKIGltcG9ydCBvcwpAQCAtMTAxNiwxMCArMTAxNywxMyBAQAogICAgICAgICAgICAgZXhjZXB0IEFsYXJtOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNhdWdodCBvdGhlciBleGNlcHRpb24gaW5zdGVhZCBvZiBBbGFybSIpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgb3RoZXIgZXhjZXB0aW9uIGluc3RlYWQgb2YgQWxhcm06IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzKCVzKTpcbiVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzeXMuZXhjX2luZm8oKVs6Ml0gKyAodHJhY2ViYWNrLmZvcm1hdF9leGMoKSwpKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJub3RoaW5nIGNhdWdodCIpCi0gICAgICAgICAgICBzaWduYWwuYWxhcm0oMCkgICAgICAgICAjIHNodXQgb2ZmIGFsYXJtCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNpZ25hbC5hbGFybSgwKSAgICAgICAgICMgc2h1dCBvZmYgYWxhcm0KICAgICAgICAgZXhjZXB0IEFsYXJtOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJnb3QgQWxhcm0gaW4gd3JvbmcgcGxhY2UiKQogICAgICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkgYi9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weQppbmRleCBjMTUyM2UxLi45NDVkZDUxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weQpAQCAtNSwxMiArNSwxMyBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHJhaXNlIFRlc3RTa2lwcGVkKCdubyBzcWxpdGUgYXZhaWxhYmxlJykKIGZyb20gc3FsaXRlMy50ZXN0IGltcG9ydCAoZGJhcGksIHR5cGVzLCB1c2VyZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LCB0cmFuc2FjdGlvbnMsIGhvb2tzLCByZWdyZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LCB0cmFuc2FjdGlvbnMsIGhvb2tzLCByZWdyZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KGRiYXBpLnN1aXRlKCksIHR5cGVzLnN1aXRlKCksIHVzZXJmdW5jdGlvbnMuc3VpdGUoKSwKLSAgICAgICAgICAgICAgICAgZmFjdG9yeS5zdWl0ZSgpLCB0cmFuc2FjdGlvbnMuc3VpdGUoKSwgaG9va3Muc3VpdGUoKSwKLSAgICAgICAgICAgICAgICAgcmVncmVzc2lvbi5zdWl0ZSgpKQorICAgICAgICAgICAgICAgICBmYWN0b3J5LnN1aXRlKCksIHRyYW5zYWN0aW9ucy5zdWl0ZSgpLAorICAgICAgICAgICAgICAgICBob29rcy5zdWl0ZSgpLCByZWdyZXNzaW9uLnN1aXRlKCksIGR1bXAuc3VpdGUoKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQppbmRleCAzYTUzYWQ5Li44ZWVlNjY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQpAQCAtNiwxMiArNiwxNCBAQAogZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKK1BPUlQgPSA5MDkxCiAKIGRlZiBzZXJ2ZXIoZXZ0KToKICAgICBzZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQogICAgIHNlcnYuc2V0dGltZW91dCgzKQogICAgIHNlcnYuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKLSAgICBzZXJ2LmJpbmQoKCIiLCA5MDkxKSkKKyAgICBnbG9iYWwgUE9SVAorICAgIFBPUlQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlcnYsICIiLCBQT1JUKQogICAgIHNlcnYubGlzdGVuKDUpCiAgICAgZXZ0LnNldCgpCiAgICAgdHJ5OgpAQCAtMzYsMjQgKzM4LDI0IEBACiAKICAgICBkZWYgdGVzdEJhc2ljKHNlbGYpOgogICAgICAgICAjIGNvbm5lY3RzCi0gICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoImxvY2FsaG9zdCIsIDkwOTEpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoImxvY2FsaG9zdCIsIFBPUlQpCiAgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAotICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KCJsb2NhbGhvc3QiLCA5MDkxKQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KCJsb2NhbGhvc3QiLCBQT1JUKQogICAgICAgICBzZWxmLmFzc2VydFRydWUodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgogICAgICAgICAjIGEgdmFsdWUKLSAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldCgibG9jYWxob3N0IiwgOTA5MSwgdGltZW91dD0zMCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldCgibG9jYWxob3N0IiwgUE9SVCwgdGltZW91dD0zMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZWxuZXQuc29jay5nZXR0aW1lb3V0KCksIDMwKQogICAgICAgICB0ZWxuZXQuc29jay5jbG9zZSgpCiAKICAgICBkZWYgdGVzdFRpbWVvdXREaWZmZXJlbnRPcmRlcihzZWxmKToKICAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldCh0aW1lb3V0PTMwKQotICAgICAgICB0ZWxuZXQub3BlbigibG9jYWxob3N0IiwgOTA5MSkKKyAgICAgICAgdGVsbmV0Lm9wZW4oImxvY2FsaG9zdCIsIFBPUlQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpLCAzMCkKICAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQogCkBAIC02Miw3ICs2NCw3IEBACiAgICAgICAgIHByZXZpb3VzID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KCJsb2NhbGhvc3QiLCA5MDkxLCB0aW1lb3V0PU5vbmUpCisgICAgICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KCJsb2NhbGhvc3QiLCBQT1JULCB0aW1lb3V0PU5vbmUpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQocHJldmlvdXMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpLCAzMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKaW5kZXggNjdkOWVkOS4uZWUwYjE5NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTI3MSwxMyArMjcxLDE3IEBACiAgICAgICAgIHdlYWtfY3ljbGljX29iamVjdCA9IHdlYWtyZWYucmVmKGN5Y2xpY19vYmplY3QpCiAgICAgICAgIGN5Y2xpY19vYmplY3QudGhyZWFkLmpvaW4oKQogICAgICAgICBkZWwgY3ljbGljX29iamVjdAotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCB3ZWFrX2N5Y2xpY19vYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9uZSwgd2Vha19jeWNsaWNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0oJyVkIHJlZmVyZW5jZXMgc3RpbGwgYXJvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldHJlZmNvdW50KHdlYWtfY3ljbGljX29iamVjdCgpKSkpCiAKICAgICAgICAgcmFpc2luZ19jeWNsaWNfb2JqZWN0ID0gUnVuU2VsZkZ1bmN0aW9uKHNob3VsZF9yYWlzZT1UcnVlKQogICAgICAgICB3ZWFrX3JhaXNpbmdfY3ljbGljX29iamVjdCA9IHdlYWtyZWYucmVmKHJhaXNpbmdfY3ljbGljX29iamVjdCkKICAgICAgICAgcmFpc2luZ19jeWNsaWNfb2JqZWN0LnRocmVhZC5qb2luKCkKICAgICAgICAgZGVsIHJhaXNpbmdfY3ljbGljX29iamVjdAotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCB3ZWFrX3JhaXNpbmdfY3ljbGljX29iamVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCB3ZWFrX3JhaXNpbmdfY3ljbGljX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9KCclZCByZWZlcmVuY2VzIHN0aWxsIGFyb3VuZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5nZXRyZWZjb3VudCh3ZWFrX3JhaXNpbmdfY3ljbGljX29iamVjdCgpKSkpCiAKIAogY2xhc3MgVGhyZWFkaW5nRXhjZXB0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CmluZGV4IDY2MzMzMGIuLjA4MTU2NTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKQEAgLTEsNSArMSw2IEBACiAjIS91c3IvYmluL2VudiBweXRob24KIAoraW1wb3J0IG1pbWV0b29scwogaW1wb3J0IHRocmVhZGluZwogaW1wb3J0IHVybHBhcnNlCiBpbXBvcnQgdXJsbGliMgpAQCAtMjE3LDcgKzIxOCw3IEBACiAjIFRlc3QgY2FzZXMKIAogY2xhc3MgUHJveHlBdXRoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgotICAgIFVSTCA9ICJodHRwOi8vd3d3LmZvby5jb20iCisgICAgVVJMID0gImh0dHA6Ly9sb2NhbGhvc3QiCiAKICAgICBVU0VSID0gInRlc3RlciIKICAgICBQQVNTV0QgPSAidGVzdDEyMyIKQEAgLTI3OSw2ICsyODAsMjAyIEBACiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgcmVzdWx0LmNsb3NlKCkKIAorCitkZWYgR2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2VzKToKKworICAgIGNsYXNzIEZha2VIVFRQUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisKKyAgICAgICAgc2VydmVyX3ZlcnNpb24gPSAiVGVzdEhUVFAvIgorICAgICAgICByZXF1ZXN0cyA9IFtdCisgICAgICAgIGhlYWRlcnNfcmVjZWl2ZWQgPSBbXQorICAgICAgICBwb3J0ID0gODAKKworICAgICAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICAgICAgYm9keSA9IHNlbGYuc2VuZF9oZWFkKCkKKyAgICAgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShib2R5KQorCisgICAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICAgICAgY29udGVudF9sZW5ndGggPSBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10KKyAgICAgICAgICAgIHBvc3RfZGF0YSA9IHNlbGYucmZpbGUucmVhZChpbnQoY29udGVudF9sZW5ndGgpKQorICAgICAgICAgICAgc2VsZi5kb19HRVQoKQorICAgICAgICAgICAgc2VsZi5yZXF1ZXN0cy5hcHBlbmQocG9zdF9kYXRhKQorCisgICAgICAgIGRlZiBzZW5kX2hlYWQoc2VsZik6CisgICAgICAgICAgICBGYWtlSFRUUFJlcXVlc3RIYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWQgPSBzZWxmLmhlYWRlcnMKKyAgICAgICAgICAgIHNlbGYucmVxdWVzdHMuYXBwZW5kKHNlbGYucGF0aCkKKyAgICAgICAgICAgIHJlc3BvbnNlX2NvZGUsIGhlYWRlcnMsIGJvZHkgPSByZXNwb25zZXMucG9wKDApCisKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZShyZXNwb25zZV9jb2RlKQorCisgICAgICAgICAgICBmb3IgKGhlYWRlciwgdmFsdWUpIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcihoZWFkZXIsIHZhbHVlICUgc2VsZi5wb3J0KQorICAgICAgICAgICAgaWYgYm9keToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbicpCisgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHkKKyAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorCisgICAgICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKworICAgIHJldHVybiBGYWtlSFRUUFJlcXVlc3RIYW5kbGVyCisKKworY2xhc3MgVGVzdFVybG9wZW4odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHVybGxpYjIudXJsb3BlbiB1c2luZyB0aGUgbmV0d29yay4KKworICAgIFRoZXNlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gIEFzc3VtaW5nIHRoYXQgdGVzdGluZyB1c2luZyBmaWxlcyBkb2VzIGEKKyAgICBnb29kIGpvYiBvdmVyYWxsIG9mIHNvbWUgb2YgdGhlIGJhc2ljIGludGVyZmFjZSBmZWF0dXJlcy4gIFRoZXJlIGFyZSBubworICAgIHRlc3RzIGV4ZXJjaXNpbmcgdGhlIG9wdGlvbmFsICdkYXRhJyBhbmQgJ3Byb3hpZXMnIGFyZ3VtZW50cy4gIE5vIHRlc3RzCisgICAgZm9yIHRyYW5zcGFyZW50IHJlZGlyZWN0aW9uIGhhdmUgYmVlbiB3cml0dGVuLgorICAgICIiIgorCisgICAgZGVmIHN0YXJ0X3NlcnZlcihzZWxmLCByZXNwb25zZXMpOgorICAgICAgICBoYW5kbGVyID0gR2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2VzKQorCisgICAgICAgIHNlbGYuc2VydmVyID0gTG9vcGJhY2tIdHRwU2VydmVyVGhyZWFkKGhhbmRsZXIpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkud2FpdCgpCisgICAgICAgIHBvcnQgPSBzZWxmLnNlcnZlci5wb3J0CisgICAgICAgIGhhbmRsZXIucG9ydCA9IHBvcnQKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIKKworCisgICAgZGVmIHRlc3RfcmVkaXJlY3Rpb24oc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gYidXZSBnb3QgaGVyZS4uLicKKyAgICAgICAgcmVzcG9uc2VzID0gWworICAgICAgICAgICAgKDMwMiwgWygnTG9jYXRpb24nLCAnaHR0cDovL2xvY2FsaG9zdDolcy9zb21ld2hlcmVfZWxzZScpXSwgJycpLAorICAgICAgICAgICAgKDIwMCwgW10sIGV4cGVjdGVkX3Jlc3BvbnNlKQorICAgICAgICBdCisKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKHJlc3BvbnNlcykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKCdodHRwOi8vbG9jYWxob3N0OiVzLycgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkYXRhLCBleHBlY3RlZF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGhhbmRsZXIucmVxdWVzdHMsIFsnLycsICcvc29tZXdoZXJlX2Vsc2UnXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisKKyAgICBkZWYgdGVzdF80MDQoc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gYidCYWQgYmFkIGJhZC4uLicKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoNDA0LCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuKCdodHRwOi8vbG9jYWxob3N0OiVzL3dlZWJsZScgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBleGNlcHQgdXJsbGliMi5VUkxFcnJvciBhcyBmOgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJzQwNCBzaG91bGQgcmFpc2UgVVJMRXJyb3InKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkYXRhLCBleHBlY3RlZF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGhhbmRsZXIucmVxdWVzdHMsIFsnL3dlZWJsZSddKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKworICAgIGRlZiB0ZXN0XzIwMChzZWxmKToKKyAgICAgICAgZXhwZWN0ZWRfcmVzcG9uc2UgPSBiJ3B5Y29uIDIwMDguLi4nCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sIGV4cGVjdGVkX3Jlc3BvbnNlKV0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHVybGxpYjIudXJsb3BlbignaHR0cDovL2xvY2FsaG9zdDolcy9iaXphcnJlJyAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRhdGEsIGV4cGVjdGVkX3Jlc3BvbnNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGFuZGxlci5yZXF1ZXN0cywgWycvYml6YXJyZSddKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF8yMDBfd2l0aF9wYXJhbWV0ZXJzKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9yZXNwb25zZSA9IGIncHljb24gMjAwOC4uLicKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoMjAwLCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKCdodHRwOi8vbG9jYWxob3N0OiVzL2JpemFycmUnICUgaGFuZGxlci5wb3J0LCBiJ2dldD13aXRoX2ZlZWxpbmcnKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGF0YSwgZXhwZWN0ZWRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoYW5kbGVyLnJlcXVlc3RzLCBbJy9iaXphcnJlJywgYidnZXQ9d2l0aF9mZWVsaW5nJ10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworCisgICAgZGVmIHRlc3Rfc2VuZGluZ19oZWFkZXJzKHNlbGYpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCBiIndlIGRvbid0IGNhcmUiKV0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KCJodHRwOi8vbG9jYWxob3N0OiVzLyIgJSBoYW5kbGVyLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17J1JhbmdlJzogJ2J5dGVzPTIwLTM5J30pCisgICAgICAgICAgICB1cmxsaWIyLnVybG9wZW4ocmVxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWRbJ1JhbmdlJ10sICdieXRlcz0yMC0zOScpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCBiIndlIGRvbid0IGNhcmUiKV0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIyLnVybG9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICAgICAgZm9yIGF0dHIgaW4gKCJyZWFkIiwgImNsb3NlIiwgImluZm8iLCAiZ2V0dXJsIik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsb3BlbiBsYWNrcyB0aGUgJXMgYXR0cmlidXRlIiAlIGF0dHIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9wZW5fdXJsLnJlYWQoKSwgImNhbGxpbmcgJ3JlYWQnIGZhaWxlZCIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9wZW5fdXJsLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisgICAgZGVmIHRlc3RfaW5mbyhzZWxmKToKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoMjAwLCBbXSwgYiJ3ZSBkb24ndCBjYXJlIildKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliMi51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGluZm9fb2JqID0gb3Blbl91cmwuaW5mbygpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShpbmZvX29iaiwgbWltZXRvb2xzLk1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgJ2luZm8nIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbWV0b29scy5NZXNzYWdlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0c3VidHlwZSgpLCAicGxhaW4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9nZXR1cmwoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHNhbWUgVVJMIGFzIG9wZW5lZCBpcyByZXR1cm5lZCBieSBnZXR1cmwuCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sIGIid2UgZG9uJ3QgY2FyZSIpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICB1cmwgPSBvcGVuX3VybC5nZXR1cmwoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmwsICJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisKKyAgICBkZWYgdGVzdF9iYWRfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgcHJvcGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgYm9ndXMKKyAgICAgICAgIyBhZGRyZXNzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNGIHBhdGNoIDgwOTkxNTogIEluIFNlcCAyMDAzLCBWZXJpU2lnbiBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGlnaGphY2tpbmcgaW52YWxpZCAuY29tIGFuZCAubmV0IGFkZHJlc3NlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJvb3N0IHRyYWZmaWMgdG8gdGhlaXIgb3duIHNpdGUuICBUaGlzIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydGVkIGZhaWxpbmcgdGhlbi4gIE9uZSBob3BlcyB0aGUgLmludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gd2lsbCBiZSBzcGFyZWQgdG8gc2VydmUgaXRzIGRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXJwb3NlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly93d3cuc2FkZmxranNhc2FkZi5jb20vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuLCAiaHR0cDovL3d3dy5weXRob24uaW52YWxpZC4vIikKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgIyBXZSB3aWxsIE5PVCBkZXBlbmQgb24gdGhlIG5ldHdvcmsgcmVzb3VyY2UgZmxhZwogICAgICMgKExpYi90ZXN0L3JlZ3J0ZXN0LnB5IC11IG5ldHdvcmspIHNpbmNlIGFsbCB0ZXN0cyBoZXJlIGFyZSBvbmx5CkBAIC0yODcsNiArNDg0LDcgQEAKICAgICAjdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCJuZXR3b3JrIikKIAogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUHJveHlBdXRoVGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0VXJsb3BlbikKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CmluZGV4IGRjM2Q4ODQuLjc1ZGY5ZmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKQEAgLTI1LDIwICsyNSw2IEBACiAgICAgcmFpc2UgbGFzdF9leGMKIAogCi1jbGFzcyBVUkxUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgICBUSU1FT1VUID0gMTAuMAotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoc2VsZi5USU1FT1VUKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKLQotICAgIGRlZiB0ZXN0VVJMcmVhZChzZWxmKToKLSAgICAgICAgZiA9IF91cmxvcGVuX3dpdGhfcmV0cnkoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQotICAgICAgICB4ID0gZi5yZWFkKCkKLQogCiBjbGFzcyBBdXRoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3RzIHVybGxpYjIgYXV0aGVudGljYXRpb24gZmVhdHVyZXMuIiIiCkBAIC05OCw2OCArODQsNiBAQAogICAgICAgICByZXNwb25zZS5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhmaWxlb2JqZWN0LmNsb3NlZCkKIAotY2xhc3MgdXJsb3Blbk5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIiIiVGVzdHMgdXJsbGliMi51cmxvcGVuIHVzaW5nIHRoZSBuZXR3b3JrLgotCi0gICAgVGhlc2UgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgQXNzdW1pbmcgdGhhdCB0ZXN0aW5nIHVzaW5nIGZpbGVzIGRvZXMgYQotICAgIGdvb2Qgam9iIG92ZXJhbGwgb2Ygc29tZSBvZiB0aGUgYmFzaWMgaW50ZXJmYWNlIGZlYXR1cmVzLiAgVGhlcmUgYXJlIG5vCi0gICAgdGVzdHMgZXhlcmNpc2luZyB0aGUgb3B0aW9uYWwgJ2RhdGEnIGFuZCAncHJveGllcycgYXJndW1lbnRzLiAgTm8gdGVzdHMKLSAgICBmb3IgdHJhbnNwYXJlbnQgcmVkaXJlY3Rpb24gaGF2ZSBiZWVuIHdyaXR0ZW4uCi0KLSAgICBzZXRVcCBpcyBub3QgdXNlZCBmb3IgYWx3YXlzIGNvbnN0cnVjdGluZyBhIGNvbm5lY3Rpb24gdG8KLSAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvIHNpbmNlIHRoZXJlIGEgZmV3IHRlc3RzIHRoYXQgZG9uJ3QgdXNlIHRoYXQgYWRkcmVzcwotICAgIGFuZCBtYWtpbmcgYSBjb25uZWN0aW9uIGlzIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBtaW5pbWl6aW5nIHVubmVlZGVkCi0gICAgY29ubmVjdGlvbnMuCi0KLSAgICAiIiIKLQotICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgotICAgICAgICAjIFNpbXBsZSB0ZXN0IGV4cGVjdGVkIHRvIHBhc3MuCi0gICAgICAgIG9wZW5fdXJsID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCi0gICAgICAgIGZvciBhdHRyIGluICgicmVhZCIsICJjbG9zZSIsICJpbmZvIiwgImdldHVybCIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmxvcGVuIGxhY2tzIHRoZSAlcyBhdHRyaWJ1dGUiICUgYXR0cikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9wZW5fdXJsLnJlYWQoKSwgImNhbGxpbmcgJ3JlYWQnIGZhaWxlZCIpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgotICAgICAgICAjIFRlc3QgJ2luZm8nLgotICAgICAgICBvcGVuX3VybCA9IF91cmxvcGVuX3dpdGhfcmV0cnkoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoaW5mb19vYmosIG1pbWV0b29scy5NZXNzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5ICdpbmZvJyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJtaW1ldG9vbHMuTWVzc2FnZSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldHN1YnR5cGUoKSwgImh0bWwiKQotCi0gICAgZGVmIHRlc3RfZ2V0dXJsKHNlbGYpOgotICAgICAgICAjIE1ha2Ugc3VyZSBzYW1lIFVSTCBhcyBvcGVuZWQgaXMgcmV0dXJuZWQgYnkgZ2V0dXJsLgotICAgICAgICBVUkwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnLyIKLSAgICAgICAgb3Blbl91cmwgPSBfdXJsb3Blbl93aXRoX3JldHJ5KFVSTCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZ290dGVuX3VybCA9IG9wZW5fdXJsLmdldHVybCgpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290dGVuX3VybCwgVVJMKQotCi0gICAgZGVmIHRlc3RfYmFkX2FkZHJlc3Moc2VsZik6Ci0gICAgICAgICMgTWFrZSBzdXJlIHByb3BlciBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gY29ubmVjdGluZyB0byBhIGJvZ3VzCi0gICAgICAgICMgYWRkcmVzcy4KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTRiBwYXRjaCA4MDk5MTU6ICBJbiBTZXAgMjAwMywgVmVyaVNpZ24gc3RhcnRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhpZ2hqYWNraW5nIGludmFsaWQgLmNvbSBhbmQgLm5ldCBhZGRyZXNzZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBib29zdCB0cmFmZmljIHRvIHRoZWlyIG93biBzaXRlLiAgVGhpcyB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnRlZCBmYWlsaW5nIHRoZW4uICBPbmUgaG9wZXMgdGhlIC5pbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIHdpbGwgYmUgc3BhcmVkIHRvIHNlcnZlIGl0cyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgcHVycG9zZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIyLnVybG9wZW4sICJodHRwOi8vd3d3LnNhZGZsa2pzYXNhZGYuY29tLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly93d3cucHl0aG9uLmludmFsaWQuLyIpCi0KLQogY2xhc3MgT3RoZXJOZXR3b3JrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgaWYgMDogICMgZm9yIGRlYnVnZ2luZwpAQCAtMTY3LDEzICs5MSw2IEBACiAgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdF91cmxsaWIybmV0IikKICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpKQogCi0gICAgZGVmIHRlc3RfcmFuZ2UgKHNlbGYpOgotICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cucHl0aG9uLm9yZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsnUmFuZ2UnOiAnYnl0ZXM9MjAtMzknfSkKLSAgICAgICAgcmVzdWx0ID0gX3VybG9wZW5fd2l0aF9yZXRyeShyZXEpCi0gICAgICAgIGRhdGEgPSByZXN1bHQucmVhZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCAyMCkKLQogICAgICMgWFhYIFRoZSByZXN0IG9mIHRoZXNlIHRlc3RzIGFyZW4ndCB2ZXJ5IGdvb2QgLS0gdGhleSBkb24ndCBjaGVjayBtdWNoLgogICAgICMgVGhleSBkbyBzb21ldGltZXMgY2F0Y2ggc29tZSBtYWpvciBkaXNhc3RlcnMsIHRob3VnaC4KIApAQCAtMjAxLDE2ICsxMTgsNiBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKIAotICAgIGRlZiB0ZXN0X2h0dHAoc2VsZik6Ci0gICAgICAgIHVybHMgPSBbCi0gICAgICAgICAgICAnaHR0cDovL3d3dy5lc3BuLmNvbS8nLCAjIHJlZGlyZWN0Ci0gICAgICAgICAgICAnaHR0cDovL3d3dy5weXRob24ub3JnL1NwYW5pc2gvSW5xdWlzdGlvbi8nLAotICAgICAgICAgICAgKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcvY2dpLWJpbi9mYXF3LnB5JywKLSAgICAgICAgICAgICAncXVlcnk9cHl0aG9uaXN0YXMmcXVlcnl0eXBlPXNpbXBsZSZjYXNlZm9sZD15ZXMmcmVxPXNlYXJjaCcsIE5vbmUpLAotICAgICAgICAgICAgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nLAotICAgICAgICAgICAgXQotICAgICAgICBzZWxmLl90ZXN0X3VybHModXJscywgc2VsZi5fZXh0cmFfaGFuZGxlcnMoKSkKLQogICAgICMgWFhYIEZvbGxvd2luZyB0ZXN0IGRlcGVuZHMgb24gbWFjaGluZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBpbnRlcm5hbAogICAgICMgdG8gQ05SSS4gIE5lZWQgdG8gc2V0IHVwIGEgcHVibGljIHNlcnZlciB3aXRoIHRoZSByaWdodCBhdXRoZW50aWNhdGlvbgogICAgICMgY29uZmlndXJhdGlvbiBmb3IgdGVzdCBwdXJwb3Nlcy4KQEAgLTI3OCw2ICsxODUsNyBAQAogCiAgICAgICAgIHJldHVybiBoYW5kbGVycwogCisKIGNsYXNzIFRpbWVvdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9odHRwX2Jhc2ljKHNlbGYpOgogICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5weXRob24ub3JnIikKQEAgLTMyNiw5ICsyMzQsNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCJuZXR3b3JrIikKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVSTFRpbWVvdXRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsb3Blbk5ldHdvcmtUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhUZXN0cywKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEF1dGhUZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyTmV0d29ya1Rlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc2VTb2NrZXRUZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dFRlc3QsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbHJwYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CmluZGV4IDc3ZDQ1MjUuLjA2OTFmMjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CkBAIC0yMzgsOSArMjM4LDE3IEBACiAgICAgICAgICcnJ1RoaXMgaXMgbXkgZnVuY3Rpb24nJycKICAgICAgICAgcmV0dXJuIFRydWUKIAorICAgIGNsYXNzIE15WE1MUlBDU2VydmVyKFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXIpOgorICAgICAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0aGUgc29ja2V0IGlzIGFsd2F5cyBub24tYmxvY2tpbmcuICBPbiBMaW51eCwgc29ja2V0CisgICAgICAgICAgICAjIGF0dHJpYnV0ZXMgYXJlIG5vdCBpbmhlcml0ZWQgbGlrZSB0aGV5IGFyZSBvbiAqQlNEIGFuZCBXaW5kb3dzLgorICAgICAgICAgICAgcywgcG9ydCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICBzLnNldGJsb2NraW5nKFRydWUpCisgICAgICAgICAgICByZXR1cm4gcywgcG9ydAorCiAgICAgdHJ5OgotICAgICAgICBzZXJ2ID0gU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9RmFsc2UsIGJpbmRfYW5kX2FjdGl2YXRlPUZhbHNlKQorICAgICAgICBzZXJ2ID0gTXlYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPUZhbHNlLCBiaW5kX2FuZF9hY3RpdmF0ZT1GYWxzZSkKICAgICAgICAgc2Vydi5zZXJ2ZXJfYmluZCgpCiAgICAgICAgIGdsb2JhbCBQT1JUCiAgICAgICAgIFBPUlQgPSBzZXJ2LnNvY2tldC5nZXRzb2NrbmFtZSgpWzFdCmRpZmYgLS1naXQgYS9MaWIvdGhyZWFkaW5nLnB5IGIvTGliL3RocmVhZGluZy5weQppbmRleCBkMDEwYjgwLi44NjYxY2RlIDEwMDY0NAotLS0gYS9MaWIvdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90aHJlYWRpbmcucHkKQEAgLTM5MSw2ICszOTEsOSBAQAogICAgICMgc2h1dGRvd24gYW5kIHRodXMgcmFpc2VzIGFuIGV4Y2VwdGlvbiBhYm91dCB0cnlpbmcgdG8gcGVyZm9ybSBzb21lCiAgICAgIyBvcGVyYXRpb24gb24vd2l0aCBhIE5vbmVUeXBlCiAgICAgX19leGNfaW5mbyA9IF9zeXMuZXhjX2luZm8KKyAgICAjIEtlZXAgc3lzLmV4Y19jbGVhciB0b28gdG8gY2xlYXIgdGhlIGV4Y2VwdGlvbiBqdXN0IGJlZm9yZQorICAgICMgYWxsb3dpbmcgLmpvaW4oKSB0byByZXR1cm4uCisgICAgI1hYWCBfX2V4Y19jbGVhciA9IF9zeXMuZXhjX2NsZWFyCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXA9Tm9uZSwgdGFyZ2V0PU5vbmUsIG5hbWU9Tm9uZSwKICAgICAgICAgICAgICAgICAgYXJncz0oKSwga3dhcmdzPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CkBAIC01MjcsNiArNTMwLDEzIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX2Jvb3RzdHJhcCgpOiBub3JtYWwgcmV0dXJuIiwgc2VsZikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgIyBQcmV2ZW50IGEgcmFjZSBpbgorICAgICAgICAgICAgICAgICMgdGVzdF90aHJlYWRpbmcudGVzdF9ub19yZWZjeWNsZV90aHJvdWdoX3RhcmdldCB3aGVuCisgICAgICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIGtlZXBzIHRoZSB0YXJnZXQgYWxpdmUgcGFzdCB3aGVuIHdlCisgICAgICAgICAgICAgICAgIyBhc3NlcnQgdGhhdCBpdCdzIGRlYWQuCisgICAgICAgICAgICAgICAgI1hYWCBzZWxmLl9fZXhjX2NsZWFyKCkKKyAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICB3aXRoIF9hY3RpdmVfbGltYm9fbG9jazoKICAgICAgICAgICAgICAgICBzZWxmLl9zdG9wKCkKZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCAxOTZjMTQ4Li40YWEwMTAxIDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0zNjEsNiArMzYxLDcgQEAKIFZpdmVrIEtoZXJhCiBNYWRzIEtpaWxlcmljaAogVGFlayBKb28gS2ltCitQYXVsIEtpcHBlcwogU3RldmUgS2lyc2NoCiBSb24gS2xhdGNoa28KIEJhc3RpYW4gS2xlaW5laWRhbQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggOTQ1MTg4MS4uMTFhMTRhMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC0xLDYgKzEsNiBAQAogLyogY29ubmVjdGlvbi5jIC0gdGhlIGNvbm5lY3Rpb24gdHlwZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSO+/vXJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICogCkBAIC0xMDY5LDYgKzEwNjksNTIgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCisvKiBGdW5jdGlvbiBhdXRob3I6IFBhdWwgS2lwcGVzIDxraXBwZXNwQGdtYWlsLmNvbT4KKyAqIENsYXNzIG1ldGhvZCBvZiBDb25uZWN0aW9uIHRvIGNhbGwgdGhlIFB5dGhvbiBmdW5jdGlvbiBfaXRlcmR1bXAKKyAqIG9mIHRoZSBzcWxpdGUzIG1vZHVsZS4KKyAqLworc3RhdGljIFB5T2JqZWN0ICoKK3B5c3FsaXRlX2Nvbm5lY3Rpb25faXRlcmR1bXAocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CisgICAgUHlPYmplY3QqIG1vZHVsZSA9IE5VTEw7CisgICAgUHlPYmplY3QqIG1vZHVsZV9kaWN0OworICAgIFB5T2JqZWN0KiBweWZuX2l0ZXJkdW1wOworCisgICAgaWYgKCFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoTU9EVUxFX05BTUUgIi5kdW1wIik7CisgICAgaWYgKCFtb2R1bGUpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIG1vZHVsZV9kaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpOworICAgIGlmICghbW9kdWxlX2RpY3QpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHB5Zm5faXRlcmR1bXAgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9pdGVyZHVtcCIpOworICAgIGlmICghcHlmbl9pdGVyZHVtcCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkZhaWxlZCB0byBvYnRhaW4gX2l0ZXJkdW1wKCkgcmVmZXJlbmNlIik7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCAwLCAoUHlPYmplY3QqKXNlbGYpOworICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocHlmbl9pdGVyZHVtcCwgYXJncyk7CisKK2ZpbmFsbHk6CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKG1vZHVsZSk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKQEAgLTExNDAsNiArMTE4Niw0MyBAQAogICAgIHJldHVybiByZXR2YWw7CiB9CiAKKy8qIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuIFJldHVybnMgaXRzZWxmIGFzIGEKKyAqIGNvbnZlbmllbmNlIHRvIHRoZSBjYWxsZXIuICovCitzdGF0aWMgUHlPYmplY3QgKgorcHlzcWxpdGVfY29ubmVjdGlvbl9lbnRlcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKK30KKworLyoqIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuIElmIHRoZXJlIHdhcyBhbnkKKyAqIGV4Y2VwdGlvbiwgYSByb2xsYmFjayB0YWtlcyBwbGFjZTsgb3RoZXJ3aXNlIHdlIGNvbW1pdC4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitweXNxbGl0ZV9jb25uZWN0aW9uX2V4aXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIGV4Y190eXBlLCAqZXhjX3ZhbHVlLCAqZXhjX3RiOworICAgIGNoYXIqIG1ldGhvZF9uYW1lOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZleGNfdHlwZSwgJmV4Y192YWx1ZSwgJmV4Y190YikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGV4Y190eXBlID09IFB5X05vbmUgJiYgZXhjX3ZhbHVlID09IFB5X05vbmUgJiYgZXhjX3RiID09IFB5X05vbmUpIHsKKyAgICAgICAgbWV0aG9kX25hbWUgPSAiY29tbWl0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBtZXRob2RfbmFtZSA9ICJyb2xsYmFjayI7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsIG1ldGhvZF9uYW1lLCAiIik7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworCisgICAgUHlfUkVUVVJOX0ZBTFNFOworfQorCiBzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2JqZWN0LiIpOwogCkBAIC0xMTc0LDYgKzEyNTcsMTMgQEAKICAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29sbGF0aW9uIGZ1bmN0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiaW50ZXJydXB0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25faW50ZXJydXB0LCBNRVRIX05PQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJBYm9ydCBhbnkgcGVuZGluZyBkYXRhYmFzZSBvcGVyYXRpb24uIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJpdGVyZHVtcCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2l0ZXJkdW1wLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm5zIGl0ZXJhdG9yIHRvIHRoZSBkdW1wIG9mIHRoZSBkYXRhYmFzZSBpbiBhbiBTUUwgdGV4dCIKKyAgICAgICAgICAgICAgICAgICJmb3JtYXQuIil9LAorICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZW50ZXIsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkZvciBjb250ZXh0IG1hbmFnZXIuIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJfX2V4aXRfXyIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2V4aXQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJGb3IgY29udGV4dCBtYW5hZ2VyLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHtOVUxMLCBOVUxMfQogfTsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwppbmRleCBhNDdjZDU0Li45MGI5NzBlIDEwMDY0NAotLS0gYS9PYmplY3RzL2NvbXBsZXhvYmplY3QuYworKysgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwpAQCAtOCw2ICs4LDEwIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKKyNpZmRlZiBIQVZFX0lFRUVGUF9ICisjaW5jbHVkZSA8aWVlZWZwLmg+CisjZW5kaWYKKwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKIAogLyogUHJlY2lzaW9ucyB1c2VkIGJ5IHJlcHIoKSBhbmQgc3RyKCksIHJlc3BlY3RpdmVseS4KZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCAyMGYxNTEwLi43NDVkZmMzIDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0xMiw2ICsxMiwxMCBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZmxvYXQuaD4KIAorI2lmZGVmIEhBVkVfSUVFRUZQX0gKKyNpbmNsdWRlIDxpZWVlZnAuaD4KKyNlbmRpZgorCiAjaWYgIWRlZmluZWQoX19TVERDX18pCiBleHRlcm4gZG91YmxlIGZtb2QoZG91YmxlLCBkb3VibGUpOwogZXh0ZXJuIGRvdWJsZSBwb3coZG91YmxlLCBkb3VibGUpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCBiODcyNWRmLi4xZDRiNTAyIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtMTYyMCw3ICsxNjIwLDcgQEAKIAkJbiA+Pj0gMTsKIAkvKiBuIDwtIHRvdGFsICMgb2YgYml0cyBuZWVkZWQsIHdoaWxlIHNldHRpbmcgcCB0byBlbmQtb2Ytc3RyaW5nICovCiAJbiA9IDA7Ci0Jd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soKnApXSA8IGJhc2UpCisJd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqcCldIDwgYmFzZSkKIAkJKytwOwogCSpzdHIgPSBwOwogCS8qIG4gPC0gIyBvZiBQeXRob24gZGlnaXRzIG5lZWRlZCwgPSBjZWlsaW5nKG4vUHlMb25nX1NISUZUKS4gKi8KQEAgLTE2NDEsNyArMTY0MSw3IEBACiAJYml0c19pbl9hY2N1bSA9IDA7CiAJcGRpZ2l0ID0gei0+b2JfZGlnaXQ7CiAJd2hpbGUgKC0tcCA+PSBzdGFydCkgewotCQlpbnQgayA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soKnApXTsKKwkJaW50IGsgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnApXTsKIAkJYXNzZXJ0KGsgPj0gMCAmJiBrIDwgYmFzZSk7CiAJCWFjY3VtIHw9ICh0d29kaWdpdHMpKGsgPDwgYml0c19pbl9hY2N1bSk7CiAJCWJpdHNfaW5fYWNjdW0gKz0gYml0c19wZXJfY2hhcjsKQEAgLTE4MjgsNyArMTgyOCw3IEBACiAKIAkJLyogRmluZCBsZW5ndGggb2YgdGhlIHN0cmluZyBvZiBudW1lcmljIGNoYXJhY3RlcnMuICovCiAJCXNjYW4gPSBzdHI7Ci0JCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbKHVuc2lnbmVkKVB5X0NIQVJNQVNLKCpzY2FuKV0gPCBiYXNlKQorCQl3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzY2FuKV0gPCBiYXNlKQogCQkJKytzY2FuOwogCiAJCS8qIENyZWF0ZSBhIGxvbmcgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gdGhlIGxhcmdlc3QgcG9zc2libGUKQEAgLTE4NTQsMTAgKzE4NTQsMTAgQEAKIAkJLyogV29yayA7LSkgKi8KIAkJd2hpbGUgKHN0ciA8IHNjYW4pIHsKIAkJCS8qIGdyYWIgdXAgdG8gY29udndpZHRoIGRpZ2l0cyBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgKi8KLQkJCWMgPSAoZGlnaXQpX1B5TG9uZ19EaWdpdFZhbHVlWyh1bnNpZ25lZClQeV9DSEFSTUFTSygqc3RyKyspXTsKKwkJCWMgPSAoZGlnaXQpX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIrKyldOwogCQkJZm9yIChpID0gMTsgaSA8IGNvbnZ3aWR0aCAmJiBzdHIgIT0gc2NhbjsgKytpLCArK3N0cikgewogCQkJCWMgPSAodHdvZGlnaXRzKShjICogIGJhc2UgKwotCQkJCQlfUHlMb25nX0RpZ2l0VmFsdWVbKHVuc2lnbmVkKVB5X0NIQVJNQVNLKCpzdHIpXSk7CisJCQkJCV9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0pOwogCQkJCWFzc2VydChjIDwgUHlMb25nX0JBU0UpOwogCQkJfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCmluZGV4IGZlZjMwNGEuLjYwY2JmZmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCkBAIC01MTIsMTMgKzUxMiwxMyBAQAogCS8qIFNpbmdsZSBjaGFyYWN0ZXJzIGFyZSBzaGFyZWQgd2hlbiB1c2luZyB0aGlzIGNvbnN0cnVjdG9yLgogICAgICAgICAgICBSZXN0cmljdCB0byBBU0NJSSwgc2luY2UgdGhlIGlucHV0IG11c3QgYmUgVVRGLTguICovCiAJaWYgKHNpemUgPT0gMSAmJiBQeV9DSEFSTUFTSygqdSkgPCAxMjgpIHsKLQkgICAgdW5pY29kZSA9IHVuaWNvZGVfbGF0aW4xWyh1bnNpZ25lZClQeV9DSEFSTUFTSygqdSldOworCSAgICB1bmljb2RlID0gdW5pY29kZV9sYXRpbjFbUHlfQ0hBUk1BU0soKnUpXTsKIAkgICAgaWYgKCF1bmljb2RlKSB7CiAJCXVuaWNvZGUgPSBfUHlVbmljb2RlX05ldygxKTsKIAkJaWYgKCF1bmljb2RlKQogCQkgICAgcmV0dXJuIE5VTEw7CiAJCXVuaWNvZGUtPnN0clswXSA9IFB5X0NIQVJNQVNLKCp1KTsKLQkJdW5pY29kZV9sYXRpbjFbKHVuc2lnbmVkKVB5X0NIQVJNQVNLKCp1KV0gPSB1bmljb2RlOworCQl1bmljb2RlX2xhdGluMVtQeV9DSEFSTUFTSygqdSldID0gdW5pY29kZTsKIAkgICAgfQogCSAgICBQeV9JTkNSRUYodW5pY29kZSk7CiAJICAgIHJldHVybiAoUHlPYmplY3QgKil1bmljb2RlOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5jIGIvUGFyc2VyL3Rva2VuaXplci5jCmluZGV4IDBiODM0MWEuLjk1OWEwY2EgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuYworKysgYi9QYXJzZXIvdG9rZW5pemVyLmMKQEAgLTM5LDE0ICszOSw2IEBACiAvKiBEb24ndCBldmVyIGNoYW5nZSB0aGlzIC0tIGl0IHdvdWxkIGJyZWFrIHRoZSBwb3J0YWJpbGl0eSBvZiBQeXRob24gY29kZSAqLwogI2RlZmluZSBUQUJTSVpFIDgKIAotLyogQ29udmVydCBhIHBvc3NpYmx5IHNpZ25lZCBjaGFyYWN0ZXIgdG8gYSBub25uZWdhdGl2ZSBpbnQgKi8KLS8qIFhYWCBUaGlzIGFzc3VtZXMgY2hhcmFjdGVycyBhcmUgOCBiaXRzIHdpZGUgKi8KLSNpZmRlZiBfX0NIQVJfVU5TSUdORURfXwotI2RlZmluZSBQeV9DSEFSTUFTSyhjKQkJKGMpCi0jZWxzZQotI2RlZmluZSBQeV9DSEFSTUFTSyhjKQkJKChjKSAmIDB4ZmYpCi0jZW5kaWYKLQogLyogRm9yd2FyZCAqLwogc3RhdGljIHN0cnVjdCB0b2tfc3RhdGUgKnRva19uZXcodm9pZCk7CiBzdGF0aWMgaW50IHRva19uZXh0YyhzdHJ1Y3QgdG9rX3N0YXRlICp0b2spOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL215c3RydG91bC5jIGIvUHl0aG9uL215c3RydG91bC5jCmluZGV4IGFjMzRjMjYuLjM0N2YzNjEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9teXN0cnRvdWwuYworKysgYi9QeXRob24vbXlzdHJ0b3VsLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJKytzdHI7CiAJCQlpZiAoKnN0ciA9PSAneCcgfHwgKnN0ciA9PSAnWCcpIHsKIAkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAweCAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbKHVuc2lnbmVkKVB5X0NIQVJNQVNLKHN0clsxXSldID49IDE2KSB7CisJCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAxNikgewogCQkJCQlpZiAocHRyKQogCQkJCQkJKnB0ciA9IHN0cjsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCQliYXNlID0gMTY7CiAJCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ28nIHx8ICpzdHIgPT0gJ08nKSB7CiAJCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMG8gKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlWyh1bnNpZ25lZClQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSA4KSB7CisJCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSA4KSB7CiAJCQkJCWlmIChwdHIpCiAJCQkJCQkqcHRyID0gc3RyOwogCQkJCQlyZXR1cm4gMDsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQkJCWJhc2UgPSA4OwogCQkJfSBlbHNlIGlmICgqc3RyID09ICdiJyB8fCAqc3RyID09ICdCJykgewogCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBiICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMikgeworCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMikgewogCQkJCQlpZiAocHRyKQogCQkJCQkJKnB0ciA9IHN0cjsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAkJCSsrc3RyOwogCQkJaWYgKCpzdHIgPT0gJ3gnIHx8ICpzdHIgPT0gJ1gnKSB7CiAJCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMHggKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlWyh1bnNpZ25lZClQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAxNikgeworCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMTYpIHsKIAkJCQkJaWYgKHB0cikKIAkJCQkJCSpwdHIgPSBzdHI7CiAJCQkJCXJldHVybiAwOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCQkrK3N0cjsKIAkJCWlmICgqc3RyID09ICdvJyB8fCAqc3RyID09ICdPJykgewogCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBvICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gOCkgeworCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gOCkgewogCQkJCQlpZiAocHRyKQogCQkJCQkJKnB0ciA9IHN0cjsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xODMsNyArMTgzLDcgQEAKIAkJCSsrc3RyOwogCQkJaWYgKCpzdHIgPT0gJ2InIHx8ICpzdHIgPT0gJ0InKSB7CiAJCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMGIgKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlWyh1bnNpZ25lZClQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAyKSB7CisJCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAyKSB7CiAJCQkJCWlmIChwdHIpCiAJCQkJCQkqcHRyID0gc3RyOwogCQkJCQlyZXR1cm4gMDsKQEAgLTIwOSw3ICsyMDksNyBAQAogCW92bGltaXQgPSBkaWdpdGxpbWl0W2Jhc2VdOwogCiAJLyogZG8gdGhlIGNvbnZlcnNpb24gdW50aWwgbm9uLWRpZ2l0IGNoYXJhY3RlciBlbmNvdW50ZXJlZCAqLwotCXdoaWxlICgoYyA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsodW5zaWduZWQpUHlfQ0hBUk1BU0soKnN0cildKSA8IGJhc2UpIHsKKwl3aGlsZSAoKGMgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildKSA8IGJhc2UpIHsKIAkJaWYgKG92bGltaXQgPiAwKSAvKiBubyBvdmVyZmxvdyBjaGVjayByZXF1aXJlZCAqLwogCQkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIGM7CiAJCWVsc2UgeyAvKiByZXF1aXJlcyBvdmVyZmxvdyBjaGVjayAqLwpAQCAtMjQ2LDcgKzI0Niw3IEBACiBvdmVyZmxvd2VkOgogCWlmIChwdHIpIHsKIAkJLyogc3Bvb2wgdGhyb3VnaCByZW1haW5pbmcgZGlnaXQgY2hhcmFjdGVycyAqLwotCQl3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlWyh1bnNpZ25lZClQeV9DSEFSTUFTSygqc3RyKV0gPCBiYXNlKQorCQl3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSA8IGJhc2UpCiAJCQkrK3N0cjsKIAkJKnB0ciA9IHN0cjsKIAl9CmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggN2ZhMTA2Zi4uMzdkOTcyNiAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMSw1ICsxLDUgQEAKICMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDYxNzI4IC4KKyMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDYxODQ4IC4KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KICMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBweXRob24gMy4wLgogIwpAQCAtNTM5Miw5ICs1MzkyLDEwIEBACiAKIAogCisKIGZvciBhY19oZWFkZXIgaW4gYXNtL3R5cGVzLmggY29uaW8uaCBjdXJzZXMuaCBkaXJlY3QuaCBkbGZjbi5oIGVycm5vLmggXAogZmNudGwuaCBncnAuaCBcCi1pby5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCitpZWVlZnAuaCBpby5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCiBzaGFkb3cuaCBzaWduYWwuaCBzdGRpbnQuaCBzdHJvcHRzLmggdGVybWlvcy5oIHRocmVhZC5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogc3lzL2F1ZGlvaW8uaCBzeXMvYnNkdHR5Lmggc3lzL2Vwb2xsLmggc3lzL2V2ZW50Lmggc3lzL2ZpbGUuaCBzeXMvbG9hZGF2Zy5oIFwKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCA2NjRjOTY1Li5kZDk2YmJlIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0xMDc0LDcgKzEwNzQsNyBAQAogQUNfSEVBREVSX1NUREMKIEFDX0NIRUNLX0hFQURFUlMoYXNtL3R5cGVzLmggY29uaW8uaCBjdXJzZXMuaCBkaXJlY3QuaCBkbGZjbi5oIGVycm5vLmggXAogZmNudGwuaCBncnAuaCBcCi1pby5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCitpZWVlZnAuaCBpby5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCiBzaGFkb3cuaCBzaWduYWwuaCBzdGRpbnQuaCBzdHJvcHRzLmggdGVybWlvcy5oIHRocmVhZC5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogc3lzL2F1ZGlvaW8uaCBzeXMvYnNkdHR5Lmggc3lzL2Vwb2xsLmggc3lzL2V2ZW50Lmggc3lzL2ZpbGUuaCBzeXMvbG9hZGF2Zy5oIFwKZGlmZiAtLWdpdCBhL3B5Y29uZmlnLmguaW4gYi9weWNvbmZpZy5oLmluCmluZGV4IDczMmI4ZmYuLmVmMjZmODIgMTAwNjQ0Ci0tLSBhL3B5Y29uZmlnLmguaW4KKysrIGIvcHljb25maWcuaC5pbgpAQCAtMjk3LDYgKzI5Nyw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90JyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX0hZUE9UCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aWVlZWZwLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSUVFRUZQX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaW5ldF9hdG9uJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX0lORVRfQVRPTgogCg==