ZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXggYi9Eb2MvbGliL2xpYnRhcmZpbGUudGV4CmluZGV4IDczYzM1ZWQuLjU0NjgzYTcgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0YXJmaWxlLnRleApAQCAtMTMzLDI0ICsxMzMsMjAgQEAKICAgICBcdmVyc2lvbmFkZGVkezIuNn0KIFxlbmR7ZXhjZGVzY30KIAorRWFjaCBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmVzIGEgdGFyIGFyY2hpdmUgZm9ybWF0IHRoYXQgdGhlCitcbW9kdWxle3RhcmZpbGV9IG1vZHVsZSBpcyBhYmxlIHRvIGNyZWF0ZS4gU2VlIHNlY3Rpb24gXHJlZnt0YXItZm9ybWF0c30gZm9yCitkZXRhaWxzLgorCiBcYmVnaW57ZGF0YWRlc2N9e1VTVEFSX0ZPUk1BVH0KLSAgICBcUE9TSVh7fS4xLTE5ODggKHVzdGFyKSBmb3JtYXQuIEl0IHN1cHBvcnRzIGZpbGVuYW1lcyB1cCB0byBhIGxlbmd0aCBvZgotICAgIGF0IGJlc3QgMjU2IGNoYXJhY3RlcnMgYW5kIGxpbmtuYW1lcyB1cCB0byAxMDAgY2hhcmFjdGVycy4gVGhlIG1heGltdW0KLSAgICBmaWxlIHNpemUgaXMgOCBnaWdhYnl0ZXMuIFRoaXMgaXMgYW4gb2xkIGFuZCBsaW1pdGVkIGJ1dCB3aWRlbHkKLSAgICBzdXBwb3J0ZWQgZm9ybWF0LgorICAgIFxQT1NJWHt9LjEtMTk4OCAodXN0YXIpIGZvcm1hdC4KIFxlbmR7ZGF0YWRlc2N9CiAKIFxiZWdpbntkYXRhZGVzY317R05VX0ZPUk1BVH0KLSAgICBHTlUgdGFyIGZvcm1hdC4gSXQgc3VwcG9ydHMgYXJiaXRyYXJpbHkgbG9uZyBmaWxlbmFtZXMgYW5kIGxpbmtuYW1lcyBhbmQKLSAgICBmaWxlcyBiaWdnZXIgdGhhbiA4IGdpZ2FieXRlcy4gSXQgaXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb24gR05VL0xpbnV4Ci0gICAgc3lzdGVtcy4KKyAgICBHTlUgdGFyIGZvcm1hdC4KIFxlbmR7ZGF0YWRlc2N9CiAKIFxiZWdpbntkYXRhZGVzY317UEFYX0ZPUk1BVH0KLSAgICBcUE9TSVh7fS4xLTIwMDEgKHBheCkgZm9ybWF0LiBJdCBpcyB0aGUgbW9zdCBmbGV4aWJsZSBmb3JtYXQgd2l0aAotICAgIHZpcnR1YWxseSBubyBsaW1pdHMuIEl0IHN1cHBvcnRzIGxvbmcgZmlsZW5hbWVzIGFuZCBsaW5rbmFtZXMsIGxhcmdlIGZpbGVzCi0gICAgYW5kIHN0b3JlcyBwYXRobmFtZXMgaW4gYSBwb3J0YWJsZSB3YXkuICBIb3dldmVyLCBub3QgYWxsIHRhcgotICAgIGltcGxlbWVudGF0aW9ucyB0b2RheSBhcmUgYWJsZSB0byBoYW5kbGUgcGF4IGFyY2hpdmVzIHByb3Blcmx5LgorICAgIFxQT1NJWHt9LjEtMjAwMSAocGF4KSBmb3JtYXQuCiBcZW5ke2RhdGFkZXNjfQogCiBcYmVnaW57ZGF0YWRlc2N9e0RFRkFVTFRfRk9STUFUfQpAQCAtMTc1LDE1ICsxNzEsMTUgQEAKIAogVGhlIFxjbGFzc3tUYXJGaWxlfSBvYmplY3QgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGEgdGFyIGFyY2hpdmUuIEEgdGFyCiBhcmNoaXZlIGlzIGEgc2VxdWVuY2Ugb2YgYmxvY2tzLiBBbiBhcmNoaXZlIG1lbWJlciAoYSBzdG9yZWQgZmlsZSkgaXMgbWFkZSB1cAotb2YgYSBoZWFkZXIgYmxvY2sgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MuIEl0IGlzIHBvc3NpYmxlLCB0byBzdG9yZSBhIGZpbGUgaW4gYQorb2YgYSBoZWFkZXIgYmxvY2sgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MuIEl0IGlzIHBvc3NpYmxlIHRvIHN0b3JlIGEgZmlsZSBpbiBhCiB0YXIgYXJjaGl2ZSBzZXZlcmFsIHRpbWVzLiBFYWNoIGFyY2hpdmUgbWVtYmVyIGlzIHJlcHJlc2VudGVkIGJ5IGEKIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QsIHNlZSBcY2l0ZXRpdGxle1RhckluZm8gT2JqZWN0c30gKHNlY3Rpb24KIFxyZWZ7dGFyaW5mby1vYmplY3RzfSkgZm9yIGRldGFpbHMuCiAKIFxiZWdpbntjbGFzc2Rlc2N9e1RhckZpbGV9e25hbWU9Tm9uZSwgbW9kZT0ncicsIGZpbGVvYmo9Tm9uZSwKICAgICAgICAgZm9ybWF0PURFRkFVTFRfRk9STUFULCB0YXJpbmZvPVRhckluZm8sIGRlcmVmZXJlbmNlPUZhbHNlLAotICAgICAgICBpZ25vcmVfemVyb3M9RmFsc2UsIGVuY29kaW5nPU5vbmUsIHBheF9oZWFkZXJzPU5vbmUsIGRlYnVnPTAsCi0gICAgICAgIGVycm9ybGV2ZWw9MH0KKyAgICAgICAgaWdub3JlX3plcm9zPUZhbHNlLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSwgcGF4X2hlYWRlcnM9Tm9uZSwKKyAgICAgICAgZGVidWc9MCwgZXJyb3JsZXZlbD0wfQogCiAgICAgQWxsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIGFuZCBjYW4gYmUgYWNjZXNzZWQgYXMgaW5zdGFuY2UKICAgICBhdHRyaWJ1dGVzIGFzIHdlbGwuCkBAIC0yMzEsMTggKzIyNywxNCBAQAogICAgIElmIFxjb2RlezJ9LCBhbGwgXGVtcGh7bm9uLWZhdGFsfSBlcnJvcnMgYXJlIHJhaXNlZCBhcyBcZXhjZXB0aW9ue1RhckVycm9yfQogICAgIGV4Y2VwdGlvbnMgYXMgd2VsbC4KIAotICAgIFRoZSBcdmFye2VuY29kaW5nfSBhcmd1bWVudCBkZWZpbmVzIHRoZSBsb2NhbCBjaGFyYWN0ZXIgZW5jb2RpbmcuIEl0Ci0gICAgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGZyb20gXGZ1bmN0aW9ue3N5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKX0gb3IgaWYKLSAgICB0aGF0IGlzIFxjb2Rle05vbmV9IHRvIFxjb2RleyJhc2NpaSJ9LiBcdmFye2VuY29kaW5nfSBpcyB1c2VkIG9ubHkgaW4KLSAgICBjb25uZWN0aW9uIHdpdGggdGhlIHBheCBmb3JtYXQgd2hpY2ggc3RvcmVzIHRleHQgZGF0YSBpbiBcZW1waHtVVEYtOH0uIElmCi0gICAgaXQgaXMgbm90IHNldCBjb3JyZWN0bHksIGNoYXJhY3RlciBjb252ZXJzaW9uIHdpbGwgZmFpbCB3aXRoIGEKLSAgICBcZXhjZXB0aW9ue1VuaWNvZGVFcnJvcn0uCisgICAgVGhlIFx2YXJ7ZW5jb2Rpbmd9IGFuZCBcdmFye2Vycm9yc30gYXJndW1lbnRzIGNvbnRyb2wgdGhlIHdheSBzdHJpbmdzIGFyZQorICAgIGNvbnZlcnRlZCB0byB1bmljb2RlIG9iamVjdHMgYW5kIHZpY2UgdmVyc2EuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgd29yaworICAgIGZvciBtb3N0IHVzZXJzLiBTZWUgc2VjdGlvbiBccmVme3Rhci11bmljb2RlfSBmb3IgaW4tZGVwdGggaW5mb3JtYXRpb24uCiAgICAgXHZlcnNpb25hZGRlZHsyLjZ9CiAKLSAgICBUaGUgXHZhcntwYXhfaGVhZGVyc30gYXJndW1lbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgZWxlbWVudHMgYXJlCi0gICAgZWl0aGVyIHVuaWNvZGUgb2JqZWN0cywgbnVtYmVycyBvciBzdHJpbmdzIHRoYXQgY2FuIGJlIGRlY29kZWQgdG8gdW5pY29kZQotICAgIHVzaW5nIFx2YXJ7ZW5jb2Rpbmd9LiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUgYXMgYQotICAgIHBheCBnbG9iYWwgaGVhZGVyLgorICAgIFRoZSBcdmFye3BheF9oZWFkZXJzfSBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBkaWN0aW9uYXJ5IG9mIHVuaWNvZGUgc3RyaW5ncworICAgIHdoaWNoIHdpbGwgYmUgYWRkZWQgYXMgYSBwYXggZ2xvYmFsIGhlYWRlciBpZiBcdmFye2Zvcm1hdH0gaXMKKyAgICBcY29uc3RhbnR7UEFYX0ZPUk1BVH0uCiAgICAgXHZlcnNpb25hZGRlZHsyLjZ9CiBcZW5ke2NsYXNzZGVzY30KIApAQCAtMjg3LDcgKzI3OSw3IEBACiAgICAgRXh0cmFjdCBhbGwgbWVtYmVycyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgICAgb3IgZGlyZWN0b3J5IFx2YXJ7cGF0aH0uIElmIG9wdGlvbmFsIFx2YXJ7bWVtYmVyc30gaXMgZ2l2ZW4sIGl0IG11c3QgYmUKICAgICBhIHN1YnNldCBvZiB0aGUgbGlzdCByZXR1cm5lZCBieSBcbWV0aG9ke2dldG1lbWJlcnMoKX0uCi0gICAgRGlyZWN0b3J5IGluZm9ybWF0aW9ucyBsaWtlIG93bmVyLCBtb2RpZmljYXRpb24gdGltZSBhbmQgcGVybWlzc2lvbnMgYXJlCisgICAgRGlyZWN0b3J5IGluZm9ybWF0aW9uIGxpa2Ugb3duZXIsIG1vZGlmaWNhdGlvbiB0aW1lIGFuZCBwZXJtaXNzaW9ucyBhcmUKICAgICBzZXQgYWZ0ZXIgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIGV4dHJhY3RlZC4gVGhpcyBpcyBkb25lIHRvIHdvcmsgYXJvdW5kIHR3bwogICAgIHByb2JsZW1zOiBBIGRpcmVjdG9yeSdzIG1vZGlmaWNhdGlvbiB0aW1lIGlzIHJlc2V0IGVhY2ggdGltZSBhIGZpbGUgaXMKICAgICBjcmVhdGVkIGluIGl0LiBBbmQsIGlmIGEgZGlyZWN0b3J5J3MgcGVybWlzc2lvbnMgZG8gbm90IGFsbG93IHdyaXRpbmcsCkBAIC0zNjUsNiArMzU3LDExIEBACiAgICAgXGRlcHJlY2F0ZWR7Mi42fXtVc2UgdGhlIFxtZW1iZXJ7Zm9ybWF0fSBhdHRyaWJ1dGUgaW5zdGVhZC59CiBcZW5ke21lbWJlcmRlc2N9CiAKK1xiZWdpbnttZW1iZXJkZXNjfXtwYXhfaGVhZGVyc30KKyAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgb2YgcGF4IGdsb2JhbCBoZWFkZXJzLgorICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQorXGVuZHttZW1iZXJkZXNjfQorCiAlLS0tLS0tLS0tLS0tLS0tLS0KICUgVGFySW5mbyBPYmplY3RzCiAlLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NCw4ICszODEsOCBAQAogICAgIENyZWF0ZSBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QuCiBcZW5ke2NsYXNzZGVzY30KIAotXGJlZ2lue21ldGhvZGRlc2N9e2Zyb21idWZ9e30KLSAgICBDcmVhdGUgYW5kIHJldHVybiBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QgZnJvbSBhIHN0cmluZyBidWZmZXIuCitcYmVnaW57bWV0aG9kZGVzY317ZnJvbWJ1Zn17YnVmfQorICAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgXGNsYXNze1RhckluZm99IG9iamVjdCBmcm9tIHN0cmluZyBidWZmZXIgXHZhcntidWZ9LgogICAgIFx2ZXJzaW9uYWRkZWRbUmFpc2VzIFxleGNlcHRpb257SGVhZGVyRXJyb3J9IGlmIHRoZSBidWZmZXIgaXMKICAgICBpbnZhbGlkLl17Mi42fQogXGVuZHttZXRob2RkZXNjfQpAQCAtMzk2LDEwICszOTMsMTEgQEAKICAgICBcdmVyc2lvbmFkZGVkezIuNn0KIFxlbmR7bWV0aG9kZGVzY30KIAotXGJlZ2lue21ldGhvZGRlc2N9e3RvYnVmfXtcb3B0aW9uYWx7Zm9ybWF0fX0KLSAgICBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0LiAgU2VlCi0gICAgXGNsYXNze1RhckZpbGV9J3MgXG1lbWJlcntmb3JtYXR9IGFyZ3VtZW50IGZvciBpbmZvcm1hdGlvbi4KLSAgICBcdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7Zm9ybWF0fSBwYXJhbWV0ZXJdezIuNn0KK1xiZWdpbnttZXRob2RkZXNjfXt0b2J1Zn17XG9wdGlvbmFse2Zvcm1hdFxvcHRpb25hbHssIGVuY29kaW5nCisgICAgICAgIFxvcHRpb25hbHssIGVycm9yc319fX0KKyAgICBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0LiBGb3IgaW5mb3JtYXRpb24KKyAgICBvbiB0aGUgYXJndW1lbnRzIHNlZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFxjbGFzc3tUYXJGaWxlfSBjbGFzcy4KKyAgICBcdmVyc2lvbmNoYW5nZWRbVGhlIGFyZ3VtZW50cyB3ZXJlIGFkZGVkXXsyLjZ9CiBcZW5ke21ldGhvZGRlc2N9CiAKIEEgXGNvZGV7VGFySW5mb30gb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHB1YmxpYyBkYXRhIGF0dHJpYnV0ZXM6CkBAIC00NTIsNiArNDUwLDEyIEBACiAgICAgR3JvdXAgbmFtZS4KIFxlbmR7bWVtYmVyZGVzY30KIAorXGJlZ2lue21lbWJlcmRlc2N9e3BheF9oZWFkZXJzfQorICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBvZiBhbiBhc3NvY2lhdGVkIHBheAorICAgIGV4dGVuZGVkIGhlYWRlci4KKyAgICBcdmVyc2lvbmFkZGVkezIuNn0KK1xlbmR7bWVtYmVyZGVzY30KKwogQSBcY2xhc3N7VGFySW5mb30gb2JqZWN0IGFsc28gcHJvdmlkZXMgc29tZSBjb252ZW5pZW50IHF1ZXJ5IG1ldGhvZHM6CiAKIFxiZWdpbnttZXRob2RkZXNjfXtpc2ZpbGV9e30KQEAgLTU1NCwzICs1NTgsMTAzIEBACiAgICAgdGFyLmV4dHJhY3QodGFyaW5mbykKIHRhci5jbG9zZSgpCiBcZW5ke3ZlcmJhdGltfQorCislLS0tLS0tLS0tLS0tCislIFRhciBmb3JtYXQKKyUtLS0tLS0tLS0tLS0KKworXHN1YnNlY3Rpb257U3VwcG9ydGVkIHRhciBmb3JtYXRzIFxsYWJlbHt0YXItZm9ybWF0c319CisKK1RoZXJlIGFyZSB0aHJlZSB0YXIgZm9ybWF0cyB0aGF0IGNhbiBiZSBjcmVhdGVkIHdpdGggdGhlIFxtb2R1bGV7dGFyZmlsZX0KK21vZHVsZToKKworXGJlZ2lue2l0ZW1pemV9CisKK1xpdGVtCitUaGUgXFBPU0lYe30uMS0xOTg4IHVzdGFyIGZvcm1hdCAoXGNvbnN0YW50e1VTVEFSX0ZPUk1BVH0pLiBJdCBzdXBwb3J0cworZmlsZW5hbWVzIHVwIHRvIGEgbGVuZ3RoIG9mIGF0IGJlc3QgMjU2IGNoYXJhY3RlcnMgYW5kIGxpbmtuYW1lcyB1cCB0byAxMDAKK2NoYXJhY3RlcnMuIFRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBpcyA4IGdpZ2FieXRlcy4gVGhpcyBpcyBhbiBvbGQgYW5kIGxpbWl0ZWQKK2J1dCB3aWRlbHkgc3VwcG9ydGVkIGZvcm1hdC4KKworXGl0ZW0KK1RoZSBHTlUgdGFyIGZvcm1hdCAoXGNvbnN0YW50e0dOVV9GT1JNQVR9KS4gSXQgc3VwcG9ydHMgbG9uZyBmaWxlbmFtZXMgYW5kCitsaW5rbmFtZXMsIGZpbGVzIGJpZ2dlciB0aGFuIDggZ2lnYWJ5dGVzIGFuZCBzcGFyc2UgZmlsZXMuIEl0IGlzIHRoZSBkZSBmYWN0bworc3RhbmRhcmQgb24gR05VL0xpbnV4IHN5c3RlbXMuIFxtb2R1bGV7dGFyZmlsZX0gZnVsbHkgc3VwcG9ydHMgdGhlIEdOVSB0YXIKK2V4dGVuc2lvbnMgZm9yIGxvbmcgbmFtZXMsIHNwYXJzZSBmaWxlIHN1cHBvcnQgaXMgcmVhZC1vbmx5LgorCitcaXRlbQorVGhlIFxQT1NJWHt9LjEtMjAwMSBwYXggZm9ybWF0IChcY29uc3RhbnR7UEFYX0ZPUk1BVH0pLiBJdCBpcyB0aGUgbW9zdAorZmxleGlibGUgZm9ybWF0IHdpdGggdmlydHVhbGx5IG5vIGxpbWl0cy4gSXQgc3VwcG9ydHMgbG9uZyBmaWxlbmFtZXMgYW5kCitsaW5rbmFtZXMsIGxhcmdlIGZpbGVzIGFuZCBzdG9yZXMgcGF0aG5hbWVzIGluIGEgcG9ydGFibGUgd2F5LiBIb3dldmVyLCBub3QKK2FsbCB0YXIgaW1wbGVtZW50YXRpb25zIHRvZGF5IGFyZSBhYmxlIHRvIGhhbmRsZSBwYXggYXJjaGl2ZXMgcHJvcGVybHkuCisKK1RoZSBcZW1waHtwYXh9IGZvcm1hdCBpcyBhbiBleHRlbnNpb24gdG8gdGhlIGV4aXN0aW5nIFxlbXBoe3VzdGFyfSBmb3JtYXQuIEl0Cit1c2VzIGV4dHJhIGhlYWRlcnMgZm9yIGluZm9ybWF0aW9uIHRoYXQgY2Fubm90IGJlIHN0b3JlZCBvdGhlcndpc2UuIFRoZXJlIGFyZQordHdvIGZsYXZvdXJzIG9mIHBheCBoZWFkZXJzOiBFeHRlbmRlZCBoZWFkZXJzIG9ubHkgYWZmZWN0IHRoZSBzdWJzZXF1ZW50IGZpbGUKK2hlYWRlciwgZ2xvYmFsIGhlYWRlcnMgYXJlIHZhbGlkIGZvciB0aGUgY29tcGxldGUgYXJjaGl2ZSBhbmQgYWZmZWN0IGFsbAorZm9sbG93aW5nIGZpbGVzLiBBbGwgdGhlIGRhdGEgaW4gYSBwYXggaGVhZGVyIGlzIGVuY29kZWQgaW4gXGVtcGh7VVRGLTh9IGZvcgorcG9ydGFiaWxpdHkgcmVhc29ucy4KKworXGVuZHtpdGVtaXplfQorCitUaGVyZSBhcmUgc29tZSBtb3JlIHZhcmlhbnRzIG9mIHRoZSB0YXIgZm9ybWF0IHdoaWNoIGNhbiBiZSByZWFkLCBidXQgbm90CitjcmVhdGVkOgorCitcYmVnaW57aXRlbWl6ZX0KKworXGl0ZW0KK1RoZSBhbmNpZW50IFY3IGZvcm1hdC4gVGhpcyBpcyB0aGUgZmlyc3QgdGFyIGZvcm1hdCBmcm9tIFxVTklYe30gU2V2ZW50aAorRWRpdGlvbiwgc3RvcmluZyBvbmx5IHJlZ3VsYXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBOYW1lcyBtdXN0IG5vdCBiZSBsb25nZXIKK3RoYW4gMTAwIGNoYXJhY3RlcnMsIHRoZXJlIGlzIG5vIHVzZXIvZ3JvdXAgbmFtZSBpbmZvcm1hdGlvbi4gU29tZSBhcmNoaXZlcworaGF2ZSBtaXNjYWxjdWxhdGVkIGhlYWRlciBjaGVja3N1bXMgaW4gY2FzZSBvZiBmaWVsZHMgd2l0aCBub24tXEFTQ0lJe30KK2NoYXJhY3RlcnMuCisKK1xpdGVtCitUaGUgU3VuT1MgdGFyIGV4dGVuZGVkIGZvcm1hdC4gVGhpcyBmb3JtYXQgaXMgYSB2YXJpYW50IG9mIHRoZSBcUE9TSVh7fS4xLTIwMDEKK3BheCBmb3JtYXQsIGJ1dCBpcyBub3QgY29tcGF0aWJsZS4KKworXGVuZHtpdGVtaXplfQorCislLS0tLS0tLS0tLS0tLS0tLQorJSBVbmljb2RlIGlzc3VlcworJS0tLS0tLS0tLS0tLS0tLS0KKworXHN1YnNlY3Rpb257VW5pY29kZSBpc3N1ZXMgXGxhYmVse3Rhci11bmljb2RlfX0KKworVGhlIHRhciBmb3JtYXQgd2FzIG9yaWdpbmFsbHkgY29uY2VpdmVkIHRvIG1ha2UgYmFja3VwcyBvbiB0YXBlIGRyaXZlcyB3aXRoIHRoZQorbWFpbiBmb2N1cyBvbiBwcmVzZXJ2aW5nIGZpbGUgc3lzdGVtIGluZm9ybWF0aW9uLiBOb3dhZGF5cyB0YXIgYXJjaGl2ZXMgYXJlCitjb21tb25seSB1c2VkIGZvciBmaWxlIGRpc3RyaWJ1dGlvbiBhbmQgZXhjaGFuZ2luZyBhcmNoaXZlcyBvdmVyIG5ldHdvcmtzLiBPbmUKK3Byb2JsZW0gb2YgdGhlIG9yaWdpbmFsIGZvcm1hdCAodGhhdCBhbGwgb3RoZXIgZm9ybWF0cyBhcmUgbWVyZWx5IHZhcmlhbnRzIG9mKQoraXMgdGhhdCB0aGVyZSBpcyBubyBjb25jZXB0IG9mIHN1cHBvcnRpbmcgZGlmZmVyZW50IGNoYXJhY3RlciBlbmNvZGluZ3MuCitGb3IgZXhhbXBsZSwgYW4gb3JkaW5hcnkgdGFyIGFyY2hpdmUgY3JlYXRlZCBvbiBhIFxlbXBoe1VURi04fSBzeXN0ZW0gY2Fubm90IGJlCityZWFkIGNvcnJlY3RseSBvbiBhIFxlbXBoe0xhdGluLTF9IHN5c3RlbSBpZiBpdCBjb250YWlucyBub24tXEFTQ0lJe30KK2NoYXJhY3RlcnMuIE5hbWVzIChpLmUuIGZpbGVuYW1lcywgbGlua25hbWVzLCB1c2VyL2dyb3VwIG5hbWVzKSBjb250YWluaW5nCit0aGVzZSBjaGFyYWN0ZXJzIHdpbGwgYXBwZWFyIGRhbWFnZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8KK2F1dG9kZXRlY3QgdGhlIGVuY29kaW5nIG9mIGFuIGFyY2hpdmUuCisKK1RoZSBwYXggZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0uIEl0IHN0b3JlcyBub24tXEFTQ0lJe30gbmFtZXMKK3VzaW5nIHRoZSB1bml2ZXJzYWwgY2hhcmFjdGVyIGVuY29kaW5nIFxlbXBoe1VURi04fS4gV2hlbiBhIHBheCBhcmNoaXZlIGlzCityZWFkLCB0aGVzZSBcZW1waHtVVEYtOH0gbmFtZXMgYXJlIGNvbnZlcnRlZCB0byB0aGUgZW5jb2Rpbmcgb2YgdGhlIGxvY2FsCitmaWxlIHN5c3RlbS4KKworVGhlIGRldGFpbHMgb2YgdW5pY29kZSBjb252ZXJzaW9uIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBcdmFye2VuY29kaW5nfSBhbmQKK1x2YXJ7ZXJyb3JzfSBrZXl3b3JkIGFyZ3VtZW50cyBvZiB0aGUgXGNsYXNze1RhckZpbGV9IGNsYXNzLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgXHZhcntlbmNvZGluZ30gaXMgdGhlIGxvY2FsIGNoYXJhY3RlciBlbmNvZGluZy4gSXQgaXMKK2RlZHVjZWQgZnJvbSBcZnVuY3Rpb257c3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpfSBhbmQKK1xmdW5jdGlvbntzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCl9LiBJbiByZWFkIG1vZGUsIFx2YXJ7ZW5jb2Rpbmd9IGlzIHVzZWQKK2V4Y2x1c2l2ZWx5IHRvIGNvbnZlcnQgdW5pY29kZSBuYW1lcyBmcm9tIGEgcGF4IGFyY2hpdmUgdG8gc3RyaW5ncyBpbiB0aGUgbG9jYWwKK2NoYXJhY3RlciBlbmNvZGluZy4gSW4gd3JpdGUgbW9kZSwgdGhlIHVzZSBvZiBcdmFye2VuY29kaW5nfSBkZXBlbmRzIG9uIHRoZQorY2hvc2VuIGFyY2hpdmUgZm9ybWF0LiBJbiBjYXNlIG9mIFxjb25zdGFudHtQQVhfRk9STUFUfSwgaW5wdXQgbmFtZXMgdGhhdAorY29udGFpbiBub24tXEFTQ0lJe30gY2hhcmFjdGVycyBuZWVkIHRvIGJlIGRlY29kZWQgYmVmb3JlIGJlaW5nIHN0b3JlZCBhcworXGVtcGh7VVRGLTh9IHN0cmluZ3MuIFRoZSBvdGhlciBmb3JtYXRzIGRvIG5vdCBtYWtlIHVzZSBvZiBcdmFye2VuY29kaW5nfQordW5sZXNzIHVuaWNvZGUgb2JqZWN0cyBhcmUgdXNlZCBhcyBpbnB1dCBuYW1lcy4gVGhlc2UgYXJlIGNvbnZlcnRlZCB0bworOC1iaXQgY2hhcmFjdGVyIHN0cmluZ3MgYmVmb3JlIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgorCitUaGUgXHZhcntlcnJvcnN9IGFyZ3VtZW50IGRlZmluZXMgaG93IGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgdGhhdCBjYW5ub3QgYmUKK2NvbnZlcnRlZCB0byBvciBmcm9tIFx2YXJ7ZW5jb2Rpbmd9LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGxpc3RlZCBpbiBzZWN0aW9uCitccmVme2NvZGVjLWJhc2UtY2xhc3Nlc30uIEluIHJlYWQgbW9kZSwgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBzY2hlbWUKK1xjb2Rleyd1dGYtOCd9IHdoaWNoIG1lYW5zIHRoYXQgYmFkIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IHRoZWlyCitcZW1waHtVVEYtOH0gcmVwcmVzZW50YXRpb24uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc2NoZW1lLiBJbiB3cml0ZSBtb2RlIHRoZQorZGVmYXVsdCB2YWx1ZSBmb3IgXHZhcntlcnJvcnN9IGlzIFxjb2RleydzdHJpY3QnfSB0byBlbnN1cmUgdGhhdCBuYW1lCitpbmZvcm1hdGlvbiBpcyBub3QgYWx0ZXJlZCB1bm5vdGljZWQuCmRpZmYgLS1naXQgYS9MaWIvdGFyZmlsZS5weSBiL0xpYi90YXJmaWxlLnB5CmluZGV4IDRmNGExZDkuLjEwNzA0MWUgMTAwNjQ0Ci0tLSBhL0xpYi90YXJmaWxlLnB5CisrKyBiL0xpYi90YXJmaWxlLnB5CkBAIC0xMjUsNiArMTI1LDE3IEBACiBQQVhfRklFTERTID0gKCJwYXRoIiwgImxpbmtwYXRoIiwgInNpemUiLCAibXRpbWUiLAogICAgICAgICAgICAgICAidWlkIiwgImdpZCIsICJ1bmFtZSIsICJnbmFtZSIpCiAKKyMgRmllbGRzIGluIGEgcGF4IGhlYWRlciB0aGF0IGFyZSBudW1iZXJzLCBhbGwgb3RoZXIgZmllbGRzCisjIGFyZSB0cmVhdGVkIGFzIHN0cmluZ3MuCitQQVhfTlVNQkVSX0ZJRUxEUyA9IHsKKyAgICAiYXRpbWUiOiBmbG9hdCwKKyAgICAiY3RpbWUiOiBmbG9hdCwKKyAgICAibXRpbWUiOiBmbG9hdCwKKyAgICAidWlkIjogaW50LAorICAgICJnaWQiOiBpbnQsCisgICAgInNpemUiOiBpbnQKK30KKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBCaXRzIHVzZWQgaW4gdGhlIG1vZGUgZmllbGQsIHZhbHVlcyBpbiBvY3RhbC4KICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1NCw3ICsxNjUsNyBAQAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKIGlmIEVOQ09ESU5HIGlzIE5vbmU6Ci0gICAgRU5DT0RJTkcgPSAiYXNjaWkiCisgICAgRU5DT0RJTkcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKQEAgLTIxOCw2ICsyMjksMjYgQEAKICAgICAgICAgcyA9IGNocigwMjAwKSArIHMKICAgICByZXR1cm4gcwogCitkZWYgdXRzKHMsIGVuY29kaW5nLCBlcnJvcnMpOgorICAgICIiIkNvbnZlcnQgYSB1bmljb2RlIG9iamVjdCB0byBhIHN0cmluZy4KKyAgICAiIiIKKyAgICBpZiBlcnJvcnMgPT0gInV0Zi04IjoKKyAgICAgICAgIyBBbiBleHRyYSBlcnJvciBoYW5kbGVyIHNpbWlsYXIgdG8gdGhlIC1vIGludmFsaWQ9VVRGLTggb3B0aW9uCisgICAgICAgICMgaW4gUE9TSVguMS0yMDAxLiBSZXBsYWNlIHVudHJhbnNsYXRhYmxlIGNoYXJhY3RlcnMgd2l0aCB0aGVpcgorICAgICAgICAjIFVURi04IHJlcHJlc2VudGF0aW9uLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gcy5lbmNvZGUoZW5jb2RpbmcsICJzdHJpY3QiKQorICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgeCA9IFtdCisgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeC5hcHBlbmQoYy5lbmNvZGUoZW5jb2RpbmcsICJzdHJpY3QiKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB4LmFwcGVuZChjLmVuY29kZSgidXRmOCIpKQorICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oeCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcy5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKKwogZGVmIGNhbGNfY2hrc3VtcyhidWYpOgogICAgICIiIkNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIGEgbWVtYmVyJ3MgaGVhZGVyIGJ5IHN1bW1pbmcgdXAgYWxsCiAgICAgICAgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBjaGtzdW0gZmllbGQgd2hpY2ggaXMgdHJlYXRlZCBhcyBpZgpAQCAtOTIyLDcgKzk1Myw3IEBACiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCiAKLSAgICBkZWYgZ2V0X2luZm8oc2VsZik6CisgICAgZGVmIGdldF9pbmZvKHNlbGYsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIFRhckluZm8ncyBhdHRyaWJ1dGVzIGFzIGEgZGljdGlvbmFyeS4KICAgICAgICAgIiIiCiAgICAgICAgIGluZm8gPSB7CkBAIC05NDQsMjQgKzk3NSwyOSBAQAogICAgICAgICBpZiBpbmZvWyJ0eXBlIl0gPT0gRElSVFlQRSBhbmQgbm90IGluZm9bIm5hbWUiXS5lbmRzd2l0aCgiLyIpOgogICAgICAgICAgICAgaW5mb1sibmFtZSJdICs9ICIvIgogCisgICAgICAgIGZvciBrZXkgaW4gKCJuYW1lIiwgImxpbmtuYW1lIiwgInVuYW1lIiwgImduYW1lIik6CisgICAgICAgICAgICBpZiB0eXBlKGluZm9ba2V5XSkgaXMgdW5pY29kZToKKyAgICAgICAgICAgICAgICBpbmZvW2tleV0gPSBpbmZvW2tleV0uZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpCisKICAgICAgICAgcmV0dXJuIGluZm8KIAotICAgIGRlZiB0b2J1ZihzZWxmLCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQsIGVuY29kaW5nPUVOQ09ESU5HKToKKyAgICBkZWYgdG9idWYoc2VsZiwgZm9ybWF0PURFRkFVTFRfRk9STUFULCBlbmNvZGluZz1FTkNPRElORywgZXJyb3JzPSJzdHJpY3QiKToKICAgICAgICAgIiIiUmV0dXJuIGEgdGFyIGhlYWRlciBhcyBhIHN0cmluZyBvZiA1MTIgYnl0ZSBibG9ja3MuCiAgICAgICAgICIiIgorICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbyhlbmNvZGluZywgZXJyb3JzKQorCiAgICAgICAgIGlmIGZvcm1hdCA9PSBVU1RBUl9GT1JNQVQ6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfdXN0YXJfaGVhZGVyKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoaW5mbykKICAgICAgICAgZWxpZiBmb3JtYXQgPT0gR05VX0ZPUk1BVDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9nbnVfaGVhZGVyKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9nbnVfaGVhZGVyKGluZm8pCiAgICAgICAgIGVsaWYgZm9ybWF0ID09IFBBWF9GT1JNQVQ6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfcGF4X2hlYWRlcihlbmNvZGluZykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9wYXhfaGVhZGVyKGluZm8sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGZvcm1hdCIpCiAKLSAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmKToKKyAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmLCBpbmZvKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suCiAgICAgICAgICIiIgotICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCiAgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwogCiAgICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgpAQCAtOTcyLDEwICsxMDA4LDkgQEAKIAogICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQpCiAKLSAgICBkZWYgY3JlYXRlX2dudV9oZWFkZXIoc2VsZik6CisgICAgZGVmIGNyZWF0ZV9nbnVfaGVhZGVyKHNlbGYsIGluZm8pOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIEdOVSBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCiAgICAgICAgICIiIgotICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCiAgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKIAogICAgICAgICBidWYgPSAiIgpAQCAtOTg3LDEyICsxMDIyLDExIEBACiAKICAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgR05VX0ZPUk1BVCkKIAotICAgIGRlZiBjcmVhdGVfcGF4X2hlYWRlcihzZWxmLCBlbmNvZGluZyk6CisgICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4gSWYgaXQgY2Fubm90IGJlCiAgICAgICAgICAgIHJlcHJlc2VudGVkIHRoaXMgd2F5LCBwcmVwZW5kIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBzZXF1ZW5jZQogICAgICAgICAgICB3aXRoIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24uCiAgICAgICAgICIiIgotICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCiAgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwogICAgICAgICBwYXhfaGVhZGVycyA9IHNlbGYucGF4X2hlYWRlcnMuY29weSgpCiAKQEAgLTEwMDIsNyArMTAzNiwxMSBAQAogICAgICAgICAgICAgICAgICgibmFtZSIsICJwYXRoIiwgTEVOR1RIX05BTUUpLCAoImxpbmtuYW1lIiwgImxpbmtwYXRoIiwgTEVOR1RIX0xJTkspLAogICAgICAgICAgICAgICAgICgidW5hbWUiLCAidW5hbWUiLCAzMiksICgiZ25hbWUiLCAiZ25hbWUiLCAzMikpOgogCi0gICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIGlmIGhuYW1lIGluIHBheF9oZWFkZXJzOgorICAgICAgICAgICAgICAgICMgVGhlIHBheCBoZWFkZXIgaGFzIHByaW9yaXR5LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0uZGVjb2RlKGVuY29kaW5nLCBlcnJvcnMpCiAKICAgICAgICAgICAgICMgVHJ5IHRvIGVuY29kZSB0aGUgc3RyaW5nIGFzIEFTQ0lJLgogICAgICAgICAgICAgdHJ5OgpAQCAtMTAxMSwyNyArMTA0OSwyMyBAQAogICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgICAgICAgIGlmIGxlbih2YWwpID4gbGVuZ3RoOgotICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gIm5hbWUiOgotICAgICAgICAgICAgICAgICAgICAjIFRyeSB0byBzcXVlZXplIGEgbG9uZ25hbWUgaW4gdGhlIHByZWZpeCBhbmQgbmFtZSBmaWVsZHMgYXMgaW4KLSAgICAgICAgICAgICAgICAgICAgIyB1c3RhciBmb3JtYXQuCi0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9bInByZWZpeCJdLCBpbmZvWyJuYW1lIl0gPSBzZWxmLl9wb3NpeF9zcGxpdF9uYW1lKGluZm9bIm5hbWUiXSkKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCisgICAgICAgICAgICBpZiBsZW4oaW5mb1tuYW1lXSkgPiBsZW5ndGg6CisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCiAKICAgICAgICAgIyBUZXN0IG51bWJlciBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGltaXQgb3IgdmFsdWVzCiAgICAgICAgICMgdGhhdCBsaWtlIHRvIGJlIHN0b3JlZCBhcyBmbG9hdC4KICAgICAgICAgZm9yIG5hbWUsIGRpZ2l0cyBpbiAoKCJ1aWQiLCA4KSwgKCJnaWQiLCA4KSwgKCJzaXplIiwgMTIpLCAoIm10aW1lIiwgMTIpKToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gcGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgIyBUaGUgcGF4IGhlYWRlciBoYXMgcHJpb3JpdHkuIEF2b2lkIG92ZXJmbG93LgorICAgICAgICAgICAgICAgIGluZm9bbmFtZV0gPSAwCisgICAgICAgICAgICAgICAgY29udGludWUKKwogICAgICAgICAgICAgdmFsID0gaW5mb1tuYW1lXQogICAgICAgICAgICAgaWYgbm90IDAgPD0gdmFsIDwgOCAqKiAoZGlnaXRzIC0gMSkgb3IgaXNpbnN0YW5jZSh2YWwsIGZsb2F0KToKICAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tuYW1lXSA9IHVuaWNvZGUodmFsKQogICAgICAgICAgICAgICAgIGluZm9bbmFtZV0gPSAwCiAKKyAgICAgICAgIyBDcmVhdGUgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgaWYgcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICBidWYgPSBzZWxmLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKHBheF9oZWFkZXJzKQogICAgICAgICBlbHNlOgpAQCAtMTA0MCwyNiArMTA3NCwxMCBAQAogICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgY3JlYXRlX3BheF9nbG9iYWxfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMsIGVuY29kaW5nKToKKyAgICBkZWYgY3JlYXRlX3BheF9nbG9iYWxfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgogICAgICAgICAiIiIKLSAgICAgICAgbmV3X2hlYWRlcnMgPSB7fQotICAgICAgICBmb3Iga2V5LCB2YWwgaW4gcGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBrZXkgPSBjbHMuX3RvX3VuaWNvZGUoa2V5LCBlbmNvZGluZykKLSAgICAgICAgICAgIHZhbCA9IGNscy5fdG9fdW5pY29kZSh2YWwsIGVuY29kaW5nKQotICAgICAgICAgICAgbmV3X2hlYWRlcnNba2V5XSA9IHZhbAotICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKG5ld19oZWFkZXJzLCB0eXBlPVhHTFRZUEUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF90b191bmljb2RlKHZhbHVlLCBlbmNvZGluZyk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHVuaWNvZGUpOgotICAgICAgICAgICAgcmV0dXJuIHZhbHVlCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZywgZmxvYXQpKToKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHZhbHVlKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6Ci0gICAgICAgICAgICByZXR1cm4gdW5pY29kZSh2YWx1ZSwgZW5jb2RpbmcpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmFibGUgdG8gY29udmVydCB0byB1bmljb2RlOiAlciIgJSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihwYXhfaGVhZGVycywgdHlwZT1YR0xUWVBFKQogCiAgICAgZGVmIF9wb3NpeF9zcGxpdF9uYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICAiIiJTcGxpdCBhIG5hbWUgbG9uZ2VyIHRoYW4gMTAwIGNoYXJzIGludG8gYSBwcmVmaXgKQEAgLTEwOTEsOSArMTEwOSw5IEBACiAgICAgICAgICAgICAiICAgICAgICAiLCAjIGNoZWNrc3VtIGZpZWxkCiAgICAgICAgICAgICBpbmZvLmdldCgidHlwZSIsIFJFR1RZUEUpLAogICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJsaW5rbmFtZSIsICIiKSwgMTAwKSwKLSAgICAgICAgICAgIHN0bihpbmZvLmdldCgibWFnaWMiLCAiIiksIDgpLAotICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJ1bmFtZSIsICIiKSwgMzIpLAotICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJnbmFtZSIsICIiKSwgMzIpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJtYWdpYyIsIFBPU0lYX01BR0lDKSwgOCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgInJvb3QiKSwgMzIpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJnbmFtZSIsICJyb290IiksIDMyKSwKICAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZGV2bWFqb3IiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZGV2bWlub3IiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgIHN0bihpbmZvLmdldCgicHJlZml4IiwgIiIpLCAxNTUpCkBAIC0xMjU0LDEyICsxMjcyLDkgQEAKICAgICAgICAgICAgIG9mZnNldCArPSBzZWxmLl9ibG9jayhzZWxmLnNpemUpCiAgICAgICAgIHRhcmZpbGUub2Zmc2V0ID0gb2Zmc2V0CiAKLSAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCBzYXZlZCBleHRlbmRlZAorICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGdsb2JhbAogICAgICAgICAjIGhlYWRlciBpbmZvcm1hdGlvbi4KLSAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHRhcmZpbGUucGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9GSUVMRFM6Ci0gICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXl3b3JkLCB2YWx1ZSkKLSAgICAgICAgICAgIHNlbGYucGF4X2hlYWRlcnNba2V5d29yZF0gPSB2YWx1ZQorICAgICAgICBzZWxmLl9hcHBseV9wYXhfaW5mbyh0YXJmaWxlLnBheF9oZWFkZXJzLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKIAogICAgICAgICByZXR1cm4gc2VsZgogCkBAIC0xMjcwLDE4ICsxMjg1LDE3IEBACiAgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCiAKICAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCi0gICAgICAgIGIgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCi0gICAgICAgIHQgPSBzZWxmLmZyb21idWYoYikKLSAgICAgICAgdC5vZmZzZXQgPSBzZWxmLm9mZnNldAotICAgICAgICBuZXh0ID0gdC5fcHJvY19tZW1iZXIodGFyZmlsZSkKKyAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKKyAgICAgICAgaWYgbmV4dCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgSGVhZGVyRXJyb3IoIm1pc3Npbmcgc3Vic2VxdWVudCBoZWFkZXIiKQogCiAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKICAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCiAgICAgICAgIG5leHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKICAgICAgICAgaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6Ci0gICAgICAgICAgICBuZXh0Lm5hbWUgPSBidWYucnN0cmlwKE5VTCkKKyAgICAgICAgICAgIG5leHQubmFtZSA9IG50cyhidWYpCiAgICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6Ci0gICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gYnVmLnJzdHJpcChOVUwpCisgICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gbnRzKGJ1ZikKIAogICAgICAgICByZXR1cm4gbmV4dAogCkBAIC0xMzU2LDIxICsxMzcwLDEwIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMuY29weSgpCiAKLSAgICAgICAgIyBGaWVsZHMgaW4gUE9TSVguMS0yMDAxIHRoYXQgYXJlIG51bWJlcnMsIGFsbCBvdGhlciBmaWVsZHMKLSAgICAgICAgIyBhcmUgdHJlYXRlZCBhcyBVVEYtOCBzdHJpbmdzLgotICAgICAgICB0eXBlX21hcHBpbmcgPSB7Ci0gICAgICAgICAgICAiYXRpbWUiOiAgICAgICAgZmxvYXQsCi0gICAgICAgICAgICAiY3RpbWUiOiAgICAgICAgZmxvYXQsCi0gICAgICAgICAgICAibXRpbWUiOiAgICAgICAgZmxvYXQsCi0gICAgICAgICAgICAidWlkIjogICAgICAgICAgaW50LAotICAgICAgICAgICAgImdpZCI6ICAgICAgICAgIGludCwKLSAgICAgICAgICAgICJzaXplIjogICAgICAgICBpbnQKLSAgICAgICAgfQotCiAgICAgICAgICMgUGFyc2UgcGF4IGhlYWRlciBpbmZvcm1hdGlvbi4gQSByZWNvcmQgbG9va3MgbGlrZSB0aGF0OgogICAgICAgICAjICIlZCAlcz0lc1xuIiAlIChsZW5ndGgsIGtleXdvcmQsIHZhbHVlKS4gbGVuZ3RoIGlzIHRoZSBzaXplCiAgICAgICAgICMgb2YgdGhlIGNvbXBsZXRlIHJlY29yZCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgYW5kCi0gICAgICAgICMgdGhlIG5ld2xpbmUuCisgICAgICAgICMgdGhlIG5ld2xpbmUuIGtleXdvcmQgYW5kIHZhbHVlIGFyZSBib3RoIFVURi04IGVuY29kZWQgc3RyaW5ncy4KICAgICAgICAgcmVnZXggPSByZS5jb21waWxlKHIiKFxkKykgKFtePV0rKT0iLCByZS5VKQogICAgICAgICBwb3MgPSAwCiAgICAgICAgIHdoaWxlIFRydWU6CkBAIC0xMzgzLDM1ICsxMzg2LDU1IEBACiAgICAgICAgICAgICB2YWx1ZSA9IGJ1ZlttYXRjaC5lbmQoMikgKyAxOm1hdGNoLnN0YXJ0KDEpICsgbGVuZ3RoIC0gMV0KIAogICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZGVjb2RlKCJ1dGY4IikKLSAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmVuY29kZSh0YXJmaWxlLmVuY29kaW5nKQotCiAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmRlY29kZSgidXRmOCIpCi0gICAgICAgICAgICBpZiBrZXl3b3JkIGluIHR5cGVfbWFwcGluZzoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHlwZV9tYXBwaW5nW2tleXdvcmRdKHZhbHVlKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDAKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUodGFyZmlsZS5lbmNvZGluZykKIAogICAgICAgICAgICAgcGF4X2hlYWRlcnNba2V5d29yZF0gPSB2YWx1ZQogICAgICAgICAgICAgcG9zICs9IGxlbmd0aAogCi0gICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyIHRoYXQgd2lsbCBiZSBwYXRjaGVkIHdpdGggdGhlCi0gICAgICAgICMgc3VwcGxlbWVudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXggaGVhZGVyIChleHRlbmRlZAotICAgICAgICAjIG9ubHkpLgotICAgICAgICB0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQorICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlci4KKyAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKIAotICAgICAgICBpZiBzZWxmLnR5cGUgIT0gWEdMVFlQRSBhbmQgdCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKLSAgICAgICAgICAgICMgdGhlIHBheCBoZWFkZXIncyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgotICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKLSAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih0LCBrZXl3b3JkLCB2YWx1ZSkKLSAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCi0gICAgICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMuY29weSgpCisgICAgICAgIGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgU09MQVJJU19YSERUWVBFKToKKyAgICAgICAgICAgIGlmIG5leHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBIZWFkZXJFcnJvcigibWlzc2luZyBzdWJzZXF1ZW50IGhlYWRlciIpCiAKLSAgICAgICAgcmV0dXJuIHQKKyAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggdGhlIGV4dGVuZGVkIGhlYWRlciBpbmZvLgorICAgICAgICAgICAgbmV4dC5fYXBwbHlfcGF4X2luZm8ocGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQorICAgICAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAorCisgICAgICAgICAgICBpZiBwYXhfaGVhZGVycy5oYXNfa2V5KCJzaXplIik6CisgICAgICAgICAgICAgICAgIyBJZiB0aGUgZXh0ZW5kZWQgaGVhZGVyIHJlcGxhY2VzIHRoZSBzaXplIGZpZWxkLAorICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgIyBoZWFkZXIgc3RhcnRzLgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG5leHQub2Zmc2V0X2RhdGEKKyAgICAgICAgICAgICAgICBpZiBuZXh0LmlzcmVnKCkgb3IgbmV4dC50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBuZXh0Ll9ibG9jayhuZXh0LnNpemUpCisgICAgICAgICAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKKworICAgICAgICByZXR1cm4gbmV4dAorCisgICAgZGVmIF9hcHBseV9wYXhfaW5mbyhzZWxmLCBwYXhfaGVhZGVycywgZW5jb2RpbmcsIGVycm9ycyk6CisgICAgICAgICIiIlJlcGxhY2UgZmllbGRzIHdpdGggc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIGZyb20gYSBwcmV2aW91cworICAgICAgICAgICBwYXggZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleXdvcmQgbm90IGluIFBBWF9GSUVMRFM6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYga2V5d29yZCA9PSAicGF0aCI6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yc3RyaXAoIi8iKQorCisgICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9OVU1CRVJfRklFTERTOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQQVhfTlVNQkVSX0ZJRUxEU1trZXl3b3JkXSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdXRzKHZhbHVlLCBlbmNvZGluZywgZXJyb3JzKQorCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQorCisgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycy5jb3B5KCkKIAogICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgogICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCkBAIC0xNDYyLDggKzE0ODUsOSBAQAogCiAgICAgZm9ybWF0ID0gREVGQVVMVF9GT1JNQVQgICAgICMgVGhlIGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyBhbiBhcmNoaXZlLgogCi0gICAgZW5jb2RpbmcgPSBFTkNPRElORyAgICAgICAgICMgVHJhbnNmZXIgVVRGLTggc3RyaW5ncyBmcm9tIFBPU0lYLjEtMjAwMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhlYWRlcnMgdG8gdGhpcyBlbmNvZGluZy4KKyAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBFbmNvZGluZyBmb3IgOC1iaXQgY2hhcmFjdGVyIHN0cmluZ3MuCisKKyAgICBlcnJvcnMgPSBOb25lICAgICAgICAgICAgICAgIyBFcnJvciBoYW5kbGVyIGZvciB1bmljb2RlIGNvbnZlcnNpb24uCiAKICAgICB0YXJpbmZvID0gVGFySW5mbyAgICAgICAgICAgIyBUaGUgZGVmYXVsdCBUYXJJbmZvIGNsYXNzIHRvIHVzZS4KIApAQCAtMTQ3MSw3ICsxNDk1LDcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGZvcm1hdD1Ob25lLAogICAgICAgICAgICAgdGFyaW5mbz1Ob25lLCBkZXJlZmVyZW5jZT1Ob25lLCBpZ25vcmVfemVyb3M9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKLSAgICAgICAgICAgIHBheF9oZWFkZXJzPU5vbmUsIGRlYnVnPU5vbmUsIGVycm9ybGV2ZWw9Tm9uZSk6CisgICAgICAgICAgICBlcnJvcnM9Tm9uZSwgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKICAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKICAgICAgICAgICAgZmlsZSBvciAndycgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBgbW9kZScKQEAgLTE1MTIsNiArMTUzNiwxOSBAQAogICAgICAgICAgICAgc2VsZi5pZ25vcmVfemVyb3MgPSBpZ25vcmVfemVyb3MKICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworICAgICAgICBpZiBlcnJvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBlbGlmIG1vZGUgPT0gInIiOgorICAgICAgICAgICAgc2VsZi5lcnJvcnMgPSAidXRmLTgiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVycm9ycyA9ICJzdHJpY3QiCisKKyAgICAgICAgaWYgcGF4X2hlYWRlcnMgaXMgbm90IE5vbmUgYW5kIHNlbGYuZm9ybWF0ID09IFBBWF9GT1JNQVQ6CisgICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSB7fQorCiAgICAgICAgIGlmIGRlYnVnIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IGRlYnVnCiAgICAgICAgIGlmIGVycm9ybGV2ZWwgaXMgbm90IE5vbmU6CkBAIC0xNTI0LDcgKzE1NjEsNiBAQAogICAgICAgICBzZWxmLm9mZnNldCA9IDBMICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQogICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKLSAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBzYXZlIGNvbnRlbnRzIG9mIGdsb2JhbCBwYXggaGVhZGVycwogCiAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQpAQCAtMTU0Myw5ICsxNTc5LDggQEAKICAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCiAKLSAgICAgICAgICAgIGlmIHBheF9oZWFkZXJzOgotICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYudGFyaW5mby5jcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXhfaGVhZGVycy5jb3B5KCksIHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICBpZiBzZWxmLnBheF9oZWFkZXJzOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYudGFyaW5mby5jcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoc2VsZi5wYXhfaGVhZGVycy5jb3B5KCkpCiAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oYnVmKQogCkBAIC0xODE3LDggKzE4NTIsNiBAQAogICAgICAgICAgICAgICAgICAgICBzZWxmLmlub2Rlc1tpbm9kZV0gPSBhcmNuYW1lCiAgICAgICAgIGVsaWYgc3RhdC5TX0lTRElSKHN0bWQpOgogICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKLSAgICAgICAgICAgIGlmIGFyY25hbWVbLTE6XSAhPSAiLyI6Ci0gICAgICAgICAgICAgICAgYXJjbmFtZSArPSAiLyIKICAgICAgICAgZWxpZiBzdGF0LlNfSVNGSUZPKHN0bWQpOgogICAgICAgICAgICAgdHlwZSA9IEZJRk9UWVBFCiAgICAgICAgIGVsaWYgc3RhdC5TX0lTTE5LKHN0bWQpOgpAQCAtMTk1Miw3ICsxOTg1LDcgQEAKIAogICAgICAgICB0YXJpbmZvID0gY29weS5jb3B5KHRhcmluZm8pCiAKLSAgICAgICAgYnVmID0gdGFyaW5mby50b2J1ZihzZWxmLmZvcm1hdCwgc2VsZi5lbmNvZGluZykKKyAgICAgICAgYnVmID0gdGFyaW5mby50b2J1ZihzZWxmLmZvcm1hdCwgc2VsZi5lbmNvZGluZywgc2VsZi5lcnJvcnMpCiAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCBmMGZiNmIxLi4wNGY5YmE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBlbmNvZGluZzogaXNvODg1OS0xCisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTE1IC0qLQogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKQEAgLTM3Miw5ICszNzIsOSBAQAogCiAgICAgZGVmIHRlc3RfcmVhZF9sb25nbmFtZShzZWxmKToKICAgICAgICAgIyBUZXN0IHJlYWRpbmcgb2YgbG9uZ25hbWUgKGJ1ZyAjMTQ3MTQyNykuCi0gICAgICAgIG5hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKKyAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihuYW1lKQorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbmFtZSkKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJsb25nbmFtZSBub3QgZm91bmQiKQogICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlICE9IHRhcmZpbGUuRElSVFlQRSwgInJlYWQgbG9uZ25hbWUgYXMgZGlydHlwZSIpCkBAIC0zOTMsMTMgKzM5MywyNCBAQAogICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQogICAgICAgICBvZmZzZXQgPSB0YXJpbmZvLm9mZnNldAogICAgICAgICBzZWxmLnRhci5maWxlb2JqLnNlZWsob2Zmc2V0KQotICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oc2VsZi50YXIuZmlsZW9iai5yZWFkKDE1MzYpKQorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oc2VsZi50YXIuZmlsZW9iai5yZWFkKDMgKiA1MTIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBuYW1lPSJmb28udGFyIiwgZmlsZW9iaj1mb2JqKQogCisgICAgZGVmIHRlc3RfaGVhZGVyX29mZnNldChzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIFRhckluZm8gb2JqZWN0IGluY2x1ZGVzCisgICAgICAgICMgdGhlIHByZWNlZGluZyBleHRlbmRlZCBoZWFkZXIuCisgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIG9mZnNldCA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbmFtZSkub2Zmc2V0CisgICAgICAgIGZvYmogPSBvcGVuKHRhcm5hbWUpCisgICAgICAgIGZvYmouc2VlayhvZmZzZXQpCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8uZnJvbWJ1Zihmb2JqLnJlYWQoNTEyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnR5cGUsIHNlbGYubG9uZ25hbWV0eXBlKQorCiAKIGNsYXNzIEdOVVJlYWRUZXN0KExvbmduYW1lVGVzdCk6CiAKICAgICBzdWJkaXIgPSAiZ251IgorICAgIGxvbmduYW1ldHlwZSA9IHRhcmZpbGUuR05VVFlQRV9MT05HTkFNRQogCiAgICAgZGVmIHRlc3Rfc3BhcnNlX2ZpbGUoc2VsZik6CiAgICAgICAgIHRhcmluZm8xID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zcGFyc2UiKQpAQCAtNDEwLDI2ICs0MjEsNDAgQEAKICAgICAgICAgICAgICAgICAic3BhcnNlIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQogCiAKLWNsYXNzIFBheFJlYWRUZXN0KFJlYWRUZXN0KToKK2NsYXNzIFBheFJlYWRUZXN0KExvbmduYW1lVGVzdCk6CiAKICAgICBzdWJkaXIgPSAicGF4IgorICAgIGxvbmduYW1ldHlwZSA9IHRhcmZpbGUuWEhEVFlQRQogCi0gICAgZGVmIHRlc3RfcGF4X2dsb2JoZWFkZXJzKHNlbGYpOgorICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVycyhzZWxmKToKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorCiAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTEiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCAixNbc5Pb83yIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpCiAKICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgIiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksICLE1tzk9vzfIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgdSLE1tzk9vzfIikKIAogICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGUzIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVuYW1lLCAidGFyZmlsZSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgInRhcmZpbGUiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCAixNbc5Pb83yIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpCisKKyAgICBkZWYgdGVzdF9wYXhfbnVtYmVyX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgIyBBbGwgZm9sbG93aW5nIG51bWJlciBmaWVsZHMgYXJlIHJlYWQgZnJvbSB0aGUgcGF4IGhlYWRlci4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGU0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDcwMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmdpZCwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubXRpbWUsIDEwNDE4MDg3ODMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHRhcmluZm8ubXRpbWUpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh0YXJpbmZvLnBheF9oZWFkZXJzWyJhdGltZSJdKSwgMTA0MTgwODc4My4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHRhcmluZm8ucGF4X2hlYWRlcnNbImN0aW1lIl0pLCAxMDQxODA4NzgzLjApCiAKIAogY2xhc3MgV3JpdGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTcwMCw2OCArNzI1LDE2MSBAQAogICAgICAgICAgICAgbiA9IHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZQogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgPT0gbiwgIlBBWCBsb25nbmFtZSBjcmVhdGlvbiBmYWlsZWQiKQogCi0gICAgZGVmIHRlc3RfaXNvODg1OV8xNV9maWxlbmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJpc284ODU5LTE1IikKKyAgICBkZWYgdGVzdF9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmKToKKyAgICAgICAgcGF4X2hlYWRlcnMgPSB7CisgICAgICAgICAgICAgICAgdSJmb28iOiB1ImJhciIsCisgICAgICAgICAgICAgICAgdSJ1aWQiOiB1IjAiLAorICAgICAgICAgICAgICAgIHUibXRpbWUiOiB1IjEuMjMiLAorICAgICAgICAgICAgICAgIHUidGVzdCI6IHUi5Pb8IiwKKyAgICAgICAgICAgICAgICB1IuT2/CI6IHUidGVzdCJ9CisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgXAorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzPXBheF9oZWFkZXJzKQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oInRlc3QiKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICAjIFRlc3QgaWYgdGhlIGdsb2JhbCBoZWFkZXIgd2FzIHdyaXR0ZW4gY29ycmVjdGx5LgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpWzBdLnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykKKworICAgICAgICAjIFRlc3QgaWYgYWxsIHRoZSBmaWVsZHMgYXJlIHVuaWNvZGUuCisgICAgICAgIGZvciBrZXksIHZhbCBpbiB0YXIucGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZShrZXkpIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh2YWwpIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBpZiBrZXkgaW4gdGFyZmlsZS5QQVhfTlVNQkVSX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuUEFYX05VTUJFUl9GSUVMRFNba2V5XSh2YWwpCisgICAgICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuYWJsZSB0byBjb252ZXJ0IHBheCBoZWFkZXIgZmllbGQiKQorCisgICAgZGVmIHRlc3RfcGF4X2V4dGVuZGVkX2hlYWRlcihzZWxmKToKKyAgICAgICAgIyBUaGUgZmllbGRzIGZyb20gdGhlIHBheCBoZWFkZXIgaGF2ZSBwcmlvcml0eSBvdmVyIHRoZQorICAgICAgICAjIFRhckluZm8uCisgICAgICAgIHBheF9oZWFkZXJzID0ge3UicGF0aCI6IHUiZm9vIiwgdSJ1aWQiOiB1IjEyMyJ9CisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oKQorICAgICAgICB0Lm5hbWUgPSB1IuT2/CIgICAgICMgbm9uLUFTQ0lJCisgICAgICAgIHQudWlkID0gOCoqOCAgICAgICAgIyB0b28gbGFyZ2UKKyAgICAgICAgdC5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzCisgICAgICAgIHRhci5hZGRmaWxlKHQpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB0ID0gdGFyLmdldG1lbWJlcnMoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC51aWQsIDEyMykKKworCitjbGFzcyBVc3RhclVuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEFsbCAqVW5pY29kZVRlc3RzIEZJWE1FCisKKyAgICBmb3JtYXQgPSB0YXJmaWxlLlVTVEFSX0ZPUk1BVAorCisgICAgZGVmIHRlc3RfaXNvODg1OV8xX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoImlzbzg4NTktMSIpCisKKyAgICBkZWYgdGVzdF91dGY3X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjciKQogCiAgICAgZGVmIHRlc3RfdXRmOF9maWxlbmFtZShzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGY4IikKIAotICAgIGRlZiB0ZXN0X3V0ZjE2X2ZpbGVuYW1lKHNlbGYpOgotICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjE2IikKLQogICAgIGRlZiBfdGVzdF91bmljb2RlX2ZpbGVuYW1lKHNlbGYsIGVuY29kaW5nKToKLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCkKLSAgICAgICAgbmFtZSA9IHUiXHUyMGFjIi5lbmNvZGUoZW5jb2RpbmcpICMgRXVybyBzaWduCi0gICAgICAgIHRhci5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz0ic3RyaWN0IikKKyAgICAgICAgbmFtZSA9IHUi5Pb8IgogICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8obmFtZSkpCiAgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPWVuY29kaW5nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZSwgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodGFyLmdldG5hbWVzKClbMF0pIGlzIG5vdCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZSwgbmFtZS5lbmNvZGUoZW5jb2RpbmcpKQogICAgICAgICB0YXIuY2xvc2UoKQogCiAgICAgZGVmIHRlc3RfdW5pY29kZV9maWxlbmFtZV9lcnJvcihzZWxmKToKLSAgICAgICAgIyBUaGUgZXVybyBzaWduIGZpbGVuYW1lIGNhbm5vdCBiZSB0cmFuc2xhdGVkIHRvIGlzbzg4NTktMSBlbmNvZGluZy4KLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgZW5jb2Rpbmc9InV0ZjgiKQotICAgICAgICBuYW1lID0gdSJcdTIwYWMiLmVuY29kZSgidXRmOCIpICMgRXVybyBzaWduCi0gICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbyhuYW1lKSkKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9ICLk9vwiCisgICAgICAgIGlmIHNlbGYuZm9ybWF0ID09IHRhcmZpbGUuUEFYX0ZPUk1BVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9IHUi5Pb8IgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhci5hZGRmaWxlLCB0YXJpbmZvKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9ICJmb28iCisgICAgICAgIHRhcmluZm8udW5hbWUgPSB1IuT2/CIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfYXJndW1lbnQoc2VsZik6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCAiciIsIGVuY29kaW5nPSJpc284ODU5LTEiLCBlcnJvcnM9InN0cmljdCIpCisgICAgICAgIGZvciB0IGluIHRhcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQubmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC5saW5rbmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC51bmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC5nbmFtZSkgaXMgc3RyKQogICAgICAgICB0YXIuY2xvc2UoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICBkZWYgdGVzdF91bmFtZV91bmljb2RlKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiAodSLk9vwiLCAi5Pb8Iik6CisgICAgICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKQorICAgICAgICAgICAgdC51bmFtZSA9IG5hbWUKKyAgICAgICAgICAgIHQuZ25hbWUgPSBuYW1lCiAKLSAgICBkZWYgdGVzdF9wYXhfaGVhZGVycyhzZWxmKToKLSAgICAgICAgc2VsZi5fdGVzdF9wYXhfaGVhZGVycyh7ImZvbyI6ICJiYXIiLCAidWlkIjogMCwgIm10aW1lIjogMS4yM30pCisgICAgICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKCJmb28udGFyIiwgbW9kZT0idyIsIGZpbGVvYmo9Zm9iaiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgICAgIHRhci5hZGRmaWxlKHQpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICAgICAgZm9iai5zZWVrKDApCiAKLSAgICAgICAgc2VsZi5fdGVzdF9wYXhfaGVhZGVycyh7ImV1cm8iOiB1Ilx1MjBhYyIuZW5jb2RlKCJ1dGY4Iil9KQorICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKCJmb28udGFyIiwgZmlsZW9iaj1mb2JqLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgICAgIHQgPSB0YXIuZ2V0bWVtYmVyKCJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnVuYW1lLCAi5Pb8IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5nbmFtZSwgIuT2/CIpCiAKLSAgICAgICAgc2VsZi5fdGVzdF9wYXhfaGVhZGVycyh7ImV1cm8iOiB1Ilx1MjBhYyJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZXVybyI6IHUiXHUyMGFjIi5lbmNvZGUoInV0ZjgiKX0pCiAKLSAgICAgICAgc2VsZi5fdGVzdF9wYXhfaGVhZGVycyh7dSJcdTIwYWMiOiAiZXVybyJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt1Ilx1MjBhYyIuZW5jb2RlKCJ1dGY4Iik6ICJldXJvIn0pCitjbGFzcyBHTlVVbmljb2RlVGVzdChVc3RhclVuaWNvZGVUZXN0KToKIAotICAgIGRlZiBfdGVzdF9wYXhfaGVhZGVycyhzZWxmLCBwYXhfaGVhZGVycywgY21wX2hlYWRlcnM9Tm9uZSk6Ci0gICAgICAgIGlmIGNtcF9oZWFkZXJzIGlzIE5vbmU6Ci0gICAgICAgICAgICBjbXBfaGVhZGVycyA9IHBheF9oZWFkZXJzCisgICAgZm9ybWF0ID0gdGFyZmlsZS5HTlVfRk9STUFUCiAKLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgXAotICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzPXBheF9oZWFkZXJzLCBlbmNvZGluZz0idXRmOCIpCi0gICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygidGVzdCIpKQorCitjbGFzcyBQYXhVbmljb2RlVGVzdChVc3RhclVuaWNvZGVUZXN0KToKKworICAgIGZvcm1hdCA9IHRhcmZpbGUuUEFYX0ZPUk1BVAorCisgICAgZGVmIF9jcmVhdGVfdW5pY29kZV9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9c2VsZi5mb3JtYXQpCisgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oKQorICAgICAgICB0LnBheF9oZWFkZXJzWyJwYXRoIl0gPSBuYW1lCisgICAgICAgIHRhci5hZGRmaWxlKHQpCiAgICAgICAgIHRhci5jbG9zZSgpCiAKLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPSJ1dGY4IikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIucGF4X2hlYWRlcnMsIGNtcF9oZWFkZXJzKQorICAgIGRlZiB0ZXN0X2Vycm9yX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgdGhlIHVuaWNvZGUgZXJyb3IgaGFuZGxlcnMgd29yayBjb3JyZWN0bHkgZm9yIGNoYXJhY3RlcnMKKyAgICAgICAgIyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gYSBnaXZlbiBlbmNvZGluZy4KKyAgICAgICAgc2VsZi5fY3JlYXRlX3VuaWNvZGVfbmFtZSh1IuT2/CIpCiAKLSAgICBkZWYgdGVzdF90cnVuY2F0ZWRfaGVhZGVyKHNlbGYpOgotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFUKQotICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCi0gICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCi0gICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIGZvciBoYW5kbGVyLCBuYW1lIGluICgoInV0Zi04IiwgdSLk9vwiLmVuY29kZSgidXRmOCIpKSwKKyAgICAgICAgICAgICAgICAgICAgKCJyZXBsYWNlIiwgIj8/PyIpLCAoImlnbm9yZSIsICIiKSk6CisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iYXNjaWkiLAorICAgICAgICAgICAgICAgICAgICBlcnJvcnM9aGFuZGxlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sIG5hbWUpCiAKLSAgICAgICAgIyBTaW11bGF0ZSBhIHByZW1hdHVyZSBFT0YuCi0gICAgICAgIG9wZW4odG1wbmFtZSwgInJiKyIpLnRydW5jYXRlKDE1MzYpCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwKKyAgICAgICAgICAgICAgICBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9oYW5kbGVyX3V0Zjgoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgcGF0aG5hbWUgdGhhdCBoYXMgb25lIGNvbXBvbmVudCByZXByZXNlbnRhYmxlIHVzaW5nCisgICAgICAgICMgaXNvODg1OS0xIGFuZCB0aGUgb3RoZXIgb25seSBpbiBpc284ODU5LTE1LgorICAgICAgICBzZWxmLl9jcmVhdGVfdW5pY29kZV9uYW1lKHUi5Pb8L6QiKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJpc284ODU5LTEiLAorICAgICAgICAgICAgICAgIGVycm9ycz0idXRmLTgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCAi5Pb8LyIgKyB1IqQiLmVuY29kZSgidXRmOCIpKQogCiAKIGNsYXNzIEFwcGVuZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtODM2LDYzICs5NTQsNTggQEAKICAgICBkZWYgdGVzdF91c3Rhcl9saW1pdHMoc2VsZik6CiAgICAgICAgICMgMTAwIGNoYXIgbmFtZQogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwKQotICAgICAgICB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIoKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuVVNUQVJfRk9STUFUKQogCiAgICAgICAgICMgMTAxIGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMDEyMzQ1Njc4OSIgKiAxMCArICIwIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKIAogICAgICAgICAjIDI1NiBjaGFyIG5hbWUgd2l0aCBhIHNsYXNoIGF0IHBvcyAxNTYKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiA2MiArICJsb25nbmFtZSIpCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcigpCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5VU1RBUl9GT1JNQVQpCiAKICAgICAgICAgIyAyNTYgY2hhciBuYW1lIHRoYXQgY2Fubm90IGJlIHN0b3JlZAogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjM0NTY3LyIgKiAzMSArICJsb25nbmFtZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCiAKICAgICAgICAgIyA1MTIgY2hhciBuYW1lCiAgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKIAogICAgICAgICAjIDUxMiBjaGFyIGxpbmtuYW1lCiAgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKIAogICAgICAgICAjIHVpZCA+IDggZGlnaXRzCiAgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQogICAgICAgICB0YXJpbmZvLnVpZCA9IDAxMDAwMDAwMAotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQogCiAgICAgZGVmIHRlc3RfZ251X2xpbWl0cyhzZWxmKToKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQotICAgICAgICB0YXJpbmZvLmNyZWF0ZV9nbnVfaGVhZGVyKCkKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLkdOVV9GT1JNQVQpCiAKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQogICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgotICAgICAgICB0YXJpbmZvLmNyZWF0ZV9nbnVfaGVhZGVyKCkKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLkdOVV9GT1JNQVQpCiAKICAgICAgICAgIyB1aWQgPj0gMjU2ICoqIDcKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCiAgICAgICAgIHRhcmluZm8udWlkID0gMDQwMDAwMDAwMDAwMDAwMDAwMDBMCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8uY3JlYXRlX2dudV9oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuR05VX0ZPUk1BVCkKIAogICAgIGRlZiB0ZXN0X3BheF9saW1pdHMoc2VsZik6Ci0gICAgICAgICMgQSAyNTYgY2hhciBuYW1lIHRoYXQgY2FuIGJlIHN0b3JlZCB3aXRob3V0IGFuIGV4dGVuZGVkIGhlYWRlci4KLSAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiA2MiArICJsb25nbmFtZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4odGFyaW5mby5jcmVhdGVfcGF4X2hlYWRlcigidXRmOCIpKSA9PSA1MTIsCi0gICAgICAgICAgICAgICAgImNyZWF0ZV9wYXhfaGVhZGVyIGF0dGFjaGVkIHN1cGVyZmx1b3VzIGV4dGVuZGVkIGhlYWRlciIpCi0KICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQotICAgICAgICB0YXJpbmZvLmNyZWF0ZV9wYXhfaGVhZGVyKCJ1dGY4IikKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlBBWF9GT1JNQVQpCiAKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQogICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgotICAgICAgICB0YXJpbmZvLmNyZWF0ZV9wYXhfaGVhZGVyKCJ1dGY4IikKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlBBWF9GT1JNQVQpCiAKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCiAgICAgICAgIHRhcmluZm8udWlkID0gMDQwMDAwMDAwMDAwMDAwMDAwMDBMCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX3BheF9oZWFkZXIoInV0ZjgiKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkKIAogCiBjbGFzcyBHemlwTWlzY1JlYWRUZXN0KE1pc2NSZWFkVGVzdCk6CkBAIC05NDAsNiArMTA1Myw5IEBACiAgICAgICAgIFN0cmVhbVdyaXRlVGVzdCwKICAgICAgICAgR05VV3JpdGVUZXN0LAogICAgICAgICBQYXhXcml0ZVRlc3QsCisgICAgICAgIFVzdGFyVW5pY29kZVRlc3QsCisgICAgICAgIEdOVVVuaWNvZGVUZXN0LAorICAgICAgICBQYXhVbmljb2RlVGVzdCwKICAgICAgICAgQXBwZW5kVGVzdCwKICAgICAgICAgTGltaXRzVGVzdCwKICAgICBdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0dGFyLnRhciBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCmluZGV4IGM0YzgyYjguLjM1MjliZGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3R0YXIudGFyCisrKyBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCBiYWRmZmZkLi4xY2UzMmNlIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC0yMjAsNiArMjIwLDkgQEAKIExpYnJhcnkKIC0tLS0tLS0KIAorLSB0YXJmaWxlLnB5OiBJbXByb3ZlZCB1bmljb2RlIHN1cHBvcnQuIFVuaWNvZGUgaW5wdXQgbmFtZXMgYXJlIG5vdworICBvZmZpY2lhbGx5IHN1cHBvcnRlZC4gQWRkZWQgImVycm9ycyIgYXJndW1lbnQgdG8gdGhlIFRhckZpbGUgY2xhc3MuCisKIC0gdXJsbGliLmZ0cHdyYXBwZXIgY2xhc3Mgbm93IGFjY2VwdHMgYW4gb3B0aW9uYWwgdGltZW91dC4KIAogLSBzaGxleC5zcGxpdCgpIG5vdyBoYXMgYW4gb3B0aW9uYWwgInBvc2l4IiBwYXJhbWV0ZXIuCg==