ZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjODA5NTU0Li44MjdiNTdhIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmRldmVsb3BtZW50IgogICAgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIiBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0hBTkdFX1dJRklfU1RBVEUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ERVZJQ0VfUE9XRVIiIC8+CkBAIC0xMTcsNyArMTE4LDcgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNZWRpYVNjYW5uZXJBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iTWVkaWEgU2Nhbm5lciI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1lZGlhU2Nhbm5lckFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJNZWRpYSBQcm92aWRlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuVEVTVCIgLz4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9jb25uZWN0aXZpdHkueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2Nvbm5lY3Rpdml0eS54bWwKaW5kZXggNjEyMzA0Zi4uZmYwYzZlYSAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2Nvbm5lY3Rpdml0eS54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2Nvbm5lY3Rpdml0eS54bWwKQEAgLTE3LDEyICsxNywxNCBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGluZWFyTGF5b3V0Ci0gIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKzxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAorICA8TGluZWFyTGF5b3V0CisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CiAgICAgPExpbmVhckxheW91dAogICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCkBAIC0yMDIsNSArMjA0LDU5IEBACiAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NyYXNoIiAvPgogICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2FkZF9kZWZhdWx0X3JvdXRlIgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FkZF9kZWZhdWx0X3JvdXRlIiAvPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVtb3ZlX2RlZmF1bHRfcm91dGUiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVtb3ZlX2RlZmF1bHRfcm91dGUiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9kZWZhdWx0X3JlcXVlc3QiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGVmYXVsdF9yZXF1ZXN0IiAvPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZGVmYXVsdF9zb2NrZXQiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGVmYXVsdF9zb2NrZXQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9ib3VuZF9odHRwX3JlcXVlc3QiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYm91bmRfaHR0cF9yZXF1ZXN0IiAvPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYm91bmRfc29ja2V0X3JlcXVlc3QiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYm91bmRfc29ja2V0X3JlcXVlc3QiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yb3V0ZWRfaHR0cF9yZXF1ZXN0IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3JvdXRlZF9odHRwX3JlcXVlc3QiIC8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yb3V0ZWRfc29ja2V0X3JlcXVlc3QiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcm91dGVkX3NvY2tldF9yZXF1ZXN0IiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICA8L0xpbmVhckxheW91dD4KKzwvU2Nyb2xsVmlldz4KIApkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L21lZGlhX3NjYW5uZXJfYWN0aXZpdHkueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L21lZGlhX3NjYW5uZXJfYWN0aXZpdHkueG1sCmluZGV4IDk3NGY2ODMuLjQ4MDY4NDMgMTAwNjQ0Ci0tLSBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9tZWRpYV9zY2FubmVyX2FjdGl2aXR5LnhtbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvbWVkaWFfc2Nhbm5lcl9hY3Rpdml0eS54bWwKQEAgLTQsOSArNCw5IEBACiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKKwogICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKKwogICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpAQCAtMTQsMTIgKzE0LDQ1IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAJIAkKLQlhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKLQlhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLQlhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgogCi0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTYwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zY2FuY2FyZCIKKyAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJzdGFydFNjYW4iIC8+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjMwZGlwIj4KKworICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbnVtc29uZ3MiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvbnVtc29uZ3MiCisgICAgICAgICAgICBhbmRyb2lkOm51bWVyaWM9ImludGVnZXIiCisgICAgICAgIC8+CisKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbnNlcnRidXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Imluc2VydEl0ZW1zIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CiAKIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDE4MWM0ZmEuLjQyMmJkN2YgMTAwNjQ0Ci0tLSBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTM2LDYgKzM2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdGFydF9oaXByaSI+U3RhcnQgSGlQcmk8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3BfaGlwcmkiPlN0b3AgSGlQcmk8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNyYXNoIj5DUkFTSDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWRkX2RlZmF1bHRfcm91dGUiPkFkZCBEZWZhdWx0IFJvdXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyZW1vdmVfZGVmYXVsdF9yb3V0ZSI+UmVtb3ZlIERlZmF1bHQgUm91dGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfcmVxdWVzdCI+TWFrZSBhIGh0dHAgcmVxdWVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9zb2NrZXQiPk1ha2UgYSByYXcgcmVxdWVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYm91bmRfaHR0cF9yZXF1ZXN0Ij5NYWtlIGJvdW5kIGh0dHAgcmVxdWVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYm91bmRfc29ja2V0X3JlcXVlc3QiPk1ha2UgYm91bmQgc29ja2V0IHJlcXVlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJvdXRlZF9odHRwX3JlcXVlc3QiPk1ha2Ugcm91dGVkIGh0dHAgcmVxdWVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icm91dGVkX3NvY2tldF9yZXF1ZXN0Ij5NYWtlIHJvdXRlZCBzb2NrZXQgcmVxdWVzdDwvc3RyaW5nPgogCiAKICAgICAgICAgPHN0cmluZyBuYW1lPSJkZXZpY2VfaW5mb19kZWZhdWx0Ij51bmtub3duPC9zdHJpbmc+CkBAIC0yMDgsNCArMjE2LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJhZF9iZWhhdmlvcl9hbnJfc2VydmljZV9sYWJlbCI+QU5SIHN0YXJ0aW5nIGEgU2VydmljZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmFkX2JlaGF2aW9yX2Fucl9zeXN0ZW1fbGFiZWwiPlN5c3RlbSBBTlIgKGluIEFjdGl2aXR5TWFuYWdlcik8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJhZF9iZWhhdmlvcl93ZWRnZV9zeXN0ZW1fbGFiZWwiPldlZGdlIHN5c3RlbSAoNSBtaW51dGUgc3lzdGVtIEFOUik8L3N0cmluZz4KKworICAgIDwhLS0gTWVkaWFTY2FubmVyQWN0aXZpdHkgLS0+CisgICAgPHN0cmluZyBuYW1lPSJzY2FuY2FyZCI+U2NhbiBTRCBjYXJkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1zb25ncyI+IyBvZiBhbGJ1bXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc2VydGJ1dHRvbiI+SW5zZXJ0ICUxcyBhbGJ1bXM8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQ29ubmVjdGl2aXR5LmphdmEgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9Db25uZWN0aXZpdHkuamF2YQppbmRleCA1OTE1N2JmLi5jNzAyOWVjIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9Db25uZWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9Db25uZWN0aXZpdHkuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNTgsMTkgKzU5LDI3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ublJvdXRlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQmFzaWNIdHRwUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKKwogcHVibGljIGNsYXNzIENvbm5lY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbm5lY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZUb29scyAtIENvbm5lY3Rpdml0eSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVE9HR0xFX1dJRkkgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UT0dHTEVfU0NSRUVOID0gMjsKIAotICAgIHByaXZhdGUgQnV0dG9uIG1FbmFibGVXaWZpQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNhYmxlV2lmaUJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1TdGFydERlbGF5ZWRDeWNsZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcERlbGF5ZWRDeWNsZUJ1dHRvbjsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1EQ09uRHVyYXRpb25FZGl0OwogICAgIHByaXZhdGUgRWRpdFRleHQgbURDT2ZmRHVyYXRpb25FZGl0OwogICAgIHByaXZhdGUgVGV4dFZpZXcgbURDQ3ljbGVDb3VudFZpZXc7CkBAIC03OCw4ICs4Nyw2IEBACiAgICAgcHJpdmF0ZSBsb25nIG1EQ09mZkR1cmF0aW9uID0gMTIwMDAwOwogICAgIHByaXZhdGUgaW50IG1EQ0N5Y2xlQ291bnQgPSAwOwogCi0gICAgcHJpdmF0ZSBCdXR0b24gbVN0YXJ0U2NyZWVuQ3ljbGVCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVN0b3BTY3JlZW5DeWNsZUJ1dHRvbjsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1TQ09uRHVyYXRpb25FZGl0OwogICAgIHByaXZhdGUgRWRpdFRleHQgbVNDT2ZmRHVyYXRpb25FZGl0OwogICAgIHByaXZhdGUgVGV4dFZpZXcgbVNDQ3ljbGVDb3VudFZpZXc7CkBAIC04NywxMiArOTQsNiBAQAogICAgIHByaXZhdGUgbG9uZyBtU0NPZmZEdXJhdGlvbiA9IDEyMDAwOwogICAgIHByaXZhdGUgaW50IG1TQ0N5Y2xlQ291bnQgPSAwOwogCi0gICAgcHJpdmF0ZSBCdXR0b24gbVN0YXJ0TW1zQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wTW1zQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdGFydEhpUHJpQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wSGlQcmlCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUNyYXNoQnV0dG9uOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIG1EZWxheWVkQ3ljbGVTdGFydGVkID0gZmFsc2U7CiAKICAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XbTsKQEAgLTE5MSwxNSArMTkyLDExIEBACiAgICAgICAgIG1QbSA9IChQb3dlck1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKIAotICAgICAgICBtRW5hYmxlV2lmaUJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuZW5hYmxlV2lmaSk7Ci0gICAgICAgIG1FbmFibGVXaWZpQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRW5hYmxlV2lmaUNsaWNrZWQpOwotICAgICAgICBtRGlzYWJsZVdpZmlCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmRpc2FibGVXaWZpKTsKLSAgICAgICAgbURpc2FibGVXaWZpQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRGlzYWJsZVdpZmlDbGlja2VkKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuZW5hYmxlV2lmaSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuZGlzYWJsZVdpZmkpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CiAKLSAgICAgICAgbVN0YXJ0RGVsYXllZEN5Y2xlQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdGFydERlbGF5ZWRDeWNsZSk7Ci0gICAgICAgIG1TdGFydERlbGF5ZWRDeWNsZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN0YXJ0RGVsYXllZEN5Y2xlQ2xpY2tlZCk7Ci0gICAgICAgIG1TdG9wRGVsYXllZEN5Y2xlQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdG9wRGVsYXllZEN5Y2xlKTsKLSAgICAgICAgbVN0b3BEZWxheWVkQ3ljbGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdG9wRGVsYXllZEN5Y2xlQ2xpY2tlZCk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0RGVsYXllZEN5Y2xlKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdG9wRGVsYXllZEN5Y2xlKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOwogICAgICAgICBtRENPbkR1cmF0aW9uRWRpdCA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5kY193aWZpX29uX2R1cmF0aW9uKTsKICAgICAgICAgbURDT25EdXJhdGlvbkVkaXQuc2V0VGV4dChMb25nLnRvU3RyaW5nKG1EQ09uRHVyYXRpb24pKTsKICAgICAgICAgbURDT2ZmRHVyYXRpb25FZGl0ID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLmRjX3dpZmlfb2ZmX2R1cmF0aW9uKTsKQEAgLTIwNywxMCArMjA0LDggQEAKICAgICAgICAgbURDQ3ljbGVDb3VudFZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuZGNfd2lmaV9jeWNsZXNfZG9uZSk7CiAgICAgICAgIG1EQ0N5Y2xlQ291bnRWaWV3LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhtRENDeWNsZUNvdW50KSk7CiAKLSAgICAgICAgbVN0YXJ0U2NyZWVuQ3ljbGVCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0U2NyZWVuQ3ljbGUpOwotICAgICAgICBtU3RhcnRTY3JlZW5DeWNsZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN0YXJ0U2NyZWVuQ3ljbGVDbGlja2VkKTsKLSAgICAgICAgbVN0b3BTY3JlZW5DeWNsZUJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc3RvcFNjcmVlbkN5Y2xlKTsKLSAgICAgICAgbVN0b3BTY3JlZW5DeWNsZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN0b3BTY3JlZW5DeWNsZUNsaWNrZWQpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdGFydFNjcmVlbkN5Y2xlKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdG9wU2NyZWVuQ3ljbGUpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CiAgICAgICAgIG1TQ09uRHVyYXRpb25FZGl0ID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnNjX3dpZmlfb25fZHVyYXRpb24pOwogICAgICAgICBtU0NPbkR1cmF0aW9uRWRpdC5zZXRUZXh0KExvbmcudG9TdHJpbmcobVNDT25EdXJhdGlvbikpOwogICAgICAgICBtU0NPZmZEdXJhdGlvbkVkaXQgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQuc2Nfd2lmaV9vZmZfZHVyYXRpb24pOwpAQCAtMjE4LDE2ICsyMTMsMjAgQEAKICAgICAgICAgbVNDQ3ljbGVDb3VudFZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2Nfd2lmaV9jeWNsZXNfZG9uZSk7CiAgICAgICAgIG1TQ0N5Y2xlQ291bnRWaWV3LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhtU0NDeWNsZUNvdW50KSk7CiAKLSAgICAgICAgbVN0YXJ0TW1zQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdGFydF9tbXMpOwotICAgICAgICBtU3RhcnRNbXNCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdGFydE1tc0NsaWNrZWQpOwotICAgICAgICBtU3RvcE1tc0J1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc3RvcF9tbXMpOwotICAgICAgICBtU3RvcE1tc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN0b3BNbXNDbGlja2VkKTsKLSAgICAgICAgbVN0YXJ0SGlQcmlCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0X2hpcHJpKTsKLSAgICAgICAgbVN0YXJ0SGlQcmlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdGFydEhpUHJpQ2xpY2tlZCk7Ci0gICAgICAgIG1TdG9wSGlQcmlCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnN0b3BfaGlwcmkpOwotICAgICAgICBtU3RvcEhpUHJpQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3RvcEhpUHJpQ2xpY2tlZCk7Ci0gICAgICAgIG1DcmFzaEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuY3Jhc2gpOwotICAgICAgICBtQ3Jhc2hCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DcmFzaENsaWNrZWQpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdGFydF9tbXMpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnN0b3BfbW1zKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdGFydF9oaXByaSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuc3RvcF9oaXByaSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuY3Jhc2gpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWRkX2RlZmF1bHRfcm91dGUpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnJlbW92ZV9kZWZhdWx0X3JvdXRlKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5ib3VuZF9odHRwX3JlcXVlc3QpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmJvdW5kX3NvY2tldF9yZXF1ZXN0KS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5yb3V0ZWRfaHR0cF9yZXF1ZXN0KS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5yb3V0ZWRfc29ja2V0X3JlcXVlc3QpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmRlZmF1bHRfcmVxdWVzdCkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuZGVmYXVsdF9zb2NrZXQpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CiAKICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIG5ldyBJbnRlbnRGaWx0ZXIoQ09OTkVDVElWSVRZX1RFU1RfQUxBUk0pKTsKICAgICB9CkBAIC0yMzksNjIgKzIzOCwxMTQgQEAKICAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdGFydERlbGF5ZWRDeWNsZUNsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGlmICghbURlbGF5ZWRDeWNsZVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtRGVsYXllZEN5Y2xlU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbURDT25EdXJhdGlvbiA9IExvbmcucGFyc2VMb25nKG1EQ09uRHVyYXRpb25FZGl0LmdldFRleHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgbURDT2ZmRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtRENPZmZEdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH07Ci0gICAgICAgICAgICAgICAgbURDQ3ljbGVDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBtV2FrZUxvY2sgPSBtUG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLkZVTExfV0FLRV9MT0NLLCAiQ29ubmVjdGl2aXR5VGVzdCIpOwotICAgICAgICAgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIyLnNlbmRNZXNzYWdlKG1IYW5kbGVyMi5vYnRhaW5NZXNzYWdlKEVWRU5UX1RPR0dMRV9XSUZJKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN0b3BEZWxheWVkQ3ljbGVDbGlja2VkID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaWYgKG1EZWxheWVkQ3ljbGVTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbURlbGF5ZWRDeWNsZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1XYWtlTG9jayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYobUhhbmRsZXIyLmhhc01lc3NhZ2VzKEVWRU5UX1RPR0dMRV9XSUZJKSkgewotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlcjIucmVtb3ZlTWVzc2FnZXMoRVZFTlRfVE9HR0xFX1dJRkkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAodi5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLmVuYWJsZVdpZmk6CisgICAgICAgICAgICAgICAgICAgIG1XbS5zZXRXaWZpRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLmRpc2FibGVXaWZpOgorICAgICAgICAgICAgICAgICAgICBtV20uc2V0V2lmaUVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc3RhcnREZWxheWVkQ3ljbGU6CisgICAgICAgICAgICAgICAgICAgIG9uU3RhcnREZWxheWVkQ3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnN0b3BEZWxheWVkQ3ljbGU6CisgICAgICAgICAgICAgICAgICAgIG9uU3RvcERlbGF5ZWRDeWNsZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc3RhcnRTY3JlZW5DeWNsZToKKyAgICAgICAgICAgICAgICAgICAgb25TdGFydFNjcmVlbkN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5zdG9wU2NyZWVuQ3ljbGU6CisgICAgICAgICAgICAgICAgICAgIG9uU3RvcFNjcmVlbkN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFydF9tbXM6CisgICAgICAgICAgICAgICAgICAgIG1DbS5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZS5GRUFUVVJFX0VOQUJMRV9NTVMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc3RvcF9tbXM6CisgICAgICAgICAgICAgICAgICAgIG1DbS5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX01NUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5kZWZhdWx0X3NvY2tldDoKKyAgICAgICAgICAgICAgICAgICAgb25EZWZhdWx0U29ja2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5kZWZhdWx0X3JlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgIG9uRGVmYXVsdFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnJvdXRlZF9zb2NrZXRfcmVxdWVzdDoKKyAgICAgICAgICAgICAgICAgICAgb25Sb3V0ZWRTb2NrZXRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5yb3V0ZWRfaHR0cF9yZXF1ZXN0OgorICAgICAgICAgICAgICAgICAgICBvblJvdXRlZEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5ib3VuZF9zb2NrZXRfcmVxdWVzdDoKKyAgICAgICAgICAgICAgICAgICAgb25Cb3VuZFNvY2tldFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLmJvdW5kX2h0dHBfcmVxdWVzdDoKKyAgICAgICAgICAgICAgICAgICAgb25Cb3VuZEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5yZW1vdmVfZGVmYXVsdF9yb3V0ZToKKyAgICAgICAgICAgICAgICAgICAgb25SZW1vdmVEZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLmFkZF9kZWZhdWx0X3JvdXRlOgorICAgICAgICAgICAgICAgICAgICBvbkFkZERlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuY3Jhc2g6CisgICAgICAgICAgICAgICAgICAgIG9uQ3Jhc2goKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnN0YXJ0X2hpcHJpOgorICAgICAgICAgICAgICAgICAgICBtQ20uc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuRkVBVFVSRV9FTkFCTEVfSElQUkkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc3RvcF9oaXByaToKKyAgICAgICAgICAgICAgICAgICAgbUNtLnN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuRkVBVFVSRV9FTkFCTEVfSElQUkkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1FbmFibGVXaWZpQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1XbS5zZXRXaWZpRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRGlzYWJsZVdpZmlDbGlja2VkID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVdtLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH07CiAKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdGFydFNjcmVlbkN5Y2xlQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLQorICAgIHByaXZhdGUgdm9pZCBvblN0YXJ0RGVsYXllZEN5Y2xlKCkgeworICAgICAgICBpZiAoIW1EZWxheWVkQ3ljbGVTdGFydGVkKSB7CisgICAgICAgICAgICBtRGVsYXllZEN5Y2xlU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TQ09uRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtU0NPbkR1cmF0aW9uRWRpdC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbVNDT2ZmRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtU0NPZmZEdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1EQ09uRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtRENPbkR1cmF0aW9uRWRpdC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbURDT2ZmRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtRENPZmZEdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfTsKLSAgICAgICAgICAgIG1TQ0N5Y2xlQ291bnQgPSAwOworICAgICAgICAgICAgbURDQ3ljbGVDb3VudCA9IDA7CiAKLSAgICAgICAgICAgIG1TY3JlZW5vbldha2VMb2NrID0gbVBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpdml0eVRlc3QiKTsKLSAgICAgICAgICAgIG1TY3JlZW5vbldha2VMb2NrLmFjcXVpcmUoKTsKLQotICAgICAgICAgICAgc2NoZWR1bGVBbGFybSgxMCwgU0NSRUVOX09GRik7CisgICAgICAgICAgICBtV2FrZUxvY2sgPSBtUG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLkZVTExfV0FLRV9MT0NLLCAiQ29ubmVjdGl2aXR5VGVzdCIpOworICAgICAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyMi5zZW5kTWVzc2FnZShtSGFuZGxlcjIub2J0YWluTWVzc2FnZShFVkVOVF9UT0dHTEVfV0lGSSkpOwogICAgICAgICB9Ci0gICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25TdG9wRGVsYXllZEN5Y2xlKCkgeworICAgICAgICBpZiAobURlbGF5ZWRDeWNsZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1EZWxheWVkQ3ljbGVTdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBtV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgbVdha2VMb2NrID0gbnVsbDsKKyAgICAgICAgICAgIGlmKG1IYW5kbGVyMi5oYXNNZXNzYWdlcyhFVkVOVF9UT0dHTEVfV0lGSSkpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlcjIucmVtb3ZlTWVzc2FnZXMoRVZFTlRfVE9HR0xFX1dJRkkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU3RhcnRTY3JlZW5DeWNsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TQ09uRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtU0NPbkR1cmF0aW9uRWRpdC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtU0NPZmZEdXJhdGlvbiA9IExvbmcucGFyc2VMb25nKG1TQ09mZkR1cmF0aW9uRWRpdC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH07CisgICAgICAgIG1TQ0N5Y2xlQ291bnQgPSAwOworCisgICAgICAgIG1TY3JlZW5vbldha2VMb2NrID0gbVBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5VGVzdCIpOworICAgICAgICBtU2NyZWVub25XYWtlTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgc2NoZWR1bGVBbGFybSgxMCwgU0NSRUVOX09GRik7CisgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlQWxhcm0obG9uZyBkZWxheU1zLCBTdHJpbmcgZXZlbnRUeXBlKSB7CiAgICAgICAgIEFsYXJtTWFuYWdlciBhbSA9IChBbGFybU1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFMQVJNX1NFUlZJQ0UpOwpAQCAtMzEwLDQyICszNjEsMTg5IEBACiAgICAgICAgIGFtLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgZGVsYXlNcywgcCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3RvcFNjcmVlbkN5Y2xlQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgfQotICAgIH07CisgICAgcHJpdmF0ZSB2b2lkIG9uU3RvcFNjcmVlbkN5Y2xlKCkgeworICAgIH0KIAotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN0YXJ0TW1zQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1DbS5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwgUGhvbmUuRkVBVFVSRV9FTkFCTEVfTU1TKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHJpdmF0ZSB2b2lkIG9uQ3Jhc2goKSB7CisgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgZm9vID0gbnVsbDsKKyAgICAgICAgZm9vLnN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFLAorICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX01NUyk7CisgICAgfQogCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3RvcE1tc0NsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ20uc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwgUGhvbmUuRkVBVFVSRV9FTkFCTEVfTU1TKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHJpdmF0ZSB2b2lkIG9uQWRkRGVmYXVsdFJvdXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZFJvdXRlKCJldGgwIiwgIjAuMC4wLjAiLCAwLCAiOC44LjguOCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9CisgICAgfQogCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3RhcnRIaVByaUNsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ20uc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsCi0gICAgICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX0hJUFJJKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHJpdmF0ZSB2b2lkIG9uUmVtb3ZlRGVmYXVsdFJvdXRlKCkgeworICAgICAgICBMb2cuZShUQUcsICJyZW1vdmVEZWZhdWx0Um91dGUgcmV0dXJuZWQgIitOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKCJldGgwIikpOworICAgIH0KIAotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN0b3BIaVByaUNsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ20uc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwKLSAgICAgICAgICAgICAgICAgICAgUGhvbmUuRkVBVFVSRV9FTkFCTEVfSElQUkkpOwotICAgICAgICB9Ci0gICAgfTsKKyAgICBwcml2YXRlIHZvaWQgb25Sb3V0ZWRIdHRwUmVxdWVzdCgpIHsKKyAgICAgICAgb25Sb3V0ZWRSZXF1ZXN0KEhUVFApOworICAgIH0KIAotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNyYXNoQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgZm9vID0gbnVsbDsKLSAgICAgICAgICAgIGZvby5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwKLSAgICAgICAgICAgICAgICAgICAgUGhvbmUuRkVBVFVSRV9FTkFCTEVfTU1TKTsKKyAgICBwcml2YXRlIHZvaWQgb25Sb3V0ZWRTb2NrZXRSZXF1ZXN0KCkgeworICAgICAgICBvblJvdXRlZFJlcXVlc3QoU09DS0VUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU09DS0VUID0gMTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSFRUUCAgID0gMjsKKworICAgIHByaXZhdGUgdm9pZCBvblJvdXRlZFJlcXVlc3QoaW50IHR5cGUpIHsKKyAgICAgICAgU3RyaW5nIHVybCA9ICJ3d3cuZ29vZ2xlLmNvbSI7CisKKyAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIGZldGNoaW5nIGFkZHJlc3MgZm9yICIgKyB1cmwpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgfTsKKworICAgICAgICBtQ20ucmVxdWVzdFJvdXRlVG9Ib3N0QWRkcmVzcyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJLCBpbmV0QWRkcmVzcyk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNPQ0tFVDoKKyAgICAgICAgICAgICAgICBvbkJvdW5kU29ja2V0UmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIVFRQOgorICAgICAgICAgICAgICAgIEh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQoImh0dHA6Ly8iICsgdXJsKTsKKyAgICAgICAgICAgICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UgPSBjbGllbnQuZXhlY3V0ZShnZXQpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyb3V0ZWQgaHR0cCByZXF1ZXN0IGdpdmVzICIgKyBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJyb3V0ZWQgaHR0cCByZXF1ZXN0IGV4Y2VwdGlvbiA9ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkJvdW5kSHR0cFJlcXVlc3QoKSB7CisgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlID0gTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUoInJtbmV0MCIpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAibmV0d29ya0ludGVyZmFjZSBpcyAiICsgbmV0d29ya0ludGVyZmFjZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIgZXhjZXB0aW9uIGdldEJ5TmFtZTogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChuZXR3b3JrSW50ZXJmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGluZXRBZGRyZXNzZXNzID0gbmV0d29ya0ludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgICAgICB3aGlsZShpbmV0QWRkcmVzc2Vzcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiBpbmV0QWRkcmVzczoiICsgKChJbmV0QWRkcmVzcylpbmV0QWRkcmVzc2Vzcy5uZXh0RWxlbWVudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBIdHRwUGFyYW1zIGh0dHBQYXJhbXMgPSBuZXcgQmFzaWNIdHRwUGFyYW1zKCk7CisgICAgICAgIGlmIChuZXR3b3JrSW50ZXJmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbm5Sb3V0ZVBhcmFtcy5zZXRMb2NhbEFkZHJlc3MoaHR0cFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCkubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldCgiaHR0cDovL3d3dy5iYmMuY29tIik7CisgICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGh0dHBQYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoZ2V0KTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlc3BvbnNlIGNvZGUgPSAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiA9ICIrIGUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkJvdW5kU29ja2V0UmVxdWVzdCgpIHsKKyAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXR3b3JrSW50ZXJmYWNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UgPSBOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZSgicm1uZXQwIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb24gZ2V0QnlOYW1lOiAiICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ldHdvcmtJbnRlcmZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJnZXR0aW5nIGFueSBuZXR3b3JrSW50ZXJmYWNlIik7CisgICAgICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZSA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb24gZ2V0dGluZyBhbnkgbmV0d29ya0ludGVyZmFjZTogIiArIGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobmV0d29ya0ludGVyZmFjZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJjb3VsZG4ndCBmaW5kIGEgbG9jYWwgaW50ZXJmYWNlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gaW5ldEFkZHJlc3Nlc3MgPSBuZXR3b3JrSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgd2hpbGUoaW5ldEFkZHJlc3Nlc3MuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIiBhZGRyOiIgKyAoKEluZXRBZGRyZXNzKWluZXRBZGRyZXNzZXNzLm5leHRFbGVtZW50KCkpKTsKKyAgICAgICAgfQorICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbCA9IG51bGw7CisgICAgICAgIEluZXRBZGRyZXNzIHJlbW90ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NhbCA9IG5ldHdvcmtJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpLm5leHRFbGVtZW50KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb24gZ2V0dGluZyBsb2NhbCBJbmV0QWRkcmVzczogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZW1vdGUgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoInd3dy5mbGlja3IuY29tIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb24gZ2V0dGluZyByZW1vdGUgSW5ldEFkZHJlc3M6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMb2cuZChUQUcsICJyZW1vdGUgYWRkciA9IityZW1vdGUpOworICAgICAgICBMb2cuZChUQUcsICJsb2NhbCBhZGRyID0iK2xvY2FsKTsKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzb2NrZXQgPSBuZXcgU29ja2V0KHJlbW90ZSwgODAsIGxvY2FsLCA2MDAwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBjcmVhdGluZyBzb2NrZXQ6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgdHJ1ZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiSGkgZmxpY2tyIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd3JpdGluZyB0byBzb2NrZXQ6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkRlZmF1bHRSZXF1ZXN0KCkgeworICAgICAgICBIdHRwUGFyYW1zIHBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKKyAgICAgICAgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldCgiaHR0cDovL3d3dy5jbm4uY29tIik7CisgICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KHBhcmFtcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQuZXhlY3V0ZShnZXQpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVzcG9uc2UgY29kZSA9ICIgKyByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uID0gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRGVmYXVsdFNvY2tldCgpIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgcmVtb3RlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlbW90ZSA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSgid3d3LmZsaWNrci5jb20iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImV4Y2VwdGlvbiBnZXR0aW5nIHJlbW90ZSBJbmV0QWRkcmVzczogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgInJlbW90ZSBhZGRyID0iICsgcmVtb3RlKTsKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzb2NrZXQgPSBuZXcgU29ja2V0KHJlbW90ZSwgODApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGNyZWF0aW5nIHNvY2tldDogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJIaSBmbGlja3IiKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIndyaXR0ZW4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB3cml0aW5nIHRvIHNvY2tldDogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvTWVkaWFTY2FubmVyQWN0aXZpdHkuamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L01lZGlhU2Nhbm5lckFjdGl2aXR5LmphdmEKaW5kZXggZjc4OTEwYS4uMDRmNjQxNCAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvTWVkaWFTY2FubmVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9NZWRpYVNjYW5uZXJBY3Rpdml0eS5qYXZhCkBAIC0xNyw1NiArMTcsMjM5IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmRldmVsb3BtZW50OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbnN0cmFpbnRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCiBwdWJsaWMgY2xhc3MgTWVkaWFTY2FubmVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQogeworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworICAgIHByaXZhdGUgaW50IG1OdW1Ub0luc2VydCA9IDIwOworICAgIHByaXZhdGUgaW50IG1BcnRpc3RzOworICAgIHByaXZhdGUgaW50IG1BbGJ1bXM7CisgICAgcHJpdmF0ZSBpbnQgbVNvbmdzOworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICBwcml2YXRlIFVyaSBtQXVkaW9Vcmk7CisgICAgQ29udGVudFZhbHVlcyBtVmFsdWVzW10gPSBuZXcgQ29udGVudFZhbHVlc1sxMF07CisgICAgUmFuZG9tIG1SYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKICAgICBwdWJsaWMgTWVkaWFTY2FubmVyQWN0aXZpdHkoKSB7CiAgICAgfQotIAorCiAgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkIG9yIHJlc3VtZWQuICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tZWRpYV9zY2FubmVyX2FjdGl2aXR5KTsKLSAgICAgICAgCisKICAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX1NUQVJURUQpOwogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9GSU5JU0hFRCk7CiAgICAgICAgIGludGVudEZpbHRlci5hZGREYXRhU2NoZW1lKCJmaWxlIik7CiAgICAgICAgIHJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOwotICAgICAgICAKLSAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCwgVXJpLnBhcnNlKCJmaWxlOi8vIgotICAgICAgICAgICAgICAgICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkpKSk7Ci0gICAgICAgICAgICAKKworICAgICAgICBFZGl0VGV4dCB0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5udW1zb25ncyk7CisgICAgICAgIHQuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gcy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1OdW1Ub0luc2VydCA9IEludGVnZXIudmFsdWVPZih0ZXh0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbU51bVRvSW5zZXJ0ID0gMjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldEluc2VydEJ1dHRvblRleHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KTsKICAgICAgICAgbVRpdGxlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIG1UaXRsZS5zZXRUZXh0KCJTZW50IEFDVElPTl9NRURJQV9NT1VOVEVEIHRvIHRyaWdnZXIgdGhlIE1lZGlhIFNjYW5uZXIuIik7CisgICAgICAgIG1SZXNvbHZlciA9IGdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBtQXVkaW9VcmkgPSBNZWRpYVN0b3JlLkF1ZGlvLk1lZGlhLkVYVEVSTkFMX0NPTlRFTlRfVVJJOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbVZhbHVlc1tpXSA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW5zZXJ0QnV0dG9uVGV4dCgpOwogICAgIH0KIAogICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgZ29pbmcgaW50byB0aGUgYmFja2dyb3VuZCBvciBiZWluZyBkZXN0cm95ZWQuICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIG1JbnNlcnRIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKDApOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9TVEFSVEVEKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIHN0YXJ0ZWQgc2Nhbm5pbmcgIiArIGludGVudC5nZXREYXRhKCkuZ2V0UGF0aCgpKTsgICAgIAorICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIHN0YXJ0ZWQgc2Nhbm5pbmcgIiArIGludGVudC5nZXREYXRhKCkuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX0ZJTklTSEVEKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIGZpbmlzaGVkIHNjYW5uaW5nICIgKyBpbnRlbnQuZ2V0RGF0YSgpLmdldFBhdGgoKSk7ICAgICAKKyAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dCgiTWVkaWEgU2Nhbm5lciBmaW5pc2hlZCBzY2FubmluZyAiICsgaW50ZW50LmdldERhdGEoKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKIAotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2NhbihWaWV3IHYpIHsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCwgVXJpLnBhcnNlKCJmaWxlOi8vIgorICAgICAgICAgICAgICAgICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkpKSk7CisKKyAgICAgICAgbVRpdGxlLnNldFRleHQoIlNlbnQgQUNUSU9OX01FRElBX01PVU5URUQgdG8gdHJpZ2dlciB0aGUgTWVkaWEgU2Nhbm5lci4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW5zZXJ0QnV0dG9uVGV4dCgpIHsKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmluc2VydGJ1dHRvbiwgSW50ZWdlci52YWx1ZU9mKG1OdW1Ub0luc2VydCkpOworICAgICAgICBCdXR0b24gYiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmluc2VydGJ1dHRvbik7CisgICAgICAgIGIuc2V0VGV4dChsYWJlbCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRJdGVtcyhWaWV3IHYpIHsKKyAgICAgICAgaWYgKG1JbnNlcnRIYW5kbGVyLmhhc01lc3NhZ2VzKDApKSB7CisgICAgICAgICAgICBtSW5zZXJ0SGFuZGxlci5yZW1vdmVNZXNzYWdlcygwKTsKKyAgICAgICAgICAgIHNldEluc2VydEJ1dHRvblRleHQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnNlcnRIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIYW5kbGVyIG1JbnNlcnRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisKKyAgICAgICAgICAgIGlmIChtTnVtVG9JbnNlcnQtLSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBbGJ1bSgpOworICAgICAgICAgICAgICAgIHJ1bk9uVWlUaHJlYWQobURpc3BsYXlVcGRhdGVyKTsKKworICAgICAgICAgICAgICAgIGlmICghaXNGaW5pc2hpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtRGlzcGxheVVwZGF0ZXIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJBZGRlZCAiICsgbUFydGlzdHMgKyAiIGFydGlzdHMsICIgKyBtQWxidW1zICsgIiBhbGJ1bXMsICIKKyAgICAgICAgICAgICAgICAgICAgKyBtU29uZ3MgKyAiIHNvbmdzLiIpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEFkZCBvbmUgbW9yZSBhbGJ1bSAod2l0aCAxMCBzb25ncykgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIHdpbGwgYmUgYSBjb21waWxhdGlvbiBhbGJ1bSwKKyAgICAvLyB3aXRoIG9uZSBhbGJ1bSBhcnRpc3QgZm9yIHRoZSBhbGJ1bSwgYW5kIGEgc2VwYXJhdGUgYXJ0aXN0IGZvciBlYWNoIHNvbmcuCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsYnVtKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGFsYnVtQXJ0aXN0ID0gIlZhcmlvdXMgQXJ0aXN0cyI7CisgICAgICAgICAgICBTdHJpbmcgYWxidW1OYW1lID0gZ2V0UmFuZG9tV29yZCgzKTsKKyAgICAgICAgICAgIGludCBiYXNlWWVhciA9IDE5NjkgKyBtUmFuZG9tLm5leHRJbnQoMzApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlc1tpXS5jbGVhcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcnRpc3QgPSBnZXRSYW5kb21OYW1lKCk7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBtYXAgPSBtVmFsdWVzW2ldOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYm9ndXMvIiArIGFsYnVtTmFtZSArICIvIiArIGFydGlzdCArICJfIiArIGkpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSYW5kb21Xb3JkKDQpICsgIiAiICsgZ2V0UmFuZG9tV29yZCgyKSArICIgIiArIChpICsgMSkpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUlNRV9UWVBFLCAiYXVkaW8vbXAzIik7CisKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLkFSVElTVCwgYXJ0aXN0KTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KCJhbGJ1bV9hcnRpc3QiLCBhbGJ1bUFydGlzdCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChBdWRpby5NZWRpYS5BTEJVTSwgYWxidW1OYW1lKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLlRSQUNLLCBpICsgMSk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChBdWRpby5NZWRpYS5EVVJBVElPTiwgNCo2MCoxMDAwKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLklTX01VU0lDLCAxKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLllFQVIsIGJhc2VZZWFyICsgbVJhbmRvbS5uZXh0SW50KDEwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVzb2x2ZXIuYnVsa0luc2VydChtQXVkaW9VcmksIG1WYWx1ZXMpOworICAgICAgICAgICAgbVNvbmdzICs9IDEwOworICAgICAgICAgICAgbUFsYnVtcysrOworICAgICAgICAgICAgbUFydGlzdHMgKz0gMTE7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUNvbnN0cmFpbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5kKCJAQEBAIiwgImluc2VydCBmYWlsZWQiLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21lIGNvZGUgdG8gZ2VuZXJhdGUgcmFuZG9tIG5hbWVzLiBUaGlzIGp1c3Qgc3RyaW5ncyB0b2dldGhlciByYW5kb20KKyAgICAgKiBzeWxsYWJsZXMsIGFuZCByYW5kb21seSBpbnNlcnRzIGEgbW9kaWZpZXIgYmV0d2VlbiB0aGUgZmlyc3QKKyAgICAgKiBhbmQgbGFzdCBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudHMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFiIiwgImFtIiwKKyAgICAgICAgICAgICJicmEiLCAiYnJpIiwKKyAgICAgICAgICAgICJjaSIsICJjbyIsCisgICAgICAgICAgICAiZGUiLCAiZGkiLCAiZG8iLAorICAgICAgICAgICAgImZhIiwgImZpIiwKKyAgICAgICAgICAgICJraSIsCisgICAgICAgICAgICAibGEiLCAibGkiLAorICAgICAgICAgICAgIm1hIiwgIm1lIiwgIm1pIiwgIm1vIiwKKyAgICAgICAgICAgICJuYSIsICJuaSIsCisgICAgICAgICAgICAicGEiLAorICAgICAgICAgICAgInRhIiwgInRpIiwKKyAgICAgICAgICAgICJ2aSIsICJ2byIKKyAgICB9OworCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmFuZG9tV29yZChpbnQgbGVuKSB7CisgICAgICAgIGludCBtYXggPSBlbGVtZW50cy5sZW5ndGg7CisgICAgICAgIG1CdWlsZGVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVsZW1lbnRzW21SYW5kb20ubmV4dEludChtYXgpXSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBjID0gbUJ1aWxkZXIuY2hhckF0KDApOworICAgICAgICBjID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpOworICAgICAgICBtQnVpbGRlci5zZXRDaGFyQXQoMCwgYyk7CisgICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFJhbmRvbU5hbWUoKSB7CisgICAgICAgIGJvb2xlYW4gbG9uZ2ZpcnN0ID0gbVJhbmRvbS5uZXh0SW50KDUpIDwgMzsKKyAgICAgICAgU3RyaW5nIGZpcnN0ID0gZ2V0UmFuZG9tV29yZChsb25nZmlyc3QgPyAzIDogMik7CisgICAgICAgIFN0cmluZyBsYXN0ID0gZ2V0UmFuZG9tV29yZCgzKTsKKyAgICAgICAgc3dpdGNoIChtUmFuZG9tLm5leHRJbnQoNikpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoIWxhc3Quc3RhcnRzV2l0aCgiRGkiKSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gImRpICIgKyBsYXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBsYXN0ID0gInZhbiAiICsgbGFzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBsYXN0ID0gImRlICIgKyBsYXN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaXJzdCArICIgIiArIGxhc3Q7CisgICAgfQorCisKKwogfQpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9BbmRyb2lkLm1rIGIvYXBwcy9HcmFwaGljc0xhYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRkMTE0Li4wMDAwMDAwCi0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR3JhcGhpY3NMYWIKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9hcHBzL0dyYXBoaWNzTGFiL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9hcHBzL0dyYXBoaWNzTGFiL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWM0ZmEuLjAwMDAwMDAKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmFuZHJvaWQuZ3JhcGhpY3NsYWIiPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcyBMYWIiPgotCQk8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHcmFwaGljc0xhYiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotCQk8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9OT1RJQ0UgYi9hcHBzL0dyYXBoaWNzTGFiL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9hcHBzL0dyYXBoaWNzTGFiL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvZHJhd2FibGUvYmVhY2guanBnIGIvYXBwcy9HcmFwaGljc0xhYi9yZXMvZHJhd2FibGUvYmVhY2guanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk3OTRmLi4wMDAwMDAwCi0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2RyYXdhYmxlL2JlYWNoLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2RyYXdhYmxlL25ld3NfaW1nLmpwZyBiL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2RyYXdhYmxlL25ld3NfaW1nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNWVjYi4uMDAwMDAwMAotLS0gYS9hcHBzL0dyYXBoaWNzTGFiL3Jlcy9kcmF3YWJsZS9uZXdzX2ltZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0dyYXBoaWNzTGFiL3NyYy9jb20vYW5kcm9pZC9ncmFwaGljc2xhYi9HcmFwaGljc0xhYi5qYXZhIGIvYXBwcy9HcmFwaGljc0xhYi9zcmMvY29tL2FuZHJvaWQvZ3JhcGhpY3NsYWIvR3JhcGhpY3NMYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YWM1Yi4uMDAwMDAwMAotLS0gYS9hcHBzL0dyYXBoaWNzTGFiL3NyYy9jb20vYW5kcm9pZC9ncmFwaGljc2xhYi9HcmFwaGljc0xhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdyYXBoaWNzbGFiOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLnV0aWxzLio7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnZpZXcuKjsKLQotcHVibGljIGNsYXNzIEdyYXBoaWNzTGFiIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHB1YmxpYyBHcmFwaGljc0xhYigpIHt9Ci0KLSAgICBwcml2YXRlIGludCBtQ3VyclZpZXcgPSAxOwotCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2FtcGxlVmlldyh0aGlzKSk7Ci0vLyAgICAgICAgc2V0VGl0bGUoIkdyYXBoaWNzIExhYiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoKGtleUNvZGUpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJWaWV3ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNhbXBsZVZpZXcyKHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJWaWV3ID0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2FtcGxlVmlldyh0aGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyVmlldyA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhbXBsZVZpZXcyIGV4dGVuZHMgVmlldyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dTID0gMTY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xTID0gMTY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlNUUkVUQ0hfTVNFQyA9IDI1MDsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnA7Ci0gICAgICAgIHByaXZhdGUgQm91bmRhcnlQYXRjaCBtUGF0Y2g7Ci0gICAgICAgIHByaXZhdGUgZmxvYXRbXSBtQ3ViaWNzOwotICAgICAgICBwcml2YXRlIGZsb2F0W10gbU9yaWcgPSBuZXcgZmxvYXRbMjRdOwotICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDA7Ci0gICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50MTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1cnJJbmRleCA9IC0xOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1QcmV2WDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtUHJldlk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU2FtcGxlVmlldzIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQml0bWFwIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5uZXdzX2ltZyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1QYXRjaCA9IG5ldyBCb3VuZGFyeVBhdGNoKCk7Ci0gICAgICAgICAgICBtUGF0Y2guc2V0VGV4dHVyZShibSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZsb2F0IHVuaXQgPSA5MDsKLSAgICAgICAgICAgIG1DdWJpY3MgPSBuZXcgZmxvYXRbXSB7Ci0gICAgICAgICAgICAgICAgMCwgMCwgMSwgMCwgMiwgMCwKLSAgICAgICAgICAgICAgICAzLCAwLCAzLCAxLCAzLCAyLAotICAgICAgICAgICAgICAgIDMsIDMsIDIsIDMsIDEsIDMsCi0gICAgICAgICAgICAgICAgMCwgMywgMCwgMiwgMCwgMQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1DdWJpY3NbaV0gKj0gOTA7Ci0gICAgICAgICAgICAgICAgbUN1Ymljc1tpXSArPSAyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYnVpbGRQYXRjaCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtUGFpbnQwID0gbmV3IFBhaW50KCk7Ci0gICAgICAgICAgICBtUGFpbnQwLnNldEFudGlBbGlhcyh0cnVlKTsKLSAgICAgICAgICAgIG1QYWludDAuc2V0U3Ryb2tlV2lkdGgoMTIpOwotICAgICAgICAgICAgbVBhaW50MC5zZXRTdHJva2VDYXAoUGFpbnQuQ2FwLlJPVU5EKTsKLSAgICAgICAgICAgIG1QYWludDEgPSBuZXcgUGFpbnQobVBhaW50MCk7Ci0gICAgICAgICAgICBtUGFpbnQxLnNldENvbG9yKDB4RkZGRkZGRkYpOwotICAgICAgICAgICAgbVBhaW50MS5zZXRTdHJva2VXaWR0aCgxMCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCBudywgaW50IG5oLCBpbnQgb3csIGludCBvaCkgewotICAgICAgICAgICAgZmxvYXRbXSBwdHMgPSBtQ3ViaWNzOwotICAgICAgICAgICAgZmxvYXQgeDEgPSBudyowLjMzMzNmOwotICAgICAgICAgICAgZmxvYXQgeTEgPSBuaCowLjMzMzNmOwotICAgICAgICAgICAgZmxvYXQgeDIgPSBudyowLjY2NjdmOwotICAgICAgICAgICAgZmxvYXQgeTIgPSBuaCowLjY2NjdmOwotICAgICAgICAgICAgcHRzWzAqMiswXSA9IDA7ICBwdHNbMCoyKzFdID0gMDsKLSAgICAgICAgICAgIHB0c1sxKjIrMF0gPSB4MTsgcHRzWzEqMisxXSA9IDA7Ci0gICAgICAgICAgICBwdHNbMioyKzBdID0geDI7IHB0c1syKjIrMV0gPSAwOwotCi0gICAgICAgICAgICBwdHNbMyoyKzBdID0gbnc7IHB0c1szKjIrMV0gPSAwOwotICAgICAgICAgICAgcHRzWzQqMiswXSA9IG53OyBwdHNbNCoyKzFdID0geTE7Ci0gICAgICAgICAgICBwdHNbNSoyKzBdID0gbnc7IHB0c1s1KjIrMV0gPSB5MjsKLQotICAgICAgICAgICAgcHRzWzYqMiswXSA9IG53OyBwdHNbNioyKzFdID0gbmg7Ci0gICAgICAgICAgICBwdHNbNyoyKzBdID0geDI7IHB0c1s3KjIrMV0gPSBuaDsKLSAgICAgICAgICAgIHB0c1s4KjIrMF0gPSB4MTsgcHRzWzgqMisxXSA9IG5oOwotCi0gICAgICAgICAgICBwdHNbOSoyKzBdID0gMDsgIHB0c1s5KjIrMV0gPSBuaDsKLSAgICAgICAgICAgIHB0c1sxMCoyKzBdID0gMDsgcHRzWzEwKjIrMV0gPSB5MjsKLSAgICAgICAgICAgIHB0c1sxMSoyKzBdID0gMDsgcHRzWzExKjIrMV0gPSB5MTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwdHMsIDAsIG1PcmlnLCAwLCAyNCk7Ci0gICAgICAgICAgICByZWJ1aWxkUGF0Y2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICAgICAgaWYgKG1JbnRlcnAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBub3cgPSAoaW50KVN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIEludGVycG9sYXRvci5SZXN1bHQgcmVzdWx0ID0gbUludGVycC50aW1lVG9WYWx1ZXMobm93LCBtQ3ViaWNzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEludGVycG9sYXRvci5SZXN1bHQuTk9STUFMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnAgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVidWlsZFBhdGNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGF0Y2guZHJhdyhjYW52YXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRQYXRjaCgpIHsKLSAgICAgICAgICAgIG1QYXRjaC5zZXRDdWJpY0JvdW5kYXJ5KG1DdWJpY3MsIDAsIFJPV1MsIENPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgZmxvYXQgeCA9IGV2ZW50LmdldFgoKTsKLSAgICAgICAgICAgIGZsb2F0IHkgPSBldmVudC5nZXRZKCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtT3JpZywgMCwgbUN1YmljcywgMCwgMjQpOwotICAgICAgICAgICAgICAgICAgICBtUHJldlggPSB4OwotICAgICAgICAgICAgICAgICAgICBtUHJldlkgPSB5OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gMS41ZjsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHggPSAoeCAtIG1QcmV2WCkgKiBzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHkgPSAoeSAtIG1QcmV2WSkgKiBzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkeCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUN1Ymljc1tpbmRleCoyICsgMF0gPSBtT3JpZ1tpbmRleCoyICsgMF0gKyBkeDsKLSAgICAgICAgICAgICAgICAgICAgbUN1Ymljc1tpbmRleCoyICsgMl0gPSBtT3JpZ1tpbmRleCoyICsgMl0gKyBkeDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChkeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gNzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3ViaWNzW2luZGV4KjIgKyAxXSA9IG1PcmlnW2luZGV4KjIgKyAxXSArIGR5OwotICAgICAgICAgICAgICAgICAgICBtQ3ViaWNzW2luZGV4KjIgKyAzXSA9IG1PcmlnW2luZGV4KjIgKyAzXSArIGR5OwotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmVidWlsZFBhdGNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgotICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDogewotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAoaW50KVN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtSW50ZXJwID0gbmV3IEludGVycG9sYXRvcigyNCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnAuc2V0S2V5RnJhbWUoMCwgc3RhcnQsIG1DdWJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W10geyAwLCAwLjVmLCAwLjVmLCAxIH0pOwotICAgICAgICAgICAgICAgICAgICBtSW50ZXJwLnNldEtleUZyYW1lKDEsIHN0YXJ0ICsgVU5TVFJFVENIX01TRUMsIG1PcmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhbXBsZVZpZXcgZXh0ZW5kcyBWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPV1MgPSAxNjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFMgPSAxNjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgQm91bmRhcnlQYXRjaCBtUGF0Y2g7Ci0gICAgICAgIHByaXZhdGUgZmxvYXRbXSBtQ3ViaWNzOwotICAgICAgICBwcml2YXRlIGZsb2F0W10gbU9yaWcgPSBuZXcgZmxvYXRbMjRdOwotICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDA7Ci0gICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50MTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1cnJJbmRleCA9IC0xOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1QcmV2WDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtUHJldlk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU2FtcGxlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIEJpdG1hcCBibSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoZ2V0UmVzb3VyY2VzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5iZWFjaCk7Ci0gICAgICAgIAotICAgICAgICBtUGF0Y2ggPSBuZXcgQm91bmRhcnlQYXRjaCgpOwotICAgICAgICBtUGF0Y2guc2V0VGV4dHVyZShibSk7Ci0gICAgICAgIAotICAgICAgICBmbG9hdCB1bml0ID0gOTA7Ci0gICAgICAgIG1DdWJpY3MgPSBuZXcgZmxvYXRbXSB7Ci0gICAgICAgICAgICAwLCAwLCAxLCAwLCAyLCAwLAotICAgICAgICAgICAgMywgMCwgMywgMSwgMywgMiwKLSAgICAgICAgICAgIDMsIDMsIDIsIDMsIDEsIDMsCi0gICAgICAgICAgICAwLCAzLCAwLCAyLCAwLCAxCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgewotICAgICAgICAgICAgbUN1Ymljc1tpXSAqPSA5MDsKLSAgICAgICAgICAgIG1DdWJpY3NbaV0gKz0gMjA7Ci0gICAgICAgIH0KLSAgICAgICAgcmVidWlsZFBhdGNoKCk7Ci0gICAgICAgIAotICAgICAgICBtUGFpbnQwID0gbmV3IFBhaW50KCk7Ci0gICAgICAgIG1QYWludDAuc2V0QW50aUFsaWFzKHRydWUpOwotICAgICAgICBtUGFpbnQwLnNldFN0cm9rZVdpZHRoKDEyKTsKLSAgICAgICAgbVBhaW50MC5zZXRTdHJva2VDYXAoUGFpbnQuQ2FwLlJPVU5EKTsKLSAgICAgICAgbVBhaW50MSA9IG5ldyBQYWludChtUGFpbnQwKTsKLSAgICAgICAgbVBhaW50MS5zZXRDb2xvcigweEZGRkZGRkZGKTsKLSAgICAgICAgbVBhaW50MS5zZXRTdHJva2VXaWR0aCgxMCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBjYW52YXMuZHJhd0NvbG9yKDB4RkZDQ0NDQ0MpOwotICAgICAgICBtUGF0Y2guZHJhdyhjYW52YXMpOwotICAgICAgICBjYW52YXMuZHJhd1BvaW50cyhtQ3ViaWNzLCBtUGFpbnQwKTsKLSAgICAgICAgY2FudmFzLmRyYXdQb2ludHMobUN1YmljcywgbVBhaW50MSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkUGF0Y2goKSB7Ci0gICAgICAgIG1QYXRjaC5zZXRDdWJpY0JvdW5kYXJ5KG1DdWJpY3MsIDAsIFJPV1MsIENPTFMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBmaW5kUHRJbmRleChmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHRvbGVyYW5jZSA9IDI1OwotICAgICAgICBmaW5hbCBmbG9hdFtdIHB0cyA9IG1DdWJpY3M7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHB0cy5sZW5ndGggPj4gMSk7IGkrKykgewotICAgICAgICAgICAgaWYgKE1hdGguYWJzKHB0c1tpKjIgKyAwXSAtIHgpIDw9IHRvbGVyYW5jZSAmJgotICAgICAgICAgICAgICAgIE1hdGguYWJzKHB0c1tpKjIgKyAxXSAtIHkpIDw9IHRvbGVyYW5jZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpKjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgb2Zmc2V0UHRzKGZsb2F0IGR4LCBmbG9hdCBkeSkgewotICAgICAgICBmaW5hbCBmbG9hdFtdIHB0cyA9IG1DdWJpY3M7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHB0cy5sZW5ndGggPj4gMSk7IGkrKykgewotICAgICAgICAgICAgcHRzW2kqMiArIDBdICs9IGR4OwotICAgICAgICAgICAgcHRzW2kqMiArIDFdICs9IGR5OwotICAgICAgICB9Ci0gICAgICAgIHJlYnVpbGRQYXRjaCgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGZsb2F0IHggPSBldmVudC5nZXRYKCk7Ci0gICAgICAgIGZsb2F0IHkgPSBldmVudC5nZXRZKCk7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046Ci0gICAgICAgICAgICAgICAgbUN1cnJJbmRleCA9IGZpbmRQdEluZGV4KHgsIHkpOwotICAgICAgICAgICAgICAgIG1QcmV2WCA9IHg7Ci0gICAgICAgICAgICAgICAgbVByZXZZID0geTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJySW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3ViaWNzW21DdXJySW5kZXggKyAwXSA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWJpY3NbbUN1cnJJbmRleCArIDFdID0geTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNldEN1YmljQm91bmRhcnkobUN1YmljcywgMCwgUk9XUywgQ09MUyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0UHRzKHggLSBtUHJldlgsIHkgLSBtUHJldlkpOwotICAgICAgICAgICAgICAgICAgICBtUHJldlggPSB4OwotICAgICAgICAgICAgICAgICAgICBtUHJldlkgPSB5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotfQotCmRpZmYgLS1naXQgYS9idWlsZC9zZGsuYXRyZWUgYi9idWlsZC9zZGsuYXRyZWUKaW5kZXggMzVkMzRkZC4uMmNkZTRjNiAxMDA2NDQKLS0tIGEvYnVpbGQvc2RrLmF0cmVlCisrKyBiL2J1aWxkL3Nkay5hdHJlZQpAQCAtMTcxLDYgKzE3MSw3IEBACiBkZXZlbG9wbWVudC9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UKIGRldmVsb3BtZW50L3NhbXBsZXMvV2lrdGlvbmFyeSAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9XaWt0aW9uYXJ5CiBkZXZlbG9wbWVudC9zYW1wbGVzL1dpa3Rpb25hcnlTaW1wbGUgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vV2lrdGlvbmFyeVNpbXBsZQorZGV2ZWxvcG1lbnQvc2FtcGxlcy9YbWxBZGFwdGVycyAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1htbEFkYXB0ZXJzCiAKICMgTk9USUNFIGZpbGVzIGFyZSBjb3BpZWQgYnkgYnVpbGQvY29yZS9NYWtlZmlsZSBmcm9tIHNkay5naXQKIHNkay9maWxlcy9zZGtfZmlsZXNfTk9USUNFLnR4dCBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTk9USUNFLnR4dApkaWZmIC0tZ2l0IGEvYnVpbGQvdG9vbHMvd2luZG93c19zZGsubWsgYi9idWlsZC90b29scy93aW5kb3dzX3Nkay5tawppbmRleCA5NjA5MTYwLi4wNTdmMWZjIDEwMDY0NAotLS0gYS9idWlsZC90b29scy93aW5kb3dzX3Nkay5taworKysgYi9idWlsZC90b29scy93aW5kb3dzX3Nkay5tawpAQCAtMzgsNyArMzgsMTAgQEAKIFdJTl9TREtfRElSICAgOj0gJChzdWJzdCAkKEhPU1RfT1MpLSQoSE9TVF9BUkNIKSx3aW5kb3dzLCQoTElOVVhfU0RLX0RJUikpCiBXSU5fU0RLX1pJUCAgIDo9ICQoV0lOX1NES19ESVIpLyQoV0lOX1NES19OQU1FKS56aXAKIAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB3aW5fc2RrLCAkKFdJTl9TREtfWklQKSkKKyMgQWxzbyBkaXN0ICQoSU5URVJOQUxfU0RLX1RBUkdFVCksIHdoaWNoIGlzIHRoZSBvcmlnaW5hbCBsaW51eCBzZGsgcGFja2FnZS4KKyMgSU5URVJOQUxfU0RLX1RBUkdFVCBpcyBkZWZpbmVkIGluIGJ1aWxkL2NvcmUvTWFrZWZpbGUuCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHdpbl9zZGssICQoV0lOX1NES19aSVApIFwKKyAgICAkKElOVEVSTkFMX1NES19UQVJHRVQpKQogCiAuUEhPTlk6IHdpbl9zZGsgd2luc2RrLXRvb2xzCiAKZGlmZiAtLWdpdCBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5LmphdmEgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleS5qYXZhCmluZGV4IDY4ZmIyYTUuLjc0OWY2MzYgMTAwNjQ0Ci0tLSBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5LmphdmEKKysrIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXkuamF2YQpAQCAtODYxLDE4ICs4NjEsNiBAQAogICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHJlYWR5IHRvIHJvY2suCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSW50ZXJuYWxDb25maWd1cmF0aW9uKCkgewotICAgICAgICAvLyBDaGVjayBLRVlDT0RFIG5hbWUgYXJyYXksIG1ha2Ugc3VyZSBpdCdzIHVwIHRvIGRhdGUuCi0KLSAgICAgICAgU3RyaW5nIGxhc3RLZXlOYW1lID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxhc3RLZXlOYW1lID0gTW9ua2V5U291cmNlUmFuZG9tLmdldExhc3RLZXlOYW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGlmICghIlRBR19MQVNUX0tFWUNPREUiLmVxdWFscyhsYXN0S2V5TmFtZSkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKiogRXJyb3I6IEtleSBuYW1lcyBhcnJheSBtYWxmb3JtZWQgKGludGVybmFsIGVycm9yKS4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VSYW5kb20uamF2YSBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5U291cmNlUmFuZG9tLmphdmEKaW5kZXggZjFlZGFlMS4uYTJmYTczMiAxMDA2NDQKLS0tIGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VSYW5kb20uamF2YQorKysgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleVNvdXJjZVJhbmRvbS5qYXZhCkBAIC02MywxMjMgKzYzLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBOaWNlIG5hbWVzIGZvciBhbGwga2V5IGV2ZW50cy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBLRVlfTkFNRVMgPSB7Ci0gICAgICAgICJLRVlDT0RFX1VOS05PV04iLAotICAgICAgICAiS0VZQ09ERV9TT0ZUX0xFRlQiLAotICAgICAgICAiS0VZQ09ERV9TT0ZUX1JJR0hUIiwKLSAgICAgICAgIktFWUNPREVfSE9NRSIsCi0gICAgICAgICJLRVlDT0RFX0JBQ0siLAotICAgICAgICAiS0VZQ09ERV9DQUxMIiwKLSAgICAgICAgIktFWUNPREVfRU5EQ0FMTCIsCi0gICAgICAgICJLRVlDT0RFXzAiLAotICAgICAgICAiS0VZQ09ERV8xIiwKLSAgICAgICAgIktFWUNPREVfMiIsCi0gICAgICAgICJLRVlDT0RFXzMiLAotICAgICAgICAiS0VZQ09ERV80IiwKLSAgICAgICAgIktFWUNPREVfNSIsCi0gICAgICAgICJLRVlDT0RFXzYiLAotICAgICAgICAiS0VZQ09ERV83IiwKLSAgICAgICAgIktFWUNPREVfOCIsCi0gICAgICAgICJLRVlDT0RFXzkiLAotICAgICAgICAiS0VZQ09ERV9TVEFSIiwKLSAgICAgICAgIktFWUNPREVfUE9VTkQiLAotICAgICAgICAiS0VZQ09ERV9EUEFEX1VQIiwKLSAgICAgICAgIktFWUNPREVfRFBBRF9ET1dOIiwKLSAgICAgICAgIktFWUNPREVfRFBBRF9MRUZUIiwKLSAgICAgICAgIktFWUNPREVfRFBBRF9SSUdIVCIsCi0gICAgICAgICJLRVlDT0RFX0RQQURfQ0VOVEVSIiwKLSAgICAgICAgIktFWUNPREVfVk9MVU1FX1VQIiwKLSAgICAgICAgIktFWUNPREVfVk9MVU1FX0RPV04iLAotICAgICAgICAiS0VZQ09ERV9QT1dFUiIsCi0gICAgICAgICJLRVlDT0RFX0NBTUVSQSIsCi0gICAgICAgICJLRVlDT0RFX0NMRUFSIiwKLSAgICAgICAgIktFWUNPREVfQSIsCi0gICAgICAgICJLRVlDT0RFX0IiLAotICAgICAgICAiS0VZQ09ERV9DIiwKLSAgICAgICAgIktFWUNPREVfRCIsCi0gICAgICAgICJLRVlDT0RFX0UiLAotICAgICAgICAiS0VZQ09ERV9GIiwKLSAgICAgICAgIktFWUNPREVfRyIsCi0gICAgICAgICJLRVlDT0RFX0giLAotICAgICAgICAiS0VZQ09ERV9JIiwKLSAgICAgICAgIktFWUNPREVfSiIsCi0gICAgICAgICJLRVlDT0RFX0siLAotICAgICAgICAiS0VZQ09ERV9MIiwKLSAgICAgICAgIktFWUNPREVfTSIsCi0gICAgICAgICJLRVlDT0RFX04iLAotICAgICAgICAiS0VZQ09ERV9PIiwKLSAgICAgICAgIktFWUNPREVfUCIsCi0gICAgICAgICJLRVlDT0RFX1EiLAotICAgICAgICAiS0VZQ09ERV9SIiwKLSAgICAgICAgIktFWUNPREVfUyIsCi0gICAgICAgICJLRVlDT0RFX1QiLAotICAgICAgICAiS0VZQ09ERV9VIiwKLSAgICAgICAgIktFWUNPREVfViIsCi0gICAgICAgICJLRVlDT0RFX1ciLAotICAgICAgICAiS0VZQ09ERV9YIiwKLSAgICAgICAgIktFWUNPREVfWSIsCi0gICAgICAgICJLRVlDT0RFX1oiLAotICAgICAgICAiS0VZQ09ERV9DT01NQSIsCi0gICAgICAgICJLRVlDT0RFX1BFUklPRCIsCi0gICAgICAgICJLRVlDT0RFX0FMVF9MRUZUIiwKLSAgICAgICAgIktFWUNPREVfQUxUX1JJR0hUIiwKLSAgICAgICAgIktFWUNPREVfU0hJRlRfTEVGVCIsCi0gICAgICAgICJLRVlDT0RFX1NISUZUX1JJR0hUIiwKLSAgICAgICAgIktFWUNPREVfVEFCIiwKLSAgICAgICAgIktFWUNPREVfU1BBQ0UiLAotICAgICAgICAiS0VZQ09ERV9TWU0iLAotICAgICAgICAiS0VZQ09ERV9FWFBMT1JFUiIsCi0gICAgICAgICJLRVlDT0RFX0VOVkVMT1BFIiwKLSAgICAgICAgIktFWUNPREVfRU5URVIiLAotICAgICAgICAiS0VZQ09ERV9ERUwiLAotICAgICAgICAiS0VZQ09ERV9HUkFWRSIsCi0gICAgICAgICJLRVlDT0RFX01JTlVTIiwKLSAgICAgICAgIktFWUNPREVfRVFVQUxTIiwKLSAgICAgICAgIktFWUNPREVfTEVGVF9CUkFDS0VUIiwKLSAgICAgICAgIktFWUNPREVfUklHSFRfQlJBQ0tFVCIsCi0gICAgICAgICJLRVlDT0RFX0JBQ0tTTEFTSCIsCi0gICAgICAgICJLRVlDT0RFX1NFTUlDT0xPTiIsCi0gICAgICAgICJLRVlDT0RFX0FQT1NUUk9QSEUiLAotICAgICAgICAiS0VZQ09ERV9TTEFTSCIsCi0gICAgICAgICJLRVlDT0RFX0FUIiwKLSAgICAgICAgIktFWUNPREVfTlVNIiwKLSAgICAgICAgIktFWUNPREVfSEVBRFNFVEhPT0siLAotICAgICAgICAiS0VZQ09ERV9GT0NVUyIsCi0gICAgICAgICJLRVlDT0RFX1BMVVMiLAotICAgICAgICAiS0VZQ09ERV9NRU5VIiwKLSAgICAgICAgIktFWUNPREVfTk9USUZJQ0FUSU9OIiwKLSAgICAgICAgIktFWUNPREVfU0VBUkNIIiwKLSAgICAgICAgIktFWUNPREVfUExBWVBBVVNFIiwKLSAgICAgICAgIktFWUNPREVfU1RPUCIsCi0gICAgICAgICJLRVlDT0RFX05FWFRTT05HIiwKLSAgICAgICAgIktFWUNPREVfUFJFVklPVVNTT05HIiwKLSAgICAgICAgIktFWUNPREVfUkVXSU5EIiwKLSAgICAgICAgIktFWUNPREVfRk9SV0FSRCIsCi0gICAgICAgICJLRVlDT0RFX01VVEUiLAotICAgICAgICAiS0VZQ09ERV9QQUdFX1VQIiwKLSAgICAgICAgIktFWUNPREVfUEFHRV9ET1dOIiwKLSAgICAgICAgIktFWUNPREVfUElDVFNZTUJPTFMiLAotICAgICAgICAiS0VZQ09ERV9TV0lUQ0hfQ0hBUlNFVCIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9BIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX0IiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fQyIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9YIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX1kiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fWiIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9MMSIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9SMSIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9MMiIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9SMiIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9USFVNQkwiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fVEhVTUJSIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX1NUQVJUIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX1NFTEVDVCIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9NT0RFIiwKLQotICAgICAgICAiVEFHX0xBU1RfS0VZQ09ERSIgICAgICAvLyBFT0wuICB1c2VkIHRvIGtlZXAgdGhlIGxpc3RzIGluIHN5bmMKLSAgICB9OwotCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX1RPVUNIICAgICAgICA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX01PVElPTiAgICAgICA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX1RSQUNLQkFMTCAgICA9IDI7CkBAIC0yMDUsMTUgKzg4LDggQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtS2V5Ym9hcmRPcGVuID0gZmFsc2U7CiAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IG5hbWUgaW4gdGhlIGtleSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFzdEtleU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBLRVlfTkFNRVNbS2V5RXZlbnQuZ2V0TWF4S2V5Q29kZSgpICsgMV07Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5TmFtZShpbnQga2V5Y29kZSkgewotICAgICAgICByZXR1cm4gS0VZX05BTUVTW2tleWNvZGVdOworICAgICAgICByZXR1cm4gS2V5RXZlbnQua2V5Q29kZVRvU3RyaW5nKGtleWNvZGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI0LDEyICsxMDAsNyBAQAogICAgICAqIEByZXR1cm5zIHRoZSBpbnRlbmdlciBrZXlDb2RlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRLZXlDb2RlKFN0cmluZyBrZXlOYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgS0VZX05BTUVTLmxlbmd0aDsgeCsrKSB7Ci0gICAgICAgICAgICBpZiAoS0VZX05BTUVTW3hdLmVxdWFscyhrZXlOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIEtleUV2ZW50LmtleUNvZGVGcm9tU3RyaW5nKGtleU5hbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyBNb25rZXlTb3VyY2VSYW5kb20oUmFuZG9tIHJhbmRvbSwgQXJyYXlMaXN0PENvbXBvbmVudE5hbWU+IE1haW5BcHBzLApkaWZmIC0tZ2l0IGEvaG9zdC93aW5kb3dzL3VzYi9hbmRyb2lkX3dpbnVzYi5pbmYgYi9ob3N0L3dpbmRvd3MvdXNiL2FuZHJvaWRfd2ludXNiLmluZgppbmRleCAwOTNjNmRlLi42M2I0YmVhIDEwMDc1NQotLS0gYS9ob3N0L3dpbmRvd3MvdXNiL2FuZHJvaWRfd2ludXNiLmluZgorKysgYi9ob3N0L3dpbmRvd3MvdXNiL2FuZHJvaWRfd2ludXNiLmluZgpAQCAtNDUsNyArNDUsMjQgQEAKICVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzE4RDEmUElEXzRFMjImTUlfMDENCiA7DQogOyBEZWxsJ3MgTWluaTUNCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF80MTNDJlBJRF9CMDA3DQogJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNyZNSV8wMQ0KKzsNCis7IFNhbXN1bmcgU1BILU05MDAsIEdULUk1NzAwLCBTQ0gtUjg4MA0KKyVTaW5nbGVBZGJJbnRlcmZhY2UlICAgICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4MUMNCislQ29tcG9zaXRlQWRiSW50ZXJmYWNlJSAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODFDJk1JXzAxDQorOyBTYW1zdW5nIEdULUk3NTAwDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjYwMQ0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY2MDEmTUlfMDENCis7IFNhbXN1bmcgR1QtSTU1MDANCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODgyDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg4MiZNSV8wMQ0KKzsgU2Ftc3VuZyBTSFctTTEwMFMNCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODUwDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg1MCZNSV8wMQ0KKzsgU2Ftc3VuZyBTSFctTTExMFMNCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODFEDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxRCZNSV8wMQ0KIA0KIFtHb29nbGUuTlRhbWQ2NF0NCiA7IEhUQyBEcmVhbQ0KQEAgLTY3LDcgKzg0LDI3IEBACiAlQ29tcG9zaXRlQWRiSW50ZXJmYWNlJSAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8xOEQxJlBJRF80RTIyJk1JXzAxDQogOw0KIDsgRGVsbCdzIE1pbmk1DQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNw0KICVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzQxM0MmUElEX0IwMDcmTUlfMDENCis7DQorOyBTYW1zdW5nIFNQSC1NOTAwLCBHVC1JNTcwMCwgU0NILVI4ODANCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODFDDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxQyZNSV8wMQ0KKzsgU2Ftc3VuZyBHVC1JNzUwMA0KKyVTaW5nbGVBZGJJbnRlcmZhY2UlICAgICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY2MDENCislQ29tcG9zaXRlQWRiSW50ZXJmYWNlJSAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82NjAxJk1JXzAxDQorOyBTYW1zdW5nIEdULUk1NTAwDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg4Mg0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4ODImTUlfMDENCis7IFNhbXN1bmcgU0hXLU0xMDBTDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg1MA0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4NTAmTUlfMDENCis7IFNhbXN1bmcgU0hXLU0xMTBTDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxRA0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4MUQmTUlfMDENCis9PT09PT09DQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNyZNSV8wMQ0KKz4+Pj4+Pj4gNGU3NWI4MGENCiANCiBbVVNCX0luc3RhbGxdDQogSW5jbHVkZSA9IHdpbnVzYi5pbmYNCmRpZmYgLS1naXQgYS9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoIGIvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aAppbmRleCAxOTk0MjIwLi40NGVjZjNmIDEwMDY0NAotLS0gYS9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoCisrKyBiL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGgKQEAgLTI4LDE0ICsyOCwxNSBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL3Byb3ZpZGVycy9Ecm1Qcm92aWRlci9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvTWVkaWFQcm92aWRlci9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvVGVsZXBob255UHJvdmlkZXIvc3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2F3dCIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jbWRzL2FtL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jbWRzL2lucHV0L3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jbWRzL3BtL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jbWRzL3N2Yy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2NvcmUvY29uZmlnL3NkayIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9kcm0vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9ncmFwaGljcy9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2ljdTRqL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uva2V5c3RvcmUvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9sb2NhdGlvbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEiLz4KQEAgLTUxLDYgKzUyLDcgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdnBuL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvd2lmaS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9leC9jb21tb24vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3Mvb3B0L3ZjYXJkL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvdGVzdHMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvc2FtcGxlcy9Db21wYXNzL3NyYyIvPgpAQCAtNjgsNyArNzAsNiBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvU25ha2UvdGVzdHMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvYXBwcy9UZXJtL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvZGFsdmlrL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2ljdS9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9qc29uL3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2p1bml0L3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2x1bmkvc3JjL21haW4vamF2YSIvPgpAQCAtNzgsNiArNzksOCBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0NhbGVuZGFyUHJvdmlkZXJfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvQ29udGFjdHNQcm92aWRlcl9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9FbWFpbF9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9MYXVuY2hlcjJfaW50ZXJtZWRpYXRlcy9zcmMvcmVuZGVyc2NyaXB0L3NyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL01lZGlhUHJvdmlkZXJfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvTXVzaWNfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvUGhvbmVfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvUXVpY2tTZWFyY2hCb3hfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CkBAIC05MCwxMCArOTMsMTMgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3dpZmkvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9zZXJ2aWNlc19pbnRlcm1lZGlhdGVzL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL1IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC90YWdzb3VwL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL2FwYWNoZS1odHRwL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL2JvdW5jeWNhc3RsZS9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC9uaXN0LXNpcC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvdGFnc291cC9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZ29vZ2xlLWNvbW1vbl9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2dzZi1jbGllbnRfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9ndWF2YV9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0icGFja2FnZXMvYXBwcy9DYWxjdWxhdG9yL2FyaXR5LTIuMS4yLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkX3N0dWJzX2N1cnJlbnRfaW50ZXJtZWRpYXRlcy9jbGFzc2VzIi8+CmRpZmYgLS1naXQgYS9wZGsvUGRrLm1rIGIvcGRrL1Bkay5tawppbmRleCA2NzZmNWRjLi5hZmU0ZGM2IDEwMDY0NAotLS0gYS9wZGsvUGRrLm1rCisrKyBiL3Bkay9QZGsubWsKQEAgLTc3LDcgKzc3LDcgQEAKICMgICBkZXNjcmlwdGlvbnMgZm9yIHRoZSBuZXcgaGVhZGVycyBhbmQgcG9pbnQgdG8gdGhlIG5ldyBkb3h5Z2VuIGNyZWF0ZWQgaHRtbC4KIHBka19oZWFkZXJzIDo9IFwKICAgICAkKHBka19sZWdhY3lfaGFyZHdhcmVfZGlyKS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmggXAotICAgICQocGRrX2xlZ2FjeV9oYXJkd2FyZV9kaXIpL2dwcy5oIFwKKyAgICAkKHBka19oYXJkd2FyZV9kaXIpL2dwcy5oIFwKICAgICAkKHBka19sZWdhY3lfaGFyZHdhcmVfZGlyKS93aWZpLmggXAogICAgICQocGRrX2NhbWVyYV9kaXIpL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggXAogICAgICQocGRrX2hhcmR3YXJlX2Rpcikvc2Vuc29ycy5oIFwKQEAgLTE4Miw3ICsxODIsNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gcGRrLXRpbWVzdGFtcCBzYW1wbGVzL3NhbXBsZWpuaS9zcmMvY29tL2V4YW1wbGUvam5pZXhhbXBsZS9KTklFeGFtcGxlLmphdmEgIAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IGRldmVsb3BtZW50L3Bkay9wbmRrL3NhbXBsZXMvc2FtcGxlam5pL3NyYy9jb20vZXhhbXBsZS9qbmlleGFtcGxlCi1MT0NBTF9EUk9JRERPQ19TT1VSQ0VfUEFUSCA6PSAkKGZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX1NPVVJDRV9QQVRIKQogTE9DQUxfRFJPSURET0NfSFRNTF9ESVIgOj0gLi4vLi4vLi4vJChwZGtfYXBwX2VuZ19yb290KQogCiBMT0NBTF9NT0RVTEUgOj0gb25saW5lLXBkawpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvYWJvdXQvaW5kZXguamQgYi9wZGsvZG9jcy9hYm91dC9pbmRleC5qZAppbmRleCAyZjk4YjY1Li40M2QyYThkIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9hYm91dC9pbmRleC5qZAorKysgYi9wZGsvZG9jcy9hYm91dC9pbmRleC5qZApAQCAtMywxMCArMywxMCBAQAogZG9jLmhpZGVuYXY9dHJ1ZQogQGpkOmJvZHkKIDxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgY3JlYXRlZCBmb3IgbW9iaWxlIHBob25lcyBhbmQKLW90aGVyIGRldmljZXMuICBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IChBT1NQKSBpcyB0YXNrZWQgd2l0aCB0aGUKLW1haW50ZW5hbmNlIGFuZCBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIEFuZHJvaWQuIE1hbnkgZGV2aWNlIG1hbnVmYWN0dXJlcnMgaGF2ZQotYnJvdWdodCB0byBtYXJrZXQgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQsIGFuZCB0aGV5IGFyZSByZWFkaWJseSBhdmFpbGFibGUKLWFyb3VuZCB0aGUgd29ybGQuPC9wPgorb3RoZXIgZGV2aWNlcy4gIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgKEFPU1ApLCBsZWQgYnkgR29vZ2xlLCBpcwordGFza2VkIHdpdGggdGhlIG1haW50ZW5hbmNlIGFuZCBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIEFuZHJvaWQuIE1hbnkgZGV2aWNlCittYW51ZmFjdHVyZXJzIGhhdmUgYnJvdWdodCB0byBtYXJrZXQgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQsIGFuZCB0aGV5IGFyZQorcmVhZGlibHkgYXZhaWxhYmxlIGFyb3VuZCB0aGUgd29ybGQuPC9wPgogPHA+T3VyIHByaW1hcnkgcHVycG9zZSBpcyB0byBidWlsZCBhbiBleGNlbGxlbnQgc29mdHdhcmUgcGxhdGZvcm0gZm9yIGV2ZXJ5ZGF5CiB1c2Vycy4gQSBudW1iZXIgb2YgY29tcGFuaWVzIGhhdmUgY29tbWl0dGVkIG1hbnkgZW5naW5lZXJzIHRvIGFjaGlldmUgdGhpcwogZ29hbCwgYW5kIHRoZSByZXN1bHQgaXMgYSBmdWxsIHByb2R1Y3Rpb24gcXVhbGl0eSBjb25zdW1lciBwcm9kdWN0IHdob3NlCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9hYm91dC9waGlsb3NvcGh5LmpkIGIvcGRrL2RvY3MvYWJvdXQvcGhpbG9zb3BoeS5qZAppbmRleCAxYWExY2NmLi4xNTYyZTQyIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9hYm91dC9waGlsb3NvcGh5LmpkCisrKyBiL3Bkay9kb2NzL2Fib3V0L3BoaWxvc29waHkuamQKQEAgLTIsNyArMiw3IEBACiBkb2MudHlwZT1hYm91dAogZG9jLmhpZGVuYXY9dHJ1ZQogQGpkOmJvZHkKLTxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgZm9yIG1vYmlsZSBwaG9uZXMgYW5kIHNpbWlsYXIKKzxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgZm9yIG1vYmlsZSBwaG9uZXMgYW5kIG90aGVyCiBkZXZpY2VzLjwvcD4KIDxoMj5PcmlnaW4gYW5kIEdvYWw8L2gyPgogPHA+QW5kcm9pZCB3YXMgb3JpZ2luYXRlZCBieSBhIGdyb3VwIG9mIGNvbXBhbmllcyBrbm93biBhcyB0aGUgT3BlbiBIYW5kc2V0CkBAIC0xNiwxMiArMTYsMTEgQEAKIGlkZWFzIGEgcmVhbGl0eS4gV2Ugd2FudGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIHdhcyBubyBjZW50cmFsIHBvaW50IG9mCiBmYWlsdXJlLCB3aGVyZSBvbmUgaW5kdXN0cnkgcGxheWVyIGNvdWxkIHJlc3RyaWN0IG9yIGNvbnRyb2wgdGhlIGlubm92YXRpb25zCiBvZiBhbnkgb3RoZXIuIFRoZSBzb2x1dGlvbiB3ZSBjaG9zZSB3YXMgYW4gb3BlbiBhbmQgb3Blbi1zb3VyY2UgcGxhdGZvcm0uPC9wPgotPHA+QnV0IHRoZSB1bHRpbWF0ZSBnb2FsLCBvZiBjb3Vyc2UsIGlzIHRvIGltcHJvdmUgdGhlIG1vYmlsZSBleHBlcmllbmNlIGZvcgotcmVhbCB1c2VycyBieSBmYWNpbGl0YXRpbmcgaW5ub3ZhdGlvbi4gQWNjb3JkaW5nbHksIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlCi1BT1NQIGlzIHRvIG1ha2Ugc3VyZSBBbmRyb2lkIGlzIGEgc3VjY2VzcyBhcyBhbiBlbmQgdXNlciBwcm9kdWN0LjwvcD4KKzxwPlRoZSBnb2FsIG9mIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgaXMgdG8gY3JlYXRlIGEgc3VjY2Vzc2Z1bAorcmVhbC13b3JsZCBwcm9kdWN0IHRoYXQgaW1wcm92ZXMgdGhlIG1vYmlsZSBleHBlcmllbmNlIGZvciBlbmQgdXNlcnMuPC9wPgogPGgyPkdvdmVybmFuY2UgUGhpbG9zb3BoeTwvaDI+CiA8cD5UaGUgY29tcGFuaWVzIHRoYXQgaGF2ZSBpbnZlc3RlZCBpbiBBbmRyb2lkIGhhdmUgZG9uZSBzbyBvbiBpdHMgbWVyaXRzLAotYmVjYXVzZSB3ZSBjb2xsZWN0aXZlbHkgYmVsaWV2ZSB0aGF0IGFuIG9wZW4gcGxhdGZvcm0gaXMgbmVjZXNzYXJ5LiBBbmRyb2lkIGlzCitiZWNhdXNlIHdlIGJlbGlldmUgdGhhdCBhbiBvcGVuIHBsYXRmb3JtIGlzIG5lY2Vzc2FyeS4gQW5kcm9pZCBpcwogaW50ZW50aW9uYWxseSBhbmQgZXhwbGljaXRseSBhbiBvcGVuLXNvdXJjZSAtLSBhcyBvcHBvc2VkIHRvIGZyZWUgc29mdHdhcmUgLS0KIGVmZm9ydDogYSBncm91cCBvZiBvcmdhbml6YXRpb25zIHdpdGggc2hhcmVkIG5lZWRzIGhhcyBwb29sZWQKIHJlc291cmNlcyB0byBjb2xsYWJvcmF0ZSBvbiBhIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNoYXJlZCBwcm9kdWN0LiAKQEAgLTM0LDIwICszMywxOSBAQAogQW55b25lIGNhbiAoYW5kIHdpbGwhKSB1c2UgdGhlIEFuZHJvaWQgc291cmNlIGNvZGUgZm9yIGFueSBwdXJwb3NlLCBhbmQgd2UKIHdlbGNvbWUgYWxsIHN1Y2ggdXNlcy4gSG93ZXZlciwgaW4gb3JkZXIgdG8gdGFrZSBwYXJ0IGluIHRoZSBzaGFyZWQKIGVjb3N5c3RlbSBvZiBhcHBsaWNhdGlvbnMgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgYXJvdW5kIEFuZHJvaWQsIGRldmljZSBidWlsZGVycwotY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDb21wYXRpYmlsaXR5IFByb2dyYW0uPC9wPgorbXVzdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgQ29tcGF0aWJpbGl0eSBQcm9ncmFtLjwvcD4KIDxwPlRob3VnaCBBbmRyb2lkIGNvbnNpc3RzIG9mIG11bHRpcGxlIHN1Yi1wcm9qZWN0cywgdGhpcyBpcyBzdHJpY3RseSBhCiBwcm9qZWN0LW1hbmFnZW1lbnQgdGVjaG5pcXVlLiBXZSB2aWV3IGFuZCBtYW5hZ2UgQW5kcm9pZCBhcyBhIHNpbmdsZSwKIGhvbGlzdGljIHNvZnR3YXJlIHByb2R1Y3QsIG5vdCBhICJkaXN0cmlidXRpb24iLCBzcGVjaWZpY2F0aW9uLCBvciBjb2xsZWN0aW9uCi1vZiByZXBsYWNlYWJsZSBwYXJ0cy4gQ29uY2VwdHVhbGx5LCBvdXIgbm90aW9uIGlzIHRoYXQgZGV2aWNlIGJ1aWxkZXJzIHBvcnQKK29mIHJlcGxhY2VhYmxlIHBhcnRzLiBPdXIgaW50ZW50IGlzIHRoYXQgZGV2aWNlIGJ1aWxkZXJzIHBvcnQKIEFuZHJvaWQgdG8gYSBkZXZpY2U7IHRoZXkgZG9uJ3QgaW1wbGVtZW50IGEgc3BlY2lmaWNhdGlvbiBvciBjdXJhdGUgYQogZGlzdHJpYnV0aW9uLjwvcD4KIDxoMj5Ib3cgV2UgV29yazwvaDI+CiA8cD5XZSBrbm93IHRoYXQgcXVhbGl0eSBkb2VzIG5vdCBjb21lIHdpdGhvdXQgaGFyZCB3b3JrLiBBbG9uZyB3aXRoIG1hbnkKIHBhcnRuZXJzLCBHb29nbGUgaGFzIGNvbnRyaWJ1dGVkIGZ1bGwtdGltZSBlbmdpbmVlcnMsIHByb2R1Y3QgbWFuYWdlcnMsIFVJCiBkZXNpZ25lcnMsIFF1YWxpdHkgQXNzdXJhbmNlLCBhbmQgYWxsIHRoZSBvdGhlciByb2xlcyByZXF1aXJlZCB0byBicmluZwotbW9kZXJuIGRldmljZXMgdG8gbWFya2V0LiAgV2UgaW50ZWdyYXRlIHRoZSBvcGVuIHNvdXJjZSBhZG1pbmlzdHJhdGlvbiBhbmQKK21vZGVybiBkZXZpY2VzIHRvIG1hcmtldC4gIFdlIHJvbGwgdGhlIG9wZW4gc291cmNlIGFkbWluaXN0cmF0aW9uIGFuZAogbWFpbnRlbmFuY2UgaW50byB0aGUgbGFyZ2VyIHByb2R1Y3QgZGV2ZWxvcG1lbnQgY3ljbGUuPC9wPgotPHA+SW4gYSBudXRzaGVsbDo8L3A+CiA8dWw+CiA8bGk+QXQgYW55IGdpdmVuIG1vbWVudCwgdGhlcmUgaXMgYSBjdXJyZW50IGxhdGVzdCByZWxlYXNlIG9mIHRoZSBBbmRyb2lkCiBwbGF0Zm9ybS4gVGhpcyB0eXBpY2FsbHkgdGFrZXMgdGhlIGZvcm0gb2YgYSBicmFuY2ggaW4gdGhlIHRyZWUuPC9saT4KQEAgLTU2LDE4ICs1NCw5IEBACiBmZWF0dXJlcywgYW5kIHNvIG9uLjwvbGk+CiA8bGk+SW4gcGFyYWxsZWwsIEdvb2dsZSB3b3JrcyBpbnRlcm5hbGx5IG9uIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlCiBBbmRyb2lkIHBsYXRmb3JtIGFuZCBmcmFtZXdvcmssIHdvcmtpbmcgYWNjb3JkaW5nIHRvIHRoZSBwcm9kdWN0J3MgbmVlZHMgYW5kCi1nb2Fscy4gU29tZSBvZiB0aGUgd29yayBmcm9tIHRoZSBjdXJyZW50IGxhdGVzdCB0cmVlIHdpbGwgcHJvbW90ZWQgaW50byB0aGVzZQotcmVsZWFzZXMuPC9saT4KLTxsaT5XaGVuIHRoZSAibisxInRoIHZlcnNpb24gaXMgZGV0ZXJtaW5lZCB0byBiZSBuZWFyaW5nIGNvbXBsZXRpb24sIGl0IHdpbGwKLWJlIHB1Ymxpc2hlZCB0byB0aGUgcHVibGljIHNvdXJjZSB0cmVlLCBhbmQgYmVjb21lIHRoZSBuZXcgbGF0ZXN0Ci1yZWxlYXNlLjwvbGk+Ci08bGk+U2luY2UgQW5kcm9pZCBpcyBvcGVuIHNvdXJjZSwgbm90aGluZyBwcmV2ZW50cyBkZXZpY2UgaW1wbGVtZW50ZXJzIGZyb20KLXNoaXBwaW5nIGRldmljZXMgb24gb2xkZXIgKG9ic29sZXRlKSBBbmRyb2lkIGJ1aWxkcy4gSG93ZXZlciwgYWN0aXZlIHdvcmsgd2lsbAotYmUgZm9jdXNlZCBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybSByZWxlYXNlLjwvbGk+Citnb2Fscy4gV2UgZGV2ZWxvcCB0aGUgbmV4dCB2ZXJzaW9uIG9mIEFuZHJvaWQgYnkgd29ya2luZyB3aXRoIGEgZGV2aWNlIHBhcnRuZXIKK29uIGEgZmxhZ3NoaXAgZGV2aWNlIHdob3NlIHNwZWNpZmljYXRpb25zIGFyZSBjaG9zZW4gdG8gcHVzaCBBbmRyb2lkCitpbiB0aGUgZGlyZWN0aW9uIHdlIGJlbGlldmUgaXQgc2hvdWxkIGdvLjwvbGk+Cis8bGk+V2hlbiB0aGUgIm4rMSJ0aCB2ZXJzaW9uIGlzIHJlYWR5LCBpdCB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgcHVibGljCitzb3VyY2UgdHJlZSwgYW5kIGJlY29tZSB0aGUgbmV3IGxhdGVzdCByZWxlYXNlLjwvbGk+CiA8L3VsPgotPHA+VG8gbWVldCBvdXIgZ29hbHMsIEFuZHJvaWQgbmVlZHMgdG8gYWNoaWV2ZSB3aWRlc3ByZWFkLCBjb21wYXRpYmxlCi1hZG9wdGlvbi4gV2UgYmVsaWV2ZSB0aGF0IHRoZSBiZXN0IHdheSB0byBhY2NvbXBsaXNoIHRoYXQgaXMgdG8gbWFrZSBzdXJlIHRoYXQKLXdlIHNoaXAgaGlnaC1xdWFsaXR5LCBmbGFnc2hpcCBkZXZpY2VzIHdpdGggYW4gaW50ZW5zZSBwcm9kdWN0IGFuZCBlbmQtdXNlcgotZm9jdXMuIFRoZSAibmV4dCByZWxlYXNlIiBvZiBBbmRyb2lkIGlzIGRyaXZlbiBieSB0aGUgcHJvZHVjdCBuZWVkcyBmb3IgdGhlIG5leHQKLWdlbmVyYXRpb24gb2YgbW9iaWxlIGRldmljZXM7IHRoZSByZXN1bHRpbmcgZXhjZWxsZW50IHByb2R1Y3QgaXMgdGhlbiByZWxlYXNlZAotdG8gb3BlbiBzb3VyY2UgYW5kIGJlY29tZXMgdGhlIG5ldyBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBsYXRmb3JtLjwvcD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5qZCBiL3Bkay9kb2NzL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5qZAppbmRleCA2ZDViNTAxLi45NTk5MTdlIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuamQKKysrIGIvcGRrL2RvY3MvY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmpkCkBAIC0xLDI2ICsxLDY2IEBACiBwYWdlLnRpdGxlPUFuZHJvaWQgRGlzY3Vzc2lvbiBHcm91cHMgQ2hhcnRlcgogZG9jLnR5cGU9Y29tbXVuaXR5Citkb2MuaGlkZW5hdj10cnVlCiBAamQ6Ym9keQotPGgyPgotQXVkaWVuY2UKLTwvaDI+Ci08cD5UaGVzZSBkaXNjdXNzaW9uIGdyb3VwcyBhcmUgaW50ZW5kZWQgZm9yIGRldmVsb3BlcnMgd29ya2luZyB3aXRoIHRoZSBBbmRyb2lkIHBsYXRmb3JtLiBFdmVyeW9uZSBpcyB3ZWxjb21lIHRvIGpvaW4gaW4sIHByb3ZpZGVkIHlvdSBmb2xsb3cgb3VyIGNvbW11bml0eSdzIHBvbGljaWVzIGRlc2NyaWJlZCBiZWxvdy4gT3VyIHVzZXJzIGhlbHAgZWFjaCBvdGhlciwgYW5kIG1hbnkgZXhwZXJ0cyBwb3N0IHRvIHRoZXNlIGdyb3VwcywgaW5jbHVkaW5nIG1lbWJlcnMgb2YgdGhlIE9wZW4gSGFuZHNldCBBbGxpYW5jZS4KKzxoMj5BdWRpZW5jZTwvaDI+Cis8cD5UaGVzZSBkaXNjdXNzaW9uIGdyb3VwcyBhcmUgaW50ZW5kZWQgZm9yIGRldmVsb3BlcnMgd29ya2luZyB3aXRoIHRoZQorQW5kcm9pZCBwbGF0Zm9ybS4gRXZlcnlvbmUgaXMgd2VsY29tZSB0byBqb2luIGluLCBwcm92aWRlZCB5b3UgZm9sbG93IG91cgorY29tbXVuaXR5J3MgcG9saWNpZXMgZGVzY3JpYmVkIGJlbG93LiBPdXIgdXNlcnMgaGVscCBlYWNoIG90aGVyLCBhbmQgbWFueQorZXhwZXJ0cyBwb3N0IHRvIHRoZXNlIGdyb3VwcywgaW5jbHVkaW5nIG1lbWJlcnMgb2YgdGhlIE9wZW4gSGFuZHNldCBBbGxpYW5jZS4KIDwvcD4KLTxwPk5vIHRvcGljIGlzIG9mZi1saW1pdHMsIHByb3ZpZGVkIGl0IHJlbGF0ZXMgdG8gQW5kcm9pZCBpbiBzb21lIHdheS4gSG93ZXZlciwgc2luY2UgdGhlc2UgYXJlIHZlcnkgYnVzeSBsaXN0cywgc2VhcmNoIHRoZSBhcmNoaXZlcyBiZWZvcmUgcG9zdGluZyB5b3VyIHF1ZXN0aW9uOyB5b3UgbWF5IGZpbmQgeW91ciBxdWVzdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFuc3dlcmVkLgorPHA+Tm8gdG9waWMgaXMgb2ZmLWxpbWl0cywgcHJvdmlkZWQgaXQgcmVsYXRlcyB0byBBbmRyb2lkIGluIHNvbWUgd2F5LgorSG93ZXZlciwgc2luY2UgdGhlc2UgYXJlIHZlcnkgYnVzeSBsaXN0cywgc2VhcmNoIHRoZSBhcmNoaXZlcyBiZWZvcmUgcG9zdGluZworeW91ciBxdWVzdGlvbjsgeW91IG1heSBmaW5kIHlvdXIgcXVlc3Rpb24gaGFzIGFscmVhZHkgYmVlbiBhbnN3ZXJlZC4KIDwvcD4KLTxoMj4KLU1haWxpbmcgbGlzdCBydWxlcwotPC9oMj4KLTxwPldlIGxvdmUgc2ltcGxpY2l0eSBhbmQgaGF0ZSByZXN0cmljdGlvbnMsIHNvIHdlIGtlZXAgb3VyIHBvbGljaWVzIG1pbmltYWwuIFRoZSBydWxlcyBiZWxvdyBkZXNjcmliZSB3aGF0J3MgZXhwZWN0ZWQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIEFuZHJvaWQgbWFpbGluZyBsaXN0cy4KKzxoMj5NYWlsaW5nIGxpc3QgcnVsZXM8L2gyPgorPHA+V2UgbG92ZSBzaW1wbGljaXR5IGFuZCBoYXRlIHJlc3RyaWN0aW9ucywgc28gd2Uga2VlcCBvdXIgcG9saWNpZXMgbWluaW1hbC4KK1RoZSBydWxlcyBiZWxvdyBkZXNjcmliZSB3aGF0J3MgZXhwZWN0ZWQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIEFuZHJvaWQgbWFpbGluZworbGlzdHMuCiA8L3A+CiA8dWw+PGxpPjxiPlBsZWFzZSBiZSBmcmllbmRseTwvYj4KLTxicj5TaG93aW5nIGNvdXJ0ZXN5IGFuZCByZXNwZWN0IHRvIG90aGVycyBpcyBhIHZpdGFsIHBhcnQgb2YgdGhlIEFuZHJvaWQgY3VsdHVyZSwgYW5kIHdlIGV4cGVjdCBldmVyeW9uZSBwYXJ0aWNpcGF0aW5nIGluIHRoZSBBbmRyb2lkIGNvbW11bml0eSB0byBqb2luIHVzIGluIGFjY2VwdGluZyBub3RoaW5nIGxlc3MuIEJlaW5nIGNvdXJ0ZW91cyBkb2VzIG5vdCBtZWFuIHdlIGNhbid0IGNvbnN0cnVjdGl2ZWx5IGRpc2FncmVlIHdpdGggZWFjaCBvdGhlciwgYnV0IGl0IGRvZXMgbWVhbiB0aGF0IHdlIG11c3QgYmUgcG9saXRlIHdoZW4gd2UgZG8gc28uIFRoZXJlJ3MgbmV2ZXIgYSByZWFzb24gdG8gYmUgYW50YWdvbmlzdGljIG9yIGRpc21pc3NpdmUgdG93YXJkIGFueW9uZTsgaWYgeW91IHRoaW5rIHRoZXJlIGlzLCB0aGluayBhZ2FpbiBiZWZvcmUgeW91IHBvc3QuPGJyPjxicj5Nb2JpbGUgZGV2ZWxvcG1lbnQgaXMgc2VyaW91cyBidXNpbmVzcywgYnV0IGl0J3MgYWxzbyBhIGxvdCBvZiBmdW4uIExldCdzIGtlZXAgaXQgdGhhdCB3YXkuIExldCdzIHN0cml2ZSB0byBiZSBvbmUgb2YgdGhlIGZyaWVuZGxpZXN0IGNvbW11bml0aWVzIGluIGFsbCBvZiBvcGVuIHNvdXJjZS48YnI+PGJyPjwvbGk+Cis8YnI+U2hvd2luZyBjb3VydGVzeSBhbmQgcmVzcGVjdCB0byBvdGhlcnMgaXMgYSB2aXRhbCBwYXJ0IG9mIHRoZSBBbmRyb2lkCitjdWx0dXJlLCBhbmQgd2UgZXhwZWN0IGV2ZXJ5b25lIHBhcnRpY2lwYXRpbmcgaW4gdGhlIEFuZHJvaWQgY29tbXVuaXR5IHRvIGpvaW4KK3VzIGluIGFjY2VwdGluZyBub3RoaW5nIGxlc3MuIEJlaW5nIGNvdXJ0ZW91cyBkb2VzIG5vdCBtZWFuIHdlIGNhbid0Citjb25zdHJ1Y3RpdmVseSBkaXNhZ3JlZSB3aXRoIGVhY2ggb3RoZXIsIGJ1dCBpdCBkb2VzIG1lYW4gdGhhdCB3ZSBtdXN0IGJlCitwb2xpdGUgd2hlbiB3ZSBkbyBzby4gVGhlcmUncyBuZXZlciBhIHJlYXNvbiB0byBiZSBhbnRhZ29uaXN0aWMgb3IgZGlzbWlzc2l2ZQordG93YXJkIGFueW9uZTsgaWYgeW91IHRoaW5rIHRoZXJlIGlzLCB0aGluayBhZ2FpbiBiZWZvcmUgeW91Citwb3N0Ljxicj48YnI+TW9iaWxlIGRldmVsb3BtZW50IGlzIHNlcmlvdXMgYnVzaW5lc3MsIGJ1dCBpdCdzIGFsc28gYSBsb3Qgb2YKK2Z1bi4gTGV0J3Mga2VlcCBpdCB0aGF0IHdheS4gTGV0J3Mgc3RyaXZlIHRvIGJlIG9uZSBvZiB0aGUgZnJpZW5kbGllc3QKK2NvbW11bml0aWVzIGluIGFsbCBvZiBvcGVuIHNvdXJjZS48YnI+PGJyPjwvbGk+CisKIDxsaT48Yj5BbGxvd2VkIGRpc2N1c3Npb24gdG9waWNzPC9iPgotPGJyPk1vc3QgdG9waWNzIGFyZSB0ZWNobmljYWwgZGlzY3Vzc2lvbnMgb2YgQW5kcm9pZCBvciB1c2VycyBoZWxwaW5nIGVhY2ggb3RoZXIsIGJ1dCB0aGlzIGdyb3VwIGlzIGludGVuZGVkIGZvciBkaXNjdXNzaW9ucyBvZjxpPmV2ZXJ5dGhpbmc8L2k+Ci1pbiB0aGUgd29ybGQgb2YgQW5kcm9pZC4gV2Ugd2VsY29tZSBhbm5vdW5jZW1lbnRzIGFuZCBkaXNjdXNzaW9uIG9mIHByb2R1Y3RzLCBsaWJyYXJpZXMsIHB1YmxpY2F0aW9ucywgYW5kIG90aGVyIGludGVyZXN0aW5nIEFuZHJvaWQtcmVsYXRlZCBuZXdzLiBXZSBldmVuIHdlbGNvbWUgKHBvbGl0ZSEpIGRpc2N1c3Npb24gb2YgYXJ0aWNsZXMgYW5kIGlkZWFzIGNyaXRpY2FsIG9mIEFuZHJvaWQtLWFmdGVyIGFsbCwgd2UgY2FuJ3QgaW1wcm92ZSBpZiB3ZSBkb24ndCBsaXN0ZW4uIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIHN1YmplY3QgbWF0dGVyLCBhbmQgd2UgZG9uJ3QgZXhjbHVkZSBkaXNjdXNzaW9ucyBvZiBjb21tZXJjaWFsIHByb2R1Y3RzIGlmIHVzZXJzIGFyZSBpbnRlcmVzdGVkIGluIHRhbGtpbmcgYWJvdXQgdGhlbS48YnI+PGJyPkhvd2V2ZXIsIHdlIGhhdGUgc3BhbSBhbG1vc3QgYXMgcGFzc2lvbmF0ZWx5IGFzIHdlIGxvdmUgY291cnRlc3kgYW5kIHJlc3BlY3QsIHNvIHdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGxpbWl0IGRpc2N1c3Npb25zIHRoYXQgYW1vdW50IHRvIHNwYW0uIE91dHJpZ2h0IHNwYW0gd2lsbCByZXN1bHQgaW4gdGhlIHNwYW1tZXIgYmVpbmcgaW1tZWRpYXRlbHkgYW5kIHBlcm1hbmVudGx5IGJhbm5lZCBmcm9tIHRoZSBsaXN0LgorPGJyPk1vc3Qgb2Ygb3VyIGdyb3VwcyBhcmUgZm9yIHRlY2huaWNhbCBkaXNjdXNzaW9ucyBvZiBBbmRyb2lkIG9yIHVzZXJzCitoZWxwaW5nIGVhY2ggb3RoZXIuIEdlbmVyYWxseSB3ZSBkb24ndCBwdXQgaGFyZCByZXN0cmljdGlvbnMgb24gdGhlIHRvcGljcworZGlzY3Vzc2VkIGluIHRoZSBncm91cDogYXMgbG9uZyBhcyB0aGUgdG9waWMgaXMgcmVsZXZhbnQgdG8gQW5kcm9pZCBpbiBzb21lCit3YXksIGl0J3Mgd2VsY29tZSBvbiBvdXIgZ3JvdXBzLiAgV2Ugd2VsY29tZSBhbm5vdW5jZW1lbnRzIGFuZCBkaXNjdXNzaW9uIG9mCitwcm9kdWN0cywgbGlicmFyaWVzLCBwdWJsaWNhdGlvbnMsIGFuZCBvdGhlciBpbnRlcmVzdGluZyBBbmRyb2lkLXJlbGF0ZWQgbmV3cywKK2J1dCA8Yj5wbGVhc2UgZG8gbm90IGNyb3NzLXBvc3Q8L2I+LiBQb3N0IG9ubHkgdG8gdGhlIG1vc3QgcmVsZXZhbnQgZ3JvdXAgZm9yCit5b3VyIG1lc3NhZ2UuIFdlIGV2ZW4gd2VsY29tZSAocG9saXRlISkgZGlzY3Vzc2lvbiBvZiBhcnRpY2xlcyBhbmQgaWRlYXMKK2NyaXRpY2FsIG9mIEFuZHJvaWQtLWFmdGVyIGFsbCwgd2UgY2FuJ3QgaW1wcm92ZSBpZiB3ZSBkb24ndCBsaXN0ZW4uPGJyPjxicj4KIDwvbGk+CisKKzxsaT48Yj5Xb3JraW5nIExpc3RzPC9iPgorPGJyPlNvbWUgb2Ygb3VyIGdyb3VwcyBhcmUgY29uc2lkZXJlZCAid29ya2luZyBsaXN0cyIsIGJ5IHdoaWNoIHdlIG1lYW4gdGhhdCB0aGUKK2xpc3QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBzdXBwb3J0IG9mIHRoZSBjb21wbGV0aW9uIG9mIHNwZWNpZmljIHRhc2tzLiBPbgordGhlc2UgZ3JvdXBzLCB3ZSBkb24ndCB3ZWxjb21lIG9mZi10b3BpYyBjb252ZXJzYXRpb25zLCBhbmQgd2lsbCBnZW5lcmFsbHkgYXNrCit5b3UgdG8gdGFrZSBnZW5lcmFsIGRpc2N1c3Npb25zIHRvIGEgZGlmZmVyZW50IGxpc3QuIFNpbmNlIHRoZXNlIGFyZSBsaXN0cword2hlcmUgcGVvcGxlIGFyZSB0cnlpbmcgdG8gZ2V0IHdvcmsgZG9uZSwgd2Ugd2lsbCBiZSBwcmV0dHkgYWdncmVzc2l2ZSBhYm91dAora2VlcGluZyB0aGUgbm9pc2UgbGV2ZWwgbG93LiBXZSBhc2sgdGhhdCB5b3UgcmVzcGVjdCBvdXIgY29udHJpYnV0b3JzJyB0aW1lCithbmQga2VlcCBnZW5lcmFsIGRpc2N1c3Npb25zIHRvIGFwcHJvcHJpYXRlIGxpc3RzLjxicj48YnI+Cis8L2xpPgorCis8bGk+PGI+U3BhbTwvYj4KKzxicj5XZSBoYXRlIHNwYW0gYWxtb3N0IGFzIHBhc3Npb25hdGVseSBhcyB3ZSBsb3ZlIGNvdXJ0ZXN5IGFuZCByZXNwZWN0LCBzbyB3ZQorcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gbGltaXQgZGlzY3Vzc2lvbnMgdGhhdCBhbW91bnQgdG8gc3BhbS4gT3V0cmlnaHQgc3BhbSB3aWxsCityZXN1bHQgaW4gdGhlIHNwYW1tZXIgYmVpbmcgaW1tZWRpYXRlbHkgYW5kIHBlcm1hbmVudGx5IGJhbm5lZCBmcm9tIHRoZSBsaXN0LgorPGJyPjxicj48L2xpPgogPC91bD4KLTxwPlRoZSBtb3N0IGltcG9ydGFudCBydWxlIGlzIGZyaWVuZGxpbmVzcy4gUmVtZW1iZXI6IGRpc3Jlc3BlY3QgYW5kIHJ1ZGVuZXNzIGFyZSBub3Qgd2VsY29tZSBpbiBvdXIgY29tbXVuaXR5IHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBXZSBkb24ndCBoYXZlIGEgZm9ybWFsIHBvbGljeSBvbiBkZWFsaW5nIHdpdGggdHJvdWJsZW1ha2VycywgYW5kIHdlIGhvcGUgd2UgbmV2ZXIgbmVlZCBvbmUuVGhhdCBzYWlkLCB3ZSBkbyBwbGVkZ2UgdG8gZG8gb3VyIGJlc3QgdG8gYmUgZmFpciwgYW5kIHdlIHdpbGwgYWx3YXlzIHRyeSB0byB3YXJuIHNvbWVvbmUgYmVmb3JlIGJhbm5pbmcgaGltIG9yIGhlci4KKworPHA+VGhlIG1vc3QgaW1wb3J0YW50IHJ1bGUgaXMgZnJpZW5kbGluZXNzLiBSZW1lbWJlcjogZGlzcmVzcGVjdCBhbmQgcnVkZW5lc3MKK2FyZSBub3Qgd2VsY29tZSBpbiBvdXIgY29tbXVuaXR5IHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBXZSBkb24ndCBoYXZlIGEKK2Zvcm1hbCBwb2xpY3kgb24gZGVhbGluZyB3aXRoIHRyb3VibGVtYWtlcnMsIGFuZCB3ZSBob3BlIHdlIG5ldmVyIG5lZWQKK29uZS5UaGF0IHNhaWQsIHdlIGRvIHBsZWRnZSB0byBkbyBvdXIgYmVzdCB0byBiZSBmYWlyLCBhbmQgd2Ugd2lsbCBhbHdheXMgdHJ5Cit0byB3YXJuIHNvbWVvbmUgYmVmb3JlIGJhbm5pbmcgaGltIG9yIGhlci4KIDwvcD4KIDxoMj4KIENvbnRhY3RpbmcgdGhlIG1vZGVyYXRvcnMKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbW11bml0eS9pbmRleC5qZCBiL3Bkay9kb2NzL2NvbW11bml0eS9pbmRleC5qZAppbmRleCA2ZTZmNTllLi40NmFkZjM3IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21tdW5pdHkvaW5kZXguamQKKysrIGIvcGRrL2RvY3MvY29tbXVuaXR5L2luZGV4LmpkCkBAIC0xLDcgKzEsNyBAQAotcGFnZS50aXRsZT1Db21tdW5pdHkKK3BhZ2UudGl0bGU9QW5kcm9pZCBDb21tdW5pdHkKIGRvYy50eXBlPWNvbW11bml0eQorZG9jLmhpZGVuYXY9dHJ1ZQogQGpkOmJvZHkKLTxoMT5BbmRyb2lkIENvbW11bml0eTwvaDE+CiA8cD5XZWxjb21lIHRvIHRoZSBBbmRyb2lkIGNvbW11bml0eSE8L3A+CiA8cD5UaGUga2V5IHRvIGFueSBjb21tdW5pdHkgaXMsIG9idmlvdXNseSwgY29tbXVuaWNhdGlvbi4gTGlrZSBtb3N0IHByb2plY3RzLAogQW5kcm9pZCBjb21tdW5pY2F0ZXMgdmlhIG1haWxpbmcgbGlzdHMuIEJlY2F1c2UgQW5kcm9pZCBpcyBhbiBleHRyZW1lbHkgbGFyZ2UKQEAgLTM3LDYgKzM3LDE0IEBACiAKIDxoMj5PcGVuIFNvdXJjZSBQcm9qZWN0IGRpc2N1c3Npb25zPC9oMj4KIDx1bD4KKzxsaT48Yj5hbmRyb2lkLXBsYXRmb3JtPC9iPjxici8+CitUaGlzIGxpc3QgaXMgZm9yIGdlbmVyYWwgZGlzY3Vzc2lvbiBhYm91dCB0aGUgQW5kcm9pZCBvcGVuLXNvdXJjZSBwcm9qZWN0IG9yCit0aGUgcGxhdGZvcm0gdGVjaG5vbG9naWVzLjxici8+PGJyLz4KK1N1YnNjcmliZSB1c2luZyBHb29nbGUgR3JvdXBzOiA8YQoraHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FuZHJvaWQtcGxhdGZvcm0iPmFuZHJvaWQtcGxhdGZvcm08L2E+PGJyLz4KK1N1YnNjcmliZSB2aWEgZW1haWw6IDxhIGhyZWY9Im1haWx0bzphbmRyb2lkLXBsYXRmb3JtK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tIj5hbmRyb2lkLXBsYXRmb3JtK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tPC9hPgorPC9saT4KKwogPGxpPjxiPmFuZHJvaWQtYnVpbGRpbmc8L2I+PGJyLz4KIFN1YnNjcmliZSB0byB0aGlzIGxpc3QgZm9yIGRpc2N1c3Npb24gYW5kIGhlbHAgb24gYnVpbGRpbmcgdGhlIEFuZHJvaWQgc291cmNlCiBjb2RlLCBhbmQgb24gdGhlIGJ1aWxkIHN5c3RlbS4gSWYgeW91J3ZlIGp1c3QgY2hlY2tlZCBvdXQgdGhlIHNvdXJjZSBjb2RlIGFuZApAQCAtNTgsMTQgKzY2LDE0IEBACiBTdWJzY3JpYmUgdmlhIGVtYWlsOiA8YSBocmVmPSJtYWlsdG86YW5kcm9pZC1wb3J0aW5nK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tIj5hbmRyb2lkLXBvcnRpbmcrc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb208L2E+CiA8L2xpPgogCi08bGk+PGI+YW5kcm9pZC1wbGF0Zm9ybTwvYj48YnIvPgotVGhpcyBsaXN0IGlzIGZvciBkZXZlbG9wZXJzIHdobyB3YW50IHRvIGNvbnRyaWJ1dGUgY29kZSB0byB0aGUgQW5kcm9pZAotdXNlci1zcGFjZSBwcm9qZWN0cywgc3VjaCBhcyB0aGUgY29yZSBzeXN0ZW0gbGlicmFyaWVzLCB0aGUgQW5kcm9pZAotc2VydmljZXMsIHRoZSBwdWJsaWMgQVBJcywgb3IgdGhlIGJ1aWx0LWluIGFwcGxpY2F0aW9ucy4gTm90ZTogY29udHJpYnV0b3JzCis8bGk+PGI+YW5kcm9pZC1jb250cmliPC9iPjxici8+CitUaGlzIGxpc3QgaXMgZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gY29udHJpYnV0ZSBjb2RlIHRvIEFuZHJvaWQuIFRoaXMgaXMgYQord29ya2luZyBsaXN0LCBhbmQgaXMgbm90IGFwcHJvcHJpYXRlIGZvciBnZW5lcmFsIGRpc2N1c3Npb24uIFdlIGFzayB0aGF0CitnZW5lcmFsIGRpc2N1c3Npb24gZ28gdG8gYW5kcm9pZC1wbGF0Zm9ybS4gIE5vdGU6IGNvbnRyaWJ1dG9ycwogdG8gdGhlIEFuZHJvaWQga2VybmVsIHNob3VsZCBnbyB0byB0aGUgYW5kcm9pZC1rZXJuZWwgbGlzdCwgYmVsb3cuPGJyLz48YnIvPgogU3Vic2NyaWJlIHVzaW5nIEdvb2dsZSBHcm91cHM6IDxhCi1ocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1wbGF0Zm9ybSI+YW5kcm9pZC1wbGF0Zm9ybTwvYT48YnIvPgotU3Vic2NyaWJlIHZpYSBlbWFpbDogPGEgaHJlZj0ibWFpbHRvOmFuZHJvaWQtcGxhdGZvcm0rc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb20iPmFuZHJvaWQtcGxhdGZvcm0rc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb208L2E+CitocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1jb250cmliIj5hbmRyb2lkLWNvbnRyaWI8L2E+PGJyLz4KK1N1YnNjcmliZSB2aWEgZW1haWw6IDxhIGhyZWY9Im1haWx0bzphbmRyb2lkLWNvbnRyaWIrc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb20iPmFuZHJvaWQtY29udHJpYitzdWJzY3JpYmVAZ29vZ2xlZ3JvdXBzLmNvbTwvYT4KIDwvbGk+CiAKIDxsaT48Yj5hbmRyb2lkLWtlcm5lbDwvYj48YnIvPgpAQCAtODgsMjcgKzk2LDM1IEBACiB1bmRlciAic3Vic2NyaWJlIHZpYSBlbWFpbCIgaW4gdGhlIGxpc3RzIGFib3ZlLjwvcD4KIDxwPlRvIHNldCB1cCBob3cgeW91IHJlY2VpdmUgbWFpbGluZyBsaXN0IHBvc3RpbmdzIGJ5IGVtYWlsOjwvcD4KIDxvbD4KLTxsaT5TaWduIGludG8gdGhlIGdyb3VwIHZpYSB0aGUgR29vZ2xlIEdyb3VwcyBzaXRlLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBhbmRyb2lkLWZyYW1ld29yayBncm91cCB5b3Ugd291bGQKLXZpc2l0IDxhCi1ocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1mcmFtZXdvcmsiPmh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWZyYW1ld29yazwvYT4uPC9saT4KKzxsaT5TaWduIGludG8gdGhlIGdyb3VwIHZpYSB0aGUgR29vZ2xlIEdyb3VwcyBzaXRlLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBhbmRyb2lkLXBsYXRmb3JtIGdyb3VwIHlvdSB3b3VsZAordmlzaXQgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FuZHJvaWQtcGxhdGZvcm0iPmh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLXBsYXRmb3JtPC9hPi48L2xpPgogPGxpPkNsaWNrICJFZGl0IG15IG1lbWJlcnNoaXAiIG9uIHRoZSByaWdodCBzaWRlLjwvbGk+CiA8bGk+VW5kZXIgIkhvdyBkbyB5b3Ugd2FudCB0byByZWFkIHRoaXMgZ3JvdXA/IiBzZWxlY3Qgb25lIG9mIHRoZSBlbWFpbCBvcHRpb25zLjwvbGk+CiA8L29sPgogCiA8aDI+QW5kcm9pZCBvbiBJUkM8L2gyPgotPHA+V2UgYWxzbyBoYXZlIGEgcHJlc2VuY2Ugb24gSVJDIHZpYSBGcmVlbm9kZS4gV2UgbWFpbnRhaW4gdHdvIG9mZmljaWFsIElSQwotY2hhbm5lbHMgb24gaXJjLmZyZWVub2RlLm5ldDo8L3A+Cis8cD5XZSBhbHNvIGhhdmUgYSBwcmVzZW5jZSBvbiBJUkMgdmlhIDxhIGhyZWY9Imh0dHA6Ly9mcmVlbm9kZS5uZXQvIj5mcmVlbm9kZTwvYT4uCitXZSBtYWludGFpbiB0d28gb2ZmaWNpYWwgSVJDIGNoYW5uZWxzIG9uCis8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyI+aXJjLmZyZWVub2RlLm5ldDwvYT4gKGFjY2VzcyB2aWEgdGhlIHdlYgorYXQgPGEgaHJlZj0iaHR0cDovL3dlYmNoYXQuZnJlZW5vZGUubmV0LyI+ZnJlZW5vZGUgd2ViY2hhdDwvYT4pOjwvcD4KIDx1bD4KLTxsaT48Yj4jYW5kcm9pZDwvYj4gLSBkZWRpY2F0ZWQgdG8gZ2VuZXJhbCBBbmRyb2lkIGRpc2N1c3Npb24gYW5kIHBvcnRpbmcgY29uY2VybnM8L2xpPgotPGxpPjxiPiNhbmRyb2lkLWRldjwvYj4gLSBkZWRpY2F0ZWQgdG8gZGlzY3Vzc2lvbiBhYm91dCB3cml0aW5nIEFuZHJvaWQgYXBwbGljYXRpb25zPC9saT4KKzxsaT48Yj48YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2FuZHJvaWQiPiNhbmRyb2lkPC9hPjwvYj4KKyAgICAmbWRhc2g7IGRlZGljYXRlZCB0byBnZW5lcmFsIEFuZHJvaWQgZGlzY3Vzc2lvbiBhbmQgcG9ydGluZyBjb25jZXJuczwvbGk+Cis8bGk+PGI+PGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC9hbmRyb2lkLWRldiI+I2FuZHJvaWQtZGV2PC9hPjwvYj4KKyAgICAmbWRhc2g7IGRlZGljYXRlZCB0byBkaXNjdXNzaW9uIGFib3V0IHdyaXRpbmcgQW5kcm9pZCBhcHBsaWNhdGlvbnM8L2xpPgogPC91bD4KIDxwPlRoZSBjaGFubmVscyBhYm92ZSBhcmUgb2ZmaWNpYWwuIFRoZXJlIGFyZSBhIGZldyBvdGhlciBjaGFubmVscyB0aGUKIGNvbW11bml0eSBpcyB1c2luZywgYnV0IGFyZSBub3Qgb2ZmaWNpYWwuIFRoZXNlIGFyZW4ndCBvZmZpY2lhbCBvciBvZmZpY2lhbGx5CiBtb2RlcmF0ZWQvbWFuYWdlZCwgc28geW91IHVzZSB0aGUgY2hhbm5lbHMgYmVsb3cgYXQgeW91ciBvd24gcmlzay4gVGhlIE9wZW4KIEhhbmRzZXQgQWxsaWFuY2UgZG9lc24ndCBlbmRvcnNlIHRoZXNlIGNoYW5uZWxzLCB0aGVyZSdzIG5vIHdhcnJhbnR5IGV4cHJlc3MKLW9yIGltcGxpZWQsIGFuZCBzbyBvbi4gVGhlcmUgbWF5IGJlIG1vcmUuPC9wPgorb3IgaW1wbGllZCwgYW5kIHNvIG9uLiBUaGVyZSBtYXkgYmUgbW9yZSBjaGFubmVscyB0aGFuIGp1c3QgdGhlc2UgbGlzdGVkLjwvcD4KIDx1bD4KLTxsaT48Yj4jYW5kcm9pZC1vZmZ0b3BpYzwvYj4gLSBmb3IsIHdlbGwsIG9mZi10b3BpYyBkaXNjdXNzaW9uczwvbGk+Ci08bGk+PGI+I2FuZHJvaWQtcm9vdDwvYj4gLSBmb3IgZGlzY3Vzc2lvbiByZWxhdGVkIHRvIG9mZi1sYWJlbCB1c2VzIG9mIGhhcmR3YXJlPC9saT4KLTxsaT48Yj4jYW5kcm9pZGZyYTwvYj4gLSBwb3VyIGRpc2N1dGVyIGQnQW5kcm9pZCBlbiBmcmFuw6dhaXM8L2xpPgorPGxpPjxiPjxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvYW5kcm9pZC1maXJlaG9zZSI+I2FuZHJvaWQtZmlyZWhvc2U8L2E+PC9iPgorICAgICZtZGFzaDsgZGlzcGxheXMgaW4gcmVhbC10aW1lIHRoZSBjb21taXRzIHRvIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Q8L2xpPgorPGxpPjxiPjxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvYW5kcm9pZC1mciI+I2FuZHJvaWQtZnI8L2E+PC9iPgorICAgICZtZGFzaDsgcG91ciBkaXNjdXRlciBkJ0FuZHJvaWQgZW4gZnJhbsOnYWlzPC9saT4KKzxsaT48Yj48YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2FuZHJvaWQtb2ZmdG9waWMiPiNhbmRyb2lkLW9mZnRvcGljPC9hPjwvYj4KKyAgICAmbWRhc2g7IGZvciwgd2VsbCwgb2ZmLXRvcGljIGRpc2N1c3Npb25zPC9saT4KKzxsaT48Yj48YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2FuZHJvaWQtcm9vdCI+I2FuZHJvaWQtcm9vdDwvYT48L2I+CisgICAgJm1kYXNoOyBmb3IgZGlzY3Vzc2lvbiByZWxhdGVkIHRvIG9mZi1sYWJlbCB1c2VzIG9mIGhhcmR3YXJlPC9saT4KIDwvdWw+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMS92ZXJzaW9ucy5qZCBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvMi4xL3ZlcnNpb25zLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODdhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMS92ZXJzaW9ucy5qZApAQCAtMCwwICsxLDE5IEBACitwYWdlLnRpdGxlPVBlcm1pdHRlZCBWZXJzaW9uIFN0cmluZ3MgZm9yIEFuZHJvaWQgMi4xCitkb2MudHlwZT1jb21wYXRpYmlsaXR5CitAamQ6Ym9keQorPHA+QXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLjIgb2YgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMS1jZGQucGRmIj5BbmRyb2lkIDIuMSBDb21wYXRpYmlsaXR5CitEZWZpbml0aW9uPC9hPiwgb25seSBjZXJ0YWluIHN0cmluZ3MgYXJlIGFsbG93YWJsZSBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0eQorPGNvZGU+YW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlJFTEVBU0U8L2NvZGU+LiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKK2FwcGxpY2F0aW9ucyBhbmQgd2ViIHNpdGVzIG1heSByZWx5IG9uIHByZWRpY3RhYmxlIHZhbHVlcyBmb3IgdGhpcyBzdHJpbmcsIGFuZAorc28gdGhhdCBlbmQgdXNlcnMgY2FuIGVhc2lseSBhbmQgcmVsaWFibHkgaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgQW5kcm9pZAorcnVubmluZyBvbiB0aGVpciBkZXZpY2VzLjwvcD4KKzxwPkJlY2F1c2Ugc3Vic2VxdWVudCByZWxlYXNlcyBvZiB0aGUgQW5kcm9pZCBzb2Z0d2FyZSBtYXkgcmV2aXNlIHRoaXMgc3RyaW5nLAorYnV0IG5vdCBjaGFuZ2UgYW55IEFQSSBiZWhhdmlvciwgc3VjaCByZWxlYXNlcyBtYXkgbm90IGJlIGFjY29tcGFuaWVkIGJ5IGEgbmV3CitDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQuIFRoaXMgcGFnZSBsaXN0cyB0aGUgdmVyc2lvbnMgdGhhdCBhcmUKK2FsbG93YWJsZSBieSBhbiBBbmRyb2lkIDIuMS1iYXNlZCBzeXN0ZW0uIFRoZSBvbmx5IHBlcm1pdHRlZCB2YWx1ZXMgZm9yCis8Y29kZT5hbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uUkVMRUFTRTwvY29kZT4gZm9yIEFuZHJvaWQgMi4xIGFyZTo8L3A+Cis8dWw+Cis8bGk+Mi4xPC9saT4KKzxsaT4yLjEtdXBkYXRlMTwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS8yLjIvdmVyc2lvbnMuamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMi92ZXJzaW9ucy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjUxNTZkCi0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS8yLjIvdmVyc2lvbnMuamQKQEAgLTAsMCArMSwyMCBAQAorcGFnZS50aXRsZT1QZXJtaXR0ZWQgVmVyc2lvbiBTdHJpbmdzIGZvciBBbmRyb2lkIDIuMgorZG9jLnR5cGU9Y29tcGF0aWJpbGl0eQorQGpkOmJvZHkKKzxwPkFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMi4yIG9mIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjItY2RkLnBkZiI+QW5kcm9pZCAyLjIgQ29tcGF0aWJpbGl0eQorRGVmaW5pdGlvbjwvYT4sIG9ubHkgY2VydGFpbiBzdHJpbmdzIGFyZSBhbGxvd2FibGUgZm9yIHRoZSBzeXN0ZW0gcHJvcGVydHkKKzxjb2RlPmFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5SRUxFQVNFPC9jb2RlPi4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0CithcHBsaWNhdGlvbnMgYW5kIHdlYiBzaXRlcyBtYXkgcmVseSBvbiBwcmVkaWN0YWJsZSB2YWx1ZXMgZm9yIHRoaXMgc3RyaW5nLCBhbmQKK3NvIHRoYXQgZW5kIHVzZXJzIGNhbiBlYXNpbHkgYW5kIHJlbGlhYmx5IGlkZW50aWZ5IHRoZSB2ZXJzaW9uIG9mIEFuZHJvaWQKK3J1bm5pbmcgb24gdGhlaXIgZGV2aWNlcy48L3A+Cis8cD5CZWNhdXNlIHN1YnNlcXVlbnQgcmVsZWFzZXMgb2YgdGhlIEFuZHJvaWQgc29mdHdhcmUgbWF5IHJldmlzZSB0aGlzIHN0cmluZywKK2J1dCBub3QgY2hhbmdlIGFueSBBUEkgYmVoYXZpb3IsIHN1Y2ggcmVsZWFzZXMgbWF5IG5vdCBiZSBhY2NvbXBhbmllZCBieSBhIG5ldworQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50LiBUaGlzIHBhZ2UgbGlzdHMgdGhlIHZlcnNpb25zIHRoYXQgYXJlCithbGxvd2FibGUgYnkgYW4gQW5kcm9pZCAyLjItYmFzZWQgc3lzdGVtLjwvcD4KKzxwPkN1cnJlbnRseSB0aGUgb25seSBwZXJtaXR0ZWQgdmFsdWUgZm9yCis8Y29kZT5hbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uUkVMRUFTRTwvY29kZT4gZm9yIEFuZHJvaWQgMi4yIGlzIHRoZSBzdHJpbmcKKyIyLjIiLjwvcD4KKzx1bD4KKzxsaT4yLjI8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0xLjYtY2RkLnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0xLjYtY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTdiNGFkCi0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTEuNi1jZGQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjEtY2RkLnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjEtY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU1NGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMS1jZGQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjItY2RkLnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjItY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMxZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMi1jZGQucGRmCkBAIC0wLDAgKzEsNDA4MCBAQAorJVBERi0xLjQNCislk4yLniBSZXBvcnRMYWIgR2VuZXJhdGVkIFBERiBkb2N1bWVudCBodHRwOi8vd3d3LnJlcG9ydGxhYi5jb20NCislICdCYXNpY0ZvbnRzJzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxIDAgb2JqDQorJSBUaGUgc3RhbmRhcmQgZm9udHMgZGljdGlvbmFyeQ0KKzw8IC9GMSAyIDAgUg0KKyAvRjIgNCAwIFINCisgL0YzIDEwNSAwIFINCisgL0Y0IDEwNyAwIFIgPj4NCitlbmRvYmoNCislICdGMSc6IGNsYXNzIFBERlR5cGUxRm9udCANCisyIDAgb2JqDQorJSBGb250IEhlbHZldGljYQ0KKzw8IC9CYXNlRm9udCAvSGVsdmV0aWNhDQorIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQorIC9OYW1lIC9GMQ0KKyAvU3VidHlwZSAvVHlwZTENCisgL1R5cGUgL0ZvbnQgPj4NCitlbmRvYmoNCislICdGb3JtWG9iLmEzMTEwMjkwOGE1OTJlOGY5NGM3YjRlMDMyZmZjYzM3JzogY2xhc3MgUERGSW1hZ2VYT2JqZWN0IA0KKzMgMCBvYmoNCis8PCAvQml0c1BlckNvbXBvbmVudCA4DQorIC9Db2xvclNwYWNlIC9EZXZpY2VSR0INCisgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9EQ1REZWNvZGUgXQ0KKyAvSGVpZ2h0IDQ5DQorIC9MZW5ndGggMTE1NDgNCisgL1N1YnR5cGUgL0ltYWdlDQorIC9UeXBlIC9YT2JqZWN0DQorIC9XaWR0aCAzNjkgPj4NCitzdHJlYW0NCitzNElBMCEiX2FsOE9gW1whPDwqIyEhKiciczVGLlk4T0dqUDpmOihZOFBEUFEhPEUwIyI3MEg4RSw1UlUhISRrUkZFMThMNjZLQjU9cysoJyEhMy0vISJKdUYhJyJDc0YpWEVBOmVVaWh6enp6enpwPTkzRXpkaywhSUUsNUxTenp6enp6enp6enohIk8kTz1ddGUqIUEiM04hIzAnSj1ddGUqIUMtVmIhIy9tRT1ddGUqIUU5JSEhIzBYIUUtKSdbIUdESDUhIy9wVkA6VD88IUlPa0khJWAuaTtGOkVhIU41dHUhIk5YQDtGOkVhIU9yKzAhIk5JOztGOkVhIVFZNkAhIk8wXkI2NCtSIVNAQVAhJi87JEJsM25OIVhKYyshJyJNI0YoNTFNIV5IX2MhK11WXUByMjJHIWksZXIhO15QTERlJmhKIi8jVm8hJTs+ckVjXzldIjM6SEIhJGtaTD1zKmVGelMjLS9jOU47Jm0hakdkMD1zKmVGejIuSFVkVEJjSVcpNm06SD1zKmVGei0tWkRpJ0BkJ19bYCk/Tz1zKmVGem9ATyREISEhISIoJ250bjFHU3ExISEhISIkYiQqOSJkXTJnbzJibmwjOlRXUXJSXylMcW1aVipyTUJQcCI1M19UXyJNOFxFY3FFX3ohISosRiEhJE1PRWNxRV96ISEqLEYhISRNT0VjcUVfeiEhKixGISElMVBCNjQrUnohISonImQ8Iz9nISEhISJ6ZDwjP2chISEhInpkPCM/ZyEhISEiISEkbklCbDNuTnohJitCUVcuNGpKO1pIZHQxZEQkQFdeJE9hLUM0XTQnJipCZDpkPiFcPCdVRWIxR10iNDFHXSI0MUdgUVFGKDUxTXohIik3bitBPlRmMEsoY2d6enp6enp6enp6enp6enp6enp6ISEka1BGXmtDT3ohIm84MyEiPGFTOi86aWkhIm84MyE5ZUJEOmZJRHAhIm84MyE5ZUtJO2FnWmQhIm84MyE5ZSQvN1MqUlshIm84MyE5ZHMlNnFbTFshIm84MyE5ZWBCNlZbVV0hIm84MyE5ZSQ4N1QnM2QhIm84MyE5ZTArOGwsS2YhIm84MyE5ZSEzPERya3QhIm84MyE5ZUI8OmVVaWghIm84MyE5ZUJENjtkZGAhIm84MyE5ZSE4NzhqMGQhIm84MyE5ZWBCPConJiIhIm84MyE5ZUhHO0gzXHMhIm84MyE5ZTM6OTJZYGkhIm84MyE5ZHMpNnElKFUhIm84MyE5ZTw6Oi50V2YhIm84MyE5ZS09OFE1WmkhIm84MyE5YURSISlOWTwhKSpBaCEmRlUvISZhZzchISRrUURlJmhKeiw0R1I0LUJKMy0hISdrUzg6VVs/enp6ISElK1BHXVdvYyEhI0IpRS1aSjxCNHVCMDYjXmRaQUxucnFESVk6TSs+UFcpMzw5KjwhJ2l0dEJrQD5GOWhiVTshISEhKSEhLmpoISFFOSUhISonIiEjYmg7ISEhISNURTUpciEhISEiISEhJT5URT4vcyEhISEiISEhIVJ6czRbTkAhITMwJSE8RTMmITxFMyYhV2lFKSI5U10sIVdpTi0iOVNjMiJVNS84IlUsJjYjNzFZPyM3KFA8IlVHSkEjUkxlRSQ0NnRCJE9kQ00kamQ3SiROSmlcNk5JNWkhV2lFKSJUbmkxJDNnWTwkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkND9nSyEiZko6MGBjN3IhP3FMRiZITXRHIVdVKDwqcmw5QSJUXFcpITxFMyR6ISEhISIhV3JRLyJwWUQ/JDRIbVAhNDxAPCFXYEIqIVgmVC8iVSJyLiEhLktLIVdyRSomSHJkajBnUSFXOy4wXFJFPjEwWk9lRSUqNkYiP0E7VU90WjFMYkJWI21xRmEoYD01PC03OjJqLlBzIkAyYE5mWTZVWEA0N24/M0Q7Y0hhdD0nL1UvQHE5Ll9CNHUhb0YqKVBKR0JlQ1pLN25yNUxQVWVFUCo7LHFRQyF1LFJcSFJRVjVDL2hXTio4MVsnZD9PXEBLMmZfbzBPNmEybEJGZGFRXnJmJThSLWc+ViZPalE1T2VraXFDJm8oMk1IcEBuQFhxWiJKNipydT9EITxFMyUhPEUzJSE8PCoiISEhISIhV3JRLyJwWUQ/JDRIbVAhNDxDPSFXYD8qIjlTYzMiVSJyLiE8UkhGITxOPzgiOWZyJyJxajQhI0BWVGMrdTRdVCdMSXFVWiwkX2sxSypdV0BXS2onKCprYHEtMU1jZykmYWhMLW4tVycyRSpUVTNeWjsoN1JwIUA4bEpcaDxgYEMrPiU7KVNBblBka0MzK0s+RydBMVZIQGdkJktuYkE9TTJJSVtQYS5RJFIkakQ7VVNPYGBWbDZTcFpFcHBHW15XY1ddIylBJ2BRI3M+YWlgJlxlQ0UuJWZcLCE8ajVmPWFrTk0wcW8oMk1IcEBuQFhxWiM3TCRqLU0xIVlHTUghJ15KXmVHLU5DMDF1IixuR2BGZmE0ZTRjcE0iOmM4OFBDbjE+TCwiTV0+Uzpvay9DYmxuV29oJiNGWW1wc1oqZjZoJzhtSU9dXmNka2khYyZQNy9OZ3RNT2VxYStNLiVBXkg5MStZW0ZgKjVlPCowTWkhSU5zNSluRTdiVCJfbyhablJQUDJOaFsuZzlHM19nTktvLWxMcjV1NFdcP1BvVzVwM0BqdHM4bD88JGJJbXUiaC1HX11ZOWNuQCNLWisvPSZoZ1ddNmhVU0JBT1hYWlFiNXV0RmYtPzBcYkFDIWhXazU0Pz9DSCcrWG87TyxqWkc/cjtMJXE0RFwpWCtgNGxVZmUsMGE5XWltIVA4KD8tayZtZGlPXFAlNE4/biluJFElOGI1RnAhbicpOkEhS2EnWGRUJDBKbmo6VypjcWVqJllaZmpCUidGZSg+LENHaiRHYnFQLDAlQzhPI15ASUc7akNKKiprXGBRYkdbQlJsR0Q/KTJiSCdQIU1vLko3SS5oYWJQS2ZBcCpFYE47L2hsJSpeYEBbJGNQTSZUUEMsZEoqWnAxWykqQ2l0a1ljLXNsPkkrbmdIZk8vTSlWNEMobmsjVUpJQjsxU1lNX0g6QSFzZGosLV4+RDgyRDhEbDJCW1I9PytTISwxNzNyI1hFSDlnXDBdKlpyL2RyZnVUWGRPMHR1SylPXD82SGxtQSs1UjFDJF9OZGVLPyxtYC5mSCdULVhNJjA/LXRoRnIjcFx1WmdhSXI4WnBrNilTISV0U2srT2xCPTpOb1FQIzxQMl06V3IyZj0iRHJLYi8sSHM5Z2c2V3JvXF1wPyFJLzk7PTVsLVE1LVotKzNFTlstKUE/bWwuMytITG1ePTVqYlddcUcvVGBFSm1rb1QrZlctaCxvW3JPZClvTm42UDI9Q1RkRihMVWxXN2JbYCc6IThQWUE8TCw8X0shUWQ0JD5jL2xmSUMxQVBGXUtQMURhQlhpNyU0LmUkW11LVTtaPFtkYl0zMiU7cT5MIl1iPkpaW3VWPT0xaEI5KjAtJyM5OzxVSjo5QSNrM3E6ZD9PRDY4SG5eVyFcdSMrZy9iWUJMQVpSTVpEMGg+TU0lXyRJVU5JJ0UkalwoP05XR1A0QjN1MF9xU01RSSJuPTQ/aVZCLzlJRDpPZyU9ajw3YkFAXilSOWIzaUQ6MCVoUDFkbyVwI2AuQChWa0IpJDJFTFVNKjw5VnJrJTBMQ3RLW1c5PEUpJkckMlVfMUZ0N0wpQ2NMUDJgPEVWYTAmQSVbWTcuWkgnUjlpZiFqZGNacic4KEZiTE4sNVFxaiE1UXFqXmtuNGpbRTJvWmFiXSFSVC1CXFwvXFYyWGZqXU5najZSL0BEPFg0XlAqQzZORUhaXUE9PEI3XV5pVGtvNDArPzEwZmQ8T1gtPjU3MVxqYDJdYGNDQWRHODFyV0pXOjFQQ109QUlyIWhWNydrcisobkhYa1pbRkZsNDdbXCQ5MnQpUEZAck5BZFAhQiYoYWwkZDhXSmVWaks5XSZrTUc2Uy1VcSlzZDAzNmR1RFZKSTlGSCwhJlU6TE9DPEBwL0pTZlFDI1k7RktLP0YlMlJlKVYrdWdZNiFaWjxLPzcoMCs3KSc9QDhda1xEbjouPGxJKCwhV3IsaVdMMWo+KVNIR1IrTiUpQjg9TFRfL1MuTVMvZ1JsM04laFE7Yy5WOCdXM1FgRy4hWE1sTCs6ai9UYkk1M1hSQCZXVCQsUUJRbUxDPjJIcihCL1RWRDlvTi5UOEo+PyJFSjA5KiJsIzBUYWxISSZTI148YV1fZm0uaV1vYV4sREAhXCEmQXNvIjZzWjU7T19dITkoQ2VFXSdKKjpPLnFMXV5hUHE3ISU9UyEhJT1TISElPVMhISU9UyEhJT1TISElPVMhISU9UyEhJT1TISElPVMhISU9UyEhOVg4MkhyZmB0XzdwOGpONGBeYV9WSmcrQD48SmlvJDhmZjY2SU5eaUU1WTlfT2JQXil1XjEraS9QWi5faTdXU240aEQiLC0/QDI3Uix0I0JSZl50KzhSMFJwTVVEaz1fVz0mZStFU3NkUHJBKGFzO11ZOmEyV2YoXVkmMnE9WkhWYDdfVTVpYz1yJC5RRDBmR1ovaFtDODZ1YGhjVkk1aCRkTWUuWlB0M2EhXkA4cDRNajFhL3B1Xm8+Oy9HPj90PmQkZ1MyPSFUT11dWDtPVDE7bWhBYyw5MjhzU2VwQWttSHNEaF83aD4vbkFeYVBtNzE1OTtgJDtlPkorc29kT0UhRVAiQlR1LEJhJkhqITEjZT41PkIkJDIlZT1EbkwiZilkKEEjZTAwWl1mSmBwWztIK15RTzlscnM0VSF0Mid1XGFAOjBqKzNgQzNrSDNoNGBLUVYpOFs8aTRzLmg8YistZV5fKTczZjFqKmxIS2JHclgndEBkbm5TJ1pJWloxWCZyVEtpRWtrKzoqUmdXYmIwVD5oXGVWLmY8S11scG8hJz1MKXBWYWE4UkMiL1o1PkBQJjEyYVhyNzV1YCYhLSJlL1glIjhIWUZQXlxCM0dLcDtUOyJSUmwpWzc2YkY/QShbIz9eViFkK0NHXlYlTCxGTiVtYUlYbT0jITctQWdaMXFZSloqb1JeaUswY1dSIVIwN1JsKHFTLDU6Q2cmNCtbL1hxQUQ0QUlEKUBdcXJyPjMoUVQ7c08yZ1o9dHJYKGFGRTlHRj5GL3AmJSJQbEhQKm9gQ18qXi9HUXJyPE4kOl0oVFhddDw1LFhmW1okVCssIi1nU0BdTEs0bVNASk50T3MsaUYhMzpaR2FecVxlV1o+WCxTY2AhMixwSlBEWmQmX1tnLipfTXAhIl1QO24hIk0ndGtKZ1FfXUkjRWZVJkNmKG91PlBcS05CSW5jLyV1Nj9ZQjsjRl0xciZJajpjWVFpJU8+aUk4SkM2KTg6Zik6XDtXWHM/dE5mYnVsR04wQjRCSmRTXVwhPCMiMlY+UEIvZEBrcHBuOCpQLWY8aWAlYDFIY1YrTGVjNCRWOEcvYV5gKm8pdFZCOCpVQ2heaTFqPGc6W24qRGVKY2psRXVxVnI4Yk5WMClDSGhQa1htO0VZYzVCVUosKSUsJix1WF5JYWU7czhNMk4wN2hCWW06UEAhXnBrblVEPHNdNFRLZ2MuZU5CSjghZXM9ZVRtJGpPKVVtbyZUVENEQz4iYjRvWWVVUic8LmVLb3E1SUFhZjUhOWpjKjx0Kl9hJjAtdThUQTZkKEZDbldeLEFsNS1tXzEpI1VGRTItYG0pXUA6Yzs1NTEmcyMzbW91MU1iMUFpYD1gPlNyUyFpcWdsbCkvciI9VCU1UEZVOlEqJCE8JHFBaDowdVB1TGJgRlI7SGg2cDVbdUI+JVA5JCI1KWlUZSRTZ25JZk8wVlVEayk0Rl07SmsqaVdGKixEb2NXOj1IXy1ZcWNoPVIzI0pmLnIwK01gXyhWNVgrLzBcIyxBdV9SUmFsJ2U5ISMoITghQmJGXk1XJC1PaTFrYCRQMyE+TmlWJ01qN0RGKm5GJSU8JW9hNDc5anN0WjkjT1NAYEhvXmBYaFtbOlBpIVs6M0MpM1RzaGlpOUYuX2FgWCcrcWNxIT8nZydqRUBeV3EiT1lpcGxGRTFfYFEwSmxKRFtrZE5aQWYwSnM3KFZqS2tQX3UsJiVRdCpMUkdCPjNiPzhpTztRIT5AWCcuYkpLKHM4LGxVcC86MWspXC87RFVtTGhiPSZyZEMvcVRgUUpGKj1UPnFKJVNlVFlnQjckaDwpSDplQzJCKTdGWyc9dCNnT2hPSkw2SGQ9TCQnWnVhTWlEbWxuZTFqWnRPPGojcmRWMyU3OShTISo+SjJEVzZsdG0zIi1cbSZCJXFQXWYlY3JyPSUxSTA4QzxyMFk6X3JhNllicmY0UmleW1AiRXEnKTkqckpgVzUhOWxBS0Q9K1pHaGhzNztBOEEyT2dDTVRYSnAnalQ7aTVHalgvKTZbRDErcCI4dSxiZTdZY2koNHE4K1gyYWsuKW9eLSZdVVxjVSNDUkNyKlltKXIoPTNPJidtZGcrMldTPFRII0VoNEwhOz8wPGptXlU4WTZGXWEoYCQzJWk7Ni1iYHJYRCpYNUtTYm1CJiNdSicoLWMmLFBzW3JyPldlVztjajc0J1FNIyEwPWwpbHUtOSdAQERHOVE3M1ZqXHNvSnUmX21wbEgoIlZXXEBybStUYGw5KjM1bFRbW18xK2wuPGczdDssK00rSEMlLyInUyFyMTYjVk0zVEspIT9cQmpmTkEsJihTVD5CRChyJT9oU246VCNFJ11wQDg5PSwhViVLSklyI29GZTojVUNMaitFXUhtZyJdYD1UMDk4b0RYaitOIz0pLkpOIm1raU4sYWFOVnVAIlhVKWQxUVtddDRiYSl0bykhVEFLQ1R1Widyal4yQGIndV1vJCc0QSUobHMrTzBuUzRmdCZ1T1tRX2pdbD1HSjtlIi1XMmBsXUEyYTtCOkpAQnBWLlwzK2hyUloyMidNTDpoSjRUZTBSUz02ZyRcJD9yYztmYklJS0czODlDNFVRRXRpaldwLTZwJC4mIWYtTWcyRHVUZWImK00lSF44THUyZF5RKCZKKXFyQSs4K29Lb1tiQzpVO102LSVIVl87QGlPUEJkT05IOFs1bzEzbjtqUiNybWRBOCEhaEtRUVtsNDstMGI5RmBSKi9rb1xsWGpMa3FuZCYqTkJCUGQkKCFfZEdBLmtdOHVIVEg9YTNvSWtzLXJyPFJBZGRBQk0/XiZdZ203N2kwakBeLj80aW9kQDo2Z1YzRm9NSGA7IyM4NyErL1dSa2tIW0FyT0JXJ2dwTVkucVIkOCZkSE91J0c/WVo6VHU8MXBvJF9ROjRsbUM1UWErMmZUM0s4b1Z0UCVPWz5MR2o5Wm08bklRTDNtJiZVO3QlZlpPZih0PUstKUY+YixbNTxIbkFjc1NSU3RNQG8jR04uKF4nQiU4bj85bSU+dUw6MylLIlRBbCQkblZNb0FNJzdLZktHVXVPT0ArUz5FKnJsYChJRHIpNi8hM2ZCJCE5ZC1gNjJwb2ZnbiMxVUdkPzVQP1NoKC1OKU9yRk5PIk4nZSklYlhVR0MqYmxCcltwWF50QmlSV1RVPk1HRFFzI3NwLSFiQmwxXFtzYS1tVXElLmNUJD9mQ2owKzE5IjZhbmhtdHBCYG1bIV9FPks3MjlXR2pPb1RCNzgpNWo9ZiU1aj1GbjgxJzVWJ1kmayssYDNIWShzIXBHXjJYKVBKcmUiam45OVZdMSckXkBiWCl1YiFcb24iYC11MTBMWD8mJGo5b1cjISspcjEhOWJXQE8iQVFHR2NpTz8wR0E2VDpsUTgzMjglcnMvJiZcWyRdTFJSajRfSlBuMVBaLmh1M2NKVmkoLWgkcSZzNDxxI29IbmszVysnI3RpT09jJERELGIvQmJCOUchMjNgaiZJYls3WDJYZ0dqTUomR1IlL15eRFBrMlxyVS1uS3FQaGAqZCpKYmBAWChNNFE4JSI4OVxRV0Anc000QmNuSnQ4LTljKk9uRGw3LnNbQmdwYjxeNXI5byJWcGZMSClTXSFYRVpDIlphWStxaCgodVtRZ1JmYTgwLjVha1JEa2xOZGBBTjVOMj9lazRrKEJsNldnWWlDUDhARm42TiJwdDJqMU5RJkA4RVgiTkwhKGNcLHBhQSJyWE00bGlZMyEsXlE3W0NgJ1NTaGAjISRhV2dHZylJJEtjaFArOElZSyJUSkpSWSlpU19VaDc3WF1MMFZfJS5jIy4wIW9VU19wTUltL2skNFRlWFRRUFYiTlVESEtib1xMR0VjQDdvQWRRcD4rL0ctQCFQWl9CJ0hlO20nQGdlXU9YXE51Sj9ML1Y+VSlFMW9gbWFpPjdDPlBQXSlEMSI+PD5ONEN1ImltP1ApUlxbam0oSWFUT2k4IW8zcy40XDBbRF1xKkFhNDpoPkBKY1wkWW9SaTxaUSZkUFgzK1ojWytCOmcnR1xAdEVGPyxiRihcPzYvbnFnPW9AIUAvTlIqUmJCXWAvJW5LbG0hdDxJcnI8OjxtPyxGKEdjWkIxQDUrJlc1TSUsMHB0O2ojZmdhS09haiJCMm0zZEBici9gajcsZDQ3Km0hbXJnP09wYl1OXCpXNjNrUSQxQFMqPlwuN3QrVlxKYj4yZ0BdclByV3BvIypeQFY6WF9oOTA+OiRqUmFIM2x1TksnRS9ZMyU6OCFQdW1vYEdtIS5gTUtdV20rTEEpWHQ/RTJpMClBVipSSE8jYy5rdCY4YSg/MCUkJlAlSExpZCkxSDU0RlQyJHJqMy51QVEhKzNhJ1xhTC9Ncl07J09gYEowSGRfYTA+JCUiTylidDVzQFc0LW5sSUlIQT5vN0xiaGwjVTFzclgoW0QnWSY6bHBqJnI0JjdRbEk4YEdfc0hCZVdubCcjQzNfOV5rL180TVBBR0FaN0dEW0w0dElGW1wpKWQtZDgsWHU8MytdR2s0bnRSMyVBJWQibFpQNlNCP05AX2lGRWxiSGhhcmcoMEU7LT9yYFR0cVhoNlE/bzNPN19kaiJlbEpyczdIL0ttczQsPktCJDRPXjAhXEArVlhTa2piLFklakFbKSEvLXFiXF9gVEM9Qy9QVUJzNGFOLDVOWm0zTEcwPiRmQ2VPRTRCXi5yVGNWNGNlWCRtMVxFPUpAN0EhR2BpSDhdP0MwUSErVzc9PEEpKy1RWkMiST5gXmJgLGspOVIxT11LK2RkX14uZVNac1xJdG1nLU5MZEVbak9HaycpP0JSNTghL2I4YVooLyNFXV9tQEliIzpjcFY0LCZfZVY/V0ZJIWVXWVhyO2QiIlVAYytLR1VcIkVCJyQ5T0hbXEJwTFI/SEEoU3UoQFxdO2IyIVhEJmtWcCI5bW00T08zWz8nLUg3Xj8uVGZxJGl1VVZsaCFZQ25ndFRKYW0nYztuWy0mcCI+blEmMDRUMyIuKT5IUztbbHRiWl1KbGhUVlRyZS5IYDZYKCkwSW5eMl1eKkMiRCEpNE4vaFcwJix1V0pJdGlELm5POVg5Mi4kbC8pRjsnKUA9bigvaix0XjMzISlEUC1qZF1GSmQtTTlhZks5XXBhQFkibD89clcpclFhUVg0YjtgPkdIWFZFWG0lbDFrbmA4XzhdWmtEdF1kdG9yUygnZWIiXmswOEFsUVxbOUZfYG1bUS46Rz9BdDQzVkFdV0QzWFctJyE4U0pCZy5TISMoXjlHZT5BPSooTVFGV0BUbSQpKG9cXVdqX1YmZidgN1lgYDhPTztTVTxNJGZhYXNtZm4uSm5EbyRAblN1KCRZJTk9amciSVFfQjVmVkdPb1BLKSxrNyNITzpSRVAhNWxqaSgmbjglaGM5W1ZecHBEQnIiTUYwRC1PZTA4dGhDOERoRyVNJlw/R3BrP2dcb2VlVic/SGVnOj9pXG8laSxZJFw3KVteQytEVmdjJCkiYiM8YDhgaFAyclpySyVnLmBNKVAuTz5cKmZNTy1USDI0Z0soYzo/ZFIzM1ArLCVzYTNYYmNuRj5yTXJyQ0cqZU5gT1UzcD9QWXJuUDZ0SU8iV25mPjRxQippI09lP2Q+bi5iQV4/XVVsZ1pQKTNqNWNNI19LXC1eJCFHcnJAWGk9UDhgQ3BtNGtvWjJMP1FfXCZNS2hsbjdjRjRWOVRpZzlBXVlkMCZFXlZgMygubko2Om9kISwrO3VyT2pqcGUjRkh1PGJIQUNvKWFvP0s0a19Yb2c+WHRnWkRWJlJrVjstSFNpWmhXIUVySDtRMiQ/XT8rMlVBM0pVNUpvUmw5JyJZaCJZPTttdG1ZRG1BJy9fUi5vMzlBdU4xOj1pKXM/WiRDNUhqY0FELz08NDAiMVFIXUI8Zi1dXHItNlpeSFgvUi1yTDEsVU09JzUnamRlIWtAMWo6bGg2WTNiRixsWUdvWlwtQFxYKlpgLypAWCcqIVM8R0M2YDlHYnBeR0Q+ZHJnPFAwcD11OHQwa2A6PCpWLzFaRDNLWURJUkJmITQ4TUtsVkVNaCtBJVVFSDknJ045PjE4WjdARGNRTlshLSk5JSIlaSpCRkVhNl01U0RcOzJxSGxmclBtJ1RLWyxaYmM0bnNKSkRjYSQrJ05FQlNpUz1wZioqPWQvYG0xZi41J3VhXElAOyM4ZGB0YT5MRU5AN2peMystOylec0ZrOTItJk1tbmY5LWRhcUhHTCUwZlQ6V05KOGcxKlhZcGhPQy8lb0xkJlswNCImQmVBSGlQbWpfKThKKVJsKXAnRD5cSzFWUnA6Zzw/aXA0cURfbyYmVm5EOSJFWDUzIyROSl50MlZjdSIlPEBxZDxcNCRSVy9CVSMnJj9nSlVcPGQ6WXBoWEpcXEBMMW1NTHBKTU4rOiRKaDUkZDFbc0olQltfN3NUXT1sRjxMVXFXak9sLjVqOF5xLSY+WyRAYmQqRTphLi1oTUgmJjxnKC8sTGZAIjMvJWxxITdHYD1SY29WRF8xOSZeNio6I0RCVWExamZUV1ViQEM6ZGdgM0leImBvV11yPDVXPCJ0cSs6aXBoN0NtVlAnMkQoUnA6X2o9YFY2Sk41Z3Asazstb0MtW1VyKzVCTDhAQHJSTE1vJSFARnBVYSdwSy5gVytfdSc5ITFvSiYyVmR0bFdOLFNvRmZvKyFSUnNHPldkSFpbOSI2ayNkaClHXjRXVUFyTjpTXHBuUWsuX1Q5QU9pO1dkJ1lIN0QxWTlTWDUiQ2JjPCxcOT1hIVE7VVxycERsImM+ZDIjZT5cYnJSJmhxdTklXVNPTyE3cyZtZTQramczXCpaXEo2OWBSYmFRPGksQD9saiNzU3VbKihGWUI9bHRzK0w3IlFlODheKjw0R3AvNlwpRXFqOjYtImM/YVQ3P2VKKWZoXDNYZ25bJC51KyRMZmw4cHE9KDdiVWhOW0NMal1CNmJMN0QrPlAmLlMnNWgpJ2lfKkkwJjskMkkuOT1nMjwkODhybVxhX1tFMkskPDcuaDEjJVQjOkc6WihfSCQpam8uNTpUWD9FQnMzJ28mZVFIP1MlMVVbKGtwTnRcVC46InFxZl9KPV5nMkZzZmcjKUxrZjcjMURHTiF0ck0iTFhjQWIlLiEjcGA/UVo6TWxUQD5vKixLbW1JUWs4ZVJlcG9YRVlJISMvKmkqNE5eW2JuRU9YKGhPMkBuQSFfUVNZakdGYW9aTThjZCdFOFxjNT9PMCEjcldwaD5lO29FLDZcVyNjXVgzLDxacSZvXDtNPURsPVxaR0wxXkNZS25XQ29eK0omP2JqaEJoWU1tJWFSXCRMOlR1by8wUDtwJGQ8QUlVWFVxY0IoRktlVWByPCoiaWA7Pz0zUkBDNEAtIS1CZTlkUE1tOCMzYFgxc3BYZCItVzNZKF4hS0shSjVmbmolJlotN2BQJmwycXFMWFV0QzJmLlxqMDFNJTRhQnEtMy4hS0ZNcm9fZlhQNk5uKWBFdVk9bUIocGVNUXRgSUlXWVNIdSFnI0clYSZsW2RfOSZSU3FjQ0k3WVAuIjpHQDJnU0ZfSDZQKS89JidWXCwxO0M5LF9dT1xcaFF1MSVNRV9VQyk+LVheJD1pOFBnSG9NNzg8RzBXYCwicyhnb01HODM6MmttSllKblFfLHI2YD8mY11uWEhMUCZwOiIpOC0xODBZa3JBQSJtSCxjZjF0UWcyYWFcLVFOaShLbSYpIS5EPWMtV3VCUHM1KkEjV2ZgJmk4OGVsV18tLmNiYi9OR1FZanBtdSJjI1VzNWdtbGg9NUNYS0ljMVB1OGJLaFdgUUwxc0BrZCYnTElDN1hhI0o7U19kbjE3aURTMFspOSNgNk50JCwmcjhNPmg6TyFdIV4hXTV1VzBkZFdfdGZuKkk3OSp1VDwtajRENFQ6TEVWQWpmUD8xZF1LcTRwP2BodW1eW08/KV9gNUk7QiRqYyk9J2JlaSVHdUohNWo5PEdnVW1wSEoxWmhCYiRySWxzTlhAQTsjUl4yTThaQGdSUzJaTmJkaS4uRlIuZSpBIlovSzJsTCs2RnM9a1FZZkpxamFMUC9dQ2NcRlxQaGVeSS9FZVBwXW5mZi9HT3FncnI+cGNhK2olPyNiZmBuTm9AKWxnLy5uQkA6M1VnQDZrN2AsaWUhKTknajwvSTAzYUUwQzhdPVg2ST4+ZE9vSUBJLVlEXGVyWzhlJ2o4bmcjYltCNGFoWmc5SDM3S0k3PEkvPz5XJC9eNUE4WyNpZnBuR0QlOTklcFhGKUxJLDhMb3JsOD1rcG8vUHNYJ1otV1lNay8nN1tLbFFxJS46Qlk0MFZXLUw/OGUzV2ptPWJAX1ttJS5YVFVPMiMsbExBSlpDWS1uOTAlL2BdLW5GUEpXZFRrRy1hVj5cUmlabjhhUHR0XGBHSUBcVXE/c3VePTJkdGZuKTRlclk3bys+JTomMUVJSihBdENRaEIkOENocWEhNmhfbko4YmBETjhsOTUtRzZHK0tjQiI5KGIqajdxOWNLU2RYSzw3Q088QD9GTCJKQG1eNm89OVdAb0c+NHQta3JNRyNGQmNkT2hkZEFbIy41JjprbzE1JEs4dGZnTTwhIiVKZ1o5XUNjOGtSYnBGXzctZEIqRWhyS11TRyE4ZiE1R0piTiw4JjRSJmxeJUQmcEglMC4vYFtETUhCbThbJGE7VzFlaThicWFRUUEwNjNzYzJrSC8xLmdiIkgqRVMvSzg9dSFxM15FU1hzYztjSTtTX0tDOkdBZEVcSXVtUippN2kidSRNXTg0Zj5cbUtyJChxN2oiJWtNcGA5OHUtMnNgZCo3Y2dGTC1WZVtiVDA7KyYtbV1McCRIKylmOGI0YHBeY0JBTC1IVj5EclY6M2dITSUsOVtCUVxQNlE1Ni0+PyJeYGAvbFoqOS9FRDducE1CLipaZzxjUmE7aWIrIilWW28rWUpQNDc7KlY0Ri0hZGRQRidXdTROLFovamRaNHNrWilyTT9rXzpQUTtCWmhDNW4jMU85L1JHak5iPCYwSF04O05EM2M+cS1LZHVpUDdeTTV1ZmhDNCpOPFJBQWJVMW9oVlwhZWJwVFhcOGsjKzppSSFLIUBEJUUqLS9bbU9LcDc5aGVpZVlBKiJtT2lYX0BcQl4yXEFnWTk9MStlO1FMPTU2ZVsqcUJtZEFjU0htUjNab0gvZDkpOjglXEcpR1MuX3RIbzNgNTthKDguZiEjZCIzZTFtN0luSnJyQkIsbTIrY0MqVScrJ0RZdXIkcGslTWI4PmBmKFEvYTtNXjJPLUVlW0BOSTwvKUNOaiw9b1FiKTVpX1NlbSxxS3UxXWxHdTpWckJ1NFIyZVlDPGZIOTg9cWcoYyliYV1bPzxhYVkqKjNkYzJJamt1VmhMIjttJl44a14jM01JLzEvWnBDOSxgPGNJRkQ7V1M3RVo/cCFXKEVXcGBKRyZTSlVZUUBJUydsNEAuc2Y6ZWFZXjpjdF1iUjdVSSJBaUNpYmFOPVYrWT01Qkk0WjoyXWRyJSFqPjEiclNEVyNiV0AkRzU1TkliLDIqUGhsPmBqckRDJzpwLV4+OHJYQTRDKV1kcktrODlgXVRUKWBNZmg/XiMqVmguKz5NPl08Z1lLcVpfOjtnLitqXmo0MnR1ImonO287Nl8zQFo3JSpYIWs9a1JJS1siUEgyRElDaEBcMWA7JjZcR1A/Zy1AUSs1ZV49QSRMaSROUz1WQnUpb2xhKzxQOGhzYUVLSl8qdEQ+ZiFPZVAxXmt0PkJoZ1suMl9cVG4/WldpOGJdQyppN0k+K25AUlY1VmBxYE9GTT5CJVJOaUJXZUxoVj1NREtpYSFbOSY8IyM2dS8zJF9TQztXJyozOV0kLldRPSFEbylBUWFbO2NXIVluVW5TK01iLE81UUY+OGBhXGRILWc9R2pUNU1BJzMqXTNDJ203JE8xYCorT0MwNWUvbz5GUyEmSE9bU0w6akgsUz03W0M/LTUzI0ApPFZtUllBcyldTV5PQC8tYFZFNyQuXyZiMiFPQ2o3aTtTPTJGJ2gsaC0pWDpsMWM2UiV0X2FbLnMhXyFDMF0xX1ZuL1g3RG5PbWwtSnJuKXJyQFxkJkFDOitiWlxWUG5FVEs5SV9YQmJDK1hIIU0hXGVaWXVPL0pAbidVInBMPT5Rbm90Mk0mVDMlV0liNFFQbkdgS0REWjErJUJKdDBhY2ZcVj4+PXRxLzg1bWBWUlJCc1A9TjFtXE9xMUtBNS9PJi42aUo3YywkQjs2Yi4zTCc/ckxGRWphdC1FXFdoQmZrMXN0Tik+YjRmPSJPclRJcjdJTnBzWzglaGdsYGA0ckN1XzxvNmBhTm9AKWxnLy8wIltqa1hEXHRoZ1lFU3RbbywvKkdFSmtNWGlrMVVRbmFUSk9PaiE6VCpWa1VvRyNFZEJMay4mV1dBREZGcFFXZE80Nl1rVSdDQDVjLlBhaCljLWdWSCdJaSpEYF8wWXMmXT5KaV1BJ18zVV9dQUBSKDREJG8rXjoqMTM2ajNLMyc4KmRnO2gjLjBfJSpAaGhKXzdMVixLa0haKl0jaXAobCglI0c1WGktYFU5Z2AnN1I+Nj40WGk3R1k+Pzt1LzIjcCdoWk9vJjouMyZuV2gwKTk2M1NzbScqNkBHJGpJIj9xOEJWTENdIiZQX0wtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1paVshVTVua0M1UXFqITVRcWohNVFxaiE1UXFqITVRcWohNVFxaiE1UXFqITVRcWohNVFxaiE1VGckWn4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnRjInOiBjbGFzcyBQREZUeXBlMUZvbnQgDQorNCAwIG9iag0KKyUgRm9udCBIZWx2ZXRpY2EtQm9sZA0KKzw8IC9CYXNlRm9udCAvSGVsdmV0aWNhLUJvbGQNCisgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCisgL05hbWUgL0YyDQorIC9TdWJ0eXBlIC9UeXBlMQ0KKyAvVHlwZSAvRm9udCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzUgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAobWFpbHRvOmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgNTUNCisgNjI2LjEyNQ0KKyAxNDUuMTM1DQorIDYzNy4zNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Ny4yNjM3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU2NC45Mzc1DQorIDExNy41Mjc1DQorIDU3Ni4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NTYuNTc2Mw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyA1NTMuNjg3NQ0KKyAxMTQuMTgyNQ0KKyA1NjQuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDU1DQorIDYxMy4zODg3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU0Mi40Mzc1DQorIDEwNy45MzUNCisgNTUzLjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MzAuMTENCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTI5LjE4NzUNCisgMTkwLjA0NQ0KKyA1NDAuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA1NQ0KKyA0MjAuOTg1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDUxNy45Mzc1DQorIDE3Mi4xMg0KKyA1MjkuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA1NQ0KKyAzNDQuNjc3NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNTA0LjY4NzUNCisgMTYxLjY4NzUNCisgNTE1LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNTUNCisgMjkxLjkyNzUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ5My40Mzc1DQorIDE3OC4zNjc1DQorIDUwNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTExIDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Mi44NjUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ4Mi4xODc1DQorIDE4NC42MjI1DQorIDQ5My40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMSAwIFINCisgL1hZWg0KKyA1NQ0KKyA2NzguODY1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0NjguOTM3NQ0KKyAyMjEuNzI1DQorIDQ4MC4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMSAwIFINCisgL1hZWg0KKyA1NQ0KKyAyNDYuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0NTcuNjg3NQ0KKyAxOTUuNDYNCisgNDY4LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTExIDAgUg0KKyAvWFlaDQorIDU1DQorIDE2MC4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTE1DQorIDQ0Ni40Mzc1DQorIDIwNi43MTc1DQorIDQ1Ny42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMyAwIFINCisgL1hZWg0KKyA1NQ0KKyA3MjIuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0MzUuMTg3NQ0KKyAyMDAuNDcNCisgNDQ2LjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTEzIDAgUg0KKyAvWFlaDQorIDU1DQorIDY1Ny4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDQyMS45Mzc1DQorIDE4MC4wMzI1DQorIDQzMy4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMyAwIFINCisgL1hZWg0KKyA1NQ0KKyAzMDYuOTIyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA0MTAuNjg3NQ0KKyAxNjAuMDIyNQ0KKyA0MjEuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTMgMCBSDQorIC9YWVoNCisgNTUNCisgMjE5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzk3LjQzNzUNCisgMTk3LjUzDQorIDQwOC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA1NQ0KKyA2MTQuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAzODYuMTg3NQ0KKyAxOTMuMzYNCisgMzk3LjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDU1DQorIDQ4NS43OTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDM3Mi45Mzc1DQorIDE5NC4yMDc1DQorIDM4NC4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA1NQ0KKyAyOTcuNDIyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAzNjEuNjg3NQ0KKyAxNTcuNTMyNQ0KKyAzNzIuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgNTQ4LjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzUwLjQzNzUNCisgMTk2LjI4NQ0KKyAzNjEuNjg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgNDUwLjQyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzM5LjE4NzUNCisgMTkxLjcwMjUNCisgMzUwLjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyMic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzI2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTI1IDAgUg0KKyAvWFlaDQorIDU1DQorIDM4NS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDMyNS45Mzc1DQorIDE0Ny45NA0KKyAzMzcuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgMjY2Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzE0LjY4NzUNCisgMTYxLjY5NQ0KKyAzMjUuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjI0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgMTU5LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzAzLjQzNzUNCisgMTQ0LjYxDQorIDMxNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzMyAwIFINCisgL1hZWg0KKyA1NQ0KKyA2NDUuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAyOTIuMTg3NQ0KKyAxNDMuMzU3NQ0KKyAzMDMuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjI2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzMgMCBSDQorIC9YWVoNCisgNTUNCisgNTkyLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMjgwLjkzNzUNCisgMTc0LjE5NzUNCisgMjkyLjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyNyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzMxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTMzIDAgUg0KKyAvWFlaDQorIDU1DQorIDQxOC4xMzg4DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDI2Ny42ODc1DQorIDE4OS42MjUNCisgMjc4LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzMyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTMzIDAgUg0KKyAvWFlaDQorIDU1DQorIDIwMC4yMDEzDQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDI1Ni40Mzc1DQorIDE5Ny4xMzI1DQorIDI2Ny42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzNCAwIFINCisgL1hZWg0KKyA1NQ0KKyA3NDcuMjYzNw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAyNDUuMTg3NQ0KKyAxNTkuNjAyNQ0KKyAyNTYuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzQgMCBSDQorIC9YWVoNCisgNTUNCisgNjc1LjIzNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAyMzEuOTM3NQ0KKyAxNDcuNTI3NQ0KKyAyNDMuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzUgMCBSDQorIC9YWVoNCisgNTUNCisgNjk4Ljc5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMjIwLjY4NzUNCisgMTU1LjAzNQ0KKyAyMzEuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzUgMCBSDQorIC9YWVoNCisgNTUNCisgNDgwLjE3MjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMjA5LjQzNzUNCisgMTQ3LjEyMjUNCisgMjIwLjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIzMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzM3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQxIDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Ny4yNjM3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDE5Ni4xODc1DQorIDE3NC4xOTc1DQorIDIwNy40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0MSAwIFINCisgL1hZWg0KKyA1NQ0KKyA1NzEuMzI2Mg0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAxODQuOTM3NQ0KKyAxNTUuODUyNQ0KKyAxOTYuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDEgMCBSDQorIC9YWVoNCisgNTUNCisgMzIwLjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMTcxLjY4NzUNCisgMTI0LjE4DQorIDE4Mi45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NiAwIFINCisgL1hZWg0KKyA1NQ0KKyA2MDcuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxNTguNDM3NQ0KKyAyNDQuNjQ1DQorIDE2OS42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NiAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MTEuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxNDcuMTg3NQ0KKyAxNzEuNjg1DQorIDE1OC40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NiAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NjkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxMzUuOTM3NQ0KKyAyMDUuMDUyNQ0KKyAxNDcuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM5JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDYgMCBSDQorIC9YWVoNCisgNTUNCisgNDA0Ljc5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMTIyLjY4NzUNCisgMTMxLjY5NQ0KKyAxMzMuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDYgMCBSDQorIC9YWVoNCisgNTUNCisgMjUzLjkyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMTExLjQzNzUNCisgMTcxLjcwNzUNCisgMTIyLjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0MSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQ1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ2IDAgUg0KKyAvWFlaDQorIDU1DQorIDE2NS4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDEwMC4xODc1DQorIDE2Mi4xMjI1DQorIDExMS40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0NiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0OCAwIFINCisgL1hZWg0KKyA1NQ0KKyA3MTAuMDQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA4OC45Mzc1DQorIDE2MS4yOQ0KKyAxMDAuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxJzogY2xhc3MgUERGUGFnZSANCis0NyAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDUgMCBSDQorIDYgMCBSDQorIDcgMCBSDQorIDggMCBSDQorIDkgMCBSDQorIDEwIDAgUg0KKyAxMSAwIFINCisgMTIgMCBSDQorIDEzIDAgUg0KKyAxNCAwIFINCisgMTUgMCBSDQorIDE2IDAgUg0KKyAxNyAwIFINCisgMTggMCBSDQorIDE5IDAgUg0KKyAyMCAwIFINCisgMjEgMCBSDQorIDIyIDAgUg0KKyAyMyAwIFINCisgMjQgMCBSDQorIDI1IDAgUg0KKyAyNiAwIFINCisgMjcgMCBSDQorIDI4IDAgUg0KKyAyOSAwIFINCisgMzAgMCBSDQorIDMxIDAgUg0KKyAzMiAwIFINCisgMzMgMCBSDQorIDM0IDAgUg0KKyAzNSAwIFINCisgMzYgMCBSDQorIDM3IDAgUg0KKyAzOCAwIFINCisgMzkgMCBSDQorIDQwIDAgUg0KKyA0MSAwIFINCisgNDIgMCBSDQorIDQzIDAgUg0KKyA0NCAwIFINCisgNDUgMCBSDQorIDQ2IDAgUiBdDQorIC9Db250ZW50cyAyMzcgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0NCisgL1hPYmplY3QgPDwgL0Zvcm1Yb2IuYTMxMTAyOTA4YTU5MmU4Zjk0YzdiNGUwMzJmZmNjMzcgMyAwIFIgPj4gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0Myc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQ4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ4IDAgUg0KKyAvWFlaDQorIDU1DQorIDU4My42NzI1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDczMC42Nzc1DQorIDExNS4wMTUNCisgNzQxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQ5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ4IDAgUg0KKyAvWFlaDQorIDU1DQorIDQxOS41NDc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDcxOS40Mjc1DQorIDE1Mi41Mw0KKyA3MzAuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQ1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDggMCBSDQorIC9YWVoNCisgNTUNCisgMzEwLjQyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNzA4LjE3NzUNCisgMTg1Ljg2DQorIDcxOS40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1MSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0OCAwIFINCisgL1hZWg0KKyA1NQ0KKyAxNjkuMjk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2OTYuOTI3NQ0KKyAxMjYuMjY1DQorIDcwOC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1MiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAzODguNTQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2ODUuNjc3NQ0KKyAxNTIuMTENCisgNjk2LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0OCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzUzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTUyIDAgUg0KKyAvWFlaDQorIDU1DQorIDMyMi42NzI1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDY3NC40Mjc1DQorIDEzNS40Mzc1DQorIDY4NS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAyNTYuNzk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2NjMuMTc3NQ0KKyAxMTkuNjA1DQorIDY3NC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAyMDIuMTcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2NTEuOTI3NQ0KKyAxMzguNzgyNQ0KKyA2NjMuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjUxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTIgMCBSDQorIC9YWVoNCisgNTUNCisgMTA0LjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNjQwLjY3NzUNCisgMTczLjc5MjUNCisgNjUxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1Mic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzU3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU0IDAgUg0KKyAvWFlaDQorIDU1DQorIDYxMi4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDYyOS40Mjc1DQorIDE5NS4wNjI1DQorIDY0MC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1OCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1NCAwIFINCisgL1hZWg0KKyA1NQ0KKyAzNDMuMTcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2MTguMTc3NQ0KKyAxMzUuNDUyNQ0KKyA2MjkuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTQgMCBSDQorIC9YWVoNCisgNTUNCisgMjIyLjM4ODgNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNjA0LjkyNzUNCisgMTY2LjI3NzUNCisgNjE2LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1NSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzYwIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvWFlaDQorIDU1DQorIDYzMi44ODg4DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU5My42Nzc1DQorIDE3Ny4xMTUNCisgNjA0LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzYxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvWFlaDQorIDU1DQorIDUzOC4zNg0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1ODAuNDI3NQ0KKyAxNDQuNjAyNQ0KKyA1OTEuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTkgMCBSDQorIC9YWVoNCisgNTUNCisgNDYxLjIzNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1NjkuMTc3NQ0KKyAxOTAuNDY1DQorIDU4MC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1OSAwIFINCisgL1hZWg0KKyA1NQ0KKyAzODQuMTENCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTU3LjkyNzUNCisgMTgyLjUyMjUNCisgNTY5LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1OSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzY0IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvWFlaDQorIDU1DQorIDMxOC4yMzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTQ2LjY3NzUNCisgMjE2LjczDQorIDU1Ny45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE2MiAwIFINCisgL1hZWg0KKyA1NQ0KKyA1OTEuMTM4Nw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyA1MzMuNDI3NQ0KKyAxNjEuMjgyNQ0KKyA1NDQuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjIgMCBSDQorIC9YWVoNCisgNTUNCisgNDUyLjk1MTMNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNTIyLjE3NzUNCisgMTQ4LjM3NQ0KKyA1MzMuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjIgMCBSDQorIC9YWVoNCisgNTUNCisgMjI2LjAxMzgNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNTEwLjkyNzUNCisgMTE5LjYwNQ0KKyA1MjIuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjMgMCBSDQorIC9YWVoNCisgNTUNCisgNzQ3LjI2MzcNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNDk5LjY3NzUNCisgMjAwLjA2NQ0KKyA1MTAuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UyJzogY2xhc3MgUERGUGFnZSANCis2OSAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDQ4IDAgUg0KKyA0OSAwIFINCisgNTAgMCBSDQorIDUxIDAgUg0KKyA1MiAwIFINCisgNTMgMCBSDQorIDU0IDAgUg0KKyA1NSAwIFINCisgNTYgMCBSDQorIDU3IDAgUg0KKyA1OCAwIFINCisgNTkgMCBSDQorIDYwIDAgUg0KKyA2MSAwIFINCisgNjIgMCBSDQorIDYzIDAgUg0KKyA2NCAwIFINCisgNjUgMCBSDQorIDY2IDAgUg0KKyA2NyAwIFINCisgNjggMCBSIF0NCisgL0NvbnRlbnRzIDIzOCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjY0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNzAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA0MTcuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDEyNS44Njc1DQorIDY2My44NjUNCisgMTcwLjA1DQorIDY3NS4xMTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2NSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgNDA0LjExNQ0KKyAwIF0NCisgL1JlY3QgWyAzMjYuMzY1DQorIDU2NS44NjUNCisgMzcwLjU0NzUNCisgNTc3LjExNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjY2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNzIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzOTAuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDMwOS42OTI1DQorIDUyMi42MTUNCisgMzUzLjg3NQ0KKyA1MzMuODY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjcnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzczIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIxMTkudHh0KSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4OS42MjUNCisgNDA1LjE3NzUNCisgMjk3LjE2NzUNCisgNDE2LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2OCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNzQgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5L2luZGV4Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjA1LjQ1DQorIDM5MS45Mjc1DQorIDM2OS42Nzc1DQorIDQwMy4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjknOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzc1IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2Ny45NjUNCisgMzc4LjY3NzUNCisgMjU0LjY3MjUNCisgMzg5LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3MCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNzYgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvcGFja2FnZXMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxODQuMjMyNQ0KKyAzNjUuNDI3NQ0KKyAzNjMuNDgyNQ0KKyAzNzYuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjcxJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis3NyAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb24uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNzIuOTUyNQ0KKyAzNTIuMTc3NQ0KKyA0MTMuODgyNQ0KKyAzNjMuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjcyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis3OCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTU3Ljk2DQorIDMzOC45Mjc1DQorIDM1OC44ODUNCisgMzUwLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3Myc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNzkgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5LzIuMi92ZXJzaW9ucy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4Ni43MTUNCisgMzI1LjY3NzUNCisgMzczLjQ1DQorIDMzNi45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNzQnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzgwIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNzEuNw0KKyAzMTIuNDI3NQ0KKyA0MDAuOTYNCisgMzIzLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3NSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorODEgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDk1LjAwNQ0KKyAyOTkuMTc3NQ0KKyAzMDcuMTU3NQ0KKyAzMTAuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc2JzogY2xhc3MgUERGRGljdGlvbmFyeSANCis4MiAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL3dpZGdldF9kZXNpZ24uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTQuNTI3NQ0KKyAyNzIuNjc3NQ0KKyAzNzQuMjMNCisgMjgzLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3Nyc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorODMgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvdWkvbm90aWZpZXJzL25vdGlmaWNhdGlvbnMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTQuOTQNCisgMjU5LjQyNzUNCisgMzQ2LjI5MjUNCisgMjcwLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3OCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorODQgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlZmVyZW5jZS9hdmFpbGFibGUtcmVzb3VyY2VzLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTQ4LjcwNQ0KKyAyNDYuMTc3NQ0KKyAzNjguOA0KKyAyNTcuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc5JzogY2xhc3MgUERGRGljdGlvbmFyeSANCis4NSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduLmh0bWwjc3RhdHVzYmFyc3RydWN0dXJlKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2Mi44ODc1DQorIDIzMi45Mjc1DQorIDQ3Ny4xOTc1DQorIDI0NC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODAnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzg2IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMjkuNTM1DQorIDIxOS42Nzc1DQorIDM3MS43MzI1DQorIDIzMC45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODEnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzg3IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvd2lkZ2V0L1RvYXN0Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgOTYuNjAyNQ0KKyAyMDYuNDI3NQ0KKyAzMTMuMzY3NQ0KKyAyMTcuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjgyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis4OCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Jlc291cmNlcy9hcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMjcuNDQyNQ0KKyAxOTMuMTc3NQ0KKyAzNTEuMjY1DQorIDIwNC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzg5IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hcHBzLWZvci1hbmRyb2lkKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDEyOS45NTUNCisgMTc5LjkyNzUNCisgMjY5LjE5MjUNCisgMTkxLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4NCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTAgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2luZGV4Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjQ1Ljg0NQ0KKyAxNjYuNjc3NQ0KKyA0NTMuODY1DQorIDE3Ny45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODUnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzkxIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2NC4xMzI1DQorIDE1My40Mjc1DQorIDM2NC42NDUNCisgMTY0LjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4Nic6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTIgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtaW50cm8uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTcuODU3NQ0KKyAxNDAuMTc3NQ0KKyAzNDkuMjAyNQ0KKyAxNTEuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjg3JzogY2xhc3MgUERGRGljdGlvbmFyeSANCis5MyAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvbW9ua2V5Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTM4LjcwNzUNCisgMTI2LjkyNzUNCisgMzU1LjA2DQorIDEzOC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODgnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk0IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE3OS45NjUNCisgMTEzLjY3NzUNCisgNDUyLjE3NzUNCisgMTI0LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4OSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTUgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTY3Ljg4MjUNCisgMTAwLjQyNzUNCisgMzg5LjIzDQorIDExMS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTAnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk2IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4NC45ODI1DQorIDg3LjE3NzUNCisgNDQzLjAyDQorIDk4LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMyc6IGNsYXNzIFBERlBhZ2UgDQorOTcgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyA3MCAwIFINCisgNzEgMCBSDQorIDcyIDAgUg0KKyA3MyAwIFINCisgNzQgMCBSDQorIDc1IDAgUg0KKyA3NiAwIFINCisgNzcgMCBSDQorIDc4IDAgUg0KKyA3OSAwIFINCisgODAgMCBSDQorIDgxIDAgUg0KKyA4MiAwIFINCisgODMgMCBSDQorIDg0IDAgUg0KKyA4NSAwIFINCisgODYgMCBSDQorIDg3IDAgUg0KKyA4OCAwIFINCisgODkgMCBSDQorIDkwIDAgUg0KKyA5MSAwIFINCisgOTIgMCBSDQorIDkzIDAgUg0KKyA5NCAwIFINCisgOTUgMCBSDQorIDk2IDAgUiBdDQorIC9Db250ZW50cyAyMzkgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5MSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTggMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTYxLjYxMjUNCisgNzMwLjY3NzUNCisgMzk2LjI4DQorIDc0MS45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTInOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk5IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTYxLjIwNzUNCisgNzE3LjQyNzUNCisgMzk1LjQ3DQorIDcyOC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwMCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTU3LjA1MjUNCisgNzA0LjE3NzUNCisgNDA3LjU4MjUNCisgNzE1LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5NCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTAxIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL3NlY3VyaXR5L3NlY3VyaXR5Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjIwLjM5NzUNCisgNjkwLjkyNzUNCisgNDI5LjY0NzUNCisgNzAyLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5NSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTAyIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY2thZ2Utc3VtbWFyeS5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDExOS45NTc1DQorIDY3Ny42Nzc1DQorIDM4OC44MjUNCisgNjg4LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEwMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM3Ny42MTUNCisgMCBdDQorIC9SZWN0IFsgNDYwLjYxNQ0KKyA0NjIuMzY1DQorIDUwNC43OTc1DQorIDQ3My42MTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5Nyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEwNCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM2NC4zNjUNCisgMCBdDQorIC9SZWN0IFsgNDcwLjk5NQ0KKyAzMTEuNzQNCisgNTE1LjE3NzUNCisgMzIyLjk5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnRjMnOiBjbGFzcyBQREZUeXBlMUZvbnQgDQorMTA1IDAgb2JqDQorJSBGb250IENvdXJpZXINCis8PCAvQmFzZUZvbnQgL0NvdXJpZXINCisgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCisgL05hbWUgL0YzDQorIC9TdWJ0eXBlIC9UeXBlMQ0KKyAvVHlwZSAvRm9udCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjk4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTA2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzUxLjExNQ0KKyAwIF0NCisgL1JlY3QgWyAzMzYuMjcyNQ0KKyAyNTguOTkNCisgMzgwLjQ1NQ0KKyAyNzAuMjQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdGNCc6IGNsYXNzIFBERlR5cGUxRm9udCANCisxMDcgMCBvYmoNCislIEZvbnQgVGltZXMtUm9tYW4NCis8PCAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuDQorIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQorIC9OYW1lIC9GNA0KKyAvU3VidHlwZSAvVHlwZTENCisgL1R5cGUgL0ZvbnQgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5OSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEwOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDMzNy44NjUNCisgMCBdDQorIC9SZWN0IFsgMzUwLjE5DQorIDE4Mi45OQ0KKyAzOTQuMzcyNQ0KKyAxOTQuMjQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlNCc6IGNsYXNzIFBERlBhZ2UgDQorMTA5IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgOTggMCBSDQorIDk5IDAgUg0KKyAxMDAgMCBSDQorIDEwMSAwIFINCisgMTAyIDAgUg0KKyAxMDMgMCBSDQorIDEwNCAwIFINCisgMTA2IDAgUg0KKyAxMDggMCBSIF0NCisgL0NvbnRlbnRzIDI0MCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2U1JzogY2xhc3MgUERGUGFnZSANCisxMTAgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAyNDEgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdQYWdlNic6IGNsYXNzIFBERlBhZ2UgDQorMTExIDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQ29udGVudHMgMjQyIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTEyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzI0LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzODEuNjENCisgMjYxLjY3NzUNCisgNDI1Ljc5MjUNCisgMjcyLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlNyc6IGNsYXNzIFBERlBhZ2UgDQorMTEzIDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTEyIDAgUiBdDQorIC9Db250ZW50cyAyNDMgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMDEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMTQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzMTEuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ0Ny4yNjUNCisgNjQ1LjY3NzUNCisgNDkxLjQ0NzUNCisgNjU2LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMDInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzMTEuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDE2MC40NTc1DQorIDUwNi40Mjc1DQorIDIwNC42NA0KKyA1MTcuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzExNiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM5MC44NjUNCisgMCBdDQorIC9SZWN0IFsgMTI1LjQ0NzUNCisgNDI5LjMwMjUNCisgMTY5LjYzDQorIDQ0MC41NTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTgnOiBjbGFzcyBQREZQYWdlIA0KKzExNyAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDExNCAwIFINCisgMTE1IDAgUg0KKyAxMTYgMCBSIF0NCisgL0NvbnRlbnRzIDI0NCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzExOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyOTguMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDUwMC4xNDc1DQorIDUwMy4wNTI1DQorIDU0OC41DQorIDUxNC4zMDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTE5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI4NC44NjUNCisgMCBdDQorIC9SZWN0IFsgNTE1LjE0NzUNCisgMzUyLjQyNzUNCisgNTUzLjA3NQ0KKyAzNjMuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwNic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyMCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyODQuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDU1DQorIDM0MS4xNzc1DQorIDYzLjM0DQorIDM1Mi40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTIxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI3MS42MTUNCisgMCBdDQorIC9SZWN0IFsgMzEzLjA0NQ0KKyAyMzMuOTI3NQ0KKyAzNjEuMzk3NQ0KKyAyNDUuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyMiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyNTguMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ0OC4wNg0KKyAyMDEuOTI3NQ0KKyA0OTYuNDEyNQ0KKyAyMTMuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyNDUuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEyNC42MTUNCisgMTkwLjY3NzUNCisgMTcyLjk2NzUNCisgMjAxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMjQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjMxLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMzIuNTM1DQorIDEyNi42Nzc1DQorIDE4MC44ODc1DQorIDEzNy45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTknOiBjbGFzcyBQREZQYWdlIA0KKzEyNSAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDExOCAwIFINCisgMTE5IDAgUg0KKyAxMjAgMCBSDQorIDEyMSAwIFINCisgMTIyIDAgUg0KKyAxMjMgMCBSDQorIDEyNCAwIFIgXQ0KKyAvQ29udGVudHMgMjQ1IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTExJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTI2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDIxOC42MTUNCisgMCBdDQorIC9SZWN0IFsgMjE3LjkwNzUNCisgNjEyLjE3NzUNCisgMjY2LjI2DQorIDYyMy40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTEyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTI3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDIwNS4zNjUNCisgMCBdDQorIC9SZWN0IFsgNzMuNzU3NQ0KKyA1NDguMTc3NQ0KKyAxMjIuMTENCisgNTU5LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMjggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTkyLjExNQ0KKyAwIF0NCisgL1JlY3QgWyAxODguMjk3NQ0KKyAzMTkuNDkNCisgMjM2LjY1DQorIDMzMC43NCBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAxNzguODY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ5OS41OTI1DQorIDE0OC44MDI1DQorIDU0Ny45NDUNCisgMTYwLjA1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTY1LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAyNTcuOTg3NQ0KKyAxMjguMDUyNQ0KKyAzMDYuMzQNCisgMTM5LjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTUyLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzNzMuMDM3NQ0KKyAxMjguMDUyNQ0KKyA0MjEuMzkNCisgMTM5LjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjk4LjExNQ0KKyAwIF0NCisgL1JlY3QgWyA0OTMuNTAyNQ0KKyAxMjguMDUyNQ0KKyA1NDEuODU1DQorIDEzOS4zMDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTEwJzogY2xhc3MgUERGUGFnZSANCisxMzMgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxMjYgMCBSDQorIDEyNyAwIFINCisgMTI4IDAgUg0KKyAxMjkgMCBSDQorIDEzMCAwIFINCisgMTMxIDAgUg0KKyAxMzIgMCBSIF0NCisgL0NvbnRlbnRzIDI0NiAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxMSc6IGNsYXNzIFBERlBhZ2UgDQorMTM0IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQ29udGVudHMgMjQ3IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTEyJzogY2xhc3MgUERGUGFnZSANCisxMzUgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAyNDggMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTc4Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMDcuMQ0KKyA2NjMuODY1DQorIDI1NS40NTI1DQorIDY3NS4xMTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTc4Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMzkuNjI3NQ0KKyA2MjguMTE1DQorIDI4Ny45OA0KKyA2MzkuMzY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTIwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTM4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDEzOS4xMTUNCisgMCBdDQorIC9SZWN0IFsgOTguMzQyNQ0KKyA1OTIuMzY1DQorIDE0Ni42OTUNCisgNjAzLjYxNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyMSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEzOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAxMjUuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDM5Mi43OTI1DQorIDMyOS42Nzc1DQorIDQ0MS4xNDUNCisgMzQwLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMjInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNDAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTEyLjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzMzIuNjEyNQ0KKyAyNjMuODAyNQ0KKyAzODAuOTY1DQorIDI3NS4wNTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTEzJzogY2xhc3MgUERGUGFnZSANCisxNDEgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxMzYgMCBSDQorIDEzNyAwIFINCisgMTM4IDAgUg0KKyAxMzkgMCBSDQorIDE0MCAwIFIgXQ0KKyAvQ29udGVudHMgMjQ5IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTIzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDk5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAyNzMuNTM1DQorIDcxOS40Mjc1DQorIDMyMS44ODc1DQorIDczMC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3NDIuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ2MC43NQ0KKyA0NzguMTc3NQ0KKyA1MDkuMTAyNQ0KKyA0ODkuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyNSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE0NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA5OS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMjU5LjQyDQorIDI2My4zMDI1DQorIDMwNy43NzI1DQorIDI3NC41NTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDk5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzODEuNzkNCisgMTc0LjY3NzUNCisgNDMwLjE0MjUNCisgMTg1LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMTQnOiBjbGFzcyBQREZQYWdlIA0KKzE0NiAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE0MiAwIFINCisgMTQzIDAgUg0KKyAxNDQgMCBSDQorIDE0NSAwIFIgXQ0KKyAvQ29udGVudHMgMjUwIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDk5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzMDQuNzg3NQ0KKyA2MTcuNTUyNQ0KKyAzNTMuMTQNCisgNjI4LjgwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMTUnOiBjbGFzcyBQREZQYWdlIA0KKzE0OCAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE0NyAwIFIgXQ0KKyAvQ29udGVudHMgMjUxIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MjkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDQyNS41Ng0KKyA1NzQuNDI3NQ0KKyA0NzMuOTEyNQ0KKyA1ODUuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE1MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNzE2LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyA0MzMuMDY3NQ0KKyAzMzIuMDUyNQ0KKyA0ODEuNDINCisgMzQzLjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcxNi4zNjUNCisgMCBdDQorIC9SZWN0IFsgMzk3LjYzNzUNCisgMjY2LjE3NzUNCisgNDQ1Ljk5DQorIDI3Ny40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE2JzogY2xhc3MgUERGUGFnZSANCisxNTIgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxNDkgMCBSDQorIDE1MCAwIFINCisgMTUxIDAgUiBdDQorIC9Db250ZW50cyAyNTIgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDY4OS44NjUNCisgMCBdDQorIC9SZWN0IFsgMTgwLjg5NQ0KKyAyODYuNjc3NQ0KKyAyMjkuMjQ3NQ0KKyAyOTcuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxNyc6IGNsYXNzIFBERlBhZ2UgDQorMTU0IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTUzIDAgUiBdDQorIC9Db250ZW50cyAyNTMgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTY0LjIyMjUNCisgNTcwLjI0DQorIDIxMi41NzUNCisgNTgxLjQ5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTMzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTU2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MDMuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDQ2NS41ODc1DQorIDQ5My4xMTUNCisgNTEzLjk0DQorIDUwNC4zNjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgMzQ1LjU1DQorIDM5My40OQ0KKyAzOTMuOTAyNQ0KKyA0MDQuNzQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgNTcuMDg1DQorIDMyNy42MTUNCisgMTA1LjQzNzUNCisgMzM4Ljg2NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxOCc6IGNsYXNzIFBERlBhZ2UgDQorMTU5IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTU1IDAgUg0KKyAxNTYgMCBSDQorIDE1NyAwIFINCisgMTU4IDAgUiBdDQorIC9Db250ZW50cyAyNTQgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNjAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA0MDQuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDMyMy40MQ0KKyA1MzkuNzQNCisgMzY3LjU5MjUNCisgNTUwLjk5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTM3JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxNjEgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAobWFpbHRvOmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTkzLjgzMjUNCisgMTc0LjYxNQ0KKyAyODMuOTY3NQ0KKyAxODUuODY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE5JzogY2xhc3MgUERGUGFnZSANCisxNjIgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxNjAgMCBSDQorIDE2MSAwIFIgXQ0KKyAvQ29udGVudHMgMjU1IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTIwJzogY2xhc3MgUERGUGFnZSANCisxNjMgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAyNTYgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdSMTY0JzogY2xhc3MgUERGQ2F0YWxvZyANCisxNjQgMCBvYmoNCislIERvY3VtZW50IFJvb3QNCis8PCAvT3V0bGluZXMgMTY2IDAgUg0KKyAvUGFnZU1vZGUgL1VzZU5vbmUNCisgL1BhZ2VzIDIzNiAwIFINCisgL1R5cGUgL0NhdGFsb2cgPj4NCitlbmRvYmoNCislICdSMTY1JzogY2xhc3MgUERGSW5mbyANCisxNjUgMCBvYmoNCis8PCAvQXV0aG9yICgpDQorIC9DcmVhdGlvbkRhdGUgKEQ6MjAxMDA4MDIxNDM0MTArMDgnMDAnKQ0KKyAvS2V5d29yZHMgKCkNCisgL1Byb2R1Y2VyIChwaXNhIEhUTUwgdG8gUERGIDxodHRwOi8vd3d3Lmh0bWx0b3BkZi5vcmc+KQ0KKyAvU3ViamVjdCAoKQ0KKyAvVGl0bGUgKEFuZHJvaWQgMi4yIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbikgPj4NCitlbmRvYmoNCislICdSMTY2JzogY2xhc3MgUERGT3V0bGluZXMgDQorMTY2IDAgb2JqDQorPDwgL0NvdW50IDExDQorIC9GaXJzdCAxNjcgMCBSDQorIC9MYXN0IDE2NyAwIFINCisgL1R5cGUgL091dGxpbmVzID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE2NyAwIG9iag0KKzw8IC9Db3VudCAtMTUNCisgL0Rlc3QgWyA0NyAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAxNjggMCBSDQorIC9MYXN0IDIzMCAwIFINCisgL1BhcmVudCAxNjYgMCBSDQorIC9UaXRsZSAoQW5kcm9pZCAyLjIgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE2OCAwIG9iag0KKzw8IC9EZXN0IFsgNDcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNjkgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvVGl0bGUgKFRhYmxlIG9mIENvbnRlbnRzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE2OSAwIG9iag0KKzw8IC9EZXN0IFsgOTcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzAgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAxNjggMCBSDQorIC9UaXRsZSAoMS4gSW50cm9kdWN0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3MCAwIG9iag0KKzw8IC9EZXN0IFsgOTcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzEgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAxNjkgMCBSDQorIC9UaXRsZSAoMi4gUmVzb3VyY2VzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3MSAwIG9iag0KKzw8IC9Db3VudCAtOA0KKyAvRGVzdCBbIDEwOSAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAxNzIgMCBSDQorIC9MYXN0IDE4OCAwIFINCisgL05leHQgMTk0IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTcwIDAgUg0KKyAvVGl0bGUgKDMuIFNvZnR3YXJlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3MiAwIG9iag0KKzw8IC9EZXN0IFsgMTA5IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTczIDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1RpdGxlICgzLjEuIE1hbmFnZWQgQVBJIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTczIDAgb2JqDQorPDwgL0NvdW50IC03DQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDE3NCAwIFINCisgL0xhc3QgMTgwIDAgUg0KKyAvTmV4dCAxODEgMCBSDQorIC9QYXJlbnQgMTcxIDAgUg0KKyAvUHJldiAxNzIgMCBSDQorIC9UaXRsZSAoMy4yLiBTb2Z0IEFQSSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3NCAwIG9iag0KKzw8IC9EZXN0IFsgMTA5IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTc1IDAgUg0KKyAvUGFyZW50IDE3MyAwIFINCisgL1RpdGxlICgzLjIuMS4gUGVybWlzc2lvbnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS40LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTc1IDAgb2JqDQorPDwgL0Rlc3QgWyAxMDkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzYgMCBSDQorIC9QYXJlbnQgMTczIDAgUg0KKyAvUHJldiAxNzQgMCBSDQorIC9UaXRsZSAoMy4yLjIuIEJ1aWxkIFBhcmFtZXRlcnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS40LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTc2IDAgb2JqDQorPDwgL0Rlc3QgWyAxMTEgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzcgMCBSDQorIC9QYXJlbnQgMTczIDAgUg0KKyAvUHJldiAxNzUgMCBSDQorIC9UaXRsZSAoMy4yLjMuIEludGVudCBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3NyAwIG9iag0KKzw8IC9EZXN0IFsgMTExIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTc4IDAgUg0KKyAvUGFyZW50IDE3MyAwIFINCisgL1ByZXYgMTc2IDAgUg0KKyAvVGl0bGUgKDMuMi4zLjEuIENvcmUgQXBwbGljYXRpb24gSW50ZW50cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjQuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxNzggMCBvYmoNCis8PCAvRGVzdCBbIDExMSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE3OSAwIFINCisgL1BhcmVudCAxNzMgMCBSDQorIC9QcmV2IDE3NyAwIFINCisgL1RpdGxlICgzLjIuMy4yLiBJbnRlbnQgT3ZlcnJpZGVzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC41JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3OSAwIG9iag0KKzw8IC9EZXN0IFsgMTExIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTgwIDAgUg0KKyAvUGFyZW50IDE3MyAwIFINCisgL1ByZXYgMTc4IDAgUg0KKyAvVGl0bGUgKDMuMi4zLjMuIEludGVudCBOYW1lc3BhY2VzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC42JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4MCAwIG9iag0KKzw8IC9EZXN0IFsgMTEzIDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAxNzMgMCBSDQorIC9QcmV2IDE3OSAwIFINCisgL1RpdGxlICgzLjIuMy40LiBCcm9hZGNhc3QgSW50ZW50cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODEgMCBvYmoNCis8PCAvRGVzdCBbIDExMyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE4MiAwIFINCisgL1BhcmVudCAxNzEgMCBSDQorIC9QcmV2IDE3MyAwIFINCisgL1RpdGxlICgzLjMuIE5hdGl2ZSBBUEkgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODIgMCBvYmoNCis8PCAvQ291bnQgLTINCisgL0Rlc3QgWyAxMTMgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMTgzIDAgUg0KKyAvTGFzdCAxODQgMCBSDQorIC9OZXh0IDE4NSAwIFINCisgL1BhcmVudCAxNzEgMCBSDQorIC9QcmV2IDE4MSAwIFINCisgL1RpdGxlICgzLjQuIFdlYiBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4MyAwIG9iag0KKzw8IC9EZXN0IFsgMTEzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTg0IDAgUg0KKyAvUGFyZW50IDE4MiAwIFINCisgL1RpdGxlICgzLjQuMS4gV2ViVmlldyBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNS4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4NCAwIG9iag0KKzw8IC9EZXN0IFsgMTE3IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAxODIgMCBSDQorIC9QcmV2IDE4MyAwIFINCisgL1RpdGxlICgzLjQuMi4gQnJvd3NlciBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4NSAwIG9iag0KKzw8IC9EZXN0IFsgMTE3IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTg2IDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1ByZXYgMTgyIDAgUg0KKyAvVGl0bGUgKDMuNS4gQVBJIEJlaGF2aW9yYWwgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuNSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODYgMCBvYmoNCis8PCAvRGVzdCBbIDExNyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE4NyAwIFINCisgL1BhcmVudCAxNzEgMCBSDQorIC9QcmV2IDE4NSAwIFINCisgL1RpdGxlICgzLjYuIEFQSSBOYW1lc3BhY2VzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy42JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4NyAwIG9iag0KKzw8IC9EZXN0IFsgMTI1IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTg4IDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1ByZXYgMTg2IDAgUg0KKyAvVGl0bGUgKDMuNy4gVmlydHVhbCBNYWNoaW5lIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjcnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTg4IDAgb2JqDQorPDwgL0NvdW50IC01DQorIC9EZXN0IFsgMTI1IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDE4OSAwIFINCisgL0xhc3QgMTkzIDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1ByZXYgMTg3IDAgUg0KKyAvVGl0bGUgKDMuOC4gVXNlciBJbnRlcmZhY2UgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjYuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODkgMCBvYmoNCis8PCAvRGVzdCBbIDEyNSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE5MCAwIFINCisgL1BhcmVudCAxODggMCBSDQorIC9UaXRsZSAoMy44LjEuIFdpZGdldHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS42LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTkwIDAgb2JqDQorPDwgL0Rlc3QgWyAxMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxOTEgMCBSDQorIC9QYXJlbnQgMTg4IDAgUg0KKyAvUHJldiAxODkgMCBSDQorIC9UaXRsZSAoMy44LjIuIE5vdGlmaWNhdGlvbnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS42LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTkxIDAgb2JqDQorPDwgL0Rlc3QgWyAxMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxOTIgMCBSDQorIC9QYXJlbnQgMTg4IDAgUg0KKyAvUHJldiAxOTAgMCBSDQorIC9UaXRsZSAoMy44LjMuIFNlYXJjaCkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjYuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxOTIgMCBvYmoNCis8PCAvRGVzdCBbIDEzMyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE5MyAwIFINCisgL1BhcmVudCAxODggMCBSDQorIC9QcmV2IDE5MSAwIFINCisgL1RpdGxlICgzLjguNC4gVG9hc3RzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNi40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5MyAwIG9iag0KKzw8IC9EZXN0IFsgMTMzIDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAxODggMCBSDQorIC9QcmV2IDE5MiAwIFINCisgL1RpdGxlICgzLjguNS4gTGl2ZSBXYWxscGFwZXJzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5NCAwIG9iag0KKzw8IC9EZXN0IFsgMTMzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTk1IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTcxIDAgUg0KKyAvVGl0bGUgKDQuIFJlZmVyZW5jZSBTb2Z0d2FyZSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi41JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5NSAwIG9iag0KKzw8IC9EZXN0IFsgMTMzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTk2IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTk0IDAgUg0KKyAvVGl0bGUgKDUuIEFwcGxpY2F0aW9uIFBhY2thZ2luZyBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi42JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5NiAwIG9iag0KKzw8IC9Db3VudCAtMw0KKyAvRGVzdCBbIDEzNCAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAxOTcgMCBSDQorIC9MYXN0IDE5OSAwIFINCisgL05leHQgMjAwIDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTk1IDAgUg0KKyAvVGl0bGUgKDYuIE11bHRpbWVkaWEgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjcuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxOTcgMCBvYmoNCis8PCAvRGVzdCBbIDEzNCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE5OCAwIFINCisgL1BhcmVudCAxOTYgMCBSDQorIC9UaXRsZSAoNi4xLiBNZWRpYSBDb2RlY3MpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTk4IDAgb2JqDQorPDwgL0Rlc3QgWyAxMzUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxOTkgMCBSDQorIC9QYXJlbnQgMTk2IDAgUg0KKyAvUHJldiAxOTcgMCBSDQorIC9UaXRsZSAoNi4yLiBBdWRpbyBSZWNvcmRpbmcpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTk5IDAgb2JqDQorPDwgL0Rlc3QgWyAxMzUgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDE5NiAwIFINCisgL1ByZXYgMTk4IDAgUg0KKyAvVGl0bGUgKDYuMy4gQXVkaW8gTGF0ZW5jeSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuNyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMDAgMCBvYmoNCis8PCAvRGVzdCBbIDE0MSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIwMSAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDE5NiAwIFINCisgL1RpdGxlICg3LiBEZXZlbG9wZXIgVG9vbCBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi44JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwMSAwIG9iag0KKzw8IC9Db3VudCAtMTYNCisgL0Rlc3QgWyAxNDEgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjAyIDAgUg0KKyAvTGFzdCAyMjAgMCBSDQorIC9OZXh0IDIyMSAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIwMCAwIFINCisgL1RpdGxlICg4LiBIYXJkd2FyZSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwMiAwIG9iag0KKzw8IC9Db3VudCAtMw0KKyAvRGVzdCBbIDE0MSAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyMDMgMCBSDQorIC9MYXN0IDIwNSAwIFINCisgL05leHQgMjA2IDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1RpdGxlICg4LjEuIERpc3BsYXkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS45LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjAzIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMDQgMCBSDQorIC9QYXJlbnQgMjAyIDAgUg0KKyAvVGl0bGUgKDguMS4yLiBOb24tU3RhbmRhcmQgRGlzcGxheSBDb25maWd1cmF0aW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjkuMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMDQgMCBvYmoNCis8PCAvRGVzdCBbIDE0NiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIwNSAwIFINCisgL1BhcmVudCAyMDIgMCBSDQorIC9QcmV2IDIwMyAwIFINCisgL1RpdGxlICg4LjEuMy4gRGlzcGxheSBNZXRyaWNzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOS4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwNSAwIG9iag0KKzw8IC9EZXN0IFsgMTQ2IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAyMDIgMCBSDQorIC9QcmV2IDIwNCAwIFINCisgL1RpdGxlICg4LjEuNC4gRGVjbGFyZWQgU2NyZWVuIFN1cHBvcnQpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjA2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNDYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMDcgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMDIgMCBSDQorIC9UaXRsZSAoOC4yLiBLZXlib2FyZCkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMDcgMCBvYmoNCis8PCAvRGVzdCBbIDE0NiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIwOCAwIFINCisgL1BhcmVudCAyMDEgMCBSDQorIC9QcmV2IDIwNiAwIFINCisgL1RpdGxlICg4LjMuIE5vbi10b3VjaCBOYXZpZ2F0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwOCAwIG9iag0KKzw8IC9EZXN0IFsgMTQ2IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjA5IDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1ByZXYgMjA3IDAgUg0KKyAvVGl0bGUgKDguNC4gU2NyZWVuIE9yaWVudGF0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwOSAwIG9iag0KKzw8IC9EZXN0IFsgMTQ4IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjEwIDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1ByZXYgMjA4IDAgUg0KKyAvVGl0bGUgKDguNS4gVG91Y2hzY3JlZW4gaW5wdXQpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjUnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEwIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTEgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMDkgMCBSDQorIC9UaXRsZSAoOC42LiBVU0IpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjYnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjExIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTIgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTAgMCBSDQorIC9UaXRsZSAoOC43LiBOYXZpZ2F0aW9uIGtleXMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjcnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEyIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTMgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTEgMCBSDQorIC9UaXRsZSAoOC44LiBXaXJlbGVzcyBEYXRhIE5ldHdvcmtpbmcpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjgnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEzIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTQgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTIgMCBSDQorIC9UaXRsZSAoOC45LiBDYW1lcmEpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjknOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTUgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTMgMCBSDQorIC9UaXRsZSAoOC4xMC4gQWNjZWxlcm9tZXRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMTAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTYgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTQgMCBSDQorIC9UaXRsZSAoOC4xMS4gQ29tcGFzcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMTEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTcgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTUgMCBSDQorIC9UaXRsZSAoOC4xMi4gR1BTKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4xMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMTcgMCBvYmoNCis8PCAvRGVzdCBbIDE1MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIxOCAwIFINCisgL1BhcmVudCAyMDEgMCBSDQorIC9QcmV2IDIxNiAwIFINCisgL1RpdGxlICg4LjEzLiBUZWxlcGhvbnkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjEzJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIxOCAwIG9iag0KKzw8IC9EZXN0IFsgMTUyIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjE5IDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1ByZXYgMjE3IDAgUg0KKyAvVGl0bGUgKDguMTQuIE1lbW9yeSBhbmQgU3RvcmFnZSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMTQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE5IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTQgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjAgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTggMCBSDQorIC9UaXRsZSAoOC4xNS4gQXBwbGljYXRpb24gU2hhcmVkIFN0b3JhZ2UpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjE1JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIyMCAwIG9iag0KKzw8IC9EZXN0IFsgMTU0IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAyMDEgMCBSDQorIC9QcmV2IDIxOSAwIFINCisgL1RpdGxlICg4LjE2LiBCbHVldG9vdGgpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjknOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjIxIDAgb2JqDQorPDwgL0Rlc3QgWyAxNTQgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjIgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAyMDEgMCBSDQorIC9UaXRsZSAoOS4gUGVyZm9ybWFuY2UgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjIyIDAgb2JqDQorPDwgL0NvdW50IC00DQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDIyMyAwIFINCisgL0xhc3QgMjI2IDAgUg0KKyAvTmV4dCAyMjcgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAyMjEgMCBSDQorIC9UaXRsZSAoMTAuIFNlY3VyaXR5IE1vZGVsIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIyMyAwIG9iag0KKzw8IC9EZXN0IFsgMTU5IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjI0IDAgUg0KKyAvUGFyZW50IDIyMiAwIFINCisgL1RpdGxlICgxMC4xLiBQZXJtaXNzaW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjI0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjUgMCBSDQorIC9QYXJlbnQgMjIyIDAgUg0KKyAvUHJldiAyMjMgMCBSDQorIC9UaXRsZSAoMTAuMi4gVUlEIGFuZCBQcm9jZXNzIElzb2xhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjI1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjYgMCBSDQorIC9QYXJlbnQgMjIyIDAgUg0KKyAvUHJldiAyMjQgMCBSDQorIC9UaXRsZSAoMTAuMy4gRmlsZXN5c3RlbSBQZXJtaXNzaW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjI2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTkgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDIyMiAwIFINCisgL1ByZXYgMjI1IDAgUg0KKyAvVGl0bGUgKDEwLjQuIEFsdGVybmF0ZSBFeGVjdXRpb24gRW52aXJvbm1lbnRzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMjcgMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIyOCAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIyMiAwIFINCisgL1RpdGxlICgxMS4gQ29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMjggMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIyOSAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIyNyAwIFINCisgL1RpdGxlICgxMi4gVXBkYXRhYmxlIFNvZnR3YXJlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMjkgMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzMCAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIyOCAwIFINCisgL1RpdGxlICgxMy4gQ29udGFjdCBVcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjMwIDAgb2JqDQorPDwgL0NvdW50IC01DQorIC9EZXN0IFsgMTYzIDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDIzMSAwIFINCisgL0xhc3QgMjM1IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMjI5IDAgUg0KKyAvVGl0bGUgKEFwcGVuZGl4IEEgLSBCbHVldG9vdGggVGVzdCBQcm9jZWR1cmUpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzMSAwIG9iag0KKzw8IC9EZXN0IFsgMTYzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjMyIDAgUg0KKyAvUGFyZW50IDIzMCAwIFINCisgL1RpdGxlIChTZXR1cCBhbmQgSW5zdGFsbGF0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTEuMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMzIgMCBvYmoNCis8PCAvRGVzdCBbIDE2MyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzMyAwIFINCisgL1BhcmVudCAyMzAgMCBSDQorIC9QcmV2IDIzMSAwIFINCisgL1RpdGxlIChUZXN0IEJsdWV0b290aCBDb250cm9sIGJ5IEFwcHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMS4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzMyAwIG9iag0KKzw8IC9EZXN0IFsgMTYzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjM0IDAgUg0KKyAvUGFyZW50IDIzMCAwIFINCisgL1ByZXYgMjMyIDAgUg0KKyAvVGl0bGUgKFRlc3QgUGFpcmluZyBhbmQgQ29tbXVuaWNhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjM0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNjMgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMzUgMCBSDQorIC9QYXJlbnQgMjMwIDAgUg0KKyAvUHJldiAyMzMgMCBSDQorIC9UaXRsZSAoVGVzdCBQYWlyaW5nIGFuZCBDb21tdW5pY2F0aW9uIGluIHRoZSBSZXZlcnNlIERpcmVjdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjM1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNjMgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDIzMCAwIFINCisgL1ByZXYgMjM0IDAgUg0KKyAvVGl0bGUgKFRlc3QgUmUtTGF1bmNoZXMpID4+DQorZW5kb2JqDQorJSAnUjIzNic6IGNsYXNzIFBERlBhZ2VzIA0KKzIzNiAwIG9iag0KKyUgcGFnZSB0cmVlDQorPDwgL0NvdW50IDIwDQorIC9LaWRzIFsgNDcgMCBSDQorIDY5IDAgUg0KKyA5NyAwIFINCisgMTA5IDAgUg0KKyAxMTAgMCBSDQorIDExMSAwIFINCisgMTEzIDAgUg0KKyAxMTcgMCBSDQorIDEyNSAwIFINCisgMTMzIDAgUg0KKyAxMzQgMCBSDQorIDEzNSAwIFINCisgMTQxIDAgUg0KKyAxNDYgMCBSDQorIDE0OCAwIFINCisgMTUyIDAgUg0KKyAxNTQgMCBSDQorIDE1OSAwIFINCisgMTYyIDAgUg0KKyAxNjMgMCBSIF0NCisgL1R5cGUgL1BhZ2VzID4+DQorZW5kb2JqDQorJSAnUjIzNyc6IGNsYXNzIFBERlN0cmVhbSANCisyMzcgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMTc5NiA+Pg0KK3N0cmVhbQ0KK0dhdG08OWxvJkkmQTxHMXJyTDBJZGllR0hhL3IrbFVtWDkjJzw9XDhddGJtPVVTUzUiVT9wIjpjW3FCbDtSJmUhYzwwLGNPQjtMcG4qU2o1LW1KLk5nXSw1KlRwSVMtaVxhL2hVIkxEX0pIX0tKVEtkJWQtWFlVTWglI2JRMG5yVTUyTTpgPDRmPm85MyRrKE1NPSssNz9yampHLilmPTVkOzRYZmBVRmMtcEZFK0NxQlxgMWs4Kjghcjw6SUY2YUwuU2VOXkxXWUlmUk5MUlVtKyo3SzpfNU9gL3NpXSQ4Pm5hLiItNydiLCtgRz1lKnM0RCtnMzJNO2ksWj9JMjNoLDwsOD9bXm9TQl40Y18sR0duZ0hAW10raWkkVyNxa2NfZSc/IzRkXi03SkRza0FjMDsldEQ0USxkXV5HPGpPS1lKMy9QISNzMWImUFQmam9FNTdwX2ZlMmQ2RlspQjImXWtASGB0XlkjSm82OWtCYzNrWmxHLkQmUXBNJlYoQDdiSyhxaV1pYXRMXTVhSiJTPVw3IlBbR1hqUXREMXFSI29NaU1bRWAxM1hMMiwhQSZTLz01VE5OZ2JlNSUtN05EV1AyRlYqQ0RXNypEc0lKIlpgNkBaSjJNQG5Ya2cqM0VVMS4vXU5gWSw7dE9TbF1CWixHaUdDWiJeS3NhSEEwcyVXLUVxJ09MYTwhND5RPz42QyQuS3FgKCtHRjElMlgpR0NRS21fLDM5IU45YHNiYnJRXD8jbWhraytKTzkkIT5VcFpIamFIZCorV2RQPD1AcEtWRE8hRlNMTD83YnVqR2JLXXRYSCxmQkVgSFhKQlBSI2QvKSM8VG8/UC9jMHE7c1o7TCE7P0BmTD0lQl5bTXI8M3AiMjZhZD9VN11HS1QuZW1KbThZJG5ScUBAZ2dENE0kVCVsbXEzdUQ/TGYucy9JdEZ0PnAoOSRtbzZEKVxqVTF0RGhnQTEqXlxFXTB1UmxgVV1RNDssblY6OCIvXSJbRlFqVzFGWVRPTUFLOks0IzMkZyY+Yy8hMEo/ZC9KMCNIPDBpc00vWUM6PyVjMj1RJEdhTlddNkVhdSpePnEyYjxdJFlFREtYV0I2PjRjcHBfIkIsNiZxVTgmQ2AhIVAkOFcrRV5EYCJuUi5gNj4paixkc1NkWjkvO09sMDNgMDNJayRBaDRKLixOZkBNTmI3UW9QYWZpWUg2NDpDcGc5OlR0SlpmJklRPTptRXRpTlguOycuUGtdTyFIT0BDamRdP01iO0RQcU4hM1M+X2IhTjUiYSM/ISYpQnMsPV9qVVoyQVk+XFlab2VkRFBeciIjYXJWaycmQnNrS2c5IVA+NlFyJS5vXyJFU09Db2hCNTVYamFjbWVIJCFUWSxzZ1Iubm1hJjtcQ0o9cTlKcVgxamlaQmgjKWNwMGNYVFVhJStQUmg+YkswIy9QOnRQSj1mOCdaYSJrS3UzX3VUST09XUFgJjFFLjRYTWY8Qm9cNHFkR3FGOTlabFZyIThUTGljOS5TaEtfVDhkVkVZZkpuK2dtRDdlWldNdDBoanVmNmUoYnBESFNVO0pqLFdGPCteOlRubTglMDs3dVI2XCcuTVZ0VCdxQyg1akFnNVchcUF0KVVoJmIrOU9DJUtxZD5GS2I0Y0YsSzdVJ2BdXWJzNlZQJjs7dFZzPFdxInEoQiJmay9QTjJWcDVxPyRsOUZWLEFUMzgrVlA7Pk9rPmttJUM3OS5sMVhXSGlkVldsKUYpbVNAKU9gSCM6OnNrdCQ8IkJtUE48YjUtJE4zNEZWRS4zZShQUCdVY0YpK1ksazo7ZShHNWt0Wj9mNnRWKDJJRyRXQV5xQilwYjZcI0M6UGU+NiM8UVAlKnBtSnIhbCxYOkUkaTFRR0shYVNpIzBuRGRYNyNyKD9DPTQvJltoMTM3MHEpJ3U6WzU4XEJlMylTWWNcLSxgbEldLHBeNzZnRCVRamE6JUw/WDVLS1JpJkI4NW1fM2w6aFU8bCg0V3AuKC5lV2c6dSFaQT03PCxPK1xJayJOU1V0cCxoJyxjM3BcLjs5bURtQDthMy1lZkRvKmUwN0RVdGpcNzYoSFxPNm01TCcoKmxLTHFEXT9yZEgsbTUiaj0waXI9Wl4lTmleIWxJTzpiKUhFK2hRPGRKZypVMj8xMkskKUFxY1dcOCVhXXNNUjtsQyEoO2ZbU1cuOj9gXGdqNiQyN2hNQzxuOSw/SjdecT8qakY3cFYrOi9sIz1lcF5TK1RsYDpITlFWM0JNbC9rIS5tWmN1cmNHbCM1L2gzJXRLbik7OEFbcFA4QCMyTj9OLDJmTE9eMiUwKjtTYWFPb0pHXjJQJidqQ00jclwkXk8rWyxWU1tHRnVSa1YuQGUhJzdjQmFXXH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjIzOCc6IGNsYXNzIFBERlN0cmVhbSANCisyMzggMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggOTQ2ID4+DQorc3RyZWFtDQorR2F0PSltbl9bbCZILlg9czU/LlpQTk1cKDMpMlpTcGBaR2E/allRTU9JRD5wYCRLRFNycUYlNzFoZGdhVko5KCFRWzpwUnE3VUREOi1aLGNHbS8vT19OLlV1b0g6Z0wkczNNbzAvdU5OI0VTU3BmNXFVVGs6bkNrWlA/IipOcEBPR2dkYi9Vb0FrRiZgUC5GRTsoKlFoITBQWkE+Ly4qZFJIUjdgcWVLZzVgVlUjLD9WJXJibElZYFQ+ZWFPWWgrV1cyXCFHY2Q8WmNnYDliKHEta25QRVlNYiQvPCtfTWU2JjFKZFVNPCdnYD4lQz4ocFA2TmkwRmg1TmxPKmNnY1k0RmZBLTxiVms0JzBhZGVJTDtJOk5JMElHOXJmRCYuKnNNdVo1a3A9JypmYzJzV3BxVG9MSUAsR1Q2WWBPYmQxNGZwWmhlMiIrKSxYOVIpTSozM2hlNzRxMThfLToyS2toI21oTWZDJWs0UT9OUW5Ia1syWT0mUz80VSdjcDFbUmozNkM0IjEwaD49TktESTNPM0I6ZSxhPy1DaD85RFFlPjpsYj1uVUZHWWxUNyJWaWNlO2AoTFJEJSJDUGFsJCdiQkFHWmFvdW1SXDFcZEE8V2xcTS9PWVx1QEYiNWMpOGY/Lz1KV05MZkM3X2guckslYzBmaUAkcmw4KHRGMVw1cyEwOmAoREsqdF1EQWRNVSdLdUUxJVJqZl9cVFspYGxaSC0rRlBNQmYxcVYyRUdLVk5SXU43Ui0/KXQ4RFFETDNYK2RHOyZkXFcoJmsoRUhrWkZPVUpPJTooKzQpMktDI1UrNnI0Tik8XmhsYE8zLlZqZjA6RjElYHQuO2snTDBbJ0svMVoxOnEtN1dAWlBRciJOV2xkJ19wZnRvaHA2dDpkUnU+QjJwVHVxZllUVmBJalpGSGBcIVA5SExlUlpXOUovUkdcZjwlOyRKUCpRTVJGZ05abS1xaCFsJGBbW0wwWl5GUFtuZUgpalJnWDpaaWVyajNmSz5JSSIkVC4hOkI1OmpwW2xIQ1k5R3AqQXAncWB1TzdBSzBAZWBORDs3XUAnPnJuYGduVEZVT1NILVRKOk1HPE5jJV88VjhNKXNCXG45VWt1QDA7KFJScnRWPDMmPjJxMjY/SURHMj0tLig1NVVJOlVIbkRIcUxtKEQ1ZVoqR05QPVtHVUxBcy5iLGxoJUdeO1wkYjxwTVZvOSNgX1k6bU48dVxKZlNNJmJMb2FZLDRFcHNUTkxrY1F+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyMzknOiBjbGFzcyBQREZTdHJlYW0gDQorMjM5IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDMyNDcgPj4NCitzdHJlYW0NCitHYXVITj5CQTwoJnE2YTlzLklMdS89XT5ucWkqT0JRYTlaLS9rYj1YJidIQ29AciNcYFlxOUotKTAxMylCdXFFVzRkajZbOTNfVS9IdGciJllQISVJQ15aWyNhM3QiLSkrJjdSYUVWPkBiPThmQVo8WmFqZmElMDhtLm4hVnFUIT5ncEtWN2AzOlBqb2hLXUs3PWRzSWwwSEpAMWQvKlBvWVxMUUoiWlotOzFzOnRsQENRYT5lVkY4ImU8JFIsO19ISCprOVpTcUs0Yi8zVV03PENeMkZNXGdpWHNKSSZtUiJgI2ZpQDBqUiNUa0UnN2JnTlM4J1ZbMzAuZCEwK0hiSkQ+OWNTNWcmcFVNaSM7VDRnaHIiMW1iNTVKXUAsTmhXUVMjciZDJCcyLUdqcT8mXUlbPEgjSmBNXV9QKCdUOjhfIywwSmsyLCs2RD9KLykzcCQ+TG1KRSJkPVJdNWopXk1hPDMxPkkqcDJhYlF0SFNiQ18jWFs5V2xiLjQ9TjlgJjpmUFZBKUlOR0AqZ3A4biwqJU9rS2UvX1FpSUAublpoQy9aNG5pMjJSYiYzRk01aztLXS9MVyNaPVYuTVlJNlkuIVI/c2xlYSxScVI/UFw7OSotN2ReMjBpZ2BdXzI4c0FZaXAuN0xcXmVhNk4xTklcajg9bEleP0RvUCVrbGguWiQ9SCxdcCY8UnI0IVoqLDVnIVU+bXUpaU89QUJNdWYmcTZxRDlJZ2BodGdlRjlmN0xKPDpIb0hXT1A+c0hgPFVrSWgxSlpwNVw0dS4rRFQzImhMOmxtIlkhVSwzVTVFW2srRDRBT1dWT1FeL0YhV3AkMSQhWmlObTRNYiM7X3A9TSxtIWhESE1uZjxlSCw5JXRncDcmRWY7LDNzaSFaTG9PUGppTG1qa0ckTFJWSlNdK0wnMGhmaEltaHNtTydhNkZ1RmFDJ1U8cjFfOjZdVTBiS19QYnFHQiFwZlJKSytZPU8iQzMlWmtqREdDQG0xbCY5PnVbVF5BQD9hOCY4I1ZPYlBVKExES3NKaj1bW2d0RTk7TlFrIm01NXNfayMzI3NTR3UlZSpPcFZxbWdSKkhFXnJURCNuJ0VfJixyNV9VLS85KjE8TUlBZV5NQD1kVzpSWVFcNU1mIWgoZiRWLzpgakZWVy5jdUYyTCY0TlEnTChaI2IpPSs0LCFoWWsyPSghJnJDb21YVUNHRFU6REFbSlZiYltOOks7WCEiLUNSTWM/LSM+SjZVbmVRPTdYW3MoUEZfTU5JSUUjazUqazhBP1YhLi0mXCRQRCgwK2tgQC8xIyU+Tz8qTGliTlFzZ2hOZFc7NWNrX1NkNDEsWkBPVkpMMSJdTVUjamM9dWdDPTMsNzd0LFZpWkE/S2RCc2E7b1ZwcE9jcmBKdCZhWGleIUc4U1MmKmE5J1xkVyc7JyRWcXRuSVhjaGJLWkVzOFoyazoxMF9NPS0uPlJUbDNbM0khSUY0N2xeTk90MEkiZSkoXStmN3BbJ2xjbG1UZztXJy5PLUI4N0sjKCE3STNPJ2JxbFFsRltdMixNc29EP0UtaCk1YmtqMko6M2o9MjYhN1RTMCFLKF9ANGc4Tio1JEtpNzpiPzY5Rz88RjlcbiU3Tzk3Q1YnP0tWPSNxQ29FUSUtQyFyJEtBK1dPLiNfU0ctI2MxbFUiSmlAQ09ENk9sJVUjWyM7NTg/SDpiKSplPENaOGMiPmVrLmZiakAoR005OWk8O3FUZzReWSgxSjNYTjxPPHA4bW9kcGM1JEhnTklxJylERz9TOD5bU3UhXkU1ZGc9ZD86JF8oRkFfVnEqWWJfZEk3USdnWjtMazdpKXQ4MFRwWG5TRl1aQlZXRlJfN14scVU8OTNTLDojIk5oNCxxMk03TFJgPjA7Yl1rXSZuanFmZUFaVTojbnJmXTY3ZCEqWT5SYSxaMFkmdFJSJmVtPTYxb1Y9TnNoXC5bYkgsaXJFTikoKDFtWi5FcGUiKWdpWyFJaG9ZaVwuLHI6VituLzcvVkNeJW1LbC1pWG4/VTIhNFM/aFZxYig9I29MRDpuNFYqaSFVWVgyQVwiOFFWOiU7K3BIXk1jLGxuPGZSQWQlLkE1cl4+W1RmKFIlZUJwQ1JPXic+cVAtU2FiVHUqS14haUp0I3FVWidoNkRScTZMIWw1ZSZhcFpnVEpOQ3JdKmkvKypbMGlvcFVVLydiYWthW2lBSiVbSSIqNmY+XmsjM1NhISomJCMsQCluJ0lnNSZVZmtvS2gkcWlZQzEwW1shKXIvJlBKbWY5ZkZHXnNJaVJqV1tgVFBtSyFrYVJNTk5yWmlvSF9eS2tuS3RBSGgoO0x1XSRmcTlaKC5kUG0sVDZGXFdqPm8hZisyOnFhIkpkIW8idUEoSEUoRi5CWHJXTlEtQFxIY2opcS0+QSQ9XCkrR11LRmxgOj80KCZCa0pVTS8qcFNAM1owSFpAWChaQikkRmJjWnU2LUdkaUlRMXFxaD0sNzVJWDltI21XOWRpO2hAYWYlakFVPSlecCVVW2ZxbWtPU0IlLlxNdTpHPyU0P2twLXV1Q0owVjYuXidAKyZxN3BuTXFcKFA7LUEzXz03SVhGO1MkVSspUC1ZPVYndEBxWiszOS9yOUw9Q3M5U0JBSlZSSGFMVF0mUXFDZ2M8Kl5TdD4oUzwhXygkdVBOImdgWywmViFaIVNxU2c9JmVQRTtVMnFPWDQhQzBZYDNkSkc/cWFldDwjUDgzczJFdDxbJHRgTURCZio3LidkOyV1LWludUcxcyFeJyhPYXAkL3FwVjdyZ00sTlIpRUBxciVCSS46bjBsJEZfXi1sMk4+YD1ASkpUPjFLPidEInBvNkNDbXInNmgxUFJbNCctLmxnWypyKm4kKz9qJUs1MTFXVSJZJ2NyX10sWT1NTHIsSGFZUz5bRk9YSCIxQzNtXWxtLG1lQWlgJWFBXlYsXWJXWyVqVTRFZUsxLGxRNC88PCRWPjlpJUpsIUpaQFpFXSxEZkpRVmIjZHJbX1QoLTQhNipDbT0wNWQ4TThOdEJxaWlpOyNbaUhrI0tIZ0A2ZjZqLmNJZ2o0JjhrcWctSylWPEE/S2xERl8mJlxnWTpzQTRibTZVOVVlJSFkLnRZKkAtVCRJRkcrREwrUyhoMlllcXVKaD9rUmJALW9jYzl0aVIlQ2A8JThgWSZrLFFfQUtuXlpdNjhxLHJEXSpFRWQvITpdIjxnNEgzMj9lQjUzR09NRV5eKUBSPDgwNEhdZG9uSV8hRV1lLW5WJyNOTUkjKmdFIURPTGYmYldRXmZeLVdbWldeZTR1PWM4RDcoUzBtM1VBRnRhQEUsTUhFOiJwZlJNams+ZjZVW2RTbDFhVWMjaGM5ZmwrWExVJlh1R2VsN0hqNSpUOGsnXmckWWxtOkk6KygtUkJKOjxAazI2KmxmMjtrdT5jOlw1YSNEbG9HI1UiTSltKSFibzlEVWw4QjpsWjRJdGIjP0pfLiY7Z1VAVW5uXEFScTYuQVhfUzxmc1MmJnA6JFUrJjNDLDU0LShfIWBlY1ozcCRfLF1GTGpFPFovW2pLX0kwXCkxPkZxcjJLbW4/JCdDOWNzODNqYUAoLWh1SkldNzZsNF1wW2FfNFMuNXRYdFgnRm4kRkdJOz5VU05vYSg6O2Ioai1PZ1wnR3MqbyorXiVUPEk2ay5UcUNCT15kMjhBOSRSSj0mJEQrbkZwYy9oKmhqYzVSJS84KEtBRSdpbkRGVCcsbi0iWy1GOElfIUVoO3VLWi1oLz5NQGJycFUhazY/XUw1PlNNNkFSbmFuND5rb2FFXj5mXm8rKTBZWj1NVTtVTC9uJjUpPD1HM2c0KENoJk5hNyZlXz9SQUpkOjVVIXQ6YGdXQVBuXVJkMztmbUdZQGghO0dzWEBYa3BhTDJcNVFyT0hhb0Y6RCZkYC5TNV5nOXMzKWklWUteaGI6ISJpdEEoREszJiREO3IuL2E5QENoanFRTCldcWJGY0hANSdyXyxVZEpMNjBnIzJaOF4haVVla2cqWCVEcEJQMFJDN0dEKFhUKlRQW2olbDA7KjArazY4NCsia1lsb3JWc14ub2lxJUgxalZaS2xKVm1CXnIxbC9VVzZFT2NtcV5iL3UtTEg6XEZWNlBNNl9zTTI/SHFkR0EpTnM2VjY4WUI5TDlIXWx1XDs9SUplUj8pWiwqN0UjUT5aLG4nRzFhNzYoVV1CRFUpcjY7PzomRzVyJWQ4K1tpT0ZATFI5ZDZWTDxWc1tiMGs5YTA5VVI+Rm1NI1o3OFpIaEkoTzZKUlA8ZHBeaklQbzRTKC5rYCg7QH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI0MCc6IGNsYXNzIFBERlN0cmVhbSANCisyNDAgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjkzNSA+Pg0KK3N0cmVhbQ0KK0dhdWBVPWBgPVcmcTNWVnJXP25BZiE/WWddSUQqMDEzVSszNDNoQUdtQ1s5L0pLYzZGMUYvWG9VY2VZTmdDPFdQQUtDQ1REc1UoMSo4UVZCWUo0cz8vb2ZnaWVVT0ojK24oYi5wOyYmWDghW3JNInVJSUc/Y15kZ21ALyVqZjU2aC8hViY4akxUa0RGbVpPUihObVpNTD5xW0lJRHI2KEVbbzQhaUduY0VRNiFUYm4xcnIxSDBiJSFWVU9WPlZcSG1YMGI8Tyk9bW9vVSxxWSs0a2lPPTVGQFA5XU5jIV84OmJtVW5TO2gmb0tfTWJBJCUqYyk8QkxJQEdhNGlPIUVMaG5UMyQtSGlTOmIpTm5IMWM7XUducjZjK2tVYk1VIWNGN14wcldiTnQxT090cjVRQj0rZ2Q6K3MwM2svbVFaWCFDS2s6SUxbZGpRInJnPEdkNVNicWNfO1xfJlovZ1djXUdBczA5YUE3YG5xYzAsUiljQSFQLVZDTS1wLzVzYTUiIVFCViVpalZwX0BxdDtPNj1JIW4yTjdcXktZcUBNOVBCI2FscSZCXy48LGxkJ1ZlRTdibEoxJmhXNlpyaTx0SzRzRFUjRmklU0BLSDpUY2YkSSZZayhdLW44PE88JzFMO0NDLEFOXkRtKTovWWpCcTpWPVptdWxvMmdnb2lkPlI6T1NYbERjR1RhQ0spIkc7bz9LPVpncCIvT11YZktLPzFPRSpKaCtmL1dDWjRIYStgaWZqcidYZ0BMSC1uO2lVOzdfX10uRF08PjReSS01PUFVND1sNUBBJiI/SVpHSXBUQF4uV1U9dF1RVDBHTHVGJm9FSSk8QmJLYVhzIV5cZ1MzZTEzJVMha0poLyVjWjhMLU8rWzNvVjJzQ0QlRjApb2hAbS5AZVY1TFdRcl1ySS44cEI1SzRJW0gqUXEhbix0azlZZWsqYSVtWEsiJCRKXC8qPDpRbldERChySGRBXzAsbzoybSE9a0A0ZzYsRm0tQ11XYWQnaTEkYDwna05ial1dX0xfJDA8R0w2O200cihYVDVeO3JdRyhVLVE5VSNdXVRkLEhsWkAtJCxKaVdrc18sIVV1cCRWT01fYSc/O2dDTDIkNSdsNj8uX3RiVFdUVnBxZlwvQUFpWF5paT4iLExuSihkSjo/LWdnRDNXc0lvYkpKLW1fJyY4YyVlT0RlWl9xXjhMbkJPMXI9TG9zU1xNSTg0NEJIJkRgPUNJM2sxJEpGJypUVXA/SzUiaiZqKXM4QDdhaF5SZnU+TGtYQklcMk5hOF0rbixBUWJUWlVIN2xzKmRQV1RsWlZgPXBialo+YzhHXnIhcF5fI0k6NyxXWWRSLjsvSipjWlVjTGBPOlhWclU9Sy8kKXE3bS9vZmFVTSZgOF5oPWlLSic+JCZCbjc8ZGRnQGhiTCguJTkuJlEkJSxVSDhYTDtdbDdyR1xgZWQ+Z1BuLFwvMlZTVjlbMCFAMFxscSpCUW5JYUYiL1dtX0RLUGZDaGNaMyZZakZnIThxaTlpNVVHQUstMltiRGQwVkVwJkMuOVUsIzVddElBL2JpLVIyQDNQSy5QYzxscComM04uKFBUaTkyY2QiJy9cYTA2IlwkTC4/YmthMSg7KW0hLSQ1LCQoMDpSKk1xQUZhaio7PS8oYC8sISw9STdOWEguLz9FdFQsJlJLOXBldG5UVGZEaVFmQz83XSIzXSJUKjlyPDw9SlYlaj8xPjEtS24uRlQlciI3azFfQj47bisraTdAblkzakM2dT9UVmZGM28wO0tDUzxARTpqM20xJHFyWE0mOF9ESEgmOyQkQ3NjLnMpPVJiZCExbmtmNHU/TXVLbXJRViJwT0luaihcZyJGdCEkMlkrISpLPFFpbV5OcldMKFpLXFVVdWQybFJnZXAlOFYkbisySGNOV2BlUTphQ14zPk9CRFVyN0RbL09kSy1NJ2k3QT9tIT5zNF9DSnNeZzEsZy1lUihGKUAzOUdnMCEwTUQsKUJFIVpIZWRNXm06Ml1BRz5lVypqIyNPb29qSUhnK1ciKzVDIV1tJi8tZyM5OiUwLSkpUWNTYT5BSEZQTjw/U1dyK0UzQXFVME5lJywjQ2MtRS1xYlQzWyFhNDsiXjU0QmtYKzlHO0tpYS5JZmQmbEotanFkdG5PRXNUJ3BPcWhsTVMpVW9tZEJ1QGk1ai01WUBiKkN1I0NKYGpOS0wrPC9zYD8kTUNmKkFKIy1zYzI2RGJpWkJWUFQqLmNZdTA2LFQ1ayFUUzVoWDE6ZFRcPk9jVEA+dSVZYi9hRklMciwvcEE6KG1sbGleWlsiaD90QycyQWxxUEw2W151KD9JQjYjOiZLY1o+TWlzPmhtSHIwP2I5Z29Bbm1FPjciLG1fYUc9UT9aVDZicG4iXjlYNi5Yc1AwOFtmJllEb0VePGo0QVI0UiJwZE5SWlVlbEk5IktiMDRmLCpdMi5ZP0hWcT1YQyItUSdMaUJYU1tuVkpVL21SJDhIVU0ycVJubkYjJlZZUFBiMTc3JzxkRVpHdS8vVSkzXyxBJSVIby0tQ2pKKSppZDo1NVdaT2IoNDZZcDFDNWYnb04kOlw3XzYyIUxaXGo4JnA2YjZCUSJSX0pZZG8+cVtUbChpU0ElSjJGMXQ9QTciQVtNJVhjU2VQQ1ArWWdgdWBBISgvbExyOTdYXCJVU11tQDUzbSxTRTQ8QWhWaSJJS1RMYjJAVTEtLm8zazJXL2xvSEVUJE0/QEIlbyk8aEEnaS5AUSlYRyJaIyFjWzgwS2FTTzJtXytxZkcjbmlndSNkOD8pPkBjU1AsUEpdPElSOVpFUC1WIm1GKkgjcDJATDJoLSwoW1dgNihJSV8sJUlKZjktKkxYRFE1VlhjMStxbSUibmBrJlltNl5PZ29LNmNxciJzU1xpNFcmVy0ySVFUTXApJGRRQ0NsJ183dUhqOjFRUkFTLGxhS2QpZTBgTyRXYyxEalpfVlIkUGE9N2hHaUg5bFcmPScscVo1X11UUlItUWRcXS1PU2JqSjVcKD1rUShGMjl1dDpaSERdaCJqTWEkV2JmSSRyI1dnclkzOVkiQF1HPDIjXHFqaF1tWStPTylMJSxERCxmJTBrWWxbXDpOMjVbI1dZR1IhZjVvPW4xNjJjaGQoNWg8WCpaPXFqNCExLlAsIms+RWZNUVdkWlFOQjw0PEw5RyYlRkJiMzhgYF0tPCM7OWM8TShiN01BPjZoR0lDXTFLbFIyUGpsQmVQcTJjbCgyVEMza0hgXWUvKnEwVDdkZDpiZ3RtWm9xWVRYVFZkXzlrbi5FN1xiUWcmXWdqPTJxWT1odGQ1WFxgQ1ZdWFhiVSxCPlNocmJHZTJGSUhPUzgsaCJiaFpFUyZgZXNsYzlsYm5CJU1hPTVHPFhcJUMjVz1dczU9c2pnXy9yMHA9PVxqW1Yrc09ycHVEQVUtMHQpRCdUQW4hRm10SWg5SVJTLDE4J0xCJjlMY0Q7QCZjTyNTNWFVRTEnR2peJVp1WlNeM3N0SSdESSJUSVpDcy9tLzpVUExmb1o0TU90YSgyQl8kJnQsQi5Kayxmc0lmJzlmJ11HW09tL010bUxdNSEpYl8kc0s6M0ZqOTo9K0M+ZmlEaVgoIz1JUiY2Q2xJPS5eJiJxPV5KX0FuR3RCTWhlTXBGdDw2ZWY/VWZDXiFJXnImSm0+XUhbR0hERnQ3RWhyTE8raDQ+KSEhOFpnNi1jP2FGRi1PXmUtbTFOJyU0Iz5bQFNeYTVoVCs+WlZISylHKD5oQDcwcEg2Z1QwQVpCak9dKjxmNGxXOjJrJHIkZTE+YUlxQCpoWE1DU0VuJzQ2SVUyWj9ROW0+Jl1idUU6bEpTPWdSUzlVU2cqcm8lXSlVRDpZKmBoaVA8Y3JXYWd0Wjwufj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQxJzogY2xhc3MgUERGU3RyZWFtIA0KKzI0MSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAzMTg1ID4+DQorc3RyZWFtDQorR2IhU25sVkg5VihCN14/czIsLHUlcl9dNCspc1hCN1NEclc8TTE7WlB1XjVfMUEzIWBlZkxfMVJsJ2xDaF9TYmg0RlokOkU4KGJzMy0wUTMzVGxvWChfKko2WG11Ri4rLyptLzFxTTgiVlBEWltCayhfNTxaZl86cCVIWDNyX0gyR2pyIT9vMSxYV1wwV3EqKi9LN1djV2hKWihnOnIlPDtEay5dV2dsallbLjk/Vi42bis1OV1LKSxSN2Bgb0xEdD5PU3RPV2tCXz87SHI9QW5yQ1xJNmZmcEhoSjNNNVJ0PS5QMytDLkhsY1VvRSxlPyNoNiQyNCttZkZmJmpLb1hzTiEtYFVKP1IvUGdGTF9CdXFVQkZQQShWPzk2ciZKLUAwQ0VfQ2BVM1Fhcis6RGldKTo0P1oiMC88UmBtSSxDK0A1RkpDUW1gPUlfaUoxJjxrWU00UTdPYGxSIUAnR0wrYDVnXj5sIz0jYVc3XXNNdFlgREEvNlB1UWNMMDBSMjJCNSYtZlFQbExTT01aOE9pN2I1Q0pNOnQwRWFULkUvKSw5NDZCZTc4VzQ2RWNqOU5IYTxiTD1xXEQxIlovbylLKll0TCQ2ME1POEpsWipCVlk4aG5eMGRTZ10rb1kxLildYVFgPTtxZEVucD0rMUtCN3NWb1o/Oz5gZVZoXEsyRURVJlxXXStRKlgsSmhCb0JmWFxIUFolOWkqZCdSc05HUTg2U0cpNj1uI2MlQExbQzdHMDhhSlouODNmPElpbT5cWEchTWNVbjAhVChmZys9NDBGMzc0UihZcCMyXG9xQTBZbnBSJ1tnKlpcNCNJL0dfJUZAK1RYUnQyME0+LkgmO1okTGM3cVg7YCs+TUxyQTFlXVNoOkMmMnUobE5QcUYvQ2hELCJeUGBTWDdObjdnTFo+LylMRC1Ma0llKlwjYS1uYy9vcFU4UEdJYkApPGVdOENoWFRGcEF1YmcibDxTPUIlTlFKUmMiL1IxLkQzJlRCP3I+Z2s/MSlbOXApLU5cMVdLMj5zUEM0OD1kXnI4QWwnPTpgJVA5WG5nITslJD81MkVMN1c5PT5OKF9Lc1k8dFVZIVdZblQ0dU1vW2hDWmpsUG02LzBDPmBYNzgxX0lcSj9dcDYjX1gvM2hEIV1PQk5GXlUpIz8nSUonNyZiaiZFKiFQRGZrTkEmcGAwTFktJl9STEptL1pPal5rbHBaR21pXlZBMlRWVSlINzI1Z3RobDRfLUUhQ29rWixlSDEodGdCXShuYTk7JkxDWm9Ab1MtJzU7PDU/SjcybGpKU2JCOmJxNlkzKDNkaFRsR1dKaF9WZ0lGbk0vajIzS1ptO0NwRkIwRGFCQydTbmwwWSclMEVUSHRgNjcuIiI8NTkpVkNzOyV1bnE9NVg1NmtuYTBiPF4iVj0hIjItInJ1QiRdMmI3ZTxvTlkzXGI2TVMiU0FrZ0NObztWcmNvXWVTX0VzbD0zUFhFKFNgKFFFXysyQ3BdKUY8KDFBKnFHNWhvZG1oMiUyXlt0RShqaCRjZ0ltX3U4QFEkYyNpNU4ocFxFaUxaP05jazViUi1ZOSlCNl1qJTZOZDQ+NT43LDJmLHVvOlhXP25GM2FZTmluQWNUXTpNYio6cV9PaUZFKFBUOWFcJlRBUWk4JW5aKFhUKSQramlUKCVdWlhfZzNyYypDNFRAK09USj04OSRfUjk3KztbUWY5SV5qa2VpUG5FTmlBbDVvJCZ1XSZYSiJtXVs7NnFHcidPQHAsQ1VKS21IalMkWTM7WVZvKTNZazEoODVJXyUlcSlJWi00XCNoLyMoJFUycEBYXGMsckUsYiJIRzsoNz5SQ1U5MEBZXlJfNWYxZ1A9VTI2IWJEdT8oQlgoIy1QW0JlVy8nWnVeZ0cjcT1iUTxqLGE1QDlBKnFRP3NlMSQibDctL0lmSSVHb0ZjSy0+Vy1lWnFdKWY5JCY5V1NmcjooYEomKG9ObFMtNFp1WSIpKDBOJylvZVtQc0RkI0xVbVt1QlghKGdZIWNVKTVRI1xLaHBFOmBiRXBmO19JOWloYmBwNGplTWNKVTVVMHVMZmRXN05fJzIuRVJrLk9sQUdxczROJzkrLVREY25dWmwhcyVkKVNpQDpVdC1NcS1LazwyXGBPOD09NFZbMic1ME9fK0dtbEU5aVpcbStaQk01R2xKJkctJW9dSVJWY0hrM2oiST5ALDdMQTRuOlxkIS0jLlxicztQcSV1alJBQCU6WklSLDh0U1g6WF45QSo8SW0qW0ssTT1xY1E1X0YzdE5wanFLLU1qY0skMGRtVUY2ITIoWztnODMyJzZ1blgzSi8vP2doc0xEQVhzbFpsUDAqL25pNDI4P2FIbWh0WGpdJCgpSnJUI0lFQlFuVFw7MD1mMyxCPkdALFpQbjsvJk0zMCMmKl5YNUUyYj5YPFFQJD5dV0d1NzZLN1YiWF8mJldSKlVyKGtzZmV0aVlxaCU9VVBOJSJabzJ0RitlMF1LMCJebig/YShdN3AuciwsVkBdRztRYEhFP2xOJFpLZUQsYUotIVNbaFwmJl5HZ0ZVOGI/IWkwZF0ybEVCPCsoPXJFVXM5b0YrQEM9bGknS2xDMW07bjlzVl1pZ24nRlwyX1FeUSdZOjtbQG9gQSsnXCF0R29fXDxOJDlxM2RbTTM/Z2luWDlAYCM5SlldSXF0RGInQE5VaixBb1FRJk1iX3U5bXFmTlRuYiZeaD5VT0VacSxMPWwkUC5qSzowOi8wJkFJR25LYURNREhfXXRCPi06UDQ6OExhaClWVkczIStVZFp1UC86STRyLz4kUFdTJW4wLyMvKilzP2lMXFIvaGkkTjZPLkpqP0UvZy5YdGlTKChBRlw3OVw+am0/KDgiWWlnJWRwbCxKUDpGOUZ1XzZlaGtxJCVyJk5dNztrRz8qX0csW05XWk1RI2NTaTQxLC8qb1tBYDJDdFZGJmAtT21yZjVubDpDbk4iSFRRKEJDJ0Yqcj1ULV4wcGhwN1hBJmg6Tj9lOicqTiRKK1ArSUsuQTNnTFtUY1VXJDRrXGJ0TCowYkNFRyRAS1FjWVZCZ2VIcFEqOGZLNGVIcDk0JjA/OlZjOjM8J0VnUz9UMUcuZldoKEApOnJVLHM1P3ByKFA9U28kWjtccE1BVmFhLjEicShNT2RkTz4vKDk1LUFQWSFhYG9RIXBITGYhPk5QImFKXT8iXlZzcFg6Jy5kXj1bSXQrTkByaC5lNnJlck9UOEFmRmsuN29BOD9MRVk+XG0wI2FJZmNgMkZFaSFTUUBJcGJIJF0tTzNUc2o9ci1YWkIoIXI8JFUoMSU7M2NgPD0qZyEnVVskIWVlK0hKTCZFNXEnJUlibTJBPzdMXkhxQCNadCw0I1coSVVVLlxYZiQ3VmYjZG0nTU1QODpbXm4zYm8nclBvNEB1OjhidS4mTHJXUE0sPmRcbjg0UUJMV1gvSStwIlxWNyNYX2RuWmdLMUMqWW1DQDRXJWEuXFkuViFgT0JhM2hrKiZZXl88dVUwOyRVTVcwLlhaOVhhKionSS83cT07VmZKNFkkU0ROLmhoQXJjI1wuVVBiZyJ0ZS5oTFkkQV1IP2woaUJeaV0tajI1aCZuUGNgcE4iNmBPXFh0a2tUJ0Vac0BhTGQlQSwoIUQ/LituMC5hYj9oVkVuYVo3bGFlKzpLODtQOj5TODMuNnU9RyZJS01wMDpBN2tmNGNjMWg1SD0sMS4kUGVVK0psOSwkRik3VVlwIyNBXyYxTSlzRTZGXjo8WTk4bEAwUSxzTDopIUtfYy9mM0YyJ1JxO2o+Wms/X0daXDByJF0kXWglJUQ9a1cjXGBrRCZdJztuaWQsVTcsRTRhVWgiLiVQMWhuUjNWLSwkNSlLZS5nTj5ccj9qVkJNPUFiWVtOQjVbNEg4bjVjRkEzbD90KGhCTTBaLC9SZ1JbI3NaTlNqQ0koaEJNMFlzZipOVkBwUicwQyVZQUdUck1pSUFwJnE/dWwpLS1ZLGU9MkQ0JEQyX20rNVkwZU1BZ1NCWzdaPmdhaGQ/RmFWZEF1Zjs4U1kvOTExUU1kJTxUPUMobiQtXyFxNGMyL1FdW1c5KF8yVD8+Q3UiL1Ilcl9AYW9FdVstJCJdRjtxbzEmYDpXPVJEJGAqIyd0YGQ8I0NqPE9zRUJXMixaZE0pUk0yXz4iJzc3LGFjYENocklMYWE9YE4vMlRfbFhFWG9kMm8rMVFGRTZBfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQyJzogY2xhc3MgUERGU3RyZWFtIA0KKzI0MiAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyMjc5ID4+DQorc3RyZWFtDQorR2IhO2U9YDwlUyY6UTpacyJOcmNBZF8qSmFfMDxUMmErViVWSi11JignWDdxOT0ycjUsI3NmM2xpJEs8NlFObFMzU1A8KFAsPlwrQSVvSzVyNU9MSnI6L1YjMEVIRFlLS24+Z2khMXFVS0FaQ1YwUk9EN0xKT09pRjIqL1ldW01UWG45UStGWmhFMTA7bm1fQnAhLWBpZCIyI0EtYi0wYEQ6SjFSaCRzaSxuOWtnU2o4LSxtY2cvckRCQzg4Y2kyJDYzJSk5W0tSRzdcKHF1J1FFcHA7SkQwNTFBTkJuQzI5PiRnLXA0RXI1KlFQTTJRT3RuT1crcjU/QUxSZFpzRzVLIVQ9MnMmPGYtRzoqSConLGIqNjpaJCZPQyQ9LjAoM2gkPFQ4JkkpWz0xYjQnWHEpUUc/SkdtIjIoOUpqVWImazpbJTNMQFAwMV91ZDNBaXBvKktgVChZMl5JQjBlNyspSENdNW4hUk87dFRjIXRAKjI7SDhKSClXZFFSY1JfQTtKLkEjYXQtZnNJNkdOTkAmZyROMytvVjY8RypOOis7LEJGKCtjcURcVVsuKFhPLi9aIUA6O3Nfa2wwXVsrNDs8WTRFKiNYXyZkOl5hLC1vKSdGU01STGtePENUX0MuXG4hL0xUYm4uP2B1bmUrMidzW3NRRWM2W0QnaStmK2VyOz9wbmNdczVjRCVaMidLQ1dSZ0lrXE47a2plXjAzTU1kIzsmYFMlPDdJX1c/MVZdajVbci8zVFlKVUFDU2dyVkU4VlBNLzdxSSh0RUomKChQMVFWV1VrUzBfX0NZQE5IRk8raF0sUFpdYi5sX3VUVk02QXBhJzI0LS1AUGZXKUIxJiF1L0VYTU0rb1dpNjdcOkNrQTtEUVIuPFhCdSxWcFd0MWhJKzY3VUJJOi4tXFB1Xj8vQkY6Mi9YLG4tLV00LV9cI0RqLWsqPj9uTnU7NXM/WGMjbVRaJy1iMVkoWG5eMWVwWF5rbjpHcDE3aW51SHMlSU9ja08kc2wlL204XVdbXiY3PFdcK3QzVE03TG9uOmgjLzQhU2xXKUFvNkdNUWg7WiZcJiUvUS5CJHU9TFN0ayY6QiJKREZHUEs4QDomXS01aSM0ZEtna2FWRyhMSj1ML2JJSWsmPD4nWjtDWzNQXCVybVM+cjUuMl4mU05uJ1g0ZjonS0s0KFQ7WjFaX2pYIl9ISlZLczxhQyl1bVE3VS8kSjNcY15IIixWJmw/I3VIPWJtdSpBS15YbU9JT1xpWWlRMFk/RlxtQkF0JFEkJlREc08wOCM9ZipuVixoWlRGYV1lU2szdGtLb3FLT11vcytAYV0qbCRlJG9RODVuNTlMQTRVWzktPlZHVTVkJl0uUkc1cUoiQDI/Nz9JQSI6IVosWihwS1NkMyZjdSpmdUpia1xPPUFkWWE0MTxvLGB1OmRtQGw3YGMyLm50P2YjUU9WWlJnRjBALEo6YUw9NjdNZWI2Wz1iMl5IdXAlMWJVSDE7ZXFQQCdYW2hPVVRtVkRtdVRccDJAcUklMDhOPG0mTiNtZGMhM0lbKDEzMV1gcDMuc0xfWWk+a1dCWE5ScSw8U0Q9QUxxRCQ+ZiopOShvKGxcNV1EOS5TY0hqZHMxaTZLPEEoWkhMcTQhU2E/Tlh0SC1Ea2JfbmVQTztPIzJpJGRgJj1QZCFrOi87MTllKVRnJFdlcTY7OS1DTWthI0VXKVcvZWBlLGhjc0ViSDdcO110WWJNOjFMKmJeRD0kY14sNy5QdXBbLzc/NiYySzNOTHI1MGNUZV1SOldtKThmJ2ohdClGRGYsX2RwXUxJNVckbypLSVxzOj89I1dhUidnK1YxOnVWbylEJTY5M1dEaWUiLTRAXllRWiRvQ2guTDFbamFKLlpDKXJnOm9sWTpkJyxSa05WXmptZC5kIk5QczomLUdMWTFQTW8vaW1GTVY+dDkrU3M3V3IxWi1BImM2PCwhU2E3VkpnSCRVTW9dWz0jXD4rLD1bJlpWYj1fZDQ9ImZCKTUnZ2hSKU9lPVJYOyIwU0VEQ0NLLClzXVhCSGRSQSxiZz0/KCI6aWdFbkBPZC1NSythTlBGWjkhVGM2IjNjLjJBYzJfK2tvRXE6VjpSRUFBOlBgSEcmKSNVKVcjLF0oR0lFWT0wLyFIRl1EQF1CKyhNO1BVb141PCoyZG5DPjVPazktNSopbm4saV4jcihHXUAiayx1IUBlV1ZbSWAiZjN1OjM1WS5JIkhCaFU+VSVpYDkxNV4yZ11PKSZccTYrbUEyP24xT08sLjwmUDdwSk5CQFNUVioqQG1bc2EuWzknT05BQzFeVVlYTEdcdF5HUiFXRDNrRUJJP20yQTJXQmlCX1cua2ZuJktFIzkrbFBuKmIndSVCcj5HWD04VyhgdDpBTTsmWzdEWHFNPmZVZCxaSWxuRE81bi4uT09AJVc1JT89TUthQk5zJ0NILyRnYmo7dW9jKDsnTXAsXD4pQGwyVjgyVVU4Q0YmPkFwcj9QYVkxO15gPDhRdE9gYWZDKFZuUmRhblQnUC5tQG1tRFcyRilNQlZmOk9iKyFvKUMxOiY7OSU2OjFBYUVPV29kRmFRN2AkaVFmTDpDLj5ZTSw0V3VEMTddOV1RPzttTWNkS2tuPThXb2EmJ2RMRDkvOjFXNS45aTBAQSd0aHE3LlZEZyw6KF8kXHBOOjY5TFYvKnE6JltLXUliQ0BuSj4vSkhvaGRzNXFuPCRfUyk0SUVtPGRZTTgmTUM+Z3FHZz5qZUBYM1doLj9ESC5UXGFETTcqQjtBODlHMD0+N2RhR2VxaVpmLW4kXGpAIzYoVzFHdSsuQUpGMCpdPkdEbSk/U0VILipfPUxXWVkodDpBQztoXzlyRV1MZEYrQTZqRHJRXjFrMEluaEwnVXBLIjYibzFfJ0ZaQEVbcXBaMToiIU5qYChFZSlrZyQoUzReaDdkbFFZRF1JVnRGSD5mR1xgUFVMIyVja0pwcFthPDJNQkEmKSEpIykmPGJmUCY0KidBWj8rND03KGByfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQzJzogY2xhc3MgUERGU3RyZWFtIA0KKzI0MyAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNzY3ID4+DQorc3RyZWFtDQorR2IhO2VEMCtJQSZjU0Fpci5rNnRSRUBaMSg5KEBvVERZIm4oWVFOXGpRZyg6OidWc2QkWVBYTCFNZ15zZjY4I1IuOGw9R2ZzdEFSWW5LYlUhQmM5Z0c1Iy5kSyw0SDJwQVo2PjMkLHVSSE9pNFxgYClAZlg5N0srUztsRj9xOykkcnE7XjlAcGNlImZFRDVjMiNRJWhJTlYtTG1jZ1NhTGdHXyptPSJgIThLM2ZBNjBtRmJXZ0doRiJmT25Kblo9U09YL04hPE4wYERPJEokWjNVQ2skcGY1NWAmJ1ZYSmBDMDpNRSkpT1A6dFA3cz9WUGxROXAkJzNUPGFwYidRZE1ZaXNiWEVZUDtNNmAoKUxnYFQlTTtLUzFPXmhzTHEjMVZKNHM+ciFdcm9BcCIxS2lZKm1yLXIpKjFgUythN1hjZT5KPGkpaEtOIzJIIm5TdG1RJWMtPzw5XiIyVThmYCYuMV1cUiZhKkY1R1hyQWlLbycpNmhxYWFoay4pVUtbMyFjRSc/Jy81SmxNRVptPTxLa2tMNWo0SC02WlEsaUF0aTBgPy4sKVdlLmRLUHFUakdIVk87RUVoSyg3S2gudExzW0BdbW5PQk5xYjovU1UvRUtsLFthYCdJQG5KcSdtK3AiQj5hOGtEN1wvcFZbKz10MEFLIio8SSRVaE0tKDFyVGgjWFg9P0JmNE0qVlpQKWpVXjBqTGtlU2oyIjJZZlwnNTBCbDdgcU9GN09zS281PSk2Ik4pODotZzc9J2BvTSFTXGVDLElTRlpbOlFAKUpyYkVvYUluXVw2a0pJYF1bZGEpdC5jKS1lQXFLbixxamNKXiYrOGY+YG1cTU10LVRgI1NZbiYqPFZiUl8xbW5VViNOa1VdOzlFX0hCb2pqP0VPNiw0MDMoSWBTKkJdbVVIY18/PTYxOi9bP2pKXC5ZKG5dXiU8JEllayxwNS9kXidBODddMG9vQV5Gb0VFLD41VS1wNj9VR1JFVGUtUDo6Kz45RkQnJnAqbCpuNDsmcXRFbHVOTUxiY25dWk1AYmllPzYpcCozQy5CTDAqQWRcQF47RC09aGpjaWpdVmk4VTFwbTRJODxTIVlEQChQVSFXK2BmSEpMMmdccDgvc09LWVxOZSk2Vl5kU1I0akFbYy49cXVRPkF0SSIkR1pHU0opP2VeNGw2bkYmSFpncVwuciRhJmtiaTM0RiFXQGo3UV42LD8zRChrWGAwbWZvImk5Xl5XQCtyMUxULGhYJ1dJRzNBQG9cRzpWNDQlP1BkVCRDWU9IK1YsTllMTU1KKUFIWzY8LUdiJ0RfcGtUcVlEYD1xT2RRNy05cyxLIyc4QDpyN3NEXWJsTmhDJ15hNj4jMmxzcDlTMVNFXk44JVNbPU5jTScsZ0Q/PGckNCxwZ0pDJDsmbTciOmBpXFJeNyd1QF9sdV8sQCY8V0YhWG4iR1tVU2k/VnRGI0BwY11uZTBnL0RvaCYtYDksPSdwYjgvVUFKWkE4YTAvKE1wdDVYW3EjLkhOQlwwbF9XLT5hPWVWakhuam9NXjAhP2tRZHM0a2k6NGRuP2FyKnFCWEA8KTBIVkMyKkFIOUVsZVdvKCEsL11vP1tnalBeSzw0L3M3LVM1P1ZEIS9hOVRCJ0JIT1dhJ11pKm5AQCg+TGVlQ3I8KzxWZVolUU4iYCJOOF1IUk5JLCQ5LFRrJDExJVFTIUVfOHI5OEkta08kYj0kSDI8Z0ouc006Qk4xaTI7PTJZSClOcGNvU2RDR1ZMIi1XM1JPQ1s3K3Ftb2ZvYDtHNyosXFZPLUtHPVVTWTdQSzYmZ05jLSZOOGZvN2JQZ2suZHFBNUs1ZTchOD5eM01JXUstSzk6alskaUdhQzEpTlVSI3NGUmI+JVx1UigjKWlYQWU/cjondVVsRl9OQi5TTiQzcHI7ZWx0MD5bQmRzKjFJKy1iRTZJNTYyJk5ZKVhkSWclKmtiVDgoMC4lVHEiazRVK2ZLcmtjNjc5YnByRVoyYEJwP2RRKDVPInVlVTs+O1EiUGUrbFxdcGQtSGkiWDlvPU5tRkE7YSsoKlFyOnRVS1pXTXJCTih1PT1ZU2lQcjU0PD9LLmE/dFhoMj5KJkZFRD4nLV5TO0A3UCQmTVchTmpSWDAoJGpxZlciQl80Pk00MUAtdWE7OTJMXV0pRTQ4QjpsPFlkJURySz11KmBwIytTOlJtU05PWEMxRk0uSVRVYSgmUiZibywjWDxdJFdeUSlJVktXbztTVGdRLS1nMzcmREAnMWtFQ3UoI1trVSEwQmlbMSMrJGVTWSFoYjVacSNHYCZya0ZtZGltUTBiMVA1czhRZmdEQWpPKjhZIlg/UjRzclhCWGQ/O25JXF8jKl1ObkZvQWBcYEEoKFJiWWJjai9GI3RbVmtuKlRYcjFqTTciOWkmVUw8Iy8+JSZhJzlFVnFLblwoPiJlJElRQDwnLmlAJ0VqOyoiak9vVmhVNFZiYWo0QVFjKT5cQSwqOyIvXl5tXlg5O2tyWSZfPG90KCdZUlVQKTcuVlQpXUouOyY2JllbakxLUFclcnQoQTFTbXFOMF5FWkouYy1JS2deLkchYlVVOWFxYExHYS9HVlFUJktHZ0M1WT0xL0E/SClZai1WR1dobEhtKicibTRrTjpNPllzPnJZIS5nISdZQTAuKGx1QVtuKUE4OSlENElkQj9ecjYqcjlMXkQ3O2lDWjtiTl43czZfPkpMcz83JU8sO20uKlFJK1lBOTxWJzVCOTMlS2pnNyFoNFovcE87TGd0ZCcxZlZKKSkwJFpvWGc0Y0FjbkgjPEUyVE0pJDtYTWpXPW1bO0lEPCFZN2ctK2NabDY0KGtvSHQpZjleRDJjOmJFdTxQJnIpQUpjNEMkaDgmNkU9JGshOW9TbT0taCksJzEkbjxFPictTGhdcUtKXGchRGkrWjxRMCFPbzxOWDlmZ00pOy9KPmBaSDJhTktFJm5QUE8wUThOUmpMMFkiKGJrNUBHLkNibiJxZFtUKGxuXVA7USYtIys7O01oImA3XmgmVyc8a2ksOlRobnBMO0g3NkBqR2M3ZVI6NVphV2ItQythXFsyblAmLGJiImtVRjxmcmVhOCp0JjdBXlZMOllBPWVuOFRpZkcyXl42KU0mZCFmMzRxWCsyam1IZCs/RTs9bzVFL2UsaUJRZmtpXTJbNSxob15IQ3NQaytJPGNJWlJjY0A0Okplcl83OiMvZGdYcDwpYz8lOiRDKShbMz1KXSoiMG5FK1s7QUI1bTFTPTprWklEVThrOyNFRiJVMD01ODtULk8vLiVoJyxiN0JzY05rNlJvT1RNZWkvbHFtOWxCISckRl5GLHFSJl5sLGdIQj9OZilyTWgiODZHJ0hGNWxiV0Qya0hdL245VmNdJHRYMSgiQm1iSG49cChlN0NcQCFDQCNiL0I4KGZiP2ErciJcL1RQKHBnNTVaYydsUFIrMyJLJlA9Lm0sOlk5Tl5NKyFwdUdUPEFSVS1GP3E4bm5eQDdgayxBYU4jJk5UaDAlPHI/N0pyaCU+MWRVIkFXaEllI004RTprNT0+PEpcJClKSVddcUJwUHVyc1k+MSs0QkRJbVBYNCtCdUclXDdzM2t1LURmQjonI1JtIkRQPyhHcls0YEgoZ0JtY1k8ZmdKRFpwWGhicl1SQkJZWF1IX21+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNDQnOiBjbGFzcyBQREZTdHJlYW0gDQorMjQ0IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI2MDUgPj4NCitzdHJlYW0NCitHYiFTbT5BcjdjJzdDQ1FzIkZ0MzpeVko4TVBNWDg3MCxKbj5DVzdjVmlkLjpXO0VlQz00L0cuUHRUOUleW0tCIThQdW9JO2lZJy1KSVB0MmZxJDxTMU05YEg9U1FJblQwV20pMTUyJlpnTChQIjNYPUROL2tkcVZEIzQoX2h0bCoxKnFyblYlJS1NQjQnVTxSMzNxamNiZFNSPWk1KlwwQj1PdHRDdWhxTWQiPyRAW2EiOyJZInEuVWJiSGFBcktUJS8yZ1BNUiVsIXJnbixBZ1VyayYwaVwoZXB0Ijg+W0QoX11CX0VzQipKRXBmQ2dNWzJNRGYuWidxYUhdR19RUyxXJjE3Y05YXmtDJFovbWlwYl9zQk9AaG0rMDBnTT9GJTk6T1NBNjhnMDspXkZnYmRDWmk4P15qTi5tMSdCYGVFYFFxa3UsPFM4IzpgWCVMKWsnaDAmMmJnIlhYRWVTPlNVLldVcS5pOj5dNyQ4XENFLmlvKVY5KWlhN1M+U0FcTWQiTnJuS2M9Vyk3ITVIUD5Yam5XdG84YmNTIU0nLVlLIUYzdW4mJGBSWihkZ09BR0dtWVVPSV5WXi8lRVY4VmxpYlQ6a2FmZWU3L2wiLW87M11yJExYJThLJj5bRT8sUiRNN2t1XDEpUjIjSDhJdHNESixfVXQkTWlvX10/aU8xWlApSGxsVGgraTM2KC1vRzZsa25AL2lmOFYxKUtfKylYc1tbLk1PQk5NIWlDVFNIZk1xQ1ckLzVlYGtjK2Rpci1QZmZjLHVsZT5tNFBCWjErVmJcOFpvQCQzX286VDxyOk10Pms3LTxYZD9fMEpUXl9tWzghJGE/PFoqPzcpZFlQX15MPE9mPWYhUGMxKlNBPTRhJ3FmcVc7ZUpebiJtT0ZdIT0/ZEthRzFdSnVEKTs6aD5yaEgoZV9BJmNbISJIL1YnMSRVM1UuYTxTa1ApNDIzQipcOGcqPWJyOyU2PTJwKkYwPUZzKklNP0JEPyFZOFsqL1dHcUNsZikpOWAiZ2NuX2J0VCs1SmghUHNpbjhvSCJDT2RcTGFXaCpvS2RZIS0pPUxBLXNnNHI0SjciZHVAci9cJlYsZmpPdDwtTidzTC9SUEVLTEBlKCxRI2AyKSY2ZyduQ20oaVBZIS1iIyYzKXRkXE1dSSRqZnNeVTdmVVA+KF1AWitvUGRXLyc1MVhWKC1gbmBzMEErQ1hzQjhoS1pRJiQ0YkhxSz1lWDVSKixbQjpAZSRIVGUhPXAzNVtTSiY8YiNEXTkvXTZdaTpSN29WXTkhSlctcCtgN1doU0JvbFFHaV5jKjlAMzI4JUJcW0ZBUzFxRGBNOSVEQS0vSDNHMVJRUkI4NiNsKzQnJmpScmUkOyI8PixHOl9OUDBAWmcqWj4iTnByNkIhSSgpQDZob3Ijc21rVlo5WCk/MltIKGgmLDdwXTNRRGpHVWtRbCc/TDBSTC5TcmQrQUtwSlY9UF8vX2tlS15EVTBWYkMnYlhvO2Q/Zy43YVJZUlEuUHQ8cGsyQjFXbzQkUDQ/OF45XXBoWDQiJzc1TCRAOkBGTTNuRFBEIlBSOCNRQC9iX1NcYGNASTBXcyREbzJdVjgtKS84IkptVHJmVkJUWDwpVjU6JEdAbTMiLyRCdG1PbClHblk2R2ZoLU9wQEEkMVM9IlQrQyRSSnBbLUBsQUVmPSlONUs4JTRdZkM/TjBQWlA0PjQlNEYnbEFKZFZJaXNIcWs/Y0ImKj4/Syc7KEBhWDsjYUlgUUAma2JwSkQrbFQjZVJTVFE2XDZwaCZrKDBrajlwJDhnN09zXDxNaS9Zc2tia1EyOT1dLko8K0BdMmhrY2VNbk07V0lgVkBlb1heITY/MWAsY191NyhsPDhiOi1VLyxhKm1RLzFAOnFDPkYsLU88Kk8rMDNvPmVSMmJFKj1FV19RSCNCPWpMVE4jW0thWi9kRicmdS5YblRzdDJbM0xycUhtTzhrLTE3QVRJPSFiYiNnTFdhTVxZLSE2Z1kyZjdcUVMkaStvaHNmSjRSNUYjU2NTNTxQV2AxanBDU2InIjFFcWFIWGQ1RWBIZydBOC91LU42RlliTU9JNzI8PW5pWWFDOytiYjRQVSQiNTVYT2xdJT5nWC8mMTozKWgzR09oajQ2UCgjWVtoSChdQj8sXF1uOzNlMVUiRUgqc2k0K1xnMU1DRWIwKXM5XVY6TC8rcE9kRURXVywkbmMpbjdNTXBBN2xpOllWNyFwbnRVO2pmS09Mc1RWSSdDJEpRV0VPSysrZTBvS1g0S05QLiohRG08Mz5uJnAwVSZOXDooci9AKztRcmQ2V11PPlFqQUNjNWNFKzU+Iz1zJ0pgSzNLJShUSTplIVMhb2dCVkgpSl5WVC1sPUtpNzZMWTAzPiI6PWY4IWo4KyJQOUIrM0AkLnJmJ2M2cTFiJiQmWzpSO2gsPyhOMj4pQjVmWSdOKzM3YyNHZEYlMFFKb3BgNkM6YV1wZk82QmxLViV1aj5uUEdGPztXWzBCcVtoVk1rclw1WFo7YyNPPSRmdTghJGVqcE83XFNOZiJcMi4uXjAwQG9xRkU1bUJSPlluYms1U2c2MXRBImEqUlEqTl1YQmxbVHBnKVQxVVw7WSpPQ2R1SGtCWTZaJDdvSXAhXjhWcWlWJio8OE1qUV1kXVxjQyNcTiI9XiM6MS9tbk1vWjdrPy03RGApS1paK2xRUFNKIjRKMHEjRj9FZnBuOT4jR2dcQlg2QmNhQjdaRSFbWUxnLlp0LTUtNnJkQl8+YD8oJl1KIyVnUiRFQHAkKiQ1cGs4SDJMRnRRYGBYZ3RhUVhQKVs/US9FLTtmbFpwTkMkaExPIT1HQHFhYG8iMDJgLlEmMjMwSS8uKyklPSc6by4xLzlPQSpcW2ZnJmdBMkUzUWBmcydpWDBDbUclJ10lNFZWdCpSKyEuJ05LL2lkMkQmcWphNC9FI1paUUskLUhBMV1nQyxrV21HQWhUR0xGP19RWGBlMjw2OlQ7P0svZyo9cW1tLkw6KzkiSF51OiRUbkEjR0lCOVYxRERvZT5tXSgpUk1ZSlw6QUtOVSNtLy00Qj40dSVgaywvPVpacSNUPk8oNW1UPSZrWS5paSk8aHJmSDNhbyE6Tlg0MkJJQXJPJXE/JmdkRStMW1gpQCs4QnNFMVg/QmJnckkxW0A4cUdvW0I3Z1cmSDBITlxfVGJiXG9VYDU5XmczSik+Ni9nK1FPMUM7ZGhsV1cvaCxKKm8vNSJDcStkMFRkRUYnMCxETV4lO0AuR21AJVErMDxqOEFtai5HM2wpVkBORU1nWSpvUmYtWzIiL1liTHInNlg/bD9OND9Ab1BlMzwjXERRbmxKWTMqUFcobUBCIyhqcUJJSV8wVmQyN1hnUDlJJGBtVzs0V1BCTSk9Qjs9UUUyJjg0Ij9JWj4jTGw0X0Jrb2ZuR1Q7Lj4tZzByVyw1MT9LMn4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI0NSc6IGNsYXNzIFBERlN0cmVhbSANCisyNDUgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjkwMiA+Pg0KK3N0cmVhbQ0KK0dhdWBVZ04pJmkmVWVrZ3MuTig9Q04hJlU2JVRvbDA5S2JKZi11Jzs/LTBXVlBfVUQ5LFVXWEluLWdFbG9DX0E5Xy4+bGcnV2E5YFAzYUJEXGIpQ1VJQ2FiPl9BSWJocl1lWy4/PTFWPUlMJSplXyJBVl8uIz9nWCIyKTxycnAxJG1MQHQlPSJIdUVdUixPUmxvKzkzYmsjbm8qOlcoOV9HMGNmPldhV05lLCQ8LSdFMUs5MyM1QitnVl0/U2lONCdfdE80aD0sTWpKRF0wPV8iUUdRNChcXkdJJF00dT9qYDo0bmJNb0lMOCRKaFVeS11VXl5zUCc2X3QwNCpGZU1ab1M+RydSX0pwcGZhTmgxaGlScidvUEI9RyJcUTwrW209VjZUT1tvQDVfcm9dWzheUCg6WEo6Zk9KcGBUXEgpWUQnRD8hVTBlbVw5Vk1gR1JNQVRTLWomLiJgNk5QMTJASXA0Ly9vby0uQE5TQT90ISpyKWRdPThfSSMnKWZLJjhyZWtbbmJ0QXNaREMmUWVxN1FzOmRXW0graU1DJDpdKF1zUihfXEM6XEZfMzFBIWk6L2tuJl9YX1YkWHRjVGtXJjQ0XnFvOWJqIyFnRjw9Qis2VTRnNyltcjomaCEkRlxSZVVfcmlmQ1o0Ry09cD49bD9yZSNMNEo7SWphNy1VdC0+WEtFIS4zN2BvcGktYyhSN2lCcm5QTHJfP0g/K2xLYztfbUhjOGJyUy44aC82XFdJdWMjMzZ0bFtOUFU0aUZvSWUpYSkzTGJKMGhKXCRHSyM+YnBPRDd1VDNvVzNxTE9XPVk6K1hKdW5XK0IqUz4zXlpzXThVRGdaVzxjV2BQTCRoWERfOWE4LXA0UChGYjBFIy1lIUlLcSFJPGQkbyYrNVw/X3NWKGpIOG9FSkw8T0lHbVBGSU0mLFA1anJhM0BDN0oxTipLImNhRmY7LGE7bS5GZm5gbzNTJiNRbExMK1pKO1dQKSZfK0RBJkk7RD1tXXM1azdOUmpSdSMyZG40PGIzYHFWUixNJVllL2ZfKGFSJEAmcmpPNWk2JSRRcFM2a15aVW5xcl5SO0RNW2skcUpkWExBIUVPYCZeYk5cTGFvKnJEM0laODZWTyIxbzYnNlgsJHB0VDcyK15GZVxjL0BVR0RUL0loRnJZSW0zMjxZaC0xWihmamduJkVQMU5cVFBEO1QsYi5Wa0cwOmtcSi1KLV44VUIqOyw4JWNCTmtMR1djNShAZVpHS1Fxayg3ZF1NJTE6SC5cM0AybkRKR0hQRi5mS0plc1tTRVFVVy1UMz9yPy9eN2RwUEU3MWciTF91c0FXQ190ZzRaX1RoTi1VOzppJSc/dFg3QGNdYCwkMlFhayclZ3FlNjw4S1BLXzAsUU5ja1NRPCFvMF10L1EtOWEjJ2M4JWheUTNdaStqRUNrYSVqXFszZHRhQ2gtWkxMPmRaImhWXkojNlgkPksjOz9YajtGT3VLLFYua28+J2IocmVFT0BEIWlaKW0nO2hpW2glJmwmNzZZWXIlJ2A3Ri1lS0BxXTdlJnArZUNeRyF1ZDkhPzVAVTpAJFhgREJRMT5GPUIwVVNKLWNYQU4hN0ojWDNeK1tMQmlhVWw6MGI5Uy5nKUg2cTI4MjovYlFJV3UxMV9iMHBhRy4oX1BtPStEdU8uLlVQaFBQJV4lNThiP3MqaEohTkc5YyU3Vzk0NkptZCxDOzRPTiFicDZITzxoTVgoTXNMTFMkLDc8Pj0uSCwsLTNVbjQnM3RsNSY3VS5jW05DWC1EXSpjLmchQSJoKi1PUDJbJGgrbGJLRjEraGNfTENkWFcjcGA7X2k/JkskWl5YWWI3NjRfaVBTSzU1R0widW4lT1hlKFMkSGkwbWc2T1pQVWVMLilfKEJpJms4Q2luP0gqZS1FPjU2LkkzZ1ZHRm1edSQ0RCJZN2JMc14uTyxsVDhWR1BsLEptUidQYFNMRzk7TSp1ZjsvKS1iZDpmUFFBQlVbYlhJWkY1LlAkMDRgOS5YRDczNkZDKF51YldtZVohbSssIXJDNzhgQj5ZaGZPQFAvZGBVKk1hZ14qOFAsUEsyLEgyXE02YSExdGsqXlw6SVtuakVxVFUqW1FLLC5hWTNXcFVAUzwwV1Y5U1dZQGZHY2Y4JT0hUT4pJ21ZakZbLkM7MW8obERRPk8odWdUa0YsLmAkQTJfbCpaKDRCaDxGPEVdSWFISm00YyFqKStlbXI0XjlxXDRwOSdwOXUuSGpoPEhkNylbKWs1OEImKz8kcygiY0M9J0cwdF1HbTwwbyEsZDNscWUhVzVxRClkMW5SRyJuXi9VbUxvMFYzZjpaXDdrS1cxKVRuTDM1bGs/ISdgKClRKCw7bVZHWypkRTgmY0VpZ1BYLS1yQVU7IlUqRGMzRywxOyttVjFuLj8qUS9MUyhHWS9gVjhMOHJvUlI1VVNfZjw8RzFgLW1XR2w3SCUnLUNIPCxjYjpvM0FCPCU4a0A8YUc4SktJSVUkQ1Nlc0NVVWRXT3VcIjlfM0E1TSQyPlhJb1ZQKnMxWSFNPipScSEyR04kRE9GUzF1QksxTVBzQTsiTydnaV4lPDQ5ZFlXTW90Yj89P0lMXCoxRkY3JjllRmhHW081LShUNElMKm1NNzlcLlc1YHBaMSdZYlQ0LHFARz1bXC0rZlNLLT87S2glcHVyWkYlOy9lYm1QOFoxak1YSV1GPGBIUyhlQFo5a1JDTyNKNGk8UUtLYDlkO0dzNS5hQyxjN25oQCJJYEVHXlw/Ri9nWzNzcEElam9HLC0nJmQnVj1fQG1Ec1pnbmhxSFlQSnJuRUsuVmo7bUBhUV1aQTs8M1w3XEo9LTxXc2dcUlRSX05GYVhjV1dFX0pcRGxPP2tKTCtcST1OV2RhR049Xl5vMkFWIVtaIyYkaWVLOldwcENaXSJlVlJPMm5Wc04sNGxPJEolRTdsaVJWSCExIlxOb1lVOzUrcExyXjRwMmlELVZHdG5OUE8+LFU2bUkpXUM3UXNsRWwpNmwzdShDWXI2QzpWXV0yT0JlTE8+XS8rOmxUbFw6KEE7ImVYJi9xQF4+XHBoWmEzWCRoNVxrWFZJcFYzVyxOJytANVxzOzZaLEtyOT5EOTtebiwsTUBsWEZxSGRdUHAlUD89RVczU1JRKGdTalA9RS1GSUoyUGc1KFNbYS5fMUVZTktAPWcmTUZPViZFJDttakRqWDRgaDJVPi5VPj8va1BGTiNfPjBkcFshIjZeXlt0Mi5CP3IpP3U6KmEqXCE1XjsrJXQtIUpBRiVeODckKk0wTDVDSkE9ZFNtcDRBT0FSN2RBbV9mQT5KZSNncGEuPkpQXkRLV1ZCVT5XPiEqXW88dHNecjFBYz9UYD5NVTAxbEJgdD9pMFVaZF4ySVxDW0xxIXFxZ15CUWgyPyE7IzRNZjw4VXQiSEZFSWBLSWN0UT5EMl8oWVcoJ1JMa2xQYllQXVY/TGNrUUFDXDBINi5rKy4+JldeLCcqO1tcVTVQYy8qcS9rYWgwK0o+VG9eUVZlSWBrISg6cCFPQEddbFg8ajRgcEZEaklZRVJtUForRjhKdGJeIjsuTU0nR1g/OjJYZFA4YkddTzluVl09I2lNOHRWJzBDbmFWTT9WXzMpP19sc0ZYb0ZzJy5Ub1dePGpANDtzKERRV0xOTCM1ME5vTyY5aiRDcmdiYD9aS0w7JjI3O14lSkRAYnNwRmBkXjVSIy9XO2MzMVMzVSM5IU00VzIlVCpjUy4/YFhBQXBlX2xlQT5MMiE8NlJsOVBQUG1yQUtbQEdPQi8iMDU/J1pmblxkaFZXKiglLF8+MlwmMUwxSWoucU9xNlUpJG9sVWU7fj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ2JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0NiAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNzQ3ID4+DQorc3RyZWFtDQorR2IhO2VnTiklLiZxKlBVcmg3TGdqKHVnV09lUWEiOlluJm1QOFwodE0zWmZLPjBkOj1KZWxvX15fIS5RclZebUEsWGs+NjlPRlovO1JyLyE1YlFOZkZTPmgiX1t1a0NwQVpOQ3ByPEdicjIxJ1MhL2ghWGNqTzklJDFBWTU/W10+M3JHKSplS0hUY11Ac2szJ21fYkgiW3M/SF1hOkg6cEgyUyhfb3BeWjRoSj1zJTcwXktwQDVsSi0ubypjNC9OTDFmTUFuUEpMTXBTajU/UmouMClxRj5xbUNuSkQ7VWYoRlBib0ZhI25OPSpzX2FcXllpbD5FPWM5RW5yLTVaTikzRWlMRyleOiYySGwkUWlkRkJqQSFjJVROQTVRMSZmc0NfbT9cL15nPjhnJlpxX1VdWUhINzArcyFRN1AmMnFQXzJUJGklLiNJLC9eLDlibWk5QiJYMS08a1AzLTdXOz8yIjFnXVJuajBtS3Q/cmU4bTVKPlxEXl5SRyg8PyRiaVJccVh1S3IyQmc/SUMjSlUlYlwtY0ZkIT5laSNEZmElO18hJ1ZJPnM9SXVFN0VfRjAjQmZMTVFUQjMuLmdXblNiJF1GJipPMEZKPFcoXkVxRG0zQWEkLFFbW1YnbVdNbktxNy9ROFhJdEBsImpAJilKWlZlYnEhQlE4akxUQkdjZiROPl1AaWo8VlVlM1wyXms3JiptN2JdW0M9TTBadFxlQS42TmZOUDNUWSgkM0FqbWlKJi1cR3Ambzk9KiNfaj9ZSU5HVnFXI2chQnJIbFxRP1NfXFReSm5RZmhfV2Q3LlciVTxRaCIxSlciTl5DZzBIKj8+VyQ3V1QxXFYkKCpsLCc8Wz5UMj9LbjBwP3FHKyowVExXSm4iW1QpXC9yYF9LaSVVIlQsaUBVbzBlaCgkUEs+RS9XMl83PV5FXkNFSldPWWliTTFmRCRDOjRBLlcsSzdcRiImI1gkUnFgNyQ2UmdEJztxV2ZrZ0hybi0lNCw5IilQWipbPlVjS2NWY1pkbWopP0JmdGstKFlBS1lrTFptX3BsaUxfJiE6VGomb0tcSExDPTU+RG1GLk1pVGc0YTQpXW0jaVUlNm5MRC47RycrO2tSLjdQP186ZVZgKWY1QkVINlNqLFA+KlhnJ1JtMVdgaCFEZF9eTS0zOD9FKGVMQFpZNWktITFOLidVW2FIQ3I3dFlNOEwpKm4xQS9jWjNYUWFTNDtjciRjKkxsaj00LWFZYFxKW1Awbm5sUkJhMzlKVlUlI2ZnLStMUWFbXHIvKi1Gc2dvU2ZQNkFxXDUsX1MwTThtXy9RaioySypuLEhLXk5damxkQ0NeQmFBPT48UzRUNFhkcTJgajUqTGI4LSpIa1JIUjNNMElQJnJQUTdYXylMXFZwbkJAVzNtOnIhZWUyWV5rSiNcJztIWGtgST8iPWNcXERRRj47M01NK0xTLi03UidXIjVVJVE3RkZKPTxmTDNBST9XMGFkdUYsPXRGTyNCL0F0XEo9LGEwX3VXdUsoLEA8b0I/XkVzQWdqa0MnLiVAVE0laDA3XTxQUE0lJTpYcFoqQitSYFE5LXBWcjUuQylwPEBuTm5WdGolNExQIlFMLCM8O3FyclsqW0ZMOnMnQiMkaEZFYyRmSXJUaUpzQzFfViQzX09nXmRGJGU7UlshUWpTNXRQKFxyY1BFYGw4bShhLz1CY1A5SixdXiw7SW1kO1U6dSMuaS5MSVc4MDM8c0ZVZCRgRmk4VGFKRClqL0dCXDJqW0dgRDs9IzgxUklaI2VfJSU0Uz1OTUgtb2RlUVwlTi0xOT5aT1NoPkNpZGc4al89VkptUjRQSEwqXTE8ZmNgbGJGMWElJyRtSkg6SzA+dGAoVjtyRDRbMzZgJk10TipdO1IuXzFcWm49RU5HNWosWnAtXzspVkUiM2pbXWNFNDJMRkU+ZGtzYD4vX25yJXBXbCsjOy9CXFA2WidiYHVMQjBjXjNSOjZTXk83KzFTVzhoaSpjWyZsIzw4W1ZfQS4kSGNzQWAhMj9qYjFNLCNVZDhPW204MFQ5ZiM3dStPK3VzVWNgK2lvLW8yI0ZDTWNAOVdxQTZoVEVDJ1ZlKG0/bUlCKmhEP0YhZVFrNixjXU5cdVVpVzNfc29QbnRAblxzIzkkYC5SIW9lW1oyJzcuNjVSPCM5VHInazBhLEZmQj1eWGE/Tl5kR0UoQGwlTC5WKicnV29lVXQ2LmFtXixcWFJjLzxhMkpXOEhHX0orQDlvRUU1QzkmaTgmSzokNT0/XFxpQWQ4ZS9FWWZCayxCVls1T28pbCVObTA/NVAjJDw8MitgQm48ZFQkcnRcNltdI1tJOnJjVihsaFRVSTAmXylGdCJILkNjLTZdXSNZOCVQbC9oZz1ePFlVTEwsJVgkU2lTZSg2XEkuMSJaKExtXTM/M0BfYW1oT09eIVlGMWstWCNYUFA5Nmo/TWRZSzE8P1EvNG1DYlJlIWs4WSlPMmEtUW9WP0dYJkdlRHJEc2ZNP0dHYW5LNCs2bW1YSkBdPltndGhpMCliY25MUT4kR2BEYD4tP0tDZkJdSz48JTApLyNOaCdTUEI+LT1YMi1AXW88NiRUU2kuc2xxRCVIOShDZDcvYldhZydwRnMqLktdNl05Z009Nl5LVD1LKFVdW25TUT4tOlpTUlxCL0lucVdhOU8kPV5nRVFjVmE7Mjo2YmpeMVlYPCooSTtoJ0xSLkptK0A/alxWcS1HPzYmSipeZiJzRzdUIlBsMjNpOTU7VUVyQSdyRyoxOjlfaWIjI3NYbG5RaUMtdWpHOE4vWjUjUGgqR2YpLUNNbFtTcWBhbyQzWXMuTUY5ImNiTnBOcWtIZz9Hb1IzOWFAUGlbRT1fP0hnO2g8TGZNZ2UnTDFhNC1VRkpjKClkUClCVyltP0ArZEhWL2dZNWVpJmxOQi1RQ2xpRVNsUSNJZEhwYjRLJzBcU2kwaSQ+YjVPWzxJX1JjMCItWSQoWUQ8Pmk6M1U7VTpWOXQ8NGsxNCRddTA+KlZTIz1uWVtpY11rNFJ1THFiOk9kPUBoV3RVbG1nN1hhYk5gLWhAVDIhYWVSNk83RDtEZ0RHPElkNE11KFIiKFFWcFZYZG5pOEFVOWZFZkNBKXBhL0ZmRWdZazJcNUBZKWMlN0poNjJWLWJFPUZjIkQoayc6SFhzI1NqNEp0XGpPdGRfa2smKF89RmpSR01cOz9MK2A9JSQ+bShJVDFUXy4kJ21LVUA0ak8+QWBjZT8xMzNUL0c7dXJtKlhwSDBqT1tmJWJxIytjQSlBNVpdLCdeUU06KiplbztGYG0xbXJUYHE4KERoMVxsODRGRz5OK2VHJiJuaFVpbVkhZSdOYipQaE1oS111PVheRFhWZmtKQ1BbJjQ/WmkwaD9vVDRzWWNIW1pWaS5yLEQiTnM2dEhkJyxOMypNZCw4KGlLOSNuOyxTQjlZZShgTzdFMTtgcC8kcFBKSVU/cCJoLj8/KUZJaiNbSlI9KD00Tj5McCxiYDRHP2BUPGo2XkRMLVw4ZklVUmVFYVpJcDgtK0VWcFFHOjJjXkRYNjJTXEotSDVEJG5Sb0kzIiUsXzBLTnU6JEtDQSpXKEpEZ2glbS5UMmtCOV1jVjZkcFElYE1dUktPJy04SCtMfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ3JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0NyAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCA0MzIyID4+DQorc3RyZWFtDQorR2IhO2c/JERkSig0RGdfayEvJmFeIWRQLkpGVkFnXkg4bz0xUUE8XUxWQWllVmJGcToob05TcGxgWj4lNV5YU0RDJTFcMUIyLFopaEZAZmI5QiY7dWAyOCMpcEFeVkBPQ3E0LHA8IlA9OTlzQVFHYTpqY24mV102WUo1SHRzI0NoTXBQQS09Ri5bMk5qVU86bjclI3BBQjkpO0ErMkBlQVVIM05kRiI3WkhaSFMtYj07N1kmVHVPWSk2XjlTLD5NUEFUYSpDIjtKITkhLz1TNzBKczFYREQ1SiNPbFNcU15CK1VRUV1CIXJMLEg1U2BHalRgJU86TU87QWlPaGUrLS1qX2RXMys4Rk1kNVZ0MTxKTlUmcztAJltaL0dqM18+UCsqX0VvNURfTV1JNGFJUHNlczgtc2EzZVNFKFwoZE8nOWFdclZLIUFpOHQnXzVmb18xV1lFaV80OlhmMUYsI09lbFg/IiZlYkk5UWs/aWNHODl0Rl1OQUBMSDZvOmRNcl1dXVIxYV1KI1dOaV82cjlwJl0kLyglKj5mNVs4WkdZNF5UTUhtampuRTdEIixgQ11HUFtBLjdIciFERTc9R3A9RzAvbTRoIVVBK1Mwal8tJDpJdHI5PkI7cmQuLjooOk1lbnJfUV9xT1tQX0RrMkAxcWYtK3JkJi0/NXRZLllrZ11sX2Q7QChiMlY3K0RaY1NMJGkoKy47YGVfTEwuYCFqSUNDO14nPEZIKDdjSFwxJWE8Q21CZFViRy1qS2NqVVdkKzxnQEsnImt0NS1hJGgvPmoqXDBfbm1wOF9PRUhbdTlIaW05Z05aKWducE5nTWowSGMrTmMuTzw4LDBuZWwlbjxcKmMoUz5EOVswN1xCP15oQlFKJV0xOF5yX1EiMU9Vb1gidHIzbVZfQyEiKm48bS5CL10rZ1JqZks9NWs3RDxRZ2dkQzVMJ1JzUyZPWyxsSVJsYGBwbk5uQTowYy04R2FOWEhbW3BRVWFSWDQob2JQa1RpKz9XPV8+UypYXF0yNWZfTTZdNSRtaUZQZFg0MzAuLT89XzpoVHFVTVw3YEM3LS5hPkJoQCtzcUlyQ3RDTE5gTEFHTmBPPG5sPzU+XiUja1ZRU2xRTDJlNDpoSUU3VlwxM2pINyNXL1hndV9pTF8mLkEuRWltaDtYaFNJQSloVmAtW3U7cSxELmlcXEItLXJfcThrMzQ/Skc1PVsyZCE6Mz1LVVk9Iyw0IyozPSEhbk9mU1xvY2xfVnRSQCVoXFtFKyRAaU9LRFxAcklHXjRtSkguPFtVIm9gTllGO0FNISopOCgwJUxhZkVqa1lHQzo6SEI8cVRXNGtLLF47UjskdEJHWVVMPVRcY3Q7OzpHY1BmN3FZRTk+SD5QJ1haaW5QSkgyam5ldE1ucDFsZWo+RURZJVtVNjctKXAjNmxhYSo3Y1d0NUkxcUxXTiNGPSJucipDW2BJLmZcI1pRP2YpV0xOQTs8RjAzNVdMJWBiLDNZbD5ebTJhUilmb0NlM144KmhoRT0pTVwlRk86KEMqS2pSI1FuKEFHIlBnL0JpTHIxLl5XbCYpNmhhMVZMdHBNZ1VfXD8nWSVTVGpDRGZEWG42QDIhTVNGMDAsaWZsb05oaGxdLUFLL0NQb1k9SjZOOGo+bl9dNidwPUhmbChZaj87M0QxOXRqbk9HQXVCcVckNlAtIS9qJz84OVlAJE8tajVcS1ElZ2dMIzpiYmY0Xl0jSyI3IU8kbnE7O2g0aTFgcD9fSjYtMkRSamMjMSF0VCFaZj5pcHUzcztcLSpLbFRNQS5YaXVeOzRMKiEpPlsyczYmRFVTLGQxNjlcUS0saWJrMCJGJThSclNoKmQ6J3AzOFpZSjpNRy0hJVNgJmFxalZKVGVRZC1OJSpkcHQ2WSl1UVFXME1Ibyw7ayRuMk8obkdfYGw8JGJyNE1TJC1jVVo2QmhEaVA7XllXZGNEQmEvakp0RktVKTpdN2xyJHJvMnUmcWUnTlNHKD9xVmdJXyVsblJOb3JHXiIlR1RELFxQZFkjPz5VOlFaNlFJUFZLOGs4J1pNPjxUY0o2JE5oTGRrbWxwLlswNipdYy5XMSlxNF1CNFgmdDlxUk8jXmkxK0g6TDheXkVjYVteWDRdcGEhUXB1OSJdZiRfIjY6RTczXik2NmkxWzphSURVSUVOI3NFJCpeSjE1cmUmN1ApampuazQ9JUlxYkYtY0EzQ0hWU19yaFJLKTMsZy01bj5MZm5LcWwzYFw5TkdcYjpPMjxmWiNcX0w1Yz8+cDJDXXA2IjUhZCthaHRXKDxaS1shQGErTFk9Mjk5QnRHMjVWYTZgI0JETjUtXnUhNi9tRWdrSFZlJGU/YkE2OD1xYDhvMzM0SVBgYlwxK29EYWEzMHNvLUducFZQLGhzZDVlQmpUPCVHXXVTP2BQaT1ZXkdyQDkkRWNmXT9iQmtHTXU1VnVMKXFxVGFBcWkzW0tfViJGJ0ljR0dnY29ELShDMWhqKVZcWEdQNiVQcSdsLUQ0RSRmZzVrKmhZOkBqYjVIZ2JfSTNoYVs/ZXE7YC9cK01qLjJfPyE/YVwkamhvMXVmRDkhIiFOIi02cztkcDpnSyhKa2lYPWYuQGIuMCcsNktKYVU+R289Rk9cVkkyTiIjUy1mYyI3ajZmM1xuLDE1bkVQaE5DWltFTGdjLDttNT5QV1JFVmxDU29Dc0UzOzNdW0xrbXIhIVdNWmhxZjdpSFBUPFEqOVFoZktwZWhkY2NGSmBQTlFIPkNZLmNOazdSMUxfR2BYMiNILidbIVZRW2NjIWovU1IyU283SF88PEMyM0s6KFY8QC9qbFtuKkdrT11lYWZEMj4yMFJBMTlHSWs+aXFBNTFSZCg9cyQqOChHXzE+Y11rL2JbMnNddWUnMFFvaTwzKTUlLGJBcTFNJVQpaFE3TjxYZXRKKGgwYDhVTCsoYkVvRVdBdD1ibDE0Li9pLGhbdGtCQiFhMVVMIWZQW2BFQHBmUVZTPFxOTkApJU1MNGZcUUVmVDA1UEUha0NbSzhxVV1YbSktUWhaOFhaXVsjPiolXWpOI2JCUSpsWiUtMTo2dEBkOGxqcExfbkpqOV83IWdXLElQamxzbjkxJVkiQVVyMGtjS04jVz9HXW1OKFVNS15iYlwkLChvLmRUQ2RCbF4ya0ctLnNnQCtzLFVNSmRXakFXQEFvbGlMcCthdE1iaUddYGZpR11UYmlHXUlZX2c8JkkydDtuWnByKDlqOCo8X1gyUi9cQS4kPjBoUlpDcEZNMmZeYUkqWUw7OEspQS4nPF4ySUtwMXVBIl9XMG9uJjIpIWI0KWdrb0VjRExDZCs6JycoOjUoTFY1SGhkJiY7O2g3PSs3JiNaaklfXVMmTC1OYmZFakdKQTJlTj1tKW8hUypmOmkiU1U8bz4lQnJFaEYiJVsqIi5hPnArdVdsRT1NO1gxRyFHYEZFUCpBW0dbPFpKb0kzVS1QP25NTVQyJyYoXSldRSNZXmJEOihgZVQiM2EzK1VLSV0zUFtuSF5yQD5cZDQvW3EkciNdaVg7XV8kOUsoZG1TdCVybERpXjtvST5JdWtsTzFOJThBSmRHSlU+Q01dJVFWNFtuIWlrWV0pMXJuWkxvLUw6a0Y5U1NMQSJAbmJXKCVEZUdwIzdcWUsrTzpqYWRUNF5yXDowUzVmUkBIVShTX1M7cThpT043ODZWXC10XSdKZz4tTy86ZHBsQ3NmMGNIbmVTcWwjbjJoPClfIkMnZWcydTZKLl4yQHRlLDQ6JEQ3ZDwkQzpqTDhEMF8mcyJhdCNaM0g5UHVXb3I5dUVYKD9NZl5jImI+bGpbOWM3b2VlazlKTGFwI0UwbkVNPFFxZWk/R19aVlRTQ05YYUNMXVdpYVgub3JmTkhXSSVIbDYwZC1Gbm4sTkJdWWRCTyxuJiVFVEc8Ll5vVSleTShpKUg+NypeVk9yaUNNZ1ZwQjhCOzZlLjcwYC8jdSI/Z1pDQUhXJEl0N0JzRWJZLlBPT0QmUVIpNmBVJlRVMHFDX15DMiRuIiReNl9ALGYlSiYqOkJSO2IoIio0XFo/N1BKSmhhZFw1bz9oMjgxN20nKnFeNlFGTTVdVGE4cEghYGw2R1kyNGk3I2dOUFM8aUA9SWhXMWdGWS07JiU0bV1McGU3S2YwQT5HXEwwS0NtKlolOmgoYkJMP0RtKUIsW0xDZl5ua25zcDwkI0dXMTNsMDYjKERbXDoqNWNsTVYuVjItLUVvTGJrbGFaKjZzKi4sLlpMViJRLC5MMUkzPV04PGNYL1ovVl4jV2prYD5jUltQPUU+cjIkQTB0cSVvQ2Jjb2NuW28lJiYvOkJlN1JKbyVcJWldMFU5X1tNLil0aW9RcE9WSygpUks8Zz4uYHRUWUg5KUQ9TUkyN1RxZVFYW2AvbD4jPWxaaTxXUiRIPG1gKCY+Rz40LlZpRThmay8uNFsoTUlhLGJpRi49QTYvSUVAcmotQGxmSUZaNCVNNEQyIktRYlA3SCIsLSghXmBQZWsrZExDTCs2I0YmVzRYOGM2KTpNck83VmoyU2RtcGVxbSlFTz9JdD1YJzheQmUsOEIxPz4kQ3RTaFIwXF9tZmAiNDInLmM5W0A1L1lTP1JVI0pWLlV1Jy0+Jk40MnJLc3BvJSVrZFdMVj89MTlRYVEkM1BEbCIqXmpuK0BJT0c8OjdSaDE5LyxEU08/R2YjRS1eJiFsSyptOzw4aU0tRExuVmRuKXJtSGEmbSk7ZC1jSD0mYmhLWC5AcHEoZzJDLCgyVF1COCYqTC8zc1dDT0xYYE1qOz9fYFBDNmlgYVtgZHVPUHFzYVNxTzRWbGRBKThdcG5uRk5XaiFHJ0U+YUcuIkEuMSNiNG9UWlxmaHJcQEAwZm9BPEVnT0lsM289UEhjIVtrbGFXcE0+SSE7KHFNRj5ScGhbWllbbC5rOXNDIlA8PnNcRD0sK2s3W1MrMlBJbz9iLCFWQFZZI1g7QSI4KComc2YyX3FqZi8sJUREMzAiWCdHLiFSQklfMUohSilbQjcrS1hgRyFRMDI7YT8vPVRyRyxGIkBSJkxYK2whVk1WM0FhRiUvNGQhTzR0R2lealxDZThTLVckR0YwRy5MOG8lLzAzSlErYjxtLFInKj1OPTlqYGpqOWllSDIsMitUPUEwaT0ob0Y/SjNZb1NBQFRKVjUiJ3VqMmpEK2gtKi1fTiZmLywlVEwiX2sxPyNwO1g7KUwyPEokPiRNJ2M8ZmBHXFs3ZDBuQ2kvOVw4ZGBya1clRj0oJUR1aU1sZC5gUGU4amxadWwnK1s2T0BDXVY8Y2QjZSc2TiNzUlJAYDlDYkRDQmpyKWJNJzZuMmBeXSRFWzQ/OTROYyI4cThqQjxic19tTzxYJFppWXVfZzdFKEFgVShYbzI/OCEvUUB0U01HTUJpYytZY1tfSWRKM1xaPClaWD5KWis/QG5eaV09cFhaIitNQlc/cl03MnJzXC02VkFjTj05RzJXJmkoMmk+X15YNVtGb1dMUCEnU25Sbm1mPElxSjUvc2NUXC9AYVxaKT1rMEtkcGdJRE02RDZsajliL1RvLDprUnBcJmVIZzltIlcxckc0InJJZSxnPi5wJFRZRXUuMGMudURecC1EPyoqJDE4Ujg6SDdZZkdFOjxxbFBwKHVYJ1FUQiMzYyssXjRgKXJZakNoPC85Zko3ZypTTmlXJigvQyVBRCRHUCQhSHVDXzdvcD5bWjAyZVgyfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ4JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0OCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNDIwID4+DQorc3RyZWFtDQorR2IiLyhnTVliKiY6SDRZSWkmO2orUGgwPmUrW3NWSDo4NTYqZEA/KTA9NCxPZ2UrOzU7S2ZgXF5HRFoyYkhWXjJEN1c4cSwiPnM1MS0lSTxCJy49KTVvOVFncV1EWzg6VCFYTiJVIT4ua29BPXUocjVjJDRKMUtGcFZqZ0pxPW5uL11qPEI2aWNoaTYxSDhnbls6JWVXWmVjNm9wW0AoQFhQUlYxOUxfQzpWU0g7YVtySGlNRT8jQyRiSENgayRUTWIzIztIKV1WU0JiMTVJZj0zbEhQKkJlcjc0KD4tKzhUcXFsOS9nJF0uRDJISU9sPGUtMT9gSUlaO2NPcDgrVk5xOS0sbis+LDY2X0JtUERgOF9BSSgpKzI5NTAhbllNPU5VYSEsTGsiOCJAbj9KZ0tLUyEjaCt1QjxvQHNYLlNRKzg4WS8uTE9cRCdxLVwyJVFldDcwZ1tyQ0txLGhaLEZzJ0RUPUtgZD5JN0UvWFpsdTBqTW40JUFxM2ZWLzlkQFxTZlEyJjc5RWNJKTdAV1dtXUMxbzQzK2JdIU8oMzhdNmRlImlnKmFfSlJdcz0uLT1GOCJHUT1hWVpmS1xbZHRUMU48J1loNUFsTkMzKyghPT4iJmtDPUIySG5jVEwycEhYIzAlTVgyIkFnMTAxPUBRYVBaXS9OMm46JV8lJDtQRk9DLEc+Xmx0VCJwVEs9LVAtQmZKQFlcbC1ZKklJTD1LI3ROdTpUcmJVUDxibjkoVm8mVE9wWEMxOyFDTV9NdFRYNjdtWG40J09KZSVGckUnY0snUnAsK3Azay80QVNSN2QxSFFpSzVfTFRjTC1IQHFVSlouT1VHQDctcUhjUEgvTUheJXA7KSFEZlE4SWhuTEAqLChHW1ZcakY4TmtKL2VmLDlhMjEiSUc3LGUrSy9FXDo7JWlcXVJPdSheKEBaOmllREYjYWdJOTA7WytaOzEkc0swR24qP05Wc2B1RVQwb0tcXTQ/aylvcSxYNEVjSUE8Vm5yQ14iK3NAXi9gVFhdTEc/UioxMU0xLjA2XkFKPVBYaWAkRFtbJElCWTslciFHbzdHIT45OVpAPE5IIylxcT5aZDc4V0JzXitiZCFrYVhCKkhmQDVGRkQqbS0iQigpczhEQWMuZilMcCspJSxZXV5SWDAzLmUnM0kzVSNvNC8yNnRxUU1eZiJpRUAkLjNGLC1sLnMrZjkwT2tYJmNqUGJJbm9QR0ZDUWgxPjFTTGNNZiZxW2JwVGkibSwzZidVPnRJam1lcF0nYUVeYDViNjNLQzojRF4rZFZaMDxoZ0BiWGE3TmRdT010MV1tK1tSKl0rMmsmQiRDYmVVLlk7ZFpcLjYzQzgjT2hnZV9nJidDYSYqVCRDczVDPC5pczlFTFAvdEdaMmVTP2hMTkpnMiJyaitwQjczN183Yz48c2ZzUUVdO2dpTnBuI04rIj5PTD80SUZCPUQ2YTxkTSN0YlcvOEtvPT81RjJqSEo7TiI1IVlsPXQ1WVdASy4sVyl0SUhNQT8yYSpkL2ZTJENNVERxMF06JXEnPzQnS1lpYWghTS8xPVJlNzxANG0tTF02QiYtNXBHbWxYPylNPEpIbllaYEhUMDhFRlNSSG1HUFBYO1M4Ii9rSFdYaXMmSE4sajMzZDZaTTtPQCslOTghdEtKcFFcaSFLJFYhMy9tSG5nVypwcStMPEBlZzI8OkBRSzprX1c2M3FiXURvYGhBKS82c3JLak09ISJpVyVQJzJvKWwlajQ4TFVkTiVUNDlJPyFTU3JxMF1jNmAqPkxPITs5bTtrRXJgJjhvO0dYYm4/PFYrajU3aykqdDpJZj1lU1A+MERkQGxUP0ZOUVtMLUJqRT1WayZuXj1IT1BXXyRoPmZUIlRtQEdVOFEsI1pBJl5dQVIoNEU3KlNEU3EhU09qPFNBa0lGPi1zRkpedFEtITRHaD4+VyFcLnNFUFxbRlpbLzxPVFxCSllgbHUwNC1cMCs7TWNdNDc7ZUtHQVFfdUNCVlRwZ2JHZStSby40bzMnPWFaSSdeVG1wKz1tdThCKUpBNk0mOWY2SmZEKzdkS2dkJS9bbUBkM1NDYy1MIUNuJ2ZBQysiMXQ+LyVLJXIlIUgyZjZOTVU8VUJ1TTwtNi5NUUlqKUM+JmIrTCUuX1YxOD9hL250az1cXnBvTU04JkxfVXImPFc6RCZNYXAoQXQ2Ryg5Ik5rb1RSPjc3bDRcbzBoTzxmbFVgcj4uNlwyVXM7XW46a1IoZitNczBlWzBWTi5SUXIxUk1wMls7ckAjaC5LcjZxMSw0XzZBbS0qWyxVWldpIWxUST02OUtsNi5wZWlJUV4iWXRxczMoPXBGKlclWylnQzwhbUVOJ1s8c1Rnbi1DPHEoJCw4QFQkNypIYDxiKW9bLSleYTFBbkU7WHFzOikrWVJyPzkhayhiW2RRdWcobTcrOXJdMUJkJnM7S2JnJUs7SFUvN2pWI1xjMTFoXCZCNCtdTHNpLVk0LyRGUEFbbDw/US41JEBYJiQySEhWa3JcOi9nQU9NYHM4cCRoTk9da1YrL11rMmMzPnJnX2hOPk0jIiNKMWBpbERpQVxOQWhCOVcrNzYwWEo8cCgrQlshWmxIPTA8VGlPZDAqWHRQKHQ7XVY0YihpOFg1MVY8JnRVIStWKllwWiMoOCJdNi9TRCFvNms5SUZuLV4rYlt0LTpcX3MqYmFpYFlPbldTVVpaMVBPWkFRVGhYMFksP10wW11FYmUnUStiMFg5bSNPdFlgQjcyMEonZz44WSZFcy9TZl1PZWoiajcxaENtUGF1J1FlR0YhIy89OmJRUytLdW9YUDpfYG1STiVKVk8wYklyYTBnYiRjZzNCcj1aPXJCbW83RGc0ZiVnX2dhU25VNjMjW0ZgbHFVdS5rbiFgZ0k2USs3STZoUzdmYmwmYiZYZi5Rb2tmOkhuN2s1WWExIidmRklpaFwrO2hyPCM9SGk1JWMjc1Q7XzowZGdwPT8jJ3VjanE7TUAhO0ZWTmEuZFZbal1cWmJLMWVFPlVRTixWRDZMPyFELUQ/UzEpQUU9ZWA4bSMjYktbVkZnLnVsKjxDLWB1WjhgbmI+Oi1mT1RCI04tQ2EmXFEkSFgvcWAsLGlcRFFbNGFPV1dZWyI6MDJcSiZjYDlxTG1maj4wZDpGOCIpYk8zKDNXO1lOMWY3YHRPS19bIV8wWjNqOXJySjBTMUwwfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ5JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0OSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAzOTI5ID4+DQorc3RyZWFtDQorR2IhO2Y4VSZ0IiZcZS0qcnMuPlJhY2VeL1hpWzAoLUFuLy46MkVSZSoyNEZHREZpImFRU3VzTzdldV9WIWs8ZCoiW0wsUUdcZlUqTFQkMmRtamhAZ1pIMy9zZ1xnTV82SElKM2pNczI7WW9Says6TWVBSmFOWHRca0Y6KSxeQEZMMy0xNix1RU5IcVxTXik7Rz5oSl4qLnAwPGlqLS9aWFlKQDBvMyF1YStsJyVUaWZYOnQsP2xxTjlRQipYN3ItLy0qYz48NFtFcTpmbHEnMStgUksqKGRzNVddWjFrRT9JXEA3PEZebiYrLFFFKz1bW1VWPGoyXDg5V1hDVzVKQDYpOEwvW1g1Zy8/bTIxSFhfISdAbF8qQVpDKFA9OTZSXCRtXDJaaj9SRVlYYGsyXkhpQ2JoXEEsMWU2RC1KNlkmOUczaixZRTU3OTM+QGFeZmFqJk8yInJXT0NHdVpBVS1raS9MLVZILUk4RjJfKWlFQ1FZMCtBTDJCSkdHMyNnMHJiQFNdKkV1Ji5kQC8pRmJCXmRDWioqWDExVT51ci5zSDM9Oj0+T1VuZjNxTFRDZkpRcU5nOz5CPFJMSEdAQSNgR1omaWdSJyVjK1VDMV9ERnFGL2kwSjcmZUteZ142P2JdM2ltNXBWLlNCdEk4XD5vcFUoKDg9VzYqUFZNUEE/LkAoJlFZJy8rJ0NkaHEqJWRtZS4xUGs8LkhcMFFNTzZRdEZZblRgcS1aXUEiRVBtKmIzak9hbG1rX0JHQkRfTVcwJV9cU2RGVTcqc3VpbnNcNnEwcVMkI1hDWClMTWwsYF9XVjVFXkpFSXUhIUttVGVwQjU2IWpTNTNOTTs9NEUyYCMwNldvU0tqU0ldaUosKyRlXl1XJSI+WCNQJF1SJ1tjcE4uTERrTiRPLDNLVVFjVmhDNF1fPUB1Rkw8TD5PVj9wSUZCYzddbS41T2xpbzk8ZU0hSEhoUVlkRXJlWT8mZVwwSmY6ZmNXV0FcaGdyMCM9S0NxdUpBLmNKO3RPMWduUklrU0FYOE5xUT8xdFVedHJtamlkM3BLYFxASTE3S0ZLJiNNR0d0WSMzIW9KRiFqOmNeVTxqK2FdWz8palc+QVc3YUtJPV00amRuY0ViJ11PYE4zKSoqMTIsUnJGOW9nKl9YbFhMVmhrPStZZ0hTUWE7aSozVnI9a1o3NjZ0R2dtYk9zZXUqSXJbdWIwJS9ZLypZLyE9KmF1ZTROUmc2IWg9TEcwMU5hJFNFIyxBVjxgQDpgPjFDLlwwXmwwOiJYTlE1SmtGOilqOFE8Y2luL0hkM3Rrbys7JlI3W3U2cSEmPS90YSFabUJXaD5YRFpGXyNnYV5LJTBKPjMkXksycFcwSktdQEFAJW1ZKSVLL19CSSVANUBsP0VgS288NTkhMC9CLCUsRytnTXBSdERfb0dzVSJBJ1dgXjIhLzM2M2BaallVLVBMTTInW0FyRDJnXypscFgtbEIoRTNhSTk9MFddK0csaFRkTHBxKzJpZSxOXkhsZD9bTEY+JTkrIls8Pjl0JGwnaGFKPV88JVRoPT5UTkwuIVciXmxwOFNCIk1jTiZOJk0xa05mKC4jIVMjLUNXYHNAVGZzKE49OkJwW0NBNyleSzxWYiQ0V29vKWVvWyVUSHJJJy8rTkNnZ0FKdGU+W1pEMltfWG5PUXBnUGsmUEIuN1omOC11S0FuMV1WQ189Si0oMyRiJllbYk9ASmpvVU9UOC9sZyExT0tIR05XPEIxZzlbTVsnOyFRI1NwZnJoOGQ+bUBrI2ddUS86b08/RWpcTFRBSXVSOStMJ2VhIUpFWjFAWWZxPyomTygySm43JE46MUZkO25NZi0zT01OYihhVVhzS1hlJTYjcHM+WCs0PT9NLnI5dUU8JT9JQEJcWTsqKFlAQ2E4cVw9dCkvTzFKVXFAQTlmQlJUYUchKEhCWjU8NjBNaTYtPjYqPWdxJW1pX2RXQ2VMQkVYQjlUYGctV0E6YUpbXVtbX3A2XE1APTVEJ1wzPHNhSCZlb0NhJC5dcS0pRmNiQERjUSczOSJXOXBNTkVuT1kxYzZVY0h1bkssZEZiaV5PVTBNLDVRaWg0Mmo4YChzKmc8IkJRNV1KK0Nxb11kIldSbVBMcE9tVXE4WVZfVS88LjwmU0t0Sz0yO2QkIyNRLnI0WVYmTkNaR1Q8XkJJWURXIl1JXVlaIj5IMFVURFRCXVBOLyNxbXFpL1QhajZbVUckals/bTgyWVplW040P11gU3UmTksiTCNiUF9uIls2Z01LQ2Q0dVlCXFxJb1ZwXTsxKHFWMnF0NTpBZjVaa29US0lZNDAncHBsU2hEXCFSYWcvNEMiWmhpS01OXUlyOE5nQGZAVU5mYURUO0FMZzMqKiVyLyhYS1c5aTZWPjBkYDcvO2w4YG1ZL24/R0AxIzkub1AwaV9AdFVoND4oOHIsQipycTNLOGpaUW1bbmc6KF9IQUldYSxPR1RFVGVSX0wqYTswYm4iYEZKUEZfVTRVbFAhUGdkS2ZLLlZYU2ZkMnAiWCs5b2BmUWkpbGlZKWVcODk5QFxhal9ZOUApZl1VdWpjcipTKDkxcD1YIjsmLiNPRFUsXFc3XSdnSipfMGZWKCtHXlcxPic4UT9JSkxGcmZJRC9iT2o1bzVQKExLVms7cFxIY2NcVyNkOllUXm1CLCphbjNHYlJoZzFXJzwsWTUrNlxfM0RHRElpUmdGdEkrY0NPUUFeYzIqVF4rUVRqOkFdUkU1X241XlFoS0JLTTNwbTxFOThjTSkmLTw0bjwqIzFYZkM7KWVYSkxrLkJeYEY4SFRQQDQibV84bmlfWytHI2AqKyZwWVdSVTAiS2whcWpsZCJeIUZULkIiXDhNOSJcUDlncTNqQEI4KyVWRmZiNEdtIT5cV3J1UCMnJU82QlxHLjZOQ0Y5RFpnOlQmdW4vNVg/c1MuVyNFNi4hWnEjcURgals8czVOMDNocU1tT0lRWF1aK0knPz0qVGhyLC9sXk5ub3MvU05jNUBVVjJfUjdpcEtGOkdRbUsxajdON2BwRFUxTDheVGs7X3BKaEUyI1BNc0deMTVSLltQU0tBJktPaVxaPCRgbjQyZk5ZLmFVPC8sUG8xXGl0IVxoLig5WUJeWC8zcDVfOzwuPmdSbSxmM1FXMWUqSDNeTjRkRUFyRCMiNjpHYzddLWI5WlokPlI0cUZhLkwwMz1kXElYaFpgTHFqPmxecmw8YmQnQyptVlBpRj9TZktNcilZK2xrNmBVQSgtQU0pIi1SKylQSCw0LXFUPnBoSWhOSktWZz08RmhdIXRIcGNiOzYuPTgiRmIhLGItLzE7XElAZ1BkYD1raUBJOiowTFspakkzVEJNJyYpNV4wSlIoci85LilfY3NLdSVhVT8hKkBpRVcqUTczOFUkLUk8MCw5Imk/J0ctQVQwSm9OXy8+NChNX2NidFNVUzZpZzJVWSkpPEpEY2gscS8wO1k5TXBWNiRdMFc9WkIzU1hNa2NhaUBMWkM2LEhkYXFUKFNCNHUodWg0N3JMMGdOS0JJLFdwS0NnMGgqJEdsITRfX2NIRiUmXDQyOGgiKHIwXzotR0kiUyM1L2VAWHBRQ1ZWc05sMlFqYzJmOmhoM0h0JU05SVkyVkozci1MQGJmJy0mZm1sIWlEKEhGJlVaWmM5U1JYJmBrSj5xbWRxKlpvJ1EmXVIzJD8oak4lW1pFUD5rLkgyPiQ3ZC82MyQnM2BBYmUmUSJTPSdkR1oib2RmYyNobz1RVFVSO1s7dGVITFEwRkRpOkswTSJucEo/RVE/Y3BxQkF1JG5sKi9QWUltTlA8SyFRZCYkSFYxVW5IV1ZaV2I7NlQpPVZTKVxYYTpdaURvcD81OT8jL1k9VHM4NFtjOWdcP29AVSpfazopXjhNT1FPQi85JTQyTy5xVG4xdCZqKW42VW0vKFZbbllgLUsnP19kVi9NIjFpZFpUPTxcYDViYGsjIkVKPTZYcUksbm1cOWYzT2l1N2czVTRWO0RsTzlbcyYpQjQ1Qm8ncjV1O0lSZFd1MG9DKDxJMjFISG9TO3Q+J1BLW2ctRFZfSldebTFgJFFYTGVJT0lNZzN0XEZgX25MVVg5OV8mKjhXbHApa1U+WkQ3RGZZOThLbydSM1pAa0VkO1hiUlApK2pYTmVUYFcxYFczWCxiZV9EVVMxSTQlN18+PDNOdDlfKWw1Z2swZjotUUc8bHM4NVxabzpZSzhAYiNbbyheUSUlQltZQGEnSiJZKihWQylcL3NJN2U1SzVyRDUlX2IqRWRUMkhTZjplX1NNWWdVcUdWailvXDwwS14sWEU2O2suQWJ1b0svRW03TDNdTy5CWU04L1YjTidHK3BmWUxGUT48aVYkSjcyNyVocz1xdTUtSTtTIys+OE9AOWhVUyhDMyU2cGQ8TS5nI1VCXXJBZV9cJm4/K3JYS0MpWiNdSEUuaHRoTGtfMVRMLURGaiosMlk+XnJlP0xQUUlIJi48RSJMX09gdW88UVNvcEJbZyRhR29HOUBBTnNwcTlHZzA7Y1dCPTE2TWFaS1sjLDNeWUw5TUpvSD9HNSgpOHI9Vi0tQ1M2W1I2NC5YOFsiWl1gYWxuPitgL1BXInRjMyQhQXBeOCEjQyVNKi45a0A9KGJiUU1PNWMlaUZvJmFBZiNwK1NoUm0lQD1rMFdOTS05Z2BzVihzOkFaaiNYPGwxXnFGLFRqNThkWTEkITs2WjpgdWIxLyQmM2okbWdncj9JVVVKJy9VXnQ2TWYsT1QxUzY6NCY6XXQjJDNCblZeISotMmNPPzpIZmhZKWIiT05hImtKVm5JZChkOyNKIV5jNW08S3E3cW9FRDNQSmRmSlFwOWJfZClIY0BlUjdTRiZXO2A3TSpDJHVlV29HVEcpT0E9SyE2RExALmE1Y0I4cG4hUy9ETGdgMDs2NWBCWnIuNzROayNJIzA7QkhFSldGZjhOYSEwQGcxImJfV3RlUSNGTlVEaF9BNm9jSEVFXFVVL050aFEqal9gZFZJc28mPXAqVVksSz1uUFs1bDxMP09sSC41XTFuIipnPjxXa1ZoMiYlZ2AlSElCS0Y9MlA6YTFgWnFIX201dEhHNydCVTdTbXRXK1lWRGghJyJeIixvOUp1NjlrY3RVU15rLjByNiNyRkZaOGEkNy1LZSlGP1tvPmJlL2M7LGg9JTMiZlMwYW0zJS4iZ1spXF1Efj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjUwJzogY2xhc3MgUERGU3RyZWFtIA0KKzI1MCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNDIxID4+DQorc3RyZWFtDQorR2IhU25DTiVyYydgRD5ccysvN1hcak9cRjAwY21SNWUiMj5jbyI3LSVuM2JpIiJoblkoVk4uLUVQNV9vSFYkaHFqMkA2aChNZWEuSlBBdVVIMSdZJWs+SDpqJXQ1TXMyYlhNUUdzXCs7Ryk1MUFhYyYyQ291Wjk9bm5OND1qQDkvMVtYNnBHZjs0KiJtYik4dDhDc2lwa2IuKiFERXNNIzpMSS8iSWFFVFRxWjMqMWAsUjIxTEBPZWohdWcpQkhocDdYOF1VQG5PaWNLa25zdDctSGk4OmlJPF42YzI/ViFwRC5oPm1CX20vUHAkPjdCPlw/UzAwLUddLiM9RFRzNkpSJF4lZTQmWidVLydYYEFmKy0zJVwyJlAyRC5ZJzlWPzE6TyQnSTY9ZCY+QDQhOiVIJ1VvRFNXYjZCPWlzO28sSzU2SjxObjtoMTRpOWM5WyQuRG1wWF0zUUJTZS1OJGkvWWxcZG1CZ0VrMCU9bTRURE4jQW8mZy9UT106UGZfYUU5TDVvZzBvN0pAaDFgZFheTHVYSUoqRE9ZP0Yzc2pyY0dsOzBZaDpvOzQzSXFGYmxycDVYSUQqVi0rRzEnbGptNUIpbVExP0BfUFw6L2tOaTo3WmpBIzlzciZhUlwscFA3JEtKTmJQc2oiMC9CWk1eMFAvQSxTOVkvbDFxcCdGQzJOMm84R0E/Nm5ON2FlQFwrcCovMUNrWGhxS0lOWTwqMkEoSUFPUFdCJ0pnPTZrYlVcUCwqSmREOjxDTltLTFY4QU1WVjVML2tAY04oSE50Ti88NyVfRkpyW1NkODVPLSwpJiRiczQtbDIhVkFtbyFJT21JIyFzUCZYRzV1VSRfOGVcMFtURi44YVZMcU04XjlLLihxMjQoK3NbTSRlUHVVSEkpal5kJzsoVE1dbmI/Ol4sbVZBMi1LLTk4bSluQjw3JSJdLUdXOCpmMlg0LVdjbCkxZz9qMGojaTA9RUs0TzxHZkREb2U6RUleWWNPYGlZRmAtNE1xPyMyW1oqcDNVKmdBbTxcLkUoW0FJby9GNDo8LS80NjVaSlsiO3BdTElIKWk7OkRYO14lJlpsbTRwTCtUPD9IIy4sKk1QIyMuNWtfdDNhLTtiazNPRiVKYSUra0NWITRyZzZgQSxIIkdtZGtDPjdaN2wycWhhQl4wK3VqV1E0LDQkOFJPZTtBOUtqKnVpWFY1cC8kQyFGQCJuNTZJUmA6Jz9HWUZRITlTUUMqRmQ3UURhY1hsOC1KKCg8XjJaPTw1Wz4haVhgLkNtW05tXlAidTA4N1BZW05aWXM1ZGFvbGkhOFo6QHVIVD5vci1JbG45M04wNEI0MXUtYGhoTGdxbmxkNkQ7J29DNWRGbzlhJCJLY2JqWm4rYjoyJSxkPF1VR2MoVW1ALilPXz1fQDRDZSchdDdQJ1c5WUxNNzEqaSVAPStbLVUxJiMpIjBSTiVZOzJidFRCTzovKl1AOUY6bDEmQ1xuVzNNKERdZGZPb0xaIUQkNmxzYVFMIShLWW5nKmZfPm48dC4wbGJtQztDS1FYTjduIzJfW08qPmZmZSc5W2RlYTJ1Jzo8bE1mTC5yNFttXGMrQ1wpKjcmcyhhYk84cyRHQGxTVXEybls/QURKNWZsLHRAWSNsRGU+Rio+aVRGPTVaLiMqLCRZQzJqTFUsW1wsLFkvPDdcZ21HTThoJSFENiUwXTpCXCI6QW5uQExzPDtZLjgkIltXSkljalxrZ1hgKTpXMyE4a1g3bCVIcnAoXk1ITTJxOjhXREsuIjMkTGY0YkozYy1zbFwiKz00Ty5zZjdOX2ZDWG9tMXUrNzc7Ii1WdUxYZXRWaScoSyxxUmVdSnVESGQoLkYyNVQzWjE6SmticlA1PStjZVZUIVNmaWE/MS9NJj0mQzRQclFYJkpaOCZBOCo5YWg7QEc9PzgyaWthb2AvNDwvYEg7M200ZjchVjBGbCo1RCNoaUAtYSldJ2ZgPEFpTzE0IWNaamZ0ZkFnLyMlNkNzUzRXQiFgQiExLVQtSV0ncSlqS2BMTFM8PCY/S3BvOj5lKzBQRWhlMURdcTpOYGQtUkZcIj0iNCU8XmAzXygxLSpSSUFmJS50OEV0WFwpPVFkKHFWWEEkIVYoSU1JLCJuJypOPjRYckNvZS4pbGxwUS42NlglSHA9OU1LOzsvRmRoRldRYDhhXCJhPjAjSj0hL1lrKGhrQGEhbWdrMy4jbVk0NWRELG1yOkpoYFU7L09yRVc8dFFNJTo7Z2NZVHJPSihPMz1FUltVLydVQHI0NFQnUGE0aVN1bl9ZZkA4Xz5YaipuVS5EZk9kXyUrOkNeUzdtM19AJk9PT0NOS11ddG0vYjQpJi9cI0JBPlI1NS5gZjRKJSxmVS9CWmEwISQ0ZT5tWyQsLUZKRzkqQnJzVlFzPlY/KEdjUykiXEhOJlxuQ2RZUmYrTzxlSmxvM0ZDMnVDYG4jWyxIVXJnVW9cLHIsXCMldVRqOWxMN2syVUpFI0pkKHEmSip1MEszKVUvL0s6MygpMk4zbShMK0JtI2N0ZDAuZFluIiotb0o0ck8wPm5VMGwrLUBWYFpmYGJ1N3M1YV8yWGMvO14oc1MzaTNxKUIlPFNTI2YjQXBvUVhjWj5JbGg1X2tdP044XkpQLTYjKkIqV3Q9aUdITSpDKlhfNEdfcS88UDU7ISloZlJIPGU1YkkkUDBmXF0lLj9OZlIhLi9lXjc7MkU6czFNPSEmY10wIUkwU2diKF9JJkNrRypBLER1XmZdLFMiQTUjKyw1I2MmcG1wPDsoMGpoWzlDOi9yVT0rNmU6ViZtU25cclRtQVo6I0QyQkA4aCtCY1M9WmpqZDNzYnNuY1lsbipwJWlVcDEpbF9wO1o4NWc0YypmZ2g+VzcpamZmKkI4aFtJVyo6MFk9I1pZXjw+L21vP0RVUzQySSxscF9fbWMvQFA2PV9ZSVhVUS9FSEB0TS47Ym8/KkJsUi5pMS4qUU5rcl9BPmNmPSMjJ0JRJSZERl9eSlNldSpUT2pLM19BQGszLkVRKk5mMllhPVc0a3IxP0E7QkYlRyhZVypRL1ghcW4iUjxvaidjIiRlV2JuNG06Ym8ibllXXCI2XytSRC5YcCI2ZCU/UUttXiUmSi04ZnE1KFdOUSdNR1sjVVI7XVt1RiFoaUlSYG8yLDpdWF9eUU8hR1ghYmtmVE1ZLzZadTRvI28rbDA3N34+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI1MSc6IGNsYXNzIFBERlN0cmVhbSANCisyNTEgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjI4NiA+Pg0KK3N0cmVhbQ0KK0diIVNtZ04pJSwmOk1rdXJhRl5MRkNcSyEsdWE2JCpCQkhYUz0+YVQzY3VNZSZzQ1YnISFAYUxyOmYiTjhWcjxGUytcZ1VoNkZzNDhSKiRER0wnUzQ1VGciLXMkK1UrOjhXIiIvOlxqcmtvPjlVKW8yKSdTNSguanFWal8qNGFdNT4wUCdcYmtOcHQ3P3BBPm1aKyhrWmk9T1MkKzVzNjlBdHRgUSVZbGFfK1VBb0tgcT0mZFFqbWNRXkFmdHNmRipGMEAvO2ZVSitfUjJwUmErYE84JU8oJypmLTguYUBcaiRdXD0jRkhDO2k8XGI3JmM5PiIjP3BwXUoiMUp1K0JPYUhpQCldSE1eZyVoLjJ0YHFxWiZrNEY9PzRfdGlZUWY6V3VlQC82QV5zXW4+LWhENUQ+QmBJTXU6ZWQ1IzlpPFhzbUAsOm4yQWVRYV8hajYqYEEzWG8mOGMqV2BNQ0dxS2VhUzVwQyNrckwocGpEUS44SXFXdE5WYVBQSWVWOXJDUzlQJ3EvQCVRa14nb0lYP1JbRU5eZkIqbUJjUjlYb0xYclVVV2NRQ3VCMkA0Q1VZXjtkQ19DUmkhOl84NihuV105cEt1aHIpUENCNFYyZ28tK2luIjBNTyhdN2VSZmRJdTBfR2RVWCpCb1lgcU5DX3JUWV1oLyxZbnJAcF0pKDQ0QDY6KDopdWMjKGNxOyxrRmskQlZpU1onTXItLUo5cid0bU8raGRhdV1cailHKzdHanFUcEpDOzBDRktkXk9NR2dJPj4mcCZYWz4nJidsPV47QGo9dT1BNS5qQE43WnVFWDdgUUUhUCxaKSwuMTxbT1xKLzk7YE1hbDhhKTwmIlo1N1BlQSRIWihBNVJBLlNcM1tqblhyWk9hcTxkTkZKQis8NTlqPEooLiY7VHBxLUVpQmZoV1M5Yj9QY2dQTVU6SDMhOTFIWzUrVkhmJWFiR0NPUktvcnUwcWJpbiRxS2k/amJDbThbaVx0PF8zVGRWakxpXkIkUkcxPydFXDpgTEtEZGpqPjJQJTY7LGgjNW8lSEphdTQ7NSFaKD5eRXRWJmYxXTEhJT9ARmttSW1PXS5BRk9TWmRUdGlcbSR1Jm0pYVM3cWI8SnRfLT9lJl4qITcjQiJkNGhNVSlsQSs7WCFSc1FCO2QxJiF1ITI9PGwjTFs8OVBOZ25hUk1ydHJnNDQrZkZWX1lkYks3UDkhbDsobW1JWEJgUHRPbSlxOE86a1pJbSFPanUsV2cqVjNDPSU8JDc4MDlhRmBzWFBPPHNcTD9zSnNoXENxWi9pZ0JWRCtHVltmRVI7RyFbKWo1MTstLi1vK2tFXiwvUkNkUmpyW1hFPHVoIz5Mc2NXb1t0UHUqUzwxbHFjckJlYmUkQjY1b2AnWlNFaFMlPjJgOExiSlwoVDFmZG1CYl4mM0heMWRnWllWTmxxL3FgcDc1NVJfPFleOHNAME5qWWphaV1pR0ZmIVhmTDwrYWFeNVBsIUF1MjhJQ2lyYjhnOC0+PSgvLWhWO1Q7QWVCUi4iZnFUT2JTWjojWVhUb19uLCwmIjNtWyg0Oz9ERl49LW9eRVNtZ1p0LkMyWWc1KyxwOnIqLEY0XiVgPWJfQ1FINFRnVlgsdVxmO2hMUSMzUEosZFJEJixdMVBmLUpzaVI6IiVVVXFjRjtWXU1LN1E6XWFbJ1RxUkgvPzNYVGYqbEwkKyVNQWEoYy8lTVVfcSgrLzBrQ2NcaEAjKj49UWBGLURUbW5tKWZPNVMrUiVlYjFrVCMkPDlXNCs4NGBHdWoxJDZYJCM+NUhbQCIhbXM7R1FlYU0kJEs5PFNPOGJoIWU4cUVYI1RYRypOSHVyM046bSxnNGFTLmtXVjVUTjluLlttPGJISjsvZUUkKFQ1PTY4RSMkOjdQMko2KVdtN09ZcTw9JWRqSVBrcjRPUGshIVBlPDRCOzZPaltMSTZDcjBWZWthIVtAXUo4QyluQVI2cipvP1NYViRtQC87Ly9CK2g8ITZKMDY4Jm9nJCQ/W0ZyYiFBYTAsJ3JuM2BJZlwtXVlcSUc3ODFmRThVLUZhdSlPWThCTSFcWltucSg+cClkYSJpQFdpcmpSLDlxSS0oMFZEPzVJaV8sNzhvcm9TZm9xRWQ0PUhLX0glW1hFLl9QbTFMMm1jUlNPOkVSPmZeYkg1LFY1SSpjcTtaLitZJS1kLURUPCIpOkUlOyFMQSZdXV5ELVlcN0NqPXRpdWg/XlVBanRkb1hHQEA4YW1aJFpGWDpiLC5GU0ZMa1pMQjNcXCJoKlczVHM/blFNVkxvOnJ0L1c9YClJLkArJUZcWE87R2lhUVU0U2YpP1wjSm02QUZgLSxNJmZkNmY3QUlXKF9zKFduOkpKQUwlaCNiN3A5b1FwUT0mKGhZM05ZaTw4bldHbktya0VLNzs7LGQhXF4/PDdmJCRCNSFHMmhQK0BXKlREJTNealBCQDcqSWRrXnJxTD1AN2Y8bllvVipPZG1bRVBTbVxLKS9daTk1OnBbMzlbIWgnMzhJMWJGIlI/U1JKT1ImLURkVG9ocD9IUWZoJy4jIWM9MDc9OmdBST0sR1UrUzVrOXAoIXA+R2MtYmVGSS8zXixYJlFORlAwbWNHSDZYKDhHOF4+Si8xYk8vMTJuTGBUNWg6cWZFYidsOGU9MDwhJDYqQGtjcURuWkVDdERqW0khMTRSMkRrM3IzXSYocDRJZjsrTUZMXEpUMkxEdT86S2FyW1AnM14jVmNXJXB0WT5LOF42I2hGJU5cMi9qM0MxY2BsP0Eibm1UPFZOZzg4a2swYko7az1CN10/OnVGcF9NcUdbKExRQk4/Yic3Wl1BW21uK2NgKHBxM0M/T145YzhIZTdVNF4vXDg3XkpualRodDE9IVY2ZVQrJm5RV1JjJV88aUg8PVBdUCcnUjw3dFpUUmksNjozPiUzI1dnXz4idG9fcioqKlVJTEphXVZqQkc3bkBmPEdJZF42IyVcPGQ/KC41PHUuNFxHRURIN14wUnBlRDdwLjcrOGw7UVchKCp+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTInOiBjbGFzcyBQREZTdHJlYW0gDQorMjUyIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI3MjkgPj4NCitzdHJlYW0NCitHYiE7ZUQvXC9nJylsNDFzKy9mVWs4bkhCLSw3TzhxaWphQkcmYmRNWTIpL2oyTiowUWthNVJHRkBkc11wWGU6Mi5FUEtLKEhHMiszNWMoQl1hVFpQY1RMZS1qLGxQJ0drUT9LJkchImJxPTJsWFNrbktBaVhQLjZiV2gydW9ATDFbZlQyQGA0clAna1ZuaVlxV0VvNmhjUlowR1RLaHJEJlVBZCYkRVNSODYzM1g5N3FBMiZjX0dGdW0sTnMoKlQ8MDBxa05STmB1RGM6bzA6PW9tcm5OIW1INy40amxgUHUiVEluSDQxZnA+LzNRRidiNFlNY2toTEdMP3NRLjdHJlBnclhRO3BUY0AuJmlwOyJkSkktIjRELkRuZ21XUTxoUFJuSWVSaUVtJGksOUR1J1lLX3NHLHM5Ni5rakFubVVuVUFWcGprRVRLLz0naTtoP2p1a2goN0gtbHI5PyNpaktxailHY0koaFhGLk4lQUo5PS1XV2ksXEckOzNENmtrYEdKbzluKE85KS51QEU3LTxEOiVGKWxbYi1PV1tZQEVASiRgKmIwTjpTYWVCQkcjPU4vQ0liQSpzQCdVQjV0UmxpRmM3WSlqWjRpOi0nbyZfJix0KWlxR2JZWHJyb0Bsa00uVFNINUhAWzpDSExPdDtVJ2YlKVJhP0g0NyM3X2ZDRkxPWzpYS28lYUFWZWNydFdOSDJZcjFaYU5tOGBKZ08tYkpDOm4+Yz9CPSU/KVkmNWxLSVFJP2NeV0dyMkphPEMhJEVzMzpHJnVKZU0mRSksK3U5ZDBKMG8lYT42S2c0cF1DP0UzdTIwI18qXlQzWzU4a05CKk5lazlnVDAmPChzKkI2a1xqYWRiJ1h0TGxsaz0mVk1kdEl0SWA2K3VWVEgnInJpLS1SPyc3UTh0bl5ZbVxrcjgzZ1RPVzJSMTtiJiIpb2VnL11dYGs/X3UtYlpjLnFPRUZaaEFaWFVPXjlcV20iZTNgMGkqJS9ucjtCKi1uZFcrYVosVEkobG5oKlNlPXE4XD5KVVUoWy5JTTBmK0AiWmVNLEU1TUMmNERwTGwvUF46WzwsKipkUlUnQmRzUVRIMFVUR0psLy1adG1LI0hmMS0waW1MRWpzVVVoQzJTJl8+dFVBOUY0VUg6aG4/O11QWkVuNlpCT04pXS81Syg2NFxwRCgmSTdsaWBwbU1xWWEzcj5GVm1MQ0VkQVBHaVhMbV4maUZSaCpAQCY+LjcjbEJKUUQzakRyVkZLNGZDOHMmXmxhVjAwRUBXRypzOj48ZiMnaSFWSCYsc0I1UEBzRkNXTSs5OFRGZUdjOy08O21SY0pxZjBWUmY9VGRPKDpcNT9AQ0EzZ2leREUwKzQ9JTAsXj1aPVs5LU9vXEMia0EkRENBPTRsazZYZUhlP2JaTiNtbTAjQUFWPjNwUUQ+V21rL2JfNGYsVnNTYiZFYV9VQGw8UT5iTisxU2AiUmc7VFAiSSwyUS11Rk0+JSJrZGs9VlcjJVM6cTMjPG9HbyQlQHBQLl5vIlI5bihvJ1oxT1BSTi4tKks+bj9VIXFCbFwyYVFqIW9OT2lubGVfIS9NUGRwTk9LU0IzL2NmYDNXUm5NTUMnZWNHTlBQaUktUXBLYFA4KmRMMDg1UXIrPiFTXVllbEFpRUJoQ2pIJ141Li45MGdJUmFHQGZMLE06K0cmcWpRcGRJL1JCSjtDV049NmFaY3BLZ2I9W1xyT0tJMiZKP0JNaTtaXExNPF8sMTwsaGZbKyhvcTpiXnJBWVohRipVbUpUQklEak8+ZzBaRUhVQF51Y3JzZ3RURzZRU2BJRyM/dWo6XTNkUWlAYkcmKGlcPnFlUSZYaTI9NDVzVj5JUDldSCMhcyVhNCQ+PklISy0iLionNUteJFFAWidiQkRTLmZPUD5bWlcqI1AtXSoyRkhebytUUnQsNVpVaD4tVT8mYi9OaG4vPVdXXmBzRGhsaFAja0FjMy89Yi83P3JnMXEjJjEsa1U8Xz4qV0ptVi0tImVQLGJKZS5WIjFXYGdQYV9EUDMlTUw/XGkmRFVvaV8hcVdlZltOTWRrXVktMEkjZSZZT1tfXUF1ZDZFUyw3I0s/bEhXK0ZKLzo3RUJTZWolZkVBJmlwXkNBYjspVVJoPGtLTltuIVU1YDlwNC8sUjA9RDEtXVdyNl1AQ0xecUEmYlFjUV1cZTJhY2pVPi1tMDJTbGErazNbKz44OWlkXC8uJnNDNWtuKmVxaSJccSRBZmkwX1BJLGIuJ1ZlLyIpaEklJW5BWC9uYTdZSHBmLG45OGkxNDoyUV9DZz87UmwiQyFRUlFeSzYyXFVqT1RiL086L1VpN1g3WyM+J10mLjtcQjRdcjU/QF5SOWIybigzXDw4RXFNIig8MnFMVGxUSy4/PDduZmc6TChhZGcvYTxPIWonYFhWYCpAZmtWUi43XFNJZHFRJGxTVUBdT2pgbl5YTVFlTV9bXl9AUkZrbmM/NFkwYERILGtmUWY/ZWdnUF9ETkNZXGM8VCEzRypiI0JdbD4payhWKltPS1EkQlQwY1NXci1SRj5FP1ZjRixnQkZbXW1GNFU5cElqJVcpbGwyWUBfJyk7Oz5wVE9dR0ouZ1E/LConOT9qZ1ZYZFBENj81UChAXXNjO29YKWFNIUYuOlxgRC4/IlNVYmAoSilfVVAmVGhxO1onMDc8MiZLalAiVl5VZTcnKWAtVyYxQlVRYFNjSGxoWy0wVjFyVktdO1o9MEZdInNOMypnZi49VClkPERvNV1HYWIuVitVQjU7RCViViNrYDtdZUdbMCN1SXMlIz9VJj9fQDMyWFNbVk0hXXU/WEJyVElFcmVKMmxRNyU5bk9KaDVYREFOQFIvKjAhcElOKDNlVj1mQHRFZUQtbWtYNTZJJilMbyk7R0dOZEppKV1TNmghYCRNNzNFPTRCNUYuc1xTLl1CXmVLIWs6PD4rblhaOyFfJkg8R19wP0M9MDdWZSNsLVFAM1RVNyVAMiknITw7dVRZVjljJCRnZzdGOkNrYF4wKlAvXzc5Ry9RV1ApcylyZk1obCg8QEtsRj9IS0ZGIm0iMWwxRC9LQic7LzEjKltuWEo/NGIxYEE2PE43NWxHSk9uZGFgI2tSaigtQC4qcHFOU1kpU1tKM241R0NaLjgmKzZfRFtAYFopMkFoV1g6QFdEYy8uPypyLD5Mc1U0Si1lcSUsSSMqcmxPKlBYa04qJiZkc1ZRJjc1Xzc5aCQ3T2wwYyYtRDwvRG1cL2hYJCNjRmcwLFcqTyxadDViNUVQNE1rLUBeLm4sMTo5bW5UKUBEMydeVyFaKl5XJ1kxPkRMaStAZlNCZDNzTF9QK2pgVyIiV1c/UyswTGg5bE03TmNqK19RTVMyK1VcYVNaLSc8I0JlcWtSR3VUJVxES15eQkZGSjRQW2U0TWdsI24mIVEhLG1BQio5dUVxaTIhbV8nYGA8XlMxSyRoNC1USmJkV01WPzhuQko4Iko3cWxQJTksWUNHb1JaLzhbQzFRTSgxUT1ULi0vPUZqVlFpJ3FDa25PZCciV2VGZEY3VWcxQkAqKzcqPW1hM2giNEt1MzJHVm0tVzRlJG9iYVtcckxuXmJQTG0jOyNBWyFRclZ+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTMnOiBjbGFzcyBQREZTdHJlYW0gDQorMjUzIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI4MTAgPj4NCitzdHJlYW0NCitHYiEjXWdOKSUuJnEqUFVyaDQrNmYlSDMoT2gxIk4qJzlTNC09YCs1YmZuWE1DQzI3LyNubWtIISlnLHJsYUlmVS5JKEIzOjFkRzA/Jjs4N2RYQ3Q2VCo/OSUpbyJjN0RrJGw2OV0+KyEmQWVeTUVzVEJEKFQtWlpDQVJrXUJEMyZUX2c+W0ZVMHU/YzNJQig+MyJPMkZfNF1UalVFNDZDNUpwTD1DODQnS20uWG5WNjVUcSUpVjpsLSM9NEVaQ3FGVmxKP3M0YSFpQ0lhb14/XHA/ZWl1am8jISw5ZWRURGpkKyJOXSRrI1FrKGNKVmJQLTc8dTYpNiRRO20lbUEkKj5ia3MiS2tYUC0kYUskbV1JREsyTTo/IXFbSTFTbmJTOFtVcWszUkgwSERhSGRmMEVNTCNIVkBwcyUyZzMvTCpsJktJXD0lNlIpPUY7Ti0mSjozQkk2WzRAYDh0UlpcMFxNQWY0RC5ySzxSWl9bTTwmVl5ubXI2NDVdNFFiWS1oUTNjOnJWUlBAKzxXZko5NyZ1IkZWKS0xbV9HLzpqXktGZjZBT2FsJEpYR2QvVWQjOiZfZ21FUltaPzZtbD9vXVtObDVWYDlIMUZ1W0o3dFJFPW1iVEFXLmhtXmhHZiYqIUBwJUc9anNCP0lHTStCaz8qPFhJLitXYmZWbzJBbE4yW2p1YFtuWWgpIyNUKDZrM29qNi0hNXFpIjYsQ0toMV9hIT4kMzomNiRSOW9KIyxjPzhNcT00PSFdP0EqcjcpU204al0lRE0lV1w6MUZJKnM5Qk1MQ1s0UFc8LWUiNDJxNTpVYEc3XkpfMGBrPkFjTHVraVRNXj8qbTdpLVNVOFolYUhDVz1hRm1iRUZvLiQ8WWtGa0ZKbGNaMSM7N2A1UVciRiRwW1VJQSlObUNwNiwvTStLOSgzMGRmYEIjQlFoMCg3MVYvXmlfLkQ5RXIzbEBkPyVsYWNFRCZvaU9IUzM5KFBqVDFgXEJkaT5PX3JwPDZXNU4sOjcxcm1NWSlZOlRIPz1hLEBTc2VGbzApOEVPZmNnS0AuSWpeRTNqaCJuZVdHJippM3QjKzE8Jj9FR0ptTXVdR1cka1Q0ayVydWBEcWRDJSJEIihMNWtzTnV1Y2ZbaFFsVjAmLmwlNjU0Yl4pXT0ocGwmRS9NUC8oTUFuc04hbSFWV3JsXm9GW3FQQzopI2cuWjByI1lcayRqSTpdLFFrYSVwX3RSWSxKR0dXNWQlYTAhYz5rVF8iK19OJTJuQmh1KywlPlE7bV9nbk5TZzkvdG40YUUkdUxXO0ktWiI4PW9ZKTRTUjNqW1ZBbDcqLiNaUTxgVS06cEo0WCRrKWkhbTVDTUwkbjRgQDUvSCU8Wy50SktdPkVQWUJAN18wLmtPYE80TV1lI2kmXzYhPSVJOlhNOzsiJmouJ0hJakt1NSFVQVYrJjhWTyMjJ2A8Lk9HJ2BpJWVhTHRmZ1JsT1RyZzZCX0RvWmUhOjhpWSJgPFI3X15KQlBoKTRwMW5gJFpuY0BsPUNoLklxSWc3LT0rQykrT2EwOTI3LFZIQnA6WiQ6ViE1Z0g3T3FoS0tPJW5cO2AqPGFvQSJqI04kLU5cMW5KLW9sVkBjbVNtMDxSIStKJCcuWUwvbD9SQ0ExRmklWDBnKUlkckNSL1FlU2YjV1Iqa0AiZDtoX2xbVy4hVkZwWElVcUdGWWosOUlzKnNUMFRUQ3JUXEc8NFVtcmBkKiU+VTBBUzxcMVU7VjldQywrUzg3azwjLCE+Vj9AQW05SjAwMUVPZFBDUFp1cV83YSxmZU0/MWA5WiNwb1UwY2wiOD1LU1Akal1QbVdNcz5UZlQhTV9xRmQ4QjddY0tzWE5yPjchZzVNclM2MTU1Ok8wbz0lZ2Q/OydUXGgiL0RkPEdwVXMtKyZFWFxkSk11JHE7bFVObys5OkAmRnIvTUJHZWQyXkdoLUhAOSsjPHBAXk5CKVEub0M1KDsyW2cuSSFaNFM9dD5CJVdyZG1nU2VFbl43WDE5Y2VgPDheNTA7Ik0vX3FGSVNIWkZqJ1VEWGNCXihzVmY+W1dua0AlMjJQJ1dBJEBVOmtYWy83QTtoNTBJQ2dzcGYtNk5BanVvQF9bPTZfXixuWmlyTlpjbT1AZDNEcF9xJ0RDU1pxWEchR0RhKGkhXC4xcD87IUhNTkNKYyl0XC9PTEMwYUhabjxhJiIxcT9AK1gjOVI7MGNeL1BMYk9YYnVlLUxQOS5zZFshR3A2O1tcMlZBMmFzKmpeMCRJLWRPJkVpI0lKQSgmQVZwWXFcZWcuNjwlI1FHOUdRTWdVVlBDNmolPWIrciJLWzQobWdVIkJaQkgwJEJMPF9zLEhLNk5KaXMuJEJNRnIrNipbTmssWGIqUkJMJUBbWW9SWUZCNF9fSSJJYC1uRjYhQyVSPS49MDRgP2FOSjlAIjAnXE0zakJmb2ddNyc7S1IwJWFNJHFFR2QjPDc3ODZ1clVoK1IwR09jUWwzUC1YaW5uRk1ASjRadGxsciY6QGtxTllUYW1IWWxVT1RgMCo6KTA+XU9lYi9oNms7LmolPj9iaWlvK2o+ZC5zTnAvVi5sLjpJb2JzO2NnbFJ0Xzs3VTZvK2staWZKZzRiaHMtYlZscCRRZUNAJm1wRTY2XT81Tzw0KFpfJksuWTRFUSVRVCklaGZeWi9TWUFSTl9JPCJxLCRbPEVsWHVUX0ZbJDs2UTxgK1haZHRbIzdOaFYhbFEmPk4vNEo7PDdYMWFGTC5FQFk/LFNxP1VNL0xPLklwQFxiMixYRS5WSEI8RjJXUiVnNz5GZkhDKHVmZk8qTF5pbDQlKmFjcmFQP2ZBOiE4QiFqK1FWUmBeISY0MmxOPUErbTRDcj5kJmtgTmdpQEgiK25qRFNNaVxccylgVSRaMCVFSjtYOE1MKFg/LS5JTyJNcF4pYD1iVlcnUXBuUS1qbSdSPF11aStORF5NVSsxMk1BOT5pbUo2a0RAJGY7IlxXSiUrMCpzR0xYImc7MSs+aVRoPDZETjE3LXUqLy1cZm9DKW80TDpQZSRwLiowMjArK0cmVl5SImhUTzRtT14sYihcYCRnLVRESG5oWzs7KjZiRitfKSVkLzJONG9TWCEnWGEldC1LdVJMQDtLSkpzVypLZUs7SVVjSz0mSFM3UEEzXENwPEtIMiVkPlQqSlBwVHE9SkNgYFdbNmJIYnQ3TlxTTitZLWE5SCtUPGxBJV1WZ1o3VHEtLjtaWSY9XmkvYXRdKV5CLyxjL0MxPmM8OXUla3JLWTouVWtVXCtdYShUQSEoai49QkNZJjxMaE06Zz5dXSZUOTJlQFhucDIhNmlNUTswO2s9aj00Lio4YC44YFJXPFZOMWVca3JQXGU/Ny43LVwhY0Fqcl9qOSdtNSs6SChsay1tXlZpWTI4M3E+Xls9T3VeWzc7LTQ3aWM0bzYvS1hZT0lYQG1WVmorSGNiLSRIY2JLPUtDOWctYyExU1xpTzpWRVQlTU1naUhDJV9RWShEYTNocFYrLVlBVVRJPUtuViNfJk5IczI9PSRvSk0wOnMvRSVDXS9KL0RbPlJhWGtkQSVBQkBmZCpbcjVGWi1tJGc4cD9CdFNhWy4vPT9WXi0kaCIuSWw/TEFJIkxDSkYjOz0zRGtIYjkmLW9qKWE5O1tkWlxkPztZM0NgZ3QvR0FFTF9wTlBBTzVDcVdSTWB1bCYzTlwlL0IqXlZMcC0yTWdjWC1+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTQnOiBjbGFzcyBQREZTdHJlYW0gDQorMjU0IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI4MDQgPj4NCitzdHJlYW0NCitHYiE7ZT1gYD1lJnE1JWlzJE9RJ1AqLXJYNEwvMHFWLSVvOD5xOW49SEZMPzZxXy8pLGlrdGhPYFcyN3FuJ2FGUEBmViopVyZVcmZVYHVLbV0+KlVqbFtdOW5yZCtEczonJig5XyJlb1s0PEc9aG4zU0xVYEVSVCNHa3A/X3JxIS9LOyRhbyk5SSQoVkMlcFEwWDRzL0QpZ0hmN3BGZm4zV2E8JFplPHMjVD1KWGwjJVgtbi9bLF1ZbUJNMkcsaycoZShjK1xiSkRtOSI7RHVZYXBxYyNmWGRbK1BZOVBTUzQtMW5ZL0RhTnF1WGMuMXQ7VTViYmRZLj5eLkFBb1o2YE5RNzw0VVh0JmVWSDphOi1xMjE1amJnJjFOKXE1OSYlTTgkWWckIiohXm9FaEMvKGVGQzBgJmhoZlU8XGQ4LV11XVZsW0lQaEVDS1Z1VzhAMEdHJDdHU0I9R21ScFM+UzgtKCtbNGY6bld1czstRyMpTUlIRTctMEQiJlVXTUFRUDdRTWxXYiFFa0xASSM5TkJIOmpGKlhzNnJaKjdoLjBQNjZpISQ5UVdoVFFNLUZDaEZNODhmV2MyI1dXTksoYUdCRTVvUTxWcV0tamxyZzZgWkskdC1JSEssSm1eYkhKNzEpcXB0M1IxKk4nUikhVFdDdFFVKiNqM0UnTExjSFZVSXAtS05HZENpNyotbVpfZGgnQllLZm9kcDlLW0EnbD9hMkA4SkFtNXBNVywzbTlNUVZRNm4/UVFLI2xySUQhJTJSJFJqWHROWjFWZiJqO2dJOS0hTSdBRTxvMEVaJCt1Vmc7dT1vY2RXJjtDbDdvaWZFSC9oK19GaSRrOV5XYV08ZUJJcEpaSmJFYF5HLFFYPUhhdUx1bEwrZHNDaFNiZyYmWWt0XjhUJHFSI2RURTQ7THQqNk5xOU0zZjVeJnFxZz1eXDskSUpUMSsoM0JIZCs+aEtgaTtlMnA4O1VRR1k8Oz1gW2lmJWYsWjBFZGhYImRDQ1wuUUpiVWwrNCdMNWJIUF4lUzpJXktTcycyV2Q7RVooVzdPQjtQXCFDIT9eQ1NQSCxzN0dNJSNDIW5xPThbQDlpWDooXjwpU086VkFhTklTaW8tTTAqSnJxRVRcTzo2STg5V3NuSiEzWTA4SksmP2BnZWJLL1wpJClsaXE0UVE4QFNKPUhTcCVsQXVGK0liXixnXDk4WmhISEpNV0ZKWWUsX19lPipnaVIhTlFhLzFlU3AxXyg8YUlfNCQ/b1UhPF0zQC86aFgoOnVIUFxUNUtnVzJaRzMsVTlcKkYoMXBGXmsyZjRPOmpaOSg0T0tuYjYyKTMyLEsqSU5XQ1ZMSCE1WS1ZRE9jcCstQydTZmFGYi5HP2xlbk5XPm1gbnJEaSVoW2pQTSJAdS85RCpeLm0xLmBuOHVMJVZdKikoQUEyOGpwbDdTNGFWO2BLMmMpM1hKXXBXQWxxbDN0PGRxMVIyYHJeNmlYIi5WYVYvb1FIaWFFR1hbb1s1PmpPblFVWDQnb2hDYkdXO2wqWllBZlNjWDQ5S2ZxcGNjLmAxTTdia20mM0ArJlU4JUpDI0RJVjdbLlJjQzpyVjMmTDY8WilPOWxwVzcnXHVxalUlLyNSaltsO2xYaHBFS0YhI29oZTAvalphJiVPRSUscTNMQ0E/Uj5EPk4rXWBPa24zaHVlbk43T1lmYF49XGs6PC5xJSMlcC5cQz10ZUwjOWtdLmc+dCciLSdtZmFLSmpqMS5PclskTkBeJjFKN1lNUjk+QlZqQko0cyU7K21PRDY6OEw6VmlhSWJzcGhAImBoSSoxJjUuWSlNJlchPGJHJVtPYitVNjVtWVQ8NVgrXzsnWSxBI1c6dDxdVyNsXVBWSCpYWWsnO01YL14/ZmFcXVNLYCNAbC9OJz01VkBZMEwxLCRSMGlqTiMkNlA/dCw9XFZqXDBcIUBMOWY4WEM0Pk5ZOHBSRFUrJFg4NCV1JWwlRSQrTWQoNmw3OG9jO11cPjReWTglc0k5I3JhNnBhLSotViFIOUMnTWA4SD8jT25XbCtEJUs2WXBMRTJBWStpQV47NUxVT3NiRlBPUDYkSFE0cl4/KyFVNyVOQG40KiQ0UlBKYTNHS3B0JD5ibTVTU2BhZTBUNW47PzcyWFlHaiJZJGhmNGJWS1lBVyIqSV1HP1tvYCFTTXVoaEheJmQvKU9cV1A/Zz8pLD5ySEFXQC8sNW5MUXQkTlhxK1s9OlYncDhvL1MsV1w7dUNKJmpNQVxFPjxrSTlXdTtWVz5xcV1lL3MuLSdqSk1pIU5TSF1zN3JJYld0TkIkUTJVSl9AZ2k+WzNsVXM2NzgzYVNSK0xIKFxuUVI3bD5CYjJBSWlMLjs9Q2lCUnRmaG9VcnUpLm07WTlyJksoLCI7PC9hZ2FpYFhfLUZgbGRYTG1ZNE5haSMnXU8zYissampbPDxDc1oiZSlhKkI2dGJlTi9GXik2KCpSKi0mOzVfR1c4WEAsS0FzZERrLChSQTpoVz1GJFAwIjBKNTRfUTBGbERcJTUuLkJTIlxbN11GYmZZOl9uO2MmQjZpUjxhLk1KT0BpR1A9TVFNKkYzNzdUSFolIWopLXBaQW1fXXIyVEokOGBaMkVUakE0YCMzcismKy1aSiInXmxuWy9HdT1GPj5TUXNnZSleakpFU1F1TC8hNFRpZl5DPDJQdDBaXSs2dEMsNXBkSDctdXBeSjRpXzpVUyxBSk9hLkldYy9GXEIoPllxJDdhUVslclReRmpbXVshcjBRUGxKW2hOJU8nRTVGVSpWWDRsdTtiWDRSU3M8NjVkWy4mamRgZEBiWS1tXE9TbC9FTjtcRV82WyMsaEY9MmQ+IT0xWm1NaWdSdFdoRUE9IUJbbltiL21hYm5CaFRkYEZIPD40K2lJajUwa2AvTCIkYXFUVWNuTiYpREsuc2pwNjNRIjxCZTlYb0olYjY1KzNIazxlXiFhbktOa0Y3SiVvPjMvKE43XElGKkEvOTtLXmpVbGZNTGxwWV9IN0k5Y1AycmMrXixQXk5rJUliNXRKN0VnMmFiPWg1O3M8M1AzNl0iTGpFclsvdWgiXj4mZy4laklTbklaRl1NWDZTLEYvRUMzNituSz02cnJaZUJBO0pjQWNFYCZNWDlrWVVgOi1oMzJwMGs8IVMhJGBmYEBEKy1XUVhAJ2w/KDhRTilsQ25bdWwxRGhVUUtMR1Vgakg3UEJdVT8pNUg6czQ0VjJyL18xTidYI0I+RkVMR2xSdG9DUElAOEwhciRBV2JVcHRZaFhzKmVbOHM8ayJzNjVwVjJLWkwpSTQuW1MvI1ZsI0NgVyRfRWg5MGtSbUZzYVxXJWNrcCdSQmspTU9bKidZZiUqSCxiYWQsciFzbFxGcksvKjUkR2k0ckorQ1t1LFBKVUteZTJhQDw+cnA9OUYyKy9nb0MxaS1CaydcQHUpaCk4WDhacjQ4SEpfKClRaGtacVBHLGRKZkhLTVM1Oy1ML19gLVVBRywnXFVvLzIobS8+PVVua1hIMjE2KmI5bEM8XmVaUWRuQ29XSXVtQXFNVURZYHQ/RiU6RSciZVRLXCh1KzM2T0AkRVwkYSEtXDJiQlElJm42JCRANUNvQk4rTjEiZDdCbyFfMkI8PGVtbDxRT2JgcUYvJTVLJXE6PENBSV9dQ2RpZVljXUtyS0JnNiYwQDtnV0FQMXJjR0giQi4wPildJjQxM0FnRD9+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTUnOiBjbGFzcyBQREZTdHJlYW0gDQorMjU1IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDIzNzcgPj4NCitzdHJlYW0NCitHYiEjXD5CQU9XJzdKMiNyVz1LQzouSm5ibEpBR004TT9MUj0vVjxHU1BJVz1MXWYiTCxlc3Rhcjk8LDUvM20qdC9ERzgiUjdvYCI2XWYrT2ZzPj04JltFU1pLXlM6Z0JDKjVGcXRjKTBLYjdPYy8wIm4pW1gtLTI/VGlvNGFvLW5jbF1YJl1VMG9tcTJiMjFdRnI8M2FLJVkpVzdNQnRCciMnWWVnT2orU0hvYl06Uzp0QyVBYUUyP2NAUT9DM0hUYm4lRClsXjBBNVVtPkNHVW5zMkZxYUM0PyE/ZT0nTXNJYC5jSjJLWHNjTz1CU21wRl1eYCVxZFwyKVZLOGk4YWZlWDgkPVp1OSNbbz9BWWxLUEtqayJuPWckRSdmLjMwVzkjWSJYLyslTXEyQzJGSl5pW11MX1oqK09ONXIxV0wwO2RmPFxWRWtaSV0mcig5b0piQDEnK0xXQV8sYlohT15kUSc+SjNaX0dOT2JjVEM7IjprS1wwP1NMaVZNY2Y1aV1fNzVNXWBILitfQ19wX1prM0ZFIU5sbUhMQ00wLFtEZjg9Km11NEVbTlpKXzU5OWRZWj9IKy50YTJHP14rYUtwRms+bD1KYmNqMlJNNj5IMUMkPklvKiZsaVRDO1wiYEZIS0h0NFpnRlQxZWQ6Z1gpcVFxOCQqPDw8bDJuZ05qYSdmaEk8aFsmcyY5PmpURkdWTGosT1VHX0BMcXBYLjRyaTRuYUdtMiVKSWFyJTRcTVRVZlwzWDxlMl9DJFUuMjI2MHFtN0hHTlQlVylXYyxmWmQnSzorOSdDQURkYFYvWT1IRXM3L2BBLlwjaUpHY3JjbE5QZE9mOyNBNC0tK1I/R3NMbGVCRU4mTGI8OT5PQj9WRmMhWTJqX05EIjxHQUZdaidycSY/c11OPjorP1EsW1JyV2wrRm91JjtfJ2lTOjs2W2RoKio1MzReVTAkUVhgL1EqQ11uTTpgclU6KSlycUFdUUglaT1nK10vIlZaXiYobHMzUTMvSU0qKU9MNEhRKkFzbFk3dDUnTjNuI2EhaE9TLScoaCEiRUNgK1IqIXNKK0JLSGJWMDxqaCFxc1dISV4/XmE0Jz87ZXIqa0tlb0xkVGVuRUVKOj5JLmRGbj9wSzlRLDw9byE8dFBjOHNGc1QyZy5BcTguWUtgKlE7aEZaOFE9PlFkUWU3VjgyblsxZjEhTl05UkA+IThhOFVwNE9FOjcidDVmNzEuNlslRUhyOj8ibzFKQktEVC1yXCZqUG1HZnJFQGM4YC5Ib1xBLEBESDQ2XVJdWWJeY2JtLitMOCowK21QKy00PCtSQ0MiLClKclNrIkY1KEJHMzFuPW0zT0gjI10xYUgiQEw6O2NWIWNQTm4xOkRTMSMpcEgtZy4uZkNUMlcnV2RnUFNnSDpbQiFFJ2MlZj10U1hIQTpIU1ddRkQ3Rlk7TyhXakFFUE0mLHFkXypMRTI7TUZPI2dLPD5UREQhQC9cPyleJkUobGE+XTxfRm9nNGRDbjtiXFVpZiZGIy1LbTRDai1DWGw7SUo2YUlYLGUoU0FyU1ddYk1wZWlrOlkuT0Q/VFdnWVBTWWNaNyw+XFVXRCRzSzRQM1hANigzdGdnLztWRidWJ2lMV2wzcElQYzgmJUkiV2lUTmspLSlBQTRBIVdkWTpjaDU7Tj1QXGQwVSUyUVorR1xQcStpRidBW1tPcChQJz0pUj5SME44ZTJsVi5jRVxuMW9JMHBYMSVIS0UoLy5tIm5MTjlQZyhmPkI4SVVaTSlwZT9fKThlX1BfVl1nVlg0a180RnFhUzRwWT9eVSQ8dVhMMWFNNihNb0Y9aCNUV1NBZyJDZGkjaXNaQXVnMGwiPDNfaz1aIV02LlUnOzdESTxHIU5ZS0o7YmdCYGNkQUxBVlVOaSlDT0JXWFlMQT5RTy9VTztVWSdPcS9NP1FJWCEhWkR0JnI6OnJaSjk6STZVMyFzNyFOVHEwWiZPaTxcUTMicyFPYDlWaz1rNU0qW1c0MkgjR11WcmpaWEJiXHEqNzpQKUZTLlByKExAXEouS1BAaWxQOCtcUTg8RD5XY0BoXjIwa1cvJVJVLjw+QGUuXm5ZLT89XCgoP0VnSEZVaypvLS48MFh0XSshdTBca1NCQj0+V2ByLjZeYGtyITxLQ1R0VUFPY3NAbGxGKClPPUpOUEVmUi80bypMKmpUdGU8YkxtWF1wMmJlOyFaIyJPc242cSJnZGFyLiZVKk1cKzNjKzFEKyFXUW04SWdUPF4oR3RRPTlvYmpxVCMhazM0aEtOOWBXbDBVMHE/JmZHYyRpYzReWHUyNUNXT2dKSkBhZylMPVlcQCd0U3JhaGw5QkFgOyY6X1ZeWFlyIkhfJU1DK0Q7YD4lPjU0TyYuZmNOLVxoXjY4KUJWJTRCOFUpPz8hKkpBdUptaHRkOCxaYFN0Wl5PK0tRTm87Ny5VY3M6PUUqUmBKKjcsZmwxbFFDLVssc3BoJVVDMlJcZyIzSWM0cExtRmljUjxXIU9LU21PVWk2ZDo2O1hiTFtyR0hPIWkjSzxoTnFWQ0RvXk5HYkRfb1svckNeVFBuKlpSMXNXSkdsUk8zL2pELkBGMEpvXV43KldbR0Z0LlxvPVpuRDIjJmlRPXFBREBsLVpILlR1Y2EmT2hXOU9uJWhSQmNRJFc5YGJ1PjhOTGFeZzZIXjE4YlpJMTBxUC08VnM6TlVWbk5wNSo/KThsX10nRkBDKilvOCliXmddNDZWLGtgPjRZWS5kSDA9J2o3JjhCbmw8alVxN1IzLyhlKS5mXjcpTUVvMEYsPyRGKjUnSS9ac2wxKCJyYilvQE1XU2NVKj5oR1JZUzpZc0Y7PTYzOGhVMDckZSc0Qz48WW1WRCVwYnVQWHRJRVU0US5uaWdlSis+SSZKL25pKWExK29pJTw5RSV1V1tFO25IbWFxN0FFI1gqLjoxJlhoOmJec2o3TDhSLGZMU0ssSys1cUspX10rJzlPLnBwKFIqSWI9OjhlIShWJ3MrRWIhZGJeKkhZaT1FVEpnIUdRbiZdUiM9TSwlLVU0SnFOY0orIydiR0xYaC1TPmM/TGVlY0o+biNiIkFSJ0trbSROMHBTW2pcK1ZNNG8mbyY8MSFPaUFCLj89akkjJ1FFcTZSZzk1Wz8ncH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI1Nic6IGNsYXNzIFBERlN0cmVhbSANCisyNTYgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjA3MCA+Pg0KK3N0cmVhbQ0KK0diITtmPyQiXlonUmZGRHMyMUQ/MXRfbV9bXXA5aTk9IXIsQjpBM1hrV1wpc2ZFMFJUUTdMKE5yOzQwamJWb2hUQ001YV8pJ1tiXmVeO3BYaz1UY2dLLS9fQ05BSCpjIVc7Y00ia1NDQyNpKVQzS3UkOSgyZ0c7ZExcXE8zaiQ9SkRjXFZeTkI8QnNDW1E/LWBVNW5cZyFESGs4X0gsSl04ITI3LiF1UFMsXGRoYk5xbXNoaCQkO0xTbys+SWxwR3MqRXBeVnBAOV9WbzxwVyozUFFWRDY+MmZxYDM6RGVjQHE0MkVVaG0xPnIqJiRxL0NLMDB0SFZuQD8jSG1PWjxuQW43Ly4uZ25sbUglKSltN1ZQLmFIUUkjI20pSS85ampQO1U/ZU0/YWktKyxIJ2taTDMhJTdbR2dtJGEwMS1iP3BgaEBCKkQuS2FBU21JRnBQUSc7XFc9VFZlJjFAYCdpVGwyJ0U8OXJdZ1ZxTS5BQDFKZFFtZmtKMFNpOUFxWCUiRDgkZ0k9TTRbayU0ZGBiS2taIm46PUBhXj4mZEglRl5TRy1Ac0NHM2ZlUVBQclhhc19cKjxtJ3AhVkk2YFIjSmspZHBwKC9ybGZMO288O2s2ZTd0PDJTbWcnXFo6cShzVytjOyEpKmtVPElcRU5yZEtOXSdGPy5YJSInS0g3bkhDUDMrNmJbQW0sND1jcSxAYkgpIVhiQVAmTSVZMUA8NlVATSkiLmtfcGFrTVlbJXFzWDo1ZTpIQlxUSiFqPTJvaCRbOk0yVjtsQD86RkA1QU5hJzMkLCFCLzBAbCttKmBDQ3I5YWFNa1psWzAmc29pO2xnakY4bmYjYTRnMFw/ZlooRzk3XkpbWmVvSlVGITJza1hhPThxLFM1OEtadEUsL0hzWV5dI0tJNEJyZ2xRYilqKGpYcUFQXykpTlJwaGhtbFRwL0NTNHVMPjpjbic2Xip1MmRtImlGTFUhVmdmPU0tcSsrM2QrdVV1VFJYakRPamZQbEBMVEJKJ2pkOjBbbG9WQikxZ1dzRFwqUyZVRyozVi80OldCJyJYVjghbVcxUzovJSI7bmpBT1w1NnNfWWJKVyhzNUtvdDtdSlUpSFQ2WWBMNztHNFc9Qm9qSj0mTkRSMC8tb18vSCNnQCpRMDFsajxjLTRMcXVUMj1YRypddDcicy0wLCQmYEUoL2hXPF9SInFgVCxFLzIyUiYmRkBZVXFzNVdWMEU5UD0kRDBGMF43JkZQSkNTWS1xcUhKPVJxaiRgaHFZX1VNPT5kbFxvJWZWY29aN3RHQFNQKUUib1daRkZdWzVwMFoqUS9XRWgrTmBsLGteJylWJHBGXDsoO1lpKFpdL0JncXNqTkVuMV8/ZE81P29KJXNGOUNxaUg2SWpXQFVZJEwmYkEuZnFiITElbDxeZmFDcmJfJyVGMSJqYVE+WElQZkEuQnVgQlBxKlJwa2NSVywxKD9yT3EwbCZXLzo9R1VgO141cThTaWttVDZuT1MpLG1tQEkoZDFlU1EqOFhbVl8lOWBKSW9YOC1nQEhpTyE6UkVDRUxtJXInaEtTXzZdYmE5VHMmLVsmMVRNRjsrVSIkPFlsSWMyOVIkOCgpVVNVPUY7MyItQU9DOF9uW1UpNE5tXS5cLGlyTUxOVWF1cXBSVl1XRnRIPUtQPS9dRzIlcT1EZCpmYylIOFByLzRXNlBCSWIzZGYvWkgtbyRkPzMxSCdUNT5cdERxdXAjanA7clNLS0hoSXQkOTFRSDVIMFk3bWI2YF8tUENQKFhlTi0nOE1iJz0mMjZoQm06aVcubk8jZ081KUpObDplYCJJdTlLVHJlN1lkb0VPIkBUUl0kWEJkIU0+akYmbmJtLmlTbT5oa0c4Z19eUTZIbFg4IUEmNzBoXVpmUFtsbUhQRUwwcko2a1Y6WVJxLE1ASyI/RiJjWHRuNyMnaFs8NzFnVWUwLF1tbXJfRkhJNmpWZj9EaCZWKj8uXjdRcXNjYSFgTVlNUC9bXEg7NXREWDVPYVY0S285aW8ldEczWWYjYnVnQ19YYSlcUVAiRTUuQj1zMFJoVClqWUV0W15mNEJET2psP1QnO1ZhNllLJDpTI28oOik1T3RsM0RGV09bTXM5PkZMbTdDXGN1RGpYMmgpMmFpSDtpX2pYV2lhJm1OZl0iQTZRJnFQVk1BTmhSZi1VQUhbQWA6TEdDND0jbz1wOiJEK1A1KDpkX1gkdXBBJWVYcUxkdCRUOWdyPExwYD5QSi4vSTJDTnQ9PTFXTigtUF8zLTVeY2JzZSdlckJVQDE5SihlcTNBQ2ghUyQibkVrQiQ2QU5uQC40cmVIZFNEYFQsXzxKN2lBcVN1NmlLYz4sW3FiZnNoSVVcc3FbYF5HN0dqUW1Pcyk8K2xINm5xNFFvL2FOKWhrWlZBIlxsQmRBTnUpaj07dVJbWE05N1dlJyxANVAwUSRaN1wzaEslSlc1L1lvMCgnSUBTNDxfNmpZPmg/VkYkcz91YF5zblNqMjo/WmAoWSo/K3RtZlllKFFBXUNQKCExMldgcSkvdVFrJ3JjQ0pKXENBYlhgTWJZTXJbXnFfMU0mMThMbENHYSQ4R2ZPVVMjTjZqLiVlPjdkQGd0LlYqIk9WV18mM0I2JiQ6SVdvZFVAQm4wbFROMDB1ayhabGtwdEFoaCo7c0ExKGI/XCwjT2YkVDxjSUBkKVgpcTwkSEEvbzVtPkRsJSpeJjxIK2kyZERoUWBHcldCTSQoNm5+PmVuZHN0cmVhbQ0KK2VuZG9iag0KK3hyZWYNCiswIDI1Nw0KKzAwMDAwMDAwMDAgNjU1MzUgZg0KKzAwMDAwMDAxMTMgMDAwMDAgbg0KKzAwMDAwMDAyNDkgMDAwMDAgbg0KKzAwMDAwMDA0NTUgMDAwMDAgbg0KKzAwMDAwMTIyMzkgMDAwMDAgbg0KKzAwMDAwMTI0MjYgMDAwMDAgbg0KKzAwMDAwMTI2NjggMDAwMDAgbg0KKzAwMDAwMTI4OTcgMDAwMDAgbg0KKzAwMDAwMTMxMjYgMDAwMDAgbg0KKzAwMDAwMTMzNTUgMDAwMDAgbg0KKzAwMDAwMTM1ODIgMDAwMDAgbg0KKzAwMDAwMTM4MTAgMDAwMDAgbg0KKzAwMDAwMTQwNDIgMDAwMDAgbg0KKzAwMDAwMTQyNzQgMDAwMDAgbg0KKzAwMDAwMTQ1MDYgMDAwMDAgbg0KKzAwMDAwMTQ3MzcgMDAwMDAgbg0KKzAwMDAwMTQ5NjcgMDAwMDAgbg0KKzAwMDAwMTUxOTkgMDAwMDAgbg0KKzAwMDAwMTU0MjkgMDAwMDAgbg0KKzAwMDAwMTU2NjEgMDAwMDAgbg0KKzAwMDAwMTU4OTMgMDAwMDAgbg0KKzAwMDAwMTYxMjMgMDAwMDAgbg0KKzAwMDAwMTYzNTMgMDAwMDAgbg0KKzAwMDAwMTY1ODUgMDAwMDAgbg0KKzAwMDAwMTY4MTcgMDAwMDAgbg0KKzAwMDAwMTcwNDggMDAwMDAgbg0KKzAwMDAwMTcyODAgMDAwMDAgbg0KKzAwMDAwMTc1MTAgMDAwMDAgbg0KKzAwMDAwMTc3NDEgMDAwMDAgbg0KKzAwMDAwMTc5NzEgMDAwMDAgbg0KKzAwMDAwMTgyMDMgMDAwMDAgbg0KKzAwMDAwMTg0MzUgMDAwMDAgbg0KKzAwMDAwMTg2NjYgMDAwMDAgbg0KKzAwMDAwMTg4OTggMDAwMDAgbg0KKzAwMDAwMTkxMzAgMDAwMDAgbg0KKzAwMDAwMTkzNjEgMDAwMDAgbg0KKzAwMDAwMTk1OTIgMDAwMDAgbg0KKzAwMDAwMTk4MjQgMDAwMDAgbg0KKzAwMDAwMjAwNTYgMDAwMDAgbg0KKzAwMDAwMjAyODggMDAwMDAgbg0KKzAwMDAwMjA1MTggMDAwMDAgbg0KKzAwMDAwMjA3NDkgMDAwMDAgbg0KKzAwMDAwMjA5ODAgMDAwMDAgbg0KKzAwMDAwMjEyMTIgMDAwMDAgbg0KKzAwMDAwMjE0NDMgMDAwMDAgbg0KKzAwMDAwMjE2NzUgMDAwMDAgbg0KKzAwMDAwMjE5MDcgMDAwMDAgbg0KKzAwMDAwMjIxMjAgMDAwMDAgbg0KKzAwMDAwMjI4NTggMDAwMDAgbg0KKzAwMDAwMjMwODkgMDAwMDAgbg0KKzAwMDAwMjMzMTkgMDAwMDAgbg0KKzAwMDAwMjM1NDkgMDAwMDAgbg0KKzAwMDAwMjM3ODAgMDAwMDAgbg0KKzAwMDAwMjQwMTAgMDAwMDAgbg0KKzAwMDAwMjQyNDIgMDAwMDAgbg0KKzAwMDAwMjQ0NzMgMDAwMDAgbg0KKzAwMDAwMjQ3MDUgMDAwMDAgbg0KKzAwMDAwMjQ5MzcgMDAwMDAgbg0KKzAwMDAwMjUxNjkgMDAwMDAgbg0KKzAwMDAwMjU0MDEgMDAwMDAgbg0KKzAwMDAwMjU2MzMgMDAwMDAgbg0KKzAwMDAwMjU4NjQgMDAwMDAgbg0KKzAwMDAwMjYwOTQgMDAwMDAgbg0KKzAwMDAwMjYzMjQgMDAwMDAgbg0KKzAwMDAwMjY1NTQgMDAwMDAgbg0KKzAwMDAwMjY3ODMgMDAwMDAgbg0KKzAwMDAwMjcwMTUgMDAwMDAgbg0KKzAwMDAwMjcyNDYgMDAwMDAgbg0KKzAwMDAwMjc0NzcgMDAwMDAgbg0KKzAwMDAwMjc2OTIgMDAwMDAgbg0KKzAwMDAwMjgxODEgMDAwMDAgbg0KKzAwMDAwMjg0MTYgMDAwMDAgbg0KKzAwMDAwMjg2NTIgMDAwMDAgbg0KKzAwMDAwMjg4ODcgMDAwMDAgbg0KKzAwMDAwMjkxNDEgMDAwMDAgbg0KKzAwMDAwMjk0MDkgMDAwMDAgbg0KKzAwMDAwMjk2NTQgMDAwMDAgbg0KKzAwMDAwMjk5MjYgMDAwMDAgbg0KKzAwMDAwMzAyMTcgMDAwMDAgbg0KKzAwMDAwMzA0OTQgMDAwMDAgbg0KKzAwMDAwMzA3NjggMDAwMDAgbg0KKzAwMDAwMzEwNDkgMDAwMDAgbg0KKzAwMDAwMzEzMjcgMDAwMDAgbg0KKzAwMDAwMzE2MjIgMDAwMDAgbg0KKzAwMDAwMzE5MTMgMDAwMDAgbg0KKzAwMDAwMzIxOTQgMDAwMDAgbg0KKzAwMDAwMzI1MDggMDAwMDAgbg0KKzAwMDAwMzI3OTYgMDAwMDAgbg0KKzAwMDAwMzMwNzkgMDAwMDAgbg0KKzAwMDAwMzMzNjYgMDAwMDAgbg0KKzAwMDAwMzM2MjYgMDAwMDAgbg0KKzAwMDAwMzM5MDYgMDAwMDAgbg0KKzAwMDAwMzQxODQgMDAwMDAgbg0KKzAwMDAwMzQ0NzQgMDAwMDAgbg0KKzAwMDAwMzQ3NTUgMDAwMDAgbg0KKzAwMDAwMzUwNTEgMDAwMDAgbg0KKzAwMDAwMzUzMzQgMDAwMDAgbg0KKzAwMDAwMzU2MTIgMDAwMDAgbg0KKzAwMDAwMzYxNTQgMDAwMDAgbg0KKzAwMDAwMzY0NDMgMDAwMDAgbg0KKzAwMDAwMzY3MjggMDAwMDAgbg0KKzAwMDAwMzcwMjEgMDAwMDAgbg0KKzAwMDAwMzczMDYgMDAwMDAgbg0KKzAwMDAwMzc2MDQgMDAwMDAgbg0KKzAwMDAwMzc4NDEgMDAwMDAgbg0KKzAwMDAwMzgwNjIgMDAwMDAgbg0KKzAwMDAwMzgyMzkgMDAwMDAgbg0KKzAwMDAwMzg0NjAgMDAwMDAgbg0KKzAwMDAwMzg2NDUgMDAwMDAgbg0KKzAwMDAwMzg4NjMgMDAwMDAgbg0KKzAwMDAwMzkyMzYgMDAwMDAgbg0KKzAwMDAwMzk1MDkgMDAwMDAgbg0KKzAwMDAwMzk3OTkgMDAwMDAgbg0KKzAwMDAwNDAwMjEgMDAwMDAgbg0KKzAwMDAwNDAzMzMgMDAwMDAgbg0KKzAwMDAwNDA1NzMgMDAwMDAgbg0KKzAwMDAwNDA4MTIgMDAwMDAgbg0KKzAwMDAwNDEwMzQgMDAwMDAgbg0KKzAwMDAwNDEzNjYgMDAwMDAgbg0KKzAwMDAwNDE2MDUgMDAwMDAgbg0KKzAwMDAwNDE4NDYgMDAwMDAgbg0KKzAwMDAwNDIwNzkgMDAwMDAgbg0KKzAwMDAwNDIzMjAgMDAwMDAgbg0KKzAwMDAwNDI1NjAgMDAwMDAgbg0KKzAwMDAwNDI4MDEgMDAwMDAgbg0KKzAwMDAwNDMwMjUgMDAwMDAgbg0KKzAwMDAwNDMzOTcgMDAwMDAgbg0KKzAwMDAwNDM2MzcgMDAwMDAgbg0KKzAwMDAwNDM4NzYgMDAwMDAgbg0KKzAwMDAwNDQxMTIgMDAwMDAgbg0KKzAwMDAwNDQzNTMgMDAwMDAgbg0KKzAwMDAwNDQ1OTMgMDAwMDAgbg0KKzAwMDAwNDQ4MzMgMDAwMDAgbg0KKzAwMDAwNDUwNTggMDAwMDAgbg0KKzAwMDAwNDU0MTQgMDAwMDAgbg0KKzAwMDAwNDU2ODggMDAwMDAgbg0KKzAwMDAwNDU5NzggMDAwMDAgbg0KKzAwMDAwNDYyMTUgMDAwMDAgbg0KKzAwMDAwNDY0NTMgMDAwMDAgbg0KKzAwMDAwNDY2OTEgMDAwMDAgbg0KKzAwMDAwNDY5MzIgMDAwMDAgbg0KKzAwMDAwNDcxNTcgMDAwMDAgbg0KKzAwMDAwNDc1MDkgMDAwMDAgbg0KKzAwMDAwNDc3NDkgMDAwMDAgbg0KKzAwMDAwNDc5OTAgMDAwMDAgbg0KKzAwMDAwNDgyMjkgMDAwMDAgbg0KKzAwMDAwNDg0NTIgMDAwMDAgbg0KKzAwMDAwNDg3OTQgMDAwMDAgbg0KKzAwMDAwNDkwMTcgMDAwMDAgbg0KKzAwMDAwNDkzMjkgMDAwMDAgbg0KKzAwMDAwNDk1NzAgMDAwMDAgbg0KKzAwMDAwNDk4MTEgMDAwMDAgbg0KKzAwMDAwNTAwMzYgMDAwMDAgbg0KKzAwMDAwNTAzNjggMDAwMDAgbg0KKzAwMDAwNTA1OTQgMDAwMDAgbg0KKzAwMDAwNTA5MDYgMDAwMDAgbg0KKzAwMDAwNTExNDQgMDAwMDAgbg0KKzAwMDAwNTEzODMgMDAwMDAgbg0KKzAwMDAwNTE2MjAgMDAwMDAgbg0KKzAwMDAwNTE4NDMgMDAwMDAgbg0KKzAwMDAwNTIxODUgMDAwMDAgbg0KKzAwMDAwNTI0MTkgMDAwMDAgbg0KKzAwMDAwNTI2NTYgMDAwMDAgbg0KKzAwMDAwNTI5NjIgMDAwMDAgbg0KKzAwMDAwNTMyMzcgMDAwMDAgbg0KKzAwMDAwNTMzNzkgMDAwMDAgbg0KKzAwMDAwNTM2MjMgMDAwMDAgbg0KKzAwMDAwNTM3NTIgMDAwMDAgbg0KKzAwMDAwNTM5NTggMDAwMDAgbg0KKzAwMDAwNTQxMTUgMDAwMDAgbg0KKzAwMDAwNTQyODYgMDAwMDAgbg0KKzAwMDAwNTQ0NTQgMDAwMDAgbg0KKzAwMDAwNTQ2NjcgMDAwMDAgbg0KKzAwMDAwNTQ4MzggMDAwMDAgbg0KKzAwMDAwNTUwNjcgMDAwMDAgbg0KKzAwMDAwNTUyMjYgMDAwMDAgbg0KKzAwMDAwNTU0MDYgMDAwMDAgbg0KKzAwMDAwNTU1OTAgMDAwMDAgbg0KKzAwMDAwNTU3ODAgMDAwMDAgbg0KKzAwMDAwNTU5NjIgMDAwMDAgbg0KKzAwMDAwNTYxNDUgMDAwMDAgbg0KKzAwMDAwNTYzMTIgMDAwMDAgbg0KKzAwMDAwNTY0OTggMDAwMDAgbg0KKzAwMDAwNTY3MjIgMDAwMDAgbg0KKzAwMDAwNTY4OTEgMDAwMDAgbg0KKzAwMDAwNTcwNjAgMDAwMDAgbg0KKzAwMDAwNTcyNTAgMDAwMDAgbg0KKzAwMDAwNTc0MjYgMDAwMDAgbg0KKzAwMDAwNTc2MTcgMDAwMDAgbg0KKzAwMDAwNTc4MzYgMDAwMDAgbg0KKzAwMDAwNTc5OTEgMDAwMDAgbg0KKzAwMDAwNTgxNjggMDAwMDAgbg0KKzAwMDAwNTgzMzggMDAwMDAgbg0KKzAwMDAwNTg1MDggMDAwMDAgbg0KKzAwMDAwNTg2NzEgMDAwMDAgbg0KKzAwMDAwNTg4NjMgMDAwMDAgbg0KKzAwMDAwNTkwNTggMDAwMDAgbg0KKzAwMDAwNTkyODcgMDAwMDAgbg0KKzAwMDAwNTk0NDUgMDAwMDAgbg0KKzAwMDAwNTk2MjIgMDAwMDAgbg0KKzAwMDAwNTk3ODEgMDAwMDAgbg0KKzAwMDAwNTk5NjkgMDAwMDAgbg0KKzAwMDAwNjAxOTcgMDAwMDAgbg0KKzAwMDAwNjAzOTUgMDAwMDAgbg0KKzAwMDAwNjA1NzggMDAwMDAgbg0KKzAwMDAwNjA3NTcgMDAwMDAgbg0KKzAwMDAwNjA5MjggMDAwMDAgbg0KKzAwMDAwNjEwOTggMDAwMDAgbg0KKzAwMDAwNjEyODAgMDAwMDAgbg0KKzAwMDAwNjE0NjAgMDAwMDAgbg0KKzAwMDAwNjE2MzkgMDAwMDAgbg0KKzAwMDAwNjE4MDQgMDAwMDAgbg0KKzAwMDAwNjE5ODEgMDAwMDAgbg0KKzAwMDAwNjIxNjcgMDAwMDAgbg0KKzAwMDAwNjIzMzUgMDAwMDAgbg0KKzAwMDAwNjI1MTIgMDAwMDAgbg0KKzAwMDAwNjI2ODMgMDAwMDAgbg0KKzAwMDAwNjI4NTAgMDAwMDAgbg0KKzAwMDAwNjMwMjMgMDAwMDAgbg0KKzAwMDAwNjMyMDUgMDAwMDAgbg0KKzAwMDAwNjMzOTUgMDAwMDAgbg0KKzAwMDAwNjM1NTEgMDAwMDAgbg0KKzAwMDAwNjM3MzcgMDAwMDAgbg0KKzAwMDAwNjM5NzIgMDAwMDAgbg0KKzAwMDAwNjQxMzEgMDAwMDAgbg0KKzAwMDAwNjQzMjAgMDAwMDAgbg0KKzAwMDAwNjQ1MDYgMDAwMDAgbg0KKzAwMDAwNjQ2ODYgMDAwMDAgbg0KKzAwMDAwNjQ4NzIgMDAwMDAgbg0KKzAwMDAwNjUwNTIgMDAwMDAgbg0KKzAwMDAwNjUyMjQgMDAwMDAgbg0KKzAwMDAwNjU0NDggMDAwMDAgbg0KKzAwMDAwNjU2MTIgMDAwMDAgbg0KKzAwMDAwNjU4MDAgMDAwMDAgbg0KKzAwMDAwNjU5ODggMDAwMDAgbg0KKzAwMDAwNjYyMDEgMDAwMDAgbg0KKzAwMDAwNjYzNDEgMDAwMDAgbg0KKzAwMDAwNjY2NDAgMDAwMDAgbg0KKzAwMDAwNjg1ODEgMDAwMDAgbg0KKzAwMDAwNjk2NzEgMDAwMDAgbg0KKzAwMDAwNzMwNjMgMDAwMDAgbg0KKzAwMDAwNzYxNDMgMDAwMDAgbg0KKzAwMDAwNzk0NzMgMDAwMDAgbg0KKzAwMDAwODE4OTcgMDAwMDAgbg0KKzAwMDAwODQ4MDkgMDAwMDAgbg0KKzAwMDAwODc1NTkgMDAwMDAgbg0KKzAwMDAwOTA2MDYgMDAwMDAgbg0KKzAwMDAwOTM0OTggMDAwMDAgbg0KKzAwMDAwOTc5NjUgMDAwMDAgbg0KKzAwMDAxMDA1MzAgMDAwMDAgbg0KKzAwMDAxMDQ2MDQgMDAwMDAgbg0KKzAwMDAxMDcxNzAgMDAwMDAgbg0KKzAwMDAxMDk2MDEgMDAwMDAgbg0KKzAwMDAxMTI0NzUgMDAwMDAgbg0KKzAwMDAxMTU0MzAgMDAwMDAgbg0KKzAwMDAxMTgzNzkgMDAwMDAgbg0KKzAwMDAxMjA5MDEgMDAwMDAgbg0KK3RyYWlsZXINCis8PCAvSUQgDQorICUgUmVwb3J0TGFiIGdlbmVyYXRlZCBQREYgZG9jdW1lbnQgLS0gZGlnZXN0IChodHRwOi8vd3d3LnJlcG9ydGxhYi5jb20pIA0KKyBbKFwwMjI+XDIxM1wzMzRWXDIzM1wyNDdcMzY2XDI2NFwzMjJcMjExXDAyMVwwMDFcMjUyXDMzN1wyMTMpIChcMDIyPlwyMTNcMzM0VlwyMzNcMjQ3XDM2NlwyNjRcMzIyXDIxMVwwMjFcMDAxXDI1MlwzMzdcMjEzKV0gDQorDQorIC9JbmZvIDE2NSAwIFINCisgL1Jvb3QgMTY0IDAgUg0KKyAvU2l6ZSAyNTcgPj4NCitzdGFydHhyZWYNCisxMjMwODgNCislJUVPRg0KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC1jdHMtbWFudWFsLXI0LnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC1jdHMtbWFudWFsLXI0LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZiNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLWN0cy1tYW51YWwtcjQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29tcGF0aWJpbGl0eV90b2MuY3MgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbXBhdGliaWxpdHlfdG9jLmNzCmluZGV4IDU2ODhkMTQuLjVhNjQwODIgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29tcGF0aWJpbGl0eV90b2MuY3MKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jb21wYXRpYmlsaXR5X3RvYy5jcwpAQCAtNywxMiArNywxMiBAQAogPHVsPgogICA8bGk+PGgyPkdldHRpbmcgU3RhcnRlZDwvaDI+PHVsPgogICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5jb21wYXRpYmlsaXR5L292ZXJ2aWV3Lmh0bWwiPkNvbXBhdGliaWxpdHkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iIj5DdXJyZW50IENERDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5jb21wYXRpYmlsaXR5L2FuZHJvaWQtMi4yLWNkZC5wZGYiPkN1cnJlbnQgQ0REPC9hPjwvbGk+CiAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvY3RzLWludHJvLmh0bWwiPkNUUyBJbnRyb2R1Y3Rpb248L2E+PC9saT4KICAgPC91bD48L2xpPgogCiAgIDxsaT48aDI+TW9yZSBJbmZvcm1hdGlvbjwvaDI+PHVsPgotICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvZG93bmxvYWRzLmh0bWwiPkRvd25sb2FkczwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5mYXFzLmh0bWwjY29tcGF0aWJpbGl0eSI+RkFRczwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuaHRtbCI+Q29udGFjdCBVczwvYT48L2xpPgogICA8L3VsPjwvbGk+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuamQKaW5kZXggYmE0ZTg4Ny4uMmFhMmFhMSAxMDA2NDQKLS0tIGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jb250YWN0LXVzLmpkCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29udGFjdC11cy5qZApAQCAtNywxMyArNywxMiBAQAogb3V0IG9mIGFueSBvZiB0aGVzZSBvcHRpb25zLCBwbGVhc2UgZmlyc3QgcmVhZCAiR2V0dGluZyB0aGUgTW9zdCBmcm9tIE91cgogTGlzdHMiIG9uIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Y29tbXVuaXR5L2luZGV4Lmh0bWwiPkNvbW11bml0eSBwYWdlLjwvYT48L3A+CiAKLTxoMz5EaXNjdXNzaW9uIEdyb3VwPC9oMz4KKzxoMz5Gb3IgR2VuZXJhbCBEaXNjdXNzaW9uPC9oMz4KIDxwPlRoZSBwcmVmZXJyZWQgd2F5IHRvIHJlYWNoIHVzIGlzIHZpYSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWNvbXBhdGliaWxpdHkiPmFuZHJvaWQtY29tcGF0aWJpbGl0eQotbWFpbGluZyBsaXN0PC9hPi4gVXNlIHRoaXMgbGlzdCBmb3IgYWxsIHlvdXIgY29tcGF0aWJpbGl0eS1yZWxhdGVkIHF1ZXN0aW9ucy4KLVBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoaXMgaXMgYSBwdWJsaWMgZm9ydW0uPC9wPgoraHJlZj0ibWFpbHRvOmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20iPmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20KK2FkZHJlc3M8L2E+LjwvcD4KIAotPGgzPkNUUyBUZWNobmljYWwgUXVlc3Rpb25zPC9oMz4KKzxoMz5Gb3IgQ1RTIFRlY2huaWNhbCBRdWVzdGlvbnM8L2gzPgogPHA+SWYgeW91IGhhdmUgc3BlY2lmaWMgaXNzdWVzIHdpdGggdGhlIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSB0aGF0IHJlcXVpcmUKIHlvdSB0byBkaXNjbG9zZSBpbmZvcm1hdGlvbiB5b3UnZCBwcmVmZXIgbm90IHRvIGJlIHB1YmxpYywgeW91IGNhbiBjb250YWN0IGFuCiBlbWFpbCBhZGRyZXNzIHdlJ3ZlIHNldCB1cCBzcGVjaWZpY2FsbHkgdGhpcyBwdXJwb3NlOiA8YQpAQCAtMjMsOSArMjIsOSBAQAogbGlzdC4gTm90ZSBhbHNvIHRoYXQgdGhpcyBsaXN0IGlzIGZvciBzcGVjaWZpYyB0ZWNobmljYWwgcXVlc3Rpb25zOyBnZW5lcmFsCiBpbnF1aXJpZXMgd2lsbCBhbHNvIGJlIGRpcmVjdGVkIGJhY2sgdG8gdGhlIGFuZHJvaWQtY29tcGF0aWJpbGl0eSBsaXN0LjwvcD4KIAotPGgzPlByaXZhdGUgSW5xdWlyaWVzPC9oMz4KKzxoMz5Gb3IgQnVzaW5lc3MgSW5xdWlyaWVzPC9oMz4KIDxwPkZpbmFsbHksIGJ1c2luZXNzIGlucXVpcmllcyBhYm91dCB0aGUgY29tcGF0aWJpbGl0eSBwcm9ncmFtLCBpbmNsdWRpbmcKIHJlcXVlc3RzIHRvIHVzZSBicmFuZGluZyBlbGVtZW50cyBhbmQgc28gb24sIGNhbiBiZSBzZW50IHRvIHRoZSBhZGRyZXNzIDxhCi1ocmVmPSJtYWlsdG86Y29tcGF0aWJpbGl0eUBhbmRyb2lkLmNvbSI+Y29tcGF0aWJpbGl0eUBhbmRyb2lkLmNvbTwvYT4uIExpa2UKK2hyZWY9Im1haWx0bzphbmRyb2lkLXBhcnRuZXJzaGlwc0Bnb29nbGUuY29tIj5hbmRyb2lkLXBhcnRuZXJzaGlwc0Bnb29nbGUuY29tPC9hPi4gTGlrZQogdGhlIENUUyBhZGRyZXNzLCB0aGlzIGFkZHJlc3MgaXMgZm9yIHNwZWNpZmljLCBwcml2YXRlIGlucXVpcmllczsgZ2VuZXJhbAogcXVlc3Rpb25zIHdpbGwgYmUgZGlyZWN0ZWQgYmFjayB0byB0aGUgYW5kcm9pZC1jb21wYXRpYmlsaXR5IGxpc3QuPC9wPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jdHMtaW50cm8uamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5qZAppbmRleCBmMWQyMzU5Li5mMTU4Y2E4IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5qZAorKysgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5qZApAQCAtMTMsMTAgKzEzLDE0IEBACiAKIDxoMz5Xb3JrZmxvdzwvaDM+CiA8b2w+Ci08bGk+T2J0YWluIHRoZSBDVFMgc291cmNlIGNvZGUuIFRoZSBDVFMgaXMgaW5jbHVkZWQgaW4gdGhlIEFuZHJvaWQgc291cmNlIGNvZGUgYXZhaWxhYmxlIGZyb20gdGhlIEFuZHJvaWQKLU9wZW4gU291cmNlIFByb2plY3QuIChUbyBnZXQgYSBjb3B5IG9mIHRoYXQgc291cmNlIGNvZGUsIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2Rvd25sb2FkLmh0bWwiPnJlYWQgdGhpcyBwYWdlLjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2Rvd25sb2Fkcy5odG1sIj5Eb3dubG9hZDwvYT4gdGhlIENUUy4KIDxsaT5BdHRhY2ggYXQgbGVhc3Qgb25lIGRldmljZSAob3IgZW11bGF0b3IpIHRvIHlvdXIgbWFjaGluZS48L2xpPgorPGxpPkZvciBDVFMgMi4xIFIyIGFuZCBiZXlvbmQsIHNldHVwIHlvdXIgZGV2aWNlIChvciBlbXVsYXRvcikgdG8gcnVuIHRoZSBhY2Nlc3NpYmlsaXR5IHRlc3RzOgorICAgIDxvbD4KKyAgICAgICAgPGxpPmFkYiBpbnN0YWxsIC1yIGFuZHJvaWQtY3RzL3JlcG9zaXRvcnkvdGVzdGNhc2VzL0N0c0RlbGVnYXRpbmdBY2Nlc3NpYmlsaXR5U2VydmljZS5hcGs8L2xpPgorICAgICAgICA8bGk+T24gdGhlIGRldmljZSwgZW5hYmxlIFNldHRpbmdzID4gQWNjZXNzaWJpbGl0eSA+IEFjY2Vzc2liaWxpdHkgPiBEZWxlZ2F0aW5nIEFjY2Vzc2liaWxpdHkgU2VydmljZTwvbGk+CisgICAgPC9vbD4KKzwvbGk+CiA8bGk+TGF1bmNoIHRoZSBDVFMuIFRoZSBDVFMgdGVzdCBoYXJuZXNzIGxvYWRzIHRoZSB0ZXN0IHBsYW4gb250byB0aGUgYXR0YWNoZWQgZGV2aWNlcy4gRm9yIGVhY2ggdGVzdCBpbiB0aGUgdGVzdCBoYXJuZXNzOgogICAgIDx1bD4KICAgICA8bGk+VGhlIHRlc3QgaGFybmVzcyBwdXNoZXMgYSAuYXBrIGZpbGUgdG8gZWFjaCBkZXZpY2UsIGV4ZWN1dGVzIHRoZSB0ZXN0IHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uLCBhbmQgcmVjb3JkcyB0ZXN0IHJlc3VsdHMuPC9saT4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvZG93bmxvYWRzLmpkIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9kb3dubG9hZHMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYzg2OAotLS0gL2Rldi9udWxsCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvZG93bmxvYWRzLmpkCkBAIC0wLDAgKzEsNDggQEAKK3BhZ2UudGl0bGU9QW5kcm9pZCBDb21wYXRpYmlsaXR5IERvd25sb2FkcworZG9jLnR5cGU9Y29tcGF0aWJpbGl0eQorQGpkOmJvZHkKKzxwPlRoYW5rcyBmb3IgeW91ciBpbnRlcmVzdCBpbiBBbmRyb2lkIENvbXBhdGliaWxpdHkhIFRoZSBsaW5rcyBiZWxvdyBhbGxvdworeW91IHRvIGFjY2VzcyB0aGUga2V5IGRvY3VtZW50cyBhbmQgaW5mb3JtYXRpb24uPC9wPgorCis8aDI+QW5kcm9pZCAyLjI8L2gyPgorPHA+QW5kcm9pZCAyLjIgaXMgdGhlIHJlbGVhc2Ugb2YgdGhlIGRldmVsb3BtZW50IG1pbGVzdG9uZSBjb2RlLW5hbWVkCitGcm9Zby4gQW5kcm9pZCAyLjIgaXMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBbmRyb2lkLiBTb3VyY2UgY29kZSBmb3IgQW5kcm9pZAorMi4yIGlzIGZvdW5kIGluIHRoZSAnZnJveW8nIGJyYW5jaCBpbiB0aGUgb3Blbi1zb3VyY2UgdHJlZS4KKzwvcD4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2FuZHJvaWQtMi4yLWNkZC5wZGYiPkFuZHJvaWQgMi4yIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCAoQ0REKTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vZGwvYW5kcm9pZC9jdHMvYW5kcm9pZC1jdHMtMi4yX3IzLXg4Ni56aXAiPkFuZHJvaWQgMi4yIFIzIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSAoQ1RTKTwvYT48L2xpPgorPC91bD4KKworPGgyPkFuZHJvaWQgMi4xPC9oMj4KKzxwPkFuZHJvaWQgMi4xIGlzIHRoZSByZWxlYXNlIG9mIHRoZSBkZXZlbG9wbWVudCBtaWxlc3RvbmUgY29kZS1uYW1lZAorRWNsYWlyLiBTb3VyY2UgY29kZSBmb3IgQW5kcm9pZCAyLjEgaXMgZm91bmQgaW4gdGhlICdlY2xhaXInIGJyYW5jaCBpbiB0aGUKK29wZW4tc291cmNlIHRyZWUuIE5vdGUgdGhhdCBmb3IgdGVjaG5pY2FsIHJlYXNvbnMsIHRoZXJlIGlzIG5vIGNvbXBhdGliaWxpdHkKK3Byb2dyYW0gZm9yIEFuZHJvaWQgMi4wIG9yIDIuMC4xLCBhbmQgbmV3IGRldmljZXMgbXVzdCB1c2UgQW5kcm9pZCAyLjEuCis8L3A+Cis8dWw+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMS1jZGQucGRmIj5BbmRyb2lkIDIuMSBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgKENERCk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2RsL2FuZHJvaWQvY3RzL2FuZHJvaWQtY3RzLTIuMV9yNS14ODYuemlwIj5BbmRyb2lkIDIuMSBSNSBDb21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgKENUUyk8L2E+PC9saT4KKzwvdWw+CisKKzxoMj5BbmRyb2lkIDEuNjwvaDI+Cis8cD5BbmRyb2lkIDEuNiB3YXMgdGhlIHJlbGVhc2Ugb2YgdGhlIGRldmVsb3BtZW50IG1pbGVzdG9uZSBjb2RlLW5hbWVkIERvbnV0LgorQW5kcm9pZCAxLjYgd2FzIG9ic29sZXRlZCBieSBBbmRyb2lkIDIuMS4gU291cmNlIGNvZGUgZm9yIEFuZHJvaWQgMS42IGlzIGZvdW5kCitpbiB0aGUgJ2RvbnV0JyBicmFuY2ggaW4gdGhlIG9wZW4tc291cmNlIHRyZWUuCis8dWw+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTEuNi1jZGQucGRmIj5BbmRyb2lkIDEuNiBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgKENERCk8L2E+PC9saT4KKzwvdWw+CisKKzxoMj5Db21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgTWFudWFsPC9oMj4KKzxwPlRoZSBDVFMgdXNlciBtYW51YWwgaXMgYXBwbGljYWJsZSB0byBhbnkgQ1RTIHZlcnNpb24sIGJ1dCBDVFMgMi4xIFIyIGFuZAorYmV5b25kIHJlcXVpcmUKKzxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5odG1sIj5hZGRpdGlvbmFsIHN0ZXBzPC9hPgordG8gcnVuIHRoZSBhY2Nlc3NpYmlsaXR5IHRlc3RzLgorPHVsPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvYW5kcm9pZC1jdHMtbWFudWFsLXI0LnBkZiI+Q29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIChDVFMpIFVzZXIgTWFudWFsPC9hPjwvbGk+Cis8L3VsPgorCis8aDI+T2xkZXIgQW5kcm9pZCBWZXJzaW9uczwvaDI+Cis8cD5UaGVyZSBpcyBubyBDb21wYXRpYmlsaXR5IFByb2dyYW0gZm9yIG9sZGVyIHZlcnNpb25zIG9mIEFuZHJvaWQsIHN1Y2ggYXMgQW5kcm9pZAorMS41IChrbm93biBpbiBkZXZlbG9wbWVudCBhcyBDdXBjYWtlKS4gTmV3IGRldmljZXMgaW50ZW5kZWQgdG8gYmUgQW5kcm9pZAorY29tcGF0aWJsZSBtdXN0IHNoaXAgd2l0aCBBbmRyb2lkIDEuNiBvciBsYXRlci48L3A+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2luZGV4LmpkIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9pbmRleC5qZAppbmRleCAwYzM5YTk4Li4zNjY0NjkzIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2luZGV4LmpkCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvaW5kZXguamQKQEAgLTEsMTcgKzEsMjEgQEAKIHBhZ2UudGl0bGU9QW5kcm9pZCBDb21wYXRpYmlsaXR5CiBkb2MudHlwZT1jb21wYXRpYmlsaXR5CiBAamQ6Ym9keQotPHA+QW5kcm9pZCBpcyBhbiBvcGVuIHNvdXJjZSBwcm9kdWN0LCBhbmQgYW55b25lIGNhbiB1c2UgdGhlIHNvdXJjZSBjb2RlIHRvIGJ1aWxkCi1kZXZpY2VzLiBUaGUgcHVycG9zZSBvZiB0aGUgQW5kcm9pZCBjb21wYXRpYmlsaXR5IHByb2dyYW0gaXMgdG8gaGVscCBBbmRyb2lkCi1kZXZpY2UgaW1wbGVtZW50YXRpb25zIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggYWxsIGFwcHMuPC9wPgotPHA+QSBkZXZpY2UgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlIGlmIGV4aXN0aW5nIGFuZCBuZXcgdGhpcmQtcGFydHkKLWFwcGxpY2F0aW9ucyBydW4gY29ycmVjdGx5IG9uIGl0LiBQb29yIGRldmljZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjaGFuZ2UgQVBJcwotb3IgYWx0ZXIgYmVoYXZpb3JzIHdpbGwgYnJlYWsgdGhlc2UgYXBwcyBhbmQgc28gYXJlIG5vdCBjb21wYXRpYmxlLiBUaGUKLUFuZHJvaWQgY29tcGF0aWJpbGl0eSBwcm9ncmFtJ3MgYWltIGlzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIEFQSXMgYXJlCi1jb25zaXN0ZW50bHkgaW1wbGVtZW50ZWQgYWNyb3NzIGRldmljZXMuPC9wPgotPHA+VGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlIGFuZCBjb21wYXRpYmlsaXR5IHByb2dyYW0gaXMKLTEuNiwgd2hpY2ggcm91Z2hseSBjb3JyZXNwb25kZWQgdG8gdGhlIERvbnV0IGJyYW5jaC4gIFRoZSBjb21wYXRpYmlsaXR5Ci1wcm9ncmFtIGZvciBBbmRyb2lkIDIueCAoY29ycmVzcG9uZGluZyB0byBFY2xhaXIpIGlzIGNvbWluZyBzb29uLjwvcD4KKzxwPkFuZHJvaWQncyBwdXJwb3NlIGlzIHRvIGVzdGFibGlzaCBhbiBvcGVuIHBsYXRmb3JtIGZvciBkZXZlbG9wZXJzIHRvIGJ1aWxkCitpbm5vdmF0aXZlIG1vYmlsZSBhcHBzLiBUaHJlZSBrZXkgY29tcG9uZW50cyB3b3JrIHRvZ2V0aGVyIHRvIHJlYWxpemUgdGhpcworcGxhdGZvcm0uPC9wPgorPHA+VGhlIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBQcm9ncmFtIGRlZmluZXMgdGhlIHRlY2huaWNhbCBkZXRhaWxzIG9mIEFuZHJvaWQKK3BsYXRmb3JtIGFuZCBwcm92aWRlcyB0b29scyB1c2VkIGJ5IE9FTXMgdG8gZW5zdXJlIHRoYXQgZGV2ZWxvcGVyc+KAmSBhcHBzIHJ1bgorb24gYSB2YXJpZXR5IG9mIGRldmljZXMuIFRoZSBBbmRyb2lkIFNESyBwcm92aWRlcyBidWlsdC1pbiB0b29scyB0aGF0CitEZXZlbG9wZXJzIHVzZSB0byBjbGVhcmx5IHN0YXRlIHRoZSBkZXZpY2UgZmVhdHVyZXMgdGhlaXIgYXBwcyByZXF1aXJlLiBBbmQKK0FuZHJvaWQgTWFya2V0IHNob3dzIGFwcHMgb25seSB0byB0aG9zZSBkZXZpY2VzIHRoYXQgY2FuIHByb3Blcmx5IHJ1bgordGhlbS48L3A+Cis8cD5UaGVzZSBwYWdlcyBkZXNjcmliZSB0aGUgQW5kcm9pZCBDb21wYXRpYmlsaXR5IFByb2dyYW0gYW5kIGhvdyB0byBnZXQKK2FjY2VzcyB0byBjb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uIGFuZCB0b29scy4gVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZQorQW5kcm9pZCBzb3VyY2UgY29kZSBhbmQgY29tcGF0aWJpbGl0eSBwcm9ncmFtIGlzIDIuMiwgd2hpY2ggcm91Z2hseQorY29ycmVzcG9uZGVkIHRvIHRoZSBGcm9ZbyBicmFuY2guPC9wPgorCisKIDxoMj5XaHkgYnVpbGQgY29tcGF0aWJsZSBBbmRyb2lkIGRldmljZXM/PC9oMj4KIDxoMz5Vc2VycyB3YW50IGEgY3VzdG9taXphYmxlIGRldmljZS48L2gzPgogPHA+QSBtb2JpbGUgcGhvbmUgaXMgYSBoaWdobHkgcGVyc29uYWwsIGFsd2F5cy1vbiwgYWx3YXlzLXByZXNlbnQgZ2F0ZXdheSB0bwpAQCAtMjAsNyArMjQsNyBAQAogcGxhdGZvcm0gZm9yIHJ1bm5pbmcgYWZ0ZXItbWFya2V0IGFwcGxpY2F0aW9ucy48L3A+CiAKIDxoMz5EZXZlbG9wZXJzIG91dG51bWJlciB1cyBhbGwuPC9oMz4KLTxwPk5vIGRldmljZSBtYW51ZmFjdHVyZXIgY2FuIGhvcGUgdG8gd3JpdGUgYWxsIHRoZSBzb2Z0d2FyZSB0aGF0IGFueW9uZSBjb3VsZAorPHA+Tm8gZGV2aWNlIG1hbnVmYWN0dXJlciBjYW4gaG9wZSB0byB3cml0ZSBhbGwgdGhlIHNvZnR3YXJlIHRoYXQgYSBwZXJzb24gY291bGQKIGNvbmNlaXZhYmx5IG5lZWQuIFdlIG5lZWQgdGhpcmQtcGFydHkgZGV2ZWxvcGVycyB0byB3cml0ZSB0aGUgYXBwcyB1c2VycyB3YW50LAogc28gdGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCBhaW1zIHRvIG1ha2UgaXQgYXMgZWFzeSBhbmQgb3BlbiBhcwogcG9zc2libGUgZm9yIGRldmVsb3BlcnMgdG8gYnVpbGQgYXBwcy48L3A+CkBAIC0zOCwzMCArNDIsMjMgQEAKIHN1cmUgeW91ciBkZXZpY2UgaXMgY29tcGF0aWJsZSB3aXRoIEFuZHJvaWQuIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlCiBBbmRyb2lkIGNvbXBhdGliaWxpdHkgcHJvZ3JhbSBpbiBnZW5lcmFsLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L292ZXJ2aWV3Lmh0bWwiPnRoZSBwcm9ncmFtIG92ZXJ2aWV3PC9hPi48L3A+Ci08cD5CdWlsZGluZyBhIGNvbXBhdGlibGUgZGV2aWNlIGlzIGEgZm91ci1zdGVwIHByb2Nlc3M6PC9wPgorPHA+QnVpbGRpbmcgYSBjb21wYXRpYmxlIGRldmljZSBpcyBhIHRocmVlLXN0ZXAgcHJvY2Vzczo8L3A+CiA8b2w+Ci0gIDxsaT48Yj5PYnRhaW4gdGhlIEFuZHJvaWQgc29mdHdhcmUgc3RhY2sgc291cmNlIGNvZGU8L2I+PHA+VGhpcyBpcyB0aGUKKyAgPGxpPjxiPk9idGFpbiB0aGUgQW5kcm9pZCBzb2Z0d2FyZSBzb3VyY2UgY29kZTwvYj48cD5UaGlzIGlzIHRoZQogICA8YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2luZGV4Lmh0bWwiPnNvdXJjZSBjb2RlIGZvciB0aGUgQW5kcm9pZAogICBwbGF0Zm9ybTwvYT4sIHRoYXQgeW91IHBvcnQgdG8geW91ciBoYXJkd2FyZS48L3A+PC9saT4KLSAgPGxpPjxiPkNvbXBseSB3aXRoIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50PC9iPjxwPgotICBUaGlzIGRvY3VtZW50IGVudW1lcmF0ZXMgdGhlIHNvZnR3YXJlIGFuZCB0aGUgaGFyZHdhcmUgZmVhdHVyZXMgb2YKKyAgPGxpPjxiPkNvbXBseSB3aXRoIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50IChDREQpPC9iPjxwPgorICBUaGUgQ0REIGVudW1lcmF0ZXMgdGhlIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSByZXF1aXJlbWVudHMgb2YKICAgYSBjb21wYXRpYmxlIEFuZHJvaWQgZGV2aWNlLjwvcD48L2xpPgogICA8bGk+PGI+UGFzcyB0aGUgQ29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIChDVFMpPC9iPjxwPllvdSBjYW4gdXNlIHRoZSBDVFMKICAgKGluY2x1ZGVkIGluIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlKSBhcyBhbiBvbmdvaW5nIGFpZCB0byBjb21wYXRpYmlsaXR5CiAgIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy48L3A+PC9saT4KLSAgPGxpPjxiPlN1Ym1pdCBDVFMgcmVwb3J0PC9iPjxwPltPcHRpb25hbF0gWW91IGNhbiBhbHNvIHN1Ym1pdCB5b3VyIENUUyByZXBvcnQsCi0gIHNvIHRoYXQgaXQgY2FuIGJlIHZhbGlkYXRlZCBhbmQgcmVjb3JkZWQuPC9wPjxwPjxpPk5vdGU6Ci0gIHRoZSBzdWJtaXNzaW9uIHN5c3RlbSBpcyBjdXJyZW50bHkgdW5kZXIgY29uc3RydWNpdG9uLCBhbmQgaXMgbm90IGN1cnJlbnRseQotICBhdmFpbGFibGUuPC9pPjwvcD48L2xpPgogPC9vbD4KIAotPGgyPkJlbmVmaXRzIG9mIGNvbXBhdGliaWxpdHk8L2gyPgotPHA+Qnkgc3VibWl0dGluZyBhIHZhbGlkYXRlZCBDVFMgcmVwb3J0LCB5b3UgcmVjZWl2ZSBwdWJsaWMgcmVjb2duaXRpb24gb2YKLXlvdXIgZGV2aWNlJ3MgY29tcGF0aWJpbGl0eS4gVGhpcyBhbHNvIG9wZW5zIHVwIGFkZGl0aW9uYWwgb3B0aW9ucyB5b3UgY2FuCi1wdXJzdWUgc3VjaCBhcyB1c2Ugb2YgdGhlIEFuZHJvaWQgYnJhbmRpbmcsIGFjY2VzcyB0byBBbmRyb2lkIE1hcmtldCwgYW5kCi1tb3JlLjwvcD4KLTxwPkFzIGEgY29uc2VxdWVuY2Ugb2Ygc29tZSBsZWdhbCBxdWlya3MsIHdlIGFyZW4ndCBhYmxlIHRvIG9mZmVyIGF1dG9tYXRpYwotbGljZW5zaW5nIG9mIGVpdGhlciB0aGUgQW5kcm9pZCBNYXJrZXQgb3IgYnJhbmRpbmcuIFRvIGFjdHVhbGx5IG9idGFpbiBhY2Nlc3MKLXRvIHRoZXNlIHByb2dyYW1zLCB5b3Ugd2lsbCBuZWVkIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9jb250YWN0LXVzLmh0bWwiPmNvbnRhY3QgdXM8L2E+IHRvIG9idGFpbiBhCi1saWNlbnNlLjwvcD4KKzxoMj5Kb2luaW5nIHRoZSBFY29zeXN0ZW08L2gyPgorPHA+T25jZSB5b3UndmUgYnVpbHQgYSBjb21wYXRpYmxlIGRldmljZSwgeW91IG1heSB3aXNoIHRvIGluY2x1ZGUgQW5kcm9pZAorTWFya2V0IHRvIHByb3ZpZGUgeW91ciB1c2VycyBhY2Nlc3MgdG8gdGhlIHRoaXJkLXBhcnR5IGFwcCBlY29zeXN0ZW0uCitVbmZvcnR1bmF0ZWx5LCBmb3IgYSB2YXJpZXR5IG9mIGxlZ2FsIGFuZCBidXNpbmVzcyByZWFzb25zLCB3ZSBhcmVuJ3QgYWJsZSB0bworYXV0b21hdGljYWxseSBsaWNlbnNlIEFuZHJvaWQgTWFya2V0IHRvIGFsbCBjb21wYXRpYmxlIGRldmljZXMuIFRvIGlucXVpcmUKK2Fib3V0IGFjY2VzcyBhYm91dCBBbmRyb2lkIE1hcmtldCwgeW91IGNhbiA8YQoraHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvY29udGFjdC11cy5odG1sIj5jb250YWN0IHVzPC9hPjwvcD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvb3ZlcnZpZXcuamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L292ZXJ2aWV3LmpkCmluZGV4IDAzOWUyYzIuLjMxYTQ4MzIgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvb3ZlcnZpZXcuamQKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9vdmVydmlldy5qZApAQCAtMzUsMTEgKzM1LDEzIEBACiBjb21wYXRpYmxlLjwvcD48L2xpPgogPGxpPjxiPk1pbmltaXplIGNvc3RzIGFuZCBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGgKIGNvbXBhdGliaWxpdHkuPC9iPjxwPkVuc3VyaW5nIGNvbXBhdGliaWxpdHkgc2hvdWxkIGJlIGVhc3kgYW5kIGluZXhwZW5zaXZlIHRvCi1kZXZpY2UgbWFudWZhY3R1cmVycy4gVGhlIHRlc3RpbmcgdG9vbCAoQ1RTKSBpcyBmcmVlIGFuZCB3aWxsIHNvb24gYmUgYXZhaWxhYmxlCi1pbiBvcGVuIHNvdXJjZS4gQ1RTIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZm9yIGNvbnRpbnVvdXMgc2VsZi10ZXN0aW5nIGR1cmluZwotdGhlIGRldmljZSBkZXZlbG9wbWVudCBwcm9jZXNzIHRvIGVsaW1pbmF0ZSB0aGUgY29zdCBvZiBjaGFuZ2luZyB5b3VyIHdvcmtmbG93Ci1vciBzZW5kaW5nIHlvdXIgZGV2aWNlIHRvIGEgdGhpcmQgcGFydHkgZm9yIHRlc3RpbmcuIE1lYW53aGlsZSwgdGhlcmUgYXJlIG5vCi1yZXF1aXJlZCBjZXJ0aWZpY2F0aW9ucywgYW5kIHRodXMgbm8gY29ycmVzcG9uZGluZyBjb3N0cyBhbmQgZmVlcy48L3A+PC9saT4KK2RldmljZSBtYW51ZmFjdHVyZXJzLiBUaGUgdGVzdGluZyB0b29sIChDVFMpIGlzIGZyZWUsIG9wZW4gc291cmNlLCBhbmQKK2F2YWlsYWJsZSBmb3IgPGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvZG93bmxvYWRzLmh0bWwiPmRvd25sb2FkPC9hPi4gCitDVFMgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBmb3IgY29udGludW91cyBzZWxmLXRlc3RpbmcKK2R1cmluZyB0aGUgZGV2aWNlIGRldmVsb3BtZW50IHByb2Nlc3MgdG8gZWxpbWluYXRlIHRoZSBjb3N0IG9mIGNoYW5naW5nIHlvdXIKK3dvcmtmbG93IG9yIHNlbmRpbmcgeW91ciBkZXZpY2UgdG8gYSB0aGlyZCBwYXJ0eSBmb3IgdGVzdGluZy4gTWVhbndoaWxlLCB0aGVyZQorYXJlIG5vIHJlcXVpcmVkIGNlcnRpZmljYXRpb25zLCBhbmQgdGh1cyBubyBjb3JyZXNwb25kaW5nIGNvc3RzIGFuZAorZmVlcy48L3A+PC9saT4KIDwvdWw+CiA8cD5UaGUgQW5kcm9pZCBjb21wYXRpYmlsaXR5IHByb2dyYW0gY29uc2lzdHMgb2YgdGhyZWUga2V5IGNvbXBvbmVudHM6PC9wPgogPHVsPgpAQCAtNzYsOCArNzgsOSBAQAogc2ltcGx5IGV4YW1pbmUgPGEgaHJlZj0iIj50aGUgbGF0ZXN0IENERDwvYT4uPC9wPgogCiA8aDM+Q29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIChDVFMpPC9oMz4KLTxwPlRoZSBDVFMgaXMgYSBmcmVlLCBjb21tZXJjaWFsLWdyYWRlIHRlc3Qgc3VpdGUsIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZQotQW5kcm9pZCBzb3VyY2UgY29kZS4gVGhlIENUUyByZXByZXNlbnRzIHRoZSAibWVjaGFuaXNtIiBvZiBjb21wYXRpYmlsaXR5LjwvcD4KKzxwPlRoZSBDVFMgaXMgYSBmcmVlLCBjb21tZXJjaWFsLWdyYWRlIHRlc3Qgc3VpdGUsIGF2YWlsYWJsZSBmb3IKKzxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2Rvd25sb2Fkcy5odG1sIj5kb3dubG9hZDwvYT4uCitUaGUgQ1RTIHJlcHJlc2VudHMgdGhlICJtZWNoYW5pc20iIG9mIGNvbXBhdGliaWxpdHkuPC9wPgogPHA+VGhlIENUUyBydW5zIG9uIGEgZGVza3RvcCBtYWNoaW5lIGFuZCBleGVjdXRlcyB0ZXN0IGNhc2VzIGRpcmVjdGx5IG9uCiBhdHRhY2hlZCBkZXZpY2VzIG9yIGFuIGVtdWxhdG9yLiBUaGUgQ1RTIGlzIGEgc2V0IG9mIHVuaXQgdGVzdHMgZGVzaWduZWQgdG8gYmUKIGludGVncmF0ZWQgaW50byB0aGUgZGFpbHkgd29ya2Zsb3cgKHN1Y2ggYXMgdmlhIGEgY29udGludW91cyBidWlsZCBzeXN0ZW0pIG9mCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9kb3dubG9hZHMvZG93bmxvYWRzX3RvYy5jcyBiL3Bkay9kb2NzL2Rvd25sb2Fkcy9kb3dubG9hZHNfdG9jLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY0M2FmLi4wMDAwMDAwCi0tLSBhL3Bkay9kb2NzL2Rvd25sb2Fkcy9kb3dubG9hZHNfdG9jLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLWZ1bmN0aW9uIG5vdGhpbmcoKSB7fQotLS0+Ci08L3NjcmlwdD4KLQotPHVsPgotICA8bGk+PGgyPlBESzwvaDI+PHVsPgotICAgIDxsaT48YSBocmVmPSIiPlBESyAxLjY8L2E+PC9saT4KLSAgPC91bD48L2xpPgotCi0gIDxsaT48aDI+Q29tcGF0aWJpbGl0eTwvaDI+PHVsPgotICAgIDxsaT48YSBocmVmPSIiPkFuZHJvaWQgMS42PC9hPjwvbGk+Ci0gIDwvdWw+PC9saT4KLTwvdWw+Ci0KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLTwhLS0KLSAgICBidWlsZFRvZ2dsZUxpc3RzKCk7Ci0vLy0tPgotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9kb3dubG9hZHMvaW5kZXguamQgYi9wZGsvZG9jcy9kb3dubG9hZHMvaW5kZXguamQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjVhMmYuLjAwMDAwMDAKLS0tIGEvcGRrL2RvY3MvZG93bmxvYWRzL2luZGV4LmpkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotcGFnZS50aXRsZT1Eb3dubG9hZHMKLWRvYy50eXBlPWRvd25sb2FkcwotZG9jLmhpZGVuYXY9dHJ1ZQotQGpkOmJvZHkKLTxwPlRoaXMgcGFnZSBwcm92aWRlcyBhY2Nlc3MgdG8gdmFyaW91cyBkb3dubG9hZHMuIE5vdGUgdGhhdCBpZiB5b3UncmUgbG9va2luZwotZm9yIHRoZSBBbmRyb2lkIFNESyAoZm9yIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMpLCB5b3Ugc2hvdWxkIHZpc2l0IDxhCi1ocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Nkay9pbmRleC5odG1sIj5kZXZlbG9wZXIuYW5kcm9pZC5jb208L2E+LjwvcD4KLQotPGgyPkNvbXBhdGliaWxpdHk8L2gyPgotPHA+VGhlIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCBjYW4gYmUgZG93bmxvYWRlZCBiZWxvdy4gVGhlCi1Db21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBvcGVuLXNvdXJjZSB0cmVlLjwvcD4KLTx0YWJsZSBjbGFzcz0iZG93bmxvYWQiPiAKLSAgPHRyPiAKLSAgICAgIDx0aD5JdGVtPC90aD4gCi0gICAgICA8dGg+RmlsZTwvdGg+IAotICAgICAgPHRoPlNpemU8L3RoPiAKLSAgPC90cj4gCi0gIDx0cj4gCi0gICAgPHRkPkFuZHJvaWQgQ0REIDIuMTwvdGQ+IAotICAgIDx0ZD48YSBocmVmPSIiPmFuZHJvaWQtY2RkLTIuMS5wZGY8L2E+PC90ZD4gCi0gICAgPHRkPjIzMDcwODA1IGJ5dGVzPC90ZD4gCi0gIDwvdHI+IAotICA8dHIgY2xhc3M9ImFsdC1jb2xvciI+IAotICAgIDx0ZD5BbmRyb2lkIENUUyAyLjEgTWFudWFsPC90ZD4gCi0gICAgPHRkPjxhIGhyZWY9IiI+YW5kcm9pZC1jdHMtbWFudWFsLTIuMS4wLnBkZjwvYT48L3RkPiAKLSAgICA8dGQ+MjMwNzA4MDUgYnl0ZXM8L3RkPiAKLSAgPC90cj4gCi0gIDx0cj4gCi0gICAgPHRkPkFuZHJvaWQgQ0REIDEuNjwvdGQ+IAotICAgIDx0ZD48YSBocmVmPSIiPmFuZHJvaWQtY2RkLTEuNi5wZGY8L2E+PC90ZD4gCi0gICAgPHRkPjIzMDcwODA1IGJ5dGVzPC90ZD4gCi0gIDwvdHI+IAotICA8dHIgY2xhc3M9ImFsdC1jb2xvciI+IAotICAgIDx0ZD5BbmRyb2lkIENUUyAxLjYgTWFudWFsPC90ZD4gCi0gICAgPHRkPjxhIGhyZWY9IiI+YW5kcm9pZC1jdHMtbWFudWFsLTEuNi40LnBkZjwvYT48L3RkPiAKLSAgICA8dGQ+MjMwNzA4MDUgYnl0ZXM8L3RkPiAKLSAgPC90cj4gCi08L3RhYmxlPiAKLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkLWNvbXBhdGlibGUgZGV2aWNlLCBzZWUgdGhlCi08YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9pbmRleC5odG1sIj5Db21wYXRpYmlsaXR5PC9hPiBwYWdlLiBOb3RlIHRoYXQKLXRoZXJlIGlzIG5vIGNvbXBhdGliaWxpdHkgcHJvZ3JhbSBmb3IgQW5kcm9pZCAxLjUgYW5kIGVhcmxpZXIuIE5vdGUgYWxzbyB0aGF0Ci10aGVyZSBpcyBubyBjb21wYXRpYmlsaXR5IHByb2dyYW0gZm9yIEFuZHJvaWQgMi4wLCBzaW5jZSBpdCB3YXMgc3VwZXJjZWRlZCBieQotQW5kcm9pZCAyLjEgYWZ0ZXIgb25seSBhIGZldyB3ZWVrcy4KLTwvcD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2ZhcXMuamQgYi9wZGsvZG9jcy9mYXFzLmpkCmluZGV4IGE1NWQzODAuLjAwZGIwMjYgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2ZhcXMuamQKKysrIGIvcGRrL2RvY3MvZmFxcy5qZApAQCAtNzQsOCArNzQsOCBAQAogPHA+RmluYWxseSwgR29vZ2xlIHdvcmtzIG9uIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gaW4gdGFuZGVtCiAgIHdpdGggZGV2ZWxvcGluZyBhIGZsYWdzaGlwIGRldmljZS4gVGhpcyBicmFuY2ggcHVsbHMgaW4gY2hhbmdlcyBmcm9tIHRoZQogICBleHBlcmltZW50YWwgYW5kIHN0YWJsZSBicmFuY2hlcyBhcyBhcHByb3ByaWF0ZS48L3A+Ci08cD5Zb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHRvcGljIGF0IG91ciBCcmFuY2hlcyBSZWxlYXNlcwotICBwYWdlLjwvcD4KKzxwPllvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgdG9waWMgYXQgb3VyIDxhCitocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2NvZGUtbGluZXMuaHRtbCI+QnJhbmNoZXMgYW5kIFJlbGVhc2VzPC9hPiBwYWdlLjwvcD4KIAogPGgzPldoeSBhcmUgcGFydHMgb2YgQW5kcm9pZCBkZXZlbG9wZWQgaW4gcHJpdmF0ZT88L2gzPgogPHA+SXQgdHlwaWNhbGx5IHRha2VzIG92ZXIgYSB5ZWFyIHRvIGJyaW5nIGEgZGV2aWNlIHRvIG1hcmtldCwgYnV0IG9mIGNvdXJzZQpAQCAtODYsMTYgKzg2LDE2IEBACiA8cD5UbyBhZGRyZXNzIHRoaXMsIHNvbWUgcGFydHMgb2YgdGhlIG5leHQgdmVyc2lvbiBvZiBBbmRyb2lkIGluY2x1ZGluZyB0aGUKICAgY29yZSBwbGF0Zm9ybSBBUElzIGFyZSBkZXZlbG9wZWQgaW4gYSBwcml2YXRlIGJyYW5jaC4gVGhlc2UgQVBJcyBjb25zdGl0dXRlCiAgIHRoZSBuZXh0IHZlcnNpb24gb2YgQW5kcm9pZC4gT3VyIGFpbSBpcyB0byBmb2N1cyBhdHRlbnRpb24gb24gdGhlIGN1cnJlbnQKLSAgc3RhYmxlIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgc291cmNlIGNvZGUsIHdoaWxlIHdlIHJlZmluZSB0aGUgbmV4dCB2ZXJzaW9uCi0gIG9mIHRoZSBwbGF0Zm9ybSB1c2luZyB0aGUgZmxhZ3NoaXAgQW5kcm9pZCBkZXZpY2VzLiBUaGlzIGFsbG93cyBkZXZlbG9wZXJzCisgIHN0YWJsZSB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlLCB3aGlsZSB3ZSBjcmVhdGUgdGhlIG5leHQgdmVyc2lvbgorICBvZiB0aGUgcGxhdGZvcm0gYXMgZHJpdmVuIGJ5IGZsYWdzaGlwIEFuZHJvaWQgZGV2aWNlcy4gVGhpcyBhbGxvd3MgZGV2ZWxvcGVycwogICBhbmQgT0VNcyB0byBmb2N1cyBvbiBhIHNpbmdsZSB2ZXJzaW9uIHdpdGhvdXQgaGF2aW5nIHRvIHRyYWNrIHVuZmluaXNoZWQKLSAgZnV0dXJlIHdvcmsganVzdCB0byBrZWVwIHVwLk90aGVyIHBhcnRzIG9mIHRoZSBBbmRyb2lkIHN5c3RlbSB0aGF0IGFyZW4ndAorICBmdXR1cmUgd29yayBqdXN0IHRvIGtlZXAgdXAuIE90aGVyIHBhcnRzIG9mIHRoZSBBbmRyb2lkIHN5c3RlbSB0aGF0IGFyZW4ndAogICByZWxhdGVkIHRvIGFwcGxpY2F0aW9uIGNvbXBhdGliaWxpdHkgYXJlIGRldmVsb3BlZCBpbiB0aGUgb3BlbiwgaG93ZXZlci4KICAgSXQncyBvdXIgaW50ZW50aW9uIHRvIG1vdmUgbW9yZSBvZiB0aGVzZSBwYXJ0cyB0byBvcGVuIGRldmVsb3BtZW50IG92ZXIKICAgdGltZS48L3A+CiAKIDxoMz5XaGVuIGFyZSBzb3VyY2UgY29kZSByZWxlYXNlcyBtYWRlPzwvaDM+Ci08cD5XaGVuIHRoZXkgYXJlIHJlYWR5LiBTb21lIHBhcnRzIG9mIEFuZHJvaWQgYXJlIGRldmVsb3BlZCBpbiB0aGUgb3BlbiwgYW5kCis8cD5XaGVuIHRoZXkgYXJlIHJlYWR5LiBTb21lIHBhcnRzIG9mIEFuZHJvaWQgYXJlIGRldmVsb3BlZCBpbiB0aGUgb3BlbiwKICAgc28gdGhhdCBzb3VyY2UgY29kZSBpcyBhbHdheXMgYXZhaWxhYmxlLiBPdGhlciBwYXJ0cyBhcmUgZGV2ZWxvcGVkIGZpcnN0IGluCiAgIGEgcHJpdmF0ZSB0cmVlLCBhbmQgdGhhdCBzb3VyY2UgY29kZSBpcyByZWxlYXNlZCB3aGVuIHRoZSBuZXh0IHBsYXRmb3JtCiAgIHZlcnNpb24gaXMgcmVhZHkuPC9wPgpAQCAtMTQzLDggKzE0Myw3IEBACiAgICJBbmRyb2lkIGNvbXBhdGlibGUgZGV2aWNlcyIgZnJvbSBkZXZpY2VzIHRoYXQgbWVyZWx5IHJ1biBkZXJpdmF0aXZlcyBvZiB0aGUKICAgc291cmNlIGNvZGUuIFdlIHdlbGNvbWUgYWxsIHVzZXMgb2YgdGhlIEFuZHJvaWQgc291cmNlIGNvZGUsIGJ1dCBvbmx5CiAgIEFuZHJvaWQgY29tcGF0aWJsZSBkZXZpY2VzIC0tIGFzIGRlZmluZWQgYW5kIHRlc3RlZCBieSB0aGUgQW5kcm9pZAotICBDb21wYXRpYmlsaXR5IFByb2dyYW0gLS0gbWF5IGNhbGwgdGhlbXNlbHZlcyAiQW5kcm9pZCIgYW5kIHBhcnRpY2lwYXRlIGluCi0gIHRoZSBBbmRyb2lkIGVjb3N5c3RlbS48L3A+CisgIENvbXBhdGliaWxpdHkgUHJvZ3JhbSAtLSBtYXkgcGFydGljaXBhdGUgaW4gdGhlIEFuZHJvaWQgZWNvc3lzdGVtLjwvcD4KIAogPGgzPkhvdyBjYW4gSSBjb250cmlidXRlIHRvIEFuZHJvaWQ/PC9oMz4KIDxwPlRoZXJlIGFyZSBhIG51bWJlciBvZiB3YXlzIHlvdSBjYW4gY29udHJpYnV0ZSB0byBBbmRyb2lkLiBZb3UgY2FuIHJlcG9ydApAQCAtMTcwLDggKzE2OSw5IEBACiA8cD5PbmNlIHN1Ym1pdHRlZCwgY2hhbmdlcyBuZWVkIHRvIGJlIGFjY2VwdGVkIGJ5IGEgZGVzaWduYXRlZCBBcHByb3Zlci4KICAgQXBwcm92ZXJzIGFyZSB0eXBpY2FsbHkgR29vZ2xlIGVtcGxveWVlcywgYnV0IHRoZSBzYW1lIGFwcHJvdmVycyBhcmUKICAgcmVzcG9uc2libGUgZm9yIGFsbCBzdWJtaXNzaW9ucywgcmVnYXJkbGVzcyBvZiBvcmlnaW4uPC9wPgotPHA+WW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYyBhdCB0aGUgU3VibWl0dGluZyBQYXRjaGVzCi0gIHBhZ2UuPC9wPgorPHA+WW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYyBhdCB0aGUgPGEKKyAgIGhyZWY9IntAZG9jUm9vdH1zb3VyY2Uvc3VibWl0LXBhdGNoZXMuaHRtbCI+U3VibWl0dGluZyBQYXRjaGVzPC9hPgorICAgcGFnZS48L3A+CiAKIDxhIG5hbWU9ImNvbXBhdGliaWxpdHkiPjwvYT48aDI+Q29tcGF0aWJpbGl0eTwvaDI+CiA8aDM+V2hhdCBkb2VzICJjb21wYXRpYmlsaXR5IiBtZWFuPzwvaDM+CkBAIC0xODUsNyArMTg1LDcgQEAKIDxwPkluIG90aGVyIHdvcmRzLCBjb21wYXRpYmlsaXR5IGlzIGEgcHJlcmVxdWlzaXRlIHRvIHBhcnRpY2lwYXRlIGluIHRoZQogICBBbmRyb2lkIGFwcHMgZWNvc3lzdGVtLiBBbnlvbmUgaXMgd2VsY29tZSB0byB1c2UgdGhlIEFuZHJvaWQgc291cmNlIGNvZGUsCiAgIGJ1dCBpZiB0aGUgZGV2aWNlIGlzbid0IGNvbXBhdGlibGUsIGl0J3Mgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgQW5kcm9pZAotICBlY29zeXN0ZW0sIGFuZCBpcnJlbGV2YW50IHRvIGRldmVsb3BlcnMuPC9wPgorICBlY29zeXN0ZW0uPC9wPgogCiA8aDM+V2hhdCBpcyB0aGUgcm9sZSBvZiBBbmRyb2lkIE1hcmtldCBpbiBjb21wYXRpYmlsaXR5PzwvaDM+CiA8cD5EZXZpY2VzIHRoYXQgYXJlIEFuZHJvaWQgY29tcGF0aWJsZSBtYXkgc2VlayB0byBsaWNlbnNlIHRoZSBBbmRyb2lkIE1hcmtldApAQCAtMjAwLDExICsyMDAsMTEgQEAKICAgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50IChDREQpIHNwZWxscyBvdXQgdGhlIHNwZWNpZmljIGRldmljZQogICBjb25maWd1cmF0aW9ucyB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCBjb21wYXRpYmxlLjwvcD4KIDxwPkZvciBleGFtcGxlLCB0aG91Z2ggdGhlIEFuZHJvaWQgc291cmNlIGNvZGUgY291bGQgYmUgcG9ydGVkIHRvIHJ1biBvbiBhCi0gIGRldmljZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNhbWVyYSwgdGhlIENERCByZXF1aXJlcyB0aGF0IGluIG9yZGVyIHRvIGJlCi0gIGNvbXBhdGlibGUsIGFsbCBkZXZpY2VzIG11c3QgaGF2ZSBhIGNhbWVyYS4gVGhpcyBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWx5Ci0gIG9uIGEgY29uc2lzdGVudCBzZXQgb2YgZGV2aWNlIGNhcGFiaWxpdGllcyB3aGVuIHdyaXRpbmcgdGhlaXIgYXBwcy48L3A+CisgIHBob25lIHRoYXQgZG9lc24ndCBoYXZlIGEgY2FtZXJhLCB0aGUgQ0REIHJlcXVpcmVzIHRoYXQgaW4gb3JkZXIgdG8gYmUKKyAgY29tcGF0aWJsZSwgYWxsIHBob25lcyBtdXN0IGhhdmUgYSBjYW1lcmEuIFRoaXMgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVseQorICBvbiBhIGNvbnNpc3RlbnQgc2V0IG9mIGNhcGFiaWxpdGllcyB3aGVuIHdyaXRpbmcgdGhlaXIgYXBwcy48L3A+CiA8cD5UaGUgQ0REIHdpbGwgZXZvbHZlIG92ZXIgdGltZSB0byByZWZsZWN0IG1hcmtldCByZWFsaXRpZXMuIEZvciBpbnN0YW5jZSwKLSAgdGhlIDEuNiBDREQgb25seSBhbGxvd3MgY2VsbCBwaG9uZXMsIGJ1dCB0aGUgMi54IENERCBhbGxvd3MgZGV2aWNlcyB0byBvbWl0CisgIHRoZSAxLjYgQ0REIG9ubHkgYWxsb3dzIGNlbGwgcGhvbmVzLCBidXQgdGhlIDIuMSBDREQgYWxsb3dzIGRldmljZXMgdG8gb21pdAogICB0ZWxlcGhvbnkgaGFyZHdhcmUsIGFsbG93aW5nIGZvciBub24tcGhvbmUgZGV2aWNlcyBzdWNoIGFzIHRhYmxldC1zdHlsZQogICBtdXNpYyBwbGF5ZXJzIHRvIGJlIGNvbXBhdGlibGUuIEFzIHdlIG1ha2UgdGhlc2UgY2hhbmdlcywgd2Ugd2lsbCBhbHNvCiAgIGF1Z21lbnQgQW5kcm9pZCBNYXJrZXQgdG8gYWxsb3cgZGV2ZWxvcGVycyB0byByZXRhaW4gY29udHJvbCBvdmVyIHdoZXJlCkBAIC0yMTQsMTMgKzIxNCwxMCBAQAogICBkZXZpY2VzLjwvcD4KIAogPGgzPklmIG15IGRldmljZSBpcyBjb21wYXRpYmxlLCBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgaGF2ZSBhY2Nlc3MgdG8gQW5kcm9pZCBNYXJrZXQgYW5kIGJyYW5kaW5nPzwvaDM+Ci08cD5BbmRyb2lkIE1hcmtldCBpcyBhIHNlcnZpY2Ugb3BlcmF0ZWQgYnkgR29vZ2xlLiBGb3IgbGVnYWwgYW5kIGJ1c2luZXNzCi0gIHJlYXNvbnMsIEdvb2dsZSBpc24ndCBhYmxlIHRvIG1ha2UgdGhhdCBzZXJ2aWNlIGF2YWlsYWJsZSBpbiBhbGwgcGFydHMgb2YKLSAgdGhlIHdvcmxkLiBTaW1pbGFybHksIEdvb2dsZSBpcyB1bmFibGUgdG8gbGljZW5zZSB0aGUgQW5kcm9pZCB0cmFkZW1hcmsgZm9yCi0gIHVzZSBpbiBhbGwgY2FzZXMuPC9wPgotPHA+QXMgYSByZXN1bHQsIGFjaGlldmluZyBjb21wYXRpYmlsaXR5IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZW50aXRsZSBhCi0gIGRldmljZSB0byBpbmNsdWRlIEFuZHJvaWQgTWFya2V0IG9yIHVzZSB0aGUgQW5kcm9pZCBuYW1lLiBEZXZpY2UKLSAgbWFudWZhY3R1cmVycyBzaG91bGQgY29udGFjdCBHb29nbGUgdG8gb2J0YWluIGFjY2VzcyB0byB0aG9zZSB0b29scy48L3A+Cis8cD5BbmRyb2lkIE1hcmtldCBpcyBhIHNlcnZpY2Ugb3BlcmF0ZWQgYnkgR29vZ2xlLiBBY2hpZXZpbmcgY29tcGF0aWJpbGl0eSBpcworICAgYSBwcmVyZXF1aXNpdGUgZm9yIG9idGFpbmluZyBhY2Nlc3MgdG8gdGhlIEFuZHJvaWQgTWFya2V0IHNvZnR3YXJlIGFuZCBicmFuZGluZy4KKyAgIERldmljZSBtYW51ZmFjdHVyZXJzIHNob3VsZCBjb250YWN0IEdvb2dsZSB0byBvYnRhaW4gYWNjZXNzIHRvIEFuZHJvaWQKKyAgIE1hcmtldC48L3A+CiAKIDxoMz5JZiBJIGFtIG5vdCBhIG1hbnVmYWN0dXJlciwgaG93IGNhbiBJIGdldCBBbmRyb2lkIE1hcmtldD88L2gzPgogPHA+QW5kcm9pZCBNYXJrZXQgaXMgb25seSBsaWNlbnNlZCB0byBoYW5kc2V0IG1hbnVmYWN0dXJlcnMgc2hpcHBpbmcgZGV2aWNlcy4KQEAgLTIyOSw5ICsyMjYsOSBAQAogCiA8aDM+SG93IGNhbiBJIGdldCBhY2Nlc3MgdG8gdGhlIEdvb2dsZSBhcHBzIGZvciBBbmRyb2lkLCBzdWNoIGFzIE1hcHM/PC9oMz4KIDxwPlRoZSBHb29nbGUgYXBwcyBmb3IgQW5kcm9pZCwgc3VjaCBhcyBZb3VUdWJlLCBHb29nbGUgTWFwcyBhbmQgTmF2aWdhdGlvbiwKLSAgR21haWwsIGFuZCBzbyBvbiBhcmUgbm90IHBhcnQgb2YgQW5kcm9pZCwgYW5kIGFyZSBsaWNlbnNlZCBzZXBhcmF0ZWx5LgotICBDb250YWN0IGFuZHJvaWQtcGFydG5lcnNoaXBzQGdvb2dsZS5jb20gZm9yIGlucXVpcmllcyByZWxhdGVkIHRvIHRob3NlCi0gIGFwcHMuPC9wPgorICBHbWFpbCwgYW5kIHNvIG9uIGFyZSBHb29nbGUgcHJvcGVydGllcyB0aGF0IGFyZSBub3QgcGFydCBvZiBBbmRyb2lkLCBhbmQKKyAgYXJlIGxpY2Vuc2VkIHNlcGFyYXRlbHkuICBDb250YWN0IGFuZHJvaWQtcGFydG5lcnNoaXBzQGdvb2dsZS5jb20gZm9yCisgIGlucXVpcmllcyByZWxhdGVkIHRvIHRob3NlIGFwcHMuPC9wPgogCiA8aDM+SXMgY29tcGF0aWJpbGl0eSBtYW5kYXRvcnk/PC9oMz4KIDxwPk5vLiBUaGUgQW5kcm9pZCBDb21wYXRpYmlsaXR5IFByb2dyYW0gaXMgb3B0aW9uYWwuIFNpbmNlIHRoZSBBbmRyb2lkIHNvdXJjZQpAQCAtMjQ2LDcgKzI0Myw3IEBACiAgIHRlc3QgYSBkZXZpY2UuPC9wPgogCiA8aDM+SG93IGxvbmcgZG9lcyBjb21wYXRpYmlsaXR5IHRha2U/PC9oMz4KLTxwPlRoZSBwcm9jZXNzIGlzIGF1dG9tYXRpYy4gVGhlIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSBnZW5lcmF0ZXMgYSByZXBvcnQKKzxwPlRoZSBwcm9jZXNzIGlzIGF1dG9tYXRlZC4gVGhlIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSBnZW5lcmF0ZXMgYSByZXBvcnQKICAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gR29vZ2xlIHRvIHZlcmlmeSBjb21wYXRpYmlsaXR5LiBFdmVudHVhbGx5IHdlIGludGVuZAogICB0byBwcm92aWRlIHNlbGYtc2VydmljZSB0b29scyB0byB1cGxvYWQgdGhlc2UgcmVwb3J0cyB0byBhIHB1YmxpYyBkYXRhYmFzZS48L3A+CiAKQEAgLTI3MSwxMiArMjY4LDE1IEBACiAgIGdlbmVyYWxseSBoYXZlIG11Y2ggZWZmZWN0IG9uIHRoaXJkLXBhcnR5IGFwcHMuIEFzIHN1Y2gsIGRldmljZSBidWlsZGVycyBhcmUKICAgZnJlZSB0byBjdXN0b21pemUgdGhlIHVzZXIgaW50ZXJmYWNlIGFzIG11Y2ggYXMgdGhleSBsaWtlLiBUaGUgQ29tcGF0aWJpbGl0eQogICBEZWZpbml0aW9uIERvY3VtZW50IGRvZXMgcmVzdHJpY3QgdGhlIGRlZ3JlZSB0byB3aGljaCBPRU1zIG1heSBhbHRlciB0aGUKLSAgc3lzdGVtIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgZmV3IGFyZWFzIHRoYXQgZG8gaW1wYWN0IHRoaXJkLXBhcnR5IGFwcHMuPC9wPgorICBzeXN0ZW0gdXNlciBpbnRlcmZhY2UgZm9yIGFyZWFzIHRoYXQgZG8gaW1wYWN0IHRoaXJkLXBhcnR5IGFwcHMuPC9wPgogCiA8aDM+V2hlbiBhcmUgY29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucyByZWxlYXNlZCBmb3IgbmV3IEFuZHJvaWQgdmVyc2lvbnM/PC9oMz4KIDxwPk91ciBnb2FsIGlzIHRvIHJlbGVhc2UgbmV3IHZlcnNpb25zIG9mIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uCiAgIERvY3VtZW50cyAoQ0REcykgb25jZSB0aGUgY29ycmVzcG9uZGluZyBBbmRyb2lkIHBsYXRmb3JtIHZlcnNpb24gaGFzCi0gIGNvbnZlcmdlZCBlbm91Z2ggdG8gcGVybWl0IGl0LiBTaW5jZSB0aGUgQ0REczwvcD4KKyAgY29udmVyZ2VkIGVub3VnaCB0byBwZXJtaXQgaXQuIFdoaWxlIHdlIGNhbid0IHJlbGVhc2UgYSBmaW5hbCBkcmFmdCBvZiBhIENERAorICBmb3IgYW4gQW5kcm9pZCBzb2Z0d2FyZSB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgZmxhZ3NoaXAgZGV2aWNlIHNoaXBzIHdpdGgKKyAgdGhhdCBzb2Z0d2FyZSwgZmluYWwgQ0REcyB3aWxsIGFsd2F5cyBiZSByZWxlYXNlZCBhZnRlciB0aGUgZmlyc3QgZGV2aWNlLgorICBIb3dldmVyLCB3aGVyZXZlciBwcmFjdGljYWwgd2Ugd2lsbCBtYWtlIGRyYWZ0IHZlcnNpb25zIG9mIENERHMgYXZhaWxhYmxlLjwvcD4KIAogPGgzPkhvdyBhcmUgZGV2aWNlIG1hbnVmYWN0dXJlcnMnIGNvbXBhdGliaWxpdHkgY2xhaW1zIHZhbGlkYXRlZD88L2gzPgogPHA+VGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBwcm9jZXNzIGZvciBBbmRyb2lkIGRldmljZSBjb21wYXRpYmlsaXR5LiBIb3dldmVyLApkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvaW1hZ2VzL2NvZGUtbGluZXMucG5nIGIvcGRrL2RvY3MvaW1hZ2VzL2NvZGUtbGluZXMucG5nCmluZGV4IGFjZmI3N2IuLmY4NjI2MGMgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2ltYWdlcy9jb2RlLWxpbmVzLnBuZworKysgYi9wZGsvZG9jcy9pbWFnZXMvY29kZS1saW5lcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvaW5kZXguamQgYi9wZGsvZG9jcy9pbmRleC5qZAppbmRleCAyMTc4NzdkLi40Nzg2ZWQ1IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9pbmRleC5qZAorKysgYi9wZGsvZG9jcy9pbmRleC5qZApAQCAtMSw3ICsxLDIyIEBACiBwYWdlLnRpdGxlPVdlbGNvbWUgdG8gQW5kcm9pZAogaG9tZT10cnVlCiBAamQ6Ym9keQotPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0NSU7IGZvbnQtc2l6ZTogMS4zZW07Ij4KKzxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgd2lkdGg6IDM1JTsiPgorPGgzIHN0eWxlPSJwYWRkaW5nLXRvcDogMHB4OyI+TmV3czwvaDM+Cis8cD48Yj5Db21wYXRpYmlsaXR5IFRvb2xzIGZvciBBbmRyb2lkIDIuMjwvYj48YnIvPgorVGhlIGNvbXBhdGliaWxpdHkgdG9vbHMgZm9yIEFuZHJvaWQgMi4yIGhhdmUgYmVlbiBwdWJsaXNoZWQuIFRoaXMgaW5jbHVkZXMgdGhlCitDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgZm9yIEFuZHJvaWQgMi4yLCBhbmQgdGhlIENvbXBhdGliaWxpdHkgVGVzdAorU3VpdGUgdmVyc2lvbiAyLjIgcjEuIFdpdGggdGhlc2UgdG9vbHMsIGRldmljZSBtYW51ZmFjdHVyZXJzIGNhbiBmaW5hbGl6ZQorYnVpbGRzIG9mIEFuZHJvaWQgMi4yIGZvciBuZXcgYW5kIGV4aXN0aW5nIGRldmljZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLAorPGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCI+dmlzaXQgdGhlIENvbXBhdGliaWxpdHkgcGFnZS48L2E+Cis8L3A+Cis8cD48Yj5JbnRyb2R1Y2luZyB0aGUgQ29tcGF0aWJpbGl0eSBQcm9ncmFtPC9iPjxici8+CitXZSdyZSBwbGVhc2VkIHRvIGludHJvZHVjZSB0aGUgQW5kcm9pZCBDb21wYXRpYmlsaXR5IFByb2dyYW0uIFdlJ3ZlIHJlbGVhc2VkCit0d28gdG9vbHMgLS0gdGhlIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCBhbmQgdGhlIENvbXBhdGliaWxpdHkgVGVzdAorU3VpdGUgLS0gdG8gaGVscCBkZXZpY2UgbWFudWZhY3R1cmVycyBidWlsZCBjb21wYXRpYmxlIGRldmljZXMuPC9wPgorPC9kaXY+Cis8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IHBhZGRpbmctcmlnaHQ6IDEuNWVtOyIgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2hvbWUtYnVnZHJvaWQucG5nIiBhbHQ9IkFuZHJvaWQgTWFzY290Ii8+Cis8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEuM2VtOyI+CiAgIDxwPkhlcmUgeW91IGNhbiBmaW5kIHRoZSBpbmZvcm1hdGlvbiBhbmQgc291cmNlIGNvZGUgeW91IG5lZWQgdG8gYnVpbGQgYW4KICAgQW5kcm9pZC1jb21wYXRpYmxlIGRldmljZS48L3A+CiAgIDxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgZm9yIG1vYmlsZSBkZXZpY2VzLCBhbmQgYQpAQCAtMTIsNTEgKzI3LDQwIEBACiAgIGNyZWF0ZWQgQW5kcm9pZCwgYW5kIG1hZGUgaXRzIHNvdXJjZSBjb2RlIG9wZW4uPC9wPgogICA8cD48YSBocmVmPSJ7QGRvY1Jvb3R9YWJvdXQvaW5kZXguaHRtbCI+TGVhcm4gbW9yZSAmcmFxdW87PC9hPjwvcD4KIDwvZGl2PgotPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyB3aWR0aDogMzUlOyI+Ci08aDMgc3R5bGU9InBhZGRpbmctdG9wOiAwcHg7Ij5OZXdzPC9oMz4KLTxwPjxiPlNpdGUgcmVkZXNpZ248L2I+PGJyLz4KLVlvdSdyZSBsb29raW5nIGF0IHRoZSBuZXcgYW5kIGltcHJvdmVkIHNvdXJjZS5hbmRyb2lkLmNvbSEgV2UndmUgdXBkYXRlZAotdGhlIGxheW91dCBhbmQgc2l0ZSBkZXNpZ24sIGFuZCBhbHNvIGFkZGVkIG5ldyBpbmZvcm1hdGlvbi4gV2UgaG9wZSB5b3UgZmluZAotdGhlc2UgaW1wcm92ZW1lbnRzIGhlbHBmdWwuPC9wPgotPHA+PGI+SW50cm9kdWNpbmcgdGhlIENvbXBhdGliaWxpdHkgUHJvZ3JhbTwvYj48YnIvPgotV2UncmUgcGxlYXNlZCB0byBpbnRyb2R1Y2UgdGhlIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBQcm9ncmFtLiBXZSd2ZSByZWxlYXNlZAotdHdvIHRvb2xzIC0tIHRoZSBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgYW5kIHRoZSBDb21wYXRpYmlsaXR5IFRlc3QKLVN1aXRlIC0tIHRvIGhlbHAgZGV2aWNlIG1hbnVmYWN0dXJlcnMgYnVpbGQgY29tcGF0aWJsZSBkZXZpY2VzLiBGdWxsIGRldGFpbHMKLW9mIHRoZSBDb21wYXRpYmlsaXR5IFByb2dyYW0gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAxMC48L3A+Ci08L2Rpdj4KLTxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgcGFkZGluZy1yaWdodDogMS41ZW07IiBzcmM9IntAZG9jUm9vdH1pbWFnZXMvaG9tZS1idWdkcm9pZC5wbmciIGFsdD0iQW5kcm9pZCBNYXNjb3QiLz4KIAogPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7Ii8+CiAKIDx0YWJsZSBib3JkZXI9IjAiIHN0eWxlPSJib3JkZXI6IDBweDsgbWFyZ2luOiAwcHg7IHBhZGRpbmc6IDBweDsiPjx0cj48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJvcmRlcjogMHB4OyBtYXJnaW46IDBweDsgcGFkZGluZzogMHB4OyI+CiA8ZGl2IGNsYXNzPSJyZWJveCBsaWwiIHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDMwJTsgbWFyZ2luOiAxZW07Ij4gCi0gIDxoMiBzdHlsZT0iY29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVDMEQwOyBib3JkZXI6IDBweDsiPkdldCBJbnZvbHZlZDwvaDI+IAorICA8aDIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIzk1QzBEMDsgYm9yZGVyOiAwcHg7Ij5Tb3VyY2U8L2gyPiAKICAgPGRpdiBjbGFzcz0icCI+IAotICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGlsLXdyZW5jaC5wbmciIGFsdD0iIiBzdHlsZT0ibWFyZ2luOiAxZW07Ii8+CisgICAgPHA+PGltZyBzcmM9ImltYWdlcy9saWwtd3JlbmNoLnBuZyIgYWx0PSIiIHN0eWxlPSJtYXJnaW46IDFlbTsgbWFyZ2luLWJvdHRvbTogNWVtOyIvPgogICAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byB0aGUgQW5kcm9pZCBzb3VyY2UgY29kZSBvciBoZWxwaW5nCi0gICAgb3V0IHdpdGggdGhlIHByb2plY3QgaW4gc29tZSBvdGhlciB3YXksIGNsaWNrIGhlcmUuPC9wPiAKLSAgICA8cD48YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2luZGV4Lmh0bWwiPk1vcmUgJnJhcXVvOzwvYT48L3A+IAorICAgIG91dCB3aXRoIHRoZSBvcGVuLXNvdXJjZSBwcm9qZWN0LCBvdXIgU291cmNlIHBhZ2VzIGhhdmUgdGhlIGluZm9ybWF0aW9uCisgICAgeW91IG5lZWQuPC9wPiAKKyAgICA8cD48YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2luZGV4Lmh0bWwiPkdldCBJbnZvbHZlZCAmcmFxdW87PC9hPjwvcD4gCiAgIDwvZGl2PiAKIDwvZGl2PiAKIAogPGRpdiBjbGFzcz0icmVib3ggbGlsIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAzMCU7IG1hcmdpbjogMWVtOyI+IAotICA8aDIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIzk1QzBEMDsgYm9yZGVyOiAwcHg7Ij5CdWlsZCBhIERldmljZTwvaDI+IAorICA8aDIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIzk1QzBEMDsgYm9yZGVyOiAwcHg7Ij5Qb3J0aW5nPC9oMj4gCiAgIDxkaXYgY2xhc3M9InAiPiAKLSAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xpbC13cmVuY2gucG5nIiBhbHQ9IiIgc3R5bGU9Im1hcmdpbjogMWVtOyIvPgotICAgIElmIHlvdSdyZSBhbiBlbmdpbmVlciBidWlsZGluZyBhIGRldmljZSBpbnRlbmRlZCB0byBydW4gdGhlIEFuZHJvaWQKLSAgICBzb2Z0d2FyZSBzdGFjaywgY2xpY2sgaGVyZSB0byBmaW5kIHBvcnRpbmcgaW5mb3JtYXRpb24gYW5kIHRpcHMuPC9wPiAKLSAgICA8cD48YSBocmVmPSJ7QGRvY1Jvb3R9cG9ydGluZy9pbmRleC5odG1sIj5Nb3JlICZyYXF1bzs8L2E+PC9wPiAKKyAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xpbC13cmVuY2gucG5nIiBhbHQ9IiIgc3R5bGU9Im1hcmdpbjogMWVtOyBtYXJnaW4tYm90dG9tOiA1ZW07Ii8+CisgICAgSWYgeW91J3JlIGFuIGVuZ2luZWVyIGJ1aWxkaW5nIGEgZGV2aWNlCisgICAgaW50ZW5kZWQgdG8gcnVuIHRoZSBBbmRyb2lkIHNvZnR3YXJlIHN0YWNrLCBsb29rIGF0IG91ciBQb3J0aW5nIHBhZ2VzIGZvcgorICAgIGluZm9ybWF0aW9uIGFuZCB0aXBzLjwvcD4gCisgICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fXBvcnRpbmcvaW5kZXguaHRtbCI+QnVpbGQgYSBEZXZpY2UgJnJhcXVvOzwvYT48L3A+IAogICA8L2Rpdj4gCiA8L2Rpdj4gCiAKIDxkaXYgY2xhc3M9InJlYm94IGxpbCIgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMzAlOyBtYXJnaW46IDFlbTsiPiAKICAgPGgyIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICM5NUMwRDA7IGJvcmRlcjogMHB4OyI+Q29tcGF0aWJpbGl0eTwvaDI+IAogICA8ZGl2IGNsYXNzPSJwIj4gCi0gICAgPHA+PGltZyBzcmM9ImltYWdlcy9saWwtd3JlbmNoLnBuZyIgYWx0PSIiIHN0eWxlPSJtYXJnaW46IDFlbTsiLz4KLSAgICBJZiB5b3UncmUgYW4gT0VNIG9yIG90aGVyIG9yZ2FuaXphdGlvbiBidWlsZGluZyBhbiBBbmRyb2lkIGRldmljZSwgY2xpY2sKLSAgICBoZXJlIHRvIGZpbmQgb3V0IGhvdyB0byBlbnN1cmUgdGhhdCB5b3VyIGRldmljZSBpcyBmdWxseSBjb21wYXRpYmxlLCBhbmQKLSAgICBob3cgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGJlbmVmaXRzIG9mIGNvbXBhdGliaWxpdHkuPC9wPiAKLSAgICA8cD48YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9pbmRleC5odG1sIj5Nb3JlICZyYXF1bzs8L2E+PC9wPiAKKyAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xpbC13cmVuY2gucG5nIiBhbHQ9IiIgc3R5bGU9Im1hcmdpbjogMWVtOyBtYXJnaW4tYm90dG9tOiA1ZW07Ii8+CisgICAgSWYgeW91J3JlIGFuIG9yZ2FuaXphdGlvbiBidWlsZGluZyBhbiBBbmRyb2lkIGRldmljZSwgeW91J2xsIHdhbnQgdG8gY2hlY2sgb3V0IG91cgorICAgIENvbXBhdGliaWxpdHkgcGFnZXMgdG8gZmluZCBvdXQgaG93IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBiZW5lZml0cyBvZgorICAgIGNvbXBhdGliaWxpdHkuPC9wPiAKKyAgICA8cD48YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9pbmRleC5odG1sIj5HZXQgQ29tcGF0aWJsZSAmcmFxdW87PC9hPjwvcD4gCiAgIDwvZGl2PiAKIDwvZGl2PiAKIDwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvcG9ydGluZy9ibHVldG9vdGguamQgYi9wZGsvZG9jcy9wb3J0aW5nL2JsdWV0b290aC5qZAppbmRleCBjZWI4NjgzLi5jNzkyYmQyIDEwMDc1NQotLS0gYS9wZGsvZG9jcy9wb3J0aW5nL2JsdWV0b290aC5qZAorKysgYi9wZGsvZG9jcy9wb3J0aW5nL2JsdWV0b290aC5qZApAQCAtMTcsNyArMTcsOCBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPHA+QW5kcm9pZCdzIEJsdWV0b290aCBzdGFjayB1c2VzIEJsdWVaIHZlcnNpb24gMy4zNiBmb3IgR0FQLCBTRFAsIGFuZCBSRkNPTU0gcHJvZmlsZXMsIGFuZCBpcyBhIFNJRy1xdWFsaWZpZWQgQmx1ZXRvb3RoIDIuMCArIEVEUiBob3N0IHN0YWNrLjwvcD4KKzxwPkFuZHJvaWQncyBCbHVldG9vdGggc3RhY2sgdXNlcyBCbHVlWiBmb3IgR0FQLCBTRFAsIGFuZCBSRkNPTU0gcHJvZmlsZXMsIGFuZAoraXMgYSBTSUctcXVhbGlmaWVkIEJsdWV0b290aCBzdGFjay4gPC9wPgogCiA8cD5CbHVleiBpcyBHUEwgbGljZW5zZWQsIHNvIHRoZSBBbmRyb2lkIGZyYW1ld29yayBpbnRlcmFjdHMgd2l0aCB1c2Vyc3BhY2UgYmx1ZXogY29kZSB0aHJvdWdoIEQtQlVTIElQQyB0byBhdm9pZCBwcm9wcmlldGFyeSBjb2RlLjwvcD4KIApAQCAtMzMsNyArMzQsNyBAQAogCiA8YSBuYW1lPSJhbmRyb2lkQmx1ZXRvb3RoUG9ydGluZyI+PC9hPjxoMz5Qb3J0aW5nPC9oMz4KIAotPHA+Qmx1ZVogaXMgQmx1ZXRvb3RoIDIuMCBjb21wYXRpYmxlIGFuZCBzaG91bGQgd29yayB3aXRoIGFueSAyLjAgY2hpcHNldC4gVGhlcmUgYXJlIHR3byBpbnRlZ3JhdGlvbiBwb2ludHM6PC9wPgorPHA+Qmx1ZVogaXMgQmx1ZXRvb3RoIDIuMSBjb21wYXRpYmxlIGFuZCBzaG91bGQgd29yayB3aXRoIGFueSAyLjEgY2hpcHNldCBhbmQgaXMgYmFja3dhcmQgY29tcGF0aWJpbGUgd2l0aCBvbGRlciBCbHVldG9vdGggdmVyc2lvbnMuIFRoZXJlIGFyZSB0d28gaW50ZWdyYXRpb24gcG9pbnRzOjwvcD4KIDxwPjx1bD4KIDxsaT5VQVJUIGRyaXZlcjwvbGk+CiA8bGk+Qmx1ZXRvb3RoIFBvd2VyIE9uIC8gT2ZmPC9saT4KQEAgLTY3LDcgKzY4LDcgQEAKIAogPGEgbmFtZT0iYW5kcm9pZEJsdWV0b290aFRyb3VibGVzaG9vdGluZyI+PC9hPjxoMz5Ucm91Ymxlc2hvb3Rpbmc8L2gzPgogPHA+PHN0cm9uZz5EZWJ1Z2dpbmc8L3N0cm9uZz48L3A+Ci08cD5UbyBkZWJ1ZyB5b3VyIGJsdWV0b290aCBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgYnkgcmVhZGluZyB0aGUgbG9ncyAoPGNvZGU+YWRiIGxvZ2NhdDwvY29kZT4pIGFuZCBsb29rIGZvciBFUlJST1IgYW5kIFdBUk5JTkcgbWVzc2FnZXMgcmVnYXJkaW5nIEJsdWV0b290aC4gCis8cD5UbyBkZWJ1ZyB5b3VyIGJsdWV0b290aCBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgYnkgcmVhZGluZyB0aGUgbG9ncyAoPGNvZGU+YWRiIGxvZ2NhdDwvY29kZT4pIGFuZCBsb29rIGZvciBFUlJST1IgYW5kIFdBUk5JTkcgbWVzc2FnZXMgcmVnYXJkaW5nIEJsdWV0b290aC4KICAgQW5kb2lyZCB1c2VzIEJsdWV6LCB3aGljaCBjb21lcyB3aXRoIHNvbWUgdXNlZnVsIGRlYnVnZ2luZyB0b29scy4gVGhlIHNuaXBwZXQgYmVsb3cgcHJvdmlkZXMgZXhhbXBsZXMgaW4gYSBzdWdnZXN0ZWQgb3JkZXI6PC9wPgogPHByZT4KIGhjaWNvbmZpZyAtYSAgCQkJIyBwcmludCBCVCBjaGlwc2V0IGFkZHJlc3MgYW5kIGZlYXR1cmVzLiBVc2VmdWwgdG8gY2hlY2sgaWYgeW91IGNhbiBjb21tdW5pY2F0ZSB3aXRoIHlvdXIgQlQgY2hpcHNldC4KQEAgLTE1OCwxNCArMTU5LDc5IEBACiAgIDxsaT5RRElEIEIwMTUyNjE6IEhvc3Qgc3RhY2sgKFNEUCwgTDJDQVAsIEdBUCwgUkZDT01NLCBTUFAsIEFWQ1RQLCBBVlJDUCwgR0FWRFAsIEFWRFRQLCBBMkRQKTwvbGk+CiAgIDxsaT5RRElEIEIwMTUyNjI6IEVQTCBmb3IgSFRDIFNhcHBoaXJlIChIU1AsIEhGUCk8L2xpPgogPC91bD4KKzxoND5BbmRyb2lkIDIuMC8yLjEgcmVsZWFzZSAoZWNsYWlyKTwvaDQ+Cis8aDQ+UGxhdGZvcm0gZmVhdHVyZXM8L2g0PgorPHVsPgorICA8bGk+QmFzZWQgb24gQmx1ZXogNC40NyB3aXRoIExpbnV4IEtlcm5lbCAyLjYuMjk8L2xpPgorICA8bGk+Qmx1ZXRvb3RoIDIuMStFRFIgaG9zdCBzdGFjazwvbGk+CisgIDx1bD4KKyAgICA8bGk+U3VwcG9ydCBmb3IgYXV0by1wYWlyaW5nIHdpdGggJzAwMDAnIGRldmljZXM8L2xpPgorICAgIDxsaT5TdXBwb3J0IGZvciBTaW1wbGUgU2VjdXJlIFBhaXJpbmc8L2xpPgorICA8L3VsPgorICA8bGk+SGVhZHNldCBQcm9maWxlIDEuMSBpbiBBdWRpbyBHYXRld2F5IHJvbGU8L2xpPgorICA8bGk+SGFuZHNmcmVlIFByb2ZpbGUgMS41IGluIEF1ZGlvIEdhdGV3YXkgcm9sZTwvbGk+CisgIDx1bD4KKyAgICA8bGk+VGhyZWUtd2F5IGNhbGxpbmcgICAgPC9saT4KKyAgICA8bGk+UGhvbmVib29rIG92ZXIgQVQgY29tbWFuZHMgICAgPC9saT4KKyAgICA8bGk+Vm9sdW1lIHN5bmNocm9uaXphdGlvbjwvbGk+CisgICAgPGxpPmVTQ088L2xpPgorICAgIDxsaT5FeHRlbnNpdmUgYnVnIGZpeGVzIGFuZCBjb21wYXRpYmlsaXR5IGltcHJvdmVtZW50czwvbGk+CisgIDwvdWw+CisgIDxsaT5TdGVyZW8gQmx1ZXRvb3RoIChBMkRQIDEuMikgaW4gU291cmNlIHJvbGU8L2xpPgorICA8dWw+CisgICAgPGxpPkFWRFRQIDEuMiBpbiBBY2NlcHRvciBhbmQgSW5pdGlhdG9yIHJvbGVzPC9saT4KKyAgICA8bGk+R0FWRFRQIDEuMCBpbiBBY2NlcHRvciBhbmQgSW5pdGlhdG9yIHJvbGVzPC9saT4KKyAgICA8bGk+NDQuMSBraHosIHN0ZXJlbywgc29mdHdhcmUgU0JDIGNvZGVjPC9saT4KKyAgPC91bD4KKyAgPGxpPlJlbW90ZSBDb250cm9sIChBVlJDUCAxLjApIGluIFRhcmdldCByb2xlPC9saT4KKyAgPHVsPgorICAgIDxsaT5BVkNUUCAxLjMgaW4gVGFyZ2V0IHJvbGU8L2xpPgorICAgIDxsaT5wbGF5L3BhdXNlL3N0b3AvcHJldi9uZXh0PC9saT4KKyAgPC91bD4KKyAgPGxpPiBPYmplY3QgUHVzaCBQcm9maWxlIHZlcnNpb24gMS4xIDwvbGk+CisgIDx1bD4KKyAgICAgPGxpPkFkZHMgYWJpbGl0eSB0byB0cmFuc2ZlciBwaWN0dXJlcywgdmlkZW9zPC9saT4KKyAgICAgPGxpPlRyYW5zZmVyIG9mIGNvbnRhY3RzIHVzaW5nIHZDYXJkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyByZWxlYXNlLjwvbGk+CisgIDwvdWw+CisgIDxsaT5QaG9uZSBCb29rIEFkZHJlc3MgUHJvZmlsZSB2ZXJzaW9uIDEuMDwvbGk+CisgIDx1bD4KKyAgICA8bGk+UGhvbmUgQm9vayBTZXJ2ZXIgRXF1aXBtZW50IChQU0UpIHJvbGUgc3VwcG9ydGVkPC9saT4KKyAgPC91bD4KKyAgPGxpPlVzaW5nIEphdmEgQmx1ZXRvb3RoIEFQSXMsIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gY2FuIHBlZm9ybSB0aGUKKyAgZm9sbG93aW5nOjwvbGk+CisgIDx1bD4KKyAgIDxsaT5TY2FuIGZvciBvdGhlciBCbHVldG9vdGggZGV2aWNlcyA8L2xpPgorICAgPGxpPlF1ZXJ5IHRoZSBsb2NhbCBCbHVldG9vdGggYWRhcHRlciBmb3IgcGFpcmVkIEJsdWV0b290aCBkZXZpY2VzIDwvbGk+CisgICA8bGk+RXN0YWJsaXNoIFJGQ09NTSBjaGFubmVscyA8L2xpPgorICAgPGxpPkNvbm5lY3QgdG8gb3RoZXIgZGV2aWNlcyB0aHJvdWdoIHNlcnZpY2UgZGlzY292ZXJ5IDwvbGk+CisgICA8bGk+VHJhbnNmZXIgZGF0YSB0byBhbmQgZnJvbSBvdGhlciBkZXZpY2VzIDwvbGk+CisgICA8bGk+TWFuYWdlIG11bHRpcGxlIGNvbm5lY3Rpb25zIDwvbGk+CisgIDwvdWw+CisgIDxsaT5TdXBwb3J0IGZvciBCbHVldG9vdGggZW5hYmxlZCBjYXIgYW5kIGRlc2sgZG9ja3M8L2xpPgorICA8dWw+CisgICA8bGk+RnJhbWV3b3JrIHN1cHBvcnQgZm9yIHJvdXRpbmcgUGhvbmUgQ2FsbCBBdWRpbyBhbmQgQTJEUCBzdHJlYW1pbmcgdXNpbmcKKyAgIGNhciBhbmQgZGVzayBkb2Nrcy4gPC9saT4KKyAgPC91bD4KKzwvdWw+CisKKzxoND5BbmRyb2lkIDIuMiAgcmVsZWFzZSAoRnJveW8pPC9oND4KKzxoND5QbGF0Zm9ybSBmZWF0dXJlczwvaDQ+Cis8dWw+CisgIDxsaT5CYXNlZCBvbiBCbHVleiA0LjQ3IHdpdGggTGludXggS2VybmVsIDIuNi4zMjwvbGk+CisgIDxsaT5ObyBuZXcgcHJvZmlsZXMgYWRkZWQuPC9saT4KKyAgPGxpPkFkZGVkIGFiaWxpdHkgdG8gc2hhcmUgY29udGFjdHMgdXNpbmcgdkNhcmQ8L2xpPgorICA8bGk+QWRkZWQgYWJpbGl0eSB0byBleHBvcnQgYWxsIGNvbnRhY3RzIC0gdXNlZnVsIHRvIHRyYW5zZmVyIGNvbnRhY3RzIHRvIGNhciBraXRzIDwvbGk+CisgIDxsaT5JbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggaGVhZHNldHMgYW5kIGNhciBraXRzLiA8L2xpPgorPC91bD4KKwogPGg1PiZuYnNwOzwvaDU+CiA8aDQ+RnV0dXJlIHJlbGVhc2VzPC9oND4KIDxwPlRoaXMgc2VjdGlvbiBvZmZlcnMgYSByb3VnaCBndWlkZSBvZiB3aGljaCBmZWF0dXJlcyB0aGUgdGVhbSBpcyBkZXZlbG9waW5nIGZvciB0aGUgbmV4dCByZWxlYXNlLiBUaGlzIGZlYXR1cmUgbGlzdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLiBJdCBpc24ndCBwb3NzaWJsZSB0byBwb3N0IHNjaGVkdWxpbmcgYWR2aWNlIHRvIHRoZSBtYWlsaW5nIGxpc3RzLjwvcD4KIDx1bD4KLSAgPGxpPkphdmEgQmx1ZXRvb3RoIEFQSTwvbGk+Ci0gIDxsaT5CbHVleiA0Lnggd2l0aCBMaW51eCBLZXJuZWwgMi42LjI5PC9saT4KICAgPGxpPk1vcmUgcHJvZmlsZXMuLi48L2xpPgotICA8bGk+Qmx1ZXRvb3RoIDIuMStFRFI8L2xpPgorICA8bGk+SW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIGhlYWRzZXRzIGFuZCBjYXIga2l0czwvbGk+CisgIDxsaT5CbHVldG9vdGggZW11bGF0b3Igc3VwcG9ydDwvbGk+CisgIDxsaT5CbHVldG9vdGggTG93IEVuZXJneSA8L2xpPgogPC91bD4KIAogPHA+PHN0cm9uZz5EZXZlbG9wbWVudCBOb3Rlczwvc3Ryb25nPjwvcD4KQEAgLTE4NCwxMCArMjUwLDQgQEAKIFdoaWxlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZCwgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biA8Y29kZT5kdW5kPC9jb2RlPiBvciA8Y29kZT5wYW5kPC9jb2RlPiBkYWVtb25zIGFuZCwgdXNpbmcgPGNvZGU+cHBwZDwvY29kZT4gb3IgPGNvZGU+aXB0YWJsZXM8L2NvZGU+LCB0ZXN0IHRldGhlcmluZyBzdXBwb3J0LiBOZXh0IHN0ZXBzIGluY2x1ZGUgcGx1Ym1pbmcgdGhlIERCVVMgQVBJcyB0byB0aGVzZSBkYWVtb25zIHVwIGludG8gdGhlIEFuZHJvaWQgSmF2YSBmcmFtZXdvcmsgYW5kIGFkZGluZyBjb2RlIHRvIHNldHVwIHRoZSBuZXR3b3JrIHBhdGhzIHZpYSA8Y29kZT5wcHBkPC9jb2RlPiBhbmQgLyBvciA8Y29kZT5pcHRhYmxlczwvY29kZT4uPGJyIC8+CiAgIDxiciAvPgogICA8L2xpPgotICA8bGk+PHN0cm9uZz5FbXVsYXRvciBTdXBwb3J0PC9zdHJvbmc+PGJyIC8+Ci0gIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGRvZXMgbm90IHN1cHBvcnQgQmx1ZXRvb3RoIGF0IHRoaXMgdGltZSBhbmQgdGhlcmUgY3VycmVudGx5IGFyZW4ndCBhbnkgcGxhbnMgZm9yIGl0cyBzdXBwb3J0LjxiciAvPgotICAgIDxiciAvPgotICA8L2xpPgotICA8bGk+PHN0cm9uZz5CbHVldG9vdGggMi4xIGFuZCBTaW1wbGUgUGFpcmluZyBTdXBwb3J0PC9zdHJvbmc+PGJyIC8+Ci0gIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhlc2UgZmVhdHVyZXMsIEFuZHJvaWQgbmVlZHMgdG8gbW92ZSB0byBhIEJsdWV6IDQueCB2ZXJzaW9uLiBUaGlzIGNoYW5nZSBpcyBub3Qgc2NoZWR1bGVkIGF0IHRoaXMgdGltZS48L2xpPgogPC91bD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3BvcnRpbmcvaW5zdHJ1bWVudGF0aW9uX3Rlc3RpbmcuamQgYi9wZGsvZG9jcy9wb3J0aW5nL2luc3RydW1lbnRhdGlvbl90ZXN0aW5nLmpkCmluZGV4IGMzNzY1ZjQuLjA0NTI5MWYgMTAwNzU1Ci0tLSBhL3Bkay9kb2NzL3BvcnRpbmcvaW5zdHJ1bWVudGF0aW9uX3Rlc3RpbmcuamQKKysrIGIvcGRrL2RvY3MvcG9ydGluZy9pbnN0cnVtZW50YXRpb25fdGVzdGluZy5qZApAQCAtMzM1LDcgKzMzNSw3IEBACiA8cHJlIGNsYXNzPSJwcmV0dGlmeSI+CiBwdWJsaWMgY2xhc3MgRnJhbWV3b3JrSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgewogCi0gICAgQE92ZXJyaWRlCisgICAgJiM2NDtPdmVycmlkZQogICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CiAgICAgICAgIEluc3RydW1lbnRhdGlvblRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CiAKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgICAgICByZXR1cm4gc3VpdGU7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCisgICAgJiM2NDtPdmVycmlkZQogICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7CiAgICAgICAgIHJldHVybiBGcmFtZXdvcmtJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CiAgICAgfQpAQCAtMzczLDcgKzM3Myw3IEBACiAgICAgICAgIHN1cGVyKCJjb20uZXhhbXBsZSIsIE15QWN0aXZpdHkuY2xhc3MpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQorICAgICYjNjQ7T3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgIG1MZWZ0QnV0dG9uID0gKEJ1dHRvbikgZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5sZWZ0QnV0dG9uKTsKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9idWlsZGluZy1kcmVhbS5qZCBiL3Bkay9kb2NzL3NvdXJjZS9idWlsZGluZy1kcmVhbS5qZAppbmRleCA4OTM5MmZkLi5kMTMwNTI0IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvYnVpbGRpbmctZHJlYW0uamQKKysrIGIvcGRrL2RvY3Mvc291cmNlL2J1aWxkaW5nLWRyZWFtLmpkCkBAIC0zLDEwICszLDEwIEBACiBAamQ6Ym9keQogPHA+PGk+VGhlIGluZm9ybWF0aW9uIG9uIHRoaXMgcGFnZSBpcyBhIGJpdCBvdXQgb2YgZGF0ZS4gV2UnbGwgdXBkYXRlIHRoaXMKIHBhZ2UgYXMgc29vbiBhcyB3ZSBjYW4uPC9pPjwvcD4KLTxkaXY+VGhlIGJhc2ljIG1hbmlmZXN0IGZvciBjdXBjYWtlIChhbmQgYWJvdmUpIGRlZmluZXMgd2hpY2ggcHJvamVjdHMgYXJlCis8ZGl2PlRoZSBiYXNpYyBtYW5pZmVzdCBmb3IgMS42IGRlZmluZXMgd2hpY2ggcHJvamVjdHMgYXJlCiBuZWVkZWQgdG8gZG8gYSBnZW5lcmljIGJ1aWxkIGZvciB0aGUgZW11bGF0b3Igb3IgZm9yIHVubG9ja2VkIERyZWFtIGRldmljZXMKIChlLmcuIHRoZSBBbmRyb2lkIERldiBQaG9uZSAxKS4gWW91IG5lZWQgdG8gaGF2ZSBhbiBhcHByb3ByaWF0ZSBkZXZpY2UgcnVubmluZwotYSBtYXRjaGluZyBvZmZpY2lhbCBpbWFnZS48YnI+PGJyPlRvIGJ1aWxkIGRvbnV0IG9yIG1hc3RlciBmb3IgZHJlYW0gKHlvdXIKK2EgbWF0Y2hpbmcgb2ZmaWNpYWwgaW1hZ2UuPGJyPjxicj5UbyBidWlsZCBkb251dCBmb3IgZHJlYW0gKHlvdXIKIGRldmljZSBuZWVkcyB0byBiZSBhbiBBRFAxIHJ1bm5pbmcgYW4gb2ZmaWNpYWwgMS42IHN5c3RlbSk6PGJyPjxvbD48bGk+Rm9sbG93CiB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9kb3dubG9hZC5odG1sIj5ub3JtYWwgc3RlcHM8L2E+CiB0byBzZXR1cCByZXBvIGFuZCBjaGVjayBvdXQgdGhlIHNvdXJjZXMuCkBAIC0yMiwxNyArMjIsNiBAQAogPC9saT4KIDxsaT5mcm9tIHRoaXMgcG9pbnQsIHRoZSBmYXN0Ym9vdCB0b29sICh3aGljaCBpcyBwdXQgYXV0b21hdGljYWxseSBpbiB5b3VyIHBhdGgpIGNhbiBiZSB1c2VkIHRvIGZsYXNoIGEgZGV2aWNlOiBib290IHRoZSBkZXZpY2UgaW50byB0aGUgYm9vdGxvYWRlciBieSBob2xkaW5nIHRoZSBiYWNrIGtleSB3aGlsZSBwcmVzc2luZyB0aGUgcG93ZXIga2V5LCBhbmQgcnVuICJmYXN0Ym9vdCAtdyBmbGFzaGFsbCIuPGJyPjwvbGk+CiA8L29sPgotVG8gYnVpbGQgY3VwY2FrZSBmb3IgZHJlYW0gKHlvdXIgZGV2aWNlIG5lZWRzIHRvIGJlIGFuIEFEUDEgcnVubmluZyBhbiBvZmZpY2lhbCAxLjUgc3lzdGVtKTo8YnI+PG9sPjxsaT5Gb2xsb3cgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvZG93bmxvYWQuaHRtbCI+bm9ybWFsIHN0ZXBzPC9hPgotdG8gc2V0dXAgcmVwbyBhbmQgY2hlY2sgb3V0IHRoZSBzb3VyY2VzLgotPC9saT4KLTxsaT5BdCB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSB0cmVlLCBydW4gIi4gYnVpbGQvZW52c2V0dXAuc2giIGxpa2UgeW91IG5vcm1hbGx5IHdvdWxkIGZvciBhbiBlbXVsYXRvciBidWlsZC4KLTwvbGk+Ci08bGk+UnVuICJtYWtlIGFkYiIgaWYgeW91IGRvbid0IGFscmVhZHkgaGF2ZSBhZGIgaW4geW91ciBwYXRoLjxicj48L2xpPgotPGxpPmluIHZlbmRvci9odGMvZHJlYW0tb3Blbi8gdGhlcmUgaXMgYSBzY3JpcHQgY2FsbGVkICJleHRyYWN0LWZpbGVzLnNoIiB0aGF0IG11c3QgYmUgcnVuIChmcm9tIHRoYXQgZGlyZWN0b3J5KSB0byBleHRyYWN0IHNvbWUgcHJvcHJpZXRhcnkgYmluYXJpZXMgZnJvbSB5b3VyIGRldmljZSAoKikuIFlvdSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlLjxicj48L2xpPgotPGxpPnJ1biAibHVuY2ggaHRjX2RyZWFtLWVuZyIgdG8gc3BlY2lmaWNhbGx5IGNvbmZpZ3VyZSB0aGUgYnVpbGQgc3lzdGVtIGZvciBkcmVhbSAodGhlIGRlZmF1bHQgaXMgdGhlIGVxdWl2YWxlbnQgb2YgImx1bmNoIGdlbmVyaWMtZW5nIiwgd2hpY2ggZG9lc24ndCBjb250YWluIGRyZWFtLXNwZWNpZmljIGZpbGVzKS48YnI+PC9saT4KLTxsaT5ydW4gbWFrZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlLgotPC9saT4KLTxsaT5mcm9tIHRoaXMgcG9pbnQsIHRoZSBmYXN0Ym9vdCB0b29sICh3aGljaCBpcyBwdXQgYXV0b21hdGljYWxseSBpbiB5b3VyIHBhdGgpIGNhbiBiZSB1c2VkIHRvIGZsYXNoIGEgZGV2aWNlOiBib290IHRoZSBkZXZpY2UgaW50byB0aGUgYm9vdGxvYWRlciBieSBob2xkaW5nIHRoZSBiYWNrIGtleSB3aGlsZSBwcmVzc2luZyB0aGUgcG93ZXIga2V5LCBhbmQgcnVuICJmYXN0Ym9vdCAtdyBmbGFzaGFsbCIuPGJyPjwvbGk+Ci08L29sPgotKiBUaGUgRHJlYW0gZGV2aWNlIHNvZnR3YXJlIGNvbnRhaW5zIHNvbWUgcHJvcHJpZXRhcnkgYmluYXJpZXMuRm9yIGNvbnRyYWN0dWFsIHJlYXNvbnMsIHRoZXNlIGNhbm5vdCBiZSByZWRpc3RyaWJ1dGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgd2l0aCB0aGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0LCBidXQgdGhlIHByb3ZpZGVkIHNjcmlwdCBtYXkgYmUgdXNlZCB0byBleHRyYWN0IHRoZXNlIGJpbmFyaWVzIGZyb20geW91ciBkZXZlbG9wbWVudCBkZXZpY2Ugc28gdGhhdCB0aGV5IGNhbiBiZSBjb3JyZWN0bHkgaW5jbHVkZWQgaW4geW91ciBidWlsZC5UaGVzZSBsaWJyYXJpZXMgaW5jbHVkZSB0aGUgb3BlbkdMfEVTIGxpYnJhcnksIHRoZSBRdWFsY29tbSBjYW1lcmEgbGlicmFyeSwgdGhlIEhUQyBSYWRpbyBJbnRlcmZhY2UgTGlicmFyeSwgZXRjLgorPHA+Tm90ZTogdGhlc2UgaW5zdHJ1Y3Rpb25zIHdvcmsgZm9yIHRoZSBzYXBwaGlyZSAoQURQMikgYnVpbGQgdGFyZ2V0LCBhcword2VsbC4gU2ltcGx5IHJlcGxhY2UgImRyZWFtIiB3aXRoICJzYXBwaGlyZSIgYWJvdmUuPC9wPgogPC9kaXY+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvY29kZS1saW5lcy5qZCBiL3Bkay9kb2NzL3NvdXJjZS9jb2RlLWxpbmVzLmpkCmluZGV4IDYxYjQwMGQuLjVjZWIxMDMgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9jb2RlLWxpbmVzLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9jb2RlLWxpbmVzLmpkCkBAIC0xNSw3ICsxNSw3IEBACiA8aDM+Tm90ZXMgYW5kIEV4cGxhbmF0aW9uczwvaDM+CiA8dWw+CiA8bGk+QSA8aT5yZWxlYXNlPC9pPiBjb3JyZXNwb25kcyB0byBhIGZvcm1hbCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtLCBzdWNoCi1hcyAxLjUsIDIuMCwgYW5kIHNvIG9uLiBHZW5lcmFsbHkgc3BlYWtpbmcsIGEgcmVsZWFzZSBvZiB0aGUgcGxhdGZvcm0KK2FzIDEuNSwgMi4xLCBhbmQgc28gb24uIEdlbmVyYWxseSBzcGVha2luZywgYSByZWxlYXNlIG9mIHRoZSBwbGF0Zm9ybQogY29ycmVzcG9uZHMgdG8gYSB2ZXJzaW9uIG9mIHRoZSA8Y29kZT5TZGtWZXJzaW9uPC9jb2RlPiBmaWVsZCB1c2VkIGluCiBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGVzLCBhbmQgZGVmaW5lZCBpbiA8Y29kZT5mcmFtZXdvcmtzL2Jhc2UvYXBpPC9jb2RlPiBpbgogdGhlIHNvdXJjZSB0cmVlLjwvbGk+CkBAIC0yMywzNCArMjMsMzcgQEAKIHN0YWNrIGlzIHB1bGxpbmcgY29kZS4gVGhlc2UgaW5jbHVkZSBvYnZpb3VzIHByb2plY3RzIHN1Y2ggYXMgdGhlIExpbnV4IGtlcm5lbAogYW5kIFdlYktpdCwgYnV0IG92ZXIgdGltZSB3ZSBhcmUgbWlncmF0aW5nIHNvbWUgb2YgdGhlIHNlbWktYXV0b25vbW91cwogQW5kcm9pZCBwcm9qZWN0cyAoc3VjaCBhcyBEYWx2aWssIHRoZSBBbmRyb2lkIFNESyB0b29scywgQmlvbmljLCBhbmQgc28gb24pIHRvCi13b3JrIGFzICJ1cHN0cmVhbSIgcHJvamVjdHMuIFRoZXNlIHdpbGwgYmUgZGV2ZWxvcGVkIGVudGlyZWx5IGluIHRoZSBwdWJsaWMKLXRyZWUsIGFuZCBzbmFwc2hvdHMgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcHVsbGVkIGludG8gcmVsZWFzZXMuPC9saT4KLTxsaT5UaGUgZGlhZ3JhbSByZWZlcnMgdG8gIkVjbGFpciIgYW5kICJGbGFuIjsgaG93ZXZlciwgdGhleSBhcmUgc2ltcGx5Cit3b3JrIGFzICJ1cHN0cmVhbSIgcHJvamVjdHMuIEdlbmVyYWxseSwgdGhlc2UgcHJvamVjdHMgYXJlIGRldmVsb3BlZCBlbnRpcmVseSBpbgordGhlIHB1YmxpYyB0cmVlLiBGb3Igc29tZSB1cHN0cmVhbSBwcm9qZWN0cywgZGV2ZWxvcG1lbnQgaXMgZG9uZSBieSBjb250cmlidXRpbmcKK2RpcmVjdGx5IHRvIHRoZSB1cHN0cmVhbSBwcm9qZWN0IGl0c2VsZi4gU2VlCis8YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL3N1Ym1pdC1wYXRjaGVzLmh0bWwjdXBzdHJlYW0tcHJvamVjdHMiPlVwc3RyZWFtIFByb2plY3RzPC9hPgorZm9yIGRldGFpbHMuIEluIGJvdGggY2FzZXMsIHNuYXBzaG90cyB3aWxsIGJlIHBlcmlvZGljYWxseSBwdWxsZWQgaW50byByZWxlYXNlcy48L2xpPgorPGxpPlRoZSBkaWFncmFtIHJlZmVycyB0byAiRWNsYWlyIiBhbmQgIkZyb1lvIjsgaG93ZXZlciwgdGhleSBhcmUgc2ltcGx5CiBwbGFjZWhvbGRlcnMsIGFuZCB0aGUgZGlhZ3JhbSBhY3R1YWxseSByZWZsZWN0cyB0aGUgb3ZlcmFsbCByZWxlYXNlIGFuZAogYnJhbmNoaW5nIHN0cmF0ZWd5LjwvbGk+Ci08bGk+QXQgYWxsIHRpbWVzLCB0aGUgUmVsZWFzZSBjb2RlLWxpbmUgKHdoaWNoIG1heSBhY3R1YWxseSBjb25zaXN0IG9mCis8bGk+QXQgYWxsIHRpbWVzLCBhIHJlbGVhc2UgY29kZS1saW5lICh3aGljaCBtYXkgYWN0dWFsbHkgY29uc2lzdCBvZgogbW9yZSB0aGFuIG9uZSBhY3R1YWwgYnJhbmNoIGluIGdpdCkgaXMgY29uc2lkZXJlZCB0aGUgc29sZSBjYW5vbmljYWwgc291cmNlCi1jb2RlIGZvciBhIGdpdmVuIEFuZHJvaWQgcGxhdGZvcm0uIE9FTXMgYW5kIG90aGVyIGdyb3VwcyBidWlsZGluZyBkZXZpY2VzCi1zaG91bGQgcHVsbCBvbmx5IGZyb20gYSBSZWxlYXNlIGJyYW5jaC48L2xpPgotPGxpPldlIHdpbGwgYmUgc2V0dGluZyB1cCBhbiAiRXhwZXJpbWVudGFsIiBjb2RlLWxpbmUgdG8gY2FwdHVyZSBjaGFuZ2VzIGZyb20KK2NvZGUgZm9yIGEgZ2l2ZW4gQW5kcm9pZCBwbGF0Zm9ybSB2ZXJzaW9uLiBPRU1zIGFuZCBvdGhlciBncm91cHMgYnVpbGRpbmcgZGV2aWNlcworc2hvdWxkIHB1bGwgb25seSBmcm9tIGEgcmVsZWFzZSBicmFuY2guPC9saT4KKzxsaT5XZSB3aWxsIHNldCB1cCAiZXhwZXJpbWVudGFsIiBjb2RlLWxpbmVzIHRvIGNhcHR1cmUgY2hhbmdlcyBmcm9tCiB0aGUgY29tbXVuaXR5LCBzbyB0aGF0IHRoZXkgY2FuIGJlIGl0ZXJhdGVkIG9uLCB3aXRoIGFuIGV5ZSB0b3dhcmQgc3RhYmlsaXR5LjwvbGk+Ci08bGk+Q2hhbmdlcyB0aGF0IHByb3ZlIHN0YWJsZSB3aWxsIGV2ZW50dWFsbHkgYmUgcHVsbGVkIGludG8gYSBSZWxlYXNlCis8bGk+Q2hhbmdlcyB0aGF0IHByb3ZlIHN0YWJsZSB3aWxsIGV2ZW50dWFsbHkgYmUgcHVsbGVkIGludG8gYSByZWxlYXNlCiBicmFuY2guIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSBhcHBseSB0byBidWcgZml4ZXMsIGFwcCBpbXByb3ZlbWVudHMsIGFuZAogb3RoZXIgdGhpbmdzIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgQVBJcyBvZiB0aGUgcGxhdGZvcm0uPC9saT4KLTxsaT5DaGFuZ2VzIHdpbGwgYmUgcHVsbGVkIGludG8gUmVsZWFzZSBicmFuY2hlcyBmcm9tIHVwc3RyZWFtIHByb2plY3RzCi0oaW5jbHVkZSB0aGUgQW5kcm9pZCAidXBzdHJlYW0iIHByb2plY3RzKSBhcyBuZWNlc3NhcnkuPC9saT4KKzxsaT5DaGFuZ2VzIHdpbGwgYmUgcHVsbGVkIGludG8gcmVsZWFzZSBicmFuY2hlcyBmcm9tIHVwc3RyZWFtIHByb2plY3RzCisoaW5jbHVkaW5nIHRoZSBBbmRyb2lkICJ1cHN0cmVhbSIgcHJvamVjdHMpIGFzIG5lY2Vzc2FyeS48L2xpPgogPGxpPlRoZSAibisxInRoIHZlcnNpb24gKHRoYXQgaXMsIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrIGFuZAotcGxhdGZvcm0gQVBJcykgd2lsbCBiZSBkZXZlbG9wZWQgYnkgR29vZ2xlIGludGVybmFsbHkuIChTZWUgYmVsb3cgZm9yCi1kZXRhaWxzLik8L2xpPgotPGxpPkNoYW5nZXMgd2lsbCBiZSBwdWxsZWQgZnJvbSB1cHN0cmVhbSwgUmVsZWFzZSwgYW5kIEV4cGVyaW1lbnRhbCBicmFuY2hlcworcGxhdGZvcm0gQVBJcykgd2lsbCBiZSBkZXZlbG9wZWQgYnkgR29vZ2xlIGludGVybmFsbHkuIFNlZSBiZWxvdyBmb3IKK2RldGFpbHMuPC9saT4KKzxsaT5DaGFuZ2VzIHdpbGwgYmUgcHVsbGVkIGZyb20gdXBzdHJlYW0sIHJlbGVhc2UsIGFuZCBleHBlcmltZW50YWwgYnJhbmNoZXMKIGludG8gR29vZ2xlJ3MgcHJpdmF0ZSBicmFuY2ggYXMgbmVjZXNzYXJ5LjwvbGk+CiA8bGk+V2hlbiB0aGUgcGxhdGZvcm0gQVBJcyBmb3IgdGhlIG5leHQgdmVyc2lvbiBoYXZlIHN0YWJpbGl6ZWQgYW5kIGJlZW4gZnVsbHkKIHRlc3RlZCwgR29vZ2xlIHdpbGwgY3V0IGEgcmVsZWFzZSBvZiB0aGUgbmV4dCBwbGF0Zm9ybSB2ZXJzaW9uLiAoVGhpcwogc3BlY2lmaWNhbGx5IHJlZmVycyB0byBhIG5ldyA8Y29kZT5TZGtWZXJzaW9uPC9jb2RlPi4pIFRoaXMgd2lsbCBhbHNvCi1jb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBjb2RlLWxpbmUgYmVpbmcgbWFkZSBhIHB1YmxpYyBSZWxlYXNlIGJyYW5jaCwgYW5kIHRoZQorY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgY29kZS1saW5lIGJlaW5nIG1hZGUgYSBwdWJsaWMgcmVsZWFzZSBicmFuY2gsIGFuZCB0aGUKIG5ldyBjdXJyZW50IHBsYXRmb3JtIGNvZGUtbGluZS48L2xpPgotPGxpPldoZW4gYSBuZXcgcGxhdGZvcm0gdmVyc2lvbiBpcyBjdXQsIGEgY29ycmVzcG9uZGluZyBFeHBlcmltZW50YWwKLWNvZGUtbGluZS48L2xpPgorPGxpPldoZW4gYSBuZXcgcGxhdGZvcm0gdmVyc2lvbiBpcyBjdXQsIGEgY29ycmVzcG9uZGluZyBleHBlcmltZW50YWwKK2NvZGUtbGluZSB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIHNhbWUgdGltZS48L2xpPgogPC91bD4KIDxoMz5BYm91dCBQcml2YXRlIENvZGUtTGluZXM8L2gzPgogPHA+VGhlIHNvdXJjZSBtYW5hZ2VtZW50IHN0cmF0ZWd5IGFib3ZlIGluY2x1ZGVzIGEgY29kZS1saW5lIHRoYXQgR29vZ2xlIHdpbGwKQEAgLTYyLDkgKzY1LDkgQEAKIEdvb2dsZSByZXRhaW5zIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgc3RyYXRlZ2ljIGRpcmVjdGlvbiBvZiBBbmRyb2lkIGFzIGEKIHBsYXRmb3JtIGFuZCBhIHByb2R1Y3QuIE91ciBhcHByb2FjaCBpcyBiYXNlZCBvbiBmb2N1c2luZyBvbiBhIHNtYWxsIG51bWJlciBvZgogZmxhZ3NoaXAgZGV2aWNlcyB0byBkcml2ZSBmZWF0dXJlcywgYW5kIHNlY3VyZSBwcm90ZWN0aW9ucyBvZiBBbmRyb2lkLXJlbGF0ZWQKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSB0aHJvdWdoIHBhdGVudHMgYW5kIHRoZSBsaWtlLjwvcD4KK2ludGVsbGVjdHVhbCBwcm9wZXJ0eS48L3A+CiA8cD5BcyBhIHJlc3VsdCwgR29vZ2xlIGZyZXF1ZW50bHkgaGFzIHBvc3Nlc3Npb24gb2YgY29uZmlkZW50aWFsCi1pbmZvcm1hdGlvbiBvZiB0aGlyZCBwYXJ0aWVzLCBhbmQgd2UgbXVzdCByZWZyYWluIGZyb20gcmV2ZWFsaW5nIHBhdGVudGFibGUKK2luZm9ybWF0aW9uIG9mIHRoaXJkIHBhcnRpZXMsIGFuZCB3ZSBtdXN0IHJlZnJhaW4gZnJvbSByZXZlYWxpbmcgc2Vuc2l0aXZlCiBmZWF0dXJlcyB1bnRpbCB3ZSd2ZSBzZWN1cmVkIHRoZSBhcHByb3ByaWF0ZSBwcm90ZWN0aW9ucy4gTWVhbndoaWxlLCB0aGVyZSBhcmUKIHJlYWwgcmlza3MgdG8gdGhlIHBsYXRmb3JtIGFyaXNpbmcgZnJvbSBoYXZpbmcgdG9vIG1hbnkgcGxhdGZvcm0gdmVyc2lvbnMKIGV4dGFudCBhdCBvbmNlLiBGb3IgdGhlc2UgcmVhc29ucywgd2UgaGF2ZSBzdHJ1Y3R1cmVkIHRoZSBvcGVuLXNvdXJjZSBwcm9qZWN0CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvY29kZS1zdHlsZS5qZCBiL3Bkay9kb2NzL3NvdXJjZS9jb2RlLXN0eWxlLmpkCmluZGV4IDhiNTk0NmUuLjk1N2FiMDIgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9jb2RlLXN0eWxlLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9jb2RlLXN0eWxlLmpkCkBAIC0xLDcgKzEsNiBAQAogcGFnZS50aXRsZT1Db2RlIFN0eWxlIEd1aWRlbGluZXMgZm9yIENvbnRyaWJ1dG9ycwogZG9jLnR5cGU9c291cmNlCiBAamQ6Ym9keQotPGRpdj4KIDxwPlRoZSBydWxlcyBiZWxvdyBhcmUgbm90IGd1aWRlbGluZXMgb3IgcmVjb21tZW5kYXRpb25zLCBidXQgc3RyaWN0IHJ1bGVzLgogQ29udHJpYnV0aW9ucyB0byBBbmRyb2lkIGdlbmVyYWxseSA8Yj53aWxsIG5vdCBiZSBhY2NlcHRlZCBpZiB0aGV5IGRvIG5vdAogYWRoZXJlIHRvIHRoZXNlIHJ1bGVzLjwvYj4KQEAgLTExLDQyNSArMTAsNjE1IEBACiA8L2gxPgogPHA+V2UgZm9sbG93IHN0YW5kYXJkIEphdmEgY29kaW5nIGNvbnZlbnRpb25zLiBXZSBhZGQgYSBmZXcgcnVsZXM6CiA8L3A+Ci08b2w+PGxpPjxhIGhyZWY9IiNleGNlcHRpb25zSWdub3JlIj5FeGNlcHRpb25zPC9hPgotOiBOZXZlciBjYXRjaCBhbmQgaWdub3JlIHRoZW0gd2l0aG91dCBleHBsYW5hdGlvbi4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iI2V4Y2VwdGlvbnNBbGwiPkV4Y2VwdGlvbnM8L2E+Ci06IGRvIG5vdCBjYXRjaCBnZW5lcmljIEV4Y2VwdGlvbiwgZXhjZXB0IGluIGxpYnJhcnkgY29kZSBhdCB0aGUgcm9vdCBvZiB0aGUgc3RhY2suCi08L2xpPgotPGxpPjxhIGhyZWY9IiNmaW5hbGl6ZXJzIj5GaW5hbGl6ZXJzPC9hPgotOiBnZW5lcmFsbHkgZG9uJ3QgdXNlIHRoZW0uCi08L2xpPgotPGxpPjxhIGhyZWY9IiNpbXBvcnRzIj5JbXBvcnRzPC9hPgotOiBGdWxseSBxdWFsaWZ5IGltcG9ydHMKLTwvbGk+Cis8b2w+PGxpPjxhIGhyZWY9IiNleGNlcHRpb25zSWdub3JlIj5FeGNlcHRpb25zPC9hPjogTmV2ZXIgY2F0Y2ggYW5kIGlnbm9yZSB0aGVtIHdpdGhvdXQgZXhwbGFuYXRpb24uPC9saT4KKzxsaT48YSBocmVmPSIjZXhjZXB0aW9uc0FsbCI+RXhjZXB0aW9uczwvYT46IGRvIG5vdCBjYXRjaCBnZW5lcmljIEV4Y2VwdGlvbiwgZXhjZXB0IGluIGxpYnJhcnkgY29kZSBhdCB0aGUgcm9vdCBvZiB0aGUgc3RhY2suPC9saT4KKzxsaT48YSBocmVmPSIjZmluYWxpemVycyI+RmluYWxpemVyczwvYT46IGdlbmVyYWxseSBkb24ndCB1c2UgdGhlbS48L2xpPgorPGxpPjxhIGhyZWY9IiNpbXBvcnRzIj5JbXBvcnRzPC9hPjogRnVsbHkgcXVhbGlmeSBpbXBvcnRzPC9saT4KIDwvb2w+Ci08aDE+PGE+SmF2YSBMaWJyYXJ5IFJ1bGVzPC9hPgotPC9oMT4KLTxwPlRoZXJlIGFyZSBjb252ZW50aW9ucyBmb3IgdXNpbmcgQW5kcm9pZCdzIEphdmEgbGlicmFyaWVzIGFuZCB0b29scy4gSW4gc29tZSBjYXNlcywgdGhlIGNvbnZlbnRpb24gaGFzIGNoYW5nZWQgaW4gaW1wb3J0YW50IHdheXMgYW5kIG9sZGVyIGNvZGUgbWlnaHQgdXNlIGEgZGVwcmVjYXRlZCBwYXR0ZXJuIG9yIGxpYnJhcnkuIFdoZW4gd29ya2luZyB3aXRoIHN1Y2ggY29kZSwgaXQncyBva2F5IHRvIGNvbnRpbnVlIHRoZSBleGlzdGluZyBzdHlsZSAoc2VlIDxhIGhyZWY9IiNjb25zaXN0ZW5jeSI+Q29uc2lzdGVuY3k8L2E+Ci0pLiBXaGVuIGNyZWF0aW5nIG5ldyBjb21wb25lbnRzIG5ldmVyIHVzZSBkZXByZWNhdGVkIGxpYnJhcmllcy4KLTwvcD4KLTxoMT48YT5KYXZhIFN0eWxlIFJ1bGVzPC9hPgotPC9oMT4KLTxwPlByb2dyYW1zIGFyZSBtdWNoIGVhc2llciB0byBtYWludGFpbiB3aGVuIGFsbCBmaWxlcyBoYXZlIGEgY29uc2lzdGVudCBzdHlsZS4gV2UgZm9sbG93IHRoZSBzdGFuZGFyZCBKYXZhIGNvZGluZyBzdHlsZSwgYXMgZGVmaW5lZCBieSBTdW4gaW4gdGhlaXIgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252L2h0bWwvQ29kZUNvbnZUT0MuZG9jLmh0bWwiPkNvZGUgQ29udmVudGlvbnMgZm9yIHRoZSBKYXZhIFByb2dyYW1taW5nIExhbmd1YWdlPC9hPgotLCB3aXRoIGEgZmV3IGV4Y2VwdGlvbnMgYW5kIGFkZGl0aW9ucy4gVGhpcyBzdHlsZSBndWlkZSBpcyBjb21wcmVoZW5zaXZlIGFuZCBkZXRhaWxlZCBhbmQgaXMgaW4gY29tbW9uIHVzYWdlIGluIHRoZSBKYXZhIGNvbW11bml0eS4KLTwvcD4KLTxwPkluIGFkZGl0aW9uLCB3ZSBlbmZvcmNlIHRoZSBmb2xsb3dpbmcgc3R5bGUgcnVsZXM6Ci08L3A+Ci08b2w+PGxpPjxhIGhyZWY9IiNqYXZhZG9jIj5Db21tZW50cy9KYXZhZG9jPC9hPgotOiB3cml0ZSBpdDsgdXNlIHN0YW5kYXJkIHN0eWxlCi08L2xpPgotPGxpPjxhIGhyZWY9IiNzaG9ydG1ldGhvZHMiPlNob3J0IG1ldGhvZHM8L2E+Ci06IGRvbid0IHdyaXRlIGdpYW50IG1ldGhvZHMKLTwvbGk+Ci08bGk+RmllbGRzOiBzaG91bGQgZWl0aGVyIGJlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIG9yIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbWV0aG9kcyB0aGF0IHVzZSB0aGVtCi08L2xpPgotPGxpPjxhIGhyZWY9IiNsb2NhbHZhcmlhYmxlcyI+TG9jYWwgdmFyaWFibGVzPC9hPgotOiBsaW1pdCB0aGUgc2NvcGUKLTwvbGk+Ci08bGk+PGEgaHJlZj0iI2ltcG9ydF9zdHlsZSI+SW1wb3J0czwvYT4KLTogYW5kcm9pZDsgdGhpcmQgcGFydHkgYWxwaGFiZXRpY2FsOyBqYXZhKHgpCi08L2xpPgotPGxpPjxhIGhyZWY9IiNpbmRlbnRhdGlvbiI+SW5kZW50YXRpb248L2E+Ci06IDQgc3BhY2VzLCBubyB0YWJzLgotPC9saT4KLTxsaT48YSBocmVmPSIjbGluZWxlbiI+TGluZSBsZW5ndGg8L2E+Ci06IDEwMCBjb2x1bW5zCi08L2xpPgotPGxpPjxhIGhyZWY9IiNmaWVsZF9uYW1lcyI+RmllbGQgbmFtZXM8L2E+Ci06IE5vbi1wdWJsaWMsIG5vbi1zdGF0aWMgZmllbGRzIHN0YXJ0IHdpdGggbS4gU3RhdGljIGZpZWxkcyBzdGFydCBzLgotPC9saT4KLTxsaT48YSBocmVmPSIjYnJhY2VzIj5CcmFjZXM8L2E+Ci06IE9wZW5pbmcgYnJhY2VzIGRvbid0IGdvIG9uIHRoZWlyIG93biBsaW5lLgotPC9saT4KLTxsaT48YSBocmVmPSIjYW5ub3RhdGlvbnMiPkFubm90YXRpb25zPC9hPgotOiBVc2UgdGhlIHN0YW5kYXJkIGFubm90YXRpb25zLgotPC9saT4KLTxsaT48YSBocmVmPSIjYWNyb255bXMiPkFjcm9ueW1zIGFyZSB3b3JkczwvYT4KLTogVHJlYXQgYWNyb255bXMgYXMgd29yZHMgaW4gbmFtZXMsIHlpZWxkaW5nIFhtbEh0dHBSZXF1ZXN0LCBnZXRVcmwoKSwgZXRjLgotPC9saT4KLTxsaT48YSBocmVmPSIjdG9kbyI+VE9ETyBzdHlsZTwvYT4KLTogIlRPRE86IHdyaXRlIHRoaXMgZGVzY3JpcHRpb24iCi08L2xpPgotPGxpPjxhIGhyZWY9IiNjb25zaXN0ZW5jeSI+Q29uc2lzdGVuY3k8L2E+Ci06IExvb2sgYXQgd2hhdCdzIGFyb3VuZCB5b3UhCi08L2xpPgotPGxpPjxhIGhyZWY9IiNsb2dnaW5nIj5Mb2dnaW5nPC9hPgotOiBCZSBjYXJlZnVsIHdpdGggbG9nZ2luZy4gSXQncyBleHBlbnNpdmUuCi08L2xpPgorPGgxPkphdmEgTGlicmFyeSBSdWxlczwvaDE+Cis8cD5UaGVyZSBhcmUgY29udmVudGlvbnMgZm9yIHVzaW5nIEFuZHJvaWQncyBKYXZhIGxpYnJhcmllcyBhbmQgdG9vbHMuIEluIHNvbWUKK2Nhc2VzLCB0aGUgY29udmVudGlvbiBoYXMgY2hhbmdlZCBpbiBpbXBvcnRhbnQgd2F5cyBhbmQgb2xkZXIgY29kZSBtaWdodCB1c2UgYQorZGVwcmVjYXRlZCBwYXR0ZXJuIG9yIGxpYnJhcnkuIFdoZW4gd29ya2luZyB3aXRoIHN1Y2ggY29kZSwgaXQncyBva2F5IHRvCitjb250aW51ZSB0aGUgZXhpc3Rpbmcgc3R5bGUgKHNlZSA8YSBocmVmPSIjY29uc2lzdGVuY3kiPkNvbnNpc3RlbmN5PC9hPikuIFdoZW4KK2NyZWF0aW5nIG5ldyBjb21wb25lbnRzIG5ldmVyIHVzZSBkZXByZWNhdGVkIGxpYnJhcmllcy48L3A+Cis8aDE+SmF2YSBTdHlsZSBSdWxlczwvaDE+Cis8cD5Qcm9ncmFtcyBhcmUgbXVjaCBlYXNpZXIgdG8gbWFpbnRhaW4gd2hlbiBhbGwgZmlsZXMgaGF2ZSBhIGNvbnNpc3RlbnQKK3N0eWxlLiBXZSBmb2xsb3cgdGhlIHN0YW5kYXJkIEphdmEgY29kaW5nIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IFN1biBpbiB0aGVpciA8YQoraHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252L2h0bWwvQ29kZUNvbnZUT0MuZG9jLmh0bWwiPkNvZGUKK0NvbnZlbnRpb25zIGZvciB0aGUgSmF2YSBQcm9ncmFtbWluZyBMYW5ndWFnZTwvYT4sIHdpdGggYSBmZXcgZXhjZXB0aW9ucyBhbmQKK2FkZGl0aW9ucy4gVGhpcyBzdHlsZSBndWlkZSBpcyBjb21wcmVoZW5zaXZlIGFuZCBkZXRhaWxlZCBhbmQgaXMgaW4gY29tbW9uCit1c2FnZSBpbiB0aGUgSmF2YSBjb21tdW5pdHkuPC9wPgorPHA+SW4gYWRkaXRpb24sIHdlIGVuZm9yY2UgdGhlIGZvbGxvd2luZyBzdHlsZSBydWxlczo8L3A+Cis8b2w+PGxpPjxhIGhyZWY9IiNqYXZhZG9jIj5Db21tZW50cy9KYXZhZG9jPC9hPjogd3JpdGUgaXQ7IHVzZSBzdGFuZGFyZCBzdHlsZTwvbGk+Cis8bGk+PGEgaHJlZj0iI3Nob3J0bWV0aG9kcyI+U2hvcnQgbWV0aG9kczwvYT46IGRvbid0IHdyaXRlIGdpYW50IG1ldGhvZHM8L2xpPgorPGxpPkZpZWxkczogc2hvdWxkIGVpdGhlciBiZSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCBvciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIG1ldGhvZHMgdGhhdCB1c2UgdGhlbTwvbGk+Cis8bGk+PGEgaHJlZj0iI2xvY2FsdmFyaWFibGVzIj5Mb2NhbCB2YXJpYWJsZXM8L2E+OiBsaW1pdCB0aGUgc2NvcGU8L2xpPgorPGxpPjxhIGhyZWY9IiNpbXBvcnRfc3R5bGUiPkltcG9ydHM8L2E+OiBhbmRyb2lkOyB0aGlyZCBwYXJ0eSBhbHBoYWJldGljYWw7IGphdmEoeCk8L2xpPgorPGxpPjxhIGhyZWY9IiNpbmRlbnRhdGlvbiI+SW5kZW50YXRpb248L2E+OiA0IHNwYWNlcywgbm8gdGFicy48L2xpPgorPGxpPjxhIGhyZWY9IiNsaW5lbGVuIj5MaW5lIGxlbmd0aDwvYT46IDEwMCBjb2x1bW5zPC9saT4KKzxsaT48YSBocmVmPSIjZmllbGRfbmFtZXMiPkZpZWxkIG5hbWVzPC9hPjogTm9uLXB1YmxpYywgbm9uLXN0YXRpYyBmaWVsZHMgc3RhcnQgd2l0aCBtLjwvbGk+Cis8bGk+PGEgaHJlZj0iI2JyYWNlcyI+QnJhY2VzPC9hPjogT3BlbmluZyBicmFjZXMgZG9uJ3QgZ28gb24gdGhlaXIgb3duIGxpbmUuPC9saT4KKzxsaT48YSBocmVmPSIjYW5ub3RhdGlvbnMiPkFubm90YXRpb25zPC9hPjogVXNlIHRoZSBzdGFuZGFyZCBhbm5vdGF0aW9ucy48L2xpPgorPGxpPjxhIGhyZWY9IiNhY3JvbnltcyI+QWNyb255bXMgYXJlIHdvcmRzPC9hPjogVHJlYXQgYWNyb255bXMgYXMgd29yZHMgaW4gbmFtZXMsIHlpZWxkaW5nIFhtbEh0dHBSZXF1ZXN0LCBnZXRVcmwoKSwgZXRjLjwvbGk+Cis8bGk+PGEgaHJlZj0iI3RvZG8iPlRPRE8gc3R5bGU8L2E+OiAiVE9ETzogd3JpdGUgdGhpcyBkZXNjcmlwdGlvbiI8L2xpPgorPGxpPjxhIGhyZWY9IiNjb25zaXN0ZW5jeSI+Q29uc2lzdGVuY3k8L2E+OiBMb29rIGF0IHdoYXQncyBhcm91bmQgeW91ITwvbGk+Cis8bGk+PGEgaHJlZj0iI2xvZ2dpbmciPkxvZ2dpbmc8L2E+OiBCZSBjYXJlZnVsIHdpdGggbG9nZ2luZy4gSXQncyBleHBlbnNpdmUuPC9saT4KIDwvb2w+Ci08aDE+PGE+SmF2YXRlc3RzIFN0eWxlIFJ1bGVzPC9hPgotPC9oMT4KLTxvbD48bGk+PGEgaHJlZj0iI3Rlc3RtZXRob2RuYW1lcyI+TmFtaW5nIHRlc3QgbWV0aG9kczwvYT4KLTogdGVzdE1ldGhvZF9zcGVjaWZpY0Nhc2UgaXMgb2sKLTwvbGk+Cis8aDE+SmF2YXRlc3RzIFN0eWxlIFJ1bGVzPC9oMT4KKzxvbD4KKzxsaT48YSBocmVmPSIjdGVzdG1ldGhvZG5hbWVzIj5OYW1pbmcgdGVzdCBtZXRob2RzPC9hPjogdGVzdE1ldGhvZF9zcGVjaWZpY0Nhc2UgaXMgb2s8L2xpPgogPC9vbD4KLTxocj48aDI+Ci1KYXZhIExhbmd1YWdlIFJ1bGVzCi08L2gyPgotPGgyPjxhPkV4Y2VwdGlvbnM6IGRvIG5vdCBpZ25vcmU8L2E+Ci08L2gyPgotU29tZXRpbWVzIGl0IGlzIHRlbXB0aW5nIHRvIHdyaXRlIGNvZGUgdGhhdCBjb21wbGV0ZWx5IGlnbm9yZXMgYW4gZXhjZXB0aW9uIGxpa2UgdGhpczoKLTxwcmU+dm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgezxicj50cnkgezxicj5zZXJ2ZXJQb3J0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7PGJyPn0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7PGJyPn08YnI+fTxicj48YnI+PC9wcmU+Ci08cD5Zb3UgbXVzdCBuZXZlciBkbyB0aGlzLiBXaGlsZSB5b3UgbWF5IHRoaW5rIHRoYXQgeW91ciBjb2RlIHdpbGwgbmV2ZXIgZW5jb3VudGVyIHRoaXMgZXJyb3IgY29uZGl0aW9uIG9yIHRoYXQgaXQgaXMgbm90IGltcG9ydGFudCB0byBoYW5kbGUgaXQsIGlnbm9yaW5nIGV4Y2VwdGlvbnMgbGlrZSBhYm92ZSBjcmVhdGVzIG1pbmVzIGluIHlvdXIgY29kZSBmb3Igc29tZW9uZSBlbHNlIHRvIHRyaXAgb3ZlciBzb21lIGRheS4gWW91IG11c3QgaGFuZGxlIGV2ZXJ5IEV4Y2VwdGlvbiBpbiB5b3VyIGNvZGUgaW4gc29tZSBwcmluY2lwbGVkIHdheS4gVGhlIHNwZWNpZmljIGhhbmRsaW5nIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGNhc2UuCi08L3A+Ci08YmxvY2txdW90ZT5Bbnl0aW1lIHNvbWVib2R5IGhhcyBhbiBlbXB0eSBjYXRjaCBjbGF1c2UgdGhleSBzaG91bGQgaGF2ZSBhIGNyZWVweSBmZWVsaW5nLiBUaGVyZSBhcmUgZGVmaW5pdGVseSB0aW1lcyB3aGVuIGl0IGlzIGFjdHVhbGx5IHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvLCBidXQgYXQgbGVhc3QgeW91IGhhdmUgdG8gdGhpbmsgYWJvdXQgaXQuIEluIEphdmEgeW91IGNhbid0IGVzY2FwZSB0aGUgY3JlZXB5IGZlZWxpbmcuPGJyPjxkaXY+LTxhIGhyZWY9Imh0dHA6Ly93d3cuYXJ0aW1hLmNvbS9pbnR2L3NvbGlkNC5odG1sIj5KYW1lcyBHb3NsaW5nPC9hPgotPC9kaXY+Ci08L2Jsb2NrcXVvdGU+Ci08cD5BY2NlcHRhYmxlIGFsdGVybmF0aXZlcyAoaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSkgYXJlOgotPC9wPgotPHVsPjxsaT5UaHJvdyB0aGUgZXhjZXB0aW9uIHVwIHRvIHRoZSBjYWxsZXIgb2YgeW91ciBtZXRob2QuCi08cHJlPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gezxicj5zZXJ2ZXJQb3J0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7PGJyPn08YnI+PGJyPjwvcHJlPgotPC9saT4KKzxoMj5KYXZhIExhbmd1YWdlIFJ1bGVzPC9oMj4KKzxoMj48YSBuYW1lPSJleGNlcHRpb25zSWdub3JlIj48L2E+RXhjZXB0aW9uczogZG8gbm90IGlnbm9yZTwvaDI+Cis8cD5Tb21ldGltZXMgaXQgaXMgdGVtcHRpbmcgdG8gd3JpdGUgY29kZSB0aGF0IGNvbXBsZXRlbHkgaWdub3JlcyBhbiBleGNlcHRpb24KK2xpa2UgdGhpczo8L3A+Cis8cHJlPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHsKKyAgICB0cnkgeworICAgICAgICBzZXJ2ZXJQb3J0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsgfQorfTwvcHJlPgorPHA+WW91IG11c3QgbmV2ZXIgZG8gdGhpcy4gV2hpbGUgeW91IG1heSB0aGluayB0aGF0IHlvdXIgY29kZSB3aWxsIG5ldmVyCitlbmNvdW50ZXIgdGhpcyBlcnJvciBjb25kaXRpb24gb3IgdGhhdCBpdCBpcyBub3QgaW1wb3J0YW50IHRvIGhhbmRsZSBpdCwKK2lnbm9yaW5nIGV4Y2VwdGlvbnMgbGlrZSBhYm92ZSBjcmVhdGVzIG1pbmVzIGluIHlvdXIgY29kZSBmb3Igc29tZW9uZSBlbHNlIHRvCit0cmlwIG92ZXIgc29tZSBkYXkuIFlvdSBtdXN0IGhhbmRsZSBldmVyeSBFeGNlcHRpb24gaW4geW91ciBjb2RlIGluIHNvbWUKK3ByaW5jaXBsZWQgd2F5LiBUaGUgc3BlY2lmaWMgaGFuZGxpbmcgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgY2FzZS48L3A+Cis8YmxvY2txdW90ZT5Bbnl0aW1lIHNvbWVib2R5IGhhcyBhbiBlbXB0eSBjYXRjaCBjbGF1c2UgdGhleSBzaG91bGQgaGF2ZSBhCitjcmVlcHkgZmVlbGluZy4gVGhlcmUgYXJlIGRlZmluaXRlbHkgdGltZXMgd2hlbiBpdCBpcyBhY3R1YWxseSB0aGUgY29ycmVjdAordGhpbmcgdG8gZG8sIGJ1dCBhdCBsZWFzdCB5b3UgaGF2ZSB0byB0aGluayBhYm91dCBpdC4gSW4gSmF2YSB5b3UgY2FuJ3QgZXNjYXBlCit0aGUgY3JlZXB5IGZlZWxpbmcuCistPGEgaHJlZj0iaHR0cDovL3d3dy5hcnRpbWEuY29tL2ludHYvc29saWQ0Lmh0bWwiPkphbWVzCitHb3NsaW5nPC9hPjwvYmxvY2txdW90ZT4KKzxwPkFjY2VwdGFibGUgYWx0ZXJuYXRpdmVzIChpbiBvcmRlciBvZiBwcmVmZXJlbmNlKSBhcmU6PC9wPgorPHVsPgorPGxpPlRocm93IHRoZSBleGNlcHRpb24gdXAgdG8gdGhlIGNhbGxlciBvZiB5b3VyIG1ldGhvZC4KKzxwcmU+dm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgc2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworfTwvcHJlPjwvbGk+CiA8bGk+VGhyb3cgYSBuZXcgZXhjZXB0aW9uIHRoYXQncyBhcHByb3ByaWF0ZSB0byB5b3VyIGxldmVsIG9mIGFic3RyYWN0aW9uLgotPHByZT52b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7PGJyPnRyeSB7PGJyPnNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTs8YnI+fSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHs8YnI+dGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlBvcnQgIiArIHZhbHVlICsgIiBpcyBub3QgdmFsaWQuIik7PGJyPn08YnI+PGJyPjwvcHJlPgotPC9saT4KLTxsaT5IYW5kbGUgdGhlIGVycm9yIGdyYWNlZnVsbHkgYW5kIHN1YnN0aXR1dGUgYW4gYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIGNhdGNoIHt9IGJsb2NrLgotPHByZT4vKiogU2V0IHBvcnQuIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlciwgODAgaXMgc3Vic3RpdHV0ZWQuICovPGJyPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHs8YnI+dHJ5IHs8YnI+c2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOzxicj59IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgezxicj5zZXJ2ZXJQb3J0ID0gODA7ICAvLyBkZWZhdWx0IHBvcnQgZm9yIHNlcnZlciA8YnI+fTxicj48L3ByZT4KLTwvbGk+Ci08bGk+Q2F0Y2ggdGhlIEV4Y2VwdGlvbiBhbmQgdGhyb3cgYSBuZXcgUnVudGltZUV4Y2VwdGlvbi4gVGhpcyBpcyBkYW5nZXJvdXM6IG9ubHkgZG8gaXQgaWYgeW91IGFyZSBwb3NpdGl2ZSB0aGF0IGlmIHRoaXMgZXJyb3Igb2NjdXJzLCB0aGUgYXBwcm9wcmlhdGUgdGhpbmcgdG8gZG8gaXMgY3Jhc2guCi08cHJlPi8qKiBTZXQgcG9ydC4gSWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLCBkaWUuICovPGJyPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHs8YnI+dHJ5IHs8YnI+c2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOzxicj59IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgezxicj50aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicG9ydCAiICsgdmFsdWUgIiBpcyBpbnZhbGlkLCAiLCBlKTs8YnI+fTxicj48L3ByZT4KLU5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgZm9yIFJ1bnRpbWVFeGNlcHRpb24uIFRoaXMgd3JhcHBlZCBleGNlcHRpb24gcGFyYWRpZ20gaXMgdmVyeSB1c2VmdWwgYnV0IG9ubHkgd29ya3MgaW4gSmF2YSAxLjQuIElmIHlvdXIgY29kZSBtdXN0IGNvbXBpbGUgdW5kZXIgSmF2YSAxLjMsIHlvdSB3aWxsIG5lZWQgdG8gb21pdCB0aGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhlIGNhdXNlLjxicj48YnI+PC9saT4KLTxsaT5MYXN0IHJlc29ydDogaWYgeW91IGFyZSBjb25maWRlbnQgdGhhdCBhY3R1YWxseSBpZ25vcmluZyB0aGUgZXhjZXB0aW9uIGlzIGFwcHJvcHJpYXRlIHRoZW4geW91IG1heSBpZ25vcmUgaXQsIGJ1dCB5b3UgbXVzdCBhbHNvIGNvbW1lbnQgd2h5IHdpdGggYSBnb29kIHJlYXNvbjoKLTxwcmU+LyoqIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlciwgb3JpZ2luYWwgcG9ydCBudW1iZXIgaXMgdXNlZC4gKi88YnI+dm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgezxicj50cnkgezxicj5zZXJ2ZXJQb3J0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7PGJyPn0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7PGJyPi8vIE1ldGhvZCBpcyBkb2N1bWVudGVkIHRvIGp1c3QgaWdub3JlIGludmFsaWQgdXNlciBpbnB1dC48YnI+Ly8gc2VydmVyUG9ydCB3aWxsIGp1c3QgYmUgdW5jaGFuZ2VkLjxicj59PGJyPn08YnI+PC9wcmU+Ci08L2xpPgorPHByZT52b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJQb3J0ICIgKyB2YWx1ZSArICIgaXMgbm90IHZhbGlkLiIpOworICAgIH0KK308L3ByZT48L2xpPgorPGxpPkhhbmRsZSB0aGUgZXJyb3IgZ3JhY2VmdWxseSBhbmQgc3Vic3RpdHV0ZSBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUKK2NhdGNoIHt9IGJsb2NrLgorPHByZT4vKiogU2V0IHBvcnQuIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlciwgODAgaXMgc3Vic3RpdHV0ZWQuICovCit2b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHNlcnZlclBvcnQgPSA4MDsgIC8vIGRlZmF1bHQgcG9ydCBmb3Igc2VydmVyIAorICAgIH0KK308L3ByZT48L2xpPgorPGxpPkNhdGNoIHRoZSBFeGNlcHRpb24gYW5kIHRocm93IGEgbmV3IFJ1bnRpbWVFeGNlcHRpb24uIFRoaXMgaXMgZGFuZ2Vyb3VzOgorb25seSBkbyBpdCBpZiB5b3UgYXJlIHBvc2l0aXZlIHRoYXQgaWYgdGhpcyBlcnJvciBvY2N1cnMsIHRoZSBhcHByb3ByaWF0ZQordGhpbmcgdG8gZG8gaXMgY3Jhc2guCis8cHJlPi8qKiBTZXQgcG9ydC4gSWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLCBkaWUuICovCit2b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwb3J0ICIgKyB2YWx1ZSAiIGlzIGludmFsaWQsICIsIGUpOworICAgIH0KK308L3ByZT4KK05vdGUgdGhhdCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgZm9yCitSdW50aW1lRXhjZXB0aW9uLiAgSWYgeW91ciBjb2RlIG11c3QgY29tcGlsZSB1bmRlciBKYXZhIDEuMywgeW91IHdpbGwgbmVlZCB0bworb21pdCB0aGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhlIGNhdXNlLjwvbGk+Cis8bGk+TGFzdCByZXNvcnQ6IGlmIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgYWN0dWFsbHkgaWdub3JpbmcgdGhlIGV4Y2VwdGlvbiBpcworYXBwcm9wcmlhdGUgdGhlbiB5b3UgbWF5IGlnbm9yZSBpdCwgYnV0IHlvdSBtdXN0IGFsc28gY29tbWVudCB3aHkgd2l0aCBhIGdvb2QKK3JlYXNvbjoKKzxwcmU+LyoqIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlciwgb3JpZ2luYWwgcG9ydCBudW1iZXIgaXMgdXNlZC4gKi8KK3ZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHsKKyAgICB0cnkgeworICAgICAgICBzZXJ2ZXJQb3J0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gTWV0aG9kIGlzIGRvY3VtZW50ZWQgdG8ganVzdCBpZ25vcmUgaW52YWxpZCB1c2VyIGlucHV0LgorICAgICAgICAvLyBzZXJ2ZXJQb3J0IHdpbGwganVzdCBiZSB1bmNoYW5nZWQuCisgICAgfQorfTwvcHJlPjwvbGk+CiA8L3VsPgotPGgyPjxhPkV4Y2VwdGlvbnM6IGRvIG5vdCBjYXRjaCBnZW5lcmljIEV4Y2VwdGlvbjwvYT4KLTwvaDI+Ci1Tb21ldGltZXMgaXQgaXMgdGVtcHRpbmcgdG8gYmUgbGF6eSB3aGVuIGNhdGNoaW5nIGV4Y2VwdGlvbnMgYW5kIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci08cHJlPnRyeSB7PGJyPnNvbWVDb21wbGljYXRlZElPRnVuY3Rpb24oKTsgICAgICAgIC8vIG1heSB0aHJvdyBJT0V4Y2VwdGlvbiA8YnI+c29tZUNvbXBsaWNhdGVkUGFyc2luZ0Z1bmN0aW9uKCk7ICAgLy8gbWF5IHRocm93IFBhcnNpbmdFeGNlcHRpb24gPGJyPnNvbWVDb21wbGljYXRlZFNlY3VyaXR5RnVuY3Rpb24oKTsgIC8vIG1heSB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiA8YnI+Ly8gcGhldywgbWFkZSBpdCBhbGwgdGhlIHdheSA8YnI+fSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgICAgICAgICAgICAgICAvLyBJJ2xsIGp1c3QgY2F0Y2ggYWxsIGV4Y2VwdGlvbnMgPGJyPmhhbmRsZUVycm9yKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggb25lIGdlbmVyaWMgaGFuZGxlciE8YnI+fTxicj48YnI+PC9wcmU+Ci1Zb3Ugc2hvdWxkIG5vdCBkbyB0aGlzLiBJbiBhbG1vc3QgYWxsIGNhc2VzIGl0IGlzIGluYXBwcm9wcmlhdGUgdG8gY2F0Y2ggZ2VuZXJpYyBFeGNlcHRpb24gb3IgVGhyb3dhYmxlLCBwcmVmZXJhYmx5IG5vdCBUaHJvd2FibGUsIGJlY2F1c2UgaXQgaW5jbHVkZXMgRXJyb3IgZXhjZXB0aW9ucyBhcyB3ZWxsLiBJdCBpcyB2ZXJ5IGRhbmdlcm91cy4gSXQgbWVhbnMgdGhhdCBFeGNlcHRpb25zIHlvdSBuZXZlciBleHBlY3RlZCAoaW5jbHVkaW5nIFJ1bnRpbWVFeGNlcHRpb25zIGxpa2UgQ2xhc3NDYXN0RXhjZXB0aW9uKSBlbmQgdXAgZ2V0dGluZyBjYXVnaHQgaW4gYXBwbGljYXRpb24tbGV2ZWwgZXJyb3IgaGFuZGxpbmcuIEl0IG9ic2N1cmVzIHRoZSBmYWlsdXJlIGhhbmRsaW5nIHByb3BlcnRpZXMgb2YgeW91ciBjb2RlLiBJdCBtZWFucyBpZiBzb21lb25lIGFkZHMgYSBuZXcgdHlwZSBvZiBFeGNlcHRpb24gaW4gdGhlIGNvZGUgeW91J3JlIGNhbGxpbmcsIHRoZSBjb21waWxlciB3b24ndCBoZWxwIHlvdSByZWFsaXplIHlvdSBuZWVkIHRvIGhhbmRsZSB0aGF0IGVycm9yIGRpZmZlcmVudGx5LiBBbmQgaW4gbW9zdCBjYXNlcyB5b3Ugc2hvdWxkbid0IGJlIGhhbmRsaW5nIGRpZmZlcmVudCB0eXBlcyBvZiBleGNlcHRpb24gdGhlIHNhbWUgd2F5LCBhbnl3YXkuCi08cD5UaGVyZSBhcmUgcmFyZSBleGNlcHRpb25zIHRvIHRoaXMgcnVsZTogY2VydGFpbiB0ZXN0IGNvZGUgYW5kIHRvcC1sZXZlbCBjb2RlIHdoZXJlIHlvdSB3YW50IHRvIGNhdGNoIGFsbCBraW5kcyBvZiBlcnJvcnMgKHRvIHByZXZlbnQgdGhlbSBmcm9tIHNob3dpbmcgdXAgaW4gYSBVSSwgb3IgdG8ga2VlcCBhIGJhdGNoIGpvYiBydW5uaW5nKS4gSW4gdGhhdCBjYXNlIHlvdSBtYXkgY2F0Y2ggZ2VuZXJpYyBFeGNlcHRpb24gKG9yIFRocm93YWJsZSkgYW5kIGhhbmRsZSB0aGUgZXJyb3IgYXBwcm9wcmlhdGVseS4gWW91IHNob3VsZCB0aGluayB2ZXJ5IGNhcmVmdWxseSBiZWZvcmUgZG9pbmcgdGhpcywgdGhvdWdoLCBhbmQgcHV0IGluIGNvbW1lbnRzIGV4cGxhaW5pbmcgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBwbGFjZS4KLTwvcD4KLTxwPkFsdGVybmF0aXZlcyB0byBjYXRjaGluZyBnZW5lcmljIEV4Y2VwdGlvbjoKLTwvcD4KLTx1bD48bGk+Q2F0Y2ggZWFjaCBleGNlcHRpb24gc2VwYXJhdGVseSBhcyBzZXBhcmF0ZSBjYXRjaCBibG9ja3MgYWZ0ZXIgYSBzaW5nbGUgdHJ5LiBUaGlzIGNhbiBiZSBhd2t3YXJkIGJ1dCBpcyBzdGlsbCBwcmVmZXJhYmxlIHRvIGNhdGNoaW5nIGFsbCBFeGNlcHRpb25zLiBCZXdhcmUgcmVwZWF0aW5nIHRvbyBtdWNoIGNvZGUgaW4gdGhlIGNhdGNoIGJsb2Nrcy4KLTwvbGk+Ci08bGk+UmVmYWN0b3IgeW91ciBjb2RlIHRvIGhhdmUgbW9yZSBmaW5lLWdyYWluZWQgZXJyb3IgaGFuZGxpbmcsIHdpdGggbXVsdGlwbGUgdHJ5IGJsb2Nrcy4gU3BsaXQgdXAgdGhlIElPIGZyb20gdGhlIHBhcnNpbmcsIGhhbmRsZSBlcnJvcnMgc2VwYXJhdGVseSBpbiBlYWNoIGNhc2UuCi08L2xpPgotPGxpPlJldGhyb3cgdGhlIGV4Y2VwdGlvbi4gTWFueSB0aW1lcyB5b3UgZG9uJ3QgbmVlZCB0byBjYXRjaCB0aGUgZXhjZXB0aW9uIGF0IHRoaXMgbGV2ZWwgYW55d2F5LCBqdXN0IGxldCB0aGUgbWV0aG9kIHRocm93IGl0LgotPC9saT4KKzxoMj48YSBuYW1lPSJleGNlcHRpb25zQWxsIj48L2E+RXhjZXB0aW9uczogZG8gbm90IGNhdGNoIGdlbmVyaWMgRXhjZXB0aW9uPC9oMj4KKzxwPlNvbWV0aW1lcyBpdCBpcyB0ZW1wdGluZyB0byBiZSBsYXp5IHdoZW4gY2F0Y2hpbmcgZXhjZXB0aW9ucyBhbmQgZG8KK3NvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgorPHByZT50cnkgeworICAgIHNvbWVDb21wbGljYXRlZElPRnVuY3Rpb24oKTsgICAgICAgIC8vIG1heSB0aHJvdyBJT0V4Y2VwdGlvbiAKKyAgICBzb21lQ29tcGxpY2F0ZWRQYXJzaW5nRnVuY3Rpb24oKTsgICAvLyBtYXkgdGhyb3cgUGFyc2luZ0V4Y2VwdGlvbiAKKyAgICBzb21lQ29tcGxpY2F0ZWRTZWN1cml0eUZ1bmN0aW9uKCk7ICAvLyBtYXkgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24gCisgICAgLy8gcGhldywgbWFkZSBpdCBhbGwgdGhlIHdheSAKK30gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7ICAgICAgICAgICAgICAgLy8gSSdsbCBqdXN0IGNhdGNoIGFsbCBleGNlcHRpb25zIAorICAgIGhhbmRsZUVycm9yKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggb25lIGdlbmVyaWMgaGFuZGxlciEKK308L3ByZT4KKzxwPllvdSBzaG91bGQgbm90IGRvIHRoaXMuIEluIGFsbW9zdCBhbGwgY2FzZXMgaXQgaXMgaW5hcHByb3ByaWF0ZSB0byBjYXRjaAorZ2VuZXJpYyBFeGNlcHRpb24gb3IgVGhyb3dhYmxlLCBwcmVmZXJhYmx5IG5vdCBUaHJvd2FibGUsIGJlY2F1c2UgaXQgaW5jbHVkZXMKK0Vycm9yIGV4Y2VwdGlvbnMgYXMgd2VsbC4gSXQgaXMgdmVyeSBkYW5nZXJvdXMuIEl0IG1lYW5zIHRoYXQgRXhjZXB0aW9ucyB5b3UKK25ldmVyIGV4cGVjdGVkIChpbmNsdWRpbmcgUnVudGltZUV4Y2VwdGlvbnMgbGlrZSBDbGFzc0Nhc3RFeGNlcHRpb24pIGVuZCB1cAorZ2V0dGluZyBjYXVnaHQgaW4gYXBwbGljYXRpb24tbGV2ZWwgZXJyb3IgaGFuZGxpbmcuIEl0IG9ic2N1cmVzIHRoZSBmYWlsdXJlCitoYW5kbGluZyBwcm9wZXJ0aWVzIG9mIHlvdXIgY29kZS4gSXQgbWVhbnMgaWYgc29tZW9uZSBhZGRzIGEgbmV3IHR5cGUgb2YKK0V4Y2VwdGlvbiBpbiB0aGUgY29kZSB5b3UncmUgY2FsbGluZywgdGhlIGNvbXBpbGVyIHdvbid0IGhlbHAgeW91IHJlYWxpemUgeW91CituZWVkIHRvIGhhbmRsZSB0aGF0IGVycm9yIGRpZmZlcmVudGx5LiBBbmQgaW4gbW9zdCBjYXNlcyB5b3Ugc2hvdWxkbid0IGJlCitoYW5kbGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgZXhjZXB0aW9uIHRoZSBzYW1lIHdheSwgYW55d2F5LjwvcD4KKzxwPlRoZXJlIGFyZSByYXJlIGV4Y2VwdGlvbnMgdG8gdGhpcyBydWxlOiBjZXJ0YWluIHRlc3QgY29kZSBhbmQgdG9wLWxldmVsCitjb2RlIHdoZXJlIHlvdSB3YW50IHRvIGNhdGNoIGFsbCBraW5kcyBvZiBlcnJvcnMgKHRvIHByZXZlbnQgdGhlbSBmcm9tIHNob3dpbmcKK3VwIGluIGEgVUksIG9yIHRvIGtlZXAgYSBiYXRjaCBqb2IgcnVubmluZykuIEluIHRoYXQgY2FzZSB5b3UgbWF5IGNhdGNoCitnZW5lcmljIEV4Y2VwdGlvbiAob3IgVGhyb3dhYmxlKSBhbmQgaGFuZGxlIHRoZSBlcnJvciBhcHByb3ByaWF0ZWx5LiBZb3UKK3Nob3VsZCB0aGluayB2ZXJ5IGNhcmVmdWxseSBiZWZvcmUgZG9pbmcgdGhpcywgdGhvdWdoLCBhbmQgcHV0IGluIGNvbW1lbnRzCitleHBsYWluaW5nIHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgcGxhY2UuPC9wPgorPHA+QWx0ZXJuYXRpdmVzIHRvIGNhdGNoaW5nIGdlbmVyaWMgRXhjZXB0aW9uOjwvcD4KKzx1bD4KKzxsaT5DYXRjaCBlYWNoIGV4Y2VwdGlvbiBzZXBhcmF0ZWx5IGFzIHNlcGFyYXRlIGNhdGNoIGJsb2NrcyBhZnRlciBhIHNpbmdsZQordHJ5LiBUaGlzIGNhbiBiZSBhd2t3YXJkIGJ1dCBpcyBzdGlsbCBwcmVmZXJhYmxlIHRvIGNhdGNoaW5nIGFsbCBFeGNlcHRpb25zLgorQmV3YXJlIHJlcGVhdGluZyB0b28gbXVjaCBjb2RlIGluIHRoZSBjYXRjaCBibG9ja3MuPC9saT4KKzxsaT5SZWZhY3RvciB5b3VyIGNvZGUgdG8gaGF2ZSBtb3JlIGZpbmUtZ3JhaW5lZCBlcnJvciBoYW5kbGluZywgd2l0aCBtdWx0aXBsZQordHJ5IGJsb2Nrcy4gU3BsaXQgdXAgdGhlIElPIGZyb20gdGhlIHBhcnNpbmcsIGhhbmRsZSBlcnJvcnMgc2VwYXJhdGVseSBpbiBlYWNoCitjYXNlLjwvbGk+Cis8bGk+UmV0aHJvdyB0aGUgZXhjZXB0aW9uLiBNYW55IHRpbWVzIHlvdSBkb24ndCBuZWVkIHRvIGNhdGNoIHRoZSBleGNlcHRpb24gYXQKK3RoaXMgbGV2ZWwgYW55d2F5LCBqdXN0IGxldCB0aGUgbWV0aG9kIHRocm93IGl0LjwvbGk+CiA8L3VsPgotUmVtZW1iZXI6IGV4Y2VwdGlvbnMgYXJlIHlvdXIgZnJpZW5kISBXaGVuIHRoZSBjb21waWxlciBjb21wbGFpbnMgeW91J3JlIG5vdCBjYXRjaGluZyBhbiBleGNlcHRpb24sIGRvbid0IHNjb3dsLiBTbWlsZTogdGhlIGNvbXBpbGVyIGp1c3QgbWFkZSBpdCBlYXNpZXIgZm9yIHlvdSB0byBjYXRjaCBydW50aW1lIHByb2JsZW1zIGluIHlvdXIgY29kZS4KLTxoMj48YT5GaW5hbGl6ZXJzPC9hPgotPC9oMj4KLTxwPjxiPldoYXQgaXQgaXM8L2I+Ci06IEZpbmFsaXplcnMgYXJlIGEgd2F5IHRvIGhhdmUgYSBjaHVuayBvZiBjb2RlIGV4ZWN1dGVkIHdoZW4gYW4gb2JqZWN0IGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotPC9wPgotPHA+PGI+UHJvczwvYj4KLTogY2FuIGJlIGhhbmR5IGZvciBkb2luZyBjbGVhbnVwLCBwYXJ0aWN1bGFybHkgb2YgZXh0ZXJuYWwgcmVzb3VyY2VzLgotPC9wPgotPHA+PGI+Q29uczwvYj4KLTogdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYXMgdG8gd2hlbiBhIGZpbmFsaXplciB3aWxsIGJlIGNhbGxlZCwgb3IgZXZlbiB0aGF0IGl0IHdpbGwgYmUgY2FsbGVkIGF0IGFsbC4KLTwvcD4KLTxwPjxiPkRlY2lzaW9uPC9iPgotOiB3ZSBkb24ndCB1c2UgZmluYWxpemVycy4gSW4gbW9zdCBjYXNlcywgeW91IGNhbiBkbyB3aGF0IHlvdSBuZWVkIGZyb20gYSBmaW5hbGl6ZXIgd2l0aCBnb29kIGV4Y2VwdGlvbiBoYW5kbGluZy4gSWYgeW91IGFic29sdXRlbHkgbmVlZCBpdCwgZGVmaW5lIGEgY2xvc2UoKSBtZXRob2QgKG9yIHRoZSBsaWtlKSBhbmQgZG9jdW1lbnQgZXhhY3RseSB3aGVuIHRoYXQgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZC4gU2VlIElucHV0U3RyZWFtIGZvciBhbiBleGFtcGxlLiBJbiB0aGlzIGNhc2UgaXQgaXMgYXBwcm9wcmlhdGUgYnV0IG5vdCByZXF1aXJlZCB0byBwcmludCBhIHNob3J0IGxvZyBtZXNzYWdlIGZyb20gdGhlIGZpbmFsaXplciwgYXMgbG9uZyBhcyBpdCBpcyBub3QgZXhwZWN0ZWQgdG8gZmxvb2QgdGhlIGxvZ3MuCi08L3A+Ci08cD5UaGUgb25lIGV4Y2VwdGlvbiBpcyBpdCBpcyBPSyB0byB3cml0ZSBhIGZpbmFsaXplciBpZiBhbGwgaXQgZG9lcyBpcyBtYWtlIGNhbGxzIHRvIFguYXNzZXJ0VHJ1ZSgpLgotPC9wPgotPGgyPjxhPkltcG9ydHM8L2E+Ci08L2gyPgotPGgzPgotV2lsZGNhcmRzIGluIGltcG9ydHMKLTwvaDM+Ci08cD48Yj5XaGF0IGl0IGlzPC9iPgotOiBXaGVuIHlvdSB3YW50IHRvIHVzZSBjbGFzcyBCYXIgZnJvbSBwYWNrYWdlIGZvbyx0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHdheXMgdG8gaW1wb3J0IGl0OgotPC9wPgotPG9sPjxsaT5pbXBvcnQgZm9vLio7Ci08L2xpPgotPGxpPmltcG9ydCBmb28uQmFyOwotPC9saT4KKzxwPlJlbWVtYmVyOiBleGNlcHRpb25zIGFyZSB5b3VyIGZyaWVuZCEgV2hlbiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHlvdSdyZQorbm90IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiwgZG9uJ3Qgc2Nvd2wuIFNtaWxlOiB0aGUgY29tcGlsZXIganVzdCBtYWRlIGl0CitlYXNpZXIgZm9yIHlvdSB0byBjYXRjaCBydW50aW1lIHByb2JsZW1zIGluIHlvdXIgY29kZS48L3A+Cis8aDI+PGEgbmFtZT0iZmluYWxpemVycyI+PC9hPkZpbmFsaXplcnM8L2gyPgorPHA+PGI+V2hhdCBpdCBpczwvYj46IEZpbmFsaXplcnMgYXJlIGEgd2F5IHRvIGhhdmUgYSBjaHVuayBvZiBjb2RlIGV4ZWN1dGVkCit3aGVuIGFuIG9iamVjdCBpcyBnYXJiYWdlIGNvbGxlY3RlZC48L3A+Cis8cD48Yj5Qcm9zPC9iPjogY2FuIGJlIGhhbmR5IGZvciBkb2luZyBjbGVhbnVwLCBwYXJ0aWN1bGFybHkgb2YgZXh0ZXJuYWwKK3Jlc291cmNlcy48L3A+Cis8cD48Yj5Db25zPC9iPjogdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYXMgdG8gd2hlbiBhIGZpbmFsaXplciB3aWxsIGJlIGNhbGxlZCwKK29yIGV2ZW4gdGhhdCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBhbGwuPC9wPgorPHA+PGI+RGVjaXNpb248L2I+OiB3ZSBkb24ndCB1c2UgZmluYWxpemVycy4gSW4gbW9zdCBjYXNlcywgeW91IGNhbiBkbyB3aGF0Cit5b3UgbmVlZCBmcm9tIGEgZmluYWxpemVyIHdpdGggZ29vZCBleGNlcHRpb24gaGFuZGxpbmcuIElmIHlvdSBhYnNvbHV0ZWx5IG5lZWQKK2l0LCBkZWZpbmUgYSBjbG9zZSgpIG1ldGhvZCAob3IgdGhlIGxpa2UpIGFuZCBkb2N1bWVudCBleGFjdGx5IHdoZW4gdGhhdAorbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZC4gU2VlIElucHV0U3RyZWFtIGZvciBhbiBleGFtcGxlLiBJbiB0aGlzIGNhc2UgaXQgaXMKK2FwcHJvcHJpYXRlIGJ1dCBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYSBzaG9ydCBsb2cgbWVzc2FnZSBmcm9tIHRoZSBmaW5hbGl6ZXIsCithcyBsb25nIGFzIGl0IGlzIG5vdCBleHBlY3RlZCB0byBmbG9vZCB0aGUgbG9ncy48L3A+Cis8aDI+PGEgbmFtZT0iaW1wb3J0cyI+PC9hPkltcG9ydHM8L2gyPgorPGgzPldpbGRjYXJkcyBpbiBpbXBvcnRzPC9oMz4KKzxwPjxiPldoYXQgaXQgaXM8L2I+OiBXaGVuIHlvdSB3YW50IHRvIHVzZSBjbGFzcyBCYXIgZnJvbSBwYWNrYWdlIGZvbyx0aGVyZQorYXJlIHR3byBwb3NzaWJsZSB3YXlzIHRvIGltcG9ydCBpdDo8L3A+Cis8b2w+Cis8bGk+PGNvZGU+aW1wb3J0IGZvby4qOzwvY29kZT48L2xpPgorPGxpPjxjb2RlPmltcG9ydCBmb28uQmFyOzwvY29kZT48L2xpPgogPC9vbD4KLTxwPjxiPlByb3Mgb2YgIzE8L2I+Ci06IFBvdGVudGlhbGx5IHJlZHVjZXMgdGhlIG51bWJlciBvZiBpbXBvcnQgc3RhdGVtZW50cy4KKzxwPjxiPlByb3Mgb2YgIzE8L2I+OiBQb3RlbnRpYWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2YgaW1wb3J0IHN0YXRlbWVudHMuCiA8L3A+Ci08cD48Yj5Qcm9zIG9mICMyPC9iPgotOiBNYWtlcyBpdCBvYnZpb3VzIHdoYXQgY2xhc3NlcyBhcmUgYWN0dWFsbHkgdXNlZC4gTWFrZXMgY29kZSBtb3JlIHJlYWRhYmxlIGZvciBtYWludGFpbmVycy4KLTwvcD4KLTxwPjxiPkRlY2lzaW9uPC9iPgotOlVzZSBzdHlsZSAjMiBmb3IgaW1wb3J0aW5nIGFsbCBBbmRyb2lkIGNvZGUuIEFuIGV4cGxpY2l0IGV4Y2VwdGlvbiBpcyBtYWRlIGZvciBqYXZhIHN0YW5kYXJkIGxpYnJhcmllcyAoamF2YS51dGlsLiosIGphdmEuaW8uKiwgZXRjLikgYW5kIHVuaXQgdGVzdCBjb2RlIChqdW5pdC5mcmFtZXdvcmsuKikuCi08L3A+Ci08aDI+PGE+Q29tbWVudHMvSmF2YWRvYzwvYT4KLTwvaDI+Ci08cD5FdmVyeSBmaWxlIHNob3VsZCBoYXZlIGEgY29weXJpZ2h0IHN0YXRlbWVudCBhdCB0aGUgdG9wLiBUaGVuIGEgcGFja2FnZSBzdGF0ZW1lbnQgYW5kIGltcG9ydCBzdGF0ZW1lbnRzIHNob3VsZCBmb2xsb3csIGVhY2ggYmxvY2sgc2VwYXJhdGVkIGJ5IGEgYmxhbmsgbGluZS4gQW5kIHRoZW4gdGhlcmUgaXMgdGhlIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbi4gSW4gdGhlIEphdmFkb2MgY29tbWVudHMsIGRlc2NyaWJlIHdoYXQgdGhlIGNsYXNzIG9yIGludGVyZmFjZSBkb2VzLgotPC9wPgotPHByZT4vKjxicj4qIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IDxicj4qPGJyPiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7PGJyPiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLjxicj4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCA8YnI+Kjxicj4qICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPGJyPio8YnI+KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIDxicj4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsPGJyPiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuPGJyPiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCA8YnI+KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS48YnI+Ki88YnI+PGJyPnBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuZm9vOzxicj48YnI+aW1wb3J0IGFuZHJvaWQub3MuQmxhaDs8YnI+aW1wb3J0IGFuZHJvaWQudmlldy5ZYWRhOzxicj48YnI+aW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDs8YnI+aW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjs8YnI+PGJyPi8qKjxicj4qIERvZXMgWCBhbmQgWSBhbmQgcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gZm9yIFouPGJyPiovPGJyPnB1YmxpYyBjbGFzcyBGb28gezxicj4uLi48YnI+fTxicj48L3ByZT4KLTxwPkV2ZXJ5IGNsYXNzIGFuZCBub250cml2aWFsIHB1YmxpYyBtZXRob2QgeW91IHdyaXRlIDxiPm11c3Q8L2I+Ci1jb250YWluIGEgSmF2YWRvYyBjb21tZW50IHdpdGggYXQgbGVhc3Qgb25lIHNlbnRlbmNlIGRlc2NyaWJpbmcgd2hhdCB0aGUgY2xhc3Mgb3IgbWV0aG9kIGRvZXMuIFRoaXMgc2VudGVuY2Ugc2hvdWxkIHN0YXJ0IHdpdGggYSAzcmQgcGVyc29uIGRlc2NyaXB0aXZlIHZlcmIuIEV4YW1wbGVzOgotPC9wPgotPHByZT4vKiogUmV0dXJucyB0aGUgY29ycmVjdGx5IHJvdW5kZWQgcG9zaXRpdmUgc3F1YXJlIHJvb3Qgb2YgYSBkb3VibGUgdmFsdWUuICovPGJyPnN0YXRpYyBkb3VibGUgc3FydChkb3VibGUgYSkgezxicj59PGJyPjxicj4vKio8YnI+KiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZyBieSBjb252ZXJ0aW5nIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgPGJyPiogYnl0ZXMgdXNpbmcgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPGJyPiovPGJyPnB1YmxpYyBTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7PGJyPn08YnI+PC9wcmU+Ci08cD5Zb3UgZG8gbm90IG5lZWQgdG8gd3JpdGUgSmF2YWRvYyBmb3IgdHJpdmlhbCBnZXQgYW5kIHNldCBtZXRob2RzIHN1Y2ggYXMgc2V0Rm9vKCkgaWYgYWxsIHlvdXIgSmF2YWRvYyB3b3VsZCBzYXkgaXMgInNldHMgRm9vIi4gSWYgdGhlIG1ldGhvZCBkb2VzIHNvbWV0aGluZyBtb3JlIGNvbXBsZXggKHN1Y2ggYXMgZW5mb3JjaW5nIGEgY29uc3RyYWludCBvciBoYXZpbmcgYW4gaW1wb3J0YW50IHNpZGUgZWZmZWN0KSwgdGhlbiB5b3UgbXVzdCBkb2N1bWVudCBpdC4gQW5kIGlmIGl0J3Mgbm90IG9idmlvdXMgd2hhdCB0aGUgcHJvcGVydHkgIkZvbyIgbWVhbnMsIHlvdSBzaG91bGQgZG9jdW1lbnQgaXQuCi08L3A+Ci08cD5FdmVyeSBtZXRob2QgeW91IHdyaXRlLCB3aGV0aGVyIHB1YmxpYyBvciBvdGhlcndpc2UsIHdvdWxkIGJlbmVmaXQgZnJvbSBKYXZhZG9jLiBQdWJsaWMgbWV0aG9kcyBhcmUgcGFydCBvZiBhbiBBUEkgYW5kIHRoZXJlZm9yZSByZXF1aXJlIEphdmFkb2MuCi08L3A+Ci1BbmRyb2lkIGRvZXMgbm90IGN1cnJlbnRseSBlbmZvcmNlIGEgc3BlY2lmaWMgc3R5bGUgZm9yIHdyaXRpbmcgSmF2YWRvYyBjb21tZW50cywgYnV0IHlvdSA8Yj5zaG91bGQ8L2I+Ci1mb2xsb3cgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9qYXZhZG9jL3dyaXRpbmdkb2Njb21tZW50cy8iPlN1biBKYXZhZG9jIGNvbnZlbnRpb25zPC9hPgotLgotPGgyPjxhPlNob3J0IG1ldGhvZHM8L2E+Ci08L2gyPgotVG8gdGhlIGV4dGVudCB0aGF0IGl0IGlzIGZlYXNpYmxlLCBtZXRob2RzIHNob3VsZCBiZSBrZXB0IHNtYWxsIGFuZCBmb2N1c2VkLiBJdCBpcywgaG93ZXZlciwgcmVjb2duaXplZCB0aGF0IGxvbmcgbWV0aG9kcyBhcmUgc29tZXRpbWVzIGFwcHJvcHJpYXRlLCBzbyBubyBoYXJkIGxpbWl0IGlzIHBsYWNlZCBvbiBtZXRob2QgbGVuZ3RoLiBJZiBhIG1ldGhvZCBleGNlZWRzIDQwIGxpbmVzIG9yIHNvLCB0aGluayBhYm91dCB3aGV0aGVyIGl0IGNhbiBiZSBicm9rZW4gdXAgd2l0aG91dCBoYXJtaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2dyYW0uCi08aDI+PGE+TG9jYWwgdmFyaWFibGVzPC9hPgotPC9oMj4KLVRoZSBzY29wZSBvZiBsb2NhbCB2YXJpYWJsZXMgc2hvdWxkIGJlIGtlcHQgdG8gYSBtaW5pbXVtICg8aT5FZmZlY3RpdmUgSmF2YTwvaT4KLUl0ZW0gMjkpLiBCeSBkb2luZyBzbywgeW91IGluY3JlYXNlIHRoZSByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5IG9mIHlvdXIgY29kZSBhbmQgcmVkdWNlIHRoZSBsaWtlbGlob29kIG9mIGVycm9yLiBFYWNoIHZhcmlhYmxlIHNob3VsZCBiZSBkZWNsYXJlZCBpbiB0aGUgaW5uZXJtb3N0IGJsb2NrIHRoYXQgZW5jbG9zZXMgYWxsIHVzZXMgb2YgdGhlIHZhcmlhYmxlLgotPHA+TG9jYWwgdmFyaWFibGVzIHNob3VsZCBiZSBkZWNsYXJlZCBhdCB0aGUgcG9pbnQgdGhleSBhcmUgZmlyc3QgdXNlZC4gTmVhcmx5IGV2ZXJ5IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHNob3VsZCBjb250YWluIGFuIGluaXRpYWxpemVyLiBJZiB5b3UgZG9uJ3QgeWV0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGluaXRpYWxpemUgYSB2YXJpYWJsZSBzZW5zaWJseSwgeW91IHNob3VsZCBwb3N0cG9uZSB0aGUgZGVjbGFyYXRpb24gdW50aWwgeW91IGRvLgotPC9wPgotPHA+T25lIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgY29uY2VybnMgdHJ5LWNhdGNoIHN0YXRlbWVudHMuIElmIGEgdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgbWV0aG9kIHRoYXQgdGhyb3dzIGEgY2hlY2tlZCBleGNlcHRpb24sIGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgaW5zaWRlIGEgdHJ5IGJsb2NrLiBJZiB0aGUgdmFsdWUgbXVzdCBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHRyeSBibG9jaywgdGhlbiBpdCBtdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSB0aGUgdHJ5IGJsb2NrLCB3aGVyZSBpdCBjYW5ub3QgeWV0IGJlIHNlbnNpYmx5IGluaXRpYWxpemVkOgotPC9wPgotPHByZT4vLyBJbnN0YW50aWF0ZSBjbGFzcyBjbCwgd2hpY2ggcmVwcmVzZW50cyBzb21lIHNvcnQgb2YgU2V0IDxicj5TZXQgcyA9IG51bGw7PGJyPnRyeSB7PGJyPnMgPSAoU2V0KSBjbC5uZXdJbnN0YW5jZSgpOzxicj59IGNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgezxicj50aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgYWNjZXNzaWJsZSIpOzxicj59IGNhdGNoKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgezxicj50aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgaW5zdGFudGlhYmxlIik7PGJyPn08YnI+PGJyPi8vIEV4ZXJjaXNlIHRoZSBzZXQgPGJyPnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJncykpOzxicj48L3ByZT4KLTxwPkJ1dCBldmVuIHRoaXMgY2FzZSBjYW4gYmUgYXZvaWRlZCBieSBlbmNhcHN1bGF0aW5nIHRoZSB0cnktY2F0Y2ggYmxvY2sgaW4gYSBtZXRob2Q6Ci08L3A+Ci08cHJlPlNldCBjcmVhdGVTZXQoQ2xhc3MgY2wpIHs8YnI+Ly8gSW5zdGFudGlhdGUgY2xhc3MgY2wsIHdoaWNoIHJlcHJlc2VudHMgc29tZSBzb3J0IG9mIFNldCA8YnI+dHJ5IHs8YnI+cmV0dXJuIChTZXQpIGNsLm5ld0luc3RhbmNlKCk7PGJyPn0gY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7PGJyPnRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2wgKyAiIG5vdCBhY2Nlc3NpYmxlIik7PGJyPn0gY2F0Y2goSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7PGJyPnRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2wgKyAiIG5vdCBpbnN0YW50aWFibGUiKTs8YnI+fTxicj59PGJyPi4uLjxicj4vLyBFeGVyY2lzZSB0aGUgc2V0IDxicj5TZXQgcyA9IGNyZWF0ZVNldChjbCk7PGJyPnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJncykpOzxicj48L3ByZT4KLUxvb3AgdmFyaWFibGVzIHNob3VsZCBiZSBkZWNsYXJlZCBpbiB0aGUgZm9yIHN0YXRlbWVudCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgY29tcGVsbGluZyByZWFzb24gdG8gZG8gb3RoZXJ3aXNlOgotPHByZT5mb3IgKGludCBpID0gMDsgaSBuOyBpKyspIHs8YnI+ZG9Tb21ldGhpbmcoaSk7PGJyPn08YnI+PGJyPmZvciAoSXRlcmF0b3IgaSA9IGMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgezxicj5kb1NvbWV0aGluZ0Vsc2UoaS5uZXh0KCkpOzxicj59PGJyPjxicj48YnI+PC9wcmU+Ci08aDI+PGE+SW1wb3J0czwvYT4KLTwvaDI+Ci1UaGUgb3JkZXJpbmcgb2YgaW1wb3J0IHN0YXRlbWVudHMgaXM6QW5kcm9pZCBpbXBvcnRzSW1wb3J0cyBmcm9tIHRoaXJkIHBhcnRpZXMgKGNvbSwganVuaXQsIG5ldCwgb3JnKTxicj5qYXZhIGFuZCBqYXZheAotPHA+VG8gZXhhY3RseSBtYXRjaCB0aGUgSURFIHNldHRpbmdzLCB0aGUgaW1wb3J0cyBzaG91bGQgYmU6Ci08L3A+Ci1BbHBoYWJldGljYWwgd2l0aGluIGVhY2ggZ3JvdXBpbmcuPGJyPkNhcGl0YWwgbGV0dGVycyBhcmUgY29uc2lkZXJlZCB0byBjb21lIGJlZm9yZSBsb3dlciBjYXNlIGxldHRlciAoZS5nLiBaIGJlZm9yZSBhKS5UaGVyZSBzaG91bGQgYmUgYSBibGFuayBsaW5lIGJldHdlZW4gZWFjaCBtYWpvciBncm91cGluZyAoYW5kcm9pZCwgY29tLCBqdW5pdCwgbmV0LCBvcmcsIGphdmEsIGphdmF4KS4KLTxoND4KLVdoeT8KLTwvaDQ+Ci08cD5PcmlnaW5hbGx5IHRoZXJlIHdhcyBubyBzdHlsZSByZXF1aXJlbWVudCBvbiB0aGUgb3JkZXJpbmcuIFRoaXMgbWVhbnQgdGhhdCB0aGUgSURFJ3Mgd2VyZSBlaXRoZXIgYWx3YXlzIGNoYW5naW5nIHRoZSBvcmRlcmluZywgb3IgSURFIGRldmVsb3BlcnMgaGFkIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBpbXBvcnQgbWFuYWdlbWVudCBmZWF0dXJlcyBhbmQgbWFpbnRhaW4gdGhlIGltcG9ydHMgYnkgaGFuZC4gVGhpcyB3YXMgZGVlbWVkIGJhZC4gV2hlbiBqYXZhLXN0eWxlIHdhcyBhc2tlZCwgdGhlIHByZWZlcnJlZCBzdHlsZXMgd2VyZSBhbGwgb3ZlciB0aGUgbWFwLiBJdCBwcmV0dHkgbXVjaCBjYW1lIGRvd24gdG8gb3VyIG5lZWRpbmcgdG8gInBpY2sgYW4gb3JkZXJpbmcgYW5kIGJlIGNvbnNpc3RlbnQuIiBTbyB3ZSBjaG9zZSBhIHN0eWxlLCB1cGRhdGVkIHRoZSBqYXZhZ3VpZGUgYW5kIG1hZGUgdGhlIElERSdzIG9iZXkgaXQuIFdlIGV4cGVjdCB0aGF0IGFzIElERSB1c2VycyB3b3JrIG9uIHRoZSBjb2RlLCB0aGUgaW1wb3J0cyBpbiBhbGwgb2YgdGhlIHBhY2thZ2VzIHdpbGwgZW5kIHVwIG1hdGNoaW5nIHRoaXMgcGF0dGVybiB3aXRob3V0IGFueSBleHRyYSBlbmdpbmVlcmluZyBlZmZvcnQuCi08L3A+Ci08cD5UaGUgc3R5bGUgY2hvc2VuIHN1Y2ggdGhhdDoKLTwvcD4KLVRoZSBpbXBvcnRzIHBlb3BsZSB3YW50IHRvIGxvb2sgYXQgZmlyc3QgdGVuZCB0byBiZSBhdCB0aGUgdG9wIChhbmRyb2lkKVRoZSBpbXBvcnRzIHBlb3BsZSB3YW50IHRvIGxvb2sgYXQgbGVhc3QgdGVuZCB0byBiZSBhdCB0aGUgYm90dG9tIChqYXZhKUh1bWFucyBjYW4gZWFzaWx5IGZvbGxvdyB0aGUgc3R5bGVUaGUgSURFJ3MgY2FuIGZvbGxvdyB0aGUgc3R5bGUKLTxoMz4KLVdoYXQgYWJvdXQgc3RhdGljIGltcG9ydHM/Ci08L2gzPgotVGhlIHVzZSBhbmQgbG9jYXRpb24gb2Ygc3RhdGljIGltcG9ydHMgaGF2ZSBiZWVuIG1pbGRseSBjb250cm92ZXJzaWFsIGlzc3Vlcy4gU29tZSBwZW9wbGUgd291bGQgcHJlZmVyIHN0YXRpYyBpbXBvcnRzIHRvIGJlIGludGVyc3BlcnNlZCB3aXRoIHRoZSByZW1haW5pbmcgaW1wb3J0cywgc29tZSB3b3VsZCBwcmVmZXIgdGhlbSByZXNpZGUgYWJvdmUgb3IgYmVsb3cgYWxsIG90aGVyIGltcG9ydHMuIEFkZGl0aW5hbGx5LCB3ZSBoYXZlIG5vdCB5ZXQgY29tZSB1cCB3aXRoIGEgd2F5IHRvIG1ha2UgYWxsIElERXMgdXNlIHRoZSBzYW1lIG9yZGVyaW5nLgotPHA+U2luY2UgbW9zdCBwZW9wbGUgY29uc2lkZXIgdGhpcyBhIGxvdyBwcmlvcml0eSBpc3N1ZSwganVzdCB1c2UgeW91ciBqdWRnZW1lbnQgYW5kIHBsZWFzZSBiZSBjb25zaXN0ZW50LgotPC9wPgorPHA+PGI+UHJvcyBvZiAjMjwvYj46IE1ha2VzIGl0IG9idmlvdXMgd2hhdCBjbGFzc2VzIGFyZSBhY3R1YWxseSB1c2VkLiBNYWtlcworY29kZSBtb3JlIHJlYWRhYmxlIGZvciBtYWludGFpbmVycy4gPC9wPgorPHA+PGI+RGVjaXNpb248L2I+OiBVc2Ugc3R5bGUgIzIgZm9yIGltcG9ydGluZyBhbGwgQW5kcm9pZCBjb2RlLiBBbiBleHBsaWNpdAorZXhjZXB0aW9uIGlzIG1hZGUgZm9yIGphdmEgc3RhbmRhcmQgbGlicmFyaWVzIChqYXZhLnV0aWwuKiwgamF2YS5pby4qLCBldGMuKQorYW5kIHVuaXQgdGVzdCBjb2RlIChqdW5pdC5mcmFtZXdvcmsuKikuPC9wPgorPGgyPjxhIG5hbWU9ImphdmFkb2MiPjwvYT5Db21tZW50cy9KYXZhZG9jPC9oMj4KKzxwPkV2ZXJ5IGZpbGUgc2hvdWxkIGhhdmUgYSBjb3B5cmlnaHQgc3RhdGVtZW50IGF0IHRoZSB0b3AuIFRoZW4gYSBwYWNrYWdlCitzdGF0ZW1lbnQgYW5kIGltcG9ydCBzdGF0ZW1lbnRzIHNob3VsZCBmb2xsb3csIGVhY2ggYmxvY2sgc2VwYXJhdGVkIGJ5IGEgYmxhbmsKK2xpbmUuIEFuZCB0aGVuIHRoZXJlIGlzIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIEluIHRoZSBKYXZhZG9jCitjb21tZW50cywgZGVzY3JpYmUgd2hhdCB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGRvZXMuPC9wPgorPHByZT4vKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKLTxoMj48YT5JbmRlbnRhdGlvbjwvYT4KLTwvaDI+Ci08cD5XZSB1c2UgNCBzcGFjZSBpbmRlbnRzIGZvciBibG9ja3MuIFdlIG5ldmVyIHVzZSB0YWJzLiBXaGVuIGluIGRvdWJ0LCBiZSBjb25zaXN0ZW50IHdpdGggY29kZSBhcm91bmQgeW91LgotPC9wPgotPHA+V2UgdXNlIDggc3BhY2UgaW5kZW50cyBmb3IgbGluZSB3cmFwcywgaW5jbHVkaW5nIGZ1bmN0aW9uIGNhbGxzIGFuZCBhc3NpZ25tZW50cy4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgY29ycmVjdDoKLTwvcD4KLTxwcmU+SW5zdHJ1bWVudCBpIDxicj49IHNvbWVMb25nRXhwcmVzc2lvbih0aGF0LCB3b3VsZE5vdEZpdCwgb24sIG9uZSwgbGluZSk7PC9wcmU+Ci1hbmQgdGhpcyBpcyBub3QgY29ycmVjdDoKLTxwcmU+SW5zdHJ1bWVudCBpIDxicj49IHNvbWVMb25nRXhwcmVzc2lvbih0aGF0LCB3b3VsZE5vdEZpdCwgb24sIG9uZSwgbGluZSk7PC9wcmU+Ci08aDI+PGE+RmllbGQgTmFtZXM8L2E+Ci08L2gyPgotPHVsPjxsaT5Ob24tcHVibGljLCBub24tc3RhdGljIGZpZWxkIG5hbWVzIHN0YXJ0IHdpdGggbS4KLTwvbGk+Ci08bGk+U3RhdGljIGZpZWxkIG5hbWVzIHN0YXJ0IHdpdGggcy4KLTwvbGk+Ci08bGk+T3RoZXIgZmllbGRzIHN0YXJ0IHdpdGggYSBsb3dlciBjYXNlIGxldHRlci4KLTwvbGk+Ci08bGk+UHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMgKGNvbnN0YW50cykgYXJlIEFMTF9DQVBTX1dJVEhfVU5ERVJTQ09SRVMuCi08L2xpPgorcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5mb287CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJsYWg7CitpbXBvcnQgYW5kcm9pZC52aWV3LllhZGE7CisKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCisvKioKKyAqIERvZXMgWCBhbmQgWSBhbmQgcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gZm9yIFouCisgKi8KK3B1YmxpYyBjbGFzcyBGb28geworICAgIC4uLgorfTwvcHJlPgorPHA+RXZlcnkgY2xhc3MgYW5kIG5vbnRyaXZpYWwgcHVibGljIG1ldGhvZCB5b3Ugd3JpdGUgPGI+bXVzdDwvYj4gY29udGFpbiBhCitKYXZhZG9jIGNvbW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgc2VudGVuY2UgZGVzY3JpYmluZyB3aGF0IHRoZSBjbGFzcyBvciBtZXRob2QKK2RvZXMuIFRoaXMgc2VudGVuY2Ugc2hvdWxkIHN0YXJ0IHdpdGggYSAzcmQgcGVyc29uIGRlc2NyaXB0aXZlIHZlcmIuCitFeGFtcGxlczo8L3A+Cis8cHJlPi8qKiBSZXR1cm5zIHRoZSBjb3JyZWN0bHkgcm91bmRlZCBwb3NpdGl2ZSBzcXVhcmUgcm9vdCBvZiBhIGRvdWJsZSB2YWx1ZS4gKi8KK3N0YXRpYyBkb3VibGUgc3FydChkb3VibGUgYSkgeworfQorCisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgU3RyaW5nIGJ5IGNvbnZlcnRpbmcgdGhlIHNwZWNpZmllZCBhcnJheSBvZiAKKyAqIGJ5dGVzIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLgorICovCitwdWJsaWMgU3RyaW5nKGJ5dGVbXSBieXRlcykgeworfTwvcHJlPgorPHA+WW91IGRvIG5vdCBuZWVkIHRvIHdyaXRlIEphdmFkb2MgZm9yIHRyaXZpYWwgZ2V0IGFuZCBzZXQgbWV0aG9kcyBzdWNoIGFzCitzZXRGb28oKSBpZiBhbGwgeW91ciBKYXZhZG9jIHdvdWxkIHNheSBpcyAic2V0cyBGb28iLiBJZiB0aGUgbWV0aG9kIGRvZXMKK3NvbWV0aGluZyBtb3JlIGNvbXBsZXggKHN1Y2ggYXMgZW5mb3JjaW5nIGEgY29uc3RyYWludCBvciBoYXZpbmcgYW4gaW1wb3J0YW50CitzaWRlIGVmZmVjdCksIHRoZW4geW91IG11c3QgZG9jdW1lbnQgaXQuIEFuZCBpZiBpdCdzIG5vdCBvYnZpb3VzIHdoYXQgdGhlCitwcm9wZXJ0eSAiRm9vIiBtZWFucywgeW91IHNob3VsZCBkb2N1bWVudCBpdC48L3A+Cis8cD5FdmVyeSBtZXRob2QgeW91IHdyaXRlLCB3aGV0aGVyIHB1YmxpYyBvciBvdGhlcndpc2UsIHdvdWxkIGJlbmVmaXQgZnJvbQorSmF2YWRvYy4gUHVibGljIG1ldGhvZHMgYXJlIHBhcnQgb2YgYW4gQVBJIGFuZCB0aGVyZWZvcmUgcmVxdWlyZSBKYXZhZG9jLjwvcD4KKzxwPkFuZHJvaWQgZG9lcyBub3QgY3VycmVudGx5IGVuZm9yY2UgYSBzcGVjaWZpYyBzdHlsZSBmb3Igd3JpdGluZyBKYXZhZG9jCitjb21tZW50cywgYnV0IHlvdSA8Yj5zaG91bGQ8L2I+IGZvbGxvdyB0aGUgPGEKK2hyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9qYXZhZG9jL3dyaXRpbmdkb2Njb21tZW50cy8iPlN1biBKYXZhZG9jCitjb252ZW50aW9uczwvYT4uPC9wPgorPGgyPjxhIG5hbWU9InNob3J0bWV0aG9kcyI+PC9hPlNob3J0IG1ldGhvZHM8L2gyPgorPHA+VG8gdGhlIGV4dGVudCB0aGF0IGl0IGlzIGZlYXNpYmxlLCBtZXRob2RzIHNob3VsZCBiZSBrZXB0IHNtYWxsIGFuZAorZm9jdXNlZC4gSXQgaXMsIGhvd2V2ZXIsIHJlY29nbml6ZWQgdGhhdCBsb25nIG1ldGhvZHMgYXJlIHNvbWV0aW1lcworYXBwcm9wcmlhdGUsIHNvIG5vIGhhcmQgbGltaXQgaXMgcGxhY2VkIG9uIG1ldGhvZCBsZW5ndGguIElmIGEgbWV0aG9kIGV4Y2VlZHMKKzQwIGxpbmVzIG9yIHNvLCB0aGluayBhYm91dCB3aGV0aGVyIGl0IGNhbiBiZSBicm9rZW4gdXAgd2l0aG91dCBoYXJtaW5nIHRoZQorc3RydWN0dXJlIG9mIHRoZSBwcm9ncmFtLjwvcD4KKzxoMj48YSBuYW1lPSJsb2NhbHZhcmlhYmxlcyI+PC9hPkxvY2FsIHZhcmlhYmxlczwvaDI+Cis8cD5UaGUgc2NvcGUgb2YgbG9jYWwgdmFyaWFibGVzIHNob3VsZCBiZSBrZXB0IHRvIGEgbWluaW11bSAoPGk+RWZmZWN0aXZlCitKYXZhPC9pPiBJdGVtIDI5KS4gQnkgZG9pbmcgc28sIHlvdSBpbmNyZWFzZSB0aGUgcmVhZGFiaWxpdHkgYW5kCittYWludGFpbmFiaWxpdHkgb2YgeW91ciBjb2RlIGFuZCByZWR1Y2UgdGhlIGxpa2VsaWhvb2Qgb2YgZXJyb3IuIEVhY2ggdmFyaWFibGUKK3Nob3VsZCBiZSBkZWNsYXJlZCBpbiB0aGUgaW5uZXJtb3N0IGJsb2NrIHRoYXQgZW5jbG9zZXMgYWxsIHVzZXMgb2YgdGhlCit2YXJpYWJsZS48L3A+Cis8cD5Mb2NhbCB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGF0IHRoZSBwb2ludCB0aGV5IGFyZSBmaXJzdCB1c2VkLiBOZWFybHkKK2V2ZXJ5IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHNob3VsZCBjb250YWluIGFuIGluaXRpYWxpemVyLiBJZiB5b3UgZG9uJ3QKK3lldCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIGEgdmFyaWFibGUgc2Vuc2libHksIHlvdSBzaG91bGQKK3Bvc3Rwb25lIHRoZSBkZWNsYXJhdGlvbiB1bnRpbCB5b3UgZG8uPC9wPgorPHA+T25lIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgY29uY2VybnMgdHJ5LWNhdGNoIHN0YXRlbWVudHMuIElmIGEgdmFyaWFibGUgaXMKK2luaXRpYWxpemVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBhIG1ldGhvZCB0aGF0IHRocm93cyBhIGNoZWNrZWQgZXhjZXB0aW9uLAoraXQgbXVzdCBiZSBpbml0aWFsaXplZCBpbnNpZGUgYSB0cnkgYmxvY2suIElmIHRoZSB2YWx1ZSBtdXN0IGJlIHVzZWQgb3V0c2lkZQorb2YgdGhlIHRyeSBibG9jaywgdGhlbiBpdCBtdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSB0aGUgdHJ5IGJsb2NrLCB3aGVyZSBpdAorY2Fubm90IHlldCBiZSBzZW5zaWJseSBpbml0aWFsaXplZDo8L3A+Cis8cHJlPi8vIEluc3RhbnRpYXRlIGNsYXNzIGNsLCB3aGljaCByZXByZXNlbnRzIHNvbWUgc29ydCBvZiBTZXQgCitTZXQgcyA9IG51bGw7Cit0cnkgeworICAgIHMgPSAoU2V0KSBjbC5uZXdJbnN0YW5jZSgpOworfSBjYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgYWNjZXNzaWJsZSIpOworfSBjYXRjaChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgaW5zdGFudGlhYmxlIik7Cit9CisKKy8vIEV4ZXJjaXNlIHRoZSBzZXQgCitzLmFkZEFsbChBcnJheXMuYXNMaXN0KGFyZ3MpKTs8L3ByZT4KKzxwPkJ1dCBldmVuIHRoaXMgY2FzZSBjYW4gYmUgYXZvaWRlZCBieSBlbmNhcHN1bGF0aW5nIHRoZSB0cnktY2F0Y2ggYmxvY2sgaW4gYSBtZXRob2Q6PC9wPgorPHByZT5TZXQgY3JlYXRlU2V0KENsYXNzIGNsKSB7CisgICAgLy8gSW5zdGFudGlhdGUgY2xhc3MgY2wsIHdoaWNoIHJlcHJlc2VudHMgc29tZSBzb3J0IG9mIFNldCAKKyAgICB0cnkgeworICAgICAgICByZXR1cm4gKFNldCkgY2wubmV3SW5zdGFuY2UoKTsKKyAgICB9IGNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgYWNjZXNzaWJsZSIpOworICAgIH0gY2F0Y2goSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2wgKyAiIG5vdCBpbnN0YW50aWFibGUiKTsKKyAgICB9Cit9CisKKy4uLgorCisvLyBFeGVyY2lzZSB0aGUgc2V0IAorU2V0IHMgPSBjcmVhdGVTZXQoY2wpOworcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcmdzKSk7PC9wcmU+Cis8cD5Mb29wIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gdGhlIGZvciBzdGF0ZW1lbnQgaXRzZWxmIHVubGVzcyB0aGVyZQoraXMgYSBjb21wZWxsaW5nIHJlYXNvbiB0byBkbyBvdGhlcndpc2U6PC9wPgorPHByZT5mb3IgKGludCBpID0gMDsgaSBuOyBpKyspIHsKKyAgICBkb1NvbWV0aGluZyhpKTsKK30KKworZm9yIChJdGVyYXRvciBpID0gYy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgZG9Tb21ldGhpbmdFbHNlKGkubmV4dCgpKTsKK308L3ByZT4KKzxoMj48YSBuYW1lPSJpbXBvcnRfc3R5bGUiPjwvYT5JbXBvcnRzPC9oMj4KKzxwPlRoZSBvcmRlcmluZyBvZiBpbXBvcnQgc3RhdGVtZW50cyBpczo8L3A+Cis8b2w+Cis8bGk+QW5kcm9pZCBpbXBvcnRzPC9saT4KKzxsaT5JbXBvcnRzIGZyb20gdGhpcmQgcGFydGllcyAoY29tLCBqdW5pdCwgbmV0LCBvcmcpPC9saT4KKzxsaT5qYXZhIGFuZCBqYXZheDwvbGk+Cis8L29sPgorPHA+VG8gZXhhY3RseSBtYXRjaCB0aGUgSURFIHNldHRpbmdzLCB0aGUgaW1wb3J0cyBzaG91bGQgYmU6PC9wPgorPHVsPgorPGxpPkFscGhhYmV0aWNhbCB3aXRoaW4gZWFjaCBncm91cGluZy48L2xpPgorPGxpPkNhcGl0YWwgbGV0dGVycyBhcmUgY29uc2lkZXJlZCB0byBjb21lIGJlZm9yZSBsb3dlciBjYXNlIGxldHRlciAoZS5nLiBaIGJlZm9yZSBhKS48L2xpPgorPGxpPlRoZXJlIHNob3VsZCBiZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBlYWNoIG1ham9yIGdyb3VwaW5nIChhbmRyb2lkLCBjb20sIGp1bml0LCBuZXQsIG9yZywgamF2YSwgamF2YXgpLjwvbGk+CiA8L3VsPgotPHA+Rm9yIGV4YW1wbGU6Ci08L3A+Ci08cHJlPnB1YmxpYyBjbGFzcyBNeUNsYXNzIHs8YnI+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09NRV9DT05TVEFOVCA9IDQyOzxicj5wdWJsaWMgaW50IHB1YmxpY0ZpZWxkOzxicj5wcml2YXRlIHN0YXRpYyBNeUNsYXNzIHNTaW5nbGV0b247PGJyPmludCBtUGFja2FnZVByaXZhdGU7PGJyPnByaXZhdGUgaW50IG1Qcml2YXRlOzxicj5wcm90ZWN0ZWQgaW50IG1Qcm90ZWN0ZWQ7PGJyPn08L3ByZT4KLTxoMj48YT5CcmFjZXM8L2E+Ci08L2gyPgotPHA+QnJhY2VzIGRvIG5vdCBnbyBvbiB0aGVpciBvd24gbGluZTsgdGhleSBnbyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjb2RlIGJlZm9yZSB0aGVtLiBTbzoKLTwvcD4KLTxwcmU+Y2xhc3MgTXlDbGFzcyB7PGJyPmludCBmdW5jKCkgezxicj5pZiAoc29tZXRoaW5nKSB7PGJyPi8vIC4uLjxicj59IGVsc2UgaWYgKHNvbWV0aGluZ0Vsc2UpIHs8YnI+Ly8gLi4uPGJyPn0gZWxzZSB7PGJyPi8vIC4uLjxicj59PGJyPn08YnI+fTxicj48L3ByZT4KLTxwPldlIHJlcXVpcmUgYnJhY2VzIGFyb3VuZCB0aGUgc3RhdGVtZW50cyBmb3IgYSBjb25kaXRpb25hbC4gRXhjZXB0LCBpZiB0aGUgZW50aXJlIGNvbmRpdGlvbmFsICh0aGUgY29uZGl0aW9uIGFuZCB0aGUgYm9keSkgZml0IG9uIG9uZSBsaW5lLCB5b3UgbWF5IChidXQgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8pIHB1dCBpdCBhbGwgb24gb25lIGxpbmUuIFRoYXQgaXMsIHRoaXMgaXMgbGVnYWw6Ci08L3A+Ci08cHJlPmlmIChjb25kaXRpb24pIHs8YnI+Ym9keTsgLy8gb2sgPGJyPn08YnI+aWYgKGNvbmRpdGlvbikgYm9keTsgLy8gb2s8L3ByZT4KLTxwPmJ1dCB0aGlzIGlzIHN0aWxsIGlsbGVnYWw6Ci08L3A+Ci08cHJlPmlmIChjb25kaXRpb24pPGJyPmJvZHk7IC8vIGJhZCA8YnI+PC9wcmU+Ci08aDI+PGE+TGluZSBsZW5ndGg8L2E+Ci08L2gyPgotPHA+RWFjaCBsaW5lIG9mIHRleHQgaW4geW91ciBjb2RlIHNob3VsZCBiZSBhdCBtb3N0IDEwMCBjaGFyYWN0ZXJzIGxvbmcuCi08L3A+Ci08cD5UaGVyZSBoYXMgYmVlbiBsb3RzIG9mIGRpc2N1c3Npb24gYWJvdXQgdGhpcyBydWxlIGFuZCB0aGUgZGVjaXNpb24gcmVtYWlucyB0aGF0IDEwMCBjaGFyYWN0ZXJzIGlzIHRoZSBtYXhpbXVtLgotPC9wPgotPHA+RXhjZXB0aW9uOiBpZiBhIGNvbW1lbnQgbGluZSBjb250YWlucyBhbiBleGFtcGxlIGNvbW1hbmQgb3IgYSBsaXRlcmFsIFVSTCBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycywgdGhhdCBsaW5lIG1heSBiZSBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycyBmb3IgZWFzZSBvZiBjdXQgYW5kIHBhc3RlLgotPC9wPgotPHA+RXhjZXB0aW9uOiBpbXBvcnQgbGluZXMgY2FuIGdvIG92ZXIgdGhlIGxpbWl0IGJlY2F1c2UgaHVtYW5zIHJhcmVseSBzZWUgdGhlbS4gVGhpcyBhbHNvIHNpbXBsaWZpZXMgdG9vbCB3cml0aW5nLgotPC9wPgotPGgyPgotSmF2YSAxLjUgQW5ub3RhdGlvbnMKLTwvaDI+Ci08cD5Bbm5vdGF0aW9ucyBzaG91bGQgcHJlY2VkZSBvdGhlciBtb2RpZmllcnMgZm9yIHRoZSBzYW1lIGxhbmd1YWdlIGVsZW1lbnQuIFNpbXBsZSBtYXJrZXIgYW5ub3RhdGlvbnMgKGUuZy4gQE92ZXJyaWRlKSBjYW4gYmUgbGlzdGVkIG9uIHRoZSBzYW1lIGxpbmUgd2l0aCB0aGUgbGFuZ3VhZ2UgZWxlbWVudC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGFubm90YXRpb25zLCBvciBwYXJhbWV0ZXJpemVkIGFubm90YXRpb25zLCB0aGV5IHNob3VsZCBlYWNoIGJlIGxpc3RlZCBvbmUtcGVyLWxpbmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotPC9wPgotPHA+QW5kcm9pZCAtc3RhbmRhcmQgcHJhY3RpY2VzIGZvciB0aGUgdGhyZWUgcHJlZGVmaW5lZCBhbm5vdGF0aW9ucyBpbiBKYXZhIDEuNSdzIGFyZToKLTwvcD4KLUBEZXByZWNhdGVkVGhlIEBEZXByZWNhdGVkIGFubm90YXRpb24gbXVzdCBiZSB1c2VkIHdoZW5ldmVyIHRoZSB1c2Ugb2YgdGhlIGFubm90YXRlZCBlbGVtZW50IGlzIGRpc2NvdXJhZ2VkLiBJZiB5b3UgdXNlIHRoZSBARGVwcmVjYXRlZCBhbm5vdGF0aW9uLCB5b3UgbXVzdCBhbHNvIGhhdmUgYSBAZGVwcmVjYXRlZCBKYXZhZG9jIHRhZyBhbmQgaXQgc2hvdWxkIG5hbWUgYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uLiBJbiBhZGRpdGlvbiwgcmVtZW1iZXIgdGhhdCBhIEBEZXByZWNhdGVkIG1ldGhvZCBpcyA8Yj5zdGlsbDwvYj4KLXN1cHBvc2VkIHRvIHdvcmsuCi08cD5JZiB5b3Ugc2VlIG9sZCBjb2RlIHRoYXQgaGFzIGEgQGRlcHJlY2F0ZWQgSmF2YWRvYyB0YWcsIHBsZWFzZSBhZGQgdGhlIEBEZXByZWNhdGVkIGFubm90YXRpb24uCi08L3A+Ci1AT3ZlcnJpZGVUaGUgQE92ZXJyaWRlIGFubm90YXRpb24gbXVzdCBiZSB1c2VkIHdoZW5ldmVyIGEgbWV0aG9kIG92ZXJyaWRlcyB0aGUgZGVjbGFyYXRpb24gb3IgaW1wbGVtZW50YXRpb24gZnJvbSBhIHN1cGVyLWNsYXNzLgotPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgdGhlIHtAaW5oZXJpdGRvY3N9IEphdmFkb2MgdGFnLCBhbmQgZGVyaXZlIGZyb20gYSBjbGFzcyAobm90IGFuIGludGVyZmFjZSksIHlvdSBtdXN0IGFsc28gYW5ub3RhdGUgdGhhdCB0aGUgbWV0aG9kIEBPdmVycmlkZXMgdGhlIHBhcmVudCBjbGFzcydzIG1ldGhvZC4KLTwvcD4KLUBTdXBwcmVzc1dhcm5pbmdzVGhlIEBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB1bmRlciBjaXJjdW1zdGFuY2VzIHdoZXJlIGl0IGlzIGltcG9zc2libGUgdG8gZWxpbWluYXRlIGEgd2FybmluZy4gSWYgYSB3YXJuaW5nIHBhc3NlcyB0aGlzICJpbXBvc3NpYmxlIHRvIGVsaW1pbmF0ZSIgdGVzdCwgdGhlQFN1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbiA8Yj5tdXN0PC9iPgotYmUgdXNlZCwgc28gYXMgdG8gZW5zdXJlIHRoYXQgYWxsIHdhcm5pbmdzIHJlZmxlY3QgYWN0dWFsIHByb2JsZW1zIGluIHRoZSBjb2RlLgotPHA+V2hlbiBhIEBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gaXMgbmVjZXNzYXJ5LCBpdCBtdXN0IGJlIHByZWZpeGVkIHdpdGggYSBUT0RPIGNvbW1lbnQgdGhhdCBleHBsYWlucyB0aGUgImltcG9zc2libGUgdG8gZWxpbWluYXRlIiBjb25kaXRpb24uIFRoaXMgd2lsbCBub3JtYWxseSBpZGVudGlmeSBhbiBvZmZlbmRpbmcgY2xhc3MgdGhhdCBoYXMgYW4gYXdrd2FyZCBpbnRlcmZhY2UuIEZvciBleGFtcGxlOgotPC9wPgotPHByZT4vLyBUT0RPOiBUaGUgdGhpcmQtcGFydHkgY2xhc3MgY29tLnRoaXJkLnVzZWZ1bC5VdGlsaXR5LnJvdGF0ZSgpIG5lZWRzIGdlbmVyaWNzIDxicj5AU3VwcHJlc3NXYXJuaW5ncyh7ImdlbmVyaWMtY2FzdCJ9KTxicj5MaXN0U3RyaW5nYmxpeCA9IFV0aWxpdHkucm90YXRlKGJsYXgpOzxicj48L3ByZT4KLVdoZW4gYSBAU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgY29kZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpc29sYXRlIHRoZSBzb2Z0d2FyZSBlbGVtZW50cyB3aGVyZSB0aGUgYW5ub3RhdGlvbiBhcHBsaWVzLgotPGgyPjxhPkFjcm9ueW1zIGluIG5hbWVzPC9hPgotPC9oMj4KLTxwPlRyZWF0IGFjcm9ueW1zIGFuZCBhYmJyZXZpYXRpb25zIGFzIHdvcmRzLiBUaGUgbmFtZXMgYXJlIG11Y2ggbW9yZSByZWFkYWJsZToKLTwvcD4KKzxoND5XaHk/PC9oND4KKzxwPk9yaWdpbmFsbHkgdGhlcmUgd2FzIG5vIHN0eWxlIHJlcXVpcmVtZW50IG9uIHRoZSBvcmRlcmluZy4gVGhpcyBtZWFudCB0aGF0Cit0aGUgSURFJ3Mgd2VyZSBlaXRoZXIgYWx3YXlzIGNoYW5naW5nIHRoZSBvcmRlcmluZywgb3IgSURFIGRldmVsb3BlcnMgaGFkIHRvCitkaXNhYmxlIHRoZSBhdXRvbWF0aWMgaW1wb3J0IG1hbmFnZW1lbnQgZmVhdHVyZXMgYW5kIG1haW50YWluIHRoZSBpbXBvcnRzIGJ5CitoYW5kLiBUaGlzIHdhcyBkZWVtZWQgYmFkLiBXaGVuIGphdmEtc3R5bGUgd2FzIGFza2VkLCB0aGUgcHJlZmVycmVkIHN0eWxlcword2VyZSBhbGwgb3ZlciB0aGUgbWFwLiBJdCBwcmV0dHkgbXVjaCBjYW1lIGRvd24gdG8gb3VyIG5lZWRpbmcgdG8gInBpY2sgYW4KK29yZGVyaW5nIGFuZCBiZSBjb25zaXN0ZW50LiIgU28gd2UgY2hvc2UgYSBzdHlsZSwgdXBkYXRlZCB0aGUgc3R5bGUgZ3VpZGUsIGFuZAorbWFkZSB0aGUgSURFcyBvYmV5IGl0LiBXZSBleHBlY3QgdGhhdCBhcyBJREUgdXNlcnMgd29yayBvbiB0aGUgY29kZSwgdGhlCitpbXBvcnRzIGluIGFsbCBvZiB0aGUgcGFja2FnZXMgd2lsbCBlbmQgdXAgbWF0Y2hpbmcgdGhpcyBwYXR0ZXJuIHdpdGhvdXQgYW55CitleHRyYSBlbmdpbmVlcmluZyBlZmZvcnQuPC9wPgorPHA+VGhlIHN0eWxlIGNob3NlbiBzdWNoIHRoYXQ6PC9wPgorPHVsPgorPGxpPlRoZSBpbXBvcnRzIHBlb3BsZSB3YW50IHRvIGxvb2sgYXQgZmlyc3QgdGVuZCB0byBiZSBhdCB0aGUgdG9wIChhbmRyb2lkKTwvbGk+Cis8bGk+VGhlIGltcG9ydHMgcGVvcGxlIHdhbnQgdG8gbG9vayBhdCBsZWFzdCB0ZW5kIHRvIGJlIGF0IHRoZSBib3R0b20gKGphdmEpPC9saT4KKzxsaT5IdW1hbnMgY2FuIGVhc2lseSBmb2xsb3cgdGhlIHN0eWxlPC9saT4KKzxsaT5UaGUgSURFJ3MgY2FuIGZvbGxvdyB0aGUgc3R5bGU8L2xpPgorPC91bD4KKzxoMz5XaGF0IGFib3V0IHN0YXRpYyBpbXBvcnRzPzwvaDM+Cis8cD5UaGUgdXNlIGFuZCBsb2NhdGlvbiBvZiBzdGF0aWMgaW1wb3J0cyBoYXZlIGJlZW4gbWlsZGx5IGNvbnRyb3ZlcnNpYWwKK2lzc3Vlcy4gU29tZSBwZW9wbGUgd291bGQgcHJlZmVyIHN0YXRpYyBpbXBvcnRzIHRvIGJlIGludGVyc3BlcnNlZCB3aXRoIHRoZQorcmVtYWluaW5nIGltcG9ydHMsIHNvbWUgd291bGQgcHJlZmVyIHRoZW0gcmVzaWRlIGFib3ZlIG9yIGJlbG93IGFsbCBvdGhlcgoraW1wb3J0cy4gQWRkaXRpbmFsbHksIHdlIGhhdmUgbm90IHlldCBjb21lIHVwIHdpdGggYSB3YXkgdG8gbWFrZSBhbGwgSURFcyB1c2UKK3RoZSBzYW1lIG9yZGVyaW5nLjwvcD4KKzxwPlNpbmNlIG1vc3QgcGVvcGxlIGNvbnNpZGVyIHRoaXMgYSBsb3cgcHJpb3JpdHkgaXNzdWUsIGp1c3QgdXNlIHlvdXIKK2p1ZGdlbWVudCBhbmQgcGxlYXNlIGJlIGNvbnNpc3RlbnQuPC9wPgogCi08dGFibGU+PHRib2R5Pjx0cj48dGQ+R29vZAotPC90ZD4KLTx0ZD5CYWQKLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZD5YbWxIdHRwUmVxdWVzdDwvdGQ+Ci08dGQ+WE1MSFRUUFJlcXVlc3QKLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZD5nZXRDdXN0b21lcklkPC90ZD4KLTx0ZD5nZXRDdXN0b21lcklECi08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotCi08cD5UaGlzIHN0eWxlIHJ1bGUgYWxzbyBhcHBsaWVzIHdoZW4gYW4gYWNyb255bSBvciBhYmJyZXZpYXRpb24gaXMgdGhlIGVudGlyZSBuYW1lOgotPC9wPgotCi08dGFibGU+PHRib2R5Pjx0cj48dGQ+R29vZAotPC90ZD4KLTx0ZD5CYWQKLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZD5jbGFzcyBIdG1sPC90ZD4KLTx0ZD5jbGFzcyBIVE1MCi08L3RkPgotPC90cj4KLTx0cj48dGQ+U3RyaW5nIHVybDs8L3RkPgotPHRkPlN0cmluZyBVUkw7Ci08L3RkPgotPC90cj4KLTx0cj48dGQ+bG9uZyBpZDs8L3RkPgotPHRkPmxvbmcgSUQ7Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotCi08cD5Cb3RoIHRoZSBKREsgYW5kIHRoZSBBbmRyb2lkIGNvZGUgYmFzZXMgYXJlIHZlcnkgaW5jb25zaXN0ZW50IHdpdGggcmVnYXJkcyB0byBhY3JvbnltcywgdGhlcmVmb3JlLCBpdCBpcyB2aXJ0dWFsbHkgaW1wb3NzaWJsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvZGUgYXJvdW5kIHlvdS4gQml0ZSB0aGUgYnVsbGV0LCBhbmQgdHJlYXQgYWNyb255bXMgYXMgd29yZHMuCi08L3A+Cis8aDI+PGEgbmFtZT0iaW5kZW50YXRpb24iPjwvYT5JbmRlbnRhdGlvbjwvaDI+Cis8cD5XZSB1c2UgNCBzcGFjZSBpbmRlbnRzIGZvciBibG9ja3MuIFdlIG5ldmVyIHVzZSB0YWJzLiBXaGVuIGluIGRvdWJ0LCBiZQorY29uc2lzdGVudCB3aXRoIGNvZGUgYXJvdW5kIHlvdS48L3A+Cis8cD5XZSB1c2UgOCBzcGFjZSBpbmRlbnRzIGZvciBsaW5lIHdyYXBzLCBpbmNsdWRpbmcgZnVuY3Rpb24gY2FsbHMgYW5kCithc3NpZ25tZW50cy4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgY29ycmVjdDo8L3A+Cis8cHJlPkluc3RydW1lbnQgaSA9CisgICAgICAgIHNvbWVMb25nRXhwcmVzc2lvbih0aGF0LCB3b3VsZE5vdEZpdCwgb24sIG9uZSwgbGluZSk7PC9wcmU+Cis8cD5hbmQgdGhpcyBpcyBub3QgY29ycmVjdDo8L3A+Cis8cHJlPkluc3RydW1lbnQgaSA9CisgICAgc29tZUxvbmdFeHByZXNzaW9uKHRoYXQsIHdvdWxkTm90Rml0LCBvbiwgb25lLCBsaW5lKTs8L3ByZT4KKzxoMj48YSBuYW1lPSJmaWVsZF9uYW1lcyI+PC9hPkZpZWxkIE5hbWVzPC9oMj4KKzx1bD4KKzxsaT5Ob24tcHVibGljLCBub24tc3RhdGljIGZpZWxkIG5hbWVzIHN0YXJ0IHdpdGggbS48L2xpPgorPGxpPlN0YXRpYyBmaWVsZCBuYW1lcyBzdGFydCB3aXRoIHMuPC9saT4KKzxsaT5PdGhlciBmaWVsZHMgc3RhcnQgd2l0aCBhIGxvd2VyIGNhc2UgbGV0dGVyLjwvbGk+Cis8bGk+UHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMgKGNvbnN0YW50cykgYXJlIEFMTF9DQVBTX1dJVEhfVU5ERVJTQ09SRVMuPC9saT4KKzwvdWw+Cis8cD5Gb3IgZXhhbXBsZTo8L3A+Cis8cHJlPnB1YmxpYyBjbGFzcyBNeUNsYXNzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT01FX0NPTlNUQU5UID0gNDI7CisgICAgcHVibGljIGludCBwdWJsaWNGaWVsZDsKKyAgICBwcml2YXRlIHN0YXRpYyBNeUNsYXNzIHNTaW5nbGV0b247CisgICAgaW50IG1QYWNrYWdlUHJpdmF0ZTsKKyAgICBwcml2YXRlIGludCBtUHJpdmF0ZTsKKyAgICBwcm90ZWN0ZWQgaW50IG1Qcm90ZWN0ZWQ7Cit9PC9wcmU+Cis8aDI+PGEgbmFtZT0iYnJhY2VzIj48L2E+QnJhY2VzPC9oMj4KKzxwPkJyYWNlcyBkbyBub3QgZ28gb24gdGhlaXIgb3duIGxpbmU7IHRoZXkgZ28gb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgY29kZQorYmVmb3JlIHRoZW0uIFNvOjwvcD4KKzxwcmU+Y2xhc3MgTXlDbGFzcyB7CisgICAgaW50IGZ1bmMoKSB7CisgICAgICAgIGlmIChzb21ldGhpbmcpIHsKKyAgICAgICAgICAgIC8vIC4uLgorICAgICAgICB9IGVsc2UgaWYgKHNvbWV0aGluZ0Vsc2UpIHsKKyAgICAgICAgICAgIC8vIC4uLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gLi4uCisgICAgICAgIH0KKyAgICB9Cit9PC9wcmU+Cis8cD5XZSByZXF1aXJlIGJyYWNlcyBhcm91bmQgdGhlIHN0YXRlbWVudHMgZm9yIGEgY29uZGl0aW9uYWwuIEV4Y2VwdCwgaWYgdGhlCitlbnRpcmUgY29uZGl0aW9uYWwgKHRoZSBjb25kaXRpb24gYW5kIHRoZSBib2R5KSBmaXQgb24gb25lIGxpbmUsIHlvdSBtYXkgKGJ1dAorYXJlIG5vdCBvYmxpZ2F0ZWQgdG8pIHB1dCBpdCBhbGwgb24gb25lIGxpbmUuIFRoYXQgaXMsIHRoaXMgaXMgbGVnYWw6PC9wPgorPHByZT5pZiAoY29uZGl0aW9uKSB7CisgICAgYm9keSgpOyAvLyBvayAKK30KK2lmIChjb25kaXRpb24pIGJvZHkoKTsgLy8gb2s8L3ByZT4KKzxwPmJ1dCB0aGlzIGlzIHN0aWxsIGlsbGVnYWw6PC9wPgorPHByZT5pZiAoY29uZGl0aW9uKQorICAgIGJvZHkoKTsgLy8gYmFkPC9wcmU+Cis8aDI+PGEgbmFtZT0ibGluZWxlbiI+PC9hPkxpbmUgbGVuZ3RoPC9oMj4KKzxwPkVhY2ggbGluZSBvZiB0ZXh0IGluIHlvdXIgY29kZSBzaG91bGQgYmUgYXQgbW9zdCAxMDAgY2hhcmFjdGVycyBsb25nLjwvcD4KKzxwPlRoZXJlIGhhcyBiZWVuIGxvdHMgb2YgZGlzY3Vzc2lvbiBhYm91dCB0aGlzIHJ1bGUgYW5kIHRoZSBkZWNpc2lvbiByZW1haW5zCit0aGF0IDEwMCBjaGFyYWN0ZXJzIGlzIHRoZSBtYXhpbXVtLjwvcD4KKzxwPkV4Y2VwdGlvbjogaWYgYSBjb21tZW50IGxpbmUgY29udGFpbnMgYW4gZXhhbXBsZSBjb21tYW5kIG9yIGEgbGl0ZXJhbCBVUkwKK2xvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzLCB0aGF0IGxpbmUgbWF5IGJlIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGZvcgorZWFzZSBvZiBjdXQgYW5kIHBhc3RlLjwvcD4KKzxwPkV4Y2VwdGlvbjogaW1wb3J0IGxpbmVzIGNhbiBnbyBvdmVyIHRoZSBsaW1pdCBiZWNhdXNlIGh1bWFucyByYXJlbHkgc2VlCit0aGVtLiBUaGlzIGFsc28gc2ltcGxpZmllcyB0b29sIHdyaXRpbmcuPC9wPgorPGgyPjxhIG5hbWU9ImFubm90YXRpb25zIj48L2E+SmF2YSAxLjUgQW5ub3RhdGlvbnM8L2gyPgorPHA+QW5ub3RhdGlvbnMgc2hvdWxkIHByZWNlZGUgb3RoZXIgbW9kaWZpZXJzIGZvciB0aGUgc2FtZSBsYW5ndWFnZSBlbGVtZW50LgorU2ltcGxlIG1hcmtlciBhbm5vdGF0aW9ucyAoZS5nLiAmIzY0O092ZXJyaWRlKSBjYW4gYmUgbGlzdGVkIG9uIHRoZSBzYW1lIGxpbmUgd2l0aAordGhlIGxhbmd1YWdlIGVsZW1lbnQuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhbm5vdGF0aW9ucywgb3IgcGFyYW1ldGVyaXplZAorYW5ub3RhdGlvbnMsIHRoZXkgc2hvdWxkIGVhY2ggYmUgbGlzdGVkIG9uZS1wZXItbGluZSBpbiBhbHBoYWJldGljYWwKK29yZGVyLjwvcD4KKzxwPkFuZHJvaWQgLXN0YW5kYXJkIHByYWN0aWNlcyBmb3IgdGhlIHRocmVlIHByZWRlZmluZWQgYW5ub3RhdGlvbnMgaW4gSmF2YQorMS41J3MgYXJlOjwvcD4KKzxoMz4mIzY0O0RlcHJlY2F0ZWQ8L2gzPgorPHA+VGhlICYjNjQ7RGVwcmVjYXRlZCBhbm5vdGF0aW9uIG11c3QgYmUgdXNlZCB3aGVuZXZlciB0aGUgdXNlIG9mIHRoZSBhbm5vdGF0ZWQKK2VsZW1lbnQgaXMgZGlzY291cmFnZWQuIElmIHlvdSB1c2UgdGhlICYjNjQ7RGVwcmVjYXRlZCBhbm5vdGF0aW9uLCB5b3UgbXVzdCBhbHNvCitoYXZlIGEgJiM2NDtkZXByZWNhdGVkIEphdmFkb2MgdGFnIGFuZCBpdCBzaG91bGQgbmFtZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24uCitJbiBhZGRpdGlvbiwgcmVtZW1iZXIgdGhhdCBhICYjNjQ7RGVwcmVjYXRlZCBtZXRob2QgaXMgPGI+c3RpbGw8L2I+IHN1cHBvc2VkIHRvCit3b3JrLjwvcD4KKzxwPklmIHlvdSBzZWUgb2xkIGNvZGUgdGhhdCBoYXMgYSAmIzY0O2RlcHJlY2F0ZWQgSmF2YWRvYyB0YWcsIHBsZWFzZSBhZGQgdGhlICYjNjQ7RGVwcmVjYXRlZCBhbm5vdGF0aW9uLjwvcD4KKzxoMz4mIzY0O092ZXJyaWRlPC9oMz4KKzxwPlRoZSAmIzY0O092ZXJyaWRlIGFubm90YXRpb24gbXVzdCBiZSB1c2VkIHdoZW5ldmVyIGEgbWV0aG9kIG92ZXJyaWRlcyB0aGUKK2RlY2xhcmF0aW9uIG9yIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlci1jbGFzcy48L3A+Cis8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IHVzZSB0aGUgJiM2NDtpbmhlcml0ZG9jcyBKYXZhZG9jIHRhZywgYW5kIGRlcml2ZSBmcm9tIGEKK2NsYXNzIChub3QgYW4gaW50ZXJmYWNlKSwgeW91IG11c3QgYWxzbyBhbm5vdGF0ZSB0aGF0IHRoZSBtZXRob2QgJiM2NDtPdmVycmlkZXMKK3RoZSBwYXJlbnQgY2xhc3MncyBtZXRob2QuPC9wPgorPGgzPiYjNjQ7U3VwcHJlc3NXYXJuaW5nczwvaDM+Cis8cD5UaGUgJiM2NDtTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB1bmRlciBjaXJjdW1zdGFuY2VzCit3aGVyZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBhIHdhcm5pbmcuIElmIGEgd2FybmluZyBwYXNzZXMgdGhpcworImltcG9zc2libGUgdG8gZWxpbWluYXRlIiB0ZXN0LCB0aGUgJiM2NDtTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gPGI+bXVzdDwvYj4gYmUKK3VzZWQsIHNvIGFzIHRvIGVuc3VyZSB0aGF0IGFsbCB3YXJuaW5ncyByZWZsZWN0IGFjdHVhbCBwcm9ibGVtcyBpbiB0aGUKK2NvZGUuPC9wPgorPHA+V2hlbiBhICYjNjQ7U3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIGlzIG5lY2Vzc2FyeSwgaXQgbXVzdCBiZSBwcmVmaXhlZCB3aXRoCithIFRPRE8gY29tbWVudCB0aGF0IGV4cGxhaW5zIHRoZSAiaW1wb3NzaWJsZSB0byBlbGltaW5hdGUiIGNvbmRpdGlvbi4gVGhpcword2lsbCBub3JtYWxseSBpZGVudGlmeSBhbiBvZmZlbmRpbmcgY2xhc3MgdGhhdCBoYXMgYW4gYXdrd2FyZCBpbnRlcmZhY2UuIEZvcgorZXhhbXBsZTo8L3A+Cis8cHJlPi8vIFRPRE86IFRoZSB0aGlyZC1wYXJ0eSBjbGFzcyBjb20udGhpcmQudXNlZnVsLlV0aWxpdHkucm90YXRlKCkgbmVlZHMgZ2VuZXJpY3MgCismIzY0O1N1cHByZXNzV2FybmluZ3MoImdlbmVyaWMtY2FzdCIpCitMaXN0Jmx0O1N0cmluZyZndDsgYmxpeCA9IFV0aWxpdHkucm90YXRlKGJsYXgpOzwvcHJlPgorPHA+V2hlbiBhICYjNjQ7U3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgY29kZSBzaG91bGQgYmUKK3JlZmFjdG9yZWQgdG8gaXNvbGF0ZSB0aGUgc29mdHdhcmUgZWxlbWVudHMgd2hlcmUgdGhlIGFubm90YXRpb24gYXBwbGllcy48L3A+Cis8aDI+PGEgbmFtZT0iYWNyb255bXMiPjwvYT5BY3JvbnltcyBpbiBuYW1lczwvaDI+Cis8cD5UcmVhdCBhY3JvbnltcyBhbmQgYWJicmV2aWF0aW9ucyBhcyB3b3Jkcy4gVGhlIG5hbWVzIGFyZSBtdWNoIG1vcmUgcmVhZGFibGU6PC9wPgorPHRhYmxlPjx0Ym9keT4KKzx0cj48dGQ+R29vZDwvdGQ+IDx0ZD5CYWQ8L3RkPjwvdHI+Cis8dHI+PHRkPlhtbEh0dHBSZXF1ZXN0PC90ZD4gPHRkPlhNTEhUVFBSZXF1ZXN0PC90ZD48L3RyPgorPHRyPjx0ZD5nZXRDdXN0b21lcklkPC90ZD4gPHRkPmdldEN1c3RvbWVySUQ8L3RkPjwvdHI+Cis8L3Rib2R5PjwvdGFibGU+Cis8cD5UaGlzIHN0eWxlIHJ1bGUgYWxzbyBhcHBsaWVzIHdoZW4gYW4gYWNyb255bSBvciBhYmJyZXZpYXRpb24gaXMgdGhlIGVudGlyZQorbmFtZTo8L3A+Cis8dGFibGU+PHRib2R5PgorPHRyPjx0ZD5Hb29kPC90ZD4gPHRkPkJhZDwvdGQ+PC90cj4KKzx0cj48dGQ+Y2xhc3MgSHRtbDwvdGQ+IDx0ZD5jbGFzcyBIVE1MPC90ZD48L3RyPgorPHRyPjx0ZD5TdHJpbmcgdXJsOzwvdGQ+IDx0ZD5TdHJpbmcgVVJMOzwvdGQ+PC90cj4KKzx0cj48dGQ+bG9uZyBpZDs8L3RkPiA8dGQ+bG9uZyBJRDs8L3RkPjwvdHI+Cis8L3Rib2R5PjwvdGFibGU+Cis8cD5Cb3RoIHRoZSBKREsgYW5kIHRoZSBBbmRyb2lkIGNvZGUgYmFzZXMgYXJlIHZlcnkgaW5jb25zaXN0ZW50IHdpdGggcmVnYXJkcwordG8gYWNyb255bXMsIHRoZXJlZm9yZSwgaXQgaXMgdmlydHVhbGx5IGltcG9zc2libGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZQorY29kZSBhcm91bmQgeW91LiBCaXRlIHRoZSBidWxsZXQsIGFuZCB0cmVhdCBhY3JvbnltcyBhcyB3b3Jkcy48L3A+CiA8cD5Gb3IgZnVydGhlciBqdXN0aWZpY2F0aW9ucyBvZiB0aGlzIHN0eWxlIHJ1bGUsIHNlZSA8aT5FZmZlY3RpdmUgSmF2YTwvaT4KLUl0ZW0gMzggYW5kIDxpPkphdmEgUHV6emxlcnM8L2k+Ci1OdW1iZXIgNjguCi08L3A+Ci08aDI+PGE+VE9ETyBzdHlsZTwvYT4KLTwvaDI+Ci08cD5Vc2UgVE9ETyBjb21tZW50cyBmb3IgY29kZSB0aGF0IGlzIHRlbXBvcmFyeSwgYSBzaG9ydC10ZXJtIHNvbHV0aW9uLCBvciBnb29kLWVub3VnaCBidXQgbm90IHBlcmZlY3QuCi08L3A+Ci08cD5UT0RPcyBzaG91bGQgaW5jbHVkZSB0aGUgc3RyaW5nIFRPRE8gaW4gYWxsIGNhcHMsIGZvbGxvd2VkIGJ5IGEgY29sb246Ci08L3A+Ci08cHJlPi8vIFRPRE86IFJlbW92ZSB0aGlzIGNvZGUgYWZ0ZXIgdGhlIFVybFRhYmxlMiBoYXMgYmVlbiBjaGVja2VkIGluLjxicj48YnI+Ly8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gdXNlIGEgZmxhZyBpbnN0ZWFkIG9mIGEgY29uc3RhbnQuPC9wcmU+Ci08cD5JZiB5b3VyIFRPRE8gaXMgb2YgdGhlIGZvcm0gIkF0IGEgZnV0dXJlIGRhdGUgZG8gc29tZXRoaW5nIiBtYWtlIHN1cmUgdGhhdCB5b3UgZWl0aGVyIGluY2x1ZGUgYSB2ZXJ5IHNwZWNpZmljIGRhdGUgKCJGaXggYnkgTm92ZW1iZXIgMjAwNSIpIG9yIGEgdmVyeSBzcGVjaWZpYyBldmVudCAoIlJlbW92ZSB0aGlzIGNvZGUgYWZ0ZXIgYWxsIHByb2R1Y3Rpb24gbWl4ZXJzIHVuZGVyc3RhbmQgcHJvdG9jb2wgVjcuIikuCi08L3A+Ci08aDI+Ci1Db25zaXN0ZW5jeQotPC9oMj4KLTxwPk91ciBwYXJ0aW5nIHRob3VnaHQ6IEJFIENPTlNJU1RFTlQuIElmIHlvdSdyZSBlZGl0aW5nIGNvZGUsIHRha2UgYSBmZXcgbWludXRlcyB0byBsb29rIGF0IHRoZSBjb2RlIGFyb3VuZCB5b3UgYW5kIGRldGVybWluZSBpdHMgc3R5bGUuIElmIHRoZXkgdXNlIHNwYWNlcyBhcm91bmQgdGhlaXIgaWYgY2xhdXNlcywgeW91IHNob3VsZCB0b28uIElmIHRoZWlyIGNvbW1lbnRzIGhhdmUgbGl0dGxlIGJveGVzIG9mIHN0YXJzIGFyb3VuZCB0aGVtLCBtYWtlIHlvdXIgY29tbWVudHMgaGF2ZSBsaXR0bGUgYm94ZXMgb2Ygc3RhcnMgYXJvdW5kIHRoZW0gdG9vLgotPC9wPgotPHA+VGhlIHBvaW50IG9mIGhhdmluZyBzdHlsZSBndWlkZWxpbmVzIGlzIHRvIGhhdmUgYSBjb21tb24gdm9jYWJ1bGFyeSBvZiBjb2RpbmcsIHNvIHBlb3BsZSBjYW4gY29uY2VudHJhdGUgb24gd2hhdCB5b3UncmUgc2F5aW5nLCByYXRoZXIgdGhhbiBvbiBob3cgeW91J3JlIHNheWluZyBpdC4gV2UgcHJlc2VudCBnbG9iYWwgc3R5bGUgcnVsZXMgaGVyZSBzbyBwZW9wbGUga25vdyB0aGUgdm9jYWJ1bGFyeS4gQnV0IGxvY2FsIHN0eWxlIGlzIGFsc28gaW1wb3J0YW50LiBJZiBjb2RlIHlvdSBhZGQgdG8gYSBhIGZpbGUgbG9va3MgZHJhc3RpY2FsbHkgZGlmZmVyZW50IGZyb20gdGhlIGV4aXN0aW5nIGNvZGUgYXJvdW5kIGl0LCBpdCB0aHJvd3MgcmVhZGVycyBvdXQgb2YgdGhlaXIgcmh5dGhtIHdoZW4gdGhleSBnbyB0byByZWFkIGl0LiBUcnkgdG8gYXZvaWQgdGhpcy4KLTwvcD4KLTxoMj48YT5Mb2dnaW5nPC9hPgotPC9oMj4KLTxwPldoaWxlIGxvZ2dpbmcgaXMgbmVjZXNzYXJ5IGl0IGhhcyBhIHNpZ25pZmljYW50bHkgbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlIGFuZCBxdWlja2x5IGxvc2VzIGl0cyB1c2VmdWxuZXNzIGlmIGl0J3Mgbm90IGtlcHQgcmVhc29uYWJseSB0ZXJzZS4gVGhlIGxvZ2dpbmcgZmFjaWxpdGllcyBwcm92aWRlcyBmaXZlIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZy4gQmVsb3cgYXJlIHRoZSBkaWZmZXJlbnQgbGV2ZWxzIGFuZCB3aGVuIGFuZCBob3cgdGhleSBzaG91bGQgYmUgdXNlZC4KLTwvcD4KK0l0ZW0gMzggYW5kIDxpPkphdmEgUHV6emxlcnM8L2k+IE51bWJlciA2OC48L3A+CiAKLTx1bD48bGk+PGI+RVJST1I6PC9iPgotVGhpcyBsZXZlbCBvZiBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIHdoZW4gc29tZXRoaW5nIGZhdGFsIGhhcyBoYXBwZW5lZCwgaS5lLiBzb21ldGhpbmcgdGhhdCB3aWxsIGhhdmUgdXNlci12aXNpYmxlIGNvbnNlcXVlbmNlcyBhbmQgd29uJ3QgYmUgcmVjb3ZlcmFibGUgd2l0aG91dCBleHBsaWNpdGx5IGRlbGV0aW5nIHNvbWUgZGF0YSwgdW5pbnN0YWxsaW5nIGFwcGxpY2F0aW9ucywgd2lwaW5nIHRoZSBkYXRhIHBhcnRpdGlvbnMgb3IgcmVmbGFzaGluZyB0aGUgZW50aXJlIHBob25lIChvciB3b3JzZSkuIFRoaXMgbGV2ZWwgaXMgYWx3YXlzIGxvZ2dlZC4gSXNzdWVzIHRoYXQganVzdGlmeSBzb21lIGxvZ2dpbmcgYXQgdGhlIEVSUk9SIGxldmVsIGFyZSB0eXBpY2FsbHkgZ29vZCBjYW5kaWRhdGVzIHRvIGJlIHJlcG9ydGVkIHRvIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgc2VydmVyLgotPC9saT4KKzxoMj48YSBuYW1lPSJ0b2RvIj48L2E+VE9ETyBzdHlsZTwvaDI+Cis8cD5Vc2UgVE9ETyBjb21tZW50cyBmb3IgY29kZSB0aGF0IGlzIHRlbXBvcmFyeSwgYSBzaG9ydC10ZXJtIHNvbHV0aW9uLCBvcgorZ29vZC1lbm91Z2ggYnV0IG5vdCBwZXJmZWN0LjwvcD4KKzxwPlRPRE9zIHNob3VsZCBpbmNsdWRlIHRoZSBzdHJpbmcgVE9ETyBpbiBhbGwgY2FwcywgZm9sbG93ZWQgYnkgYSBjb2xvbjo8L3A+Cis8cHJlPi8vIFRPRE86IFJlbW92ZSB0aGlzIGNvZGUgYWZ0ZXIgdGhlIFVybFRhYmxlMiBoYXMgYmVlbiBjaGVja2VkIGluLgorCisvLyBUT0RPOiBDaGFuZ2UgdGhpcyB0byB1c2UgYSBmbGFnIGluc3RlYWQgb2YgYSBjb25zdGFudC48L3ByZT4KKzxwPklmIHlvdXIgVE9ETyBpcyBvZiB0aGUgZm9ybSAiQXQgYSBmdXR1cmUgZGF0ZSBkbyBzb21ldGhpbmciIG1ha2Ugc3VyZSB0aGF0Cit5b3UgZWl0aGVyIGluY2x1ZGUgYSB2ZXJ5IHNwZWNpZmljIGRhdGUgKCJGaXggYnkgTm92ZW1iZXIgMjAwNSIpIG9yIGEgdmVyeQorc3BlY2lmaWMgZXZlbnQgKCJSZW1vdmUgdGhpcyBjb2RlIGFmdGVyIGFsbCBwcm9kdWN0aW9uIG1peGVycyB1bmRlcnN0YW5kCitwcm90b2NvbCBWNy4iKS48L3A+CisKKzxoMj48YSBuYW1lPSJjb25zaXN0ZW5jeSI+PC9hPkNvbnNpc3RlbmN5PC9oMj4KKzxwPk91ciBwYXJ0aW5nIHRob3VnaHQ6IEJFIENPTlNJU1RFTlQuIElmIHlvdSdyZSBlZGl0aW5nIGNvZGUsIHRha2UgYSBmZXcKK21pbnV0ZXMgdG8gbG9vayBhdCB0aGUgY29kZSBhcm91bmQgeW91IGFuZCBkZXRlcm1pbmUgaXRzIHN0eWxlLiBJZiB0aGV5IHVzZQorc3BhY2VzIGFyb3VuZCB0aGVpciBpZiBjbGF1c2VzLCB5b3Ugc2hvdWxkIHRvby4gSWYgdGhlaXIgY29tbWVudHMgaGF2ZSBsaXR0bGUKK2JveGVzIG9mIHN0YXJzIGFyb3VuZCB0aGVtLCBtYWtlIHlvdXIgY29tbWVudHMgaGF2ZSBsaXR0bGUgYm94ZXMgb2Ygc3RhcnMKK2Fyb3VuZCB0aGVtIHRvby48L3A+Cis8cD5UaGUgcG9pbnQgb2YgaGF2aW5nIHN0eWxlIGd1aWRlbGluZXMgaXMgdG8gaGF2ZSBhIGNvbW1vbiB2b2NhYnVsYXJ5IG9mCitjb2RpbmcsIHNvIHBlb3BsZSBjYW4gY29uY2VudHJhdGUgb24gd2hhdCB5b3UncmUgc2F5aW5nLCByYXRoZXIgdGhhbiBvbiBob3cKK3lvdSdyZSBzYXlpbmcgaXQuIFdlIHByZXNlbnQgZ2xvYmFsIHN0eWxlIHJ1bGVzIGhlcmUgc28gcGVvcGxlIGtub3cgdGhlCit2b2NhYnVsYXJ5LiBCdXQgbG9jYWwgc3R5bGUgaXMgYWxzbyBpbXBvcnRhbnQuIElmIGNvZGUgeW91IGFkZCB0byBhIGEgZmlsZQorbG9va3MgZHJhc3RpY2FsbHkgZGlmZmVyZW50IGZyb20gdGhlIGV4aXN0aW5nIGNvZGUgYXJvdW5kIGl0LCBpdCB0aHJvd3MKK3JlYWRlcnMgb3V0IG9mIHRoZWlyIHJoeXRobSB3aGVuIHRoZXkgZ28gdG8gcmVhZCBpdC4gVHJ5IHRvIGF2b2lkIHRoaXMuPC9wPgorCis8aDI+PGEgbmFtZT0ibG9nZ2luZyI+PC9hPkxvZ2dpbmc8L2gyPgorPHA+V2hpbGUgbG9nZ2luZyBpcyBuZWNlc3NhcnkgaXQgaGFzIGEgc2lnbmlmaWNhbnRseSBuZWdhdGl2ZSBpbXBhY3Qgb24KK3BlcmZvcm1hbmNlIGFuZCBxdWlja2x5IGxvc2VzIGl0cyB1c2VmdWxuZXNzIGlmIGl0J3Mgbm90IGtlcHQgcmVhc29uYWJseQordGVyc2UuIFRoZSBsb2dnaW5nIGZhY2lsaXRpZXMgcHJvdmlkZXMgZml2ZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ2dpbmcuIEJlbG93CithcmUgdGhlIGRpZmZlcmVudCBsZXZlbHMgYW5kIHdoZW4gYW5kIGhvdyB0aGV5IHNob3VsZCBiZSB1c2VkLjwvcD4KKworPHVsPgorPGxpPjxiPkVSUk9SOjwvYj4KK1RoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCB3aGVuIHNvbWV0aGluZyBmYXRhbCBoYXMgaGFwcGVuZWQsCitpLmUuIHNvbWV0aGluZyB0aGF0IHdpbGwgaGF2ZSB1c2VyLXZpc2libGUgY29uc2VxdWVuY2VzIGFuZCB3b24ndCBiZQorcmVjb3ZlcmFibGUgd2l0aG91dCBleHBsaWNpdGx5IGRlbGV0aW5nIHNvbWUgZGF0YSwgdW5pbnN0YWxsaW5nIGFwcGxpY2F0aW9ucywKK3dpcGluZyB0aGUgZGF0YSBwYXJ0aXRpb25zIG9yIHJlZmxhc2hpbmcgdGhlIGVudGlyZSBwaG9uZSAob3Igd29yc2UpLiBUaGlzCitsZXZlbCBpcyBhbHdheXMgbG9nZ2VkLiBJc3N1ZXMgdGhhdCBqdXN0aWZ5IHNvbWUgbG9nZ2luZyBhdCB0aGUgRVJST1IgbGV2ZWwKK2FyZSB0eXBpY2FsbHkgZ29vZCBjYW5kaWRhdGVzIHRvIGJlIHJlcG9ydGVkIHRvIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcKK3NlcnZlci48L2xpPgogPGxpPjxiPldBUk5JTkc6PC9iPgotVGhpcyBsZXZlbCBvZiBsb2dnaW5nIHNob3VsZCB1c2VkIHdoZW4gc29tZXRoaW5nIHNlcmlvdXMgYW5kIHVuZXhwZWN0ZWQgaGFwcGVuZWQsIGkuZS4gc29tZXRoaW5nIHRoYXQgd2lsbCBoYXZlIHVzZXItdmlzaWJsZSBjb25zZXF1ZW5jZXMgYnV0IGlzIGxpa2VseSB0byBiZSByZWNvdmVyYWJsZSB3aXRob3V0IGRhdGEgbG9zcyBieSBwZXJmb3JtaW5nIHNvbWUgZXhwbGljaXQgYWN0aW9uLCByYW5naW5nIGZyb20gd2FpdGluZyBvciByZXN0YXJ0aW5nIGFuIGFwcCBhbGwgdGhlIHdheSB0byByZS1kb3dubG9hZGluZyBhIG5ldyB2ZXJzaW9uIG9mIGFuIGFwcGxpY2F0aW9uIG9yIHJlYm9vdGluZyB0aGUgZGV2aWNlLiBUaGlzIGxldmVsIGlzIGFsd2F5cyBsb2dnZWQuIElzc3VlcyB0aGF0IGp1c3RpZnkgc29tZSBsb2dnaW5nIGF0IHRoZSBXQVJOSU5HIGxldmVsIG1pZ2h0IGFsc28gYmUgY29uc2lkZXJlZCBmb3IgcmVwb3J0aW5nIHRvIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgc2VydmVyLgotPC9saT4KK1RoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgdXNlZCB3aGVuIHNvbWV0aGluZyBzZXJpb3VzIGFuZCB1bmV4cGVjdGVkCitoYXBwZW5lZCwgaS5lLiBzb21ldGhpbmcgdGhhdCB3aWxsIGhhdmUgdXNlci12aXNpYmxlIGNvbnNlcXVlbmNlcyBidXQgaXMKK2xpa2VseSB0byBiZSByZWNvdmVyYWJsZSB3aXRob3V0IGRhdGEgbG9zcyBieSBwZXJmb3JtaW5nIHNvbWUgZXhwbGljaXQgYWN0aW9uLAorcmFuZ2luZyBmcm9tIHdhaXRpbmcgb3IgcmVzdGFydGluZyBhbiBhcHAgYWxsIHRoZSB3YXkgdG8gcmUtZG93bmxvYWRpbmcgYSBuZXcKK3ZlcnNpb24gb2YgYW4gYXBwbGljYXRpb24gb3IgcmVib290aW5nIHRoZSBkZXZpY2UuIFRoaXMgbGV2ZWwgaXMgYWx3YXlzCitsb2dnZWQuIElzc3VlcyB0aGF0IGp1c3RpZnkgc29tZSBsb2dnaW5nIGF0IHRoZSBXQVJOSU5HIGxldmVsIG1pZ2h0IGFsc28gYmUKK2NvbnNpZGVyZWQgZm9yIHJlcG9ydGluZyB0byBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHNlcnZlci48L2xpPgogPGxpPjxiPklORk9STUFUSVZFOjwvYj4KLVRoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgdXNlZCBiZSB0byBub3RlIHRoYXQgc29tZXRoaW5nIGludGVyZXN0aW5nIHRvIG1vc3QgcGVvcGxlIGhhcHBlbmVkLCBpLmUuIHdoZW4gYSBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQgdGhhdCBpcyBsaWtlbHkgdG8gaGF2ZSB3aWRlc3ByZWFkIGltcGFjdCwgdGhvdWdoIGlzbid0IG5lY2Vzc2FyaWx5IGFuIGVycm9yLiBTdWNoIGEgY29uZGl0aW9uIHNob3VsZCBvbmx5IGJlIGxvZ2dlZCBieSBhIG1vZHVsZSB0aGF0IHJlYXNvbmFibHkgYmVsaWV2ZXMgdGhhdCBpdCBpcyB0aGUgbW9zdCBhdXRob3JpdGF0aXZlIGluIHRoYXQgZG9tYWluICh0byBhdm9pZCBkdXBsaWNhdGUgbG9nZ2luZyBieSBub24tYXV0aG9yaXRhdGl2ZSBjb21wb25lbnRzKS4gVGhpcyBsZXZlbCBpcyBhbHdheXMgbG9nZ2VkLgotPC9saT4KK1RoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgdXNlZCBiZSB0byBub3RlIHRoYXQgc29tZXRoaW5nIGludGVyZXN0aW5nIHRvCittb3N0IHBlb3BsZSBoYXBwZW5lZCwgaS5lLiB3aGVuIGEgc2l0dWF0aW9uIGlzIGRldGVjdGVkIHRoYXQgaXMgbGlrZWx5IHRvIGhhdmUKK3dpZGVzcHJlYWQgaW1wYWN0LCB0aG91Z2ggaXNuJ3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IuIFN1Y2ggYSBjb25kaXRpb24gc2hvdWxkCitvbmx5IGJlIGxvZ2dlZCBieSBhIG1vZHVsZSB0aGF0IHJlYXNvbmFibHkgYmVsaWV2ZXMgdGhhdCBpdCBpcyB0aGUgbW9zdAorYXV0aG9yaXRhdGl2ZSBpbiB0aGF0IGRvbWFpbiAodG8gYXZvaWQgZHVwbGljYXRlIGxvZ2dpbmcgYnkgbm9uLWF1dGhvcml0YXRpdmUKK2NvbXBvbmVudHMpLiBUaGlzIGxldmVsIGlzIGFsd2F5cyBsb2dnZWQuPC9saT4KIDxsaT48Yj5ERUJVRzo8L2I+Ci1UaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgdG8gZnVydGhlciBub3RlIHdoYXQgaXMgaGFwcGVuaW5nIG9uIHRoZSBkZXZpY2UgdGhhdCBjb3VsZCBiZSByZWxldmFudCB0byBpbnZlc3RpZ2F0ZSBhbmQgZGVidWcgdW5leHBlY3RlZCBiZWhhdmlvcnMuIFlvdSBzaG91bGQgbG9nIG9ubHkgd2hhdCBpcyBuZWVkZWQgdG8gZ2F0aGVyIGVub3VnaCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGdvaW5nIG9uIGFib3V0IHlvdXIgY29tcG9uZW50LiBJZiB5b3VyIGRlYnVnIGxvZ3MgYXJlIGRvbWluYXRpbmcgdGhlIGxvZyB0aGVuIHlvdSBwcm9iYWJseSBzaG91bGQgYmUgdXNpbmcgdmVyYm9zZSBsb2dnaW5nLiBUaGlzIGxldmVsIHdpbGwgYmUgbG9nZ2VkLCBldmVuIG9uIHJlbGVhc2UgYnVpbGRzLCBhbmQgaXMgcmVxdWlyZWQgdG8gYmUgc3Vycm91bmRlZCBieSBhbiBpZiAoTE9DQUxfTE9HKSBvciBpZiAoTE9DQUxfTE9HRCkgYmxvY2ssIHdoZXJlIExPQ0FMX0xPR1tEXSBpcyBkZWZpbmVkIGluIHlvdXIgY2xhc3Mgb3Igc3ViY29tcG9uZW50LCBzbyB0aGF0IHRoZXJlIGNhbiBleGlzdCBhIHBvc3NpYmlsaXR5IHRvIGRpc2FibGUgYWxsIHN1Y2ggbG9nZ2luZy4gVGhlcmUgbXVzdCB0aGVyZWZvcmUgYmUgbm8gYWN0aXZlIGxvZ2ljIGluIGFuIGlmIChMT0NBTF9MT0cpIGJsb2NrLiBBbGwgdGhlIHN0cmluZyBidWlsZGluZyBmb3IgdGhlIGxvZyBhbHNvIG5lZWRzIHRvIGJlIHBsYWNlZCBpbnNpZGUgdGhlIGlmIChMT0NBTF9MT0cpIGJsb2NrLiBUaGUgbG9nZ2luZyBjYWxsIHNob3VsZCBub3QgYmUgcmUtZmFjdG9yZWQgb3V0IGludG8gYSBtZXRob2QgY2FsbCBpZiBpdCBpcyBnb2luZyB0byBjYXVzZSB0aGUgc3RyaW5nIGJ1aWxkaW5nIHRvIHRha2UgcGxhY2Ugb3V0c2lkZSBvZiB0aGUgaWYgKExPQ0FMX0xPRykgYmxvY2suIFRoZXJlIGlzIHNvbWUgY29kZSB0aGF0IHN0aWxsIHNheXMgaWYgKGxvY2FsTE9HVikuIFRoaXMgaXMgY29uc2lkZXJlZCBhY2NlcHRhYmxlIGFzIHdlbGwsIGFsdGhvdWdoIHRoZSBuYW1lIGlzIG5vbnN0YW5kYXJkLgotPC9saT4KK1RoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCB0byBmdXJ0aGVyIG5vdGUgd2hhdCBpcyBoYXBwZW5pbmcgb24gdGhlCitkZXZpY2UgdGhhdCBjb3VsZCBiZSByZWxldmFudCB0byBpbnZlc3RpZ2F0ZSBhbmQgZGVidWcgdW5leHBlY3RlZCBiZWhhdmlvcnMuCitZb3Ugc2hvdWxkIGxvZyBvbmx5IHdoYXQgaXMgbmVlZGVkIHRvIGdhdGhlciBlbm91Z2ggaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcworZ29pbmcgb24gYWJvdXQgeW91ciBjb21wb25lbnQuIElmIHlvdXIgZGVidWcgbG9ncyBhcmUgZG9taW5hdGluZyB0aGUgbG9nIHRoZW4KK3lvdSBwcm9iYWJseSBzaG91bGQgYmUgdXNpbmcgdmVyYm9zZSBsb2dnaW5nLiBUaGlzIGxldmVsIHdpbGwgYmUgbG9nZ2VkLCBldmVuCitvbiByZWxlYXNlIGJ1aWxkcywgYW5kIGlzIHJlcXVpcmVkIHRvIGJlIHN1cnJvdW5kZWQgYnkgYW4gaWYgKExPQ0FMX0xPRykgb3IgaWYKKyhMT0NBTF9MT0dEKSBibG9jaywgd2hlcmUgTE9DQUxfTE9HW0RdIGlzIGRlZmluZWQgaW4geW91ciBjbGFzcyBvcgorc3ViY29tcG9uZW50LCBzbyB0aGF0IHRoZXJlIGNhbiBleGlzdCBhIHBvc3NpYmlsaXR5IHRvIGRpc2FibGUgYWxsIHN1Y2gKK2xvZ2dpbmcuIFRoZXJlIG11c3QgdGhlcmVmb3JlIGJlIG5vIGFjdGl2ZSBsb2dpYyBpbiBhbiBpZiAoTE9DQUxfTE9HKSBibG9jay4KK0FsbCB0aGUgc3RyaW5nIGJ1aWxkaW5nIGZvciB0aGUgbG9nIGFsc28gbmVlZHMgdG8gYmUgcGxhY2VkIGluc2lkZSB0aGUgaWYKKyhMT0NBTF9MT0cpIGJsb2NrLiBUaGUgbG9nZ2luZyBjYWxsIHNob3VsZCBub3QgYmUgcmUtZmFjdG9yZWQgb3V0IGludG8gYQorbWV0aG9kIGNhbGwgaWYgaXQgaXMgZ29pbmcgdG8gY2F1c2UgdGhlIHN0cmluZyBidWlsZGluZyB0byB0YWtlIHBsYWNlIG91dHNpZGUKK29mIHRoZSBpZiAoTE9DQUxfTE9HKSBibG9jay4gVGhlcmUgaXMgc29tZSBjb2RlIHRoYXQgc3RpbGwgc2F5cyBpZgorKGxvY2FsTE9HVikuIFRoaXMgaXMgY29uc2lkZXJlZCBhY2NlcHRhYmxlIGFzIHdlbGwsIGFsdGhvdWdoIHRoZSBuYW1lIGlzCitub25zdGFuZGFyZC48L2xpPgogPGxpPjxiPlZFUkJPU0U6PC9iPgotVGhpcyBsZXZlbCBvZiBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuIFRoaXMgbGV2ZWwgd2lsbCBvbmx5IGJlIGxvZ2dlZCBvbiBkZWJ1ZyBidWlsZHMgYW5kIHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5IGlmIChMT0NBTF9MT0dWKSBibG9jayAob3IgZXF1aXZhbGVudCkgc28gdGhhdCBpdCBjYW4gYmUgY29tcGlsZWQgb3V0IGJ5IGRlZmF1bHQuIEFueSBzdHJpbmcgYnVpbGRpbmcgd2lsbCBiZSBzdHJpcHBlZCBvdXQgb2YgcmVsZWFzZSBidWlsZHMgYW5kIG5lZWRzIHRvIGFwcGVhciBpbnNpZGUgdGhlIGlmIChMT0NBTF9MT0dWKSBibG9jay4KLTwvbGk+CitUaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBsZXZlbCB3aWxsIG9ubHkKK2JlIGxvZ2dlZCBvbiBkZWJ1ZyBidWlsZHMgYW5kIHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5IGlmIChMT0NBTF9MT0dWKSBibG9jaworKG9yIGVxdWl2YWxlbnQpIHNvIHRoYXQgaXQgY2FuIGJlIGNvbXBpbGVkIG91dCBieSBkZWZhdWx0LiBBbnkgc3RyaW5nIGJ1aWxkaW5nCit3aWxsIGJlIHN0cmlwcGVkIG91dCBvZiByZWxlYXNlIGJ1aWxkcyBhbmQgbmVlZHMgdG8gYXBwZWFyIGluc2lkZSB0aGUgaWYKKyhMT0NBTF9MT0dWKSBibG9jay48L2xpPgogPC91bD4KLTxwPjxpPk5vdGU6PC9pPgotV2l0aGluIGEgZ2l2ZW4gbW9kdWxlLCBvdGhlciB0aGFuIGF0IHRoZSBWRVJCT1NFIGxldmVsLCBhbiBlcnJvciBzaG91bGQgb25seSBiZSByZXBvcnRlZCBvbmNlIGlmIHBvc3NpYmxlOiB3aXRoaW4gYSBzaW5nbGUgY2hhaW4gb2YgZnVuY3Rpb24gY2FsbHMgd2l0aGluIGEgbW9kdWxlLCBvbmx5IHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgZXJyb3IsIGFuZCBjYWxsZXJzIGluIHRoZSBzYW1lIG1vZHVsZSBzaG91bGQgb25seSBhZGQgc29tZSBsb2dnaW5nIGlmIHRoYXQgc2lnbmlmaWNhbnRseSBoZWxwcyB0byBpc29sYXRlIHRoZSBpc3N1ZS4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotSW4gYSBjaGFpbiBvZiBtb2R1bGVzLCBvdGhlciB0aGFuIGF0IHRoZSBWRVJCT1NFIGxldmVsLCB3aGVuIGEgbG93ZXItbGV2ZWwgbW9kdWxlIGRldGVjdHMgaW52YWxpZCBkYXRhIGNvbWluZyBmcm9tIGEgaGlnaGVyLWxldmVsIG1vZHVsZSwgdGhlIGxvd2VyLWxldmVsIG1vZHVsZSBzaG91bGQgb25seSBsb2cgdGhpcyBzaXR1YXRpb24gdG8gdGhlIERFQlVHIGxvZywgYW5kIG9ubHkgaWYgbG9nZ2luZyBwcm92aWRlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBvdGhlcndpc2UgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuIFNwZWNpZmljYWxseSwgdGhlcmUgaXMgbm8gbmVlZCB0byBsb2cgc2l0dWF0aW9ucyB3aGVyZSBhbiBleGNlcHRpb24gaXMgdGhyb3duICh0aGUgZXhjZXB0aW9uIHNob3VsZCBjb250YWluIGFsbCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24pLCBvciB3aGVyZSB0aGUgb25seSBpbmZvcm1hdGlvbiBiZWluZyBsb2dnZWQgaXMgY29udGFpbmVkIGluIGFuIGVycm9yIGNvZGUuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgaW4gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGZyYW1ld29yayBhbmQgYXBwbGljYXRpb25zLCBhbmQgY29uZGl0aW9ucyBjYXVzZWQgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zIHRoYXQgYXJlIHByb3Blcmx5IGhhbmRsZWQgYnkgdGhlIGZyYW1ld29yayBzaG91bGQgbm90IHRyaWdnZXIgbG9nZ2luZyBoaWdoZXIgdGhhbiB0aGUgREVCVUcgbGV2ZWwuIFRoZSBvbmx5IHNpdHVhdGlvbnMgdGhhdCBzaG91bGQgdHJpZ2dlciBsb2dnaW5nIGF0IHRoZSBJTkZPUk1BVElWRSBsZXZlbCBvciBoaWdoZXIgaXMgd2hlbiBhIG1vZHVsZSBvciBhcHBsaWNhdGlvbiBkZXRlY3RzIGFuIGVycm9yIGF0IGl0cyBvd24gbGV2ZWwgb3IgY29taW5nIGZyb20gYSBsb3dlciBsZXZlbC4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotV2hlbiBhIGNvbmRpdGlvbiB0aGF0IHdvdWxkIG5vcm1hbGx5IGp1c3RpZnkgc29tZSBsb2dnaW5nIGlzIGxpa2VseSB0byBvY2N1ciBtYW55IHRpbWVzLCBpdCBjYW4gYmUgYSBnb29kIGlkZWEgdG8gaW1wbGVtZW50IHNvbWUgcmF0ZS1saW1pdGluZyBtZWNoYW5pc20gdG8gcHJldmVudCBvdmVyZmxvd2luZyB0aGUgbG9ncyB3aXRoIG1hbnkgZHVwbGljYXRlIGNvcGllcyBvZiB0aGUgc2FtZSAob3IgdmVyeSBzaW1pbGFyKSBpbmZvcm1hdGlvbi4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotTG9zc2VzIG9mIG5ldHdvcmsgY29ubmVjdGl2aXR5IGFyZSBjb25zaWRlcmVkIGNvbW1vbiBhbmQgZnVsbHkgZXhwZWN0ZWQgYW5kIHNob3VsZCBub3QgYmUgbG9nZ2VkIGdyYXR1aXRvdXNseS4gQSBsb3NzIG9mIG5ldHdvcmsgY29ubmVjdGl2aXR5IHRoYXQgaGFzIGNvbnNlcXVlbmNlcyB3aXRoaW4gYW4gYXBwIHNob3VsZCBiZSBsb2dnZWQgYXQgdGhlIERFQlVHIG9yIFZFUkJPU0UgbGV2ZWwgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb25zZXF1ZW5jZXMgYXJlIHNlcmlvdXMgZW5vdWdoIGFuZCB1bmV4cGVjdGVkIGVub3VnaCB0byBiZSBsb2dnZWQgaW4gYSByZWxlYXNlIGJ1aWxkKS4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotQSBmdWxsIGZpbGVzeXN0ZW0gb24gYSBmaWxlc3lzdGVtIHRoYXQgaXMgYWNjZWVzc2libGUgdG8gb3Igb24gYmVoYWxmIG9mIHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGJlIGxvZ2dlZCBhdCBhIGxldmVsIGhpZ2hlciB0aGFuIElORk9STUFUSVZFLgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci1JbnZhbGlkIGRhdGEgY29taW5nIGZyb20gYW55IHVudHJ1c3RlZCBzb3VyY2UgKGluY2x1ZGluZyBhbnkgZmlsZSBvbiBzaGFyZWQgc3RvcmFnZSwgb3IgZGF0YSBjb21pbmcgdGhyb3VnaCBqdXN0IGFib3V0IGFueSBuZXR3b3JrIGNvbm5lY3Rpb25zKSBpcyBjb25zaWRlcmVkIGV4cGVjdGVkIGFuZCBzaG91bGQgbm90IHRyaWdnZXIgYW55IGxvZ2dpbmcgYXQgYSBsZXZlbCBoaWdoZXIgdGhlbiBERUJVRyB3aGVuIGl0J3MgZGV0ZWN0ZWQgdG8gYmUgaW52YWxpZCAoYW5kIGV2ZW4gdGhlbiBsb2dnaW5nIHNob3VsZCBiZSBhcyBsaW1pdGVkIGFzIHBvc3NpYmxlKS4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotS2VlcCBpbiBtaW5kIHRoYXQgdGhlICcrJyBvcGVyYXRvciwgd2hlbiB1c2VkIG9uIFN0cmluZ3MsIGltcGxpY2l0bHkgY3JlYXRlcyBhIFN0cmluZ0J1aWxkZXIgd2l0aCB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZSAoMTYgY2hhcmFjdGVycykgYW5kIHBvdGVudGlhbGx5IHF1aXRlIGEgZmV3IG90aGVyIHRlbXBvcmFyeSBTdHJpbmcgb2JqZWN0cywgaS5lLiB0aGF0IGV4cGxpY2l0bHkgY3JlYXRpbmcgU3RyaW5nQnVpbGRlcnMgaXNuJ3QgbW9yZSBleHBlbnNpdmUgdGhhbiByZWx5aW5nIG9uIHRoZSBkZWZhdWx0ICcrJyBvcGVyYXRvciAoYW5kIGNhbiBiZSBhIGxvdCBtb3JlIGVmZmljaWVudCBpbiBmYWN0KS4gQWxzbyBrZWVwIGluIG1pbmQgdGhhdCBjb2RlIHRoYXQgY2FsbHMgTG9nLnYoKSBpcyBjb21waWxlZCBhbmQgZXhlY3V0ZWQgb24gcmVsZWFzZSBidWlsZHMsIGluY2x1ZGluZyBidWlsZGluZyB0aGUgc3RyaW5ncywgZXZlbiBpZiB0aGUgbG9ncyBhcmVuJ3QgYmVpbmcgcmVhZC4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotQW55IGxvZ2dpbmcgdGhhdCBpcyBtZWFudCB0byBiZSByZWFkIGJ5IG90aGVyIHBlb3BsZSBhbmQgdG8gYmUgYXZhaWxhYmxlIGluIHJlbGVhc2UgYnVpbGRzIHNob3VsZCBiZSB0ZXJzZSB3aXRob3V0IGJlaW5nIGNyeXB0aWMsIGFuZCBzaG91bGQgYmUgcmVhc29uYWJseSB1bmRlcnN0YW5kYWJsZS4gVGhpcyBpbmNsdWRlcyBhbGwgbG9nZ2luZyB1cCB0byB0aGUgREVCVUcgbGV2ZWwuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLVdoZW4gcG9zc2libGUsIGxvZ2dpbmcgc2hvdWxkIGJlIGtlcHQgb24gYSBzaW5nbGUgbGluZSBpZiBpdCBtYWtlcyBzZW5zZS4gTGluZSBsZW5ndGhzIHVwIHRvIDgwIG9yIDEwMCBjaGFyYWN0ZXJzIGFyZSBwZXJmZWN0bHkgYWNjZXB0YWJsZSwgd2hpbGUgbGVuZ3RocyBsb25nZXIgdGhhbiBhYm91dCAxMzAgb3IgMTYwIGNoYXJhY3RlcnMgKGluY2x1ZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YWcpIHNob3VsZCBiZSBhdm9pZGVkIGlmIHBvc3NpYmxlLgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci1Mb2dnaW5nIHRoYXQgcmVwb3J0cyBzdWNjZXNzZXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYXQgbGV2ZWxzIGhpZ2hlciB0aGFuIFZFUkJPU0UuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLVRlbXBvcmFyeSBsb2dnaW5nIHRoYXQgaXMgdXNlZCB0byBkaWFnbm9zZSBhbiBpc3N1ZSB0aGF0J3MgaGFyZCB0byByZXByb2R1Y2Ugc2hvdWxkIGJlIGtlcHQgYXQgdGhlIERFQlVHIG9yIFZFUkJPU0UgbGV2ZWwsIGFuZCBzaG91bGQgYmUgZW5jbG9zZWQgYnkgaWYgYmxvY2tzIHRoYXQgYWxsb3cgdG8gZGlzYWJsZSBpdCBlbnRpcmVseSBhdCBjb21waWxlLXRpbWUuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLUJlIGNhcmVmdWwgYWJvdXQgc2VjdXJpdHkgbGVha3MgdGhyb3VnaCB0aGUgbG9nLiBQcml2YXRlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBhdm9pZGVkLiBJbmZvcm1hdGlvbiBhYm91dCBwcm90ZWN0ZWQgY29udGVudCBtdXN0IGRlZmluaXRlbHkgYmUgYXZvaWRlZC4gVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB3aGVuIHdyaXRpbmcgZnJhbWV3b3JrIGNvZGUgYXMgaXQncyBub3QgZWFzeSB0byBrbm93IGluIGFkdmFuY2Ugd2hhdCB3aWxsIGFuZCB3aWxsIG5vdCBiZSBwcml2YXRlIGluZm9ybWF0aW9uIG9yIHByb3RlY3RlZCBjb250ZW50LgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci1TeXN0ZW0ub3V0LnByaW50bG4oKSAob3IgcHJpbnRmKCkgZm9yIG5hdGl2ZSBjb2RlKSBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciBnZXQgcmVkaXJlY3RlZCB0byAvZGV2L251bGwsIHNvIHlvdXIgcHJpbnQgc3RhdGVtZW50cyB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3RzLiBIb3dldmVyLCBhbGwgdGhlIHN0cmluZyBidWlsZGluZyB0aGF0IGhhcHBlbnMgZm9yIHRoZXNlIGNhbGxzIHN0aWxsIGdldHMgZXhlY3V0ZWQuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLTxiPlRoZSBnb2xkZW4gcnVsZSBvZiBsb2dnaW5nIGlzIHRoYXQgeW91ciBsb2dzIG1heSBub3QgdW5uZWNlc3NhcmlseSBwdXNoIG90aGVyIGxvZ3Mgb3V0IG9mIHRoZSBidWZmZXIsIGp1c3QgYXMgb3RoZXJzIG1heSBub3QgcHVzaCBvdXQgeW91cnMuPC9iPgotPC9wPgotPGgyPgotSmF2YXRlc3RzIFN0eWxlIFJ1bGVzCi08L2gyPgorPHA+PGk+Tm90ZTo8L2k+IFdpdGhpbiBhIGdpdmVuIG1vZHVsZSwgb3RoZXIgdGhhbiBhdCB0aGUgVkVSQk9TRSBsZXZlbCwgYW4KK2Vycm9yIHNob3VsZCBvbmx5IGJlIHJlcG9ydGVkIG9uY2UgaWYgcG9zc2libGU6IHdpdGhpbiBhIHNpbmdsZSBjaGFpbiBvZgorZnVuY3Rpb24gY2FsbHMgd2l0aGluIGEgbW9kdWxlLCBvbmx5IHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUKK2Vycm9yLCBhbmQgY2FsbGVycyBpbiB0aGUgc2FtZSBtb2R1bGUgc2hvdWxkIG9ubHkgYWRkIHNvbWUgbG9nZ2luZyBpZiB0aGF0CitzaWduaWZpY2FudGx5IGhlbHBzIHRvIGlzb2xhdGUgdGhlIGlzc3VlLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBJbiBhIGNoYWluIG9mIG1vZHVsZXMsIG90aGVyIHRoYW4gYXQgdGhlIFZFUkJPU0UgbGV2ZWwsIHdoZW4gYQorbG93ZXItbGV2ZWwgbW9kdWxlIGRldGVjdHMgaW52YWxpZCBkYXRhIGNvbWluZyBmcm9tIGEgaGlnaGVyLWxldmVsIG1vZHVsZSwgdGhlCitsb3dlci1sZXZlbCBtb2R1bGUgc2hvdWxkIG9ubHkgbG9nIHRoaXMgc2l0dWF0aW9uIHRvIHRoZSBERUJVRyBsb2csIGFuZCBvbmx5CitpZiBsb2dnaW5nIHByb3ZpZGVzIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IG90aGVyd2lzZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlci4KK1NwZWNpZmljYWxseSwgdGhlcmUgaXMgbm8gbmVlZCB0byBsb2cgc2l0dWF0aW9ucyB3aGVyZSBhbiBleGNlcHRpb24gaXMgdGhyb3duCisodGhlIGV4Y2VwdGlvbiBzaG91bGQgY29udGFpbiBhbGwgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uKSwgb3Igd2hlcmUgdGhlIG9ubHkKK2luZm9ybWF0aW9uIGJlaW5nIGxvZ2dlZCBpcyBjb250YWluZWQgaW4gYW4gZXJyb3IgY29kZS4gVGhpcyBpcyBlc3BlY2lhbGx5CitpbXBvcnRhbnQgaW4gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGZyYW1ld29yayBhbmQgYXBwbGljYXRpb25zLCBhbmQKK2NvbmRpdGlvbnMgY2F1c2VkIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBwcm9wZXJseSBoYW5kbGVkIGJ5IHRoZQorZnJhbWV3b3JrIHNob3VsZCBub3QgdHJpZ2dlciBsb2dnaW5nIGhpZ2hlciB0aGFuIHRoZSBERUJVRyBsZXZlbC4gVGhlIG9ubHkKK3NpdHVhdGlvbnMgdGhhdCBzaG91bGQgdHJpZ2dlciBsb2dnaW5nIGF0IHRoZSBJTkZPUk1BVElWRSBsZXZlbCBvciBoaWdoZXIgaXMKK3doZW4gYSBtb2R1bGUgb3IgYXBwbGljYXRpb24gZGV0ZWN0cyBhbiBlcnJvciBhdCBpdHMgb3duIGxldmVsIG9yIGNvbWluZyBmcm9tCithIGxvd2VyIGxldmVsLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBXaGVuIGEgY29uZGl0aW9uIHRoYXQgd291bGQgbm9ybWFsbHkganVzdGlmeSBzb21lIGxvZ2dpbmcgaXMKK2xpa2VseSB0byBvY2N1ciBtYW55IHRpbWVzLCBpdCBjYW4gYmUgYSBnb29kIGlkZWEgdG8gaW1wbGVtZW50IHNvbWUKK3JhdGUtbGltaXRpbmcgbWVjaGFuaXNtIHRvIHByZXZlbnQgb3ZlcmZsb3dpbmcgdGhlIGxvZ3Mgd2l0aCBtYW55IGR1cGxpY2F0ZQorY29waWVzIG9mIHRoZSBzYW1lIChvciB2ZXJ5IHNpbWlsYXIpIGluZm9ybWF0aW9uLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBMb3NzZXMgb2YgbmV0d29yayBjb25uZWN0aXZpdHkgYXJlIGNvbnNpZGVyZWQgY29tbW9uIGFuZCBmdWxseQorZXhwZWN0ZWQgYW5kIHNob3VsZCBub3QgYmUgbG9nZ2VkIGdyYXR1aXRvdXNseS4gQSBsb3NzIG9mIG5ldHdvcmsgY29ubmVjdGl2aXR5Cit0aGF0IGhhcyBjb25zZXF1ZW5jZXMgd2l0aGluIGFuIGFwcCBzaG91bGQgYmUgbG9nZ2VkIGF0IHRoZSBERUJVRyBvciBWRVJCT1NFCitsZXZlbCAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbnNlcXVlbmNlcyBhcmUgc2VyaW91cyBlbm91Z2ggYW5kIHVuZXhwZWN0ZWQKK2Vub3VnaCB0byBiZSBsb2dnZWQgaW4gYSByZWxlYXNlIGJ1aWxkKS48L3A+Cis8cD48aT5Ob3RlOjwvaT4gQSBmdWxsIGZpbGVzeXN0ZW0gb24gYSBmaWxlc3lzdGVtIHRoYXQgaXMgYWNjZWVzc2libGUgdG8gb3Igb24KK2JlaGFsZiBvZiB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBiZSBsb2dnZWQgYXQgYSBsZXZlbCBoaWdoZXIgdGhhbgorSU5GT1JNQVRJVkUuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IEludmFsaWQgZGF0YSBjb21pbmcgZnJvbSBhbnkgdW50cnVzdGVkIHNvdXJjZSAoaW5jbHVkaW5nIGFueQorZmlsZSBvbiBzaGFyZWQgc3RvcmFnZSwgb3IgZGF0YSBjb21pbmcgdGhyb3VnaCBqdXN0IGFib3V0IGFueSBuZXR3b3JrCitjb25uZWN0aW9ucykgaXMgY29uc2lkZXJlZCBleHBlY3RlZCBhbmQgc2hvdWxkIG5vdCB0cmlnZ2VyIGFueSBsb2dnaW5nIGF0IGEKK2xldmVsIGhpZ2hlciB0aGVuIERFQlVHIHdoZW4gaXQncyBkZXRlY3RlZCB0byBiZSBpbnZhbGlkIChhbmQgZXZlbiB0aGVuCitsb2dnaW5nIHNob3VsZCBiZSBhcyBsaW1pdGVkIGFzIHBvc3NpYmxlKS48L3A+Cis8cD48aT5Ob3RlOjwvaT4gS2VlcCBpbiBtaW5kIHRoYXQgdGhlICcrJyBvcGVyYXRvciwgd2hlbiB1c2VkIG9uIFN0cmluZ3MsCitpbXBsaWNpdGx5IGNyZWF0ZXMgYSBTdHJpbmdCdWlsZGVyIHdpdGggdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgKDE2CitjaGFyYWN0ZXJzKSBhbmQgcG90ZW50aWFsbHkgcXVpdGUgYSBmZXcgb3RoZXIgdGVtcG9yYXJ5IFN0cmluZyBvYmplY3RzLCBpLmUuCit0aGF0IGV4cGxpY2l0bHkgY3JlYXRpbmcgU3RyaW5nQnVpbGRlcnMgaXNuJ3QgbW9yZSBleHBlbnNpdmUgdGhhbiByZWx5aW5nIG9uCit0aGUgZGVmYXVsdCAnKycgb3BlcmF0b3IgKGFuZCBjYW4gYmUgYSBsb3QgbW9yZSBlZmZpY2llbnQgaW4gZmFjdCkuIEFsc28ga2VlcAoraW4gbWluZCB0aGF0IGNvZGUgdGhhdCBjYWxscyBMb2cudigpIGlzIGNvbXBpbGVkIGFuZCBleGVjdXRlZCBvbiByZWxlYXNlCitidWlsZHMsIGluY2x1ZGluZyBidWlsZGluZyB0aGUgc3RyaW5ncywgZXZlbiBpZiB0aGUgbG9ncyBhcmVuJ3QgYmVpbmcKK3JlYWQuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IEFueSBsb2dnaW5nIHRoYXQgaXMgbWVhbnQgdG8gYmUgcmVhZCBieSBvdGhlciBwZW9wbGUgYW5kIHRvIGJlCithdmFpbGFibGUgaW4gcmVsZWFzZSBidWlsZHMgc2hvdWxkIGJlIHRlcnNlIHdpdGhvdXQgYmVpbmcgY3J5cHRpYywgYW5kIHNob3VsZAorYmUgcmVhc29uYWJseSB1bmRlcnN0YW5kYWJsZS4gVGhpcyBpbmNsdWRlcyBhbGwgbG9nZ2luZyB1cCB0byB0aGUgREVCVUcKK2xldmVsLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBXaGVuIHBvc3NpYmxlLCBsb2dnaW5nIHNob3VsZCBiZSBrZXB0IG9uIGEgc2luZ2xlIGxpbmUgaWYgaXQKK21ha2VzIHNlbnNlLiBMaW5lIGxlbmd0aHMgdXAgdG8gODAgb3IgMTAwIGNoYXJhY3RlcnMgYXJlIHBlcmZlY3RseSBhY2NlcHRhYmxlLAord2hpbGUgbGVuZ3RocyBsb25nZXIgdGhhbiBhYm91dCAxMzAgb3IgMTYwIGNoYXJhY3RlcnMgKGluY2x1ZGluZyB0aGUgbGVuZ3RoIG9mCit0aGUgdGFnKSBzaG91bGQgYmUgYXZvaWRlZCBpZiBwb3NzaWJsZS48L3A+Cis8cD48aT5Ob3RlOjwvaT4gTG9nZ2luZyB0aGF0IHJlcG9ydHMgc3VjY2Vzc2VzIHNob3VsZCBuZXZlciBiZSB1c2VkIGF0IGxldmVscworaGlnaGVyIHRoYW4gVkVSQk9TRS48L3A+Cis8cD48aT5Ob3RlOjwvaT4gVGVtcG9yYXJ5IGxvZ2dpbmcgdGhhdCBpcyB1c2VkIHRvIGRpYWdub3NlIGFuIGlzc3VlIHRoYXQncworaGFyZCB0byByZXByb2R1Y2Ugc2hvdWxkIGJlIGtlcHQgYXQgdGhlIERFQlVHIG9yIFZFUkJPU0UgbGV2ZWwsIGFuZCBzaG91bGQgYmUKK2VuY2xvc2VkIGJ5IGlmIGJsb2NrcyB0aGF0IGFsbG93IHRvIGRpc2FibGUgaXQgZW50aXJlbHkgYXQgY29tcGlsZS10aW1lLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBCZSBjYXJlZnVsIGFib3V0IHNlY3VyaXR5IGxlYWtzIHRocm91Z2ggdGhlIGxvZy4gUHJpdmF0ZQoraW5mb3JtYXRpb24gc2hvdWxkIGJlIGF2b2lkZWQuIEluZm9ybWF0aW9uIGFib3V0IHByb3RlY3RlZCBjb250ZW50IG11c3QKK2RlZmluaXRlbHkgYmUgYXZvaWRlZC4gVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB3aGVuIHdyaXRpbmcgZnJhbWV3b3JrCitjb2RlIGFzIGl0J3Mgbm90IGVhc3kgdG8ga25vdyBpbiBhZHZhbmNlIHdoYXQgd2lsbCBhbmQgd2lsbCBub3QgYmUgcHJpdmF0ZQoraW5mb3JtYXRpb24gb3IgcHJvdGVjdGVkIGNvbnRlbnQuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IFN5c3RlbS5vdXQucHJpbnRsbigpIChvciBwcmludGYoKSBmb3IgbmF0aXZlIGNvZGUpIHNob3VsZAorbmV2ZXIgYmUgdXNlZC4gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciBnZXQgcmVkaXJlY3RlZCB0byAvZGV2L251bGwsIHNvIHlvdXIKK3ByaW50IHN0YXRlbWVudHMgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0cy4gSG93ZXZlciwgYWxsIHRoZSBzdHJpbmcKK2J1aWxkaW5nIHRoYXQgaGFwcGVucyBmb3IgdGhlc2UgY2FsbHMgc3RpbGwgZ2V0cyBleGVjdXRlZC48L3A+Cis8cD48aT5Ob3RlOjwvaT4gPGI+VGhlIGdvbGRlbiBydWxlIG9mIGxvZ2dpbmcgaXMgdGhhdCB5b3VyIGxvZ3MgbWF5IG5vdAordW5uZWNlc3NhcmlseSBwdXNoIG90aGVyIGxvZ3Mgb3V0IG9mIHRoZSBidWZmZXIsIGp1c3QgYXMgb3RoZXJzIG1heSBub3QgcHVzaAorb3V0IHlvdXJzLjwvYj48L3A+CiAKLTxoMj48YT5OYW1pbmcgdGVzdCBtZXRob2RzPC9hPgotPC9oMj4KLTxhPldoZW4gbmFtaW5nIHRlc3QgbWV0aG9kcywgeW91IGNhbiB1c2UgYW4gdW5kZXJzY29yZSB0byBzZXBlcmF0ZSB3aGF0IGlzIGJlaW5nIHRlc3RlZCBmcm9tIHRoZSBzcGVjaWZpYyBjYXNlIGJlaW5nIHRlc3RlZC4gVGhpcyBzdHlsZSBtYWtlcyBpdCBlYXNpZXIgdG8gc2VlIGV4YWN0bHkgd2hhdCBjYXNlcyBhcmUgYmVpbmcgdGVzdGVkLjwvYT4KLTxwPjxhPkV4YW1wbGU6PC9hPgotPC9wPgotPHByZT48YT50ZXN0TWV0aG9kX3NwZWNpZmljQ2FzZTEgPGJyPnRlc3RNZXRob2Rfc3BlY2lmaWNDYXNlMjwvYT4KLTwvcHJlPgorPGgyPkphdmF0ZXN0cyBTdHlsZSBSdWxlczwvaDI+Cis8aDI+PGEgbmFtZT0idGVzdG1ldGhvZG5hbWVzIj48L2E+TmFtaW5nIHRlc3QgbWV0aG9kczwvaDI+Cis8cD5XaGVuIG5hbWluZyB0ZXN0IG1ldGhvZHMsIHlvdSBjYW4gdXNlIGFuIHVuZGVyc2NvcmUgdG8gc2VwZXJhdGUgd2hhdCBpcworYmVpbmcgdGVzdGVkIGZyb20gdGhlIHNwZWNpZmljIGNhc2UgYmVpbmcgdGVzdGVkLiBUaGlzIHN0eWxlIG1ha2VzIGl0IGVhc2llcgordG8gc2VlIGV4YWN0bHkgd2hhdCBjYXNlcyBhcmUgYmVpbmcgdGVzdGVkLjwvcD4KKzxwPjxhPkZvciBleGFtcGxlOjwvYT48L3A+Cis8cHJlPnRlc3RNZXRob2Rfc3BlY2lmaWNDYXNlMSB0ZXN0TWV0aG9kX3NwZWNpZmljQ2FzZTI8L3ByZT4KIAotPHByZT48YT52b2lkIHRlc3RJc0Rpc3Rpbmd1aXNoYWJsZV9wcm90YW5vcGlhKCkgezxicj5Db2xvck1hdGNoZXIgY29sb3JNYXRjaGVyID0gbmV3IENvbG9yTWF0Y2hlcihQUk9UQU5PUElBKTxicj5hc3NlcnRGYWxzZShjb2xvck1hdGNoZXIuaXNEaXN0aW5ndWlzaGFibGUoQ29sb3IuUkVELCBDb2xvci5CTEFDSykpPGJyPmFzc2VydFRydWUoY29sb3JNYXRjaGVyLmlzRGlzdGluZ3Vpc2hhYmxlKENvbG9yLlgsIENvbG9yLlkpKTxicj59PC9hPgorPHByZT52b2lkIHRlc3RJc0Rpc3Rpbmd1aXNoYWJsZV9wcm90YW5vcGlhKCkgeworICAgIENvbG9yTWF0Y2hlciBjb2xvck1hdGNoZXIgPSBuZXcgQ29sb3JNYXRjaGVyKFBST1RBTk9QSUEpCisgICAgYXNzZXJ0RmFsc2UoY29sb3JNYXRjaGVyLmlzRGlzdGluZ3Vpc2hhYmxlKENvbG9yLlJFRCwgQ29sb3IuQkxBQ0spKQorICAgIGFzc2VydFRydWUoY29sb3JNYXRjaGVyLmlzRGlzdGluZ3Vpc2hhYmxlKENvbG9yLlgsIENvbG9yLlkpKQorfQogPC9wcmU+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvZG93bmxvYWQuamQgYi9wZGsvZG9jcy9zb3VyY2UvZG93bmxvYWQuamQKaW5kZXggMzI5ZGVmZi4uYzc4NmJkYyAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL2Rvd25sb2FkLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9kb3dubG9hZC5qZApAQCAtMSw2ICsxLDcgQEAKIHBhZ2UudGl0bGU9R2V0IEFuZHJvaWQgU291cmNlIENvZGUKIGRvYy50eXBlPXNvdXJjZQogQGpkOmJvZHkKKzxkaXY+CiA8ZGl2Pjxicj5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gc2V0IHVwIHlvdXIgbG9jYWwgd29yayBlbnZpcm9ubWVudCwgaG93IHRvIHVzZSBSZXBvIHRvIGdldCB0aGUgQW5kcm9pZCBmaWxlcywgYW5kIGhvdyB0byBidWlsZCB0aGUgZmlsZXMgb24geW91ciBtYWNoaW5lLjxicj48YnI+UmVsYXRlZCByZWFkaW5nOjxicj48L2Rpdj4KIDx1bD48bGk+Rm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBlbnRpcmUgY29kZS1yZXZpZXcgYW5kIGNvZGUtdXBkYXRlIHByb2Nlc3MsIHNlZQogPGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9saWZlLW9mLWEtcGF0Y2guaHRtbCI+TGlmZSBvZiBhIFBhdGNoPC9hPgpAQCAtMjMsMzAgKzI0LDIxIEBACiBUaGUgQW5kcm9pZCBidWlsZCBpcyByb3V0aW5lbHkgdGVzdGVkIG9uIHJlY2VudCB2ZXJzaW9ucyBvZiBVYnVudHUgKDYuMDYgYW5kIGxhdGVyKSwgYnV0IHJlcG9ydHMgb2Ygc3VjY2Vzc2VzIG9yIGZhaWx1cmVzIG9uIG90aGVyIGRpc3RyaWJ1dGlvbnMgYXJlIHdlbGNvbWUuPGJyPjxoND4KIFVidW50dSBMaW51eCAoMzItYml0IHg4Nik8L2g0PgogPGRpdj5UbyBzZXQgdXAgeW91ciBMaW51eCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgbWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmc6PC9kaXY+Ci08ZGl2PjxkaXY+PGRpdj48dWw+PGxpPlJlcXVpcmVkIFBhY2thZ2VzOjwvbGk+Cis8ZGl2Pjx1bD48bGk+UmVxdWlyZWQgUGFja2FnZXM6PC9saT4KIDx1bD48bGk+R2l0IDEuNS40IG9yIG5ld2VyIDxzcGFuPmFuZCB0aGUgR05VIFByaXZhY3kgR3VhcmQuPGJyPjwvc3Bhbj4KIDwvbGk+CiA8L3VsPgogPC91bD4KIDwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2PjxkaXY+PGRpdj48dWw+PHVsPjxsaT5KREsgNS4wLCB1cGRhdGUgMTIgb3IgaGlnaGVyLkphdmEgNiBpcyBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIG9mIGluY29tcGF0aWJpbGl0aWVzIHdpdGggQE92ZXJyaWRlLjxicj48L2xpPgorPGRpdj48dWw+PHVsPjxsaT5KREsgNS4wLCB1cGRhdGUgMTIgb3IgaGlnaGVyLkphdmEgNiBpcyBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIG9mIGluY29tcGF0aWJpbGl0aWVzIHdpdGggQE92ZXJyaWRlLjxicj48L2xpPgogPC91bD4KIDwvdWw+CiA8L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdj48ZGl2PjxkaXY+PHVsPjx1bD48bGk+PHNwYW4+ZmxleCwgYmlzb24sIGdwZXJmLCBsaWJzZGwtZGV2LCBsaWJlc2QwLWRldiwgbGlid3hndGsyLjYtZGV2IChvcHRpb25hbCksIGJ1aWxkLWVzc2VudGlhbCwgemlwLCBjdXJsLjwvc3Bhbj4KKzxkaXY+PHVsPjx1bD48bGk+PHNwYW4+ZmxleCwgYmlzb24sIGdwZXJmLCBsaWJzZGwtZGV2LCBsaWJlc2QwLWRldiwgbGlid3hndGsyLjYtZGV2IChvcHRpb25hbCksIGJ1aWxkLWVzc2VudGlhbCwgemlwLCBjdXJsLjwvc3Bhbj4KIDwvbGk+CiA8L3VsPgogPC91bD4KIDwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgogPGJsb2NrcXVvdGU+PHNwYW4+JCBzdWRvIGFwdC1nZXQgaW5zdGFsbDwvc3Bhbj4KIDxzcGFuPmdpdC1jb3JlIGdudXBnPC9zcGFuPgogPHNwYW4+c3VuLWphdmE1LWpkazwvc3Bhbj4KQEAgLTU0LDE0ICs0NiwxMSBAQAogbGlid3hndGsyLjYtZGV2IGJ1aWxkLWVzc2VudGlhbCB6aXAgPHNwYW4+Y3VybCBsaWJuY3Vyc2VzNS1kZXYgemxpYjFnLWRldiA8YnI+PC9zcGFuPgogPC9zcGFuPgogPC9ibG9ja3F1b3RlPgotPGRpdj48ZGl2PjxkaXY+PGRpdj48dWw+PGxpPjxzcGFuPjxzcGFuPllvdSBtaWdodCBhbHNvIHdhbnQgVmFsZ3JpbmQsIGEgdG9vbCB0aGF0IHdpbGwgaGVscCB5b3UgZmluZCBtZW1vcnkgbGVha3MsIHN0YWNrIGNvcnJ1cHRpb24sIGFycmF5IGJvdW5kcyBvdmVyZmxvd3MsIGV0Yy48L3NwYW4+Cis8ZGl2Pjx1bD48bGk+PHNwYW4+PHNwYW4+WW91IG1pZ2h0IGFsc28gd2FudCBWYWxncmluZCwgYSB0b29sIHRoYXQgd2lsbCBoZWxwIHlvdSBmaW5kIG1lbW9yeSBsZWFrcywgc3RhY2sgY29ycnVwdGlvbiwgYXJyYXkgYm91bmRzIG92ZXJmbG93cywgZXRjLjwvc3Bhbj4KIDwvc3Bhbj4KIDwvbGk+CiA8L3VsPgogPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+CiA8YmxvY2txdW90ZT48ZGl2PjxzcGFuPiQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgdmFsZ3JpbmQgPGJyPjwvc3Bhbj4KIDwvZGl2PgogPC9ibG9ja3F1b3RlPgpAQCAtNzAsOCArNTksNyBAQAogOC4xMCkgdXNlcnMgbWF5IG5lZWQgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYnJlYWRsaW5lOjwvbGk+CiA8L3VsPgogPGRpdj4kIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYjMycmVhZGxpbmU1LWRldiA8YnI+PC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2PjxoND4KKzxkaXY+PGg0PgogVWJ1bnR1IExpbnV4ICg2NC1iaXQgeDg2KTwvaDQ+CiBUaGlzIGhhcyBub3QgYmVlbiBhcyB3ZWxsIHRlc3RlZC4gUGxlYXNlIHNlbmQgc3VjY2VzcyBvciBmYWlsdXJlIHJlcG9ydHMgdG8gPGEgaHJlZj0ibWFpbHRvOmFuZHJvaWQtcG9ydGluZ0Bnb29nbGVncm91cHMuY29tIj5hbmRyb2lkLXBvcnRpbmdAZ29vZ2xlZ3JvdXBzLmNvbTwvYT4KIC48L2Rpdj4KQEAgLTg2LDE5ICs3NCwxNiBAQAogPC91bD4KIDwvdWw+CiA8L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KIDxibG9ja3F1b3RlPjxzcGFuPjxzcGFuPiQ8L3NwYW4+CiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBnaXQtY29yZSBnbnVwZyBmbGV4IGJpc29uIGdwZXJmIGJ1aWxkLWVzc2VudGlhbCB6aXAgY3VybDwvc3Bhbj4KIHN1bi1qYXZhNS1qZGsgPHNwYW4+PHNwYW4+emxpYjFnLWRldjwvc3Bhbj4KIDwvc3Bhbj4KIGdjYy1tdWx0aWxpYiBnKystbXVsdGlsaWIgbGliYzYtZGV2LWkzODYgbGliMzJuY3Vyc2VzNS1kZXYgaWEzMi1saWJzIHgxMXByb3RvLWNvcmUtZGV2IGxpYngxMS1kZXYgbGliMzJyZWFkbGluZTUtZGV2IGxpYjMyei1kZXY8L2Jsb2NrcXVvdGU+Ci08dWw+PGxpPlNldCB0aGUgc3lzdGVtIHRvIHVzZSB0aGUgcmlnaHQgdmVyc2lvbiBvZiBqYXZhIGJ5IGRlZmF1bHQ6PGJyPjxicj4kc3VkbyB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXNqYXZhLTEuNS4wLXN1biA8YnI+PC9saT4KKzx1bD48bGk+U2V0IHRoZSBzeXN0ZW0gdG8gdXNlIHRoZSByaWdodCB2ZXJzaW9uIG9mIGphdmEgYnkgZGVmYXVsdDo8YnI+PGJyPiQgc3VkbyB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjUuMC1zdW4gPGJyPjwvbGk+CiA8L3VsPgogPHVsPjxsaT5YMTE6IFVidW50dSBkb2Vzbid0IGhhdmUgcGFja2FnZXMgZm9yIHRoZSBYMTEgbGlicmFyaWVzLCBidXQgdGhhdCBjYW4gYmUgd29ya2VkIGFyb3VuZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8YnI+PGJyPiQgc3VkbyBsbiAtcyAvdXNyL2xpYjMyL2xpYlgxMS5zby42IC91c3IvbGliMzIvbGliWDExLnNvIDxicj48YnI+PC9saT4KIDwvdWw+Ci08ZGl2PjxkaXY+PGRpdj48ZGl2PjxkaXY+PGg0PgorPGRpdj48aDQ+CiBSdW5uaW5nIExpbnV4IGluIGEgdmlydHVhbCBtYWNoaW5lPC9oND4KIElmIHlvdSBhcmUgcnVubmluZyBMaW51eCBpbiBhIHZpcnR1YWwgbWFjaGluZSwgeW91IHdpbGwgbmVlZCBhdCBsZWFzdCAxLjVHQiBvZiBSQU0gYW5kIDEwR0Igb3IgbW9yZSBvZiBkaXNrIHNwYWNlIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBBbmRyb2lkIHRyZWUuPGJyPjxoND4KIE90aGVyIExpbnV4PC9oND4KQEAgLTEzNSw0MiArMTIwLDM0IEBACiA8bGk+dm9sdW1lIGZvcm1hdDogY2FzZSBzZW5zaXRpdmUsIGpvdXJuYWxlZDwvbGk+CiA8L3VsPgogPC9saT4KLTxsaT5UaGlzIHdpbGwgY3JlYXRlIGEgLmRtZyBmaWxlIHdoaWNoLCBvbmNlIG1vdW50ZWQsIGFjdHMgYXMgYSBkcml2ZSB3aXRoIHRoZSByZXF1aXJlZCBmb3JtYXR0aW5nIGZvciBBbmRyb2lkIGRldmVsb3BtZW50LiBGb3IgYSBkaXNrIGltYWdlIG5hbWVkICJhbmRyb2lkLmRtZyIgc3RvcmVkIGluIHlvdXIgaG9tZSBkaXJlY3RvcnksIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGUgdG8gbW91bnQgdGhlIGltYWdlIHdoZW4geW91IGV4ZWN1dGUgIm1vdW50QW5kcm9pZCI6PGJyPjxicj48ZGl2PiMgY29tbWFuZCB0byBtb3VudCB0aGUgYW5kcm9pZCBmaWxlIGltYWdlIDxicj5mdW5jdGlvbiBtb3VudEFuZHJvaWR7IGhkaXV0aWwgYXR0YWNoIH4vYW5kcm9pZC5kbWctbW91bnRwb2ludCAvVm9sdW1lcy9hbmRyb2lkOyB9PGJyPjwvZGl2PgorPGxpPlRoaXMgd2lsbCBjcmVhdGUgYSAuZG1nIGZpbGUgd2hpY2gsIG9uY2UgbW91bnRlZCwgYWN0cyBhcyBhIGRyaXZlIHdpdGggdGhlIHJlcXVpcmVkIGZvcm1hdHRpbmcgZm9yIEFuZHJvaWQgZGV2ZWxvcG1lbnQuIEZvciBhIGRpc2sgaW1hZ2UgbmFtZWQgImFuZHJvaWQuZG1nIiBzdG9yZWQgaW4geW91ciBob21lIGRpcmVjdG9yeSwgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIH4vLmJhc2hfcHJvZmlsZSB0byBtb3VudCB0aGUgaW1hZ2Ugd2hlbiB5b3UgZXhlY3V0ZSAibW91bnRBbmRyb2lkIjo8YnI+PGJyPjxkaXY+IyBjb21tYW5kIHRvIG1vdW50IHRoZSBhbmRyb2lkIGZpbGUgaW1hZ2UgPGJyPmZ1bmN0aW9uIG1vdW50QW5kcm9pZCB7IGhkaXV0aWwgYXR0YWNoIH4vYW5kcm9pZC5kbWcgLW1vdW50cG9pbnQgL1ZvbHVtZXMvYW5kcm9pZDsgfTxicj48L2Rpdj4KIDxicj5PbmNlIG1vdW50ZWQsIHlvdSdsbCBkbyBhbGwgeW91ciB3b3JrIGluIHRoZSAiYW5kcm9pZCIgdm9sdW1lLiBZb3UgY2FuIGVqZWN0IGl0ICh1bm1vdW50IGl0KSBqdXN0IGxpa2UgeW91IHdvdWxkIHdpdGggYW4gZXh0ZXJuYWwgZHJpdmUuPC9saT4KIDwvdWw+CiA8L3VsPgogPC91bD4KIDx1bD48L3VsPgotVG8gc2V0IHVwIHlvdXIgTWFjIE9TIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PGJyPjxvbD48bGk+SW5zdGFsbCB0aGUgWENvZGUgdmVyc2lvbiAyLjQgb3IgbGF0ZXIgZnJvbSA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS8iPmh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tPC9hPi4gV2UgcmVjb21tZW5kIHZlcnNpb24gMy4wIG9yIG5ld2VyLjxicj48L2xpPgorVG8gc2V0IHVwIHlvdXIgTWFjIE9TIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PGJyPgorPG9sPjxsaT5JbnN0YWxsIHRoZSBYQ29kZSB2ZXJzaW9uIDIuNCBvciBsYXRlciBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tLyI+aHR0cDovL2RldmVsb3Blci5hcHBsZS5jb208L2E+LiBXZSByZWNvbW1lbmQgdmVyc2lvbiAzLjAgb3IgbmV3ZXIuPGJyPjwvbGk+CiA8bGk+SW5zdGFsbCBNYWNQb3J0cy4gVG8gZG8gdGhpczo8L2xpPgotPG9sPjxsaT5Eb3dubG9hZCB0aGUgdGFyIGZpbGUgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3Lm1hY3BvcnRzLm9yZy8iPmh0dHA6Ly93d3cubWFjcG9ydHMub3JnLzwvYT4gYW5kIHVudGFyIHRoZSBmaWxlcy48L2xpPgotPGxpPlJ1biB0aGUgZm9sbG93aW5nOjxzcGFuPjxicj4kIC4vY29uZmlndXJlIDxicj48L3NwYW4+Ci08c3Bhbj4kPC9zcGFuPgotPHNwYW4+bWFrZSA8YnI+PC9zcGFuPgotPHNwYW4+JDwvc3Bhbj4KLTxzcGFuPnN1ZG8gbWFrZSBpbnN0YWxsPC9zcGFuPgotPC9saT4KLTxsaT5NYWtlIHN1cmUgdGhhdCAvb3B0L2xvY2FsL2JpbiBpcyBpbiB5b3VyIHBhdGggYmVmb3JlIC91c3IvYmluLiBieSBydW5uaW5nIDxicj4kIGVjaG8gJFBBVEggPGJyPklmIHlvdSBkb24ndCBzZWUgL29wdC9sb2NhbC9iaW4sIGVkaXQgJEhPTUUvLmJhc2hfcHJvZmlsZSBhbmQgYWRkIHRoZSBsaW5lIDxicj5leHBvcnQgUEFUSD0vb3B0L2xvY2FsL2JpbjokUEFUSCA8YnI+KG9yIHRoZSBlcXVpdmFsZW50IGZvciBvdGhlciBzaGVsbHMpIGFmdGVyIGFueSBvdGhlciBQQVRILXJlbGF0ZWQgbGluZXMuPHNwYW4+VG8gdmVyaWZ5IHRoYXQgeW91ciBwYXRoIGlzIG5vdyBjb3JyZWN0LCBvPC9zcGFuPgotcGVuIGEgbmV3IHRlcm1pbmFsIGFuZCA8c3Bhbj5ydW48L3NwYW4+Ci1lY2hvICRQQVRIIDxzcGFuPmFnYWluPC9zcGFuPgotLjwvbGk+Ci08bGk+QXNrIE1hY1BvcnRzIHRvIHVwZGF0ZSBpdHNlbGY6PGJyPjxzcGFuPjwvc3Bhbj4KLTxzcGFuPiQ8L3NwYW4+Ci08c3Bhbj5zdWRvIHBvcnQgc2VsZnVwZGF0ZTwvc3Bhbj4KLTxicj48L2xpPgorPG9sPgorICAgIDxsaT5Eb3dubG9hZCBhbmQgcnVuIHRoZSBpbnN0YWxsZXIgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3Lm1hY3BvcnRzLm9yZy9pbnN0YWxsLnBocCI+aHR0cDovL3d3dy5tYWNwb3J0cy5vcmcvaW5zdGFsbC5waHA8L2E+PC9saT4KKyAgICA8bGk+TWFrZSBzdXJlIHRoYXQgPGNvZGU+L29wdC9sb2NhbC9iaW48L2NvZGU+IGlzIGluIHlvdXIgcGF0aCBiZWZvcmUgPGNvZGU+L3Vzci9iaW48L2NvZGU+IGJ5IHJ1bm5pbmcKKyAgICAgICAgPGRpdj48Y29kZT4kIGVjaG8gJFBBVEg8L2NvZGU+PC9kaXY+CisgICAgICAgIDxkaXY+IElmIHlvdSBkb24ndCBzZWUgL29wdC9sb2NhbC9iaW4sIGVkaXQgPGNvZGU+JEhPTUUvLmJhc2hfcHJvZmlsZTwvY29kZT4gYW5kIGFkZCB0aGUgbGluZSA8Y29kZT5leHBvcnQgUEFUSD0vb3B0L2xvY2FsL2JpbjokUEFUSDwvY29kZT4KKyAgICAgICAgYWZ0ZXIgYW55IG90aGVyIFBBVEgtcmVsYXRlZCBsaW5lcy4gVG8gdmVyaWZ5IHRoYXQgeW91ciBwYXRoIGlzIG5vdyBjb3JyZWN0LCBvcGVuIGEgbmV3IHRlcm1pbmFsIGFuZCBydW4gPGNvZGU+ZWNobyAkUEFUSDwvY29kZT4gYWdhaW4uPC9kaXY+CisgICAgPC9saT4KIDwvb2w+Ci08bGk+R2V0IHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgZnJvbSBwb3J0Ojxicj4kPHNwYW4+UE9TSVhMWV9DT1JSRUNUPTE8L3NwYW4+Ci1zdWRvIHBvcnQgaW5zdGFsbCBnbWFrZSBsaWJzZGwgZ2l0LWNvcmUgZ251cGcgPGJyPjxzcGFuPklmIHVzaW5nIE1hYyBPUyAxMC40LCBhbHNvIGluc3RhbGw6PGJyPiQ8c3Bhbj5QT1NJWExZX0NPUlJFQ1Q9MTwvc3Bhbj4KKzxsaT5HZXQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBmcm9tIHBvcnQ6PGJyPiQgPHNwYW4+UE9TSVhMWV9DT1JSRUNUPTE8L3NwYW4+CitzdWRvIHBvcnQgaW5zdGFsbCBnbWFrZSBsaWJzZGwgZ2l0LWNvcmUgZ251cGcgPGJyPjxzcGFuPklmIHVzaW5nIE1hYyBPUyAxMC40LCBhbHNvIGluc3RhbGw6PGJyPiQgPHNwYW4+UE9TSVhMWV9DT1JSRUNUPTE8L3NwYW4+CiBzdWRvIHBvcnQgaW5zdGFsbCBiaXNvbiA8YnI+PC9zcGFuPgogPC9saT4KLTxsaT5VcGdyYWRlIEdOVSBtYWtlIHRvIDMuODEgb3IgbGF0ZXIgYnkgcnVubmluZy5NYWMgT1MgZG9lc24ndCBjb21lIHdpdGggYSByZWNlbnQgZW5vdWdoIHZlcnNpb24uPGJyPiQgc3VkbyBsbiAtcyBnbWFrZSAvb3B0L2xvY2FsL2Jpbi9tYWtlIDxicj48L2xpPgorPGxpPlVwZ3JhZGUgR05VIG1ha2UgdG8gMy44MSBvciBsYXRlciBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZC4gKE1hYyBPUyBkb2Vzbid0IGNvbWUgd2l0aCBhIHJlY2VudCBlbm91Z2ggdmVyc2lvbi4pPGJyPiQgc3VkbyBsbiAtcyBnbWFrZSAvb3B0L2xvY2FsL2Jpbi9tYWtlIDxicj48L2xpPgogPGxpPlNldCBhbiBhcHByb3ByaWF0ZSBwZXItcHJvY2VzcyBmaWxlIGRlc2NyaXB0b3IgbGltaXQuIFRvIGRvIHRoaXMsIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHlvdXIgPGk+PHNwYW4+LmJhc2hfcHJvZmlsZTwvc3Bhbj4KIDwvaT4KLWZpbGU6PGJyPiMgc2V0IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlcyB0byBiZSAxMDI0PGJyPnVsaW1pdCAtUyAtbiAxMDI0PC9saT4KK2ZpbGU6PGJyPiMgc2V0IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlcyB0byBiZSAxMDI0PGJyPiQgPHNwYW4+dWxpbWl0IC1TIC1uIDEwMjQ8L3NwYW4+PGJyPgorTm90ZSB0aGF0IHRoaXMgbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IG9uIHNvbWUgc3lzdGVtcywgdGhlIG91dHB1dCBvZiAidWxpbWl0IC1TIiB3aWxsIHNob3cgInVubGltaXRlZCIuIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlIGxpbWl0IHRvIDEwMjQuPC9saT4KIDwvb2w+CiA8L2Rpdj4KLTwvZGl2PgotPC9kaXY+CiA8ZGl2Pjxicj48L2Rpdj4KIDxoMj4KIEluc3RhbGxpbmcgUmVwbyA8YnI+PC9oMj4KQEAgLTE4MCwxNCArMTU3LDEzIEBACiAuPGJyPjwvcD4KIFRvIGluc3RhbGwsIGluaXRpYWxpemUsIGFuZCBjb25maWd1cmUgUmVwbywgZm9sbG93IHRoZXNlIHN0ZXBzOjxicj48YnI+PC9kaXY+CiA8b2w+PGxpPjxzcGFuPk1ha2Ugc3VyZSB5b3UgaGF2ZSBhfi9iaW5kaXJlY3RvcnkgaW4geW91ciBob21lIGRpcmVjdG9yeSwgYW5kIGNoZWNrIHRvIGJlIHN1cmUgdGhhdCB0aGlzIGJpbiBkaXJlY3RvcnkgaXMgaW4geW91ciBwYXRoOjwvc3Bhbj4KLTxicj4kIGNkfjxicj48c3Bhbj48c3Bhbj4kIG1rZGlyIGJpbiA8YnI+JCBlY2hvICRQQVRIIDxicj48L3NwYW4+Cis8YnI+JCBjZCB+PGJyPjxzcGFuPjxzcGFuPiQgbWtkaXIgYmluIDxicj4kIGVjaG8gJFBBVEggPGJyPjwvc3Bhbj4KIDwvc3Bhbj4KIDwvbGk+CiA8bGk+PHNwYW4+RG93bmxvYWQgdGhlcmVwb3NjcmlwdCBhbmQgbWFrZSBzdXJlIGl0IGlzIGV4ZWN1dGFibGU6PC9zcGFuPgotPGJyPiQgY3VybCBodHRwOi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy9yZXBvfi9iaW4vcmVwbyA8ZGl2PiQgY2htb2QgYSt4IH4vYmluL3JlcG88L2Rpdj4KKzxicj4kIGN1cmwgaHR0cDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvcmVwbyAmZ3Q7fi9iaW4vcmVwbyA8ZGl2PiQgY2htb2QgYSt4IH4vYmluL3JlcG88L2Rpdj4KIDwvbGk+CiA8L29sPgotPC9kaXY+CiA8ZGl2PjxwPjxicj48L3A+CiA8aDI+CiBJbml0aWFsaXppbmcgYSBSZXBvIGNsaWVudCA8YnI+PC9oMj4KQEAgLTE5Nyw3ICsxNzMsNyBAQAogPHNwYW4+JCBta2RpciBteWRyb2lkPC9zcGFuPgogPGJyPjxzcGFuPiQgY2QgbXlkcm9pZDwvc3Bhbj4KIDxicj48L2xpPgotPGxpPjxzcGFuPlJ1bnJlcG8gaW5pdHRvIGJyaW5nIGRvd24gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFJlcG8gd2l0aCBhbGwgaXRzIG1vc3QgcmVjZW50IGJ1ZyBmaXhlcy4gWW91IG11c3Qgc3BlY2lmeSBhIFVSTCBmb3IgdGhlIG1hbmlmZXN0Ojwvc3Bhbj4KKzxsaT48c3Bhbj5SdW4gInJlcG8gaW5pdCIgdG8gYnJpbmcgZG93biB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUmVwbyB3aXRoIGFsbCBpdHMgbW9zdCByZWNlbnQgYnVnIGZpeGVzLiBZb3UgbXVzdCBzcGVjaWZ5IGEgVVJMIGZvciB0aGUgbWFuaWZlc3Q6PC9zcGFuPgogPGJyPjxzcGFuPiQgcmVwbyBpbml0PC9zcGFuPgogLXUgZ2l0Oi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy9wbGF0Zm9ybS9tYW5pZmVzdC5naXQ8L2xpPgogPHVsPjxsaT48c3Bhbj5JZiB5b3Ugd291bGQgbGlrZSB0byBjaGVjayBvdXQgYSBicmFuY2ggb3RoZXIgdGhhbiAibWFzdGVyIiwgc3BlY2lmeSBpdCB3aXRoIC1iLCBsaWtlOjwvc3Bhbj4KQEAgLTIzOCwxNSArMjE0LDEzIEBACiBHZXR0aW5nIHRoZSBmaWxlczwvaDI+CiA8ZGl2PjxzcGFuPjxzcGFuPlRvIHB1bGwgZG93biBmaWxlcyB0byB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGZyb20gdGhlIHJlcG9zaXRvcmllcyBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlZmF1bHQgbWFuaWZlc3QsIHJ1bjwvc3Bhbj4KIDxicj48YnI+JCByZXBvIHN5bmMgPGk+PGJyPjwvaT4KLTxicj48c3Bhbj5Gb3IgbW9yZSBhYm91dHJlcG8gc3luY2FuZCBvdGhlciBSZXBvIGNvbW1hbmRzLCBzZWU8L3NwYW4+Cis8YnI+PHNwYW4+Rm9yIG1vcmUgYWJvdXQgInJlcG8gc3luYyIgYW5kIG90aGVyIFJlcG8gY29tbWFuZHMsIHNlZTwvc3Bhbj4KIDxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvZ2l0LXJlcG8uaHRtbCI+VXNpbmcgUmVwbyBhbmQgR2l0PC9hPgogPHNwYW4+Ljwvc3Bhbj4KIDxicj48YnI+PHNwYW4+VGhlIEFuZHJvaWQgc291cmNlIGZpbGVzIHdpbGwgYmUgbG9jYXRlZCBpbiB5b3VyIHdvcmtpbmcKIGRpcmVjdG9yeSB1bmRlciB0aGVpciBwcm9qZWN0IG5hbWVzLjwvc3Bhbj4KIDwvc3Bhbj4KIDxicj48L2Rpdj4KLTxzcGFuPjxoMj4KLTxicj48L2gyPgogPGgyPgogVmVyaWZ5aW5nIEdpdCBUYWdzPC9oMj4KIDxzcGFuPkxvYWQgdGhlIGZvbGxvd2luZyBwdWJsaWMga2V5IGludG8geW91ciBHbnVQRyBrZXkgZGF0YWJhc2UuVGhlIGtleSBpcyB1c2VkIHRvIHNpZ24gYW5ub3RhdGVkIHRhZ3MgdGhhdCByZXByZXNlbnQgcmVsZWFzZXMuPC9zcGFuPgpAQCAtMjk4LDYgKzI3MiwzIEBACiBjb2RlLXJldmlldyBzZXJ2ZXIsIHNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL3N1Ym1pdC1wYXRjaGVzLmh0bWwiPkNvbnRyaWJ1dGU8L2E+CiAuPC9zcGFuPgogPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvZ2l0LXJlcG8uamQgYi9wZGsvZG9jcy9zb3VyY2UvZ2l0LXJlcG8uamQKaW5kZXggODkwNTc4MC4uM2FiYjBlMyAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL2dpdC1yZXBvLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9naXQtcmVwby5qZApAQCAtMSw2ICsxLDcgQEAKIHBhZ2UudGl0bGU9VXNpbmcgUmVwbyBhbmQgR2l0CiBkb2MudHlwZT1zb3VyY2UKIEBqZDpib2R5Cis8ZGl2PgogPHA+VG8gd29yayB3aXRoIHRoZSBBbmRyb2lkIGNvZGUsIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGJvdGggR2l0IGFuZCBSZXBvLjxicj48L3A+CiA8dWw+PGxpPjxpPkdpdDwvaT4KIGlzIGFuIG9wZW4tc291cmNlIHZlcnNpb24tY29udHJvbCBzeXN0ZW0gZGVzaWduZWQgdG8gaGFuZGxlIHZlcnkgbGFyZ2UgcHJvamVjdHMgdGhhdCBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZSByZXBvc2l0b3JpZXMuIEluIHRoZSBjb250ZXh0IG9mIEFuZHJvaWQsIHdlIHVzZSBHaXQgZm9yIGxvY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBsb2NhbCBicmFuY2hpbmcsIGNvbW1pdHMsIGRpZmZzLCBhbmQgZWRpdHMuPGJyPjxicj48L2xpPgpAQCAtMjIsOCArMjMsOCBAQAogSW4gbW9zdCBzaXR1YXRpb25zLCB5b3UgY2FuIHVzZSBHaXQgaW5zdGVhZCBvZiBSZXBvLCBvciBtaXggUmVwbyBhbmQgR2l0CiBjb21tYW5kcyB0byBmb3JtIGNvbXBsZXggY29tbWFuZHMuIFVzaW5nIFJlcG8gZm9yIGJhc2ljIGFjcm9zcy1uZXR3b3JrCiBvcGVyYXRpb25zIHdpbGwgbWFrZSB5b3VyIHdvcmsgbXVjaCBzaW1wbGVyLCBob3dldmVyLgotPGJyPjwvZGl2PgotPGRpdj48ZGl2PjxoMj4KKzxicj4KKzxkaXY+PGgyPgogVGFzayByZWZlcmVuY2UgPGJyPjwvaDI+CiBUaGUgdGFzayBsaXN0IGJlbG93IHNob3dzIGEgc3VtbWFyeSBvZiBob3cgdG8gZG8gY29tbW9uIFJlcG8gYW5kIEdpdCB0YXNrcy4KIEZvciBjb21wbGV0ZSBxdWljay1zdGFydCBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMsIHNlZSA8YQpAQCAtMzE2LDQgKzMxNywzIEBACiBBdCBpbnRlcnZhbHMsIHlvdSB1c2UgZ2l0IGNvbW1pdCB0byBzYXZlIGEgc25hcHNob3Qgb2YgdGhlIHN0YWdlZCBmaWxlcyBhbmQgYSBsb2cgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgY2hhbmdlLjxicj48YnI+PGk+TWFuaWZlc3Q8L2k+CiA8YnI+QSBtYW5pZmVzdCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIHJlcG9zaXRvcmllcyBhbmQgYSBtYXBwaW5nIG9mIHdoZXJlIHRoZSBmaWxlcyBmcm9tIHRoZXNlIHJlcG9zaXRvcmllcyB3aWxsIGJlIGxvY2F0ZWQgd2l0aGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIFdoZW4geW91IHN5bmNocm9uaXplIHlvdXIgZmlsZXMsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhlIHJlcG9zaXRvcmllcyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIG1hbmlmZXN0IHdpbGwgYmUgcHVsbGVkIGludG8geW91ciB3b3JraW5nIGRpcmVjdG9yeS48L2Rpdj4KIDwvZGl2PgotPC9kaXY+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvaW5kZXguamQgYi9wZGsvZG9jcy9zb3VyY2UvaW5kZXguamQKaW5kZXggMjMwYTBiMy4uYTlhY2JmNCAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL2luZGV4LmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9pbmRleC5qZApAQCAtMyw3ICszLDcgQEAKIEBqZDpib2R5CiA8ZGl2PgogPHA+VGhhbmtzIGZvciB5b3VyIGludGVyZXN0IGluIEFuZHJvaWQhIEhlcmUgYXJlIHNvbWUgd2F5cyB5b3UgY2FuIGdldCBpbnZvbHZlZAotYW5kIGhlbHAgR29vZ2xlIGltcHJvdmUgQW5kcm9pZC4gRm9yIGJhY2tncm91bmQgb24gdGhlIEFuZHJvaWQgcHJvamVjdCBhbmQgb3VyCithbmQgaGVscCB1cyBpbXByb3ZlIEFuZHJvaWQuIEZvciBiYWNrZ3JvdW5kIG9uIHRoZSBBbmRyb2lkIHByb2plY3QgYW5kIG91cgogZ29hbHMsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWFib3V0L3BoaWxvc29waHkuaHRtbCI+UHJvamVjdAogUGhpbG9zb3BoeSBwYWdlPC9hPi48L3A+CiAKQEAgLTExLDcgKzExLDcgQEAKIDxwPk9uZSBvZiB0aGUgZWFzaWVzdCBhbmQgbW9zdCBlZmZlY3RpdmUgd2F5cyB5b3UgY2FuIGhlbHAgaW1wcm92ZSBBbmRyb2lkIGlzCiB0byBmaWxlIGJ1Z3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdCB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvcmVwb3J0LWJ1Z3MuaHRtbCI+UmVwb3J0aW5nIEJ1Z3M8L2E+IHBhZ2UuPC9wPgotPHA+UGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4ndCBndWFyYW50ZWUgdGhhdCBhbnkgcGFydGljdWxhciBidWcgY2FuIGJlIGZpeGVkIGluCis8cD5QbGVhc2Ugbm90ZSB0aGF0IHdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IGFueSBwYXJ0aWN1bGFyIGJ1ZyB3aWxsIGJlIGZpeGVkIGluCiBhbnkgcGFydGljdWxhciByZWxlYXNlLiBUbyBzZWUgd2hhdCBoYXBwZW5zIHRvIHlvdXIgYnVnIG9uY2UgeW91IHJlcG9ydCBpdCwKIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9saWZlLW9mLWEtYnVnLmh0bWwiPkxpZmUgb2YgYSBCdWc8L2E+LjwvcD4KIApAQCAtMjYsOCArMjYsMTAgQEAKIAogPGgyPkNvbnRyaWJ1dGUgdG8gdGhlIENvZGU8L2gyPgogPHA+Q29kZSBpcyBLaW5nLiBXZSdkIGxvdmUgdG8gcmV2aWV3IGFueSBjaGFuZ2VzIHlvdSBzdWJtaXQsIHNvIHBsZWFzZSBjaGVjawotb3V0IHRoZSBzb3VyY2UsIHBpY2sgYSBidWcgb3IgZmVhdHVyZSwgYW5kIGdldCBjb2RpbmcuPC9wPgotPHA+WW91IGNhbiBnZXQgc3RhcnRlZCB3aXRoICBieSBsZWFybmluZyBhYm91dCB0aGUgPGEKK291dCB0aGUgc291cmNlLCBwaWNrIGEgYnVnIG9yIGZlYXR1cmUsIGFuZCBnZXQgY29kaW5nLiBOb3RlIHRoYXQgdGhlIHNtYWxsZXIKK2FuZCBtb3JlIHRhcmdldHRlZCB5b3VyIHBhdGNoIHN1Ym1pc3Npb25zLCB0aGUgZWFzaWVyIGl0IHdpbGwgYmUgZm9yIHVzIHRvCityZXZpZXcgdGhlbS48L3A+Cis8cD5Zb3UgY2FuIGdldCBzdGFydGVkIHdpdGggQW5kcm9pZCBieSBsZWFybmluZyBhYm91dCB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvbGlmZS1vZi1hLXBhdGNoLmh0bWwiPkxpZmUgb2YgYSBQYXRjaDwvYT4sIGFuZCBieQogbGVhcm5pbmcgYWJvdXQgPGNvZGU+Z2l0PC9jb2RlPiwgPGNvZGU+cmVwbzwvY29kZT4sIGFuZCBvdGhlciB0b29scyB1c2luZyB0aGUKIGxpbmtzIHRvIHRoZSBsZWZ0LiBJZiB5b3UgbmVlZCBoZWxwIGFsb25nIHRoZSB3YXksIHlvdSBjYW4gam9pbiBvdXIgPGEKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9saWNlbnNlcy5qZCBiL3Bkay9kb2NzL3NvdXJjZS9saWNlbnNlcy5qZAppbmRleCA4NDZhOTJhLi4xN2NlYmViIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvbGljZW5zZXMuamQKKysrIGIvcGRrL2RvY3Mvc291cmNlL2xpY2Vuc2VzLmpkCkBAIC00LDE4ICs0LDE1IEBACiA8ZGl2PgogPHA+VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCB1c2VzIGEgZmV3IDxhCiBocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnLyI+b3BlbiBzb3VyY2UgaW5pdGlhdGl2ZTwvYT4gYXBwcm92ZWQgb3Blbgotc291cmNlIGxpY2Vuc2VzIHRvIGVuYWJsZSBhdmFpbGFiaWxpdHkgb2Ygc291cmNlIGNvZGUgYW5kIHRvIGFjY2VwdAotY29udHJpYnV0aW9ucyBmcm9tIGluZGl2aWR1YWxzIGFuZCBjb3Jwb3JhdGlvbnMuPC9wPgorc291cmNlIGxpY2Vuc2VzIGZvciBvdXIgc29mdHdhcmUuPC9wPgogPGgyPkFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCBsaWNlbnNlPC9oMj4KLTxwPlRoZSBwcmVmZXJyZWQgbGljZW5zZSBmb3IgdGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCBpcyA8YQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5BcGFjaGUgMi4wPC9hPi4gQXBhY2hlIDIuMAotaXMgYSBjb21tZXJjaWFsIGFuZCBvcGVuIHNvdXJjZSBmcmllbmRseSBvcGVuIHNvdXJjZSBsaWNlbnNlLiBUaGUgbWFqb3JpdHkgb2YKLXRoZSBBbmRyb2lkIHBsYXRmb3JtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSA8YQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyI+QXBhY2hlIDIuMCBsaWNlbnNlPC9hPi4gV2hpbGUgdGhlCi1wcm9qZWN0IHdpbGwgc3RyaXZlIHRvIGFkaGVyZSB0byB0aGUgcHJlZmVycmVkIGxpY2Vuc2UsIHRoZXJlIG1heSBiZQotZXhjZXB0aW9ucyB3aGljaCB3aWxsIGJlIGhhbmRsZWQgb24gYSBjYXNlLWJ5LWNhc2UgYmFzaXMuIEZvciBleGFtcGxlLCB0aGUKLUxpbnV4IGtlcm5lbCBwYXRjaGVzIGFyZSB1bmRlciB0aGUgR1BMdjIgbGljZW5zZSB3aXRoIHN5c3RlbSBleGNlcHRpb25zLCB3aGljaAotY2FuIGJlIGZvdW5kIG9uIDxhCis8cD5UaGUgcHJlZmVycmVkIGxpY2Vuc2UgZm9yIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgaXMgdGhlIDxhCitocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLAorMi4wPC9hPiAoIkFwYWNoZSAyLjAiKSwgYW5kIHRoZSBtYWpvcml0eSBvZiB0aGUgQW5kcm9pZCBzb2Z0d2FyZSBpcyBsaWNlbnNlZAord2l0aCBBcGFjaGUgMi4wLiBXaGlsZSB0aGUgcHJvamVjdCB3aWxsIHN0cml2ZSB0byBhZGhlcmUgdG8gdGhlIHByZWZlcnJlZAorbGljZW5zZSwgdGhlcmUgbWF5IGJlIGV4Y2VwdGlvbnMgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIG9uIGEgY2FzZS1ieS1jYXNlCitiYXNpcy4gRm9yIGV4YW1wbGUsIHRoZSBMaW51eCBrZXJuZWwgcGF0Y2hlcyBhcmUgdW5kZXIgdGhlIEdQTHYyIGxpY2Vuc2Ugd2l0aAorc3lzdGVtIGV4Y2VwdGlvbnMsIHdoaWNoIGNhbiBiZSBmb3VuZCBvbiA8YQogaHJlZj0iaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvQ09QWUlORyI+a2VybmVsLm9yZzwvYT4uCiA8L3A+CiA8aDI+Q29udHJpYnV0b3IgTGljZW5zZSBHcmFudHM8L2gyPgpAQCAtMjUsMTUgKzIyLDE1IEBACiBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2NsYS1pbmRpdmlkdWFsLmh0bWwiPkluZGl2aWR1YWwKIENvbnRyaWJ1dG9yIExpY2Vuc2UgR3JhbnQ8L2E+LiBUaGUgZ3JhbnQgY2FuIGJlIGV4ZWN1dGVkIG9ubGluZSB0aHJvdWdoIHRoZSA8YQogaHJlZj0iaHR0cHM6Ly9yZXZpZXcuc291cmNlLmFuZHJvaWQuY29tLyNzZXR0aW5ncyxhZ3JlZW1lbnRzIj5jb2RlIHJldmlldwotdG9vbDwvYT4uIFRoZSBhZ3JlZW1lbnQgY2xlYXJseSBkZWZpbmVzIHRoZSB0ZXJtcyB1bmRlciB3aGljaCBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IGhhcyBiZWVuIGNvbnRyaWJ1dGVkIHRvIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuVGhpcyBsaWNlbnNlCit0b29sPC9hPi4gVGhlIGdyYW50IGNsZWFybHkgZGVmaW5lcyB0aGUgdGVybXMgdW5kZXIgd2hpY2ggaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBoYXMgYmVlbiBjb250cmlidXRlZCB0byB0aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LiBUaGlzIGxpY2Vuc2UKIGlzIGZvciB5b3VyIHByb3RlY3Rpb24gYXMgYSBjb250cmlidXRvciBhcyB3ZWxsIGFzIHRoZSBwcm90ZWN0aW9uIG9mIHRoZQogcHJvamVjdDsgaXQgZG9lcyBub3QgY2hhbmdlIHlvdXIgcmlnaHRzIHRvIHVzZSB5b3VyIG93biBjb250cmlidXRpb25zIGZvciBhbnkKIG90aGVyIHB1cnBvc2UuPC9wPgogPHA+Rm9yIGEgPGI+Y29ycG9yYXRpb248L2I+IChvciBvdGhlciBlbnRpdHkpIHRoYXQgaGFzIGFzc2lnbmVkIGVtcGxveWVlcyB0bwogd29yayBvbiB0aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LCBhIDxhCiBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2NsYS1jb3Jwb3JhdGUuaHRtbCI+Q29ycG9yYXRlCi1Db250cmlidXRvciBMaWNlbnNlIEdyYW50PC9hPiBpcyBhdmFpbGFibGUuIFRoaXMgdmVyc2lvbiBvZiB0aGUgR3JhbnQgYWxsb3dzIGEKK0NvbnRyaWJ1dG9yIExpY2Vuc2UgR3JhbnQ8L2E+IGlzIGF2YWlsYWJsZS4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBncmFudCBhbGxvd3MgYQogY29ycG9yYXRpb24gdG8gYXV0aG9yaXplIGNvbnRyaWJ1dGlvbnMgc3VibWl0dGVkIGJ5IGl0cyBkZXNpZ25hdGVkIGVtcGxveWVlcwogYW5kIHRvIGdyYW50IGNvcHlyaWdodCBhbmQgcGF0ZW50IGxpY2Vuc2VzLiBOb3RlIHRoYXQgYSBDb3Jwb3JhdGUgQ29udHJpYnV0b3IKIExpY2Vuc2UgR3JhbnQgZG9lcyBub3QgcmVtb3ZlIHRoZSBuZWVkIGZvciBhbnkgZGV2ZWxvcGVyIHRvIHNpZ24gdGhlaXIgb3duCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvbGlmZS1vZi1hLWJ1Zy5qZCBiL3Bkay9kb2NzL3NvdXJjZS9saWZlLW9mLWEtYnVnLmpkCmluZGV4IDFkNThhZTEuLjVkNzdmN2EgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9saWZlLW9mLWEtYnVnLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9saWZlLW9mLWEtYnVnLmpkCkBAIC01Nyw3ICs1Nyw3IEBACiB3aGljaCBpcyBjb25zaWRlcmVkIHRoZSAibWFzdGVyIiBjb3B5LiAoRm9yIGluc3RhbmNlLCBHb29nbGUgbWFpbnRhaW5zIG9uZQogc3VjaCBwcml2YXRlIGlzc3VlIHRyYWNrZXIsIGludGVuZGVkIHByaW1hcmlseSBmb3IgYnVncyB3aGljaCBjb250YWluCiBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2hpY2ggY2FuJ3QgYmUgcmV2ZWFsZWQgcHVibGljbHkuKTwvcD48L2xpPgotPGxpPjxiPkFzc2lnbmVkPC9iPjxsaT5MaWtlIDxjb2RlPlVuYXNzaWduZWQ8L2NvZGU+LCBidXQgdGhlIGJ1ZyBoYXMgYmVlbgorPGxpPjxiPkFzc2lnbmVkPC9iPjxwPkxpa2UgPGNvZGU+VW5hc3NpZ25lZDwvY29kZT4sIGJ1dCB0aGUgYnVnIGhhcyBiZWVuCiBhY3R1YWxseSBhc3NpZ25lZCB0byBhIHNwZWNpZmljIGNvbnRyaWJ1dG9yIHRvIGZpeC48L3A+PC9saT4KIDwvdWw+CiA8cD5UeXBpY2FsbHksIGEgZ2l2ZW4gYnVnIHdpbGwgc3RhcnQgaW4gPGNvZGU+VW5hc3NpZ25lZDwvY29kZT4sIHdoZXJlIGl0CkBAIC03Nyw4ICs3Nyw4IEBACiA8bGk+PGI+U3BhbTwvYj48cD5BIGtpbmQgc291bCBzZW50IHVzIHNvbWUgZGVsaWNpb3VzIHBvcmsgcHJvZHVjdHMsIHRoYXQgd2UsCiByZWdyZXR0YWJseSwgZG8gbm90IHdhbnQuPC9wPjwvbGk+CiA8bGk+PGI+UXVlc3Rpb248L2I+PHA+U29tZW9uZSBtaXN0b29rIHRoZSBpc3N1ZSB0cmFja2VyIGZvciBhIGhlbHAgZm9ydW0uCi0oVGhpcyBpcyBub3QgYXMgdW5jb21tb24gYXMgb25lIG1pZ2h0IGFzc3VtZTogbWFueSB1c2VycyB3aG9zZSBuYXRpdmUgbGFuZ3VhZ2UKLWlzbid0IEVuZ2xpc2ggY2FuIG1ha2UgdGhpcyBtaXN0YWtlLik8L3A+PC9saT4KKyhUaGlzIGlzIG5vdCBhcyB1bmNvbW1vbiBhcyB5b3UgbWlnaHQgdGhpbms6IG1hbnkgdXNlcnMgd2hvc2UgbmF0aXZlIGxhbmd1YWdlCitpc24ndCBFbmdsaXNoIG1pc3VuZGVyc3RhbmQgdGhlIHNpdGUgYW5kIG1ha2UgdGhpcyBtaXN0YWtlLik8L3A+PC9saT4KIDxsaT48Yj5VbnJlcHJvZHVjaWJsZTwvYj48cD5BbiBBT1NQIGNvbnRyaWJ1dG9yIGF0dGVtcHRlZCB0byByZXByb2R1Y2UgdGhlCiBiZWhhdmlvciBkZXNjcmliZWQsIGFuZCB3YXMgdW5hYmxlIHRvIGRvIHNvLiBUaGlzIHNvbWV0aW1lcyBtZWFucyB0aGF0IHRoZSBidWcKIGlzIGxlZ2l0aW1hdGUgYnV0IHNpbXBseSByYXJlIG9yIGRpZmZpY3VsdCB0byByZXByb2R1Y2UsIGFuZCBzb21ldGltZXMgbWVhbnMKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy0xLjAuamQgYi9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXctMS4wLmpkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI1Y2Q2Li4wMDAwMDAwCi0tLSBhL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy0xLjAuamQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotcGFnZS50aXRsZT1BbmRyb2lkIDEuMCBGZWF0dXJlcwotZG9jLnR5cGU9c291cmNlCi1AamQ6Ym9keQotPGRpdj48ZGl2PjxkaXY+PGRpdj5UaGlzIHBhZ2UgcHJvdmlkZXMgYSBoaWdoLWxldmVsIG92ZXJ2aWV3IG9mIEFuZHJvaWQgMS4wCi1mZWF0dXJlcy4gVG8gc2VlIHRoZSBjb2RlIGl0c2VsZiwgeW91IGNhbiBlaXRoZXIgdXNlIHRoZSA8YSBocmVmPSJodHRwOi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy8iPkdpdFdlYjwvYT4KLWludGVyZmFjZSB0byB2aWV3IHNuYXBzaG90cyBvZiB0aGUgZmlsZXMsIG9yIHlvdSBjYW4gPGEKLWhyZWY9IntAZG9jUm9vdH1zb3VyY2UvZG93bmxvYWQuaHRtbCI+ZG93bmxvYWQ8L2E+Ci10aGUgc291cmNlIGNvZGUgb250byB5b3VyIGxvY2FsIG1hY2hpbmUuPGJyPjxicj48Yj5BcHBsaWNhdGlvbnM8L2I+Ci08YnI+PGJyPlRoZSBBbmRyb2lkIHBsYXRmb3JtIGNvbWVzIHdpdGggYSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucyB3cml0dGVuIHVzaW5nIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlOjxicj48dWw+PGxpPjxpPkhvbWU8L2k+Ci1kaXNwbGF5cyBhcHBsaWNhdGlvbnMsIHdpZGdldHMsIGFuZCBzaG9ydGN1dHMuIEl0IGFsc28gc3VwcG9ydHMgY3VzdG9taXphYmxlIHdhbGwgcGFwZXIuCi08L2xpPgotPGxpPjxpPlBob25lPC9pPgotc3VwcG9ydHMgcmVndWxhciB0ZWxlcGhvbnkgZnVuY3Rpb25zIGFzIHdlbGwgYXMgY2FsbCBjb250cm9scywgY29uZmVyZW5jZSBjYWxscywgc3VwcGxlbWVudGFyeSBzZXJ2aWNlcywgYW5kIGVhc3kgaW50ZWdyYXRpb24gd2l0aCA8aT5Db250YWN0czwvaT4KLS48YnI+PC9saT4KLTxsaT48aT5XZWIgQnJvd3NlcjwvaT4KLWlzIGEgZnVsbHkgZmVhdHVyZWQgV2ViS2l0LWJhc2VkIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBIVE1MIGFuZCBYSFRNTC4KLTwvbGk+Ci08bGk+PGk+RW1haWw8L2k+Ci1wcm92aWRlcyBhY2Nlc3MgdG8gZW1haWwgc2VydmVycyBjb21tb25seSBmb3VuZCBvbiB0aGUgSW50ZXJuZXQgYW5kIHN1cHBvcnRzIFBPUDMsIElNQVA0LCBhbmQgU01UUC4KLTwvbGk+Ci08bGk+PGk+TWVkaWEgUGxheWVyPC9pPgotZW5hYmxlcyBtYW5hZ2luZywgaW1wb3J0aW5nLCBhbmQgcGxheWluZyBiYWNrIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBlbmNvZGVkIGluIHZhcmlvdXMgZm9ybXMuPGJyPjwvbGk+Ci08bGk+PGk+QWxhcm0gQ2xvY2ssIENhbGN1bGF0b3IsIENhbGVuZGFyLCBDYW1lcmEsIENvbnRhY3RzLCBJTSwgTU1TLCBTZXR0aW5ncyw8L2k+Ci08aT5Wb2ljZSBEaWFsZXI8L2k+Ci0sIGFuZCBtYW55IG90aGVyIGFwcGxpY2F0aW9ucyBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGlzIHJlbGVhc2UuPGJyPjwvbGk+Ci08L3VsPgotPGI+QXBwbGljYXRpb24gZnJhbWV3b3JrPC9iPgotPGJyPjxicj48L2Rpdj4KLTxkaXY+VGhlIEFuZHJvaWQgQXBwbGljYXRpb24gRnJhbWV3b3JrIGhhcyBiZWVuIGRlc2lnbmVkIHRvIHByb3ZpZGUgYSByaWNoIHNldCBvZiBBUElzIGZvciB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvaW5kZXguaHRtbCI+QW5kcm9pZCBTREsgZGV2ZWxvcGVyIGd1aWRlPC9hPgotLjxiPjxicj48L2I+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08ZGl2PjxiPkFuZHJvaWQgcnVudGltZTwvYj4KLTxiPjxicj48YnI+PC9iPgotQW5kcm9pZCBhcHBsaWNhdGlvbnMgcnVuIG9uIERhbHZpaywgYSBjdXN0b20gdmlydHVhbCBtYWNoaW5lIChWTSkgZGVzaWduZWQgZm9yIGVtYmVkZGVkIHVzZS4gVGhlIERhbHZpayBWTSBydW5zIGRleCBleGVjdXRhYmxlIGZpbGVzLCB3aGljaCBhcmUgdHlwaWNhbGx5IGNvbXBpbGVkIGZyb20gc291cmNlIGNvZGUgd3JpdHRlbiBpbiBKYXZhLjxicj48YnI+PC9kaXY+Ci08ZGl2PlRoZSBkZXggZXhlY3V0YWJsZSBmb3JtYXQgaXMgZGVzaWduZWQgdG8gaGF2ZSB0aGVzZSBjaGFyYWN0ZXJpc3RpY3M6PGJyPjx1bD48bGk+RWZmaWNpZW50IG9uLWRldmljZSBzdG9yYWdlLgotPC9saT4KLTxsaT5FZmZpY2llbnQgcnVudGltZSBtZW1vcnkgdXNhZ2UuCi08L2xpPgotPGxpPkVhc2Ugb2YgaW50ZXJwcmV0YXRpb24uPGJyPjwvbGk+Ci08L3VsPgotRGFsdmlrIGhhcyB0aGUgZm9sbG93aW5nIHJ1bnRpbWUgY2hhcmFjdGVyaXN0aWNzOgotPHVsPjxsaT5FZmZpY2llbnQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgY29uY3VycmVudCBWTSBwcm9jZXNzZXMsIGluY2x1ZGluZyBhbW9ydGl6ZWQgaW5pdGlhbGl6YXRpb24gYW5kIGhlYXZpbHkgc2hhcmVkIG1lbW9yeS4KLTwvbGk+Ci08bGk+T3B0aW1pemVkIGludGVycHJldGVyLgotPC9saT4KLTxsaT5FZmZpY2llbnQgbGlua2FnZSB0byBsb3ctbGV2ZWwgbmF0aXZlIGNvZGUuCi08L2xpPgotPGxpPkEgZmFtaWxpYXIgYW5kIHJpY2ggc2V0IG9mIGNvcmUgbGlicmFyeSBmdW5jdGlvbmFsaXR5LiBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBsaWJyYXJpZXMsIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9wYWNrYWdlcy5odG1sIj5odHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9wYWNrYWdlcy5odG1sPC9hPgotLgotPC9saT4KLTxsaT5FbmhhbmNlZCBKRFdQIHN1cHBvcnQsIGVuYWJsaW5nIGVhc2llciBkZWJ1Z2dpbmcgb2YgbXVsdGlwbGUgcHJvY2Vzc2VzIHNpbXVsdGFuZW91c2x5LgotPC9saT4KLTxsaT5KTkkgc3VwcG9ydC4KLTwvbGk+Ci08L3VsPgotPGI+TmF0aXZlIGxpYnJhcmllcyA8YnI+PC9iPgotPGJyPlRoZSBBbmRyb2lkIHBsYXRmb3JtIG1ha2VzIHVzZSBvZiBtYW55IG5hdGl2ZSBsaWJyYXJpZXMsIGluY2x1ZGluZzo8YnI+PHVsPjxsaT48aT5CaW9uaWM8L2k+Ci0sIGEgY3VzdG9tIGxpYmMgaW1wbGVtZW50YXRpb24gb3B0aW1pemVkIGZvciBlbWJlZGRlZCBzeXN0ZW1zLgotPC9saT4KLTxsaT5HcmFwaGljcyBsaWJyYXJpZXMgZm9yIDJEIGFuZCAzRCAoT3BlbkdMIEVTIDEuMCkgZ3JhcGhpY3Mgc3VwcG9ydC48YnI+PC9saT4KLTxsaT5vcGVuQ29yZSB0byBwcm92aWRlIHRoZSBidWxrIG9mIEFuZHJvaWQncyBtdWx0aW1lZGlhIGNhcGFiaWxpdHkuIEl0IGluY2x1ZGVzIHN1cHBvcnQgZm9yIG5ldHdvcmsgc3RyZWFtaW5nIChIVFRQIGFuZCBSVFNQKSwgYXMgd2VsbCBhcyBtb3N0IG9mIHRoZSBjb2RlY3MgYW5kIG1lZGlhIGZpbGUgcGFyc2VycyB1c2VkIGJ5IHRoZSBzeXN0ZW0uPGJyPjwvbGk+Ci08bGk+c3FsaXRlIHRvIHN1cHBvcnQgaGF2aW5nIGEgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb25hbCBkYXRhIHN0b3JlLgotPC9saT4KLTxsaT5XZWJLaXQgbGlicmFyeSB0byBwb3dlciBBbmRyb2lkJ3MgV2ViS2l0IGJhc2VkIGZ1bGwgd2ViIGJyb3dzZXIuPGJyPjwvbGk+Ci08L3VsPgotPGJyPjxiPlN5c3RlbSBzb2Z0d2FyZTwvYj4KLTxiPjxicj48L2I+Ci08YnI+PC9kaXY+Ci08ZGl2PkFib3V0IEFuZHJvaWQncyBvcGVyYXRpbmcgc3lzdGVtOgotPHVsPjxsaT5CYXNlZCBvbiBMaW51eCAyLjYuMjUgZm9yIEFSTS48YnI+PC9saT4KLTxsaT5QbGF0Zm9ybSBjdXJyZW50bHkgZXhwZWN0cyBBUk0gVjVUIG9yIGJldHRlciBhcmNoaXRlY3R1cmUuIFN1cHBvcnQgZm9yIGVhcmxpZXIgYXJjaGl0ZWN0dXJlcyBjb3VsZCBiZSBhZGRlZCwgYnV0IENQVXMgd2l0aG91dCBhbiBNTVUgd291bGQgYmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuCi08L2xpPgotPGxpPkEgc2V0IG9mIGtlcm5lbCBlbmhhbmNlbWVudHMgYXJlIHByb3ZpZGVkIHRvIHN1cHBvcnQgQW5kcm9pZC4gVGhlIHBhdGNoZXMgaW5jbHVkZSBhbGFybSwgYXNobWVtLCBiaW5kZXIsIHBvd2VyIG1hbmFnZW1lbnQsIGxvdyBtZW1vcnkga2lsbGVyLCBrZXJuZWwgZGVndWdnZXIsIGFuZCBsb2dnZXIgPGI+Ljxicj48L2I+Ci08L2xpPgotPGxpPldoaWxlIHRoZSBwbGF0Zm9ybSBpcyBkZXNpZ25lZCB0byBiZSBjaGlwc2V0IGFnbm9zdGljLCBhbmQgd2lsbCBydW4gb24gdmlydHVhbGx5IGFueSBBUk0tYmFzZWQgTGludXgga2VybmVsIGVudmlyb25tZW50LCB2ZXJzaW9uIDEuMCBvZiB0aGUgcGxhdGZvcm0gaGFzIGJlZW4gdGVzdGVkIGFuZCB2ZXJpZmllZCBvbiB0aGUgTVNNIDdLIGNoaXBzZXRzIDxiPi48L2I+Ci1PdmVyIHRpbWUgd2UgZXhwZWN0IHRvIHNlZSBzdXBwb3J0IGZvciBvdGhlciBtYWpvciBjaGlwc2V0cy4KLUtlcm5lbCBwYXRjaGVzIGZvciBNU00gYmFzZWQgY2hpcHNldHMgYXJlIGFsc28gYXZhaWxhYmxlLgotPC9saT4KLTxsaT5GQVQzMiBmaWxlIHN5c3RlbSBpcyBzdXBwb3J0ZWQuCi08L2xpPgotPGxpPlN1cHBvcnQgZm9yIFRDUC9JUCAoVENQLCBVRFAsIGV0YykuCi08L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdj5BIG1pbmltYWwgcmVmZXJlbmNlIGJvb3Rsb2FkZXIgZm9yIHRoZSBzdXBwb3J0ZWQgY2hpcHNldCBpcyBwcm92aWRlZC4gSXQgaXMgY2FwYWJsZSBvZiBib290aW5nIExpbnV4IGZyb20gUkFNLCBkZWJ1Z2dlciwgYW5kIE5BTkQgRmxhc2guPGJyPjwvZGl2PgotPGRpdj48YnI+QWJvdXQgQW5kcm9pZCdzIHN1cHBvcnQgZm9yIGRlYnVnZ2luZzo8YnI+PHVsPjxsaT5EZWJ1Z2dpbmcgbmF0aXZlIGNvZGUgaXMgc3VwcG9ydGVkIHZpYSBHREIgKEdOVSBQcm9qZWN0IERlYnVnZ2VyKSBvdmVyIFVTQi4KLTwvbGk+Ci08bGk+RGVidWdnaW5nIG1hbmFnZWQgY29kZSBpcyBzdXBwb3J0ZWQgdmlhIGFueSBKRFdQLWNvbXBhdGlibGUgZGVidWdnZXIgb3ZlciBVU0IuCi08L2xpPgotPGxpPkxvZ2dpbmcgYW5kIGNyYXNoIGxvZ3Mgc3VwcG9ydGVkIGZvciBkZWJ1Z2dpbmcuCi08L2xpPgotPC91bD4KLTxiPlN1cHBvcnRlZCBoYXJkd2FyZSA8YnI+PC9iPgotPHVsPjxsaT5UaGUgcGxhdGZvcm0gd2lsbCBydW4gb24gYWxtb3N0IG9uIGFueSBBUk0gYmFzZWQgTGludXgga2VybmVsIGVudmlyb25tZW50LgotPC9saT4KLTxsaT5UaGUgcGxhdGZvcm0gcmVxdWlyZXMgYSBtaW5pbXVtIG9mIDEyOCBNQiBvZiBSQU0gYW5kIDI1NiBNQiBvZkZsYXNoIG1lbW9yeS4gQW5PRU0gbWF5IHdhbnQgdG8gc3VwcG9ydCBtb3JlIEZsYXNoIG1lbW9yeSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGRvd25sb2FkIG1vcmUgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zIHRvIHVzZXIgZGV2aWNlcy48YnI+PC9saT4KLTxsaT5UaGUgcGxhdGZvcm0gd2lsbCBpbnRlcmZhY2Ugd2l0aCBhIGJhc2ViYW5kIHJhZGlvIHN0YWNrIHByb3ZpZGVkIGV4dGVybmFsbHkgdmlhIGEgUmFkaW8gSW50ZXJmYWNlIExheWVyIChSSUwpLgotPC9saT4KLTxsaT44MDIuMTEgYi9nIFdpLUZpCi08L2xpPgotPGxpPlN0YW5kYXJkIFVTQiBpbnRlcmZhY2UsIGluY2x1ZGluZyBVU0IgMi4wCi08L2xpPgotPGxpPkJsdWV0b290aCAyLjAgRURSIChFbmhhbmNlZCBEYXRhIFJhdGUpCi08L2xpPgotPGxpPkNhbWVyYSBmb3Igc3RpbGwgYW5kIHZpZGVvIGNhcHR1cmUKLTwvbGk+Ci08bGk+UmVtb3ZhYmxlIHN0b3JhZ2UKLTwvbGk+Ci08L3VsPgotPGI+U3VwcG9ydGVkIGRpc3BsYXk8L2I+Ci08YnI+PHVsPjxsaT5IVkdBIHJlc29sdXRpb24gPGJyPjwvbGk+Ci08bGk+MTYgYml0IGNvbG9yIGRlcHRoIDxicj48L2xpPgotPGxpPkxhbmRzY2FwZSBhbmQgcG9ydHJhaXQgb3JpZW50YXRpb24sIGluY2x1ZGluZyBkeW5hbWljIHJ1bnRpbWUgc3dpdGNoaW5nCi08L2xpPgotPGxpPkZpbmdlci1iYXNlZCB0b3VjaHNjcmVlbiBuYXZpZ2F0aW9uCi08L2xpPgotPC91bD4KLTxiPlN1cHBvcnRlZCBrZXlwYWRzIGFuZCBidXR0b25zPC9iPgotPGJyPjx1bD48bGk+UVdFUlRZCi08L2xpPgotPGxpPjUtd2F5IG5hdmlnYXRpb24KLTwvbGk+Ci08bGk+SGFyZHdhcmUgYnV0dG9uczogU2VuZCwgRW5kLCBIb21lLCBCYWNrLCBNZW51PC9saT4KLTxsaT5Qb3dlciBidXR0b24KLTwvbGk+Ci08bGk+Vm9sdW1lIGtleXMgKHVwIGFuZCBkb3duKQotPC9saT4KLTxsaT5DYW1lcmEgdHJpZ2dlciBidXR0b24sIGluY2x1ZGluZyBkZXRlY3Rpb24gZm9yIGJvdGggcGFydGlhbCBwcmVzcyAodG8gZm9jdXMpIGFuZCBmdWxsIHByZXNzICh0byBhY3R1YWxseSB0YWtlIGEgcGljdHVyZSkKLTwvbGk+Ci08L3VsPgotPGI+U3VwcG9ydGVkIGF1ZGlvIG91dHB1dHM8L2I+Ci08YnI+PHVsPjxsaT5BdWRpbyBvdXRwdXQgdmlhIHRoZSBoZWFkcGhvbmUgamFjayAobW9ubyBhbmQgc3RlcmVvKQotPC9saT4KLTxsaT42NCBrYnBzIEJsdWV0b290aCBhdWRpbyBzdXBwb3J0ZWQ8L2xpPgotPC91bD4KLTxiPlN1cHBvcnRlZCBub3RpZmljYXRpb25zPC9iPgotPGJyPjx1bD48bGk+TEVEcwotPC9saT4KLTxsaT5WaWJyYXRpb24KLTwvbGk+Ci08L3VsPgotPGI+U3VwcG9ydGVkIHJhZGlvIGFuZCB0ZWxlcGhvbnkgZmVhdHVyZXMgPGJyPjwvYj4KLTx1bD48bGk+R1BSUywgRURHRSwgVU1UUywgSFNEUEEKLTwvbGk+Ci08bGk+SW50ZXJuYXRpb25hbCByb2FtaW5nLCBTTVMsIE1NUyA8YnI+PC9saT4KLTxsaT5FbWVyZ2VuY3kgY2FsbCBzdXBwb3J0IDxicj48L2xpPgotPGxpPlN1cHBsZW1lbnRhcnkgU2VydmljZXMgZm9yIFRlbGVwaG9ueSwgZm9yIGV4YW1wbGUgY2FsbCB3YWl0aW5nIGFuZCBjb25mZXJlbmNlIGNhbGxpbmcgPGJyPjwvbGk+Ci08bGk+VW5zdHJ1Y3R1cmVkIFN1cHBsZW1lbnRhcnkgU2VydmljZSBEYXRhIChVU1NEKQotPC9saT4KLTxsaT5SZWZlcmVuY2UgUmFkaW8gSW50ZXJmYWNlIExheWVyIChSSUwpCi08L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL292ZXJ2aWV3LTEuNS5qZCBiL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy0xLjUuamQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzQ4NzQuLjAwMDAwMDAKLS0tIGEvcGRrL2RvY3Mvc291cmNlL292ZXJ2aWV3LTEuNS5qZAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi1wYWdlLnRpdGxlPUFuZHJvaWQgMS41IEZlYXR1cmVzCi1kb2MudHlwZT1zb3VyY2UKLUBqZDpib2R5Ci08aDM+PGI+UmVsZWFzZSBmZWF0dXJlcyAtIEFuZHJvaWQgMS41PC9iPgotPC9oMz4KLTxkaXY+PGRpdj48ZGl2PjxkaXY+PGI+UHJldmlvdXMgcmVsZWFzZSBoaWdobGlnaHRzPC9iPgotOjxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2Uvb3ZlcnZpZXctMS4wLmh0bWwiPkFuZHJvaWQgMS4wPC9hPgotPGJyPjxicj5UaGlzIHBhZ2UgcHJvdmlkZXMgYSBoaWdoLWxldmVsIG92ZXJ2aWV3IG9mIHRoZSBuZXcgZmVhdHVyZXMgYWRkZWQgdG8KLUFuZHJvaWQgMS41LiBUbyBzZWUgdGhlIGNvZGUgaXRzZWxmLCB5b3UgY2FuIGVpdGhlciB1c2UgdGhlPGEgaHJlZj0iaHR0cDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvIj5HaXRXZWI8L2E+Ci1pbnRlcmZhY2UgdG8gdmlldyBzbmFwc2hvdHMgb2YgdGhlIGZpbGVzLCBvciB5b3UgY2FuPGEKLWhyZWY9IntAZG9jUm9vdH1zb3VyY2UvZG93bmxvYWQuaHRtbCI+ZG93bmxvYWQ8L2E+Ci10aGUgc291cmNlIGNvZGUgb250byB5b3VyIGxvY2FsIG1hY2hpbmUuIFlvdSBjYW4gdXNlPGk+cmVwbyBpbml0IC11PC9pPgotZ2l0Oi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy9wbGF0Zm9ybS9tYW5pZmVzdC5naXQ8aT4tYiBhbmRyb2lkLTEuNTwvaT4KLXRvIGRvd25sb2FkIHRoZSBzb3VyY2UgY29kZSBmb3IgQW5kcm9pZCAxLjUuPGJyPjxicj48Yj5Vc2VyIGludGVyZmFjZSByZWZpbmVtZW50czo8L2I+Ci08YnI+PHVsPjxsaT5TeXN0ZW0td2lkZToKLTx1bD48bGk+UmVmaW5lbWVudCBvZiBhbGwgY29yZSBVSSBlbGVtZW50cwotPC9saT4KLTxsaT5BbmltYXRlZCB3aW5kb3cgdHJhbnNpdGlvbnMgKG9mZiBieSBkZWZhdWx0KQotPC9saT4KLTxsaT5BY2NlbGVyb21ldGVyLWJhc2VkIGFwcGxpY2F0aW9uIHJvdGF0aW9ucwotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlVJIHBvbGlzaCBmb3I6Ci08dWw+PGxpPkluLWNhbGwgZXhwZXJpZW5jZQotPC9saT4KLTxsaT5Db250YWN0cywgQ2FsbCBsb2csIGFuZCBGYXZvcml0ZXMKLTwvbGk+Ci08bGk+U01TIE1NUwotPC9saT4KLTxsaT5Ccm93c2VyCi08L2xpPgotPGxpPkNhbGVuZGFyCi08L2xpPgotPGxpPkVtYWlsCi08L2xpPgotPGxpPkNhbWVyYSBHYWxsZXJ5Ci08L2xpPgotPGxpPkFwcGxpY2F0aW9uIG1hbmFnZW1lbnQKLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08ZGl2PjxiPjxicj5QZXJmb3JtYW5jZSBpbXByb3ZlbWVudHM6PC9iPgotPGJyPjwvZGl2PgotPHVsPjxsaT5GYXN0ZXIgQ2FtZXJhIHN0YXJ0LXVwIGFuZCBpbWFnZSBjYXB0dXJlCi08L2xpPgotPGxpPk11Y2ggZmFzdGVyIGFjcXVpc2l0aW9uIG9mIEdQUyBsb2NhdGlvbiAocG93ZXJlZCBieSBTVVBMIEFHUFMpCi08L2xpPgotPGxpPlNtb290aGVyIHBhZ2Ugc2Nyb2xsaW5nIGluIEJyb3dzZXIKLTwvbGk+Ci08L3VsPgotPGJyPjxiPkFwcGxpY2F0aW9uczwvYj4KLTxicj48dWw+PGxpPkNhbWVyYSBHYWxsZXJ5Ci08L2xpPgotPHVsPjxsaT5WaWRlbyByZWNvcmRpbmcKLTwvbGk+Ci08bGk+VmlkZW8gcGxheWJhY2sgKE1QRUctNCAzR1AgZm9ybWF0cykKLTwvbGk+Ci08L3VsPgotPGxpPkJyb3dzZXIKLTwvbGk+Ci08dWw+PGxpPlVwZGF0ZWQgd2l0aCBsYXRlc3QgV2Via2l0IGJyb3dzZXIgU3F1aXJyZWxmaXNoIEphdmFzY3JpcHQgZW5naW5lcwotPC9saT4KLTxsaT5Db3B5ICduIHBhc3RlIGluIGJyb3dzZXIKLTwvbGk+Ci08bGk+U2VhcmNoIHdpdGhpbiBhIHBhZ2UKLTwvbGk+Ci08bGk+VXNlci1zZWxlY3RhYmxlIHRleHQtZW5jb2RpbmcKLTwvbGk+Ci08bGk+VUkgY2hhbmdlcyBpbmNsdWRlOgotPC9saT4KLTx1bD48bGk+VW5pZmllZCBHbyBhbmQgU2VhcmNoIGJveAotPC9saT4KLTxsaT5UYWJiZWQgYm9va21hcmtzL2hpc3RvcnkvbW9zdC12aXNpdGVkIHNjcmVlbgotPC9saT4KLTwvdWw+Ci08L3VsPgotPGxpPkNvbnRhY3RzCi08L2xpPgotPHVsPjxsaT5TaG93cyB1c2VyIHBpY3R1cmUgZm9yIEZhdm9yaXRlcwotPC9saT4KLTxsaT5TcGVjaWZpYyBkYXRlL3RpbWUgc3RhbXAgZm9yIGV2ZW50cyBpbiBjYWxsIGxvZwotPC9saT4KLTxsaT5PbmUtdG91Y2ggYWNjZXNzIHRvIGEgY29udGFjdCBjYXJkIGZyb20gY2FsbCBsb2cgZXZlbnQKLTwvbGk+Ci08L3VsPgotPC91bD4KLTxiPjxicj5BcHBsaWNhdGlvbiBmcmFtZXdvcms8L2I+Ci08YnI+PGJyPjwvZGl2PgotPGRpdj48dWw+PGxpPk9uLXNjcmVlbiBzb2Z0IGtleWJvYXJkCi08L2xpPgotPHVsPjxsaT5Xb3JrcyBpbiBib3RoIHBvcnRyYWl0IGFuZCBsYW5kc2NhcGUgb3JpZW50YXRpb24KLTwvbGk+Ci08bGk+U3VwcG9ydCBmb3IgdXNlciBpbnN0YWxsYXRpb24gb2YgM3JkIHBhcnR5IGtleWJvYXJkcwotPC9saT4KLTxsaT5Vc2VyIGRpY3Rpb25hcnkgZm9yIGN1c3RvbSB3b3JkcwotPC9saT4KLTwvdWw+Ci08bGk+SG9tZSBzY3JlZW4KLTwvbGk+Ci08dWw+PGxpPldpZGdldHMKLTwvbGk+Ci08dWw+PGxpPkJ1bmRsZWQgaG9tZSBzY3JlZW4gd2lkZ2V0cyBpbmNsdWRlOiBhbmFsb2cgY2xvY2ssIGNhbGVuZGFyLCBtdXNpYyBwbGF5ZXIsIHBpY3R1cmUgZnJhbWUsIGFuZCBzZWFyY2gKLTwvbGk+Ci08L3VsPgotPGxpPkxpdmUgZm9sZGVycwotPC9saT4KLTwvdWw+Ci08bGk+VUkgZnJhbWV3b3JrCi08L2xpPgotPHVsPjxsaT5GcmFtZXdvcmsgZm9yIGVhc2llciBiYWNrZ3JvdW5kL1VJIHRocmVhZCBpbnRlcmFjdGlvbgotPC9saT4KLTxsaT5OZXcgU2xpZGluZ0RyYXdlciB3aWRnZXQKLTwvbGk+Ci08bGk+SG9yaXpvbnRhbCBTY3JvbGxWaWV3IHdpZGdldAotPC9saT4KLTwvdWw+Ci08bGk+SG9tZSBTY3JlZW4gZnJhbWV3b3JrCi08L2xpPgotPHVsPjxsaT5BUElzIGZvciBjcmVhdGluZyBzZWN1cmUgaG9tZSBzY3JlZW4gd2lkZ2V0cwotPC9saT4KLTxsaT5BUElzIGZvciBwb3B1bGF0aW5nIGxpdmUgZm9sZGVycyB3aXRoIGN1c3RvbSBjb250ZW50Ci08L2xpPgotPC91bD4KLTxsaT5NZWRpYSBmcmFtZXdvcmsKLTwvbGk+Ci08dWw+PGxpPlJhdyBhdWRpbyByZWNvcmRpbmcgYW5kIHBsYXliYWNrIEFQSXMKLTwvbGk+Ci08bGk+SW50ZXJhY3RpdmUgTUlESSBwbGF5YmFjayBlbmdpbmUKLTwvbGk+Ci08bGk+VmlkZW8gcmVjb3JkaW5nIEFQSXMgZm9yIGRldmVsb3BlcnMgKDNHUCBmb3JtYXQpCi08L2xpPgotPGxpPlZpZGVvIGFuZCBwaG90byBzaGFyaW5nIEludGVudHMKLTwvbGk+Ci08bGk+TWVkaWEgc2VhcmNoIEludGVudAotPC9saT4KLTwvdWw+Ci08bGk+SW5wdXQgTWV0aG9kIGZyYW1ld29yawotPC9saT4KLTx1bD48bGk+VGV4dCBwcmVkaWN0aW9uIGVuZ2luZQotPC9saT4KLTxsaT5BYmlsaXR5IHRvIHByb3ZpZGUgZG93bmxvYWRhYmxlIElNRXMgdG8gdXNlcnMKLTwvbGk+Ci08L3VsPgotPGxpPlNwZWVjaCByZWNvZ25pdGlvbiBmcmFtZXdvcmsKLTwvbGk+Ci08dWw+PGxpPlN1cHBvcnQgZm9yIHVzaW5nIHNwZWVjaCByZWNvZ25pdGlvbiBsaWJyYXJpZXMgdmlhIEludGVudAotPC9saT4KLTwvdWw+Ci08bGk+TWlzYyBBUEkgYWRkaXRpb25zCi08L2xpPgotPHVsPjxsaT5Mb2NhdGlvbk1hbmFnZXIgLSBBcHBsaWNhdGlvbnMgY2FuIGdldCBsb2NhdGlvbiBjaGFuZ2UgdXBkYXRlcyB2aWEgSW50ZW50Ci08L2xpPgotPGxpPldlYlZpZXcgLSBUb3VjaCBzdGFydC9lbmQvbW92ZS9jYW5jZWwgRE9NIGV2ZW50IHN1cHBvcnQKLTwvbGk+Ci08bGk+U2Vuc29yTWFuYWdlciAtIHJlZGVzaWduZWQgc2Vuc29yIEFQSXMKLTwvbGk+Ci08bGk+R0xTdXJmYWNlVmlldyAtIGNvbnZlbmllbmNlIGZyYW1ld29yayBmb3IgY3JlYXRpbmcgT3BlbkdMIGFwcGxpY2F0aW9ucwotPC9saT4KLTxsaT5Ccm9hZGNhc3QgSW50ZW50IGZvciBhcHAgdXBkYXRlIGluc3RhbGwgc3VjY2VlZGVkIC0gZm9yIHNtb290aGVyIGFwcCB1cGdyYWRlIGV4cGVyaWVuY2UKLTwvbGk+Ci08L3VsPgotPC91bD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTxkaXY+PGJyPjxiPlN5c3RlbSBzb2Z0d2FyZTwvYj4KLTxicj48YnI+PC9kaXY+Ci08dWw+PGxpPk5ldyBMaW51eCBrZXJuZWwgKHZlcnNpb24gMi42LjI3KQotPC9saT4KLTxsaT5TRCBjYXJkIGZpbGVzeXN0ZW0gYXV0by1jaGVja2luZyBhbmQgcmVwYWlyCi08L2xpPgotPGxpPlNJTSBBcHBsaWNhdGlvbiBUb29sa2l0IDEuMAotPC9saT4KLTwvdWw+Ci08ZGl2PjxiPjxicj5TdXBwb3J0ZWQgaGFyZHdhcmU8YnI+PC9iPgotPHVsPjxsaT5CbHVldG9vdGg8L2xpPgotPHVsPjxsaT5TdGVyZW8gQmx1ZXRvb3RoIHN1cHBvcnQgKEEyRFAgYW5kIEFWQ1JQIHByb2ZpbGVzKQotPC9saT4KLTxsaT5BdXRvLXBhaXJpbmcKLTwvbGk+Ci08bGk+SW1wcm92ZWQgaGFuZHNmcmVlIGV4cGVyaWVuY2UKLTwvbGk+Ci08L3VsPgotPC91bD4KLTxicj48Yj5EZXZlbG9wZXIgdG9vbHM8L2I+Ci08YnI+PC9kaXY+Ci08ZGl2Pjx1bD48bGk+U3VwcG9ydCBmb3IgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQW5kcm9pZCBpbiBhIHNpbmdsZSBTREsgaW5zdGFsbGF0aW9uCi08L2xpPgotPGxpPkltcHJvdmVkIEpVbml0IHN1cHBvcnQgaW4gQURUCi08L2xpPgotPGxpPkVhc2llciBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSBwcm9maWxpbmcKLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXcuamQgYi9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXcuamQKaW5kZXggMjc2M2M1Mi4uN2NiNTkzYyAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL292ZXJ2aWV3LmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy5qZApAQCAtMSw5MyArMSwzNiBAQAotcGFnZS50aXRsZT1BbmRyb2lkIDEuNiBQbGF0Zm9ybSBPdmVydmlldworcGFnZS50aXRsZT1BbmRyb2lkIDIuMSBQbGF0Zm9ybQogZG9jLnR5cGU9c291cmNlCiBAamQ6Ym9keQotPHA+VGhpcyBwYWdlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiB0aGUgbmV3IGZlYXR1cmVzIGFkZGVkIHRvCi1BbmRyb2lkIDEuNi4gVG8gc2VlIHRoZSBjb2RlIGl0c2VsZiwgeW91IGNhbiBlaXRoZXIgdXNlIHRoZSA8YQotaHJlZj0iaHR0cDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvIj5HaXRXZWI8L2E+Ci1pbnRlcmZhY2UgdG8gdmlldyBzbmFwc2hvdHMgb2YgdGhlIGZpbGVzLCBvciB5b3UgY2FuIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2Rvd25sb2FkLmh0bWwiPmRvd25sb2FkPC9hPgotdGhlIHNvdXJjZSBjb2RlIG9udG8geW91ciBsb2NhbCBtYWNoaW5lLiBZb3UgY2FuIHVzZSA8Y29kZT5yZXBvIGluaXQgLXUKLWdpdDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvcGxhdGZvcm0vbWFuaWZlc3QuZ2l0IC1iIGFuZHJvaWQtMS42PC9jb2RlPgotdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBjb2RlIGZvciBBbmRyb2lkIDEuNi48L3A+Ci08cD48aT5Ob3RlOiBwbGF0Zm9ybSBvdmVydmlldyBpbmZvcm1hdGlvbiBmb3IgQW5kcm9pZCAyLnggaGFzIG5vdCB5ZXQgYmVlbgotcHVibGlzaGVkLCBzaW5jZSB0aGUgPGEKLWhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2luZGV4Lmh0bWwiPkNvbXBhdGliaWxpdHkgUHJvZ3JhbTwvYT4gZm9yCi1BbmRyb2lkIDIueCBoYXMgbm90IHlldCBsYXVuY2hlZC4gV2hlbiB0aGUgQ29tcGF0aWJpbHR5IERlZmluaXRpb24gRG9jdW1lbnQKLWZvciAyLnggaXMgcmVsZWFzZWQsIHRoaXMgcGFnZSB3aWxsIGJlIHVwZGF0ZWQgdG8gbWF0Y2guPC9pPjwvcD4KLTxwPkluZm9ybWF0aW9uIGFib3V0IG9sZGVyIEFuZHJvaWQgcmVsZWFzZXMgaXMgYWxzbyBhdmFpbGFibGU6PHVsPgotPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2Uvb3ZlcnZpZXctMS41Lmh0bWwiPkFuZHJvaWQgMS41IFBsYXRmb3JtIE92ZXJ2aWV3PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9vdmVydmlldy0xLjAuaHRtbCI+QW5kcm9pZCAxLjAgUGxhdGZvcm0gT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+PC9wPgotPGgyPlVzZXIgaW50ZXJmYWNlIHJlZmluZW1lbnRzPC9oMj4KLTxoMz5RdWljayBTZWFyY2ggQm94IGZvciBBbmRyb2lkIDwvaDM+Ci08cD5BbmRyb2lkIDEuNiBpbmNsdWRlcyBhIHJlZGVzaWduZWQgc2VhcmNoIGZyYW1ld29yayB0aGF0IHByb3ZpZGVzIGEgcXVpY2ssIGVmZmVjdGl2ZSwgYW5kIGNvbnNpc3RlbnQgd2F5IGZvciB1c2VycyB0byBzZWFyY2ggYWNyb3NzIG11bHRpcGxlIHNvdXJjZXPigJRzdWNoIGFzIGJyb3dzZXIgYm9va21hcmtzIGhpc3RvcnksIGNvbnRhY3RzLCBhbmQgdGhlIHdlYuKAlGRpcmVjdGx5IGZyb20gdGhlIGhvbWUgc2NyZWVuLgotPC9wPgotPHA+PGJyPjwvcD4KLTxwPlRoZSBzeXN0ZW0gY29uc3RhbnRseSBsZWFybnMgd2hpY2ggc2VhcmNoIHJlc3VsdHMgYXJlIG1vcmUgcmVsZXZhbnQgYmFzZWQgb24gd2hhdCBpcyBjbGlja2VkLiBTbyBwb3B1bGFyIGNvbnRhY3RzIG9yIGFwcHMgdGhhdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBwaWNrZWQgd2lsbCBidWJibGUgdXAgdG8gdGhlIHRvcCB3aGVuIGEgdXNlciB0eXBlcyB0aGUgZmlyc3QgZmV3IGxldHRlcnMgb2YgYSByZWxldmFudCBxdWVyeS4KLTwvcD4KLTxwPjxicj48L3A+Ci08cD5UaGUgc2VhcmNoIGZyYW1ld29yayBhbHNvIHByb3ZpZGVzIGRldmVsb3BlcnMgYSB3YXkgdG8gZWFzaWx5IGV4cG9zZSByZWxldmFudCBjb250ZW50IGZyb20gdGhlaXIgYXBwbGljYXRpb25zIGluIFF1aWNrIFNlYXJjaCBCb3guCi08L3A+Ci08aDM+Q2FtZXJhLCBDYW1jb3JkZXIsIGFuZCBHYWxsZXJ5IDwvaDM+Ci08cD5BbiB1cGRhdGVkIHVzZXIgaW50ZXJmYWNlIHByb3ZpZGVzIGFuIGludGVncmF0ZWQgY2FtZXJhLCBjYW1jb3JkZXIsIGFuZCBnYWxsZXJ5IGV4cGVyaWVuY2UuIFVzZXJzIGNhbiBxdWlja2x5IHRvZ2dsZSBiZXR3ZWVuIHN0aWxsIGFuZCB2aWRlbyBjYXB0dXJlIG1vZGVzLiBBZGRpdGlvbmFsbHksIHRoZSBnYWxsZXJ5IGVuYWJsZXMgdXNlcnMgdG8gc2VsZWN0IG11bHRpcGxlIHBob3RvcyBmb3IgZGVsZXRpb24uPGJyPjwvcD4KLTxwPjxicj48L3A+Ci08cD5BbmRyb2lkIDEuNiBhbHNvIHByb3ZpZGVzIGEgbXVjaCBmYXN0ZXIgY2FtZXJhIGV4cGVyaWVuY2UuIENvbXBhcmVkIHRvIHRoZSBwcmV2aW91cyByZWxlYXNlLCBsYXVuY2hpbmcgdGhlIGNhbWVyYSBpcyBub3cgMzklIGZhc3RlciwgYW5kIHRoZXJlIGlzIGEgMjglIGltcHJvdmVtZW50IGluIHRoZSB0aW1lIGZyb20gY29tcGxldGluZyBvbmUgc2hvdCB0byB0aGUgbmV4dC4KLTwvcD4KLTxoMz5WUE4sIDgwMi4xeCA8L2gzPgotPHA+QSBuZXcgVmlydHVhbCBQcml2YXRlIE5ldHdvcmsgKFZQTikgY29udHJvbCBwYW5lbCBpbiBTZXR0aW5ncyBhbGxvd3MgdXNlcnMgdG8gY29uZmlndXJlIGFuZCBjb25uZWN0IHRvIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgVlBOczoKLTwvcD4KLTx1bD48bGk+TDJUUC9JUFNFQyBwcmUtc2hhcmVkIGtleSBiYXNlZCBWUE4KLSAgPC9saT4KLTxsaT5MMlRQL0lQc2VjIGNlcnRpZmljYXRlIGJhc2VkIFZQTgotICA8L2xpPgotPGxpPkwyVFAgb25seSBWUE4KLSAgPC9saT4KLTxsaT5QUFRQIG9ubHkgVlBOCi0gIDwvbGk+Ci08L3VsPgotPGgzPkJhdHRlcnkgdXNhZ2UgaW5kaWNhdG9yIDwvaDM+Ci08cD5BIG5ldyBiYXR0ZXJ5IHVzYWdlIHNjcmVlbiBsZXRzIHVzZXJzIHNlZSB3aGljaCBhcHBzIGFuZCBzZXJ2aWNlcyBhcmUgY29uc3VtaW5nIGJhdHRlcnkgcG93ZXIuIElmIHRoZSB1c2VyIGRldGVybWluZXMgdGhhdCBhIHBhcnRpY3VsYXIgc2VydmljZSBvciBhcHBsaWNhdGlvbiBpcyB1c2luZyB0b28gbXVjaCBwb3dlciwgdGhleSBjYW4gdGFrZSBhY3Rpb24gdG8gc2F2ZSB0aGUgYmF0dGVyeSBieSBhZGp1c3Rpbmcgc2V0dGluZ3MsIHN0b3BwaW5nIHRoZSBhcHBsaWNhdGlvbiwgb3IgdW5pbnN0YWxsaW5nIHRoZSBhcHBsaWNhdGlvbi4KLTwvcD4KLTxoMz5BY2Nlc3NpYmlsaXR5IDwvaDM+Ci08cD5Vc2VycyB3aWxsIGJlIGFibGUgdG8gZG93bmxvYWQgbmV3IGFjY2Vzc2liaWxpdHkgc2VydmljZXMgYnVpbHQgb24gdGhlIG5ldyBhY2Nlc3NpYmlsaXR5IGZyYW1ld29yayBhbmQgZW5hYmxlIHRoZW0gaW4gU2V0dGluZ3MuCi08L3A+Ci08aDI+TmV3IFBsYXRmb3JtIFRlY2hub2xvZ2llcyA8L2gyPgotPGgzPkV4cGFuZGVkIFNlYXJjaCBGcmFtZXdvcmsgPC9oMz4KLTxwPlRoZSBBbmRyb2lkIHNlYXJjaCBmcmFtZXdvcmsgaGFzIGJlZW4gcmVkZXNpZ25lZCBhbmQgZXhwYW5kZWQgdG8gcHJvdmlkZSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMgdGhlIG9wcG9ydHVuaXR5IHRvIHN1cmZhY2UgY29udGVudCBmcm9tIHRoZWlyIGFwcGxpY2F0aW9ucyBpbiBRdWljayBTZWFyY2ggQm94LCB0aGUgZ2xvYmFsIHNlYXJjaCB0b29sLiBUbyBkbyB0aGlzLCBkZXZlbG9wZXJzIHdpbGwgbmVlZCB0byBtYWtlIHRoZWlyIGFwcCAic2VhcmNoYWJsZSIgYW5kIHByb3ZpZGUgc3VnZ2VzdGlvbnMgaW4gcmVzcG9uc2UgdG8gdXNlciBxdWVyaWVzLiBUbyBlbmFibGUgYXBwbGljYXRpb24gc2VhcmNoIHN1Z2dlc3Rpb25zLCB1c2VycyBzaW1wbHkgc2VsZWN0IGVhY2ggYXBwbGljYXRpb24gZnJvbSB3aGljaCB0aGV5J2QgbGlrZSB0byByZWNlaXZlIHN1Z2dlc3Rpb25zLCB1bmRlciBTZWFyY2hhYmxlIGl0ZW1zIGluIHRoZSBTZWFyY2ggc2V0dGluZ3MuCi08L3A+Ci08aDM+VGV4dC10by1zcGVlY2ggZW5naW5lPC9oMz4KLTxwPkFuZHJvaWQgMS42IGZlYXR1cmVzIGEgbXVsdGktbGluZ3VhbCBzcGVlY2ggc3ludGhlc2lzIGVuZ2luZSBjYWxsZWQgUGljby4gSXQgYWxsb3dzIGFueSBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvICJzcGVhayIgYSBzdHJpbmcgb2YgdGV4dCB3aXRoIGFuIGFjY2VudCB0aGF0IG1hdGNoZXMgdGhlIGxhbmd1YWdlLiBUaGUgZW5naW5lIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOiBFbmdsaXNoIChBbWVyaWNhbiBhbmQgQnJpdGlzaCBhY2NlbnRzKSwgRnJlbmNoLCBJdGFsaWFuLCBHZXJtYW4gYW5kIFNwYW5pc2guIElmIHlvdSdyZSB1c2luZyBhIFQtTW9iaWxlIEcxIG9yIERyZWFtIGRldmljZSwgeW91J2xsIG5lZWQgdG8gZG93bmxvYWQgdGhlIFNwZWVjaFN5bnRoZXNpcyBEYXRhIEluc3RhbGxlciBmcm9tIEFuZHJvaWQgTWFya2V0LCB3aGljaCBpbmNsdWRlcyB0aGUgInZvaWNlcyIgbmVlZGVkIGJ5IHRoZSB0ZXh0LXRvLXNwZWVjaCBlbmdpbmUuCi08L3A+Ci08aDM+R2VzdHVyZXMgPC9oMz4KLTxwPkEgbmV3IGdlc3R1cmVzIGZyYW1ld29yayBwcm92aWRlcyBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHdpdGggYSBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nLCBzdG9yaW5nLCBsb2FkaW5nLCBhbmQgcmVjb2duaXppbmcgZ2VzdHVyZXMgYW5kIGFzc29jaWF0aW5nIHRoZW0gd2l0aCBzcGVjaWZpYyBhY3Rpb25zLgotPC9wPgotPHA+RGV2ZWxvcGVycyBjYW4gdXNlIHRoZSBuZXcgR2VzdHVyZUJ1aWxkZXIgdG9vbCBpbmNsdWRlZCBpbiB0aGUgQW5kcm9pZCAxLjYgU0RLIHRvIGdlbmVyYXRlIGxpYnJhcmllcyBvZiBnZXN0dXJlcyB0byBpbmNsdWRlIHdpdGggdGhlaXIgYXBwbGljYXRpb24uCi08L3A+Ci08aDM+QWNjZXNzaWJpbGl0eSA8L2gzPgotPHA+QW5kcm9pZCAxLjYgcHJvdmlkZXMgYSBuZXcgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsuIFdpdGggdGhpcyBmcmFtZXdvcmssIGRldmVsb3BlcnMgY2FuIGNyZWF0ZSBhY2Nlc3NpYmlsaXR5IHBsdWdpbnMgdGhhdCByZXNwb25kIHRvIHVzZXIgaW5wdXQsIHN1Y2ggYXMgbWFraW5nIGEgc291bmQgd2hlbiBhIG5ldyB3aW5kb3cgaXMgc2hvd24sIHZpYnJhdGluZyB3aGVuIG5hdmlnYXRpbmcgdG8gdGhlIHRvcCBvZiBhIGxpc3QsIGFuZCBwcm92aWRpbmcgc3Bva2VuIGZlZWRiYWNrLgotPC9wPgotPGgzPkV4cGFuZGVkIHN1cHBvcnQgZm9yIHNjcmVlbiBkZW5zaXRpZXMgYW5kIHJlc29sdXRpb25zIDwvaDM+Ci08cD5BbmRyb2lkIDEuNiBhZGRzIHNjcmVlbiBzdXBwb3J0IHRoYXQgZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gYmUgcmVuZGVyZWQgcHJvcGVybHkgb24gZGlmZmVyZW50IGRpc3BsYXkgcmVzb2x1dGlvbnMgYW5kIGRlbnNpdGllcy4gRGV2ZWxvcGVycyBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB0eXBlcyBvZiBzY3JlZW5zIHN1cHBvcnRlZCBieSB0aGVpciBhcHBsaWNhdGlvbi4KLTwvcD4KLTxoMz5UZWxlcGhvbnkgc3VwcG9ydCBmb3IgQ0RNQSA8L2gzPgotPHA+QW5kcm9pZCAxLjYgaW5jbHVkZXMgc3VwcG9ydCBmb3IgQ0RNQSBpbiB0aGUgdGVsZXBob255IHN0YWNrLgotPC9wPgotPGgzPk5ldyB2ZXJzaW9uIG9mIE9wZW5Db3JlIDwvaDM+Ci08cD5BbmRyb2lkIDEuNiBpbmNsdWRlcyB0aGUgdXBkYXRlZCBPcGVuQ29yZSAyIG1lZGlhIGVuZ2luZSwgd2hpY2ggaGFzOgotPC9wPgotPHVsPjxsaT5TdXBwb3J0IGZvciBPcGVuTUFYIGVuY29kZXJzCi0gIDwvbGk+Ci08bGk+U3VwcG9ydCBmb3IgYWRkaXRpb25hbCBhdWRpbyBjb2RlY3MgaW4gQXV0aG9yRW5naW5lCi0gIDwvbGk+Ci08bGk+SW1wcm92ZWQgYnVmZmVyaW5nIG1vZGVsIHN1cHBvcnRzIHNoYXJlZCBidWZmZXJzIGFsbG9jYXRlZCBpbiB0aGUgZGVjb2RlcgotICA8L2xpPgotPC91bD4KLTxoMz4yLjYuMjkgTGludXgga2VybmVsIDwvaDM+Ci08cD5BbmRyb2lkIDEuNiB1cGdyYWRlcyB0aGUgTGludXgga2VybmVsIGZyb20gMi42LjI3IHRvIDIuNi4yOS4KLTwvcD4KLTxoMj5OZXcgRnJhbWV3b3JrIEFQSXM8L2gyPgotPHA+Rm9yIGEgZGV0YWlsZWQgb3ZlcnZpZXcgb2YgbmV3IEFQSXMsIHNlZSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQtMS42Lmh0bWwjYXBpLWNoYW5nZXMiPlZlcnNpb24KLU5vdGVzPC9hPi4gRm9yIGEgY29tcGxldGUgcmVwb3J0IG9mIGFsbCBBUEkgY2hhbmdlcywgc2VlIHRoZSA8YQotaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zZGsvYXBpX2RpZmYvNC9jaGFuZ2VzLmh0bWwiPkFQSQotRGlmZmVyZW5jZXMgUmVwb3J0PC9hPi48L3A+Cis8cD5PdXIgc2lzdGVyIHNpdGUsIDxhCitocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tLyI+aHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS88L2E+LCAKK2luY2x1ZGVzIGZlYXR1cmUgb3ZlcnZpZXdzIG9mIHRoZSB2YXJpb3VzIEFuZHJvaWQgcGxhdGZvcm0gdmVyc2lvbnMuCitUaGUgbGlua3MgYmVsb3cgd2lsbCB0YWtlIHlvdSB0byBkZXZlbG9wZXIuYW5kcm9pZC5jb20gd2hlcmUgeW91IGNhbiB2aWV3IHRoaXMKK2luZm9ybWF0aW9uLjwvcD4KKzxwPlRoZSBsaW5rcyBiZWxvdyB3aWxsIG5hdmlnYXRlIHlvdSBhd2F5IGZyb20gdGhpcyBzaXRlLjwvcD4KKzxwPjxpPk5vdGU6IHRoaXMgcGFnZSB3aWxsIGJlIHVwZGF0ZWQgdG8gY292ZXIgQW5kcm9pZCAyLjIgd2hlbiB0aGUKK2Zvcm1hbCBjb21wYXRpYmlsaXR5IHByb2dyYW0gZm9yIEFuZHJvaWQgMi4yIGlzIGxhdW5jaGVkLCB3aGljaCB3aWxsIG9jY3VyIGluCit0aGUgbmVhciBmdXR1cmUuPC9pPjwvcD4KKzxoMz48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkLTIuMC1oaWdobGlnaHRzLmh0bWwiPkFuZHJvaWQKKzIuMTwvYT48L2gzPgorPHA+QW5kcm9pZCAyLjEgY29ycmVzcG9uZGVkIHRvIHRoZSAiRWNsYWlyIiBtaWxlc3RvbmUgYnJhbmNoLCBhbmQgaGFzIGFuIEFQSSBsZXZlbCBvZgorNy48L3A+Cis8cD5UaGUgRWNsYWlyIGJyYW5jaCB3YXMgYWxzbyB1c2VkIGZvciAyLjAgYW5kIDIuMC4xOyBob3dldmVyLCBib3RoIG9mIHRob3NlCityZWxlYXNlcyB3ZXJlIHF1aWNrbHkgb2Jzb2xldGVkIGJ5IHRoZSB2ZXJzaW9uIDIuMSBFY2xhaXIgcmVsZWFzZS4gQXMgQW5kcm9pZAorMi4xIGluY2x1ZGVzIGtleSBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyBub3QgcHJlc2VudCBpbiAyLjAvMi4wLjEsIG9ubHkKK0FuZHJvaWQgMi4xIHNob3VsZCBiZSB1c2VkIGZvciBuZXcgZGV2aWNlcy4gQXMgdGhlcmUgaXMgbm8gY29tcGF0aWJpbGl0eQorcHJvZ3JhbSBmb3IgMi4wIG9yIDIuMC4xLCB0aGUgb2ZmaWNpYWxseSBjb21wYXRpYmxlIEVjbGFpci1iYXNlZCByZWxlYXNlIGlzIEFuZHJvaWQKKzIuMS4gKFRoZSBsaW5rZWQgZG9jdW1lbnQgcmVmZXJzIHRvIEFuZHJvaWQgMi4wLCBiZWNhdXNlIHRoZXJlIHdlcmUKK25vIG5ldyBwbGF0Zm9ybSBmZWF0dXJlcyBhZGRlZCBpbiAyLjEuKTwvcD4KKzxoMz48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkLTEuNi1oaWdobGlnaHRzLmh0bWwiPkFuZHJvaWQgMS42PC9hPjwvaDM+Cis8cD5BbmRyb2lkIDEuNiBjb3JyZXNwb25kZWQgdG8gdGhlICJEb251dCIgbWlsZXN0b25lIGJyYW5jaCwgYW5kIGhhcyBhbiBBUEkgbGV2ZWwgb2YKKzQuPC9wPgorPGgzPjxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQtMS41LWhpZ2hsaWdodHMuaHRtbCI+QW5kcm9pZCAxLjU8L2E+PC9oMz4KKzxwPkFuZHJvaWQgMS41IGNvcnJlc3BvbmRlZCB0byB0aGUgIkN1cGNha2UiIG1pbGVzdG9uZSBicmFuY2gsIGFuZCBoYXMgYW4gQVBJCitsZXZlbCBvZiAzLjwvcD4KKzxoMz48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkLTEuMS5odG1sIj5BbmRyb2lkIDEuMTwvYT48L2gzPgorPHA+QW5kcm9pZCAxLjEgaGFzIGFuIEFQSSBsZXZlbCBvZiAyLiBBbmRyb2lkIDEuMSB3YXMga25vd24gYXMKKyJQZXRpdCBGb3VyIiBpbnRlcm5hbGx5LCB0aG91Z2ggdGhpcyBuYW1lIHdhcyBub3QgdXNlZCBvZmZpY2lhbGx5LjwvcD4KKzxoMz5BbmRyb2lkIDEuMDwvaDM+Cis8cD53YXMgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgQW5kcm9pZCwgYW5kIGhhcyBhbiBBUEkKK2xldmVsIG9mIDEuIFNpbmNlIGl0IHdhcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiBBbmRyb2lkLCBubyBwbGF0Zm9ybQoraGlnaGxpZ2h0cyB3ZXJlIHByZXBhcmVkIGZvciB0aGlzIHJlbGVhc2UuPC9wPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL3JlcG9ydC1idWdzLmpkIGIvcGRrL2RvY3Mvc291cmNlL3JlcG9ydC1idWdzLmpkCmluZGV4IDEzODA4MGQuLmE2ZTU2YzYgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9yZXBvcnQtYnVncy5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvcmVwb3J0LWJ1Z3MuamQKQEAgLTc3LDcgKzc3LDcgQEAKIAogcHVibGljIGNsYXNzIFRlc3RPYmplY3ROdWxsIGV4dGVuZHMgQWN0aXZpdHkgewogICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KLSAgICBAT3ZlcnJpZGUKKyAgICAmIzY0O092ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9yb2xlcy5qZCBiL3Bkay9kb2NzL3NvdXJjZS9yb2xlcy5qZAppbmRleCA0NTFjODIxLi5mNGZiODkxIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2Uvcm9sZXMuamQKKysrIGIvcGRrL2RvY3Mvc291cmNlL3JvbGVzLmpkCkBAIC0xNSwyMiArMTUsMjIgQEAKIAogPGgyPkNvbnRyaWJ1dG9yPC9oMj4KIDxwPkEgIkNvbnRyaWJ1dG9yIiBpcyBhbnlvbmUgbWFraW5nIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIEFPU1Agc291cmNlIGNvZGUsCi1pbmNsdWRpbmcgYm90aCBlbXBsb3llZXMgb2YgR29vZ2xlIG9yIG90aGVyIGNvbXBhbmllcywgYXMgd2VsbCBhcwotZXh0ZXJuYWwgZGV2ZWxvcGVycyB3aG8gYXJlIGNvbnRyaWJ1dGluZyB0byBBbmRyb2lkIG9uIHRoZWlyIG93biBiZWhhbGYuCi1UaGVyZSBpcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIENvbnRyaWJ1dG9ycyB3aG8gYXJlIGVtcGxveWVkIGJ5IAotR29vZ2xlLCBhbmQgdGhvc2Ugd2hvIGFyZSBub3Q6IGFsbCBlbmdpbmVlcnMgdXNlIHRoZSBzYW1lIGdpdC9nZXJyaXQgdG9vbHMsIAotZm9sbG93IHRoZSBzYW1lIGNvZGUgcmV2aWV3IHByb2Nlc3MsIGFuZCBhcmUgc3ViamVjdCB0byB0aGUgc2FtZSByZXF1aXJlbWVudHMKLW9uIGNvZGUgc3R5bGUgYW5kIHNvIG9uLjwvcD4KK2luY2x1ZGluZyBib3RoIGVtcGxveWVlcyBvZiBHb29nbGUgb3Igb3RoZXIgY29tcGFuaWVzLCBhcyB3ZWxsIGFzIGV4dGVybmFsCitkZXZlbG9wZXJzIHdobyBhcmUgY29udHJpYnV0aW5nIHRvIEFuZHJvaWQgb24gdGhlaXIgb3duIGJlaGFsZi4gIFRoZXJlIGlzIG5vCitkaXN0aW5jdGlvbiBiZXR3ZWVuIENvbnRyaWJ1dG9ycyB3aG8gYXJlIGVtcGxveWVkIGJ5IEdvb2dsZSwgYW5kIHRob3NlIHdobyBhcmUKK25vdDogYWxsIGVuZ2luZWVycyB1c2UgdGhlIHNhbWUgdG9vbHMgKDxjb2RlPmdpdDwvY29kZT4sIDxjb2RlPnJlcG88L2NvZGU+LAorYW5kIDxjb2RlPmdlcnJpdDwvY29kZT4pLCBmb2xsb3cgdGhlIHNhbWUgY29kZSByZXZpZXcgcHJvY2VzcywgYW5kIGFyZSBzdWJqZWN0Cit0byB0aGUgc2FtZSByZXF1aXJlbWVudHMgb24gY29kZSBzdHlsZSBhbmQgc28gb24uPC9wPgogPHAvPgogCiA8aDI+RGV2ZWxvcGVyPC9oMj4KIDxwPkEgIkRldmVsb3BlciIgaXMgYW4gZW5naW5lZXIgd3JpdGluZyBhcHBsaWNhdGlvbnMgdGhhdCBydW4gb24gQW5kcm9pZAogZGV2aWNlcy4gVGhlcmUgaXMsIG9mIGNvdXJzZSwgbm8gZGlmZmVyZW5jZSBpbiBza2lsbHNldCBiZXR3ZWVuIGEgIkRldmVsb3BlciIKLWFuZCBhICJDb250cmlidXRvciI7IEFPU1Agc2ltcGx5IHVzZXMgIkRldmVsb3BlciIgdG8gaGVscCBpZGVudGlmeSBvdXIgYXVkaWVuY2UuCi1TaW5jZSB0aGUga2V5IHB1cnBvc2Ugb2YgQW5kcm9pZCBpcyB0byBjdWx0aXZhdGUgYW4gb3BlbiBkZXZlbG9wbWVudCBwbGF0Zm9ybSwKLSJEZXZlbG9wZXJzIiBhcmUgb25lIG9mIHRoZSBrZXkgY3VzdG9tZXJzIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtLiBBcyBzdWNoLCB3ZQotdGFsayBhYm91dCB0aGVtIGEgbG90LCB0aG91Z2ggdGhpcyBpc24ndCB0ZWNobmljYWxseSBhIHNlcGFyYXRlIHJvbGUgaW4gdGhlCi1BT1NQIDxpPnBlciBzZS48L2k+PC9wPgorYW5kIGEgIkNvbnRyaWJ1dG9yIiwgYnV0IEFPU1AgdXNlcyAiRGV2ZWxvcGVyIiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCitlbmdpbmVlcnMgdXNpbmcgdGhlIHBsYXRmb3JtIGFuZCB0aG9zZSBjb250cmlidXRpbmcgdG8gaXQuIERldmVsb3BlcnMgYXJlCisoYWxvbmcgd2l0aCBlbmQgdXNlcnMpIHRoZSAiY3VzdG9tZXJzIiBvZiB0aGUgcGxhdGZvcm0gdGhhdCB0aGUgQ29udHJpYnV0b3JzCitjcmVhdGUuIEFzIHN1Y2gsIHdlIHRhbGsgYWJvdXQgRGV2ZWxvcGVycyBhIGxvdCwgdGhvdWdoIHRoaXMgaXNuJ3QgdGVjaG5pY2FsbHkKK2Egc2VwYXJhdGUgcm9sZSBpbiB0aGUgQU9TUCA8aT5wZXIgc2UuPC9pPjwvcD4KIDxwLz4KIAogPGgyPlZlcmlmaWVyPC9oMj4KQEAgLTYyLDEyICs2MiwxMiBAQAogICByZWxlYXNlcy48L2xpPgogICA8bGk+RGVzaWduYXRlIFZlcmlmaWVycyBhbmQgQXBwcm92ZXJzIGZvciBzdWJtaXR0ZWQgcGF0Y2hlcy48L2xpPgogICA8bGk+QmUgZmFpciBhbmQgdW5iaWFzZWQgd2hpbGUgcmV2aWV3aW5nIGNoYW5nZXMuIEFjY2VwdCBvciByZWplY3QgcGF0Y2hlcwotICBiYXNlZCBvbiB0ZWNobmljYWwgbWVyaXQgYW5kIGFsaWdubWVudCB3aXRoIHRoZSBBbmRyb2lkIHBsYXRmb3JtLjwvbGk+CisgIGJhc2VkIG9uIHRlY2huaWNhbCBtZXJpdCBhbmQgYWxpZ25tZW50IHdpdGggdGhlIEFuZHJvaWQgc3RyYXRlZ3kuPC9saT4KICAgPGxpPlJldmlldyBjaGFuZ2VzIGluIGEgdGltZWx5IG1hbm5lciBhbmQgbWFrZSBiZXN0IGVmZm9ydHMgdG8gY29tbXVuaWNhdGUKICAgd2hlbiBjaGFuZ2VzIGFyZSBub3QgYWNjZXB0ZWQuPC9saT4KICAgPGxpPk9wdGlvbmFsbHkgbWFpbnRhaW4gYSB3ZWIgc2l0ZSBmb3IgdGhlIHByb2plY3QgZm9yIGluZm9ybWF0aW9uIGFuZAogICBkb2N1bWVudHMgc3BlY2lmaWMgdG8gdGhlIHByb2plY3QuPC9saT4KICAgPGxpPkFjdCBhcyBhIGZhY2lsaXRhdG9yIGluIHJlc29sdmluZyB0ZWNobmljYWwgY29uZmxpY3RzLjwvbGk+Ci0gIDxsaT5CZSB0aGUgcHVibGljIGZhY2UgZm9yIHRoZSBwcm9qZWN0IGFuZCB0aGUgZ28tdG8gcGVyc29uIGZvciBxdWVzdGlvbnMKKyAgPGxpPkJlIGEgcHVibGljIGZhY2UgZm9yIHRoZSBwcm9qZWN0IGFuZCB0aGUgZ28tdG8gcGVyc29uIGZvciBxdWVzdGlvbnMKICAgcmVsYXRlZCB0byB0aGUgcHJvamVjdC48L2xpPgogPC91bD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9zdWJtaXQtcGF0Y2hlcy5qZCBiL3Bkay9kb2NzL3NvdXJjZS9zdWJtaXQtcGF0Y2hlcy5qZAppbmRleCAyYjdiYWUxLi45ZTdkOWRmIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2Uvc3VibWl0LXBhdGNoZXMuamQKKysrIGIvcGRrL2RvY3Mvc291cmNlL3N1Ym1pdC1wYXRjaGVzLmpkCkBAIC0xLDYgKzEsNyBAQAogcGFnZS50aXRsZT1BbmRyb2lkIENvbnRyaWJ1dG9ycycgV29ya2Zsb3cKIGRvYy50eXBlPXNvdXJjZQogQGpkOmJvZHkKKzxkaXY+CiA8YnI+VGhpcyBwYWdlIGRlc2NyaWJlcyBob3cgdG8gcmVjb3JkIGNoYW5nZXMgdG8gdGhlIEFuZHJvaWQgZmlsZXMgb24geW91ciBsb2NhbCBjbGllbnQsIHVwbG9hZCB0aG9zZSBjaGFuZ2VzIHRvIHRoZSBjb2RlLXJldmlldyBzZXJ2ZXIsIGFuZCB1c2UgR2Vycml0IHRvIHRyYWNrIGNoYW5nZXMuPGJyPjxoMj4KIFByZXJlcXVpc2l0ZXM8L2gyPgogQmVmb3JlIHlvdSBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBvbiB0aGlzIHBhZ2UsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHlvdXIKQEAgLTE0LDYgKzE1LDkgQEAKIE9wZW4gU291cmNlIGNvbW11bml0eSwgc2VlIDxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2Uvcm9sZXMuaHRtbCI+UHJvamVjdCByb2xlczwvYT4uPC9saT4KIDxsaT5JZiB5b3UgcGxhbiB0byBjb250cmlidXRlIGNvZGUgdG8gdGhlIEFuZHJvaWQgcGxhdGZvcm0sIGJlIHN1cmUgdG8gcmVhZAogdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvbGljZW5zZXMuaHRtbCI+QU9TUCdzIGxpY2Vuc2luZyBpbmZvcm1hdGlvbjwvYT4uPC9saT4KKzxsaT5Ob3RlIHRoYXQgY2hhbmdlcyB0byBzb21lIG9mIHRoZSB1cHN0cmVhbSBwcm9qZWN0cyB1c2VkIGJ5IEFuZHJvaWQgc2hvdWxkIGJlCittYWRlIGRpcmVjdGx5IHRvIHRoYXQgcHJvamVjdCwgYXMgZGVzY3JpYmVkIGluCis8YSBocmVmPSIjdXBzdHJlYW0tcHJvamVjdHMiPlVwc3RyZWFtIFByb2plY3RzPC9hPi4KIDwvdWw+CiA8aDI+CiBXb3JraW5nIHdpdGggdGhlIGNvZGU8L2gyPgpAQCAtMTI5LDggKzEzMyw4IEBACiA8L3VsPgogPGgzPgogVmlld2luZyBkaWZmcyBhbmQgY29tbWVudHM8L2gzPgotVG8gb3BlbiB0aGUgZGV0YWlscyBvZiB0aGUgY2hhbmdlIHdpdGhpbiBHZXJyaXQsIGNsaWNrIG9uIHRoZSAiSWQgbnVtYmVyIiBvciAiU3ViamVjdCIgb2YgYSBjaGFuZ2UuIFRvIGNvbXBhcmUgdGhlIGVzdGFibGlzaGVkIGNvZGUgd2l0aCB0aGUgdXBkYXRlZCBjb2RlLCBjbGljayB0aGUgZmlsZSBuYW1lIHVuZGVyICJTaWRlLWJ5LXNpZGUgZGlmZnMuIjxicj48L2Rpdj4KLTxkaXY+PGgzPgorVG8gb3BlbiB0aGUgZGV0YWlscyBvZiB0aGUgY2hhbmdlIHdpdGhpbiBHZXJyaXQsIGNsaWNrIG9uIHRoZSAiSWQgbnVtYmVyIiBvciAiU3ViamVjdCIgb2YgYSBjaGFuZ2UuIFRvIGNvbXBhcmUgdGhlIGVzdGFibGlzaGVkIGNvZGUgd2l0aCB0aGUgdXBkYXRlZCBjb2RlLCBjbGljayB0aGUgZmlsZSBuYW1lIHVuZGVyICJTaWRlLWJ5LXNpZGUgZGlmZnMuIjxicj4KKzxoMz4KIEFkZGluZyBjb21tZW50czwvaDM+CiBBbnlvbmUgaW4gdGhlIGNvbW11bml0eSBjYW4gdXNlIEdlcnJpdCB0byBhZGQgaW5saW5lIGNvbW1lbnRzIHRvIGNvZGUgc3VibWlzc2lvbnMuIEEgZ29vZCBjb21tZW50IHdpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGxpbmUgb3Igc2VjdGlvbiBvZiBjb2RlIHRvIHdoaWNoIGl0IGlzIGF0dGFjaGVkIGluIEdlcnJpdC4gSXQgbWlnaHQgYmUgYSBzaG9ydCBhbmQgY29uc3RydWN0aXZlIHN1Z2dlc3Rpb24gYWJvdXQgaG93IGEgbGluZSBvZiBjb2RlIGNvdWxkIGJlIGltcHJvdmVkLCBvciBpdCBtaWdodCBiZSBhbiBleHBsYW5hdGlvbiBmcm9tIHRoZSBhdXRob3IgYWJvdXQgd2h5IHRoZSBjb2RlIG1ha2VzIHNlbnNlIHRoZSB3YXkgaXQgaXMuPGJyPjxicj5UbyBhZGQgYW4gaW5saW5lIGNvbW1lbnQsIGRvdWJsZS1jbGljayB0aGUgcmVsZXZhbnQgbGluZSBvZiB0aGUgY29kZSBhbmQgd3JpdGUgeW91ciBjb21tZW50IGluIHRoZSB0ZXh0IGJveCB0aGF0IG9wZW5zLiBXaGVuIHlvdSBjbGljayBTYXZlLCBvbmx5IHlvdSBjYW4gc2VlIHlvdXIgY29tbWVudC48YnI+PGJyPlRvIHB1Ymxpc2ggeW91ciBjb21tZW50cyBzbyB0aGF0IG90aGVycyB1c2luZyBHZXJyaXQgd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGVtLCBjbGljayB0aGUgUHVibGlzaCBDb21tZW50cyBidXR0b24uIFlvdXIgY29tbWVudHMgd2lsbCBiZSBlbWFpbGVkIHRvIGFsbCByZWxldmFudCBwYXJ0aWVzIGZvciB0aGlzIGNoYW5nZSwgaW5jbHVkaW5nIHRoZSBjaGFuZ2Ugb3duZXIsIHRoZSBwYXRjaCBzZXQgdXBsb2FkZXIgKGlmIGRpZmZlcmVudCBmcm9tIHRoZSBvd25lciksIGFuZCBhbGwgY3VycmVudCByZXZpZXdlcnMuPGJyPjxicj48aDM+CiBBZnRlciBhIHN1Ym1pc3Npb24gaXMgYXBwcm92ZWQ8L2gzPgpAQCAtMTQyLDYgKzE0NiwyNyBAQAogLjxicj48YnI+PGgyPgogVXNpbmcgR2l0V2ViIHRvIHRyYWNrIHBhdGNoIGhpc3RvcmllczwvaDI+CiBUbyB2aWV3IHNuYXBzaG90cyBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIHB1YmxpYyBBbmRyb2lkIHJlcG9zaXRvcmllcyBhbmQgdmlldyBmaWxlIGhpc3RvcmllcywgdXNlIHRoZSA8YSBocmVmPSJodHRwOi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy8iPkFuZHJvaWQgaW5zdGFuY2Ugb2YgR2l0V2ViPC9hPgotLjxicj48L2Rpdj4KLTwvZGl2PgorLjxicj4KKzxoMj48YSBuYW1lPSJ1cHN0cmVhbS1wcm9qZWN0cyI+PC9hPlVwc3RyZWFtIFByb2plY3RzPC9oMj4KK0FuZHJvaWQgbWFrZXMgdXNlIG9mIGEgbnVtYmVyIG9mIG90aGVyIG9wZW4tc291cmNlIHByb2plY3RzLCBzdWNoIGFzIHRoZSBMaW51eAora2VybmVsIGFuZCBXZWJLaXQsIGFzIGRlc2NyaWJlZCBpbgorPGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9jb2RlLWxpbmVzLmh0bWwiPkJyYW5jaGVzICZhbXAgUmVsZWFzZXM8L2E+LiBGb3IgdGhlCit1cHN0cmVhbSBwcm9qZWN0cyBkZXRhaWxlZCBiZWxvdywgY2hhbmdlcyBzaG91bGQgYmUgbWFkZSBkaXJlY3RseSB1cHN0cmVhbS4gU3VjaAorY2hhbmdlcyB3aWxsIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBBbmRyb2lkIHRyZWUgYXMgcGFydCBvZiB0aGUgdXN1YWwgcHJvY2Vzcworb2YgcHVsbGluZyB0aGVzZSBwcm9qZWN0cy4KKzxoMz5XZWJLaXQ8L2gzPgorQWxsIGNoYW5nZXMgdG8gdGhlIFdlYktpdCBwcm9qZWN0IGF0IDxjb2RlPmV4dGVybmFsL3dlYmtpdDwvY29kZT4gc2hvdWxkIGJlIG1hZGUKK3Vwc3RyZWFtIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cud2Via2l0Lm9yZyI+aHR0cDovL3d3dy53ZWJraXQub3JnPC9hPi4gVGhlCitwcm9jZXNzIGJlZ2lucyBieSBmaWxpbmcgYSBXZWJLaXQgYnVnLiBUaGlzIGJ1ZyBzaG91bGQgdXNlIDxjb2RlPkFuZHJvaWQ8L2NvZGU+Citmb3IgdGhlIDxjb2RlPlBsYXRmb3JtPC9jb2RlPiBhbmQgPGNvZGU+T1M8L2NvZGU+IGZpZWxkcyBvbmx5IGlmIHRoZSBidWcgaXMKK3NwZWNpZmljIHRvIEFuZHJvaWQuIEJ1Z3MgYXJlIGZhciBtb3JlIGxpa2VseSB0byByZWNlaXZlIHRoZSByZXZpZXdlcnMnCithdHRlbnRpb24gb25jZSBhIHByb3Bvc2VkIGZpeCBpcyBhZGRlZCBhbmQgdGVzdHMgYXJlIGluY2x1ZGVkLiBTZWUKKzxhIGhyZWY9Imh0dHA6Ly93ZWJraXQub3JnL2NvZGluZy9jb250cmlidXRpbmcuaHRtbCI+Q29udHJpYnV0aW5nIENvZGUgdG8KK1dlYktpdDwvYT4gZm9yIGRldGFpbHMuCis8aDM+Vjg8L2gzPgorQWxsIGNoYW5nZXMgdG8gdGhlIFY4IHByb2plY3QgYXQgPGNvZGU+ZXh0ZXJuYWwvdjg8L2NvZGU+IHNob3VsZCBiZSBzdWJtaXR0ZWQKK3Vwc3RyZWFtIGF0Cis8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgiPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92ODwvYT4uIFNlZQorPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L3dpa2kvQ29udHJpYnV0aW5nIj5Db250cmlidXRpbmcgdG8gVjg8L2E+Citmb3IgZGV0YWlscy4KIDwvZGl2PgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL3VzaW5nLWVjbGlwc2UuamQgYi9wZGsvZG9jcy9zb3VyY2UvdXNpbmctZWNsaXBzZS5qZAppbmRleCA1NmRmNzEzLi42NjBkZTExIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvdXNpbmctZWNsaXBzZS5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvdXNpbmctZWNsaXBzZS5qZApAQCAtOTUsNTggKzk1LDYgQEAKIDxwPldoZW4geW91J3JlIGRvbmUsIHRoZSAic291cmNlIGZvbGRlciIgcGF0aCBpbiB0aGUgbGlzdCBzaG91bGQgbG9vayBsaWtlIGFuZHJvaWQvcGFja2FnZXMvYXBwcy88aT5Zb3VyQXBwTmFtZTwvaT4KIC9zcmMuIERlcGVuZGluZyBvbiB3aGljaCBhcHAocykgeW91IGluY2x1ZGUsIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluY2x1ZGUgb3RoZXJzcmMvbWFpbi9qYXZhIGRpcmVjdG9yaWVzIHVuZGVyIGFuZHJvaWQvZGFsdmlrL2xpYmNvcmUuIERvIHRoaXMgaWYgeW91IGZpbmQgeW91IGNhbm5vdCBidWlsZCB3aXRoIHRoZSBkZWZhdWx0IHNldC4KIDwvcD4KLTxoND4KLUVjbGlwc2Ugc2V0dXAgdG8gd29yayBvbiBkZXZlbG9wZXIgdG9vbHMKLTwvaDQ+Ci08cD5UbyB3b3JrIG9uIEphdmEgZGV2ZWxvcGVyIHRvb2xzLCB0aGUgcHJpbmNpcGxlIGlzIHRoZSBzYW1lLCBleGNlcHQgeW91IHNwZWNpZnkgL3BhdGgvdG8vdG9vbCB3aGVuIHVzaW5nIHRoZSBvcHRpb24gIkNyZWF0ZSBwcm9qZWN0IGZyb20gZXhpc3Rpbmcgc291cmNlLiIKLTwvcD4KLTxwPk9uY2UgdGhlIHByb2plY3QgaXMgY3JlYXRlZCwgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBKYXZhIEJ1aWxkIFBhdGg6Ci08L3A+Ci08b2w+PGxpPlNlbGVjdCB0aGUgcHJvamVjdCB5b3UganVzdCBjcmVhdGVkLgotPC9saT4KLTxsaT5Qcm9qZWN0IFByb3BlcnRpZXMKLTwvbGk+Ci08bGk+U2VsZWN0ICJKYXZhIEJ1aWxkIFBhdGgiIGZyb20gdGhlIGxlZnQtaGFuZCBtZW51LgotPC9saT4KLTxsaT5DaG9vc2UgdGhlICJTb3VyY2UiIHRhYi4KLTwvbGk+Ci08bGk+RXhwYW5kIHRoZSBzaW5nbGUgPGk+dG9vbG5hbWU8L2k+Ci0vc3JjIGVudHJ5LgotPC9saT4KLTxsaT5Eb3VibGUgY2xpY2sgdGhlICJFeGNsdWRlZDogKG5vbmUpIiBpdGVtLgotPC9saT4KLTxsaT5BZGQgdG8gdGhlIGV4Y2x1ZGVkIChib3R0b20pIGxpc3Q6ICJNYWtlRmlsZSIgYW5kICJyZXNvdXJjZXMvIi4KLTwvbGk+Ci08bGk+Q2xvc2UgdGhlIGRpYWxvZy4KLTwvbGk+Ci08bGk+QmFjayBpbiB0aGUgIlNvdXJjZSIgdGFiLCBjbGljayAiQWRkIEZvbGRlci4uLiIsIGFuZCBhZGQgPGk+dG9vbG5hbWU8L2k+Ci0vc3JjL3Jlc291cmNlcy4KLTwvbGk+Ci08bGk+Q2xpY2sgT0suCi08L2xpPgotPC9vbD4KLTxoND4KLUVjbGlwc2Ugc2V0dXAgdG8gd29yayBvbiBERE1TIDxicj48L2g0PgotPHA+Rm9yIERETVMsIHlvdSB3aWxsIG5lZWQgdG8gbWFrZSBhIHByb2plY3QgZm9yCi08L3A+Ci08b2w+PGxpPmRldmVsb3BtZW50L3Rvb2xzL2RkbXMvbGlicy9kZG1saWIKLTwvbGk+Ci08bGk+ZGV2ZWxvcG1lbnQvdG9vbHMvZGRtcy9saWJzL2RkbXVpbGliCi08L2xpPgotPGxpPmRldmVsb3BtZW50L3Rvb2xzL2RkbXMvYXBwCi08L2xpPgotPC9vbD4KLTxwPkVhY2ggcHJvamVjdCB3aWxsIG5lZWQgdG8gcmVmZXJlbmNlIHRoZSBvbmVzIGJlZm9yZSBpdCAoImRkbXVpbGliIiByZWZlcmVuY2VzICJkZG1saWIiLCBhbmQgImFwcCIgcmVmZXJlbmNlcyBib3RoIG9mIHRob3NlKS4gVG8gZG8gdGhpczoKLTwvcD4KLTxvbD48bGk+TWFrZSBzdXJlIHlvdSBoYXZlIGFsbCAzIHByb2plY3RzIGRlZmluZWQuCi08L2xpPgotPGxpPlJpZ2h0IGNsaWNrIG9uIGEgcHJvamVjdCwgIkJ1aWxkIFBhdGgiICJDb25maWd1cmUgQnVpbGQgUGF0aC4uLiIKLTwvbGk+Ci08bGk+Q2hvb3NlIHRoZSAiUHJvamVjdCIgdGFiLgotPC9saT4KLTxsaT5DbGljayAiQWRkLi4uIiBhbmQgY2hlY2sgdGhlIHJlcXVpcmVkIHByb2plY3RzLgotPC9saT4KLTwvb2w+CiA8aDI+PGE+RWNsaXBzZSBmb3JtYXR0aW5nPC9hPgogPC9oMj4KIDxwPllvdSBjYW4gaW1wb3J0IGZpbGVzIGluIGRldmVsb3BtZW50L2lkZS9lY2xpcHNlIHRvIG1ha2UgRWNsaXBzZQpAQCAtMTg5LDE1ICsxMzcsNiBAQAogCiA8cHJlPkN0cmwtU2hpZnQtbyA9IE9yZ2FuaXplIGltcG9ydHMgPGJyPkN0cmwtU2hpZnQtdCA9IGxvYWQgY2xhc3MgYnkgbmFtZSA8YnI+Q3RybC1TaGlmdC1yID0gbG9hZCBub24tY2xhc3MgcmVzb3VyY2UgYnkgbmFtZSA8YnI+Q3RybC0xID0gcXVpY2sgZml4IDxicj5DdHJsLWUgPSBSZWNlbnRseSB2aWV3ZWQgZmlsZXMgPGJyPkN0cmwtc3BhY2UgPSBhdXRvIGNvbXBsZXRlIDxicj5TaGlmdC1BbHQtciA9IHJlZmFjdG9yOnJlbmFtZSA8YnI+U2hpZnQtQWx0LXYgPSByZWZhY3Rvcjptb3ZlIDxicj48L3ByZT4KIAotPGgyPjxhPlVzZWZ1bCBQbHVnaW5zPC9hPgotPC9oMj4KLTxwPkVjbGlwc2UgaGFzIGEgcGx1Z2luIGFyY2hpdGVjdHVyZSB0aGF0IGVuYWJsZXMgdGhpcmQgcGFydGllcyB0byBleHRlbmQgdGhlIElERS4gSGVyZSBhcmUgc29tZSBwbHVnaW5zIHRoYXQgbWFrZSBFY2xpcHNlIGVhc2llciB0byB1c2UgZm9yIHdyaXRpbmcgQW5kcm9pZCBzb2Z0d2FyZToKLTwvcD4KLQotPHVsPjxsaT48YSBocmVmPSJodHRwOi8vYW5kcmVpLmdteGhvbWUuZGUvYW55ZWRpdC8iPkFueUVkaXQ8L2E+Ci0tIGF1dG9tYXRpY2FsbHkgZml4IHdoaXRlc3BhY2UgaXNzdWVzIHdoZW4gc2F2aW5nIGZpbGVzLiBDYW4gY29udmVydCB0YWJzIHRvIHNwYWNlcywgc3RyaXAgYmxhbmtzIGF0IGVuZC1vZi1saW5lLCBhbmQgZW5zdXJlIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGZpbGUgaGFzIGFuIGVuZC1vZi1saW5lIGNoYXJhY3Rlci4KLTwvbGk+Ci08L3VsPgogPGgyPjxhPiJFY2xpcHNlIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSwgd2hhdCBzaG91bGQgSSBkbz8iPC9hPgogPC9oMj4KIDxwPk1ha2Ugc3VyZToKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA2ZTM5NTM4Li42ZDUzM2M1IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zNywxMyArMzcsMTYgQEAKIAogICAgIDwhLS0gV2Ugd2lsbCByZXF1ZXN0IGFjY2VzcyB0byB0aGUgY2FtZXJhLCBzYXlpbmcgd2UgcmVxdWlyZSBhIGNhbWVyYQogICAgICAgICAgb2Ygc29tZSBzb3J0IGJ1dCBub3Qgb25lIHdpdGggYXV0b2ZvY3VzIGNhcGFiaWxpdHkuIC0tPgorICAgIDwhLS0KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIgLz4KICAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEiIC8+CiAgICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmF1dG9mb2N1cyIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgLS0+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpuYW1lPSJBcGlEZW1vc0FwcGxpY2F0aW9uIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY3Rpdml0eV9zYW1wbGVfY29kZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2FwcF9zYW1wbGVfY29kZSIgPgorICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvYXBwX3NhbXBsZV9jb2RlIgorICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KIAogICAgICAgICA8IS0tIFRoaXMgaXMgaG93IHdlIGNhbiByZXF1ZXN0IGEgbGlicmFyeSBidXQgc3RpbGwgYWxsb3cgdGhlIGFwcAogICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZCBpZiBpdCBkb2Vzbid0IGV4aXN0LiAtLT4KQEAgLTE0OCw2ICsxNTEsMTQgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlNvZnRJbnB1dE1vZGVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvc29mdF9pbnB1dF9tb2RlcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5SZWNlaXZlUmVzdWx0IiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X3JlY2VpdmVfcmVzdWx0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KQEAgLTE4MSw5ICsxOTIsMTIgQEAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5SZWRpcmVjdEdldHRlciI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPCEtLSBUaGlzIHNhbXBsZSBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbmV3IGFjdGlvbiBiYXIsIHNvIHVzZQorICAgICAgICAgICAgIHRoZSBvbGQgc3R5bGUgdGhlbWUuIC0tPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkN1c3RvbVRpdGxlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfY3VzdG9tX3RpdGxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVWaXNpYmxlfGFkanVzdFBhbiI+CisgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZVZpc2libGV8YWRqdXN0UGFuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KQEAgLTIxNyw2ICsyMzEsMTA2IEBACiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8IS0tIEZyYWdtZW50IFNhbXBsZXMgLS0+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudEFsZXJ0RGlhbG9nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfYWxlcnRfZGlhbG9nIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50QW5pbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2FuaW0iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRDb250ZXh0TWVudSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2NvbnRleHRfbWVudSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudERpYWxvZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2RpYWxvZyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMYXlvdXQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9sYXlvdXQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMYXlvdXQkRGV0YWlsc0FjdGl2aXR5IiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMaXN0Q3Vyc29yTG9hZGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfbGlzdF9jdXJzb3JfbG9hZGVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50TGlzdEFycmF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfbGlzdF9hcnJheSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudE1lbnUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9tZW51Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50UmV0YWluSW5zdGFuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRSZWNlaXZlUmVzdWx0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfcmVjZWl2ZV9yZXN1bHQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRTdGFjayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X3N0YWNrIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8IS0tIEludGVudCBTYW1wbGVzIC0tPgogCkBAIC01MjYsNTAgKzY0MCw2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPCEtLSBQcmVmZXJlbmNlcyBTYW1wbGVzIC0tPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuUHJlZmVyZW5jZXNGcm9tWG1sIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3ByZWZlcmVuY2VzX2Zyb21feG1sIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlByZWZlcmVuY2VzRnJvbUNvZGUiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZXNfZnJvbV9jb2RlIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkFkdmFuY2VkUHJlZmVyZW5jZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWR2YW5jZWRfcHJlZmVyZW5jZXMiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuTGF1bmNoaW5nUHJlZmVyZW5jZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbGF1bmNoaW5nX3ByZWZlcmVuY2VzIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlByZWZlcmVuY2VEZXBlbmRlbmNpZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZV9kZXBlbmRlbmNpZXMiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRGVmYXVsdFZhbHVlcyIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kZWZhdWx0X3ZhbHVlcyI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KICAgICAgICAgPCEtLSBEZXZpY2UgQWRtaW4gU2FtcGxlcyAtLT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkRldmljZUFkbWluU2FtcGxlJENvbnRyb2xsZXIiCkBAIC02MTEsMTAgKzY4MSwxMTcgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8IS0tIEFjdGlvbiBCYXIgU2FtcGxlcyAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5BY3Rpb25CYXJNZWNoYW5pY3MiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGlvbl9iYXJfbWVjaGFuaWNzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkFjdGlvbkJhclVzYWdlIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGlvbl9iYXJfdXNhZ2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuQWN0aW9uQmFyRGlzcGxheU9wdGlvbnMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsb2dvPSJAZHJhd2FibGUvYXBpZGVtb19hbmRyb2lkbG9nbyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5BY3Rpb25CYXJUYWJzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY3Rpb25fYmFyX3RhYnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICAgICAgPCEtLSAgICAgICBQUkVGRVJFTkNFIFBBQ0tBR0UgU0FNUExFUyAgICAgIC0tPgorICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuRnJhZ21lbnRQcmVmZXJlbmNlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X3ByZWZlcmVuY2VzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIucHJlZmVyZW5jZS5QcmVmZXJlbmNlV2l0aEhlYWRlcnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcmVmZXJlbmNlX3dpdGhfaGVhZGVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuUHJlZmVyZW5jZXNGcm9tWG1sIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZXNfZnJvbV94bWwiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLlByZWZlcmVuY2VzRnJvbUNvZGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcmVmZXJlbmNlc19mcm9tX2NvZGUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLkFkdmFuY2VkUHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hZHZhbmNlZF9wcmVmZXJlbmNlcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuTGF1bmNoaW5nUHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sYXVuY2hpbmdfcHJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLlByZWZlcmVuY2VEZXBlbmRlbmNpZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcmVmZXJlbmNlX2RlcGVuZGVuY2llcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuRGVmYXVsdFZhbHVlcyIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kZWZhdWx0X3ZhbHVlcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogICAgICAgICA8IS0tICAgICAgICBDT05URU5UIFBBQ0tBR0UgU0FNUExFUyAgICAgICAgLS0+CiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuY29udGVudC5DbGlwYm9hcmRTYW1wbGUiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfY2xpcGJvYXJkIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuY29udGVudC5FeHRlcm5hbFN0b3JhZ2UiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfZXh0ZXJuYWxfc3RvcmFnZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC02ODksNiArODY2LDEwOSBAQAogICAgICAgICA8L3JlY2VpdmVyPgogCiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICAgICAgPCEtLSAgICAgQU5EUk9JRC5BTklNQVRJT04gUEFDS0FHRSBTQU1QTEVTICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkFuaW1hdGlvbkxvYWRpbmciIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9Mb2FkaW5nIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5BbmltYXRpb25DbG9uaW5nIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0Nsb25pbmciCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkFuaW1hdGlvblNlZWtpbmciIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9TZWVraW5nIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5BbmltYXRvckV2ZW50cyIgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0V2ZW50cyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uQm91bmNpbmdCYWxscyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9Cb3VuY2luZyBCYWxscyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uQ3VzdG9tRXZhbHVhdG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0N1c3RvbSBFdmFsdWF0b3IiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkxpc3RGbGlwcGVyIiBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vVmlldyBGbGlwIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLlJldmVyc2luZ0FuaW1hdGlvbiIgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL1JldmVyc2luZyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9NdWx0aXBsZSBQcm9wZXJ0aWVzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25zIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0xheW91dCBBbmltYXRpb25zIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbnNIaWRlU2hvdyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9IaWRlLVNob3cgQW5pbWF0aW9ucyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25zQnlEZWZhdWx0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0RlZmF1bHQgTGF5b3V0IEFuaW1hdGlvbnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KICAgICAgICAgPCEtLSAgICAgQU5JTUFUSU9OIFBBQ0tBR0UgU0FNUExFUyAgICAgICAgIC0tPgogICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CiAKQEAgLTEwNDYsNjMgKzEzMjYsNjMgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMS4gQXJyYXkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDEuIEFycmF5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMi4gQ3Vyc29yIChQZW9wbGUpIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDIiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzAyLiBDdXJzb3IgKFBlb3BsZSkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QzIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8zLiBDdXJzb3IgKFBob25lcykiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDMuIEN1cnNvciAoUGhvbmVzKSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDQiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzQuIExpc3RBZGFwdGVyIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDQiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzA0LiBMaXN0QWRhcHRlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDUiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzUuIFNlcGFyYXRvcnMiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDUuIFNlcGFyYXRvcnMiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q2IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy82LiBMaXN0QWRhcHRlciBDb2xsYXBzZWQiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDYuIExpc3RBZGFwdGVyIENvbGxhcHNlZCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDciIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzcuIEN1cnNvciAoUGhvbmVzKSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q3IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wNy4gQ3Vyc29yIChQaG9uZXMpIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0OCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvOC4gUGhvdG9zIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDgiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzA4LiBQaG90b3MiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q5IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy85LiBBcnJheSAoT3ZlcmxheSkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0OSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDkuIEFycmF5IChPdmVybGF5KSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CkBAIC0xMTQ0LDYgKzE0MjQsMjcgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MTUiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzE1LiBTZWxlY3Rpb24gTW9kZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDE2IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8xNi4gQm9yZGVyIHNlbGVjdGlvbiBtb2RlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MTciIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzE3LiBBY3RpdmF0ZSBpdGVtcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuRXhwYW5kYWJsZUxpc3QxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9FeHBhbmRhYmxlIExpc3RzLzEuIEN1c3RvbSBBZGFwdGVyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KQEAgLTEyMDksNiArMTUxMCwxNCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkdyaWQzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvR3JpZC8zLiBTZWxlY3Rpb24gTW9kZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuSW1hZ2VWaWV3MSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9JbWFnZVZpZXciPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CkBAIC0xMzEyLDE1ICsxNjIxLDM1IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuQ29udHJvbHMxIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0NvbnRyb2xzLzEuIExpZ2h0IFRoZW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ij4KKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0NvbnRyb2xzLzEuIExpZ2h0IFRoZW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkNvbnRyb2xzMiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvMi4gRGVmYXVsdCBUaGVtZSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkNvbnRyb2xzMiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0NvbnRyb2xzLzIuIERhcmsgVGhlbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuQ29udHJvbHMzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvMy4gSG9sbyBMaWdodCBUaGVtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0LkhvbG8iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkNvbnRyb2xzNCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0NvbnRyb2xzLzQuIEhvbG8gRGFyayBUaGVtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8iPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgpAQCAtMTQ2MSw2ICsxNzkwLDM4IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuUG9wdXBNZW51MSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvUG9wdXAgTWVudSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuU2VhcmNoVmlld0FjdGlvbkJhciIgYW5kcm9pZDpsYWJlbD0iVmlld3MvU2VhcmNoIFZpZXcvQWN0aW9uIEJhciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5kZWZhdWx0X3NlYXJjaGFibGUiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9Ii5hcHAuU2VhcmNoUXVlcnlSZXN1bHRzIiAvPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlNlYXJjaFZpZXdGaWx0ZXJNb2RlIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9TZWFyY2ggVmlldy9GaWx0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sbyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuUm90YXRpbmdCdXR0b24iIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL1JvdGF0aW5nIEJ1dHRvbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuU2VjdXJlVmlldyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvU2VjdXJlIFZpZXciPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMTQ2OCw2ICsxODI5LDEzIEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuU3BsaXRUb3VjaFZpZXciIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL1NwbGl0dGluZyBUb3VjaGVzIGFjcm9zcyBWaWV3cyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogICAgICAgICA8IS0tICAgICAgICAgICBHUkFQSElDUyBTQU1QTEVTICAgICAgICAgICAgLS0+CiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vYW5pbWF0b3IueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9hbmltYXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzMmYxOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vYW5pbWF0b3IueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIKKyAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICBhbmRyb2lkOnJlcGVhdENvdW50PSIxIgorICAgIGFuZHJvaWQ6cmVwZWF0TW9kZT0icmV2ZXJzZSIvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9hbmltYXRvcl9zZXQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9hbmltYXRvcl9zZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNThkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2FuaW1hdG9yX3NldC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldD4KKyAgICA8b2JqZWN0QW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjIwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9IngiCisgICAgICAgIGFuZHJvaWQ6cmVwZWF0Q291bnQ9IjEiCisgICAgICAgIGFuZHJvaWQ6cmVwZWF0TW9kZT0icmV2ZXJzZSIvPgorICAgIDxvYmplY3RBbmltYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InkiCisgICAgICAgIGFuZHJvaWQ6cmVwZWF0Q291bnQ9IjEiCisgICAgICAgIGFuZHJvaWQ6cmVwZWF0TW9kZT0icmV2ZXJzZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL29iamVjdF9hbmltYXRvci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL29iamVjdF9hbmltYXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4NGFhNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vb2JqZWN0X2FuaW1hdG9yLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8b2JqZWN0QW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIyMDAiCisgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ieSIKKyAgICBhbmRyb2lkOnJlcGVhdENvdW50PSIxIgorICAgIGFuZHJvaWQ6cmVwZWF0TW9kZT0icmV2ZXJzZSIvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtaGRwaS9hcGlkZW1vX2FuZHJvaWRsb2dvLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLWhkcGkvYXBpZGVtb19hbmRyb2lkbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4MTgxYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLWhkcGkvYXBpZGVtb19hbmRyb2lkbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtbWRwaS9hcGlkZW1vX2FuZHJvaWRsb2dvLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvYXBpZGVtb19hbmRyb2lkbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYjQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvYXBpZGVtb19hbmRyb2lkbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR0aW5nc19hcHBsaWNhdGlvbnMucG5nIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR0aW5nc19hcHBsaWNhdGlvbnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0NWZmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3NldHRpbmdzX2FwcGxpY2F0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR0aW5nc19kaXNwbGF5LnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhZjM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvbWFnbmlmeWluZ19nbGFzcy5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9tYWduaWZ5aW5nX2dsYXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTkyYWUwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvbWFnbmlmeWluZ19nbGFzcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LWxhbmQvZnJhZ21lbnRfbGF5b3V0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MTJmMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIGxheW91dCBmcmFnbWVudCBzYW1wbGUuICBUaGlzIHZlcnNpb24gaXMKKyAgICAgZm9yIGRpc3BsYXkgd2hlbiBpbiBsYW5kc2NhcGU6IHdlIGNhbiBmaXQgYm90aCB0aXRsZXMgYW5kIGRpYWxvZy4gLS0+CisKKzwhLS0gQkVHSU5fSU5DTFVERShsYXlvdXQpIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8ZnJhZ21lbnQgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuRnJhZ21lbnRMYXlvdXQkVGl0bGVzRnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlcyIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8ZnJhZ21lbnQgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuRnJhZ21lbnRMYXlvdXQkRGV0YWlsc0ZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kZXRhaWxzIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKyAgICAKKzwvTGluZWFyTGF5b3V0PgorPCEtLSBFTkRfSU5DTFVERShsYXlvdXQpIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxOGZkYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9ucy54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90b2dnbGVfaG9tZV9hc191cCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90b2dnbGVfaG9tZV9hc191cCIgLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlX3Nob3dfaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90b2dnbGVfc2hvd19ob21lIiAvPgorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90b2dnbGVfdXNlX2xvZ28iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdG9nZ2xlX3VzZV9sb2dvIiAvPgorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90b2dnbGVfc2hvd190aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90b2dnbGVfc2hvd190aXRsZSIgLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlX3Nob3dfY3VzdG9tIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RvZ2dsZV9zaG93X2N1c3RvbSIgLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlX25hdmlnYXRpb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdG9nZ2xlX25hdmlnYXRpb24iIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2N5Y2xlX2N1c3RvbV9ncmF2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2N5Y2xlX2N1c3RvbV9ncmF2aXR5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl9kaXNwbGF5X29wdGlvbnNfY3VzdG9tLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9uc19jdXN0b20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjViZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl9kaXNwbGF5X29wdGlvbnNfY3VzdG9tLnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPEJ1dHRvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kaXNwbGF5X29wdGlvbnNfY3VzdG9tX2J1dHRvbiIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RhYl9jb250ZW50LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RhYl9jb250ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGFhN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGFiX2NvbnRlbnQueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGFicy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90YWJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGFicy54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdtZW50X2NvbnRlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J0bl9hZGRfdGFiIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J0bl9hZGRfdGFiIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ib25BZGRUYWIiIC8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idG5fcmVtb3ZlX3RhYiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idG5fcmVtb3ZlX3RhYiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uUmVtb3ZlVGFiIiAvPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnRuX3RvZ2dsZV90YWJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J0bl90b2dnbGVfdGFicyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uVG9nZ2xlVGFicyIgLz4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J0bl9yZW1vdmVfYWxsX3RhYnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnRuX3JlbW92ZV9hbGxfdGFicyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uUmVtb3ZlQWxsVGFicyIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX2Nsb25pbmcueG1sCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSBhcHBzL0dyYXBoaWNzTGFiL3Jlcy9sYXlvdXQvZ3JhcGhpY3NfbGFiLnhtbApjb3B5IHRvIHNhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fY2xvbmluZy54bWwKaW5kZXggN2MwZTVkOS4uZjQ5YzViMCAxMDA2NDQKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jbG9uaW5nLnhtbApAQCAtMSwyNSArMSwyOCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCisKICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCisKICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotCiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCi0gICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIiBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiPiAgICAgICAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUnVuIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0QnV0dG9uIgorICAgICAgICAvPgogPC9MaW5lYXJMYXlvdXQ+Ci0KLQpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX2N1c3RvbV9ldmFsdWF0b3IueG1sCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSBhcHBzL0dyYXBoaWNzTGFiL3Jlcy9sYXlvdXQvZ3JhcGhpY3NfbGFiLnhtbApjb3B5IHRvIHNhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fY3VzdG9tX2V2YWx1YXRvci54bWwKaW5kZXggN2MwZTVkOS4uZmQwMzNmNiAxMDA2NDQKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jdXN0b21fZXZhbHVhdG9yLnhtbApAQCAtMSwyNSArMSwyOCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCisKICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCisKICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotCiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCi0gICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIiBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiPiAgICAgICAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUGxheSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KIDwvTGluZWFyTGF5b3V0PgotCi0KZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9sb2FkaW5nLnhtbApzaW1pbGFyaXR5IGluZGV4IDY3JQpjb3B5IGZyb20gYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKY29weSB0byBzYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX2xvYWRpbmcueG1sCmluZGV4IDdjMGU1ZDkuLmY0OWM1YjAgMTAwNjQ0Ci0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fbG9hZGluZy54bWwKQEAgLTEsMjUgKzEsMjggQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAorCiAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAorCiAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLQogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgotICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIj4gICAgICAgIAorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlJ1biIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KIDwvTGluZWFyTGF5b3V0PgotCi0KZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eS54bWwKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIGFwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sCmNvcHkgdG8gc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eS54bWwKaW5kZXggN2MwZTVkOS4uZjQ5YzViMCAxMDA2NDQKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eS54bWwKQEAgLTEsMjUgKzEsMjggQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAorCiAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAorCiAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLQogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgotICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIj4gICAgICAgIAorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlJ1biIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KIDwvTGluZWFyTGF5b3V0PgotCi0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fcmV2ZXJzaW5nLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fcmV2ZXJzaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFlNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9yZXZlcnNpbmcueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICA+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJldmVyc2UiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JldmVyc2VCdXR0b24iCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3NlZWtpbmcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9zZWVraW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA3ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9zZWVraW5nLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJ1biIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWVrQmFyIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0b3JfY3VzdG9tX2V2YWx1YXRvci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0b3JfY3VzdG9tX2V2YWx1YXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4NTZkMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRvcl9jdXN0b21fZXZhbHVhdG9yLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlBsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0QnV0dG9uIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdG9yX2V2ZW50cy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0b3JfZXZlbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg5YjViCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdG9yX2V2ZW50cy54bWwKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICA+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FuY2VsQnV0dG9uIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbmQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VuZEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxDaGVja0JveAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbmQgSW1tZWRpYXRlbHkiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VuZENCIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlNlcXVlbmNlciBFdmVudHM6ICAgIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlN0YXJ0ICAgIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydFRleHQiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmVwZWF0ICAgIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZXBlYXRUZXh0IgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FuY2VsVGV4dCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbmQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VuZFRleHQiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQW5pbWF0b3IgRXZlbnRzOiAgICIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJTdGFydCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRUZXh0QW5pbWF0b3IiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmVwZWF0ICAgIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZXBlYXRUZXh0QW5pbWF0b3IiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsICAgIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYW5jZWxUZXh0QW5pbWF0b3IiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRW5kIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbmRUZXh0QW5pbWF0b3IiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9hcHBzL0dyYXBoaWNzTGFiL3Jlcy9sYXlvdXQvZ3JhcGhpY3NfbGFiLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ib3VuY2luZ19iYWxscy54bWwKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKcmVuYW1lIHRvIHNhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ib3VuY2luZ19iYWxscy54bWwKaW5kZXggN2MwZTVkOS4uYzBkZTA3MSAxMDA2NDQKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2JvdW5jaW5nX2JhbGxzLnhtbApAQCAtMSwyNSArMSwyMiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCisKICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCisKICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotCiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCi0gICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIiBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiPiAgICAgICAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgogPC9MaW5lYXJMYXlvdXQ+Ci0KLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NsaXBib2FyZC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvY2xpcGJvYXJkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDViMWVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NsaXBib2FyZC54bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgICBEZW1vbnN0cmF0ZXMgY2xpcGJvYXJkLgorCisgICAgU2VlIGNvcnJlc3BvbmRpbmcgSmF2YSBjb2RlOgorICAgIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5jb250ZW50LkNsaXBib2FyZFNhbXBsZQorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvY29weV9zdHlsZWRfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJwYXN0ZVN0eWxlZFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29weV90ZXh0IiAvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdHlsZWRfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9jb3B5X3BsYWluX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0icGFzdGVQbGFpblRleHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29weV90ZXh0IiAvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wbGFpbl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2NvcHlfaW50ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9InBhc3RlSW50ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvcHlfaW50ZW50IiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9jb3B5X3VyaSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJwYXN0ZVVyaSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb3B5X3VyaSIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFNwaW5uZXIgYW5kcm9pZDppZD0iQCtpZC9jbGlwX3R5cGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnByb21wdD0iQHN0cmluZy9jbGlwX3R5cGVfcHJvbXB0IgorICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbGlwX21pbWVfdHlwZXMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgIC8+CisKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbGlwX3RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NvbnRyb2xzXzEueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NvbnRyb2xzXzEueG1sCmluZGV4IDFhYWVmM2QuLjYzYTJkZTEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9jb250cm9sc18xLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvY29udHJvbHNfMS54bWwKQEAgLTIzLDIzICsyMyw0NiBAQAogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgIAorCisgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb250cm9sc18xX3NhdmUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAKKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2Rpc2FibGVkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvbnRyb2xzXzFfc2F2ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorCisgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZWRpdCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgCisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZWRpdDIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKworICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKICAgICAgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2sxIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyNHNwIgogCSAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNHNwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvbnRyb2xzXzFfY2hlY2tib3hfMSIgLz4KLSAgICAKKwogICAgICAgICA8Q2hlY2tCb3ggYW5kcm9pZDppZD0iQCtpZC9jaGVjazIiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwKaW5kZXggMTZiMDhjZS4uOWMyZjMyMyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RldmljZV9hZG1pbl9zYW1wbGUueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9kZXZpY2VfYWRtaW5fc2FtcGxlLnhtbApAQCAtMTUsMTMyICsxNSwyMzEgQEAKIC0tPgogCiA8IS0tIERlbW9uc3RyYXRlcyBpbXBsZW1lbnRhdGlvbiBvZiBhIERldmljZUFkbWluLiAtLT4KKzxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAotICAgIDxUZXh0VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYW1wbGVfZGV2aWNlX2FkbWluX3N1bW1hcnkiLz4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW5hYmxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW5hYmxlX2FkbWluIj4KLSAgICAgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Rpc2FibGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kaXNhYmxlX2FkbWluIj4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX3F1YWxpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpwcm9tcHQ9IkBzdHJpbmcvcGFzc3dvcmRfcXVhbGl0eSI+Ci0gICAgICAgIDwvU3Bpbm5lcj4KLQotICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9sZW5ndGgiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbGVuZ3RoX2hpbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KLSAgICAgICAgPC9FZGl0VGV4dD4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF9wYXNzd29yZCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWRfbGF5b3V0X2dyYXZpdHk9ImVhc3R8Y2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3Bhc3N3b3JkIj4KLSAgICA8L0J1dHRvbj4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9oaW50IgotICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+Ci0gICAgICAgIDwvRWRpdFRleHQ+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3Jlc2V0X3Bhc3N3b3JkIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVzZXRfcGFzc3dvcmQiPgotICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYW1wbGVfZGV2aWNlX2FkbWluX3N1bW1hcnkiLz4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW5hYmxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbmFibGVfYWRtaW4iPgorICAgICAgICAgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZGlzYWJsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGlzYWJsZV9hZG1pbiI+CisgICAgICAgICAgICA8L0J1dHRvbj4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX3F1YWxpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvbXB0PSJAc3RyaW5nL3Bhc3N3b3JkX3F1YWxpdHkiPgorICAgICAgICAgICAgPC9TcGlubmVyPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9sZW5ndGgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbGVuZ3RoX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbGV0dGVycyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX2xldHRlcnNfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbnVtZXJpYyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX251bWVyaWNfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRfbWluaW11bV9sb3dlcmNhc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbWluaW11bV9sb3dlcmNhc2VfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fc3ltYm9scyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX3N5bWJvbHNfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbm9ubGV0dGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX21pbmltdW1fbm9ubGV0dGVyX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X3Bhc3N3b3JkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWRfbGF5b3V0X2dyYXZpdHk9ImVhc3R8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXRfcGFzc3dvcmQiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVzZXRfcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZXNldF9wYXNzd29yZCI+CisgICAgICAgICAgICA8L0J1dHRvbj4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9tYXhfZmFpbGVkX3B3IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL21heF9mYWlsZWRfcHdfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmNlX2xvY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mb3JjZV9sb2NrIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvd2lwZV9kYXRhIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lwZV9kYXRhIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvd2lwZV9hbGxfZGF0YSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3dpcGVfYWxsX2RhdGEiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC90aW1lb3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy90aW1lb3V0X2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmZyZWV6ZXNUZXh0PSJ0cnVlIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zZXRfdGltZW91dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NldF90aW1lb3V0X2xhYmVsIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Byb3h5aG9zdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcHJveHlob3N0X2hpbnQiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcHJveHlsaXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wcm94eWxpc3RfaGludCI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X3Byb3h5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3Byb3h5X2xhYmVsIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvbWF4X2ZhaWxlZF9wdyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9tYXhfZmFpbGVkX3B3X2hpbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KLSAgICAgICAgPC9FZGl0VGV4dD4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmNlX2xvY2siCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mb3JjZV9sb2NrIj4KLSAgICA8L0J1dHRvbj4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvd2lwZV9kYXRhIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lwZV9kYXRhIj4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3dpcGVfYWxsX2RhdGEiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy93aXBlX2FsbF9kYXRhIj4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC90aW1lb3V0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3RpbWVvdXRfaGludCIKLSAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmZyZWV6ZXNUZXh0PSJ0cnVlIj4KLSAgICAgICAgPC9FZGl0VGV4dD4KLQotICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X3RpbWVvdXQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXRfdGltZW91dF9sYWJlbCI+Ci0gICAgICAgIDwvQnV0dG9uPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgotCis8L1Njcm9sbFZpZXc+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYW5pbS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYW5pbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlYzg5NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9hbmltLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUb3AtbGV2ZWwgY29udGVudCB2aWV3IGZvciB0aGUgbGF5b3V0IGZyYWdtZW50IHNhbXBsZS4gLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICA8ZnJhZ21lbnQgYW5kcm9pZDpuYW1lPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50QW5pbSRGaXJzdEZyYWdtZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZ21lbnQxIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZyYWcxaGlkZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJIaWRlIj4KKyAgICAgICAgPC9CdXR0b24+CisgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICA8ZnJhZ21lbnQgYW5kcm9pZDpuYW1lPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50QW5pbSRTZWNvbmRGcmFnbWVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdtZW50MiIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mcmFnMmhpZGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iSGlkZSI+CisgICAgICAgIDwvQnV0dG9uPgorICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfY29udGV4dF9tZW51LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9jb250ZXh0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMmMwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfY29udGV4dF9tZW51LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjhkcCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X2NvbnRleHRfbWVudV9tc2ciIC8+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbG9uZ19wcmVzcyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvbmdfcHJlc3MiPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9CdXR0b24+CisgICAgCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2cueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2RpYWxvZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzZjY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2cueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIgLz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zaG93IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2hvdyI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0J1dHRvbj4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTVlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBzaW1wbGUgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X21zZyIgLz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zaG93X2RpYWxvZyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Nob3ciPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9CdXR0b24+CisKKyAgICA8VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5saW5lX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X2lubGluZSIgLz4KKworICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWJlZGRlZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNmRwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmYzMDMwMzAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTNjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUb3AtbGV2ZWwgY29udGVudCB2aWV3IGZvciB0aGUgbGF5b3V0IGZyYWdtZW50IHNhbXBsZS4gIFRoaXMgdmVyc2lvbiBpcworICAgICBmb3IgZGlzcGxheSB3aGVuIG5vdCBpbiBsYW5kc2NhcGU6IHdlIGNhbiBvbmx5IGZpdCB0aGUgbGlzdCBvZiB0aXRsZXMuIC0tPgorCis8IS0tIEJFR0lOX0lOQ0xVREUobGF5b3V0KSAtLT4KKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxmcmFnbWVudCBjbGFzcz0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcC5GcmFnbWVudExheW91dCRUaXRsZXNGcmFnbWVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+Cis8L0ZyYW1lTGF5b3V0PgorPCEtLSBFTkRfSU5DTFVERShsYXlvdXQpIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X21lbnUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDNjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbWVudS54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZHAiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mcmFnbWVudF9tZW51X21zZyIgLz4KKworICAgIDxDaGVja0JveCBhbmRyb2lkOmlkPSJAK2lkL21lbnUxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmNoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mcmFnbWVudDFtZW51Ij4KKyAgICA8L0NoZWNrQm94PgorICAgIAorICAgIDxDaGVja0JveCBhbmRyb2lkOmlkPSJAK2lkL21lbnUyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmNoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mcmFnbWVudDJtZW51Ij4KKyAgICA8L0NoZWNrQm94PgorICAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTlhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjhkcCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X3JldGFpbl9pbnN0YW5jZV9tc2ciIC8+CisKKyAgICA8UHJvZ3Jlc3NCYXIgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc19ob3Jpem9udGFsIgorICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlSG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjIwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI2ZHAiCisgICAgICAgIGFuZHJvaWQ6bWF4PSI1MDAiIC8+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVzdGFydCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Jlc3RhcnQiPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9CdXR0b24+CisgICAgCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9zdGFjay54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfc3RhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Yjg3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfc3RhY2sueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBzaW1wbGUgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zaW1wbGVfZnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+CisgICAgICAgICAgICAKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV3X2ZyYWdtZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25ld19mcmFnbWVudCI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0J1dHRvbj4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZ2FsbGVyeV8xLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYWxsZXJ5XzEueG1sCmluZGV4IDliOWM0YmIuLjgyMzllZjAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYWxsZXJ5XzEueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYWxsZXJ5XzEueG1sCkBAIC0xNCw4ICsxNCwxOSBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08R2FsbGVyeSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkAraWQvZ2FsbGVyeSIKLQlhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotCWFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorPExpbmVhckxheW91dAorIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyBhbmRyb2lkOmlkPSJAK2lkL2xheW91dDIiCisgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorPEdhbGxlcnkgIGFuZHJvaWQ6aWQ9IkAraWQvZ2FsbGVyeSIKK2FuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKK2FuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogLz4KLSAgICAgICAKKzxFZGl0VGV4dAorIGFuZHJvaWQ6dGV4dD0iQCtpZC9FZGl0VGV4dDAxIgorIGFuZHJvaWQ6aWQ9IkAraWQvRWRpdFRleHQwMSIKKyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij48L0VkaXRUZXh0PgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xhYmVsZWRfdGV4dF9lZGl0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9sYWJlbGVkX3RleHRfZWRpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1NjhhZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9sYWJlbGVkX3RleHRfZWRpdC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gQ29udGVudCBmb3IgYSBmcmFnbWVudCB3aXRoIGEgdGV4dCBlZGl0b3IuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21zZyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIiAvPgorCisgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvc2F2ZWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2dyZWVuIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5pdGlhbF90ZXh0IgorICAgICAgICBhbmRyb2lkOmZyZWV6ZXNUZXh0PSJ0cnVlIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvRWRpdFRleHQ+CisKKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGF5b3V0X2FuaW1hdGlvbnMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzdmZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcGFyZW50IgorICAgID4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkFkZCBCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkZE5ld0J1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxDaGVja0JveAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDdXN0b20gQW5pbWF0aW9ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tQW5pbUNCIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQXBwZWFyaW5nIEFuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXBwZWFyaW5nQ0IiCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRGlzYXBwZWFyaW5nIEFuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGlzYXBwZWFyaW5nQ0IiCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2hhbmdpbmcvQXBwZWFyaW5nIEFuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hhbmdpbmdBcHBlYXJpbmdDQiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxDaGVja0JveAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpjaGVja2VkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDaGFuZ2luZy9EaXNhcHBlYXJpbmcgQW5pbWF0aW9uIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGFuZ2luZ0Rpc2FwcGVhcmluZ0NCIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zX2J5X2RlZmF1bHQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zX2J5X2RlZmF1bHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjMxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGF5b3V0X2FuaW1hdGlvbnNfYnlfZGVmYXVsdC54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICA+CisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQgQnV0dG9uIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkZE5ld0J1dHRvbiIKKyAgICAgICAgLz4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ob3Jpem9udGFsQ29udGFpbmVyIgorICAgICAgICBhbmRyb2lkOmFuaW1hdGVMYXlvdXRDaGFuZ2VzPSJ0cnVlIgorICAgICAgICAvPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmVydGljYWxDb250YWluZXIiCisgICAgICAgIGFuZHJvaWQ6YW5pbWF0ZUxheW91dENoYW5nZXM9InRydWUiCisgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9sYXlvdXRfYW5pbWF0aW9uc19oaWRlc2hvdy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGF5b3V0X2FuaW1hdGlvbnNfaGlkZXNob3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2NmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGF5b3V0X2FuaW1hdGlvbnNfaGlkZXNob3cueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9wYXJlbnQiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU2hvdyBCdXR0b25zIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZGROZXdCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ3VzdG9tIEFuaW1hdGlvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2N1c3RvbUFuaW1DQiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxDaGVja0JveAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJIaWRlIChHT05FKSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaGlkZUdvbmVDQiIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfMS54bWwKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIGFwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sCmNvcHkgdG8gc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfMS54bWwKaW5kZXggN2MwZTVkOS4uNmRkYzc2ZSAxMDA2NDQKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvbGF5b3V0L2dyYXBoaWNzX2xhYi54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfMS54bWwKQEAgLTEsMjUgKzEsMjUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgogCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKKwogICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKKwogICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci0KIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIiBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKLSAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCI+ICAgICAgICAKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ib25Qb3B1cEJ1dHRvbkNsaWNrIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3BvcHVwX21lbnVfYnV0dG9uIiAvPgogPC9MaW5lYXJMYXlvdXQ+Ci0KLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX2xpc3QueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1N2FmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcm90YXRpbmdfbGlzdC54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iRmxpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF9lbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIvPgorICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpc3RfZnIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX3ZpZXcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWJhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcm90YXRpbmdfdmlldy54bWwKQEAgLTAsMCArMSwxNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJ0cnVlIgorICAgID4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9InRydWUiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVFgiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90cmFuc2xhdGlvblgiCisgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUWSIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RyYW5zbGF0aW9uWSIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9InRydWUiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU1giCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NhbGVYIgorICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU1kiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NhbGVZIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0idHJ1ZSIKKyAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJYIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFNlZWtCYXIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm90YXRpb25YIgorICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iWSIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JvdGF0aW9uWSIKKyAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IloiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yb3RhdGlvbloiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjAwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUm90YXRpbmcgQnV0dG9uIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JvdGF0aW5nQnV0dG9uIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc2VhcmNoX3ZpZXcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTlmN2MwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8U2VhcmNoVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaHZpZXdfYWN0aW9uYmFyLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2FjdGlvbmJhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3MzZjZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2FjdGlvbmJhci54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL29wZW5fYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL29wZW5fc2VhcmNoIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgLz4KKworICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvc2VfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2Nsb3NlX3NlYXJjaCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIi8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaHZpZXdfZmlsdGVyLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2ZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYzE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2ZpbHRlci54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPFNlYXJjaFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX3ZpZXciCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKyAgICA8TGlzdFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF92aWV3IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIi8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NvZnRfaW5wdXRfbW9kZXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NvZnRfaW5wdXRfbW9kZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDdiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc29mdF9pbnB1dF9tb2Rlcy54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gRGVtb25zdHJhdGVzIGRpZmZlcmVudCBzb2Z0IGlucHV0IG1vZGVzLgorICAgICBTZWUgY29ycmVzcG9uZGluZyBKYXZhIGNvZGUgY29tLmFuZHJvaWQuc2RrLmFwcC5Tb2Z0SW5wdXRNb2Rlcy5qYXZhLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6dGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zb2Z0X2lucHV0X21vZGVzX3N1bW1hcnkiLz4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6dGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc29mdF9pbnB1dF9tb2Rlc19sYWJlbCIvPgorCisgICAgICAgIDxTcGlubmVyIGFuZHJvaWQ6aWQ9IkAraWQvcmVzaXplX21vZGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIj4KKyAgICAgICAgPC9TcGlubmVyPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcmVkIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDp0ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NvZnRfaW5wdXRfbW9kZXNfY29udGVudCIvPgorCisgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvc2F2ZWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2dyZWVuIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc29mdF9pbnB1dF9tb2Rlc19pbml0aWFsX3RleHQiCisgICAgICAgIGFuZHJvaWQ6ZnJlZXplc1RleHQ9InRydWUiPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9FZGl0VGV4dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc3BsaXRfdG91Y2hfdmlldy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc3BsaXRfdG91Y2hfdmlldy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1ODIyMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zcGxpdF90b3VjaF92aWV3LnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFNwbGl0IHRvdWNoIGRlbW8uIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zcGxpdF90b3VjaF92aWV3X2Rlc2NyaXB0aW9uIi8+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJ0cnVlIj4KKyAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdDEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQCtpZC9saXN0MiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvYWN0aW9ucy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2FjdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDhhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2FjdGlvbnMueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iCisgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblNlYXJjaCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9hZGQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2FkZCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfYWRkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2VkaXQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2VkaXQiCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfZWRpdCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zaGFyZSIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmUiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY3Rpb25fYmFyX3NoYXJlIgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fem9vbSIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfem9vbSIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfem9vbSIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tIj4KKyAgICAgICAgPG1lbnU+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zYXZlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NhdmUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc2F2ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iIC8+CisgICAgICAgIDwvbWVudT4KKyAgICA8L2l0ZW0+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2Rpc3BsYXlfb3B0aW9uc19hY3Rpb25zLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvZGlzcGxheV9vcHRpb25zX2FjdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzJkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2Rpc3BsYXlfb3B0aW9uc19hY3Rpb25zLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NpbXBsZV9pdGVtIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGlzcGxheV9vcHRpb25zX21lbnVfaXRlbSIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvbGlzdF9zZWxlY3RfbWVudS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2xpc3Rfc2VsZWN0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MGUzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2xpc3Rfc2VsZWN0X21lbnUueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zaGFyZSIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NoYXJlIgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zaGFyZSIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIiAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9wb3B1cC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L3BvcHVwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBlM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9wb3B1cC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X3NlYXJjaCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FkZCIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfYWRkIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcG9wdXBfbWVudV9hZGQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9lZGl0IgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9lZGl0IgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcG9wdXBfbWVudV9lZGl0Ij4KKyAgICAgICAgPG1lbnU+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NoYXJlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NoYXJlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X3NoYXJlIiAvPgorICAgICAgICA8L21lbnU+CisgICAgPC9pdGVtPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9zZWFyY2h2aWV3X2luX21lbnUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9zZWFyY2h2aWV3X2luX21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDM2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L3NlYXJjaHZpZXdfaW5fbWVudS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgICBhbmRyb2lkOmFjdGlvblZpZXdDbGFzcz0iYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldyIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKaW5kZXggMjljOWQyZS4uYWFjNGY3OSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTM4LDYgKzM4LDE0IEBACiAgICAgICAgIDxpdGVtPlBsdXRvPC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBVc2VkIGluIGNvbnRlbnQvQ2xpcGJvYXJkU2FtcGxlLmphdmEgLS0+CisgICAgPHN0cmluZy1hcnJheSBuYW1lPSJjbGlwX2RhdGFfdHlwZXMiPgorICAgICAgICA8aXRlbT5ObyBkYXRhIGluIGNsaXBib2FyZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+VGV4dCBjbGlwPC9pdGVtPgorICAgICAgICA8aXRlbT5JbnRlbnQgY2xpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+VXJpIGNsaXA8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKICAgICA8IS0tIFVzZWQgaW4gQXBwL1NlYXJjaEludm9rZS5qYXZhIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0ic2VhcmNoX21lbnVNb2RlcyI+CiAgICAgICAgIDxpdGVtPlNlYXJjaCBLZXk8L2l0ZW0+CkBAIC05Miw2ICsxMDAsNyBAQAogICAgICAgICA8aXRlbT5OdW1lcmljPC9pdGVtPgogICAgICAgICA8aXRlbT5BbHBoYWJldGljPC9pdGVtPgogICAgICAgICA8aXRlbT5BbHBoYW51bWVyaWM8L2l0ZW0+CisgICAgICAgIDxpdGVtPkNvbXBsZXg8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKICAgICA8IS0tIFVzZWQgaW4gYXBwL1NjcmVlbiBPcmllbnRhdGlvbiAtLT4KQEAgLTExOCw0ICsxMjcsMjMgQEAKICAgICAgICAgPGl0ZW0+KmJ6enQqXG5Zb3VcJ3JlIG5vdCB2ZXJ5IGdvb2QgYXQgdGhpcywgYXJlIHlvdT88L2l0ZW0+CiAgICAgICAgIDxpdGVtPipienp0KlxuR28gYXdheS4uLjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KKworICAgIDwhLS0gVXNlZCBpbiB2aWV3L1NwbGl0IFRvdWNoIFZpZXcgZXhhbXBsZSAtLT4KKyAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImNoZWVzZV9yZXNwb25zZXMiPgorICAgICAgICA8aXRlbT5JXCdtIGFmcmFpZCB3ZVwncmUgZnJlc2ggb3V0LjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SVwnbSBhZnJhaWQgd2UgbmV2ZXIgaGF2ZSB0aGF0IGF0IHRoZSBlbmQgb2YgdGhlIHdlZWssIHNpci4gIFdlIGdldCBpdCBmcmVzaCBvbiBNb25kYXkuPC9pdGVtPgorICAgICAgICA8aXRlbT5BaC4gSXRcJ3MgYmVlbiBvbiBvcmRlciwgc2lyLCBmb3IgdHdvIHdlZWtzLiAgSSB3YXMgZXhwZWN0aW5nIGl0IHRoaXMgbW9ybmluZy48L2l0ZW0+CisgICAgICAgIDxpdGVtPk5vcm1hbGx5LCBzaXIsIHllcy4gIFRvZGF5IHRoZSB2YW4gYnJva2UgZG93bi48L2l0ZW0+CisgICAgICAgIDxpdGVtPk5vLjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+Tm8uPC9pdGVtPgorICAgICAgICA8aXRlbT5Oby48L2l0ZW0+CisgICAgICAgIDxpdGVtPlllcywgc2lyLiAgSXRcJ3MsIGFoIC4uLi4uIGl0XCdzIGEgYml0IHJ1bm55LjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+V2VsbCwgaXRcJ3MgdmVyeSBydW5ueSwgYWN0dWFsbHksIHNpci48L2l0ZW0+CisgICAgICAgIDxpdGVtPkkgdGhpbmsgaXRcJ3MgYSBiaXQgcnVubmllciB0aGFuIHlvdVwnbGwgbGlrZSBpdCwgc2lyLjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+T2guLi4gVGhlIGNhdFwncyBlYXRlbiBpdC48L2l0ZW0+CisgICAgICAgIDxpdGVtPk5vLjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+Tm8uPC9pdGVtPgorICAgICAgICA8aXRlbT5Oby48L2l0ZW0+CisgICAgICAgIDxpdGVtPk1tbS4uLiBjaGVlc2UuPC9pdGVtPgorICAgIDwvc3RyaW5nLWFycmF5PgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggZGI0MzJjMS4uOTNmMTQ1ZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtNjgsNiArNjgsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9Im5vX3NhdmVzX3N0YXRlIj5UaGlzIHRleHQgZmllbGQgZG9lcyBub3Qgc2F2ZSBpdHMgc3RhdGU6PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbml0aWFsX3RleHQiPkluaXRpYWwgdGV4dC48L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0ic29mdF9pbnB1dF9tb2RlcyI+QXBwL0FjdGl2aXR5L1NvZnQgSW5wdXQgTW9kZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNvZnRfaW5wdXRfbW9kZXNfc3VtbWFyeSI+U2hvd3MgaG93IGRpZmZlcmVudCBzb2Z0IGlucHV0IG1vZGVzIGltcGFjdAorICAgICAgICBhcHBsaWNhdGlvbiByZXNpemluZyBkdWUgdG8gYW4gaW5wdXQgbWV0aG9kLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic29mdF9pbnB1dF9tb2Rlc19sYWJlbCI+UmVzaXplIG1vZGU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic29mdF9pbnB1dF9tb2Rlc19jb250ZW50Ij5UaGlzIGlzIGEgcGFydCBvZiB0aGUgYXBwbGljYXRpb25cJ3MgVUkgdGhhdAorICAgICAgICBjYW4gcmVzaXplIHRvIGFkanVzdCBmb3IgdGhlIElNRS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNvZnRfaW5wdXRfbW9kZXNfaW5pdGlhbF90ZXh0Ij5UZXh0IGVkaXRvci5cblxuVGFwIHRvIHNob3cgdGhlIElNRSwKKyAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSB0aGlzIHdpbmRvdyB0byByZXNpemUgYXMgcmVxdWVzdGVkLjwvc3RyaW5nPgorICAgIAogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfcGVyc2lzdGVudCI+QXBwL0FjdGl2aXR5L1BlcnNpc3RlbnQgU3RhdGU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcnNpc3RlbnRfbXNnIj5EZW1vbnN0cmF0aW9uIG9mIHBlcnNpc3RlbnQgYWN0aXZpdHkgc3RhdGUgd2l0aCBnZXRQcmVmZXJlbmNlcygwKS5lZGl0KCkgYW5kIGdldFByZWZlcmVuY2VzKDApLjwvc3RyaW5nPgogCkBAIC04OSw2ICs5OCw0NiBAQAogICAgIDxzdHJpbmcgbmFtZT0icmVkaXJlY3RfZ2V0dGVyIj5FbnRlciB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgbWFpbiBhY3Rpdml0eS4gIFByZXNzIGJhY2sgdG8gY2FuY2VsLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXBwbHkiPkFwcGx5PC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2FsZXJ0X2RpYWxvZyI+QXBwL0ZyYWdtZW50L0FsZXJ0IERpYWxvZzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9hbmltIj5BcHAvRnJhZ21lbnQvQW5pbTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9jb250ZXh0X21lbnUiPkFwcC9GcmFnbWVudC9Db250ZXh0IE1lbnU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2NvbnRleHRfbWVudV9tc2ciPkZyYWdtZW50IHBvcHVsYXRpbmcgYSBjb250ZXh0CisgICAgICAgICAgICBtZW51OyBsb25nIHByZXNzIHRoZSBidXR0b24gdG8gc2VlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9uZ19wcmVzcyI+TG9uZyBwcmVzcyBtZTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9kaWFsb2ciPkFwcC9GcmFnbWVudC9EaWFsb2c8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3ciPlNob3c8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5Ij5BcHAvRnJhZ21lbnQvRGlhbG9nIG9yIEFjdGl2aXR5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHlfbXNnIj5EZW1vbnN0cmF0ZXMgdGhlIHNhbWUgZnJhZ21lbnQKKyAgICAgICAgICAgIGJlaW5nIHNob3duIGFzIGEgZGlhbG9nIGFuZCBlbWJlZGRlZCBpbnNpZGUgb2YgYW4gYWN0aXZpdHkuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHlfaW5saW5lIj5GcmFnbWVudCBlbWJlZGRlZCBpbnNpZGUKKyAgICAgICAgICAgIG9mIHRoZSBhY3Rpdml0eTo8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfbGF5b3V0Ij5BcHAvRnJhZ21lbnQvTGF5b3V0PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2xpc3RfYXJyYXkiPkFwcC9GcmFnbWVudC9MaXN0IEFycmF5PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2xpc3RfY3Vyc29yX2xvYWRlciI+QXBwL0ZyYWdtZW50L0xpc3QgQ3Vyc29yIExvYWRlcjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9tZW51Ij5BcHAvRnJhZ21lbnQvTWVudTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfbWVudV9tc2ciPkJ1aWxkIG1lbnVzIGZyb20gdHdvIGZyYWdtZW50cywgYWxsb3dpbmcKKyAgICAgICAgeW91IHRvIGhpZGUgdGhlbSB0byByZW1vdmUgdGhlbS4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudDFtZW51Ij5TaG93IGZyYWdtZW50IDEgbWVudTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnQybWVudSI+U2hvdyBmcmFnbWVudCAyIG1lbnU8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlIj5BcHAvRnJhZ21lbnQvUmV0YWluIEluc3RhbmNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9yZXRhaW5faW5zdGFuY2VfbXNnIj5DdXJyZW50IHByb2dyZXNzIG9mIHJldGFpbmVkIGZyYWdtZW50OworICAgIHJlc3RhcnRzIGlmIGZyYWdtZW50IGlzIHJlLWNyZWF0ZWQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyZXN0YXJ0Ij5SZXN0YXJ0PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3JlY2VpdmVfcmVzdWx0Ij5BcHAvRnJhZ21lbnQvUmVjZWl2ZSBSZXN1bHQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfc3RhY2siPkFwcC9GcmFnbWVudC9TdGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV3X2ZyYWdtZW50Ij5OZXcgZnJhZ21lbnQ8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbWVudSI+QXBwL0FjdGl2aXR5L01lbnU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9wZW5fbWVudSI+T3BlbiBtZW51PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjbG9zZV9tZW51Ij5DbG9zZSBtZW51PC9zdHJpbmc+CkBAIC0yMzgsNiArMjg3LDEyIEBACiAgICAgPCEtLSAgYXBwL2NvbnRlbnQgZXhhbXBsZXMgc3RyaW5ncyAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2NsaXBib2FyZCI+Q29udGVudC9DbGlwYm9hcmQvRGF0YSBUeXBlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29weV90ZXh0Ij5Db3B5IFRleHQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcHlfaW50ZW50Ij5Db3B5IEludGVudDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29weV91cmkiPkNvcHkgVVJJPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjbGlwX3R5cGVfcHJvbXB0Ij5DbGlwIFR5cGU8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfZXh0ZXJuYWxfc3RvcmFnZSI+Q29udGVudC9TdG9yYWdlL0V4dGVybmFsIFN0b3JhZ2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNyZWF0ZSI+Q3JlYXRlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkZWxldGUiPkRlbGV0ZTwvc3RyaW5nPgpAQCAtMjYwLDcgKzMxNSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwaWNrX3BlcnNvbiI+UGljayBhIFBlcnNvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGlja19waG9uZSI+UGljayBhIFBob25lPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwaWNrX2FkZHJlc3MiPlBpY2sgYW4gQWRkcmVzczwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSAgYXBwL2ludGVudHMgZXhhbXBsZXMgc3RyaW5ncyAgICAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0zNjMsMTIgKzQxOCwxNCBAQAogICAgIDwhLS0gIGFwcC9tZW51IGV4YW1wbGVzIHN0cmluZ3MgICAgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogCi0gICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlc19mcm9tX3htbCI+QXBwL1ByZWZlcmVuY2VzLzEuIFByZWZlcmVuY2VzIGZyb20gWE1MPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hpbmdfcHJlZmVyZW5jZXMiPkFwcC9QcmVmZXJlbmNlcy8yLiBMYXVuY2hpbmcgcHJlZmVyZW5jZXM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VfZGVwZW5kZW5jaWVzIj5BcHAvUHJlZmVyZW5jZXMvMy4gUHJlZmVyZW5jZSBkZXBlbmRlbmNpZXM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdmFsdWVzIj5BcHAvUHJlZmVyZW5jZXMvNC4gRGVmYXVsdCB2YWx1ZXM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VzX2Zyb21fY29kZSI+QXBwL1ByZWZlcmVuY2VzLzUuIFByZWZlcmVuY2VzIGZyb20gY29kZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWR2YW5jZWRfcHJlZmVyZW5jZXMiPkFwcC9QcmVmZXJlbmNlcy82LiBBZHZhbmNlZCBwcmVmZXJlbmNlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZXNfZnJvbV94bWwiPlByZWZlcmVuY2UvMS4gUHJlZmVyZW5jZXMgZnJvbSBYTUw8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaGluZ19wcmVmZXJlbmNlcyI+UHJlZmVyZW5jZS8yLiBMYXVuY2hpbmcgcHJlZmVyZW5jZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VfZGVwZW5kZW5jaWVzIj5QcmVmZXJlbmNlLzMuIFByZWZlcmVuY2UgZGVwZW5kZW5jaWVzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3ZhbHVlcyI+UHJlZmVyZW5jZS80LiBEZWZhdWx0IHZhbHVlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZXNfZnJvbV9jb2RlIj5QcmVmZXJlbmNlLzUuIFByZWZlcmVuY2VzIGZyb20gY29kZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWR2YW5jZWRfcHJlZmVyZW5jZXMiPlByZWZlcmVuY2UvNi4gQWR2YW5jZWQgcHJlZmVyZW5jZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3ByZWZlcmVuY2VzIj5QcmVmZXJlbmNlLzcuIEZyYWdtZW50PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlX3dpdGhfaGVhZGVycyI+UHJlZmVyZW5jZS84LiBIZWFkZXJzPC9zdHJpbmc+CiAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF9wcmVmZXJlbmNlX2FjdGl2aXR5Ij5MYXVuY2ggUHJlZmVyZW5jZUFjdGl2aXR5PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3VudGVyX3ZhbHVlX2lzIj5UaGUgY291bnRlciB2YWx1ZSBpczwvc3RyaW5nPgpAQCAtMzk5LDYgKzQ1Niw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9zY3JlZW5fcHJlZmVyZW5jZSI+U2NyZWVuIHByZWZlcmVuY2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1bW1hcnlfc2NyZWVuX3ByZWZlcmVuY2UiPlNob3dzIGFub3RoZXIgc2NyZWVuIG9mIHByZWZlcmVuY2VzPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlX2ZyYWdtZW50X3ByZWZlcmVuY2UiPkZyYWdtZW50IHByZWZlcmVuY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN1bW1hcnlfZnJhZ21lbnRfcHJlZmVyZW5jZSI+U2hvd3MgYW5vdGhlciBmcmFnbWVudCBvZiBwcmVmZXJlbmNlczwvc3RyaW5nPgorCiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSI+VG9nZ2xlIHByZWZlcmVuY2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1bW1hcnlfbmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UiPlByZWZlcmVuY2UgdGhhdCBpcyBvbiB0aGUgbmV4dCBzY3JlZW4gYnV0IHNhbWUgaGllcmFyY2h5PC9zdHJpbmc+CiAKQEAgLTQ3Myw2ICs1MzMsMTMgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfYWRtaW4iPkRpc2FibGUgQWRtaW48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX3F1YWxpdHkiPlBhc3N3b3JkIFF1YWxpdHk8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2xlbmd0aF9oaW50Ij5NaW5pbXVtIExlbmd0aDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV9sZXR0ZXJzX2hpbnQiPk1pbmltdW0gTGV0dGVyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV91cHBlcmNhc2VfaGludCI+TWluaW11bSBVcHBlcmNhc2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX21pbmltdW1fbG93ZXJjYXNlX2hpbnQiPk1pbmltdW0gTG93ZXJjYXNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX3N5bWJvbHNfaGludCI+TWluaW11bSBTeW1ib2xzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX251bWVyaWNfaGludCI+TWluaW11bSBOdW1lcmljPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX25vbmxldHRlcl9oaW50Ij5NaW5pbXVtIE5vbi1MZXR0ZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoX2hpbnQiPlBhc3N3b3JkIEhpc3RvcnkgTGVuZ3RoPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXRfcGFzc3dvcmQiPlNldCBQYXNzd29yZDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfaGludCI+UGFzc3dvcmQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0X3Bhc3N3b3JkIj5SZXNldCBQYXNzd29yZDwvc3RyaW5nPgpAQCAtNDgyLDYgKzU0OSw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJ3aXBlX2FsbF9kYXRhIj5XaXBlIEFsbCBEYXRhPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aW1lb3V0X2hpbnQiPk1heCBzY3JlZW4gdGltZW91dDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0X3RpbWVvdXRfbGFiZWwiPlNldCBUaW1lb3V0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm94eWhvc3RfaGludCI+R2xvYmFsIHByb3h5aG9zdDpwb3J0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm94eWxpc3RfaGludCI+Tm8gcHJveHkgZm9yIGRvbWFpbjEsZG9tYWluMjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2V0X3Byb3h5X2xhYmVsIj5TZXQgR2xvYmFsIFByb3h5PC9zdHJpbmc+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICBhcHAvdm9pY2UgcmVjb2duaXRpb24gZXhhbXBsZXMgc3RyaW5ncyAgLS0+CkBAIC00OTEsNiArNTYxLDM4IEBACiAgICAgPHN0cmluZyBuYW1lPSJzcGVha19idXR0b24iPlNwZWFrITwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idm9pY2VfcmVjb2duaXRpb25fcmVzdWx0cyI+UmVzdWx0czo8L3N0cmluZz4KIAorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gIGFwcC9hY3Rpb24gYmFyIGV4YW1wbGVzIHN0cmluZ3MgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX21lY2hhbmljcyI+QXBwL0FjdGlvbiBCYXIvQWN0aW9uIEJhciBNZWNoYW5pY3M8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfdXNhZ2UiPkFwcC9BY3Rpb24gQmFyL0FjdGlvbiBCYXIgVXNhZ2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfdGFicyI+QXBwL0FjdGlvbiBCYXIvQWN0aW9uIEJhciBUYWJzPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfc2VhcmNoIj5TZWFyY2g8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfYWRkIj5BZGQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfZWRpdCI+RWRpdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWN0aW9uX2Jhcl9zaGFyZSI+U2hhcmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfem9vbSI+Wm9vbTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWN0aW9uX2Jhcl9zYXZlIj5TYXZlPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zIj5BcHAvQWN0aW9uIEJhci9EaXNwbGF5IE9wdGlvbnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9ob21lX2FzX3VwIj5ESVNQTEFZX0hPTUVfQVNfVVA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9zaG93X2hvbWUiPkRJU1BMQVlfU0hPV19IT01FPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0b2dnbGVfdXNlX2xvZ28iPkRJU1BMQVlfVVNFX0xPR088L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9zaG93X3RpdGxlIj5ESVNQTEFZX1NIT1dfVElUTEU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9zaG93X2N1c3RvbSI+RElTUExBWV9TSE9XX0NVU1RPTTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idG9nZ2xlX25hdmlnYXRpb24iPk5hdmlnYXRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImN5Y2xlX2N1c3RvbV9ncmF2aXR5Ij5DeWNsZSBDdXN0b20gVmlldyBHcmF2aXR5PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRpc3BsYXlfb3B0aW9uc19jdXN0b21fYnV0dG9uIj5DdXN0b20gVmlldyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc3BsYXlfb3B0aW9uc19tZW51X2l0ZW0iPk1lbnUgSXRlbTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJidG5fYWRkX3RhYiI+QWRkIG5ldyB0YWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0bl9yZW1vdmVfdGFiIj5SZW1vdmUgbGFzdCB0YWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0bl90b2dnbGVfdGFicyI+VG9nZ2xlIHRhYiBtb2RlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidG5fcmVtb3ZlX2FsbF90YWJzIj5SZW1vdmUgYWxsIHRhYnM8L3N0cmluZz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICBncmFwaGljcyBleGFtcGxlcyBzdHJpbmdzICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC01MzYsNiArNjM4LDEyIEBACiAKICAgICA8c3RyaW5nIG5hbWU9InJhdGluZ2Jhcl9yYXRpbmciPlJhdGluZzo8L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9zZWFyY2giPlNlYXJjaDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9hZGQiPkFkZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9lZGl0Ij5FZGl0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb3B1cF9tZW51X3NoYXJlIj5TaGFyZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9idXR0b24iPk1ha2UgYSBQb3B1cCE8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0ic2VjdXJlX3ZpZXdfZGVzY3JpcHRpb24iPgogICAgICAgICBUaGlzIGFjdGl2aXR5IGRlbW9uc3RyYXRlcyBhIHZpZXcgdGhhdCBkZXRlY3RzIHdoZW4gaXQgaXMgcG90ZW50aWFsbHkgb2JzY3VyZWQKICAgICAgICAgYnkgb3RoZXIgd2luZG93cy4KQEAgLTU3OSw2ICs2ODcsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InNlY3VyZV92aWV3X292ZXJsYXlfYnV0dG9uMiI+Q2xpY2t5Pzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VjdXJlX3ZpZXdfb3ZlcmxheV9idXR0b24zIj5UaGluayBvZiB0aGUgcGVuZ3VpbnMhPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9InNwbGl0X3RvdWNoX3ZpZXdfZGVzY3JpcHRpb24iPgorICAgICAgICBUaGlzIGFjdGl2aXR5IGRlbW9uc3RyYXRlcyBzcGxpdHRpbmcgdG91Y2ggZXZlbnRzIGFjcm9zcyBtdWx0aXBsZSB2aWV3cworICAgICAgICB3aXRoaW4gYSB2aWV3IGdyb3VwLiAgSGVyZSB3ZSBoYXZlIHR3byBMaXN0Vmlld3Mgd2l0aGluIGEgTGluZWFyTGF5b3V0CisgICAgICAgIHRoYXQgaGFzIHRoZSBhdHRyaWJ1dGUgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cyBzZXQgdG8gInRydWUiLgorICAgICAgICBUcnkgc2Nyb2xsaW5nIGJvdGggbGlzdHMgc2ltdWx0YW5lb3VzbHkgdXNpbmcgbXVsdGlwbGUgZmluZ2Vycy4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNwbGl0X3RvdWNoX3ZpZXdfY2hlZXNlX3RvYXN0Ij5EbyB5b3UgaGF2ZSBhbnkgJTEkcz9cbiUyJHM8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ic2VhcmNodmlld19oaW50Ij5GaW5kIHNvbWV0aGluZzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlZXNlX2h1bnRfaGludCI+Q2hlZXNlIGh1bnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im9wZW5fc2VhcmNoIj5FeHBhbmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNsb3NlX3NlYXJjaCI+SWNvbmlmeTwvc3RyaW5nPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gIEdvb2dsZUxvZ2luIGV4YW1wbGVzIHN0cmluZ3MgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtOTU1LDQgKzEwNzUsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic21zX3NwZWFrX3N0cmluZ19mb3JtYXQiPk1lc3NhZ2UgZnJvbSAiJTEkcyI6ICUyJHM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcGx5Ij5SZXBseTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzbWlzcyI+RGlzbWlzczwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJzaGFyZSI+U2hhcmU8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2FkdmFuY2VkX3ByZWZlcmVuY2VzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9hZHZhbmNlZF9wcmVmZXJlbmNlcy54bWwKaW5kZXggYzM2MjI5Ny4uZGQ2ZGUzMSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2FkdmFuY2VkX3ByZWZlcmVuY2VzLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvYWR2YW5jZWRfcHJlZmVyZW5jZXMueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSBwcmVmZXJlbmNlLCBpZiB0aGUgd2hvbGUgcHJlZmVyZW5jZSB3YW50ZWQgdG8gYmUKICAgICAgICAgIHJlcGxhY2VkIHdlIHdvdWxkIHVzZSB0aGUgbGF5b3V0IGF0dHJpYnV0ZSBpbnN0ZWFkIG9mIHRoZSB3aWRnZXRMYXlvdXQKICAgICAgICAgIGF0dHJpYnV0ZS4gLS0+Ci0gICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuTXlQcmVmZXJlbmNlCisgICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlLk15UHJlZmVyZW5jZQogICAgICAgICAgICAgYW5kcm9pZDprZXk9Im15X3ByZWZlcmVuY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX215X3ByZWZlcmVuY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9teV9wcmVmZXJlbmNlIgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2RldmljZV9hZG1pbl9zYW1wbGUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2RldmljZV9hZG1pbl9zYW1wbGUueG1sCmluZGV4IDcxNTgwMDMuLjdiNzU1MTMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9kZXZpY2VfYWRtaW5fc2FtcGxlLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwKQEAgLTIyLDYgKzIyLDcgQEAKICAgICAgICAgPHJlc2V0LXBhc3N3b3JkIC8+CiAgICAgICAgIDxmb3JjZS1sb2NrIC8+CiAgICAgICAgIDx3aXBlLWRhdGEgLz4KKyAgICAgICAgPHNldC1nbG9iYWwtcHJveHkgLz4KICAgICA8L3VzZXMtcG9saWNpZXM+CiA8L2RldmljZS1hZG1pbj4KIDwhLS0gRU5EX0lOQ0xVREUobWV0YV9kYXRhKSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMzYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXMueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyBhIHByaW1pdGl2ZSBleGFtcGxlIHNob3dpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmZXJlbmNlcyBhdmFpbGFibGUuIC0tPgorPCEtLSBCRUdJTl9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KKzxQcmVmZXJlbmNlU2NyZWVuCisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8UHJlZmVyZW5jZUNhdGVnb3J5CisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2lubGluZV9wcmVmZXJlbmNlcyI+CisKKyAgICAgICAgPENoZWNrQm94UHJlZmVyZW5jZQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJjaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfdG9nZ2xlX3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfdG9nZ2xlX3ByZWZlcmVuY2UiIC8+CisKKyAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KKworICAgIDxQcmVmZXJlbmNlQ2F0ZWdvcnkKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGlhbG9nX2Jhc2VkX3ByZWZlcmVuY2VzIj4KKworICAgICAgICA8RWRpdFRleHRQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9ImVkaXR0ZXh0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9lZGl0dGV4dF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2VkaXR0ZXh0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkaWFsb2dUaXRsZT0iQHN0cmluZy9kaWFsb2dfdGl0bGVfZWRpdHRleHRfcHJlZmVyZW5jZSIgLz4KKworICAgICAgICA8TGlzdFByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0ibGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfbGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2xpc3RfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJpZXM9IkBhcnJheS9lbnRyaWVzX2xpc3RfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJ5VmFsdWVzPSJAYXJyYXkvZW50cnl2YWx1ZXNfbGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGlhbG9nVGl0bGU9IkBzdHJpbmcvZGlhbG9nX3RpdGxlX2xpc3RfcHJlZmVyZW5jZSIgLz4KKworICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgorCisgICAgPFByZWZlcmVuY2VDYXRlZ29yeQorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9sYXVuY2hfcHJlZmVyZW5jZXMiPgorCisgICAgICAgIDwhLS0gVGhpcyBQcmVmZXJlbmNlU2NyZWVuIHRhZyBzZW5kcyB0aGUgdXNlciB0byBhIG5ldyBmcmFnbWVudCBvZgorICAgICAgICAgICAgIHByZWZlcmVuY2VzLiAgSWYgcnVubmluZyBpbiBhIGxhcmdlIHNjcmVlbiwgdGhleSBjYW4gYmUgZW1iZWRkZWQKKyAgICAgICAgICAgICBpbnNpZGUgb2YgdGhlIG92ZXJhbGwgcHJlZmVyZW5jZXMgVUkuIC0tPgorICAgICAgICA8UHJlZmVyZW5jZVNjcmVlbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZnJhZ21lbnQ9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlLlByZWZlcmVuY2VXaXRoSGVhZGVycyRQcmVmczFGcmFnbWVudElubmVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfZnJhZ21lbnRfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9mcmFnbWVudF9wcmVmZXJlbmNlIj4KKyAgICAgICAgICAgIDwhLS0gQXJiaXRyYXJ5IGtleS92YWx1ZSBwYWlycyBjYW4gYmUgaW5jbHVkZWQgZm9yIGZyYWdtZW50IGFyZ3VtZW50cyAtLT4KKyAgICAgICAgICAgIDxleHRyYSBhbmRyb2lkOm5hbWU9InNvbWVLZXkiIGFuZHJvaWQ6dmFsdWU9InNvbWVQcmVmVmFsdWUiIC8+CisgICAgICAgIDwvUHJlZmVyZW5jZVNjcmVlbj4KKworICAgICAgICA8IS0tIFRoaXMgUHJlZmVyZW5jZVNjcmVlbiB0YWcgc2VuZHMgdGhlIHVzZXIgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudAorICAgICAgICAgICAgIGFjdGl2aXR5LCBzd2l0Y2hpbmcgb3V0IG9mIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzIFVJLiAtLT4KKyAgICAgICAgPFByZWZlcmVuY2VTY3JlZW4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX2ludGVudF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2ludGVudF9wcmVmZXJlbmNlIj4KKworICAgICAgICAgICAgPGludGVudCBhbmRyb2lkOmFjdGlvbj0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGF0YT0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbSIgLz4KKworICAgICAgICA8L1ByZWZlcmVuY2VTY3JlZW4+CisKKyAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KKworICAgIDxQcmVmZXJlbmNlQ2F0ZWdvcnkKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcHJlZmVyZW5jZV9hdHRyaWJ1dGVzIj4KKworICAgICAgICA8Q2hlY2tCb3hQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9InBhcmVudF9jaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfcGFyZW50X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfcGFyZW50X3ByZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgdmlzdWFsIHN0eWxlIG9mIGEgY2hpbGQgaXMgZGVmaW5lZCBieSB0aGlzIHN0eWxlZCB0aGVtZSBhdHRyaWJ1dGUuIC0tPgorICAgICAgICA8Q2hlY2tCb3hQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9ImNoaWxkX2NoZWNrYm94X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkZXBlbmRlbmN5PSJwYXJlbnRfY2hlY2tib3hfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iP2FuZHJvaWQ6YXR0ci9wcmVmZXJlbmNlTGF5b3V0Q2hpbGQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9jaGlsZF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2NoaWxkX3ByZWZlcmVuY2UiIC8+CisKKyAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KKworPC9QcmVmZXJlbmNlU2NyZWVuPgorPCEtLSBFTkRfSU5DTFVERShwcmVmZXJlbmNlcykgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlc19pbm5lci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlc19pbm5lci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2MmM1NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzX2lubmVyLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgYSBwcmltaXRpdmUgZXhhbXBsZSBzaG93aW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJlZmVyZW5jZXMgYXZhaWxhYmxlLiAtLT4KKzwhLS0gQkVHSU5fSU5DTFVERShwcmVmZXJlbmNlcykgLS0+Cis8UHJlZmVyZW5jZVNjcmVlbgorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxDaGVja0JveFByZWZlcmVuY2UKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJuZXh0X3NjcmVlbl9jaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X25leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlIiAvPgorPC9QcmVmZXJlbmNlU2NyZWVuPgorPCEtLSBFTkRfSU5DTFVERShwcmVmZXJlbmNlcykgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZV9oZWFkZXJzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlX2hlYWRlcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkY2M1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZV9oZWFkZXJzLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgYSBwcmltaXRpdmUgZXhhbXBsZSBzaG93aW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJlZmVyZW5jZXMgYXZhaWxhYmxlLiAtLT4KKzwhLS0gQkVHSU5fSU5DTFVERShoZWFkZXJzKSAtLT4KKzxwcmVmZXJlbmNlLWhlYWRlcnMKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxoZWFkZXIgYW5kcm9pZDpmcmFnbWVudD0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2UuUHJlZmVyZW5jZVdpdGhIZWFkZXJzJFByZWZzMUZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dGluZ3NfYXBwbGljYXRpb25zIgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iUHJlZnMgMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQW4gZXhhbXBsZSBvZiBzb21lIHByZWZlcmVuY2VzLiIgLz4KKyAgICAgICAgICAgIAorICAgIDxoZWFkZXIgYW5kcm9pZDpmcmFnbWVudD0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2UuUHJlZmVyZW5jZVdpdGhIZWFkZXJzJFByZWZzMkZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dGluZ3NfZGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IlByZWZzIDIiCisgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IlNvbWUgb3RoZXIgcHJlZmVyZW5jZXMgeW91IGNhbiBzZWUuIj4KKyAgICAgICAgPCEtLSBBcmJpdHJhcnkga2V5L3ZhbHVlIHBhaXJzIGNhbiBiZSBpbmNsdWRlZCB3aXRoIGEgaGVhZGVyIGFzCisgICAgICAgICAgICAgYXJndW1lbnRzIHRvIGl0cyBmcmFnbWVudC4gLS0+CisgICAgICAgIDxleHRyYSBhbmRyb2lkOm5hbWU9InNvbWVLZXkiIGFuZHJvaWQ6dmFsdWU9InNvbWVIZWFkZXJWYWx1ZSIgLz4KKyAgICA8L2hlYWRlcj4KKworICAgIDxoZWFkZXIgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dGluZ3NfZGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkludGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iTGF1bmNoZXMgYW4gSW50ZW50LiI+CisgICAgICAgIDxpbnRlbnQgYW5kcm9pZDphY3Rpb249ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WSUVXIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGF0YT0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbSIgLz4KKyAgICA8L2hlYWRlcj4KKyAgICAKKzwvcHJlZmVyZW5jZS1oZWFkZXJzPgorPCEtLSBFTkRfSU5DTFVERShoZWFkZXJzKSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZXMueG1sCmluZGV4IDU5YjIzZjEuLjRkOTgyYWMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbApAQCAtMTUsNiArMTUsNyBAQAogLS0+CiAKIDwhLS0gVGhpcyBpcyBhIHByaW1pdGl2ZSBleGFtcGxlIHNob3dpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmZXJlbmNlcyBhdmFpbGFibGUuIC0tPgorPCEtLSBCRUdJTl9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KIDxQcmVmZXJlbmNlU2NyZWVuCiAgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAKQEAgLTk3LDMgKzk4LDQgQEAKICAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KICAgICAKIDwvUHJlZmVyZW5jZVNjcmVlbj4KKzwhLS0gRU5EX0lOQ0xVREUocHJlZmVyZW5jZXMpIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL1NoYWtlc3BlYXJlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvU2hha2VzcGVhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFkZjRiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL1NoYWtlc3BlYXJlLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzOworCitwdWJsaWMgZmluYWwgY2xhc3MgU2hha2VzcGVhcmUgeworICAgIC8qKgorICAgICAqIE91ciBkYXRhLCBwYXJ0IDEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUSVRMRVMgPSAKKyAgICB7CisgICAgICAgICAgICAiSGVucnkgSVYgKDEpIiwgICAKKyAgICAgICAgICAgICJIZW5yeSBWIiwKKyAgICAgICAgICAgICJIZW5yeSBWSUlJIiwgICAgICAgCisgICAgICAgICAgICAiUmljaGFyZCBJSSIsCisgICAgICAgICAgICAiUmljaGFyZCBJSUkiLAorICAgICAgICAgICAgIk1lcmNoYW50IG9mIFZlbmljZSIsICAKKyAgICAgICAgICAgICJPdGhlbGxvIiwKKyAgICAgICAgICAgICJLaW5nIExlYXIiCisgICAgfTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBPdXIgZGF0YSwgcGFydCAyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRElBTE9HVUUgPSAKKyAgICB7CisgICAgICAgICAgICAiU28gc2hha2VuIGFzIHdlIGFyZSwgc28gd2FuIHdpdGggY2FyZSwiICsKKyAgICAgICAgICAgICJGaW5kIHdlIGEgdGltZSBmb3IgZnJpZ2h0ZWQgcGVhY2UgdG8gcGFudCwiICsKKyAgICAgICAgICAgICJBbmQgYnJlYXRoZSBzaG9ydC13aW5kZWQgYWNjZW50cyBvZiBuZXcgYnJvaWxzIiArCisgICAgICAgICAgICAiVG8gYmUgY29tbWVuY2VkIGluIHN0cmFuZHMgYWZhciByZW1vdGUuIiArCisgICAgICAgICAgICAiTm8gbW9yZSB0aGUgdGhpcnN0eSBlbnRyYW5jZSBvZiB0aGlzIHNvaWwiICsKKyAgICAgICAgICAgICJTaGFsbCBkYXViIGhlciBsaXBzIHdpdGggaGVyIG93biBjaGlsZHJlbidzIGJsb29kOyIgKworICAgICAgICAgICAgIk5vciBtb3JlIHNoYWxsIHRyZW5jaGluZyB3YXIgY2hhbm5lbCBoZXIgZmllbGRzLCIgKworICAgICAgICAgICAgIk5vciBicnVpc2UgaGVyIGZsb3dlcmV0cyB3aXRoIHRoZSBhcm1lZCBob29mcyIgKworICAgICAgICAgICAgIk9mIGhvc3RpbGUgcGFjZXM6IHRob3NlIG9wcG9zZWQgZXllcywiICsKKyAgICAgICAgICAgICJXaGljaCwgbGlrZSB0aGUgbWV0ZW9ycyBvZiBhIHRyb3VibGVkIGhlYXZlbiwiICsKKyAgICAgICAgICAgICJBbGwgb2Ygb25lIG5hdHVyZSwgb2Ygb25lIHN1YnN0YW5jZSBicmVkLCIgKworICAgICAgICAgICAgIkRpZCBsYXRlbHkgbWVldCBpbiB0aGUgaW50ZXN0aW5lIHNob2NrIiArCisgICAgICAgICAgICAiQW5kIGZ1cmlvdXMgY2xvc2Ugb2YgY2l2aWwgYnV0Y2hlcnkiICsKKyAgICAgICAgICAgICJTaGFsbCBub3csIGluIG11dHVhbCB3ZWxsLWJlc2VlbWluZyByYW5rcywiICsKKyAgICAgICAgICAgICJNYXJjaCBhbGwgb25lIHdheSBhbmQgYmUgbm8gbW9yZSBvcHBvc2VkIiArCisgICAgICAgICAgICAiQWdhaW5zdCBhY3F1YWludGFuY2UsIGtpbmRyZWQgYW5kIGFsbGllczoiICsKKyAgICAgICAgICAgICJUaGUgZWRnZSBvZiB3YXIsIGxpa2UgYW4gaWxsLXNoZWF0aGVkIGtuaWZlLCIgKworICAgICAgICAgICAgIk5vIG1vcmUgc2hhbGwgY3V0IGhpcyBtYXN0ZXIuIFRoZXJlZm9yZSwgZnJpZW5kcywiICsKKyAgICAgICAgICAgICJBcyBmYXIgYXMgdG8gdGhlIHNlcHVsY2hyZSBvZiBDaHJpc3QsIiArCisgICAgICAgICAgICAiV2hvc2Ugc29sZGllciBub3csIHVuZGVyIHdob3NlIGJsZXNzZWQgY3Jvc3MiICsKKyAgICAgICAgICAgICJXZSBhcmUgaW1wcmVzc2VkIGFuZCBlbmdhZ2VkIHRvIGZpZ2h0LCIgKworICAgICAgICAgICAgIkZvcnRod2l0aCBhIHBvd2VyIG9mIEVuZ2xpc2ggc2hhbGwgd2UgbGV2eTsiICsKKyAgICAgICAgICAgICJXaG9zZSBhcm1zIHdlcmUgbW91bGRlZCBpbiB0aGVpciBtb3RoZXJzJyB3b21iIiArCisgICAgICAgICAgICAiVG8gY2hhc2UgdGhlc2UgcGFnYW5zIGluIHRob3NlIGhvbHkgZmllbGRzIiArCisgICAgICAgICAgICAiT3ZlciB3aG9zZSBhY3JlcyB3YWxrJ2QgdGhvc2UgYmxlc3NlZCBmZWV0IiArCisgICAgICAgICAgICAiV2hpY2ggZm91cnRlZW4gaHVuZHJlZCB5ZWFycyBhZ28gd2VyZSBuYWlsJ2QiICsKKyAgICAgICAgICAgICJGb3Igb3VyIGFkdmFudGFnZSBvbiB0aGUgYml0dGVyIGNyb3NzLiIgKworICAgICAgICAgICAgIkJ1dCB0aGlzIG91ciBwdXJwb3NlIG5vdyBpcyB0d2VsdmUgbW9udGggb2xkLCIgKworICAgICAgICAgICAgIkFuZCBib290bGVzcyAndGlzIHRvIHRlbGwgeW91IHdlIHdpbGwgZ286IiArCisgICAgICAgICAgICAiVGhlcmVmb3JlIHdlIG1lZXQgbm90IG5vdy4gVGhlbiBsZXQgbWUgaGVhciIgKworICAgICAgICAgICAgIk9mIHlvdSwgbXkgZ2VudGxlIGNvdXNpbiBXZXN0bW9yZWxhbmQsIiArCisgICAgICAgICAgICAiV2hhdCB5ZXN0ZXJuaWdodCBvdXIgY291bmNpbCBkaWQgZGVjcmVlIiArCisgICAgICAgICAgICAiSW4gZm9yd2FyZGluZyB0aGlzIGRlYXIgZXhwZWRpZW5jZS4iLAorICAgICAgICAgICAgCisgICAgICAgICAgICAiSGVhciBoaW0gYnV0IHJlYXNvbiBpbiBkaXZpbml0eSwiICsgCisgICAgICAgICAgICAiQW5kIGFsbC1hZG1pcmluZyB3aXRoIGFuIGlud2FyZCB3aXNoIiArIAorICAgICAgICAgICAgIllvdSB3b3VsZCBkZXNpcmUgdGhlIGtpbmcgd2VyZSBtYWRlIGEgcHJlbGF0ZToiICsgCisgICAgICAgICAgICAiSGVhciBoaW0gZGViYXRlIG9mIGNvbW1vbndlYWx0aCBhZmZhaXJzLCIgKyAKKyAgICAgICAgICAgICJZb3Ugd291bGQgc2F5IGl0IGhhdGggYmVlbiBhbGwgaW4gYWxsIGhpcyBzdHVkeToiICsgCisgICAgICAgICAgICAiTGlzdCBoaXMgZGlzY291cnNlIG9mIHdhciwgYW5kIHlvdSBzaGFsbCBoZWFyIiArIAorICAgICAgICAgICAgIkEgZmVhcmZ1bCBiYXR0bGUgcmVuZGVyJ2QgeW91IGluIG11c2ljOiIgKyAKKyAgICAgICAgICAgICJUdXJuIGhpbSB0byBhbnkgY2F1c2Ugb2YgcG9saWN5LCIgKyAKKyAgICAgICAgICAgICJUaGUgR29yZGlhbiBrbm90IG9mIGl0IGhlIHdpbGwgdW5sb29zZSwiICsgCisgICAgICAgICAgICAiRmFtaWxpYXIgYXMgaGlzIGdhcnRlcjogdGhhdCwgd2hlbiBoZSBzcGVha3MsIiArIAorICAgICAgICAgICAgIlRoZSBhaXIsIGEgY2hhcnRlcidkIGxpYmVydGluZSwgaXMgc3RpbGwsIiArIAorICAgICAgICAgICAgIkFuZCB0aGUgbXV0ZSB3b25kZXIgbHVya2V0aCBpbiBtZW4ncyBlYXJzLCIgKyAKKyAgICAgICAgICAgICJUbyBzdGVhbCBoaXMgc3dlZXQgYW5kIGhvbmV5J2Qgc2VudGVuY2VzOyIgKyAKKyAgICAgICAgICAgICJTbyB0aGF0IHRoZSBhcnQgYW5kIHByYWN0aWMgcGFydCBvZiBsaWZlIiArIAorICAgICAgICAgICAgIk11c3QgYmUgdGhlIG1pc3RyZXNzIHRvIHRoaXMgdGhlb3JpYzoiICsgCisgICAgICAgICAgICAiV2hpY2ggaXMgYSB3b25kZXIgaG93IGhpcyBncmFjZSBzaG91bGQgZ2xlYW4gaXQsIiArIAorICAgICAgICAgICAgIlNpbmNlIGhpcyBhZGRpY3Rpb24gd2FzIHRvIGNvdXJzZXMgdmFpbiwiICsgCisgICAgICAgICAgICAiSGlzIGNvbXBhbmllcyB1bmxldHRlcidkLCBydWRlIGFuZCBzaGFsbG93LCIgKyAKKyAgICAgICAgICAgICJIaXMgaG91cnMgZmlsbCdkIHVwIHdpdGggcmlvdHMsIGJhbnF1ZXRzLCBzcG9ydHMsIiArIAorICAgICAgICAgICAgIkFuZCBuZXZlciBub3RlZCBpbiBoaW0gYW55IHN0dWR5LCIgKyAKKyAgICAgICAgICAgICJBbnkgcmV0aXJlbWVudCwgYW55IHNlcXVlc3RyYXRpb24iICsgCisgICAgICAgICAgICAiRnJvbSBvcGVuIGhhdW50cyBhbmQgcG9wdWxhcml0eS4iLAorCisgICAgICAgICAgICAiSSBjb21lIG5vIG1vcmUgdG8gbWFrZSB5b3UgbGF1Z2g6IHRoaW5ncyBub3csIiArCisgICAgICAgICAgICAiVGhhdCBiZWFyIGEgd2VpZ2h0eSBhbmQgYSBzZXJpb3VzIGJyb3csIiArCisgICAgICAgICAgICAiU2FkLCBoaWdoLCBhbmQgd29ya2luZywgZnVsbCBvZiBzdGF0ZSBhbmQgd29lLCIgKworICAgICAgICAgICAgIlN1Y2ggbm9ibGUgc2NlbmVzIGFzIGRyYXcgdGhlIGV5ZSB0byBmbG93LCIgKworICAgICAgICAgICAgIldlIG5vdyBwcmVzZW50LiBUaG9zZSB0aGF0IGNhbiBwaXR5LCBoZXJlIiArCisgICAgICAgICAgICAiTWF5LCBpZiB0aGV5IHRoaW5rIGl0IHdlbGwsIGxldCBmYWxsIGEgdGVhcjsiICsKKyAgICAgICAgICAgICJUaGUgc3ViamVjdCB3aWxsIGRlc2VydmUgaXQuIFN1Y2ggYXMgZ2l2ZSIgKworICAgICAgICAgICAgIlRoZWlyIG1vbmV5IG91dCBvZiBob3BlIHRoZXkgbWF5IGJlbGlldmUsIiArCisgICAgICAgICAgICAiTWF5IGhlcmUgZmluZCB0cnV0aCB0b28uIFRob3NlIHRoYXQgY29tZSB0byBzZWUiICsKKyAgICAgICAgICAgICJPbmx5IGEgc2hvdyBvciB0d28sIGFuZCBzbyBhZ3JlZSIgKworICAgICAgICAgICAgIlRoZSBwbGF5IG1heSBwYXNzLCBpZiB0aGV5IGJlIHN0aWxsIGFuZCB3aWxsaW5nLCIgKworICAgICAgICAgICAgIkknbGwgdW5kZXJ0YWtlIG1heSBzZWUgYXdheSB0aGVpciBzaGlsbGluZyIgKworICAgICAgICAgICAgIlJpY2hseSBpbiB0d28gc2hvcnQgaG91cnMuIE9ubHkgdGhleSIgKworICAgICAgICAgICAgIlRoYXQgY29tZSB0byBoZWFyIGEgbWVycnkgYmF3ZHkgcGxheSwiICsKKyAgICAgICAgICAgICJBIG5vaXNlIG9mIHRhcmdldHMsIG9yIHRvIHNlZSBhIGZlbGxvdyIgKworICAgICAgICAgICAgIkluIGEgbG9uZyBtb3RsZXkgY29hdCBndWFyZGVkIHdpdGggeWVsbG93LCIgKworICAgICAgICAgICAgIldpbGwgYmUgZGVjZWl2ZWQ7IGZvciwgZ2VudGxlIGhlYXJlcnMsIGtub3csIiArCisgICAgICAgICAgICAiVG8gcmFuayBvdXIgY2hvc2VuIHRydXRoIHdpdGggc3VjaCBhIHNob3ciICsKKyAgICAgICAgICAgICJBcyBmb29sIGFuZCBmaWdodCBpcywgYmVzaWRlIGZvcmZlaXRpbmciICsKKyAgICAgICAgICAgICJPdXIgb3duIGJyYWlucywgYW5kIHRoZSBvcGluaW9uIHRoYXQgd2UgYnJpbmcsIiArCisgICAgICAgICAgICAiVG8gbWFrZSB0aGF0IG9ubHkgdHJ1ZSB3ZSBub3cgaW50ZW5kLCIgKworICAgICAgICAgICAgIldpbGwgbGVhdmUgdXMgbmV2ZXIgYW4gdW5kZXJzdGFuZGluZyBmcmllbmQuIiArCisgICAgICAgICAgICAiVGhlcmVmb3JlLCBmb3IgZ29vZG5lc3MnIHNha2UsIGFuZCBhcyB5b3UgYXJlIGtub3duIiArCisgICAgICAgICAgICAiVGhlIGZpcnN0IGFuZCBoYXBwaWVzdCBoZWFyZXJzIG9mIHRoZSB0b3duLCIgKworICAgICAgICAgICAgIkJlIHNhZCwgYXMgd2Ugd291bGQgbWFrZSB5ZTogdGhpbmsgeWUgc2VlIiArCisgICAgICAgICAgICAiVGhlIHZlcnkgcGVyc29ucyBvZiBvdXIgbm9ibGUgc3RvcnkiICsKKyAgICAgICAgICAgICJBcyB0aGV5IHdlcmUgbGl2aW5nOyB0aGluayB5b3Ugc2VlIHRoZW0gZ3JlYXQsIiArCisgICAgICAgICAgICAiQW5kIGZvbGxvdydkIHdpdGggdGhlIGdlbmVyYWwgdGhyb25nIGFuZCBzd2VhdCIgKworICAgICAgICAgICAgIk9mIHRob3VzYW5kIGZyaWVuZHM7IHRoZW4gaW4gYSBtb21lbnQsIHNlZSIgKworICAgICAgICAgICAgIkhvdyBzb29uIHRoaXMgbWlnaHRpbmVzcyBtZWV0cyBtaXNlcnk6IiArCisgICAgICAgICAgICAiQW5kLCBpZiB5b3UgY2FuIGJlIG1lcnJ5IHRoZW4sIEknbGwgc2F5IiArCisgICAgICAgICAgICAiQSBtYW4gbWF5IHdlZXAgdXBvbiBoaXMgd2VkZGluZy1kYXkuIiwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIkZpcnN0LCBoZWF2ZW4gYmUgdGhlIHJlY29yZCB0byBteSBzcGVlY2ghIiArIAorICAgICAgICAgICAgIkluIHRoZSBkZXZvdGlvbiBvZiBhIHN1YmplY3QncyBsb3ZlLCIgKyAKKyAgICAgICAgICAgICJUZW5kZXJpbmcgdGhlIHByZWNpb3VzIHNhZmV0eSBvZiBteSBwcmluY2UsIiArIAorICAgICAgICAgICAgIkFuZCBmcmVlIGZyb20gb3RoZXIgbWlzYmVnb3R0ZW4gaGF0ZSwiICsgCisgICAgICAgICAgICAiQ29tZSBJIGFwcGVsbGFudCB0byB0aGlzIHByaW5jZWx5IHByZXNlbmNlLiIgKyAKKyAgICAgICAgICAgICJOb3csIFRob21hcyBNb3dicmF5LCBkbyBJIHR1cm4gdG8gdGhlZSwiICsgCisgICAgICAgICAgICAiQW5kIG1hcmsgbXkgZ3JlZXRpbmcgd2VsbDsgZm9yIHdoYXQgSSBzcGVhayIgKyAKKyAgICAgICAgICAgICJNeSBib2R5IHNoYWxsIG1ha2UgZ29vZCB1cG9uIHRoaXMgZWFydGgsIiArIAorICAgICAgICAgICAgIk9yIG15IGRpdmluZSBzb3VsIGFuc3dlciBpdCBpbiBoZWF2ZW4uIiArIAorICAgICAgICAgICAgIlRob3UgYXJ0IGEgdHJhaXRvciBhbmQgYSBtaXNjcmVhbnQsIiArIAorICAgICAgICAgICAgIlRvbyBnb29kIHRvIGJlIHNvIGFuZCB0b28gYmFkIHRvIGxpdmUsIiArIAorICAgICAgICAgICAgIlNpbmNlIHRoZSBtb3JlIGZhaXIgYW5kIGNyeXN0YWwgaXMgdGhlIHNreSwiICsgCisgICAgICAgICAgICAiVGhlIHVnbGllciBzZWVtIHRoZSBjbG91ZHMgdGhhdCBpbiBpdCBmbHkuIiArIAorICAgICAgICAgICAgIk9uY2UgbW9yZSwgdGhlIG1vcmUgdG8gYWdncmF2YXRlIHRoZSBub3RlLCIgKyAKKyAgICAgICAgICAgICJXaXRoIGEgZm91bCB0cmFpdG9yJ3MgbmFtZSBzdHVmZiBJIHRoeSB0aHJvYXQ7IiArIAorICAgICAgICAgICAgIkFuZCB3aXNoLCBzbyBwbGVhc2UgbXkgc292ZXJlaWduLCBlcmUgSSBtb3ZlLCIgKyAKKyAgICAgICAgICAgICJXaGF0IG15IHRvbmd1ZSBzcGVha3MgbXkgcmlnaHQgZHJhd24gc3dvcmQgbWF5IHByb3ZlLiIsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICJOb3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCIgKyAKKyAgICAgICAgICAgICJNYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiBZb3JrOyIgKyAKKyAgICAgICAgICAgICJBbmQgYWxsIHRoZSBjbG91ZHMgdGhhdCBsb3VyJ2QgdXBvbiBvdXIgaG91c2UiICsgCisgICAgICAgICAgICAiSW4gdGhlIGRlZXAgYm9zb20gb2YgdGhlIG9jZWFuIGJ1cmllZC4iICsgCisgICAgICAgICAgICAiTm93IGFyZSBvdXIgYnJvd3MgYm91bmQgd2l0aCB2aWN0b3Jpb3VzIHdyZWF0aHM7IiArIAorICAgICAgICAgICAgIk91ciBicnVpc2VkIGFybXMgaHVuZyB1cCBmb3IgbW9udW1lbnRzOyIgKyAKKyAgICAgICAgICAgICJPdXIgc3Rlcm4gYWxhcnVtcyBjaGFuZ2VkIHRvIG1lcnJ5IG1lZXRpbmdzLCIgKyAKKyAgICAgICAgICAgICJPdXIgZHJlYWRmdWwgbWFyY2hlcyB0byBkZWxpZ2h0ZnVsIG1lYXN1cmVzLiIgKyAKKyAgICAgICAgICAgICJHcmltLXZpc2FnZWQgd2FyIGhhdGggc21vb3RoJ2QgaGlzIHdyaW5rbGVkIGZyb250OyIgKyAKKyAgICAgICAgICAgICJBbmQgbm93LCBpbnN0ZWFkIG9mIG1vdW50aW5nIGJhcmRlZCBzdGVlZHMiICsgCisgICAgICAgICAgICAiVG8gZnJpZ2h0IHRoZSBzb3VscyBvZiBmZWFyZnVsIGFkdmVyc2FyaWVzLCIgKyAKKyAgICAgICAgICAgICJIZSBjYXBlcnMgbmltYmx5IGluIGEgbGFkeSdzIGNoYW1iZXIiICsgCisgICAgICAgICAgICAiVG8gdGhlIGxhc2NpdmlvdXMgcGxlYXNpbmcgb2YgYSBsdXRlLiIgKyAKKyAgICAgICAgICAgICJCdXQgSSwgdGhhdCBhbSBub3Qgc2hhcGVkIGZvciBzcG9ydGl2ZSB0cmlja3MsIiArIAorICAgICAgICAgICAgIk5vciBtYWRlIHRvIGNvdXJ0IGFuIGFtb3JvdXMgbG9va2luZy1nbGFzczsiICsgCisgICAgICAgICAgICAiSSwgdGhhdCBhbSBydWRlbHkgc3RhbXAnZCwgYW5kIHdhbnQgbG92ZSdzIG1hamVzdHkiICsgCisgICAgICAgICAgICAiVG8gc3RydXQgYmVmb3JlIGEgd2FudG9uIGFtYmxpbmcgbnltcGg7IiArIAorICAgICAgICAgICAgIkksIHRoYXQgYW0gY3VydGFpbCdkIG9mIHRoaXMgZmFpciBwcm9wb3J0aW9uLCIgKyAKKyAgICAgICAgICAgICJDaGVhdGVkIG9mIGZlYXR1cmUgYnkgZGlzc2VtYmxpbmcgbmF0dXJlLCIgKyAKKyAgICAgICAgICAgICJEZWZvcm1lZCwgdW5maW5pc2gnZCwgc2VudCBiZWZvcmUgbXkgdGltZSIgKyAKKyAgICAgICAgICAgICJJbnRvIHRoaXMgYnJlYXRoaW5nIHdvcmxkLCBzY2FyY2UgaGFsZiBtYWRlIHVwLCIgKyAKKyAgICAgICAgICAgICJBbmQgdGhhdCBzbyBsYW1lbHkgYW5kIHVuZmFzaGlvbmFibGUiICsgCisgICAgICAgICAgICAiVGhhdCBkb2dzIGJhcmsgYXQgbWUgYXMgSSBoYWx0IGJ5IHRoZW07IiArIAorICAgICAgICAgICAgIldoeSwgSSwgaW4gdGhpcyB3ZWFrIHBpcGluZyB0aW1lIG9mIHBlYWNlLCIgKyAKKyAgICAgICAgICAgICJIYXZlIG5vIGRlbGlnaHQgdG8gcGFzcyBhd2F5IHRoZSB0aW1lLCIgKyAKKyAgICAgICAgICAgICJVbmxlc3MgdG8gc3B5IG15IHNoYWRvdyBpbiB0aGUgc3VuIiArIAorICAgICAgICAgICAgIkFuZCBkZXNjYW50IG9uIG1pbmUgb3duIGRlZm9ybWl0eToiICsgCisgICAgICAgICAgICAiQW5kIHRoZXJlZm9yZSwgc2luY2UgSSBjYW5ub3QgcHJvdmUgYSBsb3ZlciwiICsgCisgICAgICAgICAgICAiVG8gZW50ZXJ0YWluIHRoZXNlIGZhaXIgd2VsbC1zcG9rZW4gZGF5cywiICsgCisgICAgICAgICAgICAiSSBhbSBkZXRlcm1pbmVkIHRvIHByb3ZlIGEgdmlsbGFpbiIgKyAKKyAgICAgICAgICAgICJBbmQgaGF0ZSB0aGUgaWRsZSBwbGVhc3VyZXMgb2YgdGhlc2UgZGF5cy4iICsgCisgICAgICAgICAgICAiUGxvdHMgaGF2ZSBJIGxhaWQsIGluZHVjdGlvbnMgZGFuZ2Vyb3VzLCIgKyAKKyAgICAgICAgICAgICJCeSBkcnVua2VuIHByb3BoZWNpZXMsIGxpYmVscyBhbmQgZHJlYW1zLCIgKyAKKyAgICAgICAgICAgICJUbyBzZXQgbXkgYnJvdGhlciBDbGFyZW5jZSBhbmQgdGhlIGtpbmciICsgCisgICAgICAgICAgICAiSW4gZGVhZGx5IGhhdGUgdGhlIG9uZSBhZ2FpbnN0IHRoZSBvdGhlcjoiICsgCisgICAgICAgICAgICAiQW5kIGlmIEtpbmcgRWR3YXJkIGJlIGFzIHRydWUgYW5kIGp1c3QiICsgCisgICAgICAgICAgICAiQXMgSSBhbSBzdWJ0bGUsIGZhbHNlIGFuZCB0cmVhY2hlcm91cywiICsgCisgICAgICAgICAgICAiVGhpcyBkYXkgc2hvdWxkIENsYXJlbmNlIGNsb3NlbHkgYmUgbWV3J2QgdXAsIiArIAorICAgICAgICAgICAgIkFib3V0IGEgcHJvcGhlY3ksIHdoaWNoIHNheXMgdGhhdCAnRyciICsgCisgICAgICAgICAgICAiT2YgRWR3YXJkJ3MgaGVpcnMgdGhlIG11cmRlcmVyIHNoYWxsIGJlLiIgKyAKKyAgICAgICAgICAgICJEaXZlLCB0aG91Z2h0cywgZG93biB0byBteSBzb3VsOiBoZXJlIiArIAorICAgICAgICAgICAgIkNsYXJlbmNlIGNvbWVzLiIsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICJUbyBiYWl0IGZpc2ggd2l0aGFsOiBpZiBpdCB3aWxsIGZlZWQgbm90aGluZyBlbHNlLCIgKyAKKyAgICAgICAgICAgICJpdCB3aWxsIGZlZWQgbXkgcmV2ZW5nZS4gSGUgaGF0aCBkaXNncmFjZWQgbWUsIGFuZCIgKyAKKyAgICAgICAgICAgICJoaW5kZXJlZCBtZSBoYWxmIGEgbWlsbGlvbjsgbGF1Z2hlZCBhdCBteSBsb3NzZXMsIiArIAorICAgICAgICAgICAgIm1vY2tlZCBhdCBteSBnYWlucywgc2Nvcm5lZCBteSBuYXRpb24sIHRod2FydGVkIG15IiArIAorICAgICAgICAgICAgImJhcmdhaW5zLCBjb29sZWQgbXkgZnJpZW5kcywgaGVhdGVkIG1pbmUiICsgCisgICAgICAgICAgICAiZW5lbWllczsgYW5kIHdoYXQncyBoaXMgcmVhc29uPyBJIGFtIGEgSmV3LiBIYXRoIiArIAorICAgICAgICAgICAgIm5vdCBhIEpldyBleWVzPyBoYXRoIG5vdCBhIEpldyBoYW5kcywgb3JnYW5zLCIgKyAKKyAgICAgICAgICAgICJkaW1lbnNpb25zLCBzZW5zZXMsIGFmZmVjdGlvbnMsIHBhc3Npb25zPyBmZWQgd2l0aCIgKyAKKyAgICAgICAgICAgICJ0aGUgc2FtZSBmb29kLCBodXJ0IHdpdGggdGhlIHNhbWUgd2VhcG9ucywgc3ViamVjdCIgKyAKKyAgICAgICAgICAgICJ0byB0aGUgc2FtZSBkaXNlYXNlcywgaGVhbGVkIGJ5IHRoZSBzYW1lIG1lYW5zLCIgKyAKKyAgICAgICAgICAgICJ3YXJtZWQgYW5kIGNvb2xlZCBieSB0aGUgc2FtZSB3aW50ZXIgYW5kIHN1bW1lciwgYXMiICsgCisgICAgICAgICAgICAiYSBDaHJpc3RpYW4gaXM/IElmIHlvdSBwcmljayB1cywgZG8gd2Ugbm90IGJsZWVkPyIgKyAKKyAgICAgICAgICAgICJpZiB5b3UgdGlja2xlIHVzLCBkbyB3ZSBub3QgbGF1Z2g/IGlmIHlvdSBwb2lzb24iICsgCisgICAgICAgICAgICAidXMsIGRvIHdlIG5vdCBkaWU/IGFuZCBpZiB5b3Ugd3JvbmcgdXMsIHNoYWxsIHdlIG5vdCIgKyAKKyAgICAgICAgICAgICJyZXZlbmdlPyBJZiB3ZSBhcmUgbGlrZSB5b3UgaW4gdGhlIHJlc3QsIHdlIHdpbGwiICsgCisgICAgICAgICAgICAicmVzZW1ibGUgeW91IGluIHRoYXQuIElmIGEgSmV3IHdyb25nIGEgQ2hyaXN0aWFuLCIgKyAKKyAgICAgICAgICAgICJ3aGF0IGlzIGhpcyBodW1pbGl0eT8gUmV2ZW5nZS4gSWYgYSBDaHJpc3RpYW4iICsgCisgICAgICAgICAgICAid3JvbmcgYSBKZXcsIHdoYXQgc2hvdWxkIGhpcyBzdWZmZXJhbmNlIGJlIGJ5IiArIAorICAgICAgICAgICAgIkNocmlzdGlhbiBleGFtcGxlPyBXaHksIHJldmVuZ2UuIFRoZSB2aWxsYW55IHlvdSIgKyAKKyAgICAgICAgICAgICJ0ZWFjaCBtZSwgSSB3aWxsIGV4ZWN1dGUsIGFuZCBpdCBzaGFsbCBnbyBoYXJkIGJ1dCBJIiArIAorICAgICAgICAgICAgIndpbGwgYmV0dGVyIHRoZSBpbnN0cnVjdGlvbi4iLAorICAgICAgICAgICAgCisgICAgICAgICAgICAiVmlydHVlISBhIGZpZyEgJ3RpcyBpbiBvdXJzZWx2ZXMgdGhhdCB3ZSBhcmUgdGh1cyIgKyAKKyAgICAgICAgICAgICJvciB0aHVzLiBPdXIgYm9kaWVzIGFyZSBvdXIgZ2FyZGVucywgdG8gdGhlIHdoaWNoIiArIAorICAgICAgICAgICAgIm91ciB3aWxscyBhcmUgZ2FyZGVuZXJzOiBzbyB0aGF0IGlmIHdlIHdpbGwgcGxhbnQiICsgCisgICAgICAgICAgICAibmV0dGxlcywgb3Igc293IGxldHR1Y2UsIHNldCBoeXNzb3AgYW5kIHdlZWQgdXAiICsgCisgICAgICAgICAgICAidGh5bWUsIHN1cHBseSBpdCB3aXRoIG9uZSBnZW5kZXIgb2YgaGVyYnMsIG9yIiArIAorICAgICAgICAgICAgImRpc3RyYWN0IGl0IHdpdGggbWFueSwgZWl0aGVyIHRvIGhhdmUgaXQgc3RlcmlsZSIgKyAKKyAgICAgICAgICAgICJ3aXRoIGlkbGVuZXNzLCBvciBtYW51cmVkIHdpdGggaW5kdXN0cnksIHdoeSwgdGhlIiArIAorICAgICAgICAgICAgInBvd2VyIGFuZCBjb3JyaWdpYmxlIGF1dGhvcml0eSBvZiB0aGlzIGxpZXMgaW4gb3VyIiArIAorICAgICAgICAgICAgIndpbGxzLiBJZiB0aGUgYmFsYW5jZSBvZiBvdXIgbGl2ZXMgaGFkIG5vdCBvbmUiICsgCisgICAgICAgICAgICAic2NhbGUgb2YgcmVhc29uIHRvIHBvaXNlIGFub3RoZXIgb2Ygc2Vuc3VhbGl0eSwgdGhlIiArIAorICAgICAgICAgICAgImJsb29kIGFuZCBiYXNlbmVzcyBvZiBvdXIgbmF0dXJlcyB3b3VsZCBjb25kdWN0IHVzIiArIAorICAgICAgICAgICAgInRvIG1vc3QgcHJlcG9zdGVyb3VzIGNvbmNsdXNpb25zOiBidXQgd2UgaGF2ZSIgKyAKKyAgICAgICAgICAgICJyZWFzb24gdG8gY29vbCBvdXIgcmFnaW5nIG1vdGlvbnMsIG91ciBjYXJuYWwiICsgCisgICAgICAgICAgICAic3RpbmdzLCBvdXIgdW5iaXR0ZWQgbHVzdHMsIHdoZXJlb2YgSSB0YWtlIHRoaXMgdGhhdCIgKyAKKyAgICAgICAgICAgICJ5b3UgY2FsbCBsb3ZlIHRvIGJlIGEgc2VjdCBvciBzY2lvbi4iLAorCisgICAgICAgICAgICAiQmxvdywgd2luZHMsIGFuZCBjcmFjayB5b3VyIGNoZWVrcyEgcmFnZSEgYmxvdyEiICsgCisgICAgICAgICAgICAiWW91IGNhdGFyYWN0cyBhbmQgaHVycmljYW5vZXMsIHNwb3V0IiArIAorICAgICAgICAgICAgIlRpbGwgeW91IGhhdmUgZHJlbmNoJ2Qgb3VyIHN0ZWVwbGVzLCBkcm93bidkIHRoZSBjb2NrcyEiICsgCisgICAgICAgICAgICAiWW91IHN1bHBodXJvdXMgYW5kIHRob3VnaHQtZXhlY3V0aW5nIGZpcmVzLCIgKyAKKyAgICAgICAgICAgICJWYXVudC1jb3VyaWVycyB0byBvYWstY2xlYXZpbmcgdGh1bmRlcmJvbHRzLCIgKyAKKyAgICAgICAgICAgICJTaW5nZSBteSB3aGl0ZSBoZWFkISBBbmQgdGhvdSwgYWxsLXNoYWtpbmcgdGh1bmRlciwiICsgCisgICAgICAgICAgICAiU21pdGUgZmxhdCB0aGUgdGhpY2sgcm90dW5kaXR5IG8nIHRoZSB3b3JsZCEiICsgCisgICAgICAgICAgICAiQ3JhY2sgbmF0dXJlJ3MgbW91bGRzLCBhbiBnZXJtZW5zIHNwaWxsIGF0IG9uY2UsIiArIAorICAgICAgICAgICAgIlRoYXQgbWFrZSBpbmdyYXRlZnVsIG1hbiEiCisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uQ2xvbmluZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25DbG9uaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4OTZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uQ2xvbmluZy5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uKjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5EZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKworcHVibGljIGNsYXNzIEFuaW1hdGlvbkNsb25pbmcgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYW5pbWF0aW9uX2Nsb25pbmcpOworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyKTsKKyAgICAgICAgZmluYWwgTXlBbmltYXRpb25WaWV3IGFuaW1WaWV3ID0gbmV3IE15QW5pbWF0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoYW5pbVZpZXcpOworCisgICAgICAgIEJ1dHRvbiBzdGFydGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRCdXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3JTZXQgYW5pbWF0aW9uID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRGVuc2l0eTsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgICAgIG1EZW5zaXR5ID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKKworICAgICAgICAgICAgU2hhcGVIb2xkZXIgYmFsbDAgPSBhZGRCYWxsKDUwZiwgMjVmKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwxID0gYWRkQmFsbCgxNTBmLCAyNWYpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgYmFsbDIgPSBhZGRCYWxsKDI1MGYsIDI1Zik7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBiYWxsMyA9IGFkZEJhbGwoMzUwZiwgMjVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmltYXRpb24oKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RBbmltYXRvciBhbmltMSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQoYmFsbHMuZ2V0KDApLCAieSIsCisgICAgICAgICAgICAgICAgICAgICAgICAwZiwgZ2V0SGVpZ2h0KCkgLSBiYWxscy5nZXQoMCkuZ2V0SGVpZ2h0KCkpLnNldER1cmF0aW9uKDUwMCk7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbTIgPSBhbmltMS5jbG9uZSgpOworICAgICAgICAgICAgICAgIGFuaW0yLnNldFRhcmdldChiYWxscy5nZXQoMSkpOworICAgICAgICAgICAgICAgIGFuaW0xLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAgICAgU2hhcGVIb2xkZXIgYmFsbDIgPSBiYWxscy5nZXQoMik7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbURvd24gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwyLCAieSIsCisgICAgICAgICAgICAgICAgICAgICAgICAwZiwgZ2V0SGVpZ2h0KCkgLSBiYWxsMi5nZXRIZWlnaHQoKSkuc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgICAgICBhbmltRG93bi5zZXRJbnRlcnBvbGF0b3IobmV3IEFjY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbVVwID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsMiwgInkiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgLSBiYWxsMi5nZXRIZWlnaHQoKSwgMGYpLnNldER1cmF0aW9uKDUwMCk7CisgICAgICAgICAgICAgICAgYW5pbVVwLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgICAgICBBbmltYXRvclNldCBzMSA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgICAgIHMxLnBsYXlTZXF1ZW50aWFsbHkoYW5pbURvd24sIGFuaW1VcCk7CisgICAgICAgICAgICAgICAgYW5pbURvd24uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgYW5pbVVwLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIEFuaW1hdG9yU2V0IHMyID0gKEFuaW1hdG9yU2V0KSBzMS5jbG9uZSgpOworICAgICAgICAgICAgICAgIHMyLnNldFRhcmdldChiYWxscy5nZXQoMykpOworCisgICAgICAgICAgICAgICAgYW5pbWF0aW9uID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnBsYXlUb2dldGhlcihhbmltMSwgYW5pbTIsIHMxKTsKKyAgICAgICAgICAgICAgICBhbmltYXRpb24ucGxheVNlcXVlbnRpYWxseShzMSwgczIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBhZGRCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIE92YWxTaGFwZSBjaXJjbGUgPSBuZXcgT3ZhbFNoYXBlKCk7CisgICAgICAgICAgICBjaXJjbGUucmVzaXplKDUwZiAqIG1EZW5zaXR5LCA1MGYgKiBtRGVuc2l0eSk7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCAtIDI1Zik7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkgLSAyNWYpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoMTAwICsgTWF0aC5yYW5kb20oKSAqIDE1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOyAvL25ldyBQYWludChQYWludC5BTlRJX0FMSUFTX0ZMQUcpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFsbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IGJhbGxzLmdldChpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoc2hhcGVIb2xkZXIuZ2V0WCgpLCBzaGFwZUhvbGRlci5nZXRZKCkpOworICAgICAgICAgICAgICAgIHNoYXBlSG9sZGVyLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25Mb2FkaW5nLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdGlvbkxvYWRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjUzMDhiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25Mb2FkaW5nLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0OworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBsb2FkaW5nIEFuaW1hdG9yIG9iamVjdHMgZnJvbSBYTUwgcmVzb3VyY2VzLgorICovCitwdWJsaWMgY2xhc3MgQW5pbWF0aW9uTG9hZGluZyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEVVJBVElPTiA9IDE1MDA7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hbmltYXRpb25fbG9hZGluZyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEJBTExfU0laRSA9IDEwMGY7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBBbmltYXRvciBhbmltYXRpb24gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGFkZEJhbGwoMTAwLCAwKTsKKyAgICAgICAgICAgIGFkZEJhbGwoMjUwLCAwKTsKKyAgICAgICAgICAgIGFkZEJhbGwoNDAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmltYXRpb24oKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RBbmltYXRvciBhbmltID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RBbmltYXRvcikgQW5pbWF0b3JJbmZsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEFuaW1hdG9yKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBSLmFuaW0ub2JqZWN0X2FuaW1hdG9yKTsKKyAgICAgICAgICAgICAgICBhbmltLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGJhbGxzLmdldCgwKSk7CisKKyAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGZhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChWYWx1ZUFuaW1hdG9yKSBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5hbmltYXRvcik7CisgICAgICAgICAgICAgICAgZmFkZXIuYWRkVXBkYXRlTGlzdGVuZXIobmV3IFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGxzLmdldCgxKS5zZXRBbHBoYSgoRmxvYXQpIGFuaW1hdGlvbi5nZXRBbmltYXRlZFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBBbmltYXRvclNldCBzZXEgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEFuaW1hdG9yU2V0KSBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5hbmltYXRvcl9zZXQpOworICAgICAgICAgICAgICAgIHNlcS5zZXRUYXJnZXQoYmFsbHMuZ2V0KDIpKTsKKworICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgICAgICgoQW5pbWF0b3JTZXQpIGFuaW1hdGlvbikucGxheVRvZ2V0aGVyKGFuaW0sIGZhZGVyLCBzZXEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24oKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBhZGRCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIE92YWxTaGFwZSBjaXJjbGUgPSBuZXcgT3ZhbFNoYXBlKCk7CisgICAgICAgICAgICBjaXJjbGUucmVzaXplKEJBTExfU0laRSwgQkFMTF9TSVpFKTsKKyAgICAgICAgICAgIFNoYXBlRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgU2hhcGVEcmF3YWJsZShjaXJjbGUpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBuZXcgU2hhcGVIb2xkZXIoZHJhd2FibGUpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WCh4KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFkoeSk7CisgICAgICAgICAgICBpbnQgcmVkID0gKGludCkoMTAwICsgTWF0aC5yYW5kb20oKSAqIDE1NSk7CisgICAgICAgICAgICBpbnQgZ3JlZW4gPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBibHVlID0gKGludCkoMTAwICsgTWF0aC5yYW5kb20oKSAqIDE1NSk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSAweGZmMDAwMDAwIHwgcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICBQYWludCBwYWludCA9IGRyYXdhYmxlLmdldFBhaW50KCk7CisgICAgICAgICAgICBpbnQgZGFya0NvbG9yID0gMHhmZjAwMDAwMCB8IHJlZC80IDw8IDE2IHwgZ3JlZW4vNCA8PCA4IHwgYmx1ZS80OworICAgICAgICAgICAgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQgPSBuZXcgUmFkaWFsR3JhZGllbnQoMzcuNWYsIDEyLjVmLAorICAgICAgICAgICAgICAgICAgICA1MGYsIGNvbG9yLCBkYXJrQ29sb3IsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBwYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0UGFpbnQocGFpbnQpOworICAgICAgICAgICAgYmFsbHMuYWRkKHNoYXBlSG9sZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBzaGFwZUhvbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgZm9yIChTaGFwZUhvbGRlciBiYWxsIDogYmFsbHMpIHsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJhbGwuZ2V0WCgpLCBiYWxsLmdldFkoKSk7CisgICAgICAgICAgICAgICAgYmFsbC5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1iYWxsLmdldFgoKSwgLWJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwgPSBiYWxscy5nZXQoMCk7CisgICAgICAgICAgICBiYWxsLnNldFkoKEZsb2F0KWFuaW1hdGlvbi5nZXRBbmltYXRlZFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uU2Vla2luZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25TZWVraW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2OTEyYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uU2Vla2luZy5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkJvdW5jZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CisKKy8qKgorICogVGhpcyBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgdGhlIHNlZWtpbmcgY2FwYWJpbGl0eSBvZiBWYWx1ZUFuaW1hdG9yLiBUaGUgU2Vla0JhciBpbiB0aGUKKyAqIFVJIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBQcmVzc2luZyB0aGUgUnVuIGJ1dHRvbiB3aWxsIHBsYXkgZnJvbQorICogdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEFuaW1hdGlvblNlZWtpbmcgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVSQVRJT04gPSAxNTAwOworICAgIHByaXZhdGUgU2Vla0JhciBtU2Vla0JhcjsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9zZWVraW5nKTsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIE15QW5pbWF0aW9uVmlldyBhbmltVmlldyA9IG5ldyBNeUFuaW1hdGlvblZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGFuaW1WaWV3KTsKKworICAgICAgICBCdXR0b24gc3RhcnRlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0QnV0dG9uKTsKKyAgICAgICAgc3RhcnRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtU2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5zZWVrQmFyKTsKKyAgICAgICAgbVNlZWtCYXIuc2V0TWF4KERVUkFUSU9OKTsKKyAgICAgICAgbVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHNlZWtpbmcgb24gYXBwIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKGFuaW1WaWV3LmdldEhlaWdodCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbVZpZXcuc2Vlayhwcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciwgQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFRCA9IDB4ZmZGRjgwODA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFID0gMHhmZjgwODBGRjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZQU4gPSAweGZmODBmZmZmOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU4gPSAweGZmODBmZjgwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBCQUxMX1NJWkUgPSAxMDBmOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3JTZXQgYW5pbWF0aW9uID0gbnVsbDsKKyAgICAgICAgVmFsdWVBbmltYXRvciBib3VuY2VBbmltID0gbnVsbDsKKyAgICAgICAgU2hhcGVIb2xkZXIgYmFsbCA9IG51bGw7CisKKyAgICAgICAgcHVibGljIE15QW5pbWF0aW9uVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgYmFsbCA9IGFkZEJhbGwoMjAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmltYXRpb24oKSB7CisgICAgICAgICAgICBpZiAoYm91bmNlQW5pbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm91bmNlQW5pbSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQoYmFsbCwgInkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFsbC5nZXRZKCksIGdldEhlaWdodCgpIC0gQkFMTF9TSVpFKS5zZXREdXJhdGlvbigxNTAwKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLnNldEludGVycG9sYXRvcihuZXcgQm91bmNlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2Vlayhsb25nIHNlZWtUaW1lKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGJvdW5jZUFuaW0uc2V0Q3VycmVudFBsYXlUaW1lKHNlZWtUaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgYWRkQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZShCQUxMX1NJWkUsIEJBTExfU0laRSk7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoMTAwICsgTWF0aC5yYW5kb20oKSAqIDE1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgIGJhbGwuZ2V0U2hhcGUoKS5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbG9uZyBwbGF5dGltZSA9IGJvdW5jZUFuaW0uZ2V0Q3VycmVudFBsYXlUaW1lKCk7CisgICAgICAgICAgICAvL21TZWVrQmFyLnNldFByb2dyZXNzKChpbnQpcGxheXRpbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGJhbGxzLnJlbW92ZSgoKE9iamVjdEFuaW1hdG9yKWFuaW1hdGlvbikuZ2V0VGFyZ2V0KCkpOworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRvckV2ZW50cy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRvckV2ZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWNlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdG9yRXZlbnRzLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuT3ZhbFNoYXBlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCisvKioKKyAqIFRoaXMgZGVtbyBzaG93cyBob3cgdGhlIEFuaW1hdG9yTGlzdGVuZXIgZXZlbnRzIHdvcmsuCisgKi8KK3B1YmxpYyBjbGFzcyBBbmltYXRvckV2ZW50cyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIFRleHRWaWV3IHN0YXJ0VGV4dCwgcmVwZWF0VGV4dCwgY2FuY2VsVGV4dCwgZW5kVGV4dDsKKyAgICBUZXh0VmlldyBzdGFydFRleHRBbmltYXRvciwgcmVwZWF0VGV4dEFuaW1hdG9yLCBjYW5jZWxUZXh0QW5pbWF0b3IsIGVuZFRleHRBbmltYXRvcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYW5pbWF0b3JfZXZlbnRzKTsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIE15QW5pbWF0aW9uVmlldyBhbmltVmlldyA9IG5ldyBNeUFuaW1hdGlvblZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGFuaW1WaWV3KTsKKyAgICAgICAgc3RhcnRUZXh0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydFRleHQpOworICAgICAgICBzdGFydFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgcmVwZWF0VGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucmVwZWF0VGV4dCk7CisgICAgICAgIHJlcGVhdFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgY2FuY2VsVGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuY2FuY2VsVGV4dCk7CisgICAgICAgIGNhbmNlbFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgZW5kVGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW5kVGV4dCk7CisgICAgICAgIGVuZFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgc3RhcnRUZXh0QW5pbWF0b3IgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0VGV4dEFuaW1hdG9yKTsKKyAgICAgICAgc3RhcnRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgcmVwZWF0VGV4dEFuaW1hdG9yID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5yZXBlYXRUZXh0QW5pbWF0b3IpOworICAgICAgICByZXBlYXRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgY2FuY2VsVGV4dEFuaW1hdG9yID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYW5jZWxUZXh0QW5pbWF0b3IpOworICAgICAgICBjYW5jZWxUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgZW5kVGV4dEFuaW1hdG9yID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbmRUZXh0QW5pbWF0b3IpOworICAgICAgICBlbmRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgZmluYWwgQ2hlY2tCb3ggZW5kQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmVuZENCKTsKKworCisgICAgICAgIEJ1dHRvbiBzdGFydGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRCdXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oZW5kQ0IuaXNDaGVja2VkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBCdXR0b24gY2FuY2VsZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5jYW5jZWxCdXR0b24pOworICAgICAgICBjYW5jZWxlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LmNhbmNlbEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBCdXR0b24gZW5kZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbmRCdXR0b24pOworICAgICAgICBlbmRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LmVuZEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeUFuaW1hdGlvblZpZXcgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciwKKyAgICBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3IgYW5pbWF0aW9uOworICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBlbmRJbW1lZGlhdGVseSA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGJhbGwgPSBjcmVhdGVCYWxsKDI1LCAyNSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgeUFuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIDUwZikuc2V0RHVyYXRpb24oMTUwMCk7CisgICAgICAgICAgICAgICAgeUFuaW0uc2V0UmVwZWF0Q291bnQoMCk7CisgICAgICAgICAgICAgICAgeUFuaW0uc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworICAgICAgICAgICAgICAgIHlBbmltLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigyZikpOworICAgICAgICAgICAgICAgIHlBbmltLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIHlBbmltLmFkZExpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgeEFuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwsICJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WCgpLCBiYWxsLmdldFgoKSArIDMwMCkuc2V0RHVyYXRpb24oMTAwMCk7CisgICAgICAgICAgICAgICAgeEFuaW0uc2V0U3RhcnREZWxheSgwKTsKKyAgICAgICAgICAgICAgICB4QW5pbS5zZXRSZXBlYXRDb3VudCgwKTsKKyAgICAgICAgICAgICAgICB4QW5pbS5zZXRSZXBlYXRNb2RlKFZhbHVlQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICAgICAgeEFuaW0uc2V0SW50ZXJwb2xhdG9yKG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKDJmKSk7CisKKyAgICAgICAgICAgICAgICBPYmplY3RBbmltYXRvciBhbHBoYUFuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwsICJhbHBoYSIsIDFmLCAuNWYpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RHVyYXRpb24oMTAwMCk7CisgICAgICAgICAgICAgICAgQW5pbWF0b3JTZXQgYWxwaGFTZXEgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgICAgICBhbHBoYVNlcS5wbGF5KGFscGhhQW5pbSk7CisKKyAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgICAgICAoKEFuaW1hdG9yU2V0KSBhbmltYXRpb24pLnBsYXlUb2dldGhlcih5QW5pbSwgeEFuaW0pOworICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5hZGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKGJvb2xlYW4gZW5kSW1tZWRpYXRlbHkpIHsKKyAgICAgICAgICAgIHRoaXMuZW5kSW1tZWRpYXRlbHkgPSBlbmRJbW1lZGlhdGVseTsKKyAgICAgICAgICAgIHN0YXJ0VGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgcmVwZWF0VGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgY2FuY2VsVGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgZW5kVGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgc3RhcnRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIHJlcGVhdFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgY2FuY2VsVGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgICAgICBlbmRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWxBbmltYXRpb24oKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYW5pbWF0aW9uLmVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBjcmVhdGVCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIE92YWxTaGFwZSBjaXJjbGUgPSBuZXcgT3ZhbFNoYXBlKCk7CisgICAgICAgICAgICBjaXJjbGUucmVzaXplKDUwZiwgNTBmKTsKKyAgICAgICAgICAgIFNoYXBlRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgU2hhcGVEcmF3YWJsZShjaXJjbGUpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBuZXcgU2hhcGVIb2xkZXIoZHJhd2FibGUpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WCh4IC0gMjVmKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFkoeSAtIDI1Zik7CisgICAgICAgICAgICBpbnQgcmVkID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgZ3JlZW4gPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBibHVlID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSAweGZmMDAwMDAwIHwgcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICBQYWludCBwYWludCA9IGRyYXdhYmxlLmdldFBhaW50KCk7IC8vbmV3IFBhaW50KFBhaW50LkFOVElfQUxJQVNfRkxBRyk7CisgICAgICAgICAgICBpbnQgZGFya0NvbG9yID0gMHhmZjAwMDAwMCB8IHJlZC80IDw8IDE2IHwgZ3JlZW4vNCA8PCA4IHwgYmx1ZS80OworICAgICAgICAgICAgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQgPSBuZXcgUmFkaWFsR3JhZGllbnQoMzcuNWYsIDEyLjVmLAorICAgICAgICAgICAgICAgICAgICA1MGYsIGNvbG9yLCBkYXJrQ29sb3IsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBwYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0UGFpbnQocGFpbnQpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShiYWxsLmdldFgoKSwgYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgYmFsbC5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRvclNldCkgeworICAgICAgICAgICAgICAgIHN0YXJ0VGV4dC5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0VGV4dEFuaW1hdG9yLnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbmRJbW1lZGlhdGVseSkgeworICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIEFuaW1hdG9yU2V0KSB7CisgICAgICAgICAgICAgICAgZW5kVGV4dC5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZFRleHRBbmltYXRvci5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRvclNldCkgeworICAgICAgICAgICAgICAgIGNhbmNlbFRleHQuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uIGluc3RhbmNlb2YgQW5pbWF0b3JTZXQpIHsKKyAgICAgICAgICAgICAgICByZXBlYXRUZXh0LnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwZWF0VGV4dEFuaW1hdG9yLnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0JvdW5jaW5nQmFsbHMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQm91bmNpbmdCYWxscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjI1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0JvdW5jaW5nQmFsbHMuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLio7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworCitwdWJsaWMgY2xhc3MgQm91bmNpbmdCYWxscyBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5ib3VuY2luZ19iYWxscyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFRCA9IDB4ZmZGRjgwODA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFID0gMHhmZjgwODBGRjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZQU4gPSAweGZmODBmZmZmOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU4gPSAweGZmODBmZjgwOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3JTZXQgYW5pbWF0aW9uID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgICAgIC8vIEFuaW1hdGUgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHNldHRpbmcgdGhlIGJhY2tncm91bmQgY29sb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGludmFsaWRhdGUgdGhlCisgICAgICAgICAgICAvLyB2aWV3LCBzbyB0aGF0IHRoZSBhbmltYXRlZCBjb2xvciwgYW5kIHRoZSBib3VuY2luZyBiYWxscywgZ2V0IHJlZGlzcGxheWVkIG9uCisgICAgICAgICAgICAvLyBldmVyeSBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgICAgVmFsdWVBbmltYXRvciBjb2xvckFuaW0gPSBPYmplY3RBbmltYXRvci5vZkludCh0aGlzLCAiYmFja2dyb3VuZENvbG9yIiwgUkVELCBCTFVFKTsKKyAgICAgICAgICAgIGNvbG9yQW5pbS5zZXREdXJhdGlvbigzMDAwKTsKKyAgICAgICAgICAgIGNvbG9yQW5pbS5zZXRFdmFsdWF0b3IobmV3IFJHQkV2YWx1YXRvcigpKTsKKyAgICAgICAgICAgIGNvbG9yQW5pbS5zZXRSZXBlYXRDb3VudChWYWx1ZUFuaW1hdG9yLklORklOSVRFKTsKKyAgICAgICAgICAgIGNvbG9yQW5pbS5zZXRSZXBlYXRNb2RlKFZhbHVlQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBjb2xvckFuaW0uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiAmJgorICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIG5ld0JhbGwgPSBhZGRCYWxsKGV2ZW50LmdldFgoKSwgZXZlbnQuZ2V0WSgpKTsKKworICAgICAgICAgICAgLy8gQm91bmNpbmcgYW5pbWF0aW9uIHdpdGggc3F1YXNoIGFuZCBzdHJldGNoCisgICAgICAgICAgICBmbG9hdCBzdGFydFkgPSBuZXdCYWxsLmdldFkoKTsKKyAgICAgICAgICAgIGZsb2F0IGVuZFkgPSBnZXRIZWlnaHQoKSAtIDUwZjsKKyAgICAgICAgICAgIGZsb2F0IGggPSAoZmxvYXQpZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBmbG9hdCBldmVudFkgPSBldmVudC5nZXRZKCk7CisgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSAoaW50KSg1MDAgKiAoKGggLSBldmVudFkpL2gpKTsKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYm91bmNlQW5pbSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobmV3QmFsbCwgInkiLCBzdGFydFksIGVuZFkpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgICAgICBib3VuY2VBbmltLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3Igc3F1YXNoQW5pbTEgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG5ld0JhbGwsICJ4IiwgbmV3QmFsbC5nZXRYKCksCisgICAgICAgICAgICAgICAgICAgIG5ld0JhbGwuZ2V0WCgpIC0gMjVmKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0xLnNldER1cmF0aW9uKGR1cmF0aW9uLzQpOworICAgICAgICAgICAgc3F1YXNoQW5pbTEuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICBzcXVhc2hBbmltMS5zZXRSZXBlYXRNb2RlKFZhbHVlQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBzcXVhc2hBbmltMS5zZXRJbnRlcnBvbGF0b3IobmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIHNxdWFzaEFuaW0yID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChuZXdCYWxsLCAid2lkdGgiLCBuZXdCYWxsLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgIG5ld0JhbGwuZ2V0V2lkdGgoKSArIDUwKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0yLnNldER1cmF0aW9uKGR1cmF0aW9uLzQpOworICAgICAgICAgICAgc3F1YXNoQW5pbTIuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICBzcXVhc2hBbmltMi5zZXRSZXBlYXRNb2RlKFZhbHVlQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBzcXVhc2hBbmltMi5zZXRJbnRlcnBvbGF0b3IobmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIHN0cmV0Y2hBbmltMSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobmV3QmFsbCwgInkiLCBlbmRZLAorICAgICAgICAgICAgICAgICAgICBlbmRZICsgMjVmKTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMS5zZXREdXJhdGlvbihkdXJhdGlvbi80KTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMS5zZXRSZXBlYXRDb3VudCgxKTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMS5zZXRJbnRlcnBvbGF0b3IobmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzdHJldGNoQW5pbTEuc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworICAgICAgICAgICAgVmFsdWVBbmltYXRvciBzdHJldGNoQW5pbTIgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG5ld0JhbGwsICJoZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICBuZXdCYWxsLmdldEhlaWdodCgpLCBuZXdCYWxsLmdldEhlaWdodCgpIC0gMjUpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0yLnNldER1cmF0aW9uKGR1cmF0aW9uLzQpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0yLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0yLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMi5zZXRSZXBlYXRNb2RlKFZhbHVlQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGJvdW5jZUJhY2tBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChuZXdCYWxsLCAieSIsIGVuZFksCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0WSk7CisgICAgICAgICAgICBib3VuY2VCYWNrQW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgICAgICBib3VuY2VCYWNrQW5pbS5zZXRJbnRlcnBvbGF0b3IobmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICAvLyBTZXF1ZW5jZSB0aGUgZG93bi9zcXVhc2gmc3RyZXRjaC91cCBhbmltYXRpb25zCisgICAgICAgICAgICBBbmltYXRvclNldCBib3VuY2VyID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICBib3VuY2VyLnBsYXkoYm91bmNlQW5pbSkuYmVmb3JlKHNxdWFzaEFuaW0xKTsKKyAgICAgICAgICAgIGJvdW5jZXIucGxheShzcXVhc2hBbmltMSkud2l0aChzcXVhc2hBbmltMik7CisgICAgICAgICAgICBib3VuY2VyLnBsYXkoc3F1YXNoQW5pbTEpLndpdGgoc3RyZXRjaEFuaW0xKTsKKyAgICAgICAgICAgIGJvdW5jZXIucGxheShzcXVhc2hBbmltMSkud2l0aChzdHJldGNoQW5pbTIpOworICAgICAgICAgICAgYm91bmNlci5wbGF5KGJvdW5jZUJhY2tBbmltKS5hZnRlcihzdHJldGNoQW5pbTIpOworCisgICAgICAgICAgICAvLyBGYWRpbmcgYW5pbWF0aW9uIC0gcmVtb3ZlIHRoZSBiYWxsIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBkb25lCisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGZhZGVBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChuZXdCYWxsLCAiYWxwaGEiLCAxZiwgMGYpOworICAgICAgICAgICAgZmFkZUFuaW0uc2V0RHVyYXRpb24oMjUwKTsKKyAgICAgICAgICAgIGZhZGVBbmltLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYmFsbHMucmVtb3ZlKCgoT2JqZWN0QW5pbWF0b3IpYW5pbWF0aW9uKS5nZXRUYXJnZXQoKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gU2VxdWVuY2UgdGhlIHR3byBhbmltYXRpb25zIHRvIHBsYXkgb25lIGFmdGVyIHRoZSBvdGhlcgorICAgICAgICAgICAgQW5pbWF0b3JTZXQgYW5pbWF0b3JTZXQgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgIGFuaW1hdG9yU2V0LnBsYXkoYm91bmNlcikuYmVmb3JlKGZhZGVBbmltKTsKKworICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgYW5pbWF0b3JTZXQuc3RhcnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGFkZEJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoNTBmLCA1MGYpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHggLSAyNWYpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5IC0gMjVmKTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsgLy9uZXcgUGFpbnQoUGFpbnQuQU5USV9BTElBU19GTEFHKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICBiYWxscy5hZGQoc2hhcGVIb2xkZXIpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhbGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBiYWxscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHNoYXBlSG9sZGVyLmdldFgoKSwgc2hhcGVIb2xkZXIuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICBzaGFwZUhvbGRlci5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQ3VzdG9tRXZhbHVhdG9yLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0N1c3RvbUV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzQ1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0N1c3RvbUV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuT3ZhbFNoYXBlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK3B1YmxpYyBjbGFzcyBDdXN0b21FdmFsdWF0b3IgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdG9yX2N1c3RvbV9ldmFsdWF0b3IpOworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyKTsKKyAgICAgICAgZmluYWwgTXlBbmltYXRpb25WaWV3IGFuaW1WaWV3ID0gbmV3IE15QW5pbWF0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoYW5pbVZpZXcpOworCisgICAgICAgIEJ1dHRvbiBzdGFydGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRCdXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBYWUhvbGRlciB7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVk7CisKKyAgICAgICAgcHVibGljIFhZSG9sZGVyKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIG1YID0geDsKKyAgICAgICAgICAgIG1ZID0geTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WChmbG9hdCB4KSB7CisgICAgICAgICAgICBtWCA9IHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFkoZmxvYXQgeSkgeworICAgICAgICAgICAgbVkgPSB5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFhZRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgICAgIFhZSG9sZGVyIHN0YXJ0WFkgPSAoWFlIb2xkZXIpIHN0YXJ0VmFsdWU7CisgICAgICAgICAgICBYWUhvbGRlciBlbmRYWSA9IChYWUhvbGRlcikgZW5kVmFsdWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhZSG9sZGVyKHN0YXJ0WFkuZ2V0WCgpICsgZnJhY3Rpb24gKiAoZW5kWFkuZ2V0WCgpIC0gc3RhcnRYWS5nZXRYKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGFydFhZLmdldFkoKSArIGZyYWN0aW9uICogKGVuZFhZLmdldFkoKSAtIHN0YXJ0WFkuZ2V0WSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQmFsbFhZSG9sZGVyIHsKKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIG1CYWxsOworCisgICAgICAgIHB1YmxpYyBCYWxsWFlIb2xkZXIoU2hhcGVIb2xkZXIgYmFsbCkgeworICAgICAgICAgICAgbUJhbGwgPSBiYWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WFkoWFlIb2xkZXIgeHlIb2xkZXIpIHsKKyAgICAgICAgICAgIG1CYWxsLnNldFgoeHlIb2xkZXIuZ2V0WCgpKTsKKyAgICAgICAgICAgIG1CYWxsLnNldFkoeHlIb2xkZXIuZ2V0WSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYWUhvbGRlciBnZXRYWSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWFlIb2xkZXIobUJhbGwuZ2V0WCgpLCBtQmFsbC5nZXRZKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgVmFsdWVBbmltYXRvciBib3VuY2VBbmltID0gbnVsbDsKKyAgICAgICAgU2hhcGVIb2xkZXIgYmFsbCA9IG51bGw7CisgICAgICAgIEJhbGxYWUhvbGRlciBiYWxsSG9sZGVyID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBiYWxsID0gY3JlYXRlQmFsbCgyNSwgMjUpOworICAgICAgICAgICAgYmFsbEhvbGRlciA9IG5ldyBCYWxsWFlIb2xkZXIoYmFsbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGJvdW5jZUFuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFhZSG9sZGVyIHN0YXJ0WFkgPSBuZXcgWFlIb2xkZXIoMGYsIDBmKTsKKyAgICAgICAgICAgICAgICBYWUhvbGRlciBlbmRYWSA9IG5ldyBYWUhvbGRlcigzMDBmLCA1MDBmKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZPYmplY3QoYmFsbEhvbGRlciwgInhZIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYWUV2YWx1YXRvcigpLCBlbmRYWSk7CisgICAgICAgICAgICAgICAgYm91bmNlQW5pbS5zZXREdXJhdGlvbigxNTAwKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24oKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGJvdW5jZUFuaW0uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgY3JlYXRlQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZSg1MGYsIDUwZik7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCAtIDI1Zik7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkgLSAyNWYpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOyAvL25ldyBQYWludChQYWludC5BTlRJX0FMSUFTX0ZMQUcpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIHJldHVybiBzaGFwZUhvbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgIGJhbGwuZ2V0U2hhcGUoKS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vRml4ZWRHcmlkTGF5b3V0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0ZpeGVkR3JpZExheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzU1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0ZpeGVkR3JpZExheW91dC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworLyoqCisgKiBBIGxheW91dCB0aGF0IGFycmFuZ2VzIGl0cyBjaGlsZHJlbiBpbiBhIGdyaWQuICBUaGUgc2l6ZSBvZiB0aGUKKyAqIGNlbGxzIGlzIHNldCBieSB0aGUge0BsaW5rICNzZXRDZWxsU2l6ZX0gbWV0aG9kIGFuZCB0aGUKKyAqIGFuZHJvaWQ6Y2VsbF93aWR0aCBhbmQgYW5kcm9pZDpjZWxsX2hlaWdodCBhdHRyaWJ1dGVzIGluIFhNTC4KKyAqIFRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuICBFYWNoCisgKiBjZWxsIGNvbnRhaW5zIGV4YWN0bHkgb25lIHZpZXcsIGFuZCB0aGV5IGZsb3cgaW4gdGhlIG5hdHVyYWwKKyAqIGNoaWxkIG9yZGVyICh0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLCBvciB0aGUgaW5kZXgKKyAqIGluIHtAbGluayAjYWRkVmlld0F0fS4gIFZpZXdzIGNhbiBub3Qgc3BhbiBtdWx0aXBsZSBjZWxscy4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgRml4ZWRHcmlkTGF5b3V0IEFwaSBkZW1vOyBzZWUgdGhhdCBkZW1vIGZvcgorICogbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgbGF5b3V0LjwvcD4KKyAqLworcHVibGljIGNsYXNzIEZpeGVkR3JpZExheW91dCBleHRlbmRzIFZpZXdHcm91cCB7CisgICAgaW50IG1DZWxsV2lkdGg7CisgICAgaW50IG1DZWxsSGVpZ2h0OworCisgICAgcHVibGljIEZpeGVkR3JpZExheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2VsbFdpZHRoKGludCBweCkgeworICAgICAgICBtQ2VsbFdpZHRoID0gcHg7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsSGVpZ2h0KGludCBweCkgeworICAgICAgICBtQ2VsbEhlaWdodCA9IHB4OworICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IGNlbGxXaWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobUNlbGxXaWR0aCwKKyAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgaW50IGNlbGxIZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1DZWxsSGVpZ2h0LAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkFUX01PU1QpOworCisgICAgICAgIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXg9MDsgaW5kZXg8Y291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4KTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2VsbFdpZHRoU3BlYywgY2VsbEhlaWdodFNwZWMpOworICAgICAgICB9CisgICAgICAgIC8vIFVzZSB0aGUgc2l6ZSBvdXIgcGFyZW50cyBnYXZlIHVzCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHJlc29sdmVTaXplKG1DZWxsV2lkdGgqY291bnQsIHdpZHRoTWVhc3VyZVNwZWMpLAorICAgICAgICAgICAgICAgIHJlc29sdmVTaXplKG1DZWxsSGVpZ2h0KmNvdW50LCBoZWlnaHRNZWFzdXJlU3BlYykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaW50IGNlbGxXaWR0aCA9IG1DZWxsV2lkdGg7CisgICAgICAgIGludCBjZWxsSGVpZ2h0ID0gbUNlbGxIZWlnaHQ7CisgICAgICAgIGludCBjb2x1bW5zID0gKHIgLSBsKSAvIGNlbGxXaWR0aDsKKyAgICAgICAgaWYgKGNvbHVtbnMgPCAwKSB7CisgICAgICAgICAgICBjb2x1bW5zID0gMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgeCA9IDA7CisgICAgICAgIGludCB5ID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGluZGV4PTA7IGluZGV4PGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpbmRleCk7CisKKyAgICAgICAgICAgIGludCB3ID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGggPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICBpbnQgbGVmdCA9IHggKyAoKGNlbGxXaWR0aC13KS8yKTsKKyAgICAgICAgICAgIGludCB0b3AgPSB5ICsgKChjZWxsSGVpZ2h0LWgpLzIpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobGVmdCwgdG9wLCBsZWZ0K3csIHRvcCtoKTsKKyAgICAgICAgICAgIGlmIChpID49IChjb2x1bW5zLTEpKSB7CisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IHJvdworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIHkgKz0gY2VsbEhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHggKz0gY2VsbFdpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzhiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnMuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb247CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIExheW91dFRyYW5zaXRpb24gdG8gYXV0b21hdGUgdHJhbnNpdGlvbiBhbmltYXRpb25zCisgKiBhcyBpdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIG9yIGFkZGVkIHRvIGEgY29udGFpbmVyLgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0QW5pbWF0aW9ucyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgaW50IG51bUJ1dHRvbnMgPSAxOworICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworICAgIEFuaW1hdG9yIGRlZmF1bHRBcHBlYXJpbmdBbmltLCBkZWZhdWx0RGlzYXBwZWFyaW5nQW5pbTsKKyAgICBBbmltYXRvciBkZWZhdWx0Q2hhbmdpbmdBcHBlYXJpbmdBbmltLCBkZWZhdWx0Q2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltOworICAgIEFuaW1hdG9yIGN1c3RvbUFwcGVhcmluZ0FuaW0sIGN1c3RvbURpc2FwcGVhcmluZ0FuaW07CisgICAgQW5pbWF0b3IgY3VzdG9tQ2hhbmdpbmdBcHBlYXJpbmdBbmltLCBjdXN0b21DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW07CisgICAgQW5pbWF0b3IgY3VycmVudEFwcGVhcmluZ0FuaW0sIGN1cnJlbnREaXNhcHBlYXJpbmdBbmltOworICAgIEFuaW1hdG9yIGN1cnJlbnRDaGFuZ2luZ0FwcGVhcmluZ0FuaW0sIGN1cnJlbnRDaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW07CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5sYXlvdXRfYW5pbWF0aW9ucyk7CisKKyAgICAgICAgY29udGFpbmVyID0gbmV3IEZpeGVkR3JpZExheW91dCh0aGlzKTsKKyAgICAgICAgKChGaXhlZEdyaWRMYXlvdXQpY29udGFpbmVyKS5zZXRDZWxsSGVpZ2h0KDUwKTsKKyAgICAgICAgKChGaXhlZEdyaWRMYXlvdXQpY29udGFpbmVyKS5zZXRDZWxsV2lkdGgoMjAwKTsKKyAgICAgICAgZmluYWwgTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uZXIgPSBuZXcgTGF5b3V0VHJhbnNpdGlvbigpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0VHJhbnNpdGlvbih0cmFuc2l0aW9uZXIpOworICAgICAgICBkZWZhdWx0QXBwZWFyaW5nQW5pbSA9IHRyYW5zaXRpb25lci5nZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkFQUEVBUklORyk7CisgICAgICAgIGRlZmF1bHREaXNhcHBlYXJpbmdBbmltID0KKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uZXIuZ2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5ESVNBUFBFQVJJTkcpOworICAgICAgICBkZWZhdWx0Q2hhbmdpbmdBcHBlYXJpbmdBbmltID0KKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uZXIuZ2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfQVBQRUFSSU5HKTsKKyAgICAgICAgZGVmYXVsdENoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLmdldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0RJU0FQUEVBUklORyk7CisgICAgICAgIGNyZWF0ZUN1c3RvbUFuaW1hdGlvbnModHJhbnNpdGlvbmVyKTsKKyAgICAgICAgY3VycmVudEFwcGVhcmluZ0FuaW0gPSBkZWZhdWx0QXBwZWFyaW5nQW5pbTsKKyAgICAgICAgY3VycmVudERpc2FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0RGlzYXBwZWFyaW5nQW5pbTsKKyAgICAgICAgY3VycmVudENoYW5naW5nQXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRDaGFuZ2luZ0FwcGVhcmluZ0FuaW07CisgICAgICAgIGN1cnJlbnRDaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0Q2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltOworCisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQgPSAoVmlld0dyb3VwKSBmaW5kVmlld0J5SWQoUi5pZC5wYXJlbnQpOworICAgICAgICBwYXJlbnQuYWRkVmlldyhjb250YWluZXIpOworICAgICAgICBCdXR0b24gYWRkQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYWRkTmV3QnV0dG9uKTsKKyAgICAgICAgYWRkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIEJ1dHRvbiBuZXdCdXR0b24gPSBuZXcgQnV0dG9uKExheW91dEFuaW1hdGlvbnMudGhpcyk7CisgICAgICAgICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoIkNsaWNrIHRvIERlbGV0ZSAiICsgKG51bUJ1dHRvbnMrKykpOworICAgICAgICAgICAgICAgIG5ld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZVZpZXcodik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyhuZXdCdXR0b24sIE1hdGgubWluKDEsIGNvbnRhaW5lci5nZXRDaGlsZENvdW50KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgQ2hlY2tCb3ggY3VzdG9tQW5pbUNCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5jdXN0b21BbmltQ0IpOworICAgICAgICBjdXN0b21BbmltQ0Iuc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIobmV3IENvbXBvdW5kQnV0dG9uLk9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGVja2VkQ2hhbmdlZChDb21wb3VuZEJ1dHRvbiBidXR0b25WaWV3LCBib29sZWFuIGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgIHNldHVwVHJhbnNpdGlvbih0cmFuc2l0aW9uZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBDaGVjayBmb3IgZGlzYWJsZWQgYW5pbWF0aW9ucworICAgICAgICBDaGVja0JveCBhcHBlYXJpbmdDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuYXBwZWFyaW5nQ0IpOworICAgICAgICBhcHBlYXJpbmdDQi5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc2V0dXBUcmFuc2l0aW9uKHRyYW5zaXRpb25lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBDaGVja0JveCBkaXNhcHBlYXJpbmdDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuZGlzYXBwZWFyaW5nQ0IpOworICAgICAgICBkaXNhcHBlYXJpbmdDQi5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc2V0dXBUcmFuc2l0aW9uKHRyYW5zaXRpb25lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBDaGVja0JveCBjaGFuZ2luZ0FwcGVhcmluZ0NCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5jaGFuZ2luZ0FwcGVhcmluZ0NCKTsKKyAgICAgICAgY2hhbmdpbmdBcHBlYXJpbmdDQi5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc2V0dXBUcmFuc2l0aW9uKHRyYW5zaXRpb25lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBDaGVja0JveCBjaGFuZ2luZ0Rpc2FwcGVhcmluZ0NCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5jaGFuZ2luZ0Rpc2FwcGVhcmluZ0NCKTsKKyAgICAgICAgY2hhbmdpbmdEaXNhcHBlYXJpbmdDQi5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc2V0dXBUcmFuc2l0aW9uKHRyYW5zaXRpb25lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CisgICAgICAgIENoZWNrQm94IGN1c3RvbUFuaW1DQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tQW5pbUNCKTsKKyAgICAgICAgQ2hlY2tCb3ggYXBwZWFyaW5nQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmFwcGVhcmluZ0NCKTsKKyAgICAgICAgQ2hlY2tCb3ggZGlzYXBwZWFyaW5nQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmRpc2FwcGVhcmluZ0NCKTsKKyAgICAgICAgQ2hlY2tCb3ggY2hhbmdpbmdBcHBlYXJpbmdDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuY2hhbmdpbmdBcHBlYXJpbmdDQik7CisgICAgICAgIENoZWNrQm94IGNoYW5naW5nRGlzYXBwZWFyaW5nQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmNoYW5naW5nRGlzYXBwZWFyaW5nQ0IpOworICAgICAgICB0cmFuc2l0aW9uLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQVBQRUFSSU5HLCBhcHBlYXJpbmdDQi5pc0NoZWNrZWQoKSA/CisgICAgICAgICAgICAgICAgKGN1c3RvbUFuaW1DQi5pc0NoZWNrZWQoKSA/IGN1c3RvbUFwcGVhcmluZ0FuaW0gOiBkZWZhdWx0QXBwZWFyaW5nQW5pbSkgOiBudWxsKTsKKyAgICAgICAgdHJhbnNpdGlvbi5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORywgZGlzYXBwZWFyaW5nQ0IuaXNDaGVja2VkKCkgPworICAgICAgICAgICAgICAgIChjdXN0b21BbmltQ0IuaXNDaGVja2VkKCkgPyBjdXN0b21EaXNhcHBlYXJpbmdBbmltIDogZGVmYXVsdERpc2FwcGVhcmluZ0FuaW0pIDogbnVsbCk7CisgICAgICAgIHRyYW5zaXRpb24uc2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfQVBQRUFSSU5HLCBjaGFuZ2luZ0FwcGVhcmluZ0NCLmlzQ2hlY2tlZCgpID8KKyAgICAgICAgICAgICAgICAoY3VzdG9tQW5pbUNCLmlzQ2hlY2tlZCgpID8gY3VzdG9tQ2hhbmdpbmdBcHBlYXJpbmdBbmltIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGFuZ2luZ0FwcGVhcmluZ0FuaW0pIDogbnVsbCk7CisgICAgICAgIHRyYW5zaXRpb24uc2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfRElTQVBQRUFSSU5HLAorICAgICAgICAgICAgICAgIGNoYW5naW5nRGlzYXBwZWFyaW5nQ0IuaXNDaGVja2VkKCkgPworICAgICAgICAgICAgICAgIChjdXN0b21BbmltQ0IuaXNDaGVja2VkKCkgPyBjdXN0b21DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSkgOiBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ3VzdG9tQW5pbWF0aW9ucyhMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8gQ2hhbmdpbmcgd2hpbGUgQWRkaW5nCisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aExlZnQgPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mSW50KCJsZWZ0IiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFRvcCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoInRvcCIsIDAsIDEpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhSaWdodCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoInJpZ2h0IiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEJvdHRvbSA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoImJvdHRvbSIsIDAsIDEpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhTY2FsZVggPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInNjYWxlWCIsIDFmLCAwZiwgMWYpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhTY2FsZVkgPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInNjYWxlWSIsIDFmLCAwZiwgMWYpOworICAgICAgICBjdXN0b21DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gPSBPYmplY3RBbmltYXRvci5vZlByb3BlcnR5VmFsdWVzSG9sZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcHZoTGVmdCwgcHZoVG9wLCBwdmhSaWdodCwgcHZoQm90dG9tLCBwdmhTY2FsZVgsIHB2aFNjYWxlWSkuCisgICAgICAgICAgICAgICAgc2V0RHVyYXRpb24odHJhbnNpdGlvbi5nZXREdXJhdGlvbihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9BUFBFQVJJTkcpKTsKKyAgICAgICAgY3VzdG9tQ2hhbmdpbmdBcHBlYXJpbmdBbmltLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSAoVmlldykgKChPYmplY3RBbmltYXRvcikgYW5pbSkuZ2V0VGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgdmlldy5zZXRTY2FsZVgoMWYpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0U2NhbGVZKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gQ2hhbmdpbmcgd2hpbGUgUmVtb3ZpbmcKKyAgICAgICAgS2V5ZnJhbWUga2YwID0gS2V5ZnJhbWUub2ZGbG9hdCgwZiwgMGYpOworICAgICAgICBLZXlmcmFtZSBrZjEgPSBLZXlmcmFtZS5vZkZsb2F0KC45OTk5ZiwgMzYwZik7CisgICAgICAgIEtleWZyYW1lIGtmMiA9IEtleWZyYW1lLm9mRmxvYXQoMWYsIDBmKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZoUm90YXRpb24gPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mS2V5ZnJhbWUoInJvdGF0aW9uIiwga2YwLCBrZjEsIGtmMik7CisgICAgICAgIGN1c3RvbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwdmhMZWZ0LCBwdmhUb3AsIHB2aFJpZ2h0LCBwdmhCb3R0b20sIHB2aFJvdGF0aW9uKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0RJU0FQUEVBUklORykpOworICAgICAgICBjdXN0b21DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uKDBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gQWRkaW5nCisgICAgICAgIGN1c3RvbUFwcGVhcmluZ0FuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG51bGwsICJyb3RhdGlvblkiLCA5MGYsIDBmKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uQVBQRUFSSU5HKSk7CisgICAgICAgIGN1c3RvbUFwcGVhcmluZ0FuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uWSgwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFJlbW92aW5nCisgICAgICAgIGN1c3RvbURpc2FwcGVhcmluZ0FuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG51bGwsICJyb3RhdGlvblgiLCAwZiwgOTBmKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HKSk7CisgICAgICAgIGN1c3RvbURpc2FwcGVhcmluZ0FuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uWCgwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uc0J5RGVmYXVsdC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MYXlvdXRBbmltYXRpb25zQnlEZWZhdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkMzQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uc0J5RGVmYXVsdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKKy8qKgorICogVGhpcyBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgYW5pbWF0ZUxheW91dENoYW5nZXMgdGFnIGluIFhNTCB0byBhdXRvbWF0ZQorICogdHJhbnNpdGlvbiBhbmltYXRpb25zIGFzIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gb3IgYWRkZWQgdG8gYSBjb250YWluZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBMYXlvdXRBbmltYXRpb25zQnlEZWZhdWx0IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBpbnQgbnVtQnV0dG9ucyA9IDE7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxheW91dF9hbmltYXRpb25zX2J5X2RlZmF1bHQpOworCisgICAgICAgIGZpbmFsIFZpZXdHcm91cCBob3Jpem9udGFsQ29udGFpbmVyID0gKFZpZXdHcm91cCkgZmluZFZpZXdCeUlkKFIuaWQuaG9yaXpvbnRhbENvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIFZpZXdHcm91cCB2ZXJ0aWNhbENvbnRhaW5lciA9IChWaWV3R3JvdXApIGZpbmRWaWV3QnlJZChSLmlkLnZlcnRpY2FsQ29udGFpbmVyKTsKKworICAgICAgICBCdXR0b24gYWRkQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYWRkTmV3QnV0dG9uKTsKKyAgICAgICAgYWRkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIEJ1dHRvbiBuZXdCdXR0b24gPSBuZXcgQnV0dG9uKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBuZXdCdXR0b24uc2V0VGV4dCgiQ2xpY2sgVG8gUmVtb3ZlICIgKyAobnVtQnV0dG9ucysrKSk7CisgICAgICAgICAgICAgICAgbmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsQ29udGFpbmVyLnJlbW92ZVZpZXcodik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBob3Jpem9udGFsQ29udGFpbmVyLmFkZFZpZXcobmV3QnV0dG9uLCBNYXRoLm1pbigxLCBob3Jpem9udGFsQ29udGFpbmVyLmdldENoaWxkQ291bnQoKSkpOworCisgICAgICAgICAgICAgICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoIkNsaWNrIFRvIFJlbW92ZSAiICsgKG51bUJ1dHRvbnMrKykpOworICAgICAgICAgICAgICAgIG5ld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxDb250YWluZXIucmVtb3ZlVmlldyh2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHZlcnRpY2FsQ29udGFpbmVyLmFkZFZpZXcobmV3QnV0dG9uLCBNYXRoLm1pbigxLCB2ZXJ0aWNhbENvbnRhaW5lci5nZXRDaGlsZENvdW50KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MYXlvdXRBbmltYXRpb25zSGlkZVNob3cuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uc0hpZGVTaG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uc0hpZGVTaG93LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckxpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZTsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKKy8qKgorICogVGhpcyBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBMYXlvdXRUcmFuc2l0aW9uIHRvIGF1dG9tYXRlIHRyYW5zaXRpb24gYW5pbWF0aW9ucworICogYXMgaXRlbXMgYXJlIGhpZGRlbiBvciBzaG93biBpbiBhIGNvbnRhaW5lci4KKyAqLworcHVibGljIGNsYXNzIExheW91dEFuaW1hdGlvbnNIaWRlU2hvdyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgaW50IG51bUJ1dHRvbnMgPSAxOworICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGF5b3V0X2FuaW1hdGlvbnNfaGlkZXNob3cpOworCisgICAgICAgIGZpbmFsIENoZWNrQm94IGhpZGVHb25lQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmhpZGVHb25lQ0IpOworCisgICAgICAgIGNvbnRhaW5lciA9IG5ldyBGaXhlZEdyaWRMYXlvdXQodGhpcyk7CisgICAgICAgICgoRml4ZWRHcmlkTGF5b3V0KWNvbnRhaW5lcikuc2V0Q2VsbEhlaWdodCg1MCk7CisgICAgICAgICgoRml4ZWRHcmlkTGF5b3V0KWNvbnRhaW5lcikuc2V0Q2VsbFdpZHRoKDEwMCk7CisgICAgICAgIGNvbnRhaW5lciA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CisKKyAgICAgICAgLy8gQWRkIGEgc2xldyBvZiBidXR0b25zIHRvIHRoZSBjb250YWluZXIuIFdlIHdvbid0IGFkZCBhbnkgbW9yZSBidXR0b25zIGF0IHJ1bnRpbWUsIGJ1dAorICAgICAgICAvLyB3aWxsIGp1c3Qgc2hvdy9oaWRlIHRoZSBidXR0b25zIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgICAgICBuZXdCdXR0b24uc2V0VGV4dCgiQ2xpY2sgdG8gSGlkZSAiICsgaSk7CisgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyhuZXdCdXR0b24pOworICAgICAgICAgICAgbmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KGhpZGVHb25lQ0IuaXNDaGVja2VkKCkgPyBWaWV3LkdPTkUgOiBWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uZXIgPSBuZXcgTGF5b3V0VHJhbnNpdGlvbigpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0VHJhbnNpdGlvbih0cmFuc2l0aW9uZXIpOworCisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQgPSAoVmlld0dyb3VwKSBmaW5kVmlld0J5SWQoUi5pZC5wYXJlbnQpOworICAgICAgICBwYXJlbnQuYWRkVmlldyhjb250YWluZXIpOworCisgICAgICAgIEJ1dHRvbiBhZGRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5hZGROZXdCdXR0b24pOworICAgICAgICBhZGRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXIuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpIGNvbnRhaW5lci5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIENoZWNrQm94IGN1c3RvbUFuaW1DQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tQW5pbUNCKTsKKyAgICAgICAgY3VzdG9tQW5pbUNCLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldFN0YWdnZXIoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfQVBQRUFSSU5HLCAzMCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25lci5zZXRTdGFnZ2VyKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0RJU0FQUEVBUklORywgMzApOworICAgICAgICAgICAgICAgICAgICBzZXR1cEFuaW1hdGlvbnModHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldFN0YWdnZXIoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfQVBQRUFSSU5HLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldFN0YWdnZXIoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfRElTQVBQRUFSSU5HLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQVBQRUFSSU5HLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25lci5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDMwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwQW5pbWF0aW9ucyhMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8gQ2hhbmdpbmcgd2hpbGUgQWRkaW5nCisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aExlZnQgPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mSW50KCJsZWZ0IiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFRvcCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoInRvcCIsIDAsIDEpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhSaWdodCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoInJpZ2h0IiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEJvdHRvbSA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoImJvdHRvbSIsIDAsIDEpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhTY2FsZVggPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInNjYWxlWCIsIDFmLCAwZiwgMWYpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhTY2FsZVkgPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInNjYWxlWSIsIDFmLCAwZiwgMWYpOworICAgICAgICBmaW5hbCBPYmplY3RBbmltYXRvciBjaGFuZ2VJbiA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwdmhMZWZ0LCBwdmhUb3AsIHB2aFJpZ2h0LCBwdmhCb3R0b20sIHB2aFNjYWxlWCwgcHZoU2NhbGVZKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORykpOworICAgICAgICB0cmFuc2l0aW9uLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORywgY2hhbmdlSW4pOworICAgICAgICBjaGFuZ2VJbi5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0U2NhbGVYKDFmKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFNjYWxlWSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIENoYW5naW5nIHdoaWxlIFJlbW92aW5nCisgICAgICAgIEtleWZyYW1lIGtmMCA9IEtleWZyYW1lLm9mRmxvYXQoMGYsIDBmKTsKKyAgICAgICAgS2V5ZnJhbWUga2YxID0gS2V5ZnJhbWUub2ZGbG9hdCguOTk5OWYsIDM2MGYpOworICAgICAgICBLZXlmcmFtZSBrZjIgPSBLZXlmcmFtZS5vZkZsb2F0KDFmLCAwZik7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFJvdGF0aW9uID0KKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZktleWZyYW1lKCJyb3RhdGlvbiIsIGtmMCwga2YxLCBrZjIpOworICAgICAgICBmaW5hbCBPYmplY3RBbmltYXRvciBjaGFuZ2VPdXQgPSBPYmplY3RBbmltYXRvci5vZlByb3BlcnR5VmFsdWVzSG9sZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcHZoTGVmdCwgcHZoVG9wLCBwdmhSaWdodCwgcHZoQm90dG9tLCBwdmhSb3RhdGlvbikuCisgICAgICAgICAgICAgICAgc2V0RHVyYXRpb24odHJhbnNpdGlvbi5nZXREdXJhdGlvbihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcpKTsKKyAgICAgICAgdHJhbnNpdGlvbi5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcsIGNoYW5nZU91dCk7CisgICAgICAgIGNoYW5nZU91dC5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0Um90YXRpb24oMGYpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBBZGRpbmcKKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbUluID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChudWxsLCAicm90YXRpb25ZIiwgOTBmLCAwZikuCisgICAgICAgICAgICAgICAgc2V0RHVyYXRpb24odHJhbnNpdGlvbi5nZXREdXJhdGlvbihMYXlvdXRUcmFuc2l0aW9uLkFQUEVBUklORykpOworICAgICAgICB0cmFuc2l0aW9uLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQVBQRUFSSU5HLCBhbmltSW4pOworICAgICAgICBhbmltSW4uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uWSgwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFJlbW92aW5nCisgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW1PdXQgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG51bGwsICJyb3RhdGlvblgiLCAwZiwgOTBmKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HKSk7CisgICAgICAgIHRyYW5zaXRpb24uc2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5ESVNBUFBFQVJJTkcsIGFuaW1PdXQpOworICAgICAgICBhbmltSW4uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uWCgwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGlzdEZsaXBwZXIuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGlzdEZsaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2MwM2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MaXN0RmxpcHBlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc2Vla2luZyBjYXBhYmlsaXR5IG9mIFZhbHVlQW5pbWF0b3IuIFRoZSBTZWVrQmFyIGluIHRoZQorICogVUkgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uIFByZXNzaW5nIHRoZSBSdW4gYnV0dG9uIHdpbGwgcGxheSBmcm9tCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTGlzdEZsaXBwZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVSQVRJT04gPSAxNTAwOworICAgIHByaXZhdGUgU2Vla0JhciBtU2Vla0JhcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExJU1RfU1RSSU5HU19FTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiT25lIiwKKyAgICAgICAgICAgICJUd28iLAorICAgICAgICAgICAgIlRocmVlIiwKKyAgICAgICAgICAgICJGb3VyIiwKKyAgICAgICAgICAgICJGaXZlIiwKKyAgICAgICAgICAgICJTaXgiCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUX1NUUklOR1NfRlIgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIlVuIiwKKyAgICAgICAgICAgICJEZXV4IiwKKyAgICAgICAgICAgICJUcm9pcyIsCisgICAgICAgICAgICAiUXVhdHJlIiwKKyAgICAgICAgICAgICJMZSBGaXZlIiwKKyAgICAgICAgICAgICJTaXgiCisgICAgfTsKKworICAgIExpc3RWaWV3IG1FbmdsaXNoTGlzdDsKKyAgICBMaXN0VmlldyBtRnJlbmNoTGlzdDsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJvdGF0aW5nX2xpc3QpOworICAgICAgICAvL0ZyYW1lTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIG1FbmdsaXNoTGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdF9lbik7CisgICAgICAgIG1GcmVuY2hMaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0X2ZyKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBMaXN0VmlldworICAgICAgICBmaW5hbCBBcnJheUFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyRW4gPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgTElTVF9TVFJJTkdTX0VOKTsKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgTGlzdFZpZXcKKyAgICAgICAgZmluYWwgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlckZyID0gbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIExJU1RfU1RSSU5HU19GUik7CisKKyAgICAgICAgbUVuZ2xpc2hMaXN0LnNldEFkYXB0ZXIoYWRhcHRlckVuKTsKKyAgICAgICAgbUZyZW5jaExpc3Quc2V0QWRhcHRlcihhZGFwdGVyRnIpOworICAgICAgICBtRnJlbmNoTGlzdC5zZXRSb3RhdGlvblkoLTkwZik7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGZsaXBpdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBhY2NlbGVyYXRvciA9IG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgZGVjZWxlcmF0b3IgPSBuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgdm9pZCBmbGlwaXQoKSB7CisgICAgICAgIGZpbmFsIExpc3RWaWV3IHZpc2libGVMaXN0OworICAgICAgICBmaW5hbCBMaXN0VmlldyBpbnZpc2libGVMaXN0OworICAgICAgICBpZiAobUVuZ2xpc2hMaXN0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgIHZpc2libGVMaXN0ID0gbUZyZW5jaExpc3Q7CisgICAgICAgICAgICBpbnZpc2libGVMaXN0ID0gbUVuZ2xpc2hMaXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52aXNpYmxlTGlzdCA9IG1GcmVuY2hMaXN0OworICAgICAgICAgICAgdmlzaWJsZUxpc3QgPSBtRW5nbGlzaExpc3Q7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgdmlzVG9JbnZpcyA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQodmlzaWJsZUxpc3QsICJyb3RhdGlvblkiLCAwZiwgOTBmKTsKKyAgICAgICAgdmlzVG9JbnZpcy5zZXREdXJhdGlvbig1MDApOworICAgICAgICB2aXNUb0ludmlzLnNldEludGVycG9sYXRvcihhY2NlbGVyYXRvcik7CisgICAgICAgIGZpbmFsIE9iamVjdEFuaW1hdG9yIGludmlzVG9WaXMgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGludmlzaWJsZUxpc3QsICJyb3RhdGlvblkiLAorICAgICAgICAgICAgICAgIC05MGYsIDBmKTsKKyAgICAgICAgaW52aXNUb1Zpcy5zZXREdXJhdGlvbig1MDApOworICAgICAgICBpbnZpc1RvVmlzLnNldEludGVycG9sYXRvcihkZWNlbGVyYXRvcik7CisgICAgICAgIHZpc1RvSW52aXMuYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgdmlzaWJsZUxpc3Quc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGludmlzVG9WaXMuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpbnZpc2libGVMaXN0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHZpc1RvSW52aXMuc3RhcnQoKTsKKyAgICB9CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9NdWx0aVByb3BlcnR5QW5pbWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhZjAzZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uKjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5Cb3VuY2VJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc2Vla2luZyBjYXBhYmlsaXR5IG9mIFZhbHVlQW5pbWF0b3IuIFRoZSBTZWVrQmFyIGluIHRoZQorICogVUkgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uIFByZXNzaW5nIHRoZSBSdW4gYnV0dG9uIHdpbGwgcGxheSBmcm9tCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEVVJBVElPTiA9IDE1MDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eSk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeUFuaW1hdGlvblZpZXcgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBCQUxMX1NJWkUgPSAxMDBmOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3JTZXQgYW5pbWF0aW9uID0gbnVsbDsKKyAgICAgICAgQW5pbWF0b3IgYm91bmNlQW5pbSA9IG51bGw7CisgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGFkZEJhbGwoNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgxNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgyNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgzNTAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChib3VuY2VBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTaGFwZUhvbGRlciBiYWxsOworICAgICAgICAgICAgICAgIGJhbGwgPSBiYWxscy5nZXQoMCk7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgeUJvdW5jZXIgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIEJBTExfU0laRSkuc2V0RHVyYXRpb24oRFVSQVRJT04pOworICAgICAgICAgICAgICAgIHlCb3VuY2VyLnNldEludGVycG9sYXRvcihuZXcgQm91bmNlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgICAgIHlCb3VuY2VyLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAgICAgYmFsbCA9IGJhbGxzLmdldCgxKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhZID0gUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgieSIsIGJhbGwuZ2V0WSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgLSBCQUxMX1NJWkUpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEFscGhhID0gUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgiYWxwaGEiLCAxLjBmLCAwZik7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgeUFscGhhQm91bmNlciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoYmFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2aFksIHB2aEFscGhhKS5zZXREdXJhdGlvbihEVVJBVElPTi8yKTsKKyAgICAgICAgICAgICAgICB5QWxwaGFCb3VuY2VyLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgICAgICB5QWxwaGFCb3VuY2VyLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgICAgIHlBbHBoYUJvdW5jZXIuc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworCisKKyAgICAgICAgICAgICAgICBiYWxsID0gYmFsbHMuZ2V0KDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFcgPSBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KCJ3aWR0aCIsIGJhbGwuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0V2lkdGgoKSAqIDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEggPSBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KCJoZWlnaHQiLCBiYWxsLmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFsbC5nZXRIZWlnaHQoKSAqIDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2VFggPSBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KCJ4IiwgYmFsbC5nZXRYKCksCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldFgoKSAtIEJBTExfU0laRS8yZik7CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZUWSA9IFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInkiLCBiYWxsLmdldFkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpIC0gQkFMTF9TSVpFLzJmKTsKKyAgICAgICAgICAgICAgICBPYmplY3RBbmltYXRvciB3aHh5Qm91bmNlciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoYmFsbCwgcHZoVywgcHZoSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2VFgsIHB2VFkpLnNldER1cmF0aW9uKERVUkFUSU9OLzIpOworICAgICAgICAgICAgICAgIHdoeHlCb3VuY2VyLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgICAgIHdoeHlCb3VuY2VyLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKworICAgICAgICAgICAgICAgIGJhbGwgPSBiYWxscy5nZXQoMyk7CisgICAgICAgICAgICAgICAgcHZoWSA9IFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInkiLCBiYWxsLmdldFkoKSwgZ2V0SGVpZ2h0KCkgLSBCQUxMX1NJWkUpOworICAgICAgICAgICAgICAgIGZsb2F0IGJhbGxYID0gYmFsbC5nZXRYKCk7CisgICAgICAgICAgICAgICAgS2V5ZnJhbWUga2YwID0gS2V5ZnJhbWUub2ZGbG9hdCgwZiwgYmFsbFgpOworICAgICAgICAgICAgICAgIEtleWZyYW1lIGtmMSA9IEtleWZyYW1lLm9mRmxvYXQoLjVmLCBiYWxsWCArIDEwMGYpOworICAgICAgICAgICAgICAgIEtleWZyYW1lIGtmMiA9IEtleWZyYW1lLm9mRmxvYXQoMWYsIGJhbGxYICsgNTBmKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhYID0gUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZLZXlmcmFtZSgieCIsIGtmMCwga2YxLCBrZjIpOworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHl4Qm91bmNlciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoYmFsbCwgcHZoWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2aFgpLnNldER1cmF0aW9uKERVUkFUSU9OLzIpOworICAgICAgICAgICAgICAgIHl4Qm91bmNlci5zZXRSZXBlYXRDb3VudCgxKTsKKyAgICAgICAgICAgICAgICB5eEJvdW5jZXIuc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworCisKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICAgICAgKChBbmltYXRvclNldClib3VuY2VBbmltKS5wbGF5VG9nZXRoZXIoeUJvdW5jZXIsIHlBbHBoYUJvdW5jZXIsIHdoeHlCb3VuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgeXhCb3VuY2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGFkZEJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoQkFMTF9TSVpFLCBCQUxMX1NJWkUpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHgpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5KTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICBiYWxscy5hZGQoc2hhcGVIb2xkZXIpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmb3IgKFNoYXBlSG9sZGVyIGJhbGwgOiBiYWxscykgeworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWJhbGwuZ2V0WCgpLCAtYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vUmV2ZXJzaW5nQW5pbWF0aW9uLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1JldmVyc2luZ0FuaW1hdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YWY2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1JldmVyc2luZ0FuaW1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworcHVibGljIGNsYXNzIFJldmVyc2luZ0FuaW1hdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYW5pbWF0aW9uX3JldmVyc2luZyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgQnV0dG9uIHJldmVyc2VyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQucmV2ZXJzZUJ1dHRvbik7CisgICAgICAgIHJldmVyc2VyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnJldmVyc2VBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBWYWx1ZUFuaW1hdG9yIGJvdW5jZUFuaW0gPSBudWxsOworICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBiYWxsID0gY3JlYXRlQmFsbCgyNSwgMjUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChib3VuY2VBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsLCAieSIsIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIDUwZikuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXREdXJhdGlvbigxNTAwKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigyZikpOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmV2ZXJzZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5yZXZlcnNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgc2Vla1RpbWUpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zZXRDdXJyZW50UGxheVRpbWUoc2Vla1RpbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBjcmVhdGVCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIE92YWxTaGFwZSBjaXJjbGUgPSBuZXcgT3ZhbFNoYXBlKCk7CisgICAgICAgICAgICBjaXJjbGUucmVzaXplKDUwZiwgNTBmKTsKKyAgICAgICAgICAgIFNoYXBlRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgU2hhcGVEcmF3YWJsZShjaXJjbGUpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBuZXcgU2hhcGVIb2xkZXIoZHJhd2FibGUpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WCh4IC0gMjVmKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFkoeSAtIDI1Zik7CisgICAgICAgICAgICBpbnQgcmVkID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgZ3JlZW4gPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBibHVlID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSAweGZmMDAwMDAwIHwgcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICBQYWludCBwYWludCA9IGRyYXdhYmxlLmdldFBhaW50KCk7IC8vbmV3IFBhaW50KFBhaW50LkFOVElfQUxJQVNfRkxBRyk7CisgICAgICAgICAgICBpbnQgZGFya0NvbG9yID0gMHhmZjAwMDAwMCB8IHJlZC80IDw8IDE2IHwgZ3JlZW4vNCA8PCA4IHwgYmx1ZS80OworICAgICAgICAgICAgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQgPSBuZXcgUmFkaWFsR3JhZGllbnQoMzcuNWYsIDEyLjVmLAorICAgICAgICAgICAgICAgICAgICA1MGYsIGNvbG9yLCBkYXJrQ29sb3IsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBwYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0UGFpbnQocGFpbnQpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShiYWxsLmdldFgoKSwgYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgYmFsbC5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9TaGFwZUhvbGRlci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9TaGFwZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjg4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1NoYXBlSG9sZGVyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQSBkYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGRzIGEgU2hhcGUgYW5kIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZQorICogaG93IHRoZSBzaGFwZSBpcyBkcmF3bi4KKyAqLworcHVibGljIGNsYXNzIFNoYXBlSG9sZGVyIHsKKyAgICBwcml2YXRlIGZsb2F0IHggPSAwLCB5ID0gMDsKKyAgICBwcml2YXRlIFNoYXBlRHJhd2FibGUgc2hhcGU7CisgICAgcHJpdmF0ZSBpbnQgY29sb3I7CisgICAgcHJpdmF0ZSBSYWRpYWxHcmFkaWVudCBncmFkaWVudDsKKyAgICBwcml2YXRlIGZsb2F0IGFscGhhID0gMWY7CisgICAgcHJpdmF0ZSBQYWludCBwYWludDsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhaW50KFBhaW50IHZhbHVlKSB7CisgICAgICAgIHBhaW50ID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBQYWludCBnZXRQYWludCgpIHsKKyAgICAgICAgcmV0dXJuIHBhaW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFgoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgeCA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgZmxvYXQgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFkoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgeSA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgZmxvYXQgZ2V0WSgpIHsKKyAgICAgICAgcmV0dXJuIHk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFNoYXBlKFNoYXBlRHJhd2FibGUgdmFsdWUpIHsKKyAgICAgICAgc2hhcGUgPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIFNoYXBlRHJhd2FibGUgZ2V0U2hhcGUoKSB7CisgICAgICAgIHJldHVybiBzaGFwZTsKKyAgICB9CisgICAgcHVibGljIGludCBnZXRDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgdmFsdWUpIHsKKyAgICAgICAgY29sb3IgPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0R3JhZGllbnQoUmFkaWFsR3JhZGllbnQgdmFsdWUpIHsKKyAgICAgICAgZ3JhZGllbnQgPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIFJhZGlhbEdyYWRpZW50IGdldEdyYWRpZW50KCkgeworICAgICAgICByZXR1cm4gZ3JhZGllbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWxwaGEoZmxvYXQgYWxwaGEpIHsKKyAgICAgICAgdGhpcy5hbHBoYSA9IGFscGhhOworICAgICAgICBzaGFwZS5zZXRBbHBoYSgoaW50KSgoYWxwaGEgKiAyNTVmKSArIC41ZikpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIHNoYXBlLmdldFNoYXBlKCkuZ2V0V2lkdGgoKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoZmxvYXQgd2lkdGgpIHsKKyAgICAgICAgU2hhcGUgcyA9IHNoYXBlLmdldFNoYXBlKCk7CisgICAgICAgIHMucmVzaXplKHdpZHRoLCBzLmdldEhlaWdodCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gc2hhcGUuZ2V0U2hhcGUoKS5nZXRIZWlnaHQoKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGZsb2F0IGhlaWdodCkgeworICAgICAgICBTaGFwZSBzID0gc2hhcGUuZ2V0U2hhcGUoKTsKKyAgICAgICAgcy5yZXNpemUocy5nZXRXaWR0aCgpLCBoZWlnaHQpOworICAgIH0KKworICAgIHB1YmxpYyBTaGFwZUhvbGRlcihTaGFwZURyYXdhYmxlIHMpIHsKKyAgICAgICAgc2hhcGUgPSBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyRGlzcGxheU9wdGlvbnMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyRGlzcGxheU9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg1YzkxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJEaXNwbGF5T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKKworLyoqCisgKiBUaGlzIGRlbW8gc2hvd3MgaG93IHZhcmlvdXMgYWN0aW9uIGJhciBkaXNwbGF5IG9wdGlvbiBmbGFncyBjYW4gYmUgY29tYmluZWQgYW5kIHRoZWlyIGVmZmVjdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJEaXNwbGF5T3B0aW9ucyBleHRlbmRzIEFjdGl2aXR5CisgICAgICAgIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIsIEFjdGlvbkJhci5UYWJMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9ucyk7CisKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQudG9nZ2xlX2hvbWVfYXNfdXApLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQudG9nZ2xlX3Nob3dfaG9tZSkuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC50b2dnbGVfdXNlX2xvZ28pLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQudG9nZ2xlX3Nob3dfdGl0bGUpLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQudG9nZ2xlX3Nob3dfY3VzdG9tKS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnRvZ2dsZV9uYXZpZ2F0aW9uKS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmN5Y2xlX2N1c3RvbV9ncmF2aXR5KS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgbUN1c3RvbVZpZXcgPSBnZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQuYWN0aW9uX2Jhcl9kaXNwbGF5X29wdGlvbnNfY3VzdG9tLCBudWxsKTsKKyAgICAgICAgLy8gQ29uZmlndXJlIHNldmVyYWwgYWN0aW9uIGJhciBlbGVtZW50cyB0aGF0IHdpbGwgYmUgdG9nZ2xlZCBieSBkaXNwbGF5IG9wdGlvbnMuCisgICAgICAgIGZpbmFsIEFjdGlvbkJhciBiYXIgPSBnZXRBY3Rpb25CYXIoKTsKKyAgICAgICAgYmFyLnNldEN1c3RvbVZpZXcobUN1c3RvbVZpZXcsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkJhci5MYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOworCisgICAgICAgIGJhci5hZGRUYWIoYmFyLm5ld1RhYigpLnNldFRleHQoIlRhYiAxIikuc2V0VGFiTGlzdGVuZXIodGhpcykpOworICAgICAgICBiYXIuYWRkVGFiKGJhci5uZXdUYWIoKS5zZXRUZXh0KCJUYWIgMiIpLnNldFRhYkxpc3RlbmVyKHRoaXMpKTsKKyAgICAgICAgYmFyLmFkZFRhYihiYXIubmV3VGFiKCkuc2V0VGV4dCgiVGFiIDMiKS5zZXRUYWJMaXN0ZW5lcih0aGlzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShSLm1lbnUuZGlzcGxheV9vcHRpb25zX2FjdGlvbnMsIG1lbnUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBmaW5hbCBBY3Rpb25CYXIgYmFyID0gZ2V0QWN0aW9uQmFyKCk7CisgICAgICAgIGludCBmbGFncyA9IDA7CisgICAgICAgIHN3aXRjaCAodi5nZXRJZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQudG9nZ2xlX2hvbWVfYXNfdXA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBBY3Rpb25CYXIuRElTUExBWV9IT01FX0FTX1VQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSLmlkLnRvZ2dsZV9zaG93X2hvbWU6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0hPTUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFIuaWQudG9nZ2xlX3VzZV9sb2dvOgorICAgICAgICAgICAgICAgIGZsYWdzID0gQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR087CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFIuaWQudG9nZ2xlX3Nob3dfdGl0bGU6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBBY3Rpb25CYXIuRElTUExBWV9TSE9XX1RJVExFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSLmlkLnRvZ2dsZV9zaG93X2N1c3RvbToKKyAgICAgICAgICAgICAgICBmbGFncyA9IEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfQ1VTVE9NOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFIuaWQudG9nZ2xlX25hdmlnYXRpb246CisgICAgICAgICAgICAgICAgYmFyLnNldE5hdmlnYXRpb25Nb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgYmFyLmdldE5hdmlnYXRpb25Nb2RlKCkgPT0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5jeWNsZV9jdXN0b21fZ3Jhdml0eToKKyAgICAgICAgICAgICAgICBBY3Rpb25CYXIuTGF5b3V0UGFyYW1zIGxwID0gKEFjdGlvbkJhci5MYXlvdXRQYXJhbXMpIG1DdXN0b21WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIGludCBuZXdHcmF2aXR5ID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGxwLmdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5MRUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3R3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3R3Jhdml0eSA9IEdyYXZpdHkuUklHSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3R3Jhdml0eSA9IEdyYXZpdHkuTEVGVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gbHAuZ3Jhdml0eSAmIH5HcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLIHwgbmV3R3Jhdml0eTsKKyAgICAgICAgICAgICAgICBiYXIuc2V0Q3VzdG9tVmlldyhtQ3VzdG9tVmlldywgbHApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaGFuZ2UgPSBiYXIuZ2V0RGlzcGxheU9wdGlvbnMoKSBeIGZsYWdzOworICAgICAgICBiYXIuc2V0RGlzcGxheU9wdGlvbnMoY2hhbmdlLCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UYWJTZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UYWJVbnNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRhYlJlc2VsZWN0ZWQoVGFiIHRhYiwgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyTWVjaGFuaWNzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGlvbkJhck1lY2hhbmljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Nzk3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGlvbkJhck1lY2hhbmljcy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKKy8qKgorICogVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIGJhc2ljcyBvZiB0aGUgQWN0aW9uIEJhciBhbmQgaG93IGl0IGludGVyb3BlcmF0ZXMgd2l0aCB0aGUKKyAqIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gVGhpcyBkZW1vIGlzIGZvciBpbmZvcm1hdGl2ZSBwdXJwb3NlcyBvbmx5OyBzZWUgQWN0aW9uQmFyVXNhZ2UgZm9yCisgKiBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZSBBY3Rpb24gQmFyIGluIGEgbW9yZSBpZGlvbWF0aWMgbWFubmVyLgorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyTWVjaGFuaWNzIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBUaGUgQWN0aW9uIEJhciBpcyBhIHdpbmRvdyBmZWF0dXJlLiBUaGUgZmVhdHVyZSBtdXN0IGJlIHJlcXVlc3RlZAorICAgICAgICAvLyBiZWZvcmUgc2V0dGluZyBhIGNvbnRlbnQgdmlldy4gTm9ybWFsbHkgdGhpcyBpcyBzZXQgYXV0b21hdGljYWxseQorICAgICAgICAvLyBieSB5b3VyIEFjdGl2aXR5J3MgdGhlbWUgaW4geW91ciBtYW5pZmVzdC4gVGhlIHByb3ZpZGVkIHN5c3RlbQorICAgICAgICAvLyB0aGVtZSBUaGVtZS5XaXRoQWN0aW9uQmFyIGVuYWJsZXMgdGhpcyBmb3IgeW91LiBVc2UgaXQgYXMgeW91IHdvdWxkCisgICAgICAgIC8vIHVzZSBUaGVtZS5Ob1RpdGxlQmFyLiBZb3UgY2FuIGFkZCBhbiBBY3Rpb24gQmFyIHRvIHlvdXIgb3duIHRoZW1lcworICAgICAgICAvLyBieSBhZGRpbmcgdGhlIGVsZW1lbnQgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIC8vIHRvIHlvdXIgc3R5bGUgZGVmaW5pdGlvbi4KKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgLy8gTWVudSBpdGVtcyBkZWZhdWx0IHRvIG5ldmVyIHNob3cgaW4gdGhlIGFjdGlvbiBiYXIuIE9uIG1vc3QgZGV2aWNlcyB0aGlzIG1lYW5zCisgICAgICAgIC8vIHRoZXkgd2lsbCBzaG93IGluIHRoZSBzdGFuZGFyZCBvcHRpb25zIG1lbnUgcGFuZWwgd2hlbiB0aGUgbWVudSBidXR0b24gaXMgcHJlc3NlZC4KKyAgICAgICAgLy8gT24geGxhcmdlLXNjcmVlbiBkZXZpY2VzIGEgIk1vcmUiIGJ1dHRvbiB3aWxsIGFwcGVhciBpbiB0aGUgZmFyIHJpZ2h0IG9mIHRoZQorICAgICAgICAvLyBBY3Rpb24gQmFyIHRoYXQgd2lsbCBkaXNwbGF5IHJlbWFpbmluZyBpdGVtcyBpbiBhIGNhc2NhZGluZyBtZW51LgorICAgICAgICBtZW51LmFkZCgiTm9ybWFsIGl0ZW0iKTsKKworICAgICAgICBNZW51SXRlbSBhY3Rpb25JdGVtID0gbWVudS5hZGQoIkFjdGlvbiBCdXR0b24iKTsKKworICAgICAgICAvLyBJdGVtcyB0aGF0IHNob3cgYXMgYWN0aW9ucyBzaG91bGQgZmF2b3IgdGhlICJpZiByb29tIiBzZXR0aW5nLCB3aGljaCB3aWxsCisgICAgICAgIC8vIHByZXZlbnQgdG9vIG1hbnkgYnV0dG9ucyBmcm9tIGNyb3dkaW5nIHRoZSBiYXIuIEV4dHJhIGl0ZW1zIHdpbGwgc2hvdyBpbiB0aGUKKyAgICAgICAgLy8gb3ZlcmZsb3cgYXJlYS4KKyAgICAgICAgYWN0aW9uSXRlbS5zZXRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisKKyAgICAgICAgLy8gSXRlbXMgdGhhdCBzaG93IGFzIGFjdGlvbnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIGFuIGljb24uCisgICAgICAgIC8vIFRoZXNlIGljb25zIGFyZSBzaG93biB3aXRob3V0IGEgdGV4dCBkZXNjcmlwdGlvbiwgYW5kIHRoZXJlZm9yZSBzaG91bGQKKyAgICAgICAgLy8gYmUgc3VmZmljaWVudGx5IGRlc2NyaXB0aXZlIG9uIHRoZWlyIG93bi4KKyAgICAgICAgYWN0aW9uSXRlbS5zZXRJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5pY19tZW51X3NoYXJlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCAiU2VsZWN0ZWQgSXRlbTogIiArIGl0ZW0uZ2V0VGl0bGUoKSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyVGFicy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJUYWJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyOTRhNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyVGFicy5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGFjdGlvbiBiYXIgdGFicyBhbmQgaG93IHRoZXkgaW50ZXJhY3QKKyAqIHdpdGggb3RoZXIgYWN0aW9uIGJhciBmZWF0dXJlcy4KKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhclRhYnMgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjdGlvbl9iYXJfdGFicyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BZGRUYWIoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIEFjdGlvbkJhciBiYXIgPSBnZXRBY3Rpb25CYXIoKTsKKyAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gYmFyLmdldFRhYkNvdW50KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gIlRhYiAiICsgdGFiQ291bnQ7CisgICAgICAgIGJhci5hZGRUYWIoYmFyLm5ld1RhYigpCisgICAgICAgICAgICAgICAgLnNldFRleHQodGV4dCkKKyAgICAgICAgICAgICAgICAuc2V0VGFiTGlzdGVuZXIobmV3IFRhYkxpc3RlbmVyKG5ldyBUYWJDb250ZW50RnJhZ21lbnQodGV4dCkpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SZW1vdmVUYWIoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIEFjdGlvbkJhciBiYXIgPSBnZXRBY3Rpb25CYXIoKTsKKyAgICAgICAgYmFyLnJlbW92ZVRhYkF0KGJhci5nZXRUYWJDb3VudCgpIC0gMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25Ub2dnbGVUYWJzKFZpZXcgdikgeworICAgICAgICBmaW5hbCBBY3Rpb25CYXIgYmFyID0gZ2V0QWN0aW9uQmFyKCk7CisKKyAgICAgICAgaWYgKGJhci5nZXROYXZpZ2F0aW9uTW9kZSgpID09IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUykgeworICAgICAgICAgICAgYmFyLnNldE5hdmlnYXRpb25Nb2RlKEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICAgICAgYmFyLnNldERpc3BsYXlPcHRpb25zKEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUsIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFyLnNldE5hdmlnYXRpb25Nb2RlKEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUyk7CisgICAgICAgICAgICBiYXIuc2V0RGlzcGxheU9wdGlvbnMoMCwgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19USVRMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJlbW92ZUFsbFRhYnMoVmlldyB2KSB7CisgICAgICAgIGdldEFjdGlvbkJhcigpLnJlbW92ZUFsbFRhYnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFRhYkxpc3RlbmVyIHJlY2VpdmVzIGV2ZW50IGNhbGxiYWNrcyBmcm9tIHRoZSBhY3Rpb24gYmFyIGFzIHRhYnMKKyAgICAgKiBhcmUgZGVzZWxlY3RlZCwgc2VsZWN0ZWQsIGFuZCByZXNlbGVjdGVkLiBBIEZyYWdtZW50VHJhbnNhY3Rpb24KKyAgICAgKiBpcyBwcm92aWRlZCB0byBlYWNoIG9mIHRoZXNlIGNhbGxiYWNrczsgaWYgYW55IG9wZXJhdGlvbnMgYXJlIGFkZGVkCisgICAgICogdG8gaXQsIGl0IHdpbGwgYmUgY29tbWl0dGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bGwgdGFiIHN3aXRjaCBvcGVyYXRpb24uCisgICAgICogVGhpcyBsZXRzIHRhYiBzd2l0Y2hlcyBiZSBhdG9taWMgd2l0aG91dCB0aGUgYXBwIG5lZWRpbmcgdG8gdHJhY2sKKyAgICAgKiB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IHRhYnMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBUYWJMaXN0ZW5lciBpbXBsZW1lbnRzIEFjdGlvbkJhci5UYWJMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgVGFiQ29udGVudEZyYWdtZW50IG1GcmFnbWVudDsKKworICAgICAgICBwdWJsaWMgVGFiTGlzdGVuZXIoVGFiQ29udGVudEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblRhYlNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLmZyYWdtZW50X2NvbnRlbnQsIG1GcmFnbWVudCwgbUZyYWdtZW50LmdldFRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJVbnNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICAgICAgICAgIGZ0LnJlbW92ZShtRnJhZ21lbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVGFiUmVzZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChBY3Rpb25CYXJUYWJzLnRoaXMsICJSZXNlbGVjdGVkISIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRhYkNvbnRlbnRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRleHQ7CisKKyAgICAgICAgcHVibGljIFRhYkNvbnRlbnRGcmFnbWVudChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IGZyYWdWaWV3ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RhYl9jb250ZW50LCBjb250YWluZXIsIGZhbHNlKTsKKworICAgICAgICAgICAgVGV4dFZpZXcgdGV4dCA9IChUZXh0VmlldykgZnJhZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICB0ZXh0LnNldFRleHQobVRleHQpOworCisgICAgICAgICAgICByZXR1cm4gZnJhZ1ZpZXc7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyVXNhZ2UuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyVXNhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgwMDUwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJVc2FnZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyBpZGlvbWF0aWMgdXNhZ2Ugb2YgdGhlIEFjdGlvbiBCYXIuIFRoZSBkZWZhdWx0IEhvbmV5Y29tYiB0aGVtZQorICogaW5jbHVkZXMgdGhlIGFjdGlvbiBiYXIgYnkgZGVmYXVsdCBhbmQgYSBtZW51IHJlc291cmNlIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlCisgKiBtZW51IGRhdGEgaXRzZWxmLiBJZiB5b3UnZCBsaWtlIHRvIHNlZSBob3cgdGhlc2UgdGhpbmdzIHdvcmsgdW5kZXIgdGhlIGhvb2QsIHNlZQorICogQWN0aW9uQmFyTWVjaGFuaWNzLgorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyVXNhZ2UgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51LmFjdGlvbnMsIG1lbnUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCAiU2VsZWN0ZWQgSXRlbTogIiArIGl0ZW0uZ2V0VGl0bGUoKSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRoaXMgbWV0aG9kIGlzIHNwZWNpZmllZCBhcyBhbiBvbkNsaWNrIGhhbmRsZXIgaW4gdGhlIG1lbnUgeG1sIGFuZCB3aWxsCisgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIEFjdGl2aXR5J3Mgb25PcHRpb25zSXRlbVNlbGVjdGVkIG1ldGhvZC4KKyAgICAvLyBTZWUgcmVzL21lbnUvYWN0aW9ucy54bWwgZm9yIG1vcmUgaW5mby4KKyAgICBwdWJsaWMgdm9pZCBvblNlYXJjaChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJTZWFyY2hpbmcuLi4iLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RldmljZUFkbWluU2FtcGxlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RldmljZUFkbWluU2FtcGxlLmphdmEKaW5kZXggYjNmYzJmOS4uNTliYWVmYyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9EZXZpY2VBZG1pblNhbXBsZS5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGV2aWNlQWRtaW5TYW1wbGUuamF2YQpAQCAtNDIsNiArNDIsMTEgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyOwogCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuUHJveHk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogLyoqCiAgKiBFeGFtcGxlIG9mIGEgZG8tbm90aGluZyBhZG1pbiBjbGFzcy4gIFdoZW4gZW5hYmxlZCwgaXQgbGV0cyB5b3UgY29udHJvbAogICogc29tZSBvZiBpdHMgcG9saWN5IGFuZCByZXBvcnRzIHdoZW4gdGhlcmUgaXMgaW50ZXJlc3RpbmcgYWN0aXZpdHkuCkBAIC01NCw2ICs1OSwxMyBAQAogCiAgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX1FVQUxJVFkgPSAicGFzc3dvcmRfcXVhbGl0eSI7CiAgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX0xFTkdUSCA9ICJwYXNzd29yZF9sZW5ndGgiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xFVFRFUlMgPSAicGFzc3dvcmRfbWluaW11bV9sZXR0ZXJzIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9VUFBFUkNBU0UgPSAicGFzc3dvcmRfbWluaW11bV91cHBlcmNhc2UiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xPV0VSQ0FTRSA9ICJwYXNzd29yZF9taW5pbXVtX2xvd2VyY2FzZSI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX01JTklNVU1fTlVNRVJJQyA9ICJwYXNzd29yZF9taW5pbXVtX251bWVyaWMiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9NSU5JTVVNX1NZTUJPTFMgPSAicGFzc3dvcmRfbWluaW11bV9zeW1ib2xzIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OT05MRVRURVIgPSAicGFzc3dvcmRfbWluaW11bV9ub25sZXR0ZXIiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9ISVNUT1JZX0xFTkdUSCA9ICJwYXNzd29yZF9oaXN0b3J5X2xlbmd0aCI7CiAgICAgc3RhdGljIFN0cmluZyBQUkVGX01BWF9GQUlMRURfUFcgPSAibWF4X2ZhaWxlZF9wdyI7CiAKICAgICB2b2lkIHNob3dUb2FzdChDb250ZXh0IGNvbnRleHQsIENoYXJTZXF1ZW5jZSBtc2cpIHsKQEAgLTExNSwxMCArMTI3LDE4IEBACiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLAogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMsCiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQywKLSAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMsCisgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWAogICAgICAgICB9OwogICAgICAgICBTcGlubmVyIG1QYXNzd29yZFF1YWxpdHk7CiAgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZExlbmd0aDsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTWluaW11bUxldHRlcnM7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZE1pbmltdW1VcHBlcmNhc2U7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZE1pbmltdW1Mb3dlcmNhc2U7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZE1pbmltdW1OdW1lcmljOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRNaW5pbXVtU3ltYm9sczsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlcjsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkSGlzdG9yeUxlbmd0aDsKICAgICAgICAgQnV0dG9uIG1TZXRQYXNzd29yZEJ1dHRvbjsKIAogICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmQ7CkBAIC0xMzQsNiArMTU0LDEwIEBACiAKICAgICAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtVGltZW91dDsKIAorICAgICAgICBFZGl0VGV4dCBtUHJveHlIb3N0OworICAgICAgICBFZGl0VGV4dCBtUHJveHlMaXN0OworICAgICAgICBCdXR0b24gbVByb3h5QnV0dG9uOworCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwpAQCAtMTc5LDYgKzIwMyw5NyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTGV0dGVycyA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9taW5pbXVtX2xldHRlcnMpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxldHRlcnMuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1VcHBlcmNhc2UgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfbWluaW11bV91cHBlcmNhc2UpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZS5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkTWluaW11bVVwcGVyY2FzZShJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX21pbmltdW1fbG93ZXJjYXNlKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Mb3dlcmNhc2UuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZE1pbmltdW1Mb3dlcmNhc2UoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU51bWVyaWMgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfbWluaW11bV9udW1lcmljKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtU3ltYm9scyA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9taW5pbXVtX3N5bWJvbHMpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVN5bWJvbHMuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfbWluaW11bV9ub25sZXR0ZXIpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlci5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGguYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgbVNldFBhc3N3b3JkQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zZXRfcGFzc3dvcmQpOwogICAgICAgICAgICAgbVNldFBhc3N3b3JkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0UGFzc3dvcmRMaXN0ZW5lcik7CiAKQEAgLTIxNSw2ICszMzAsMTEgQEAKICAgICAgICAgICAgIG1UaW1lb3V0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC50aW1lb3V0KTsKICAgICAgICAgICAgIG1UaW1lb3V0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc2V0X3RpbWVvdXQpOwogICAgICAgICAgICAgbVRpbWVvdXRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXRUaW1lb3V0TGlzdGVuZXIpOworCisgICAgICAgICAgICBtUHJveHlIb3N0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wcm94eWhvc3QpOworICAgICAgICAgICAgbVByb3h5TGlzdCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucHJveHlsaXN0KTsKKyAgICAgICAgICAgIG1Qcm94eUJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnNldF9wcm94eSk7CisgICAgICAgICAgICBtUHJveHlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXRQcm94eUxpc3RlbmVyKTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgdXBkYXRlQnV0dG9uU3RhdGVzKCkgewpAQCAtMjI0LDYgKzM0NCwxMyBAQAogICAgICAgICAgICAgICAgIG1EaXNhYmxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkUXVhbGl0eS5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgICAgIG1QYXNzd29yZExlbmd0aC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Mb3dlcmNhc2Uuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtU3ltYm9scy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlci5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGguc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtUGFzc3dvcmQuc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtUmVzZXRQYXNzd29yZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwpAQCAtMjM1LDYgKzM2MiwxMyBAQAogICAgICAgICAgICAgICAgIG1EaXNhYmxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIG1QYXNzd29yZFF1YWxpdHkuc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkTGVuZ3RoLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1VcHBlcmNhc2Uuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxvd2VyY2FzZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtU3ltYm9scy5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTnVtZXJpYy5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGguc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVNldFBhc3N3b3JkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIG1QYXNzd29yZC5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICBtUmVzZXRQYXNzd29yZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKQEAgLTI0OSw2ICszODMsMTMgQEAKICAgICAgICAgICAgIGZpbmFsIGludCBwd1F1YWxpdHkgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9RVUFMSVRZLAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpOwogICAgICAgICAgICAgZmluYWwgaW50IHB3TGVuZ3RoID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTEVOR1RILCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbkxldHRlcnMgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xFVFRFUlMsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluVXBwZXJjYXNlID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9VUFBFUkNBU0UsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluTG93ZXJjYXNlID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MT1dFUkNBU0UsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluTnVtZXJpYyA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTlVNRVJJQywgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5TeW1ib2xzID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9TWU1CT0xTLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbk5vbkxldHRlciA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTk9OTEVUVEVSLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd0hpc3RvcnlMZW5ndGggPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9ISVNUT1JZX0xFTkdUSCwgMCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgbWF4RmFpbGVkUHcgPSBwcmVmcy5nZXRJbnQoUFJFRl9NQVhfRkFJTEVEX1BXLCAwKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1QYXNzd29yZFF1YWxpdHlWYWx1ZXMubGVuZ3RoOyBpKyspIHsKQEAgLTI1Nyw2ICszOTgsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGFzc3dvcmRMZW5ndGguc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TGVuZ3RoKSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTGV0dGVycy5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcocHdNaW5MZXR0ZXJzKSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pblVwcGVyY2FzZSkpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxvd2VyY2FzZS5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcocHdNaW5Mb3dlcmNhc2UpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1TeW1ib2xzLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pblN5bWJvbHMpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pbk51bWVyaWMpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluTm9uTGV0dGVyKSk7CisgICAgICAgICAgICBtUGFzc3dvcmRIaXN0b3J5TGVuZ3RoLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd0hpc3RvcnlMZW5ndGgpKTsKICAgICAgICAgICAgIG1NYXhGYWlsZWRQdy5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobWF4RmFpbGVkUHcpKTsKICAgICAgICAgfQogCkBAIC0yNjUsMTIgKzQxMywyNiBAQAogICAgICAgICAgICAgZmluYWwgaW50IHB3UXVhbGl0eSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX1FVQUxJVFksCiAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgcHdMZW5ndGggPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9MRU5HVEgsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluTGV0dGVycyA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTEVUVEVSUywgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5VcHBlcmNhc2UgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX1VQUEVSQ0FTRSwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5Mb3dlcmNhc2UgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xPV0VSQ0FTRSwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5OdW1lcmljID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OVU1FUklDLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pblN5bWJvbHMgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX1NZTUJPTFMsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluTm9uTGV0dGVyID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OT05MRVRURVIsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3SGlzdG9yeUxlbmd0aCA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX0hJU1RPUllfTEVOR1RILCAwKTsKICAgICAgICAgICAgIGZpbmFsIGludCBtYXhGYWlsZWRQdyA9IHByZWZzLmdldEludChQUkVGX01BWF9GQUlMRURfUFcsIDApOwogCiAgICAgICAgICAgICBib29sZWFuIGFjdGl2ZSA9IG1EUE0uaXNBZG1pbkFjdGl2ZShtRGV2aWNlQWRtaW5TYW1wbGUpOwogICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRRdWFsaXR5KG1EZXZpY2VBZG1pblNhbXBsZSwgcHdRdWFsaXR5KTsKICAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bUxlbmd0aChtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMobURldmljZUFkbWluU2FtcGxlLCBwd01pbkxldHRlcnMpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdNaW5VcHBlcmNhc2UpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdNaW5Mb3dlcmNhc2UpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TWluTnVtZXJpYyk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdNaW5TeW1ib2xzKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TWluTm9uTGV0dGVyKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChtRGV2aWNlQWRtaW5TYW1wbGUsIHB3SGlzdG9yeUxlbmd0aCk7CiAgICAgICAgICAgICAgICAgbURQTS5zZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShtRGV2aWNlQWRtaW5TYW1wbGUsIG1heEZhaWxlZFB3KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjg3LDYgKzQ0OSw0OCBAQAogICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNhbXBsZVByZWZlcmVuY2VzKHRoaXMpOworICAgICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTEVUVEVSUywgbGVuZ3RoKS5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBvbGljaWVzKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyY2FzZShpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNhbXBsZVByZWZlcmVuY2VzKHRoaXMpOworICAgICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fVVBQRVJDQVNFLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MT1dFUkNBU0UsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OVU1FUklDLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNhbXBsZVByZWZlcmVuY2VzKHRoaXMpOworICAgICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fU1lNQk9MUywgbGVuZ3RoKS5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBvbGljaWVzKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNhbXBsZVByZWZlcmVuY2VzKHRoaXMpOworICAgICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTk9OTEVUVEVSLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfSElTVE9SWV9MRU5HVEgsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKICAgICAgICAgdm9pZCBzZXRNYXhGYWlsZWRQdyhpbnQgbGVuZ3RoKSB7CiAgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNhbXBsZVByZWZlcmVuY2VzKHRoaXMpOwogICAgICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEludChQUkVGX01BWF9GQUlMRURfUFcsIGxlbmd0aCkuY29tbWl0KCk7CkBAIC00MzcsNSArNjQxLDQ5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1TZXRQcm94eUxpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFjdGl2ZSA9IG1EUE0uaXNBZG1pbkFjdGl2ZShtRGV2aWNlQWRtaW5TYW1wbGUpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eVNwZWMgPSBtUHJveHlIb3N0LmdldFRleHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eUxpc3QgPSBtUHJveHlMaXN0LmdldFRleHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIFByb3h5IGluc3RQcm94eTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhjbExpc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAoKHByb3h5U3BlYy5sZW5ndGgoKSA9PSAwKSB8fCAocHJveHlTcGVjID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RQcm94eSA9IFByb3h5Lk5PX1BST1hZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb3h5Q29tcG9uZW50cyA9IHByb3h5U3BlYy5zcGxpdCgiOiIpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJveHlDb21wb25lbnRzLmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChDb250cm9sbGVyLnRoaXMsICJXcm9uZyBwcm94eSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluc3RQcm94eSA9IG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKHByb3h5Q29tcG9uZW50c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocHJveHlDb21wb25lbnRzWzFdKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHByb3h5TGlzdCA9PSBudWxsKSB8fCAocHJveHlMaXN0Lmxlbmd0aCgpID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2xMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBsaXN0RG9tcyA9IHByb3h5TGlzdC5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdERvbXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KENvbnRyb2xsZXIudGhpcywgIldyb25nIGV4Y2x1c2lvbiBsaXN0IGZvcm1hdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGNsTGlzdCA9ICBBcnJheXMuYXNMaXN0KGxpc3REb21zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBtRFBNLnNldEdsb2JhbFByb3h5KG1EZXZpY2VBZG1pblNhbXBsZSwgaW5zdFByb3h5LCBleGNsTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgcHJveHlBZG1pbiA9IG1EUE0uZ2V0R2xvYmFsUHJveHlBZG1pbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3h5QWRtaW4gIT0gbnVsbCkgJiYgKHByb3h5QWRtaW4uZXF1YWxzKG1EZXZpY2VBZG1pblNhbXBsZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChDb250cm9sbGVyLnRoaXMsICJHbG9iYWwgUHJveHkgc2V0IGJ5IGRldmljZSBhZG1pbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbGVydERpYWxvZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmOTczMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbGVydERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBjbGFzcyBGcmFnbWVudEFsZXJ0RGlhbG9nIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9kaWFsb2cpOworCisgICAgICAgIFZpZXcgdHYgPSBmaW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgKChUZXh0Vmlldyl0dikuc2V0VGV4dCgiRXhhbXBsZSBvZiBkaXNwbGF5aW5nIGFuIGFsZXJ0IGRpYWxvZyB3aXRoIGEgRGlhbG9nRnJhZ21lbnQiKTsKKworICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc2hvdyk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgc2hvd0RpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShhY3Rpdml0eSkKKyAgICB2b2lkIHNob3dEaWFsb2coKSB7CisgICAgICAgIERpYWxvZ0ZyYWdtZW50IG5ld0ZyYWdtZW50ID0gTXlBbGVydERpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ190d29fYnV0dG9uc190aXRsZSk7CisgICAgICAgIG5ld0ZyYWdtZW50LnNob3coZ2V0RnJhZ21lbnRNYW5hZ2VyKCksICJkaWFsb2ciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc2l0aXZlQ2xpY2soKSB7CisgICAgICAgIC8vIERvIHN0dWZmIGhlcmUuCisgICAgICAgIExvZy5pKCJGcmFnbWVudEFsZXJ0RGlhbG9nIiwgIlBvc2l0aXZlIGNsaWNrISIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb05lZ2F0aXZlQ2xpY2soKSB7CisgICAgICAgIC8vIERvIHN0dWZmIGhlcmUuCisgICAgICAgIExvZy5pKCJGcmFnbWVudEFsZXJ0RGlhbG9nIiwgIk5lZ2F0aXZlIGNsaWNrISIpOworICAgIH0KKy8vRU5EX0lOQ0xVREUoYWN0aXZpdHkpCisgICAgCisvL0JFR0lOX0lOQ0xVREUoZGlhbG9nKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlBbGVydERpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTXlBbGVydERpYWxvZ0ZyYWdtZW50IG5ld0luc3RhbmNlKGludCB0aXRsZSkgeworICAgICAgICAgICAgTXlBbGVydERpYWxvZ0ZyYWdtZW50IGZyYWcgPSBuZXcgTXlBbGVydERpYWxvZ0ZyYWdtZW50KCk7CisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3MucHV0SW50KCJ0aXRsZSIsIHRpdGxlKTsKKyAgICAgICAgICAgIGZyYWcuc2V0QXJndW1lbnRzKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIGZyYWc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIGludCB0aXRsZSA9IGdldEFyZ3VtZW50cygpLmdldEludCgidGl0bGUiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGdldEFjdGl2aXR5KCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFIuZHJhd2FibGUuYWxlcnRfZGlhbG9nX2ljb24pCisgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZSh0aXRsZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ19vaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRnJhZ21lbnRBbGVydERpYWxvZylnZXRBY3Rpdml0eSgpKS5kb1Bvc2l0aXZlQ2xpY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgLnNldE5lZ2F0aXZlQnV0dG9uKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ19jYW5jZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaEJ1dHRvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZyYWdtZW50QWxlcnREaWFsb2cpZ2V0QWN0aXZpdHkoKSkuZG9OZWdhdGl2ZUNsaWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZGlhbG9nKQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFuaW0uamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbmltLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzNDVhMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbmltLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgYW5pbWF0aW9ucyB3aGVuIGNoYW5naW5nIGZyYWdtZW50IHN0YXRlcy4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50QW5pbSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZnJhZ21lbnRfYW5pbSk7CisKKyAgICAgICAgYWRkU2hvd0hpZGVMaXN0ZW5lcihSLmlkLmZyYWcxaGlkZSwgZmluZEZyYWdtZW50QnlJZChSLmlkLmZyYWdtZW50MSkpOworICAgICAgICBhZGRTaG93SGlkZUxpc3RlbmVyKFIuaWQuZnJhZzJoaWRlLCBmaW5kRnJhZ21lbnRCeUlkKFIuaWQuZnJhZ21lbnQyKSk7CisgICAgfQorCisgICAgdm9pZCBhZGRTaG93SGlkZUxpc3RlbmVyKGludCBidXR0b25JZCwgZmluYWwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGJ1dHRvbklkKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gb3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBmdC5zZXRDdXN0b21BbmltYXRpb25zKGFuZHJvaWQuUi5hbmltLmFuaW1hdG9yX2ZhZGVfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuYW5pbS5hbmltYXRvcl9mYWRlX291dCk7CisgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LmlzSGlkZGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50QW5pbS50aGlzLCBhbmRyb2lkLlIuYW5pbS5zbGlkZV9pbl9sZWZ0KSk7CisgICAgICAgICAgICAgICAgICAgIGZ0LnNob3coZnJhZ21lbnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudEFuaW0udGhpcywgYW5kcm9pZC5SLmFuaW0uc2xpZGVfb3V0X3JpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGZ0LmhpZGUoZnJhZ21lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaXJzdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICBUZXh0VmlldyBtVGV4dFZpZXc7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmxhYmVsZWRfdGV4dF9lZGl0LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm1zZyk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJUaGUgZnJhZ21lbnQgc2F2ZXMgYW5kIHJlc3RvcmVzIHRoaXMgdGV4dC4iKTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRleHQgZWRpdG9yLCBhbmQgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZSBpZiBuZWVkZWQuCisgICAgICAgICAgICBtVGV4dFZpZXcgPSAoVGV4dFZpZXcpdi5maW5kVmlld0J5SWQoUi5pZC5zYXZlZCk7CisgICAgICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Q2hhclNlcXVlbmNlKCJ0ZXh0IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworCisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY3VycmVudCB0ZXh0LCB0byByZXN0b3JlIGlmIHdlIGxhdGVyIHJlc3RhcnQuCisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRDaGFyU2VxdWVuY2UoInRleHQiLCBtVGV4dFZpZXcuZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmxhYmVsZWRfdGV4dF9lZGl0LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm1zZyk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJUaGUgVGV4dFZpZXcgc2F2ZXMgYW5kIHJlc3RvcmVzIHRoaXMgdGV4dC4iKTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRleHQgZWRpdG9yIGFuZCB0ZWxsIGl0IHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzIHN0YXRlLgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHlvdSB3aWxsIG9mdGVuIHNldCB0aGlzIGluIHRoZSBsYXlvdXQgWE1MLCBidXQgc2luY2UKKyAgICAgICAgICAgIC8vIHdlIGFyZSBzaGFyaW5nIG91ciBsYXlvdXQgd2l0aCB0aGUgb3RoZXIgZnJhZ21lbnQgd2Ugd2lsbCBjdXN0b21pemUKKyAgICAgICAgICAgIC8vIGl0IGhlcmUuCisgICAgICAgICAgICAoKFRleHRWaWV3KXYuZmluZFZpZXdCeUlkKFIuaWQuc2F2ZWQpKS5zZXRTYXZlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudENvbnRleHRNZW51LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVmN2EwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudENvbnRleHRNZW51LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiBkaXNwbGF5aW5nIGEgY29udGV4dCBtZW51IGZyb20gYSBmcmFnbWVudC4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50Q29udGV4dE1lbnUgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZyYWdtZW50IGFuZCBhZGQgaXQgYXMgb3VyIHNvbGUgY29udGVudC4KKyAgICAgICAgQ29udGV4dE1lbnVGcmFnbWVudCBjb250ZW50ID0gbmV3IENvbnRleHRNZW51RnJhZ21lbnQoKTsKKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBjb250ZW50KS5jb21taXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRleHRNZW51RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHJvb3QgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X2NvbnRleHRfbWVudSwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICByZWdpc3RlckZvckNvbnRleHRNZW51KHJvb3QuZmluZFZpZXdCeUlkKFIuaWQubG9uZ19wcmVzcykpOworICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgICAgICAgICBtZW51LmFkZChNZW51Lk5PTkUsIFIuaWQuYV9pdGVtLCBNZW51Lk5PTkUsICJNZW51IEEiKTsKKyAgICAgICAgICAgIG1lbnUuYWRkKE1lbnUuTk9ORSwgUi5pZC5iX2l0ZW0sIE1lbnUuTk9ORSwgIk1lbnUgQiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuYV9pdGVtOgorICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQ29udGV4dE1lbnUiLCAiSXRlbSAxYSB3YXMgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5iX2l0ZW06CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJDb250ZXh0TWVudSIsICJJdGVtIDFiIHdhcyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMmVmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEZyYWdtZW50RGlhbG9nIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIGludCBtU3RhY2tMZXZlbCA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZyk7CisKKyAgICAgICAgVmlldyB0diA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJFeGFtcGxlIG9mIGRpc3BsYXlpbmcgZGlhbG9ncyB3aXRoIGEgRGlhbG9nRnJhZ21lbnQuICAiCisgICAgICAgICAgICAgICAgKyAiUHJlc3MgdGhlIHNob3cgYnV0dG9uIGJlbG93IHRvIHNlZSB0aGUgZmlyc3QgZGlhbG9nOyBwcmVzc2luZyAiCisgICAgICAgICAgICAgICAgKyAic3VjY2Vzc2l2ZSBzaG93IGJ1dHRvbnMgd2lsbCBkaXNwbGF5IG90aGVyIGRpYWxvZyBzdHlsZXMgYXMgYSAiCisgICAgICAgICAgICAgICAgKyAic3RhY2ssIHdpdGggZGlzbWlzc2luZyBvciBiYWNrIGdvaW5nIHRvIHRoZSBwcmV2aW91cyBkaWFsb2cuIik7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNob3cpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNob3dEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3RhY2tMZXZlbCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoImxldmVsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJsZXZlbCIsIG1TdGFja0xldmVsKTsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShhZGRfZGlhbG9nKQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgbVN0YWNrTGV2ZWwrKzsKKworICAgICAgICAvLyBEaWFsb2dGcmFnbWVudC5zaG93KCkgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIHRoZSBmcmFnbWVudAorICAgICAgICAvLyBpbiBhIHRyYW5zYWN0aW9uLiAgV2UgYWxzbyB3YW50IHRvIHJlbW92ZSBhbnkgY3VycmVudGx5IHNob3dpbmcKKyAgICAgICAgLy8gZGlhbG9nLCBzbyBtYWtlIG91ciBvd24gdHJhbnNhY3Rpb24gYW5kIHRha2UgY2FyZSBvZiB0aGF0IGhlcmUuCisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgRnJhZ21lbnQgcHJldiA9IGdldEZyYWdtZW50TWFuYWdlcigpLmZpbmRGcmFnbWVudEJ5VGFnKCJkaWFsb2ciKTsKKyAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkgeworICAgICAgICAgICAgZnQucmVtb3ZlKHByZXYpOworICAgICAgICB9CisgICAgICAgIGZ0LmFkZFRvQmFja1N0YWNrKG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgc2hvdyB0aGUgZGlhbG9nLgorICAgICAgICBEaWFsb2dGcmFnbWVudCBuZXdGcmFnbWVudCA9IE15RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UobVN0YWNrTGV2ZWwpOworICAgICAgICBuZXdGcmFnbWVudC5zaG93KGZ0LCAiZGlhbG9nIik7CisgICAgfQorLy9FTkRfSU5DTFVERShhZGRfZGlhbG9nKQorCisgICAgc3RhdGljIFN0cmluZyBnZXROYW1lRm9yTnVtKGludCBudW0pIHsKKyAgICAgICAgc3dpdGNoICgobnVtLTEpJTYpIHsKKyAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuICJTVFlMRV9OT19USVRMRSI7CisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiAiU1RZTEVfTk9fRlJBTUUiOworICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gIlNUWUxFX05PX0lOUFVUICh0aGlzIHdpbmRvdyBjYW4ndCByZWNlaXZlIGlucHV0LCBzbyAiCisgICAgICAgICAgICAgICAgICAgICsgInlvdSB3aWxsIG5lZWQgdG8gcHJlc3MgdGhlIGJvdHRvbSBzaG93IGJ1dHRvbikiOworICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gIlNUWUxFX05PUk1BTCB3aXRoIGxpZ2h0IGZ1bGxzY3JlZW4gdGhlbWUiOworICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gIlNUWUxFX05PUk1BTCB3aXRoIGRhcmsgZnVsbHNjcmVlbiB0aGVtZSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJTVFlMRV9OT1JNQUwiOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGRpYWxvZykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7CisgICAgICAgIGludCBtTnVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgTXlEaWFsb2dGcmFnbWVudCwgcHJvdmlkaW5nICJudW0iCisgICAgICAgICAqIGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIE15RGlhbG9nRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IG51bSkgeworICAgICAgICAgICAgTXlEaWFsb2dGcmFnbWVudCBmID0gbmV3IE15RGlhbG9nRnJhZ21lbnQoKTsKKworICAgICAgICAgICAgLy8gU3VwcGx5IG51bSBpbnB1dCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoIm51bSIsIG51bSk7CisgICAgICAgICAgICBmLnNldEFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgbU51bSA9IGdldEFyZ3VtZW50cygpLmdldEludCgibnVtIik7CisKKyAgICAgICAgICAgIC8vIFBpY2sgYSBzdHlsZSBiYXNlZCBvbiB0aGUgbnVtLgorICAgICAgICAgICAgaW50IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9STUFMLCB0aGVtZSA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKChtTnVtLTEpJTYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9fVElUTEU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT19GUkFNRTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiBzdHlsZSA9IERpYWxvZ0ZyYWdtZW50LlNUWUxFX05PX0lOUFVUOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9STUFMOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9STUFMOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoKG1OdW0tMSklNikgeworICAgICAgICAgICAgICAgIGNhc2UgNDogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfTGlnaHQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWU7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U3R5bGUoc3R5bGUsIHRoZW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5mcmFnbWVudF9kaWFsb2csIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJEaWFsb2cgIyIgKyBtTnVtICsgIjogdXNpbmcgc3R5bGUgIgorICAgICAgICAgICAgICAgICAgICArIGdldE5hbWVGb3JOdW0obU51bSkpOworCisgICAgICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKXYuZmluZFZpZXdCeUlkKFIuaWQuc2hvdyk7CisgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBidXR0b24gaXMgY2xpY2tlZCwgY2FsbCB1cCB0byBvd25pbmcgYWN0aXZpdHkuCisgICAgICAgICAgICAgICAgICAgICgoRnJhZ21lbnREaWFsb2cpZ2V0QWN0aXZpdHkoKSkuc2hvd0RpYWxvZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZGlhbG9nKQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkMmMwMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5KTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LXRpbWUgaW5pdDsgY3JlYXRlIGZyYWdtZW50IHRvIGVtYmVkIGluIGFjdGl2aXR5LgorLy9CRUdJTl9JTkNMVURFKGVtYmVkKQorICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeURpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBmdC5hZGQoUi5pZC5lbWJlZGRlZCwgbmV3RnJhZ21lbnQpOworICAgICAgICAgICAgZnQuY29tbWl0KCk7CisvL0VORF9JTkNMVURFKGVtYmVkKQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNob3dfZGlhbG9nKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKHNob3dfZGlhbG9nKQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFnbWVudCBhbmQgc2hvdyBpdCBhcyBhIGRpYWxvZy4KKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeURpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIG5ld0ZyYWdtZW50LnNob3coZ2V0RnJhZ21lbnRNYW5hZ2VyKCksICJkaWFsb2ciKTsKKyAgICB9CisvL0VORF9JTkNMVURFKHNob3dfZGlhbG9nKQorCisvL0JFR0lOX0lOQ0xVREUoZGlhbG9nKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKyAgICAgICAgc3RhdGljIE15RGlhbG9nRnJhZ21lbnQgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15RGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5oZWxsb193b3JsZCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIlRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgTXlEaWFsb2dGcmFnbWVudCIpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRpYWxvZykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMYXlvdXQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjM2ODVlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlNoYWtlc3BlYXJlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiB1c2luZyBmcmFnbWVudHMgdG8gaW1wbGVtZW50IGRpZmZlcmVudCBhY3Rpdml0eSBsYXlvdXRzLgorICogVGhpcyBzYW1wbGUgcHJvdmlkZXMgYSBkaWZmZXJlbnQgbGF5b3V0IChhbmQgYWN0aXZpdHkgZmxvdykgd2hlbiBydW4gaW4KKyAqIGxhbmRzY2FwZS4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50TGF5b3V0IGV4dGVuZHMgQWN0aXZpdHkgeworCisvL0JFR0lOX0lOQ0xVREUobWFpbikKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9sYXlvdXQpOworICAgIH0KKy8vRU5EX0lOQ0xVREUobWFpbikKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBzZWNvbmRhcnkgYWN0aXZpdHksIHRvIHNob3cgd2hhdCB0aGUgdXNlciBoYXMgc2VsZWN0ZWQKKyAgICAgKiB3aGVuIHRoZSBzY3JlZW4gaXMgbm90IGxhcmdlIGVub3VnaCB0byBzaG93IGl0IGFsbCBpbiBvbmUgYWN0aXZpdHkuCisgICAgICovCisvL0JFR0lOX0lOQ0xVREUoZGV0YWlsc19hY3Rpdml0eSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERldGFpbHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgaWYgKGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS5vcmllbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY3JlZW4gaXMgbm93IGluIGxhbmRzY2FwZSBtb2RlLCB3ZSBjYW4gc2hvdyB0aGUKKyAgICAgICAgICAgICAgICAvLyBkaWFsb2cgaW4tbGluZSB3aXRoIHRoZSBsaXN0IHNvIHdlIGRvbid0IG5lZWQgdGhpcyBhY3Rpdml0eS4KKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIER1cmluZyBpbml0aWFsIHNldHVwLCBwbHVnIGluIHRoZSBkZXRhaWxzIGZyYWdtZW50LgorICAgICAgICAgICAgICAgIERldGFpbHNGcmFnbWVudCBkZXRhaWxzID0gbmV3IERldGFpbHNGcmFnbWVudCgpOworICAgICAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpLmFkZChhbmRyb2lkLlIuaWQuY29udGVudCwgZGV0YWlscykuY29tbWl0KCk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5zZXRUZXh0KGdldEludGVudCgpLmdldEludEV4dHJhKCJ0ZXh0IiwgLTEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZGV0YWlsc19hY3Rpdml0eSkKKworLy9CRUdJTl9JTkNMVURFKHRpdGxlcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRpdGxlc0ZyYWdtZW50IGV4dGVuZHMgTGlzdEZyYWdtZW50IHsKKyAgICAgICAgRGV0YWlsc0ZyYWdtZW50IG1EZXRhaWxzOworICAgICAgICBpbnQgbUN1ckNoZWNrUG9zaXRpb24gPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICAvLyBQb3B1bGF0ZSBsaXN0IHdpdGggb3VyIHN0YXRpYyBhcnJheSBvZiB0aXRsZXMuCisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4oZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtX2FjdGl2YXRlZF8xLCBTaGFrZXNwZWFyZS5USVRMRVMpKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSBsYXN0IHN0YXRlIGZvciBjaGVja2VkIHBvc2l0aW9uLgorICAgICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1ckNoZWNrUG9zaXRpb24gPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJjdXJDaG9pY2UiLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHNob3dpbmcgZGV0YWlscyBpbiB0aGUgc2NyZWVuLCBzZXQgdXAgdGhlIGxpc3QgdG8gaGlnaGxpZ2h0LgorICAgICAgICAgICAgbURldGFpbHMgPSAoRGV0YWlsc0ZyYWdtZW50KWdldEZyYWdtZW50TWFuYWdlcigpLmZpbmRGcmFnbWVudEJ5SWQoUi5pZC5kZXRhaWxzKTsKKyAgICAgICAgICAgIGlmIChtRGV0YWlscyAhPSBudWxsICYmIG1EZXRhaWxzLmlzSW5MYXlvdXQoKSkgeworICAgICAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0SXRlbUNoZWNrZWQobUN1ckNoZWNrUG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgICAgIG1EZXRhaWxzLnNldFRleHQobUN1ckNoZWNrUG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEludCgiY3VyQ2hvaWNlIiwgbUN1ckNoZWNrUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgbUN1ckNoZWNrUG9zaXRpb24gPSBwb3NpdGlvbjsKKworICAgICAgICAgICAgaWYgKG1EZXRhaWxzICE9IG51bGwgJiYgbURldGFpbHMuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYWN0aXZpdHkgaGFzIGEgZnJhZ21lbnQgdG8gZGlzcGxheSB0aGUgZGlhbG9nLAorICAgICAgICAgICAgICAgIC8vIHBvaW50IGl0IHRvIHdoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgIG1EZXRhaWxzLnNldFRleHQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBsYXVuY2ggYSBuZXcgYWN0aXZpdHkgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgIC8vIHRoZSBkaWFsb2cgZnJhZ21lbnQgd2l0aCBzZWxlY3RlZCB0ZXh0LgorICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzKGdldEFjdGl2aXR5KCksIERldGFpbHNBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0ZXh0IiwgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUodGl0bGVzKQorCisvL0JFR0lOX0lOQ0xVREUoZGV0YWlscykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERldGFpbHNGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgaW50IG1EaXNwbGF5ZWRUZXh0ID0gLTE7CisgICAgICAgIFRleHRWaWV3IG1UZXh0OworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoaW50IGlkKSB7CisgICAgICAgICAgICBtRGlzcGxheWVkVGV4dCA9IGlkOworICAgICAgICAgICAgaWYgKG1UZXh0ICE9IG51bGwgJiYgaWQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0LnNldFRleHQoU2hha2VzcGVhcmUuRElBTE9HVUVbaWRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURpc3BsYXllZFRleHQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJ0ZXh0IiwgLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEludCgidGV4dCIsIG1EaXNwbGF5ZWRUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IG5ldyBTY3JvbGxWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgbVRleHQgPSBuZXcgVGV4dFZpZXcoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgICAgICBpbnQgcGFkZGluZyA9IChpbnQpVHlwZWRWYWx1ZS5hcHBseURpbWVuc2lvbihUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9ESVAsCisgICAgICAgICAgICAgICAgICAgIDQsIGdldEFjdGl2aXR5KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKSk7CisgICAgICAgICAgICBtVGV4dC5zZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgc2Nyb2xsZXIuYWRkVmlldyhtVGV4dCk7CisgICAgICAgICAgICBpZiAobURpc3BsYXllZFRleHQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0LnNldFRleHQoU2hha2VzcGVhcmUuRElBTE9HVUVbbURpc3BsYXllZFRleHRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzY3JvbGxlcjsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZGV0YWlscykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMaXN0QXJyYXkuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMaXN0QXJyYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGFhZmExCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExpc3RBcnJheS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuU2hha2VzcGVhcmU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiB1c2luZyBMaXN0RnJhZ21lbnQgdG8gc2hvdyBhIGxpc3Qgb2YgaXRlbXMKKyAqIGZyb20gYSBjYW5uZWQgYXJyYXkuCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudExpc3RBcnJheSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBpZiAoZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuZmluZEZyYWdtZW50QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0RnJhZ21lbnQgbGlzdCA9IG5ldyBBcnJheUxpc3RGcmFnbWVudCgpOworICAgICAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBsaXN0KS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJyYXlMaXN0RnJhZ21lbnQgZXh0ZW5kcyBMaXN0RnJhZ21lbnQgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KGdldEFjdGl2aXR5KCksCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBTaGFrZXNwZWFyZS5USVRMRVMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIExvZy5pKCJGcmFnbWVudExpc3QiLCAiSXRlbSBjbGlja2VkOiAiICsgaWQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExpc3RDdXJzb3JMb2FkZXIuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMaXN0Q3Vyc29yTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhMDZkMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMaXN0Q3Vyc29yTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiBtb3JlIGNvbXBsZXggdXNlIGlmIGEgTGlzdEZyYWdtZW50LCBpbmNsdWRpbmcgc2hvd2luZworICogYW4gZW1wdHkgdmlldyBhbmQgbG9hZGluZyBwcm9ncmVzcy4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50TGlzdEN1cnNvckxvYWRlciBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBpZiAoZmluZEZyYWdtZW50QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ3Vyc29yTG9hZGVyTGlzdEZyYWdtZW50IGxpc3QgPSBuZXcgQ3Vyc29yTG9hZGVyTGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpLmFkZChhbmRyb2lkLlIuaWQuY29udGVudCwgbGlzdCkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnNvckxvYWRlckxpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudAorICAgICAgICAgICAgaW1wbGVtZW50cyBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxDdXJzb3I+IHsKKyAgICAgICAgTWVudUl0ZW0gbVNlYXJjaE1lbnU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0ZXh0IHRvIGRpc3BsYXkgaWYgdGhlcmUgaXMgbm8gZGF0YS4gIEluIGEgcmVhbAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gdGhpcyB3b3VsZCBjb21lIGZyb20gYSByZXNvdXJjZS4KKyAgICAgICAgICAgIHNldEVtcHR5VGV4dCgiTm8gcGhvbmUgbnVtYmVycyIpOworCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWVudSBpdGVtIHRvIHNob3cgaW4gYWN0aW9uIGJhci4KKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworCisgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBsb2FkZXIuICBFaXRoZXIgcmUtY29ubmVjdCB3aXRoIGFuIGV4aXN0aW5nIG9uZSwKKyAgICAgICAgICAgIC8vIG9yIHN0YXJ0IGEgbmV3IG9uZS4KKyAgICAgICAgICAgIGdldExvYWRlck1hbmFnZXIoKS5pbml0TG9hZGVyKDAsIG51bGwsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgICAgIG1TZWFyY2hNZW51ID0gbWVudS5hZGQoIlNlYXJjaCIpOworICAgICAgICAgICAgbVNlYXJjaE1lbnUuc2V0SWNvbihSLmRyYXdhYmxlLm1hZ25pZnlpbmdfZ2xhc3MpOworICAgICAgICAgICAgbVNlYXJjaE1lbnUuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0FMV0FZUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIGlmIChpdGVtID09IG1TZWFyY2hNZW51KSB7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpZ2V0QWN0aXZpdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgaW1tLnNob3dTb2Z0SW5wdXQoZ2V0QWN0aXZpdHkoKS5nZXRDdXJyZW50Rm9jdXMoKSwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBMb2cuaSgiRnJhZ21lbnRDb21wbGV4TGlzdCIsICJJdGVtIGNsaWNrZWQ6ICIgKyBpZCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEFDVFNfU1VNTUFSWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIENvbnRhY3RzLl9JRCwKKyAgICAgICAgICAgIENvbnRhY3RzLkRJU1BMQVlfTkFNRSwKKyAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTLAorICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9QUkVTRU5DRSwKKyAgICAgICAgICAgIENvbnRhY3RzLlBIT1RPX0lELAorICAgICAgICAgICAgQ29udGFjdHMuTE9PS1VQX0tFWSwKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgTG9hZGVyPEN1cnNvcj4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncykgeworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICIoKCIgKyBDb250YWN0cy5ESVNQTEFZX05BTUUgKyAiIE5PVE5VTEwpIEFORCAoIgorICAgICAgICAgICAgICAgICAgICArIENvbnRhY3RzLkhBU19QSE9ORV9OVU1CRVIgKyAiPTEpIEFORCAoIgorICAgICAgICAgICAgICAgICAgICArIENvbnRhY3RzLkRJU1BMQVlfTkFNRSArICIgIT0gJycgKSkiOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3JMb2FkZXIoZ2V0QWN0aXZpdHkoKSwgQ29udGFjdHMuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgICAgIENPTlRBQ1RTX1NVTU1BUllfUFJPSkVDVElPTiwgc2VsZWN0LCBudWxsLAorICAgICAgICAgICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUgKyAiIENPTExBVEUgTE9DQUxJWkVEIEFTQyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEN1cnNvcj4gbG9hZGVyLCBDdXJzb3IgZGF0YSkgeworICAgICAgICAgICAgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKGdldEFjdGl2aXR5KCksCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8yLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnRhY3RzLkRJU1BMQVlfTkFNRSwgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEsIGFuZHJvaWQuUi5pZC50ZXh0MiB9KTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudE1lbnUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjMjIzZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRNZW51LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgZnJhZ21lbnRzIGNhbiBwYXJ0aWNpcGF0ZSBpbiB0aGUgb3B0aW9ucyBtZW51LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRNZW51IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEZyYWdtZW50IG1GcmFnbWVudDE7CisgICAgRnJhZ21lbnQgbUZyYWdtZW50MjsKKyAgICBDaGVja0JveCBtQ2hlY2tCb3gxOworICAgIENoZWNrQm94IG1DaGVja0JveDI7CisKKyAgICAvLyBVcGRhdGUgZnJhZ21lbnQgdmlzaWJpbGl0eSB3aGVuIGNoZWNrIGJveGVzIGFyZSBjaGFuZ2VkLgorICAgIGZpbmFsIE9uQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X21lbnUpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0d28gbWVudSBmcmFnbWVudHMgYXJlIGNyZWF0ZWQuCisgICAgICAgIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEZyYWdtZW50TWFuYWdlcigpOworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZm0ub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1GcmFnbWVudDEgPSBmbS5maW5kRnJhZ21lbnRCeVRhZygiZjEiKTsKKyAgICAgICAgaWYgKG1GcmFnbWVudDEgPT0gbnVsbCkgeworICAgICAgICAgICAgbUZyYWdtZW50MSA9IG5ldyBNZW51RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGZ0LmFkZChtRnJhZ21lbnQxLCAiZjEiKTsKKyAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnQyID0gZm0uZmluZEZyYWdtZW50QnlUYWcoImYyIik7CisgICAgICAgIGlmIChtRnJhZ21lbnQyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1GcmFnbWVudDIgPSBuZXcgTWVudTJGcmFnbWVudCgpOworICAgICAgICAgICAgZnQuYWRkKG1GcmFnbWVudDIsICJmMiIpOworICAgICAgICB9CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgICAgICAKKyAgICAgICAgLy8gV2F0Y2ggY2hlY2sgYm94IGNsaWNrcy4KKyAgICAgICAgbUNoZWNrQm94MSA9IChDaGVja0JveClmaW5kVmlld0J5SWQoUi5pZC5tZW51MSk7CisgICAgICAgIG1DaGVja0JveDEuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgbUNoZWNrQm94MiA9IChDaGVja0JveClmaW5kVmlld0J5SWQoUi5pZC5tZW51Mik7CisgICAgICAgIG1DaGVja0JveDIuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSBmcmFnbWVudHMgc3RhcnQgb3V0IHdpdGggY29ycmVjdCB2aXNpYmlsaXR5LgorICAgICAgICB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAvLyBNYWtlIHN1cmUgZnJhZ21lbnRzIGFyZSB1cGRhdGVkIGFmdGVyIGNoZWNrIGJveCB2aWV3IHN0YXRlIGlzIHJlc3RvcmVkLgorICAgICAgICB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgZnJhZ21lbnQgdmlzaWJpbGl0eSBiYXNlZCBvbiBjdXJyZW50IGNoZWNrIGJveCBzdGF0ZS4KKyAgICB2b2lkIHVwZGF0ZUZyYWdtZW50VmlzaWJpbGl0eSgpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBpZiAobUNoZWNrQm94MS5pc0NoZWNrZWQoKSkgZnQuc2hvdyhtRnJhZ21lbnQxKTsKKyAgICAgICAgZWxzZSBmdC5oaWRlKG1GcmFnbWVudDEpOworICAgICAgICBpZiAobUNoZWNrQm94Mi5pc0NoZWNrZWQoKSkgZnQuc2hvdyhtRnJhZ21lbnQyKTsKKyAgICAgICAgZWxzZSBmdC5oaWRlKG1GcmFnbWVudDIpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGZyYWdtZW50IHRoYXQgZGlzcGxheXMgYSBtZW51LiAgVGhpcyBmcmFnbWVudCBoYXBwZW5zIHRvIG5vdAorICAgICAqIGhhdmUgYSBVSSAoaXQgZG9lcyBub3QgaW1wbGVtZW50IG9uQ3JlYXRlVmlldyksIGJ1dCBpdCBjb3VsZCBhbHNvCisgICAgICogaGF2ZSBvbmUgaWYgaXQgd2FudGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVudUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgc2V0SGFzT3B0aW9uc01lbnUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICAgICAgbWVudS5hZGQoIk1lbnUgMWEiKS5zZXRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgICAgICBtZW51LmFkZCgiTWVudSAxYiIpLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlY29uZCBmcmFnbWVudCB3aXRoIGEgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lbnUyRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBzZXRIYXNPcHRpb25zTWVudSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICBtZW51LmFkZCgiTWVudSAyIikuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJlY2VpdmVSZXN1bHQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRSZWNlaXZlUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlZjY3MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRSZWNlaXZlUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRSZWNlaXZlUmVzdWx0IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgRnJhbWVMYXlvdXQgZnJhbWUgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGZyYW1lLnNldElkKFIuaWQuc2ltcGxlX2ZyYWdtZW50KTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoZnJhbWUsIGxwKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRG8gZmlyc3QgdGltZSBpbml0aWFsaXphdGlvbiAtLSBhZGQgZnJhZ21lbnQuIAorICAgICAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBuZXcgUmVjZWl2ZVJlc3VsdEZyYWdtZW50KCk7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmdC5hZGQoUi5pZC5zaW1wbGVfZnJhZ21lbnQsIG5ld0ZyYWdtZW50KS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVjZWl2ZVJlc3VsdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICAvLyBEZWZpbml0aW9uIG9mIHRoZSBvbmUgcmVxdWVzdENvZGUgd2UgdXNlIGZvciByZWNlaXZpbmcgcmVzdWxzLgorICAgICAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgR0VUX0NPREUgPSAwOworCisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbVJlc3VsdHM7CisKKyAgICAgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbUdldExpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFjdGl2aXR5IHdob3NlIHJlc3VsdCB3ZSB3YW50IHRvIHJldHJpZXZlLiAgVGhlCisgICAgICAgICAgICAgICAgLy8gcmVzdWx0IHdpbGwgY29tZSBiYWNrIHdpdGggcmVxdWVzdCBjb2RlIEdFVF9DT0RFLgorICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGdldEFjdGl2aXR5KCksIFNlbmRSZXN1bHQuY2xhc3MpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoaW50ZW50LCBHRVRfQ09ERSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnJlY2VpdmVfcmVzdWx0LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIFRleHRWaWV3IHdpZGdldCB0aGF0IHdpbGwgZGlzcGxheSByZXN1bHRzLgorICAgICAgICAgICAgbVJlc3VsdHMgPSAoVGV4dFZpZXcpdi5maW5kVmlld0J5SWQoUi5pZC5yZXN1bHRzKTsKKworICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gbGF0ZXIgZXh0ZW5kIHRoZSB0ZXh0IGJ1ZmZlci4KKyAgICAgICAgICAgIG1SZXN1bHRzLnNldFRleHQobVJlc3VsdHMuZ2V0VGV4dCgpLCBUZXh0Vmlldy5CdWZmZXJUeXBlLkVESVRBQkxFKTsKKworICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgICAgICBCdXR0b24gZ2V0QnV0dG9uID0gKEJ1dHRvbil2LmZpbmRWaWV3QnlJZChSLmlkLmdldCk7CisgICAgICAgICAgICBnZXRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1HZXRMaXN0ZW5lcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBzZW5kaW5nIGFjdGl2aXR5IGhhcyBmaW5pc2hlZCwgd2l0aCB0aGUKKyAgICAgICAgICogcmVzdWx0IGl0IHN1cHBsaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICAgICAgICAgIC8vIFlvdSBjYW4gdXNlIHRoZSByZXF1ZXN0Q29kZSB0byBzZWxlY3QgYmV0d2VlbiBtdWx0aXBsZSBjaGlsZAorICAgICAgICAgICAgLy8gYWN0aXZpdGllcyB5b3UgbWF5IGhhdmUgc3RhcnRlZC4gIEhlcmUgdGhlcmUgaXMgb25seSBvbmUgdGhpbmcKKyAgICAgICAgICAgIC8vIHdlIGxhdW5jaC4KKyAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29kZSA9PSBHRVRfQ09ERSkgeworCisgICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBiZSBhZGRpbmcgdG8gb3VyIHRleHQuCisgICAgICAgICAgICAgICAgRWRpdGFibGUgdGV4dCA9IChFZGl0YWJsZSltUmVzdWx0cy5nZXRUZXh0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbmRhcmQgcmVzdWx0Q29kZSB0aGF0IGlzIHNlbnQgYmFjayBpZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBkb2Vzbid0IHN1cHBseSBhbiBleHBsaWNpdCByZXN1bHQuICBJdCB3aWxsIGFsc28KKyAgICAgICAgICAgICAgICAvLyBiZSByZXR1cm5lZCBpZiB0aGUgYWN0aXZpdHkgZmFpbGVkIHRvIGxhdW5jaC4KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBSRVNVTFRfQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoIihjYW5jZWxsZWQpIik7CisKKyAgICAgICAgICAgICAgICAvLyBPdXIgcHJvdG9jb2wgd2l0aCB0aGUgc2VuZGluZyBhY3Rpdml0eSBpcyB0aGF0IGl0IHdpbGwgc2VuZAorICAgICAgICAgICAgICAgIC8vIHRleHQgaW4gJ2RhdGEnIGFzIGl0cyByZXN1bHQuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoIihva2F5ICIpOworICAgICAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKHJlc3VsdENvZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoIikgIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKGRhdGEuZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmV0YWluSW5zdGFuY2UuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRSZXRhaW5JbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzkwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmV0YWluSW5zdGFuY2UuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7CisKKy8qKgorICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB5b3UgY2FuIHVzZSBhIEZyYWdtZW50IHRvIGVhc2lseSBwcm9wYWdhdGUgc3RhdGUKKyAqIChzdWNoIGFzIHRocmVhZHMpIGFjcm9zcyBhY3Rpdml0eSBpbnN0YW5jZXMgd2hlbiBhbiBhY3Rpdml0eSBuZWVkcyB0byBiZQorICogcmVzdGFydGVkIGR1ZSB0bywgZm9yIGV4YW1wbGUsIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuICBUaGlzIGlzIGEgbG90CisgKiBlYXNpZXIgdGhhbiB1c2luZyB0aGUgcmF3IEFjdGl2aXR5Lm9uUmV0YWluTm9uQ29uZmlndXJhdGluSW5zdGFuY2UoKSBBUEkuCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudFJldGFpbkluc3RhbmNlIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZpcnN0IHRpbWUgaW5pdCwgY3JlYXRlIHRoZSBVSS4KKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKS5hZGQoYW5kcm9pZC5SLmlkLmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBVaUZyYWdtZW50KCkpLmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGZyYWdtZW50IHNob3dpbmcgVUkgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgZnJvbSB3b3JrIGRvbmUKKyAgICAgKiBpbiB0aGUgcmV0YWluZWQgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVaUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICBSZXRhaW5lZEZyYWdtZW50IG1Xb3JrRnJhZ21lbnQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X3JldGFpbl9pbnN0YW5jZSwgY29udGFpbmVyLCBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC5yZXN0YXJ0KTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBtV29ya0ZyYWdtZW50LnJlc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VyIGZtID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHJldGFpbmVkIHRoZSB3b3JrZXIgZnJhZ21lbnQuCisgICAgICAgICAgICBtV29ya0ZyYWdtZW50ID0gKFJldGFpbmVkRnJhZ21lbnQpZm0uZmluZEZyYWdtZW50QnlUYWcoIndvcmsiKTsKKworICAgICAgICAgICAgLy8gSWYgbm90IHJldGFpbmVkIChvciBmaXJzdCB0aW1lIHJ1bm5pbmcpLCB3ZSBuZWVkIHRvIGNyZWF0ZSBpdC4KKyAgICAgICAgICAgIGlmIChtV29ya0ZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtV29ya0ZyYWdtZW50ID0gbmV3IFJldGFpbmVkRnJhZ21lbnQoKTsKKyAgICAgICAgICAgICAgICAvLyBUZWxsIGl0IHdobyBpdCBpcyB3b3JraW5nIHdpdGguCisgICAgICAgICAgICAgICAgbVdvcmtGcmFnbWVudC5zZXRUYXJnZXRGcmFnbWVudCh0aGlzLCAwKTsKKyAgICAgICAgICAgICAgICBmbS5vcGVuVHJhbnNhY3Rpb24oKS5hZGQobVdvcmtGcmFnbWVudCwgIndvcmsiKS5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgRnJhZ21lbnQgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGJlIHJldGFpbmVkIGFjcm9zcworICAgICAqIGFjdGl2aXR5IGluc3RhbmNlcy4gIEl0IHJlcHJlc2VudHMgc29tZSBvbmdvaW5nIHdvcmssIGhlcmUgYSB0aHJlYWQKKyAgICAgKiB3ZSBoYXZlIHRoYXQgc2l0cyBhcm91bmQgaW5jcmVtZW50aW5nIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV0YWluZWRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzQmFyOworICAgICAgICBpbnQgbVBvc2l0aW9uOworICAgICAgICBib29sZWFuIG1SZWFkeSA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1RdWl0aW5nID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIHRocmVhZCB0aGF0IHdpbGwgZG8gb3VyIHdvcmsuICBJdCBzaXRzIGluIGEgbG9vcCBydW5uaW5nCisgICAgICAgICAqIHRoZSBwcm9ncmVzcyB1cCB1bnRpbCBpdCBoYXMgcmVhY2hlZCB0aGUgdG9wLCB0aGVuIHN0b3BzIGFuZCB3YWl0cy4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFRocmVhZCBtVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGZpZ3VyZSB0aGUgcmVhbCB2YWx1ZSBvdXQgbGF0ZXIuCisgICAgICAgICAgICAgICAgaW50IG1heCA9IDEwMDAwOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgcnVucyBhbG1vc3QgZm9yZXZlci4KKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgc2hhcmVkIHN0YXRlIHdpdGggdGhlIFVJLgorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91ciB0aHJlYWQgaXMgc3RvcHBlZCBpZiB0aGUgVUkgaXMgbm90IHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCBoYXMgY29tcGxldGVkIGl0cyB3b3JrLgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFtUmVhZHkgfHwgbVBvc2l0aW9uID49IG1heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUXVpdGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIHRoZSBwcm9ncmVzcy4gIE5vdGUgaXQgaXMgaW1wb3J0YW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRvdWNoIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCB0aGUgbG9jayBoZWxkLCBzbyBpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBkaXNhcHBlYXIgb24gdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1Qcm9ncmVzc0Jhci5nZXRNYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0Jhci5zZXRQcm9ncmVzcyhtUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgd2Ugd291bGQgYmUgZG9pbmcgc29tZSB3b3JrLCBidXQgcHV0IGEga2x1ZGdlCisgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgdG8gcHJldGVuZCBsaWtlIHdlIGFyZS4KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoNTApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGcmFnbWVudCBpbml0aWFsaXphdGlvbi4gIFdlIHdheSB3ZSB3YW50IHRvIGJlIHJldGFpbmVkIGFuZAorICAgICAgICAgKiBzdGFydCBvdXIgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGZyYW1ld29yayB0byB0cnkgdG8ga2VlcCB0aGlzIGZyYWdtZW50IGFyb3VuZAorICAgICAgICAgICAgLy8gZHVyaW5nIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICBzZXRSZXRhaW5JbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQncyBBY3Rpdml0eSBpcyByZWFkeSB0byBnbywgYWZ0ZXIKKyAgICAgICAgICogaXRzIGNvbnRlbnQgdmlldyBoYXMgYmVlbiBpbnN0YWxsZWQ7IGl0IGlzIGNhbGxlZCBib3RoIGFmdGVyCisgICAgICAgICAqIHRoZSBpbml0aWFsIGZyYWdtZW50IGNyZWF0aW9uIGFuZCBhZnRlciB0aGUgZnJhZ21lbnQgaXMgcmUtYXR0YWNoZWQKKyAgICAgICAgICogdG8gYSBuZXcgYWN0aXZpdHkuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHByb2dyZXNzIGJhciBmcm9tIHRoZSB0YXJnZXQncyB2aWV3IGhpZXJhcmNoeS4KKyAgICAgICAgICAgIG1Qcm9ncmVzc0JhciA9IChQcm9ncmVzc0JhcilnZXRUYXJnZXRGcmFnbWVudCgpLmdldFZpZXcoKS5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIFIuaWQucHJvZ3Jlc3NfaG9yaXpvbnRhbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGFyZSByZWFkeSBmb3Igb3VyIHRocmVhZCB0byBnby4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZCkgeworICAgICAgICAgICAgICAgIG1SZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVRocmVhZC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBnb2luZyBhd2F5LiAgSXQgaXMgTk9UIGNhbGxlZAorICAgICAgICAgKiB3aGVuIHRoZSBmcmFnbWVudCBpcyBiZWluZyBwcm9wYWdhdGVkIGJldHdlZW4gYWN0aXZpdHkgaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHRocmVhZCBnbyBhd2F5LgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVF1aXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgZGV0YWNoZWQgZnJvbSBpdHMKKyAgICAgICAgICogY3VycmVudCBhY3Rpdml0eSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSBpdHMgYWN0aXZpdHkuICBXZSBuZWVkCisgICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgaXRzIHRocmVhZCBpcyBub3QgZ29pbmcgdG8gdG91Y2ggYW55IGFjdGl2aXR5CisgICAgICAgICAgICAvLyBzdGF0ZSBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQmFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBzdXBlci5vbkRldGFjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFQSSBmb3Igb3VyIFVJIHRvIHJlc3RhcnQgdGhlIHByb2dyZXNzIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3RhcnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTlhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRTdGFjayBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBpbnQgbVN0YWNrTGV2ZWwgPSAxOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9zdGFjayk7CisgICAgICAgIAorICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQubmV3X2ZyYWdtZW50KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhZGRGcmFnbWVudFRvU3RhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBEbyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uIC0tIGFkZCBpbml0aWFsIGZyYWdtZW50LgorICAgICAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBDb3VudGluZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKG1TdGFja0xldmVsKTsKKyAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLnNpbXBsZV9mcmFnbWVudCwgbmV3RnJhZ21lbnQpLmNvbW1pdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YWNrTGV2ZWwgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJsZXZlbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgICAgIG91dFN0YXRlLnB1dEludCgibGV2ZWwiLCBtU3RhY2tMZXZlbCk7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoYWRkX3N0YWNrKQorICAgIHZvaWQgYWRkRnJhZ21lbnRUb1N0YWNrKCkgeworICAgICAgICBtU3RhY2tMZXZlbCsrOworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IGZyYWdtZW50LgorICAgICAgICBGcmFnbWVudCBuZXdGcmFnbWVudCA9IENvdW50aW5nRnJhZ21lbnQubmV3SW5zdGFuY2UobVN0YWNrTGV2ZWwpOworCisgICAgICAgIC8vIEFkZCB0aGUgZnJhZ21lbnQgdG8gdGhlIGFjdGl2aXR5LCBwdXNoaW5nIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgLy8gb24gdG8gdGhlIGJhY2sgc3RhY2suCisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZnQucmVwbGFjZShSLmlkLnNpbXBsZV9mcmFnbWVudCwgbmV3RnJhZ21lbnQpOworICAgICAgICBmdC5zZXRUcmFuc2l0aW9uKEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9PUEVOKTsKKyAgICAgICAgZnQuYWRkVG9CYWNrU3RhY2sobnVsbCk7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKy8vRU5EX0lOQ0xVREUoYWRkX3N0YWNrKQorCisvL0JFR0lOX0lOQ0xVREUoZnJhZ21lbnQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb3VudGluZ0ZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICBpbnQgbU51bTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIENvdW50aW5nRnJhZ21lbnQsIHByb3ZpZGluZyAibnVtIgorICAgICAgICAgKiBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBDb3VudGluZ0ZyYWdtZW50IG5ld0luc3RhbmNlKGludCBudW0pIHsKKyAgICAgICAgICAgIENvdW50aW5nRnJhZ21lbnQgZiA9IG5ldyBDb3VudGluZ0ZyYWdtZW50KCk7CisKKyAgICAgICAgICAgIC8vIFN1cHBseSBudW0gaW5wdXQgYXMgYW4gYXJndW1lbnQuCisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3MucHV0SW50KCJudW0iLCBudW0pOworICAgICAgICAgICAgZi5zZXRBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZW4gY3JlYXRpbmcsIHJldHJpZXZlIHRoaXMgaW5zdGFuY2UncyBudW1iZXIgZnJvbSBpdHMgYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBtTnVtID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgRnJhZ21lbnQncyBVSSBpcyBqdXN0IGEgc2ltcGxlIHRleHQgdmlldyBzaG93aW5nIGl0cworICAgICAgICAgKiBpbnN0YW5jZSBudW1iZXIuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuaGVsbG9fd29ybGQsIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJGcmFnbWVudCAjIiArIG1OdW0pOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGZyYWdtZW50KQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JbmNvbWluZ01lc3NhZ2UuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvSW5jb21pbmdNZXNzYWdlLmphdmEKaW5kZXggZDQ0YzAwOC4uZjMwYTdjMSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JbmNvbWluZ01lc3NhZ2UuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0luY29taW5nTWVzc2FnZS5qYXZhCkBAIC0yNCwxMiArMjQsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKIHB1YmxpYyBjbGFzcyBJbmNvbWluZ01lc3NhZ2UgZXh0ZW5kcyBBY3Rpdml0eSB7CiAgICAgQE92ZXJyaWRlCkBAIC00MSwzMSArNDIsMTEgQEAKICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm5vdGlmeSk7CiAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IEJ1dHRvbi5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1RvYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgdG9hc3QgcG9wcyB1cCBhIHF1aWNrIG1lc3NhZ2UgdG8gdGhlIHVzZXIgc2hvd2luZyB3aGF0IGNvdWxkIGJlCi0gICAgICogdGhlIHRleHQgb2YgYW4gaW5jb21pbmcgbWVzc2FnZS4gIEl0IHVzZXMgYSBjdXN0b20gdmlldyB0byBkbyBzby4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93VG9hc3QoKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgdmlldwotICAgICAgICBWaWV3IHZpZXcgPSBpbmZsYXRlVmlldyhSLmxheW91dC5pbmNvbWluZ19tZXNzYWdlX3BhbmVsKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHRleHQgaW4gdGhlIHZpZXcKLSAgICAgICAgVGV4dFZpZXcgdHYgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5tZXNzYWdlKTsKLSAgICAgICAgdHYuc2V0VGV4dCgia2h0eC4gbWVldCB1IGZvciBkaW5uZXIuIGN1bDhyIik7Ci0KLSAgICAgICAgLy8gc2hvdyB0aGUgdG9hc3QKLSAgICAgICAgVG9hc3QgdG9hc3QgPSBuZXcgVG9hc3QodGhpcyk7Ci0gICAgICAgIHRvYXN0LnNldFZpZXcodmlldyk7Ci0gICAgICAgIHRvYXN0LnNldER1cmF0aW9uKFRvYXN0LkxFTkdUSF9MT05HKTsKLSAgICAgICAgdG9hc3Quc2hvdygpOwotICAgIH0KLQogICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVmlldyhpbnQgcmVzb3VyY2UpIHsKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgdmkgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKICAgICAgICAgcmV0dXJuIHZpLmluZmxhdGUocmVzb3VyY2UsIG51bGwpOwpAQCAtOTcsOSArNzgsMTggQEAKICAgICAgICAgLy8gU2V0IHRoZSBpbmZvIGZvciB0aGUgdmlld3MgdGhhdCBzaG93IGluIHRoZSBub3RpZmljYXRpb24gcGFuZWwuCiAgICAgICAgIG5vdGlmLnNldExhdGVzdEV2ZW50SW5mbyh0aGlzLCBmcm9tLCBtZXNzYWdlLCBjb250ZW50SW50ZW50KTsKIAotICAgICAgICAvLyBhZnRlciBhIDEwMG1zIGRlbGF5LCB2aWJyYXRlIGZvciAyNTBtcywgcGF1c2UgZm9yIDEwMCBtcyBhbmQKKyAgICAgICAgLy8gT24gdGFibGV0cywgdGhlIHRpY2tlciBzaG93cyB0aGUgc2VuZGVyLCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbWVzc2FnZSwKKyAgICAgICAgLy8gdGhlIHBob3RvIG9mIHRoZSBwZXJzb24gYW5kIHRoZSBhcHAgaWNvbi4gIEZvciBvdXIgc2FtcGxlLCB3ZSBqdXN0IHNob3cKKyAgICAgICAgLy8gdGhlIHNhbWUgaWNvbiB0d2ljZS4gIElmIHRoZXJlIGlzIG5vIHNlbmRlciwganVzdCBwYXNzIGFuIGFycmF5IG9mIDEgQml0bWFwLgorICAgICAgICBub3RpZi50aWNrZXJUaXRsZSA9IGZyb207CisgICAgICAgIG5vdGlmLnRpY2tlclN1YnRpdGxlID0gbWVzc2FnZTsKKyAgICAgICAgbm90aWYudGlja2VySWNvbnMgPSBuZXcgQml0bWFwWzJdOworICAgICAgICBub3RpZi50aWNrZXJJY29uc1swXSA9IGdldEljb25CaXRtYXAoKTs7CisgICAgICAgIG5vdGlmLnRpY2tlckljb25zWzFdID0gZ2V0SWNvbkJpdG1hcCgpOzsKKworICAgICAgICAvLyBhZnRlciBhIDBtcyBkZWxheSwgdmlicmF0ZSBmb3IgMjUwbXMsIHBhdXNlIGZvciAxMDAgbXMgYW5kCiAgICAgICAgIC8vIHRoZW4gdmlicmF0ZSBmb3IgNTAwbXMuCi0gICAgICAgIG5vdGlmLnZpYnJhdGUgPSBuZXcgbG9uZ1tdIHsgMTAwLCAyNTAsIDEwMCwgNTAwfTsKKyAgICAgICAgbm90aWYudmlicmF0ZSA9IG5ldyBsb25nW10geyAwLCAyNTAsIDEwMCwgNTAwfTsKIAogICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIFIubGF5b3V0LmluY29taW5nX21lc3NhZ2VfcGFuZWwgYXMgdGhlIElEIGZvcgogICAgICAgICAvLyB0aGUgbm90aWZpY2F0aW9uLiAgSXQgY291bGQgYmUgYW55IGludGVnZXIgeW91IHdhbnQsIGJ1dCB3ZSB1c2UKQEAgLTEwOCw0ICs5OCwxMCBAQAogICAgICAgICAvLyBhcHBsaWNhdGlvbi4KICAgICAgICAgbm0ubm90aWZ5KFIuc3RyaW5nLmltY29taW5nX21lc3NhZ2VfdGlja2VyX3RleHQsIG5vdGlmKTsKICAgICB9CisKKyAgICBwcml2YXRlIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgeworICAgICAgICBCaXRtYXBGYWN0b3J5IGYgPSBuZXcgQml0bWFwRmFjdG9yeSgpOworICAgICAgICByZXR1cm4gZi5kZWNvZGVSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5hcHBfc2FtcGxlX2NvZGUpOworICAgIH0KIH0KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Tb2Z0SW5wdXRNb2Rlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Tb2Z0SW5wdXRNb2Rlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1NvZnRJbnB1dE1vZGVzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyOworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgdGhlIHZhcmlvdXMgc29mdCBpbnB1dCBtb2RlcyBpbXBhY3Qgd2luZG93IHJlc2l6aW5nLgorICovCitwdWJsaWMgY2xhc3MgU29mdElucHV0TW9kZXMgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgU3Bpbm5lciBtUmVzaXplTW9kZTsKKyAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBtUmVzaXplTW9kZUxhYmVscyA9IG5ldyBDaGFyU2VxdWVuY2VbXSB7CisgICAgICAgICAgICAiVW5zcGVjaWZpZWQiLCAiUmVzaXplIiwgIlBhbiIsICJOb3RoaW5nIgorICAgIH07CisgICAgZmluYWwgaW50W10gbVJlc2l6ZU1vZGVWYWx1ZXMgPSBuZXcgaW50W10geworICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUsCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9QQU4sCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9OT1RISU5HLAorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6YXRpb24gb2YgdGhlIEFjdGl2aXR5IGFmdGVyIGl0IGlzIGZpcnN0IGNyZWF0ZWQuICBIZXJlIHdlIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzZXRDb250ZW50VmlldyBzZXRDb250ZW50VmlldygpfSB0byBzZXQgdXAKKyAgICAgKiB0aGUgQWN0aXZpdHkncyBjb250ZW50LCBhbmQgcmV0cmlldmUgdGhlIEVkaXRUZXh0IHdpZGdldCB3aG9zZSBzdGF0ZSB3ZQorICAgICAqIHdpbGwgcGVyc2lzdGVudC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIC8vIEJlIHN1cmUgdG8gY2FsbCB0aGUgc3VwZXIgY2xhc3MuCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gU2VlIGFzc2V0cy9yZXMvYW55L2xheW91dC9zYXZlX3Jlc3RvcmVfc3RhdGUueG1sIGZvciB0aGlzCisgICAgICAgIC8vIHZpZXcgbGF5b3V0IGRlZmluaXRpb24sIHdoaWNoIGlzIGJlaW5nIHNldCBoZXJlIGFzCisgICAgICAgIC8vIHRoZSBjb250ZW50IG9mIG91ciBzY3JlZW4uCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnNvZnRfaW5wdXRfbW9kZXMpOworICAgICAgICAKKyAgICAgICAgbVJlc2l6ZU1vZGUgPSAoU3Bpbm5lcilmaW5kVmlld0J5SWQoUi5pZC5yZXNpemVfbW9kZSk7CisgICAgICAgIEFycmF5QWRhcHRlcjxDaGFyU2VxdWVuY2U+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPENoYXJTZXF1ZW5jZT4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1SZXNpemVNb2RlTGFiZWxzKTsKKyAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOworICAgICAgICBtUmVzaXplTW9kZS5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUmVzaXplTW9kZS5zZXRTZWxlY3Rpb24oMCk7CisgICAgICAgIG1SZXNpemVNb2RlLnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbmV3IE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFdpbmRvdygpLnNldFNvZnRJbnB1dE1vZGUobVJlc2l6ZU1vZGVWYWx1ZXNbcG9zaXRpb25dKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2luZG93KCkuc2V0U29mdElucHV0TW9kZShtUmVzaXplTW9kZVZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9DbGlwYm9hcmRTYW1wbGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L0NsaXBib2FyZFNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDQyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9DbGlwYm9hcmRTYW1wbGUuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5jb250ZW50OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIENsaXBib2FyZFNhbXBsZSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBDbGlwYm9hcmRNYW5hZ2VyIG1DbGlwYm9hcmQ7CisKKyAgICBTcGlubmVyIG1TcGlubmVyOworICAgIFRleHRWaWV3IG1NaW1lVHlwZXM7CisgICAgRWRpdFRleHQgbUVkaXRUZXh0OworCisgICAgQ2hhclNlcXVlbmNlIG1TdHlsZWRUZXh0OworICAgIFN0cmluZyBtUGxhaW5UZXh0OworCisgICAgQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIG1QcmltYXJ5Q2hhbmdlTGlzdGVuZXIKKyAgICAgICAgICAgID0gbmV3IENsaXBib2FyZE1hbmFnZXIuT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25QcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgICAgICB1cGRhdGVDbGlwRGF0YSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtQ2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgLy8gU2VlIHJlcy9hbnkvbGF5b3V0L3Jlc291cmNlcy54bWwgZm9yIHRoaXMgdmlldyBsYXlvdXQgZGVmaW5pdGlvbi4KKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY2xpcGJvYXJkKTsKKworICAgICAgICBUZXh0VmlldyB0djsKKworICAgICAgICBtU3R5bGVkVGV4dCA9IGdldFRleHQoUi5zdHJpbmcuc3R5bGVkX3RleHQpOworICAgICAgICB0diA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zdHlsZWRfdGV4dCk7CisgICAgICAgIHR2LnNldFRleHQobVN0eWxlZFRleHQpOworCisgICAgICAgIG1QbGFpblRleHQgPSBtU3R5bGVkVGV4dC50b1N0cmluZygpOworICAgICAgICB0diA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5wbGFpbl90ZXh0KTsKKyAgICAgICAgdHYuc2V0VGV4dChtUGxhaW5UZXh0KTsKKworICAgICAgICBtU3Bpbm5lciA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5jbGlwX3R5cGUpOworICAgICAgICBBcnJheUFkYXB0ZXI8Q2hhclNlcXVlbmNlPiBhZGFwdGVyID0gQXJyYXlBZGFwdGVyLmNyZWF0ZUZyb21SZXNvdXJjZSgKKyAgICAgICAgICAgICAgICB0aGlzLCBSLmFycmF5LmNsaXBfZGF0YV90eXBlcywgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfc3Bpbm5lcl9pdGVtKTsKKyAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOworICAgICAgICBtU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtU3Bpbm5lci5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgIG5ldyBPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtTWltZVR5cGVzID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmNsaXBfbWltZV90eXBlcyk7CisgICAgICAgIG1FZGl0VGV4dCA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5jbGlwX3RleHQpOworCisgICAgICAgIG1DbGlwYm9hcmQuYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIobVByaW1hcnlDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIHVwZGF0ZUNsaXBEYXRhKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgbUNsaXBib2FyZC5yZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihtUHJpbWFyeUNoYW5nZUxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXN0ZVN0eWxlZFRleHQoVmlldyBidXR0b24pIHsKKyAgICAgICAgbUNsaXBib2FyZC5zZXRQcmltYXJ5Q2xpcChDbGlwRGF0YS5uZXdQbGFpblRleHQoIlN0eWxlZCBUZXh0IiwgbnVsbCwgbVN0eWxlZFRleHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXN0ZVBsYWluVGV4dChWaWV3IGJ1dHRvbikgeworICAgICAgICBtQ2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dCgiU3R5bGVkIFRleHQiLCBudWxsLCBtUGxhaW5UZXh0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFzdGVJbnRlbnQoVmlldyBidXR0b24pIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXLCBVcmkucGFyc2UoImh0dHA6Ly93d3cuYW5kcm9pZC5jb20vIikpOworICAgICAgICBtQ2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld0ludGVudCgiVklFVyBpbnRlbnQiLCBudWxsLCBpbnRlbnQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXN0ZVVyaShWaWV3IGJ1dHRvbikgeworICAgICAgICBtQ2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1Jhd1VyaSgiVVJJIiwgbnVsbCwKKyAgICAgICAgICAgICAgICBVcmkucGFyc2UoImh0dHA6Ly93d3cuYW5kcm9pZC5jb20vIikpKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUNsaXBEYXRhKCkgeworICAgICAgICBDbGlwRGF0YSBjbGlwID0gbUNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBTdHJpbmdbXSBtaW1lVHlwZXMgPSBjbGlwICE9IG51bGwgPyBjbGlwLmdldERlc2NyaXB0aW9uKCkuZmlsdGVyTWltZVR5cGVzKCIqLyoiKSA6IG51bGw7CisgICAgICAgIG1NaW1lVHlwZXMuc2V0VGV4dCgiIik7CisgICAgICAgIGlmIChtaW1lVHlwZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1NaW1lVHlwZXMuYXBwZW5kKG1pbWVUeXBlc1tpXSk7CisgICAgICAgICAgICAgICAgbU1pbWVUeXBlcy5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKDApOworICAgICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoIiIpOworICAgICAgICB9IGVsc2UgaWYgKGNsaXAuZ2V0SXRlbSgwKS5nZXRUZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKDEpOworICAgICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoY2xpcC5nZXRJdGVtKDApLmdldFRleHQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2xpcC5nZXRJdGVtKDApLmdldEludGVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbigyKTsKKyAgICAgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KGNsaXAuZ2V0SXRlbSgwKS5nZXRJbnRlbnQoKS50b1VyaSgwKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2xpcC5nZXRJdGVtKDApLmdldFVyaSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbigzKTsKKyAgICAgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KGNsaXAuZ2V0SXRlbSgwKS5nZXRVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbigwKTsKKyAgICAgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KCJDbGlwIGNvbnRhaW5pbmcgbm8gZGF0YSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2NvbnRlbnQvUmVzb3VyY2VzU2FtcGxlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YQppbmRleCBmMzhiZTBmLi5kNDZhODUxIDEwMDc1NQotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YQpAQCAtMzgsMTEgKzM4LDkgQEAKICAqIEBzZWUgU3R5bGVkVGV4dCBmb3IgbW9yZSBkZXB0aCBhYm91dCB1c2luZyBzdHlsZWQgdGV4dCwgYm90aCB3aXRoIGdldFN0cmluZygpCiAgKiAgICAgICAgICAgICAgICAgYW5kIGluIHRoZSBsYXlvdXQgeG1sIGZpbGVzLgogICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzU2FtcGxlIGV4dGVuZHMgQWN0aXZpdHkKLXsKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNTYW1wbGUgZXh0ZW5kcyBBY3Rpdml0eSB7CiAgICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKLSAgICB7CisJcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIC8vIFNlZSByZXMvYW55L2xheW91dC9yZXNvdXJjZXMueG1sIGZvciB0aGlzIHZpZXcgbGF5b3V0IGRlZmluaXRpb24uCkBAIC01NCw4ICs1Miw4IEBACiAKICAgICAgICAgLy8gPT09PT09IFVzaW5nIHRoZSBDb250ZXh0LmdldFN0cmluZygpIGNvbnZlbmllbmNlIG1ldGhvZCA9PT09PT09PT09PQogCi0gICAgICAgIC8vIFVzaW5nIHRoZSBnZXRTdHJpbmcoKSBjb25ldmVuaWVuY2UgbWV0aG9kLCByZXRyaWV2ZSBhIHN0cmluZwotICAgICAgICAvLyByZXNvdXJjZSB0aGF0IGhhcGVwbnMgdG8gaGF2ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhlIHVzZSBvZgorICAgICAgICAvLyBVc2luZyB0aGUgZ2V0U3RyaW5nKCkgY29udmVuaWVuY2UgbWV0aG9kLCByZXRyaWV2ZSBhIHN0cmluZworICAgICAgICAvLyByZXNvdXJjZSB0aGF0IGhhcHBlbnMgdG8gaGF2ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhlIHVzZSBvZgogICAgICAgICAvLyBDaGFyU2VxdWVuY2UgaW5zdGVhZCBvZiBTdHJpbmcgc28gd2UgZG9uJ3QgbG9zZSB0aGUgc3R5bGUgaW5mby4KICAgICAgICAgY3MgPSBnZXRUZXh0KFIuc3RyaW5nLnN0eWxlZF90ZXh0KTsKICAgICAgICAgdHYgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3R5bGVkX3RleHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEKcmVuYW1lIHRvIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQppbmRleCAyZGJiYzQ1Li4wMzI4YjAzIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CiAKIGltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKIApAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgcHJpdmF0ZSBDaGVja0JveFByZWZlcmVuY2UgbUNoZWNrQm94UHJlZmVyZW5jZTsKICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGNvbnRyb2xsaW5nIGEgcHJlZmVyZW5jZSBmcm9tIGNvZGUuCiAgICAgICovCkBAIC00NCwxOSArNDQsMTkgQEAKICAgICAgICAgICAgIGlmIChtQ2hlY2tCb3hQcmVmZXJlbmNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtQ2hlY2tCb3hQcmVmZXJlbmNlLnNldENoZWNrZWQoIW1DaGVja0JveFByZWZlcmVuY2UuaXNDaGVja2VkKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8vIEZvcmNlIHRvZ2dsZSBhZ2FpbiBpbiBhIHNlY29uZAogICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQodGhpcywgMTAwMCk7CiAgICAgICAgIH0KICAgICB9OwotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIC8vIExvYWQgdGhlIFhNTCBwcmVmZXJlbmNlcyBmaWxlCiAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLmFkdmFuY2VkX3ByZWZlcmVuY2VzKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjaGVja2JveCBwcmVmZXJlbmNlCiAgICAgICAgIG1DaGVja0JveFByZWZlcmVuY2UgPSAoQ2hlY2tCb3hQcmVmZXJlbmNlKWdldFByZWZlcmVuY2VTY3JlZW4oKS5maW5kUHJlZmVyZW5jZSgKICAgICAgICAgICAgICAgICBLRVlfQURWQU5DRURfQ0hFQ0tCT1hfUFJFRkVSRU5DRSk7CkBAIC02OCw3ICs2OCw3IEBACiAKICAgICAgICAgLy8gU3RhcnQgdGhlIGZvcmNlIHRvZ2dsZQogICAgICAgICBtRm9yY2VDaGVja0JveFJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAKKwogICAgICAgICAvLyBTZXQgdXAgYSBsaXN0ZW5lciB3aGVuZXZlciBhIGtleSBjaGFuZ2VzCiAgICAgICAgIGdldFByZWZlcmVuY2VTY3JlZW4oKS5nZXRTaGFyZWRQcmVmZXJlbmNlcygpLnJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7CiAgICAgfQpAQCAtNzksNyArNzksNyBAQAogCiAgICAgICAgIC8vIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVyIHdoZW5ldmVyIGEga2V5IGNoYW5nZXMKICAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmdldFNoYXJlZFByZWZlcmVuY2VzKCkudW5yZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAKKwogICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUZvcmNlQ2hlY2tCb3hSdW5uYWJsZSk7CiAgICAgfQogCkBAIC05MCw1ICs5MCw1IEBACiAgICAgICAgICAgICAgICAgICAgICsgc2hhcmVkUHJlZmVyZW5jZXMuZ2V0SW50KGtleSwgMCksIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RlZmF1bHRWYWx1ZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0RlZmF1bHRWYWx1ZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RlZmF1bHRWYWx1ZXMuamF2YQpyZW5hbWUgdG8gc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRGVmYXVsdFZhbHVlcy5qYXZhCmluZGV4IDQ5NGEyZWEuLjY5Y2Y0OTkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGVmYXVsdFZhbHVlcy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0RlZmF1bHRWYWx1ZXMuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKIAogaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5BcGlEZW1vc0FwcGxpY2F0aW9uOwogaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwpAQCAtNDYsNyArNDYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCisKICAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwuZGVmYXVsdF92YWx1ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRnJhZ21lbnRQcmVmZXJlbmNlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRnJhZ21lbnRQcmVmZXJlbmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2M2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9GcmFnbWVudFByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQ7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiBQcmVmZXJlbmNlRnJhZ21lbnQsIHNob3dpbmcgYSBzaW5nbGUgZnJhZ21lbnQgaW4gYW4KKyAqIGFjdGl2aXR5LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRQcmVmZXJlbmNlcyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBEaXNwbGF5IHRoZSBmcmFnbWVudCBhcyB0aGUgbWFpbiBjb250ZW50LgorICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKS5yZXBsYWNlKGFuZHJvaWQuUi5pZC5jb250ZW50LAorICAgICAgICAgICAgICAgIG5ldyBQcmVmc0ZyYWdtZW50KCkpLmNvbW1pdCgpOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGZyYWdtZW50KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZnNGcmFnbWVudCBleHRlbmRzIFByZWZlcmVuY2VGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHByZWZlcmVuY2VzIGZyb20gYW4gWE1MIHJlc291cmNlCisgICAgICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5wcmVmZXJlbmNlcyk7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGZyYWdtZW50KQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9MYXVuY2hpbmdQcmVmZXJlbmNlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTGF1bmNoaW5nUHJlZmVyZW5jZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEKcmVuYW1lIHRvIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEKaW5kZXggNGFhMTUyMi4uMDY2NDc3YiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9MYXVuY2hpbmdQcmVmZXJlbmNlcy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CiAKIGltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKIApAQCAtMzYsOSArMzYsOSBAQAogcHVibGljIGNsYXNzIExhdW5jaGluZ1ByZWZlcmVuY2VzIGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfQ09ERV9QUkVGRVJFTkNFUyA9IDE7Ci0gICAgCisKICAgICBwcml2YXRlIFRleHRWaWV3IG1Db3VudGVyVGV4dDsKLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKQEAgLTUwLDMzICs1MCwzMyBAQAogICAgICAgICAgKiBzdWJjbGFzcyBvZiBBcHBsaWNhdGlvbiwgc28geW91ciBkZWZhdWx0IHZhbHVlcyB3b3VsZCBiZSBsb2FkZWQKICAgICAgICAgICogcmVnYXJkbGVzcyBvZiBlbnRyeSBpbnRvIHlvdXIgYXBwbGljYXRpb24gKGZvciBleGFtcGxlLCBhIHNlcnZpY2Ugb3IKICAgICAgICAgICogYWN0aXZpdHkpLgotICAgICAgICAgKi8gIAorICAgICAgICAgKi8KICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuc2V0RGVmYXVsdFZhbHVlcyh0aGlzLCBSLnhtbC5hZHZhbmNlZF9wcmVmZXJlbmNlcywgZmFsc2UpOwotICAgICAgICAKKwogICAgICAgICAvLyBTaW1wbGUgbGF5b3V0CiAgICAgICAgIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOwogICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKLSAgICAgICAgCisKICAgICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIGJ1dHRvbiB0aGF0IHdpbGwgbGF1bmNoIHRoZSBwcmVmZXJlbmNlcwogICAgICAgICBCdXR0b24gbGF1bmNoUHJlZmVyZW5jZXMgPSBuZXcgQnV0dG9uKHRoaXMpOwogICAgICAgICBsYXVuY2hQcmVmZXJlbmNlcy5zZXRUZXh0KGdldFN0cmluZyhSLnN0cmluZy5sYXVuY2hfcHJlZmVyZW5jZV9hY3Rpdml0eSkpOwogICAgICAgICBsYXVuY2hQcmVmZXJlbmNlcy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIGxheW91dC5hZGRWaWV3KGxhdW5jaFByZWZlcmVuY2VzLCBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCiAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwotICAgICAgICAKKwogICAgICAgICBtQ291bnRlclRleHQgPSBuZXcgVGV4dFZpZXcodGhpcyk7CiAgICAgICAgIGxheW91dC5hZGRWaWV3KG1Db3VudGVyVGV4dCwgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAogICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKLSAgICAgICAgCisKICAgICAgICAgdXBkYXRlQ291bnRlclRleHQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAKKwogICAgICAgICAvLyBXaGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCwgbGF1bmNoIGFuIGFjdGl2aXR5IHRocm91Z2ggdGhpcyBpbnRlbnQKICAgICAgICAgSW50ZW50IGxhdW5jaFByZWZlcmVuY2VzSW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEFkdmFuY2VkUHJlZmVyZW5jZXMuY2xhc3MpOwotICAgICAgICAKKwogICAgICAgICAvLyBNYWtlIGl0IGEgc3ViYWN0aXZpdHkgc28gd2Uga25vdyB3aGVuIGl0IHJldHVybnMKICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChsYXVuY2hQcmVmZXJlbmNlc0ludGVudCwgUkVRVUVTVF9DT0RFX1BSRUZFUkVOQ0VTKTsKICAgICB9CkBAIC04NCw3ICs4NCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgICAgICBzdXBlci5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gVGhlIHByZWZlcmVuY2VzIHJldHVybmVkIGlmIHRoZSByZXF1ZXN0IGNvZGUgaXMgd2hhdCB3ZSBoYWQgZ2l2ZW4KICAgICAgICAgLy8gZWFybGllciBpbiBzdGFydFN1YkFjdGl2aXR5CiAgICAgICAgIGlmIChyZXF1ZXN0Q29kZSA9PSBSRVFVRVNUX0NPREVfUFJFRkVSRU5DRVMpIHsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTXlQcmVmZXJlbmNlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9NeVByZWZlcmVuY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL015UHJlZmVyZW5jZS5qYXZhCnJlbmFtZSB0byBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9NeVByZWZlcmVuY2UuamF2YQppbmRleCA5NjdjMTgxLi5hZWI4YmY5IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL015UHJlZmVyZW5jZS5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL015UHJlZmVyZW5jZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOwogCiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CiAKQEAgLTMzLDE4ICszMywxOCBAQAogICovCiBwdWJsaWMgY2xhc3MgTXlQcmVmZXJlbmNlIGV4dGVuZHMgUHJlZmVyZW5jZSB7CiAgICAgcHJpdmF0ZSBpbnQgbUNsaWNrQ291bnRlcjsKLSAgICAKKwogICAgIC8vIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIGNhbGxlZCBieSB0aGUgaW5mbGF0ZXIKICAgICBwdWJsaWMgTXlQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgCi0gICAgICAgIHNldFdpZGdldExheW91dFJlc291cmNlKFIubGF5b3V0LnByZWZlcmVuY2Vfd2lkZ2V0X215cHJlZmVyZW5jZSk7ICAgICAgICAKKworICAgICAgICBzZXRXaWRnZXRMYXlvdXRSZXNvdXJjZShSLmxheW91dC5wcmVmZXJlbmNlX3dpZGdldF9teXByZWZlcmVuY2UpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZFZpZXcoVmlldyB2aWV3KSB7CiAgICAgICAgIHN1cGVyLm9uQmluZFZpZXcodmlldyk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFNldCBvdXIgY3VzdG9tIHZpZXdzIGluc2lkZSB0aGUgbGF5b3V0CiAgICAgICAgIGZpbmFsIFRleHRWaWV3IG15VGV4dFZpZXcgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXlwcmVmZXJlbmNlX3dpZGdldCk7CiAgICAgICAgIGlmIChteVRleHRWaWV3ICE9IG51bGwpIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogICAgICAgICAgICAgLy8gVGhleSBkb24ndCB3YW50IHRoZSB2YWx1ZSB0byBiZSBzZXQKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyBJbmNyZW1lbnQgY291bnRlcgogICAgICAgICBtQ2xpY2tDb3VudGVyID0gbmV3VmFsdWU7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFNhdmUgdG8gcGVyc2lzdGVudCBzdG9yYWdlICh0aGlzIG1ldGhvZCB3aWxsIG1ha2Ugc3VyZSB0aGlzCiAgICAgICAgIC8vIHByZWZlcmVuY2Ugc2hvdWxkIGJlIHBlcnNpc3RlbnQsIGFsb25nIHdpdGggb3RoZXIgdXNlZnVsIGNoZWNrcykKICAgICAgICAgcGVyc2lzdEludChtQ2xpY2tDb3VudGVyKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gRGF0YSBoYXMgY2hhbmdlZCwgbm90aWZ5IHNvIFVJIGNhbiBiZSByZWZyZXNoZWQhCiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAgICAgICogbXVzdCBzYXZlIHRoZSBpbnN0YW5jZSBzdGF0ZSBzbyBpdCBpcyBhYmxlIHRvLCBmb3IgZXhhbXBsZSwgc3Vydml2ZQogICAgICAgICAgKiBvcmllbnRhdGlvbiBjaGFuZ2VzLgogICAgICAgICAgKi8KLSAgICAgICAgCisKICAgICAgICAgZmluYWwgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOwogICAgICAgICBpZiAoaXNQZXJzaXN0ZW50KCkpIHsKICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2F2ZSBpbnN0YW5jZSBzdGF0ZSBzaW5jZSBpdCdzIHBlcnNpc3RlbnQKQEAgLTEyMCwxNCArMTIwLDE0IEBACiAgICAgICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHN0YXRlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAKKwogICAgICAgICAvLyBSZXN0b3JlIHRoZSBpbnN0YW5jZSBzdGF0ZQogICAgICAgICBTYXZlZFN0YXRlIG15U3RhdGUgPSAoU2F2ZWRTdGF0ZSkgc3RhdGU7CiAgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUobXlTdGF0ZS5nZXRTdXBlclN0YXRlKCkpOwogICAgICAgICBtQ2xpY2tDb3VudGVyID0gbXlTdGF0ZS5jbGlja0NvdW50ZXI7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTYXZlZFN0YXRlLCBhIHN1YmNsYXNzIG9mIHtAbGluayBCYXNlU2F2ZWRTdGF0ZX0sIHdpbGwgc3RvcmUgdGhlIHN0YXRlCiAgICAgICogb2YgTXlQcmVmZXJlbmNlLCBhIHN1YmNsYXNzIG9mIFByZWZlcmVuY2UuCkBAIC0xMzYsMTAgKzEzNiwxMCBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CiAgICAgICAgIGludCBjbGlja0NvdW50ZXI7Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKICAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2xpY2sgY291bnRlcgogICAgICAgICAgICAgY2xpY2tDb3VudGVyID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICAgfQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKICAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGNsaWNrIGNvdW50ZXIKICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoY2xpY2tDb3VudGVyKTsKICAgICAgICAgfQpAQCAtMTY3LDUgKzE2Nyw1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQotICAgIAorCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YQpyZW5hbWUgdG8gc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCmluZGV4IDI3YzIyZGUuLjNhYTRlMzkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKIAogaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwogCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKKwogICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5wcmVmZXJlbmNlX2RlcGVuZGVuY2llcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlV2l0aEhlYWRlcnMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VXaXRoSGVhZGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzdlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlV2l0aEhlYWRlcnMuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgUHJlZmVyZW5jZUFjdGl2aXR5IHRvIG1ha2UgYSB0b3AtbGV2ZWwgcHJlZmVyZW5jZQorICogcGFuZWwgd2l0aCBoZWFkZXJzLgorICovCisvL0JFR0lOX0lOQ0xVREUoYWN0aXZpdHkpCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVdpdGhIZWFkZXJzIGV4dGVuZHMgUHJlZmVyZW5jZUFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICAvLyBBZGQgYSBidXR0b24gdG8gdGhlIGhlYWRlciBsaXN0LgorICAgICAgICBpZiAoaGFzSGVhZGVycygpKSB7CisgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzKTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRUZXh0KCJTb21lIGFjdGlvbiIpOworICAgICAgICAgICAgc2V0TGlzdEZvb3RlcihidXR0b24pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHRoZSBhY3Rpdml0eSB3aXRoIHRoZSB0b3AtbGV2ZWwgaGVhZGVycy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkJ1aWxkSGVhZGVycyhMaXN0PEhlYWRlcj4gdGFyZ2V0KSB7CisgICAgICAgIGxvYWRIZWFkZXJzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VfaGVhZGVycywgdGFyZ2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZyYWdtZW50IHNob3dzIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIGZpcnN0IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZWZzMUZyYWdtZW50IGV4dGVuZHMgUHJlZmVyZW5jZUZyYWdtZW50IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHByZWZlcmVuY2VzIGZyb20gYW4gWE1MIHJlc291cmNlCisgICAgICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5mcmFnbWVudGVkX3ByZWZlcmVuY2VzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnJhZ21lbnQgY29udGFpbnMgYSBzZWNvbmQtbGV2ZWwgc2V0IG9mIHByZWZlcmVuY2UgdGhhdCB5b3UKKyAgICAgKiBjYW4gZ2V0IHRvIGJ5IHRhcHBpbmcgYW4gaXRlbSBpbiB0aGUgZmlyc3QgcHJlZmVyZW5jZXMgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVmczFGcmFnbWVudElubmVyIGV4dGVuZHMgUHJlZmVyZW5jZUZyYWdtZW50IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIENhbiByZXRyaWV2ZSBhcmd1bWVudHMgZnJvbSBwcmVmZXJlbmNlIFhNTC4KKyAgICAgICAgICAgIExvZy5pKCJhcmdzIiwgIkFyZ3VtZW50czogIiArIGdldEFyZ3VtZW50cygpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKKyAgICAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLmZyYWdtZW50ZWRfcHJlZmVyZW5jZXNfaW5uZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmcmFnbWVudCBzaG93cyB0aGUgcHJlZmVyZW5jZXMgZm9yIHRoZSBzZWNvbmQgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZnMyRnJhZ21lbnQgZXh0ZW5kcyBQcmVmZXJlbmNlRnJhZ21lbnQgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gQ2FuIHJldHJpZXZlIGFyZ3VtZW50cyBmcm9tIGhlYWRlcnMgWE1MLgorICAgICAgICAgICAgTG9nLmkoImFyZ3MiLCAiQXJndW1lbnRzOiAiICsgZ2V0QXJndW1lbnRzKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBwcmVmZXJlbmNlcyBmcm9tIGFuIFhNTCByZXNvdXJjZQorICAgICAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwucHJlZmVyZW5jZV9kZXBlbmRlbmNpZXMpOworICAgICAgICB9CisgICAgfQorfQorLy9FTkRfSU5DTFVERShhY3Rpdml0eSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZXNGcm9tQ29kZS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZXNGcm9tQ29kZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZXNGcm9tQ29kZS5qYXZhCnJlbmFtZSB0byBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEKaW5kZXggYmUyMmI0OS4uOGNlNmI0MiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZXNGcm9tQ29kZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CkBAIC0zNCwyNiArMzQsMjYgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4oY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpKTsKICAgICB9CiAKICAgICBwcml2YXRlIFByZWZlcmVuY2VTY3JlZW4gY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpIHsKICAgICAgICAgLy8gUm9vdAogICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIHJvb3QgPSBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4odGhpcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbmxpbmUgcHJlZmVyZW5jZXMgCisKKyAgICAgICAgLy8gSW5saW5lIHByZWZlcmVuY2VzCiAgICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBpbmxpbmVQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKICAgICAgICAgaW5saW5lUHJlZkNhdC5zZXRUaXRsZShSLnN0cmluZy5pbmxpbmVfcHJlZmVyZW5jZXMpOwogICAgICAgICByb290LmFkZFByZWZlcmVuY2UoaW5saW5lUHJlZkNhdCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRvZ2dsZSBwcmVmZXJlbmNlCiAgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSB0b2dnbGVQcmVmID0gbmV3IENoZWNrQm94UHJlZmVyZW5jZSh0aGlzKTsKICAgICAgICAgdG9nZ2xlUHJlZi5zZXRLZXkoInRvZ2dsZV9wcmVmZXJlbmNlIik7CiAgICAgICAgIHRvZ2dsZVByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfdG9nZ2xlX3ByZWZlcmVuY2UpOwogICAgICAgICB0b2dnbGVQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV90b2dnbGVfcHJlZmVyZW5jZSk7CiAgICAgICAgIGlubGluZVByZWZDYXQuYWRkUHJlZmVyZW5jZSh0b2dnbGVQcmVmKTsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAvLyBEaWFsb2cgYmFzZWQgcHJlZmVyZW5jZXMKICAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IGRpYWxvZ0Jhc2VkUHJlZkNhdCA9IG5ldyBQcmVmZXJlbmNlQ2F0ZWdvcnkodGhpcyk7CiAgICAgICAgIGRpYWxvZ0Jhc2VkUHJlZkNhdC5zZXRUaXRsZShSLnN0cmluZy5kaWFsb2dfYmFzZWRfcHJlZmVyZW5jZXMpOwpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICBlZGl0VGV4dFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfZWRpdHRleHRfcHJlZmVyZW5jZSk7CiAgICAgICAgIGVkaXRUZXh0UHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfZWRpdHRleHRfcHJlZmVyZW5jZSk7CiAgICAgICAgIGRpYWxvZ0Jhc2VkUHJlZkNhdC5hZGRQcmVmZXJlbmNlKGVkaXRUZXh0UHJlZik7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIExpc3QgcHJlZmVyZW5jZQogICAgICAgICBMaXN0UHJlZmVyZW5jZSBsaXN0UHJlZiA9IG5ldyBMaXN0UHJlZmVyZW5jZSh0aGlzKTsKICAgICAgICAgbGlzdFByZWYuc2V0RW50cmllcyhSLmFycmF5LmVudHJpZXNfbGlzdF9wcmVmZXJlbmNlKTsKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgbGlzdFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfbGlzdF9wcmVmZXJlbmNlKTsKICAgICAgICAgbGlzdFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X2xpc3RfcHJlZmVyZW5jZSk7CiAgICAgICAgIGRpYWxvZ0Jhc2VkUHJlZkNhdC5hZGRQcmVmZXJlbmNlKGxpc3RQcmVmKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gTGF1bmNoIHByZWZlcmVuY2VzCiAgICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBsYXVuY2hQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKICAgICAgICAgbGF1bmNoUHJlZkNhdC5zZXRUaXRsZShSLnN0cmluZy5sYXVuY2hfcHJlZmVyZW5jZXMpOwpAQCAtOTMsMTkgKzkzLDE5IEBACiAgICAgICAgIHNjcmVlblByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfc2NyZWVuX3ByZWZlcmVuY2UpOwogICAgICAgICBzY3JlZW5QcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9zY3JlZW5fcHJlZmVyZW5jZSk7CiAgICAgICAgIGxhdW5jaFByZWZDYXQuYWRkUHJlZmVyZW5jZShzY3JlZW5QcmVmKTsKLSAgICAgICAgCisKICAgICAgICAgLyoKICAgICAgICAgICogWW91IGNhbiBhZGQgbW9yZSBwcmVmZXJlbmNlcyB0byBzY3JlZW5QcmVmIHRoYXQgd2lsbCBiZSBzaG93biBvbiB0aGUKICAgICAgICAgICogbmV4dCBzY3JlZW4uCiAgICAgICAgICAqLwotICAgICAgICAKKwogICAgICAgICAvLyBFeGFtcGxlIG9mIG5leHQgc2NyZWVuIHRvZ2dsZSBwcmVmZXJlbmNlCiAgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSBuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmID0gbmV3IENoZWNrQm94UHJlZmVyZW5jZSh0aGlzKTsKICAgICAgICAgbmV4dFNjcmVlbkNoZWNrQm94UHJlZi5zZXRLZXkoIm5leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlIik7CiAgICAgICAgIG5leHRTY3JlZW5DaGVja0JveFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfbmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UpOwogICAgICAgICBuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSk7CiAgICAgICAgIHNjcmVlblByZWYuYWRkUHJlZmVyZW5jZShuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gSW50ZW50IHByZWZlcmVuY2UKICAgICAgICAgUHJlZmVyZW5jZVNjcmVlbiBpbnRlbnRQcmVmID0gZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5jcmVhdGVQcmVmZXJlbmNlU2NyZWVuKHRoaXMpOwogICAgICAgICBpbnRlbnRQcmVmLnNldEludGVudChuZXcgSW50ZW50KCkuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fVklFVykKQEAgLTExMywxOCArMTEzLDE4IEBACiAgICAgICAgIGludGVudFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfaW50ZW50X3ByZWZlcmVuY2UpOwogICAgICAgICBpbnRlbnRQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9pbnRlbnRfcHJlZmVyZW5jZSk7CiAgICAgICAgIGxhdW5jaFByZWZDYXQuYWRkUHJlZmVyZW5jZShpbnRlbnRQcmVmKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gUHJlZmVyZW5jZSBhdHRyaWJ1dGVzCiAgICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBwcmVmQXR0cnNDYXQgPSBuZXcgUHJlZmVyZW5jZUNhdGVnb3J5KHRoaXMpOwogICAgICAgICBwcmVmQXR0cnNDYXQuc2V0VGl0bGUoUi5zdHJpbmcucHJlZmVyZW5jZV9hdHRyaWJ1dGVzKTsKICAgICAgICAgcm9vdC5hZGRQcmVmZXJlbmNlKHByZWZBdHRyc0NhdCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFZpc3VhbCBwYXJlbnQgdG9nZ2xlIHByZWZlcmVuY2UKICAgICAgICAgQ2hlY2tCb3hQcmVmZXJlbmNlIHBhcmVudENoZWNrQm94UHJlZiA9IG5ldyBDaGVja0JveFByZWZlcmVuY2UodGhpcyk7CiAgICAgICAgIHBhcmVudENoZWNrQm94UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9wYXJlbnRfcHJlZmVyZW5jZSk7CiAgICAgICAgIHBhcmVudENoZWNrQm94UHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfcGFyZW50X3ByZWZlcmVuY2UpOwogICAgICAgICBwcmVmQXR0cnNDYXQuYWRkUHJlZmVyZW5jZShwYXJlbnRDaGVja0JveFByZWYpOwotICAgICAgICAKKwogICAgICAgICAvLyBWaXN1YWwgY2hpbGQgdG9nZ2xlIHByZWZlcmVuY2UKICAgICAgICAgLy8gU2VlIHJlcy92YWx1ZXMvYXR0cnMueG1sIGZvciB0aGUgPGRlY2xhcmUtc3R5bGVhYmxlPiB0aGF0IGRlZmluZXMKICAgICAgICAgLy8gVG9nZ2xlUHJlZkF0dHJzLgpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAwKSk7CiAgICAgICAgIHByZWZBdHRyc0NhdC5hZGRQcmVmZXJlbmNlKGNoaWxkQ2hlY2tCb3hQcmVmKTsKICAgICAgICAgYS5yZWN5Y2xlKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiByb290OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21YbWwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VzRnJvbVhtbC5qYXZhCnJlbmFtZSB0byBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21YbWwuamF2YQppbmRleCA2M2JiYWMyLi44NjhlMzNjIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VzRnJvbVhtbC5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VzRnJvbVhtbC5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOwogCiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CiAKQEAgLTI2LDcgKzI2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIExvYWQgdGhlIHByZWZlcmVuY2VzIGZyb20gYW4gWE1MIHJlc291cmNlCiAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9DaGVlc2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9DaGVlc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmN2Q2MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NoZWVzZXMuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKKworcHVibGljIGNsYXNzIENoZWVzZXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ2hlZXNlU3RyaW5ncyA9IHsKKyAgICAgICAgICAgICJBYmJheWUgZGUgQmVsbG9jIiwgIkFiYmF5ZSBkdSBNb250IGRlcyBDYXRzIiwgIkFiZXJ0YW0iLCAiQWJvbmRhbmNlIiwgIkFja2F3aSIsCisgICAgICAgICAgICAiQWNvcm4iLCAiQWRlbG9zdCIsICJBZmZpZGVsaWNlIGF1IENoYWJsaXMiLCAiQWZ1ZWdhJ2wgUGl0dSIsICJBaXJhZyIsICJBaXJlZGFsZSIsCisgICAgICAgICAgICAiQWlzeSBDZW5kcmUiLCAiQWxsZ2F1ZXIgRW1tZW50YWxlciIsICJBbHZlcmNhIiwgIkFtYmVydCIsICJBbWVyaWNhbiBDaGVlc2UiLAorICAgICAgICAgICAgIkFtaSBkdSBDaGFtYmVydGluIiwgIkFuZWpvIEVuY2hpbGFkbyIsICJBbm5lYXUgZHUgVmljLUJpbGgiLCAiQW50aG9yaXJvIiwgIkFwcGVuemVsbCIsCisgICAgICAgICAgICAiQXJhZ29uIiwgIkFyZGkgR2FzbmEiLCAiQXJkcmFoYW4iLCAiQXJtZW5pYW4gU3RyaW5nIiwgIkFyb21lcyBhdSBHZW5lIGRlIE1hcmMiLAorICAgICAgICAgICAgIkFzYWRlcm8iLCAiQXNpYWdvIiwgIkF1YmlzcXVlIFB5cmVuZWVzIiwgIkF1dHVuIiwgIkF2YXh0c2t5ciIsICJCYWJ5IFN3aXNzIiwKKyAgICAgICAgICAgICJCYWJ5YmVsIiwgIkJhZ3VldHRlIExhb25uYWlzZSIsICJCYWtlcnMiLCAiQmFsYWRpIiwgIkJhbGF0b24iLCAiQmFuZGFsIiwgIkJhbm9uIiwKKyAgICAgICAgICAgICJCYXJyeSdzIEJheSBDaGVkZGFyIiwgIkJhc2luZyIsICJCYXNrZXQgQ2hlZXNlIiwgIkJhdGggQ2hlZXNlIiwgIkJhdmFyaWFuIEJlcmdrYXNlIiwKKyAgICAgICAgICAgICJCYXlsb3VnaCIsICJCZWF1Zm9ydCIsICJCZWF1dm9vcmRlIiwgIkJlZW5sZWlnaCBCbHVlIiwgIkJlZXIgQ2hlZXNlIiwgIkJlbCBQYWVzZSIsCisgICAgICAgICAgICAiQmVyZ2FkZXIiLCAiQmVyZ2VyZSBCbGV1ZSIsICJCZXJrc3dlbGwiLCAiQmV5YXogUGV5bmlyIiwgIkJpZXJrYXNlIiwgIkJpc2hvcCBLZW5uZWR5IiwKKyAgICAgICAgICAgICJCbGFybmV5IiwgIkJsZXUgZCdBdXZlcmduZSIsICJCbGV1IGRlIEdleCIsICJCbGV1IGRlIExhcXVldWlsbGUiLAorICAgICAgICAgICAgIkJsZXUgZGUgU2VwdG1vbmNlbCIsICJCbGV1IERlcyBDYXVzc2VzIiwgIkJsdWUiLCAiQmx1ZSBDYXN0ZWxsbyIsICJCbHVlIFJhdGhnb3JlIiwKKyAgICAgICAgICAgICJCbHVlIFZlaW4gKEF1c3RyYWxpYW4pIiwgIkJsdWUgVmVpbiBDaGVlc2VzIiwgIkJvY2NvbmNpbmkiLCAiQm9jY29uY2luaSAoQXVzdHJhbGlhbikiLAorICAgICAgICAgICAgIkJvZXJlbiBMZWlkZW5rYWFzIiwgIkJvbmNoZXN0ZXIiLCAiQm9zd29ydGgiLCAiQm91Z29uIiwgIkJvdWxlIER1IFJvdmVzIiwKKyAgICAgICAgICAgICJCb3VsZXR0ZSBkJ0F2ZXNuZXMiLCAiQm91cnNhdWx0IiwgIkJvdXJzaW4iLCAiQm91eXNzb3UiLCAiQnJhIiwgIkJyYXVkb3N0dXIiLAorICAgICAgICAgICAgIkJyZWFrZmFzdCBDaGVlc2UiLCAiQnJlYmlzIGR1IExhdm9ydCIsICJCcmViaXMgZHUgTG9jaG9pcyIsICJCcmViaXMgZHUgUHV5ZmF1Y29uIiwKKyAgICAgICAgICAgICJCcmVzc2UgQmxldSIsICJCcmljayIsICJCcmllIiwgIkJyaWUgZGUgTWVhdXgiLCAiQnJpZSBkZSBNZWx1biIsICJCcmlsbGF0LVNhdmFyaW4iLAorICAgICAgICAgICAgIkJyaW4iLCAiQnJpbiBkJyBBbW91ciIsICJCcmluIGQnQW1vdXIiLCAiQnJpbnphIChCdXJkdWYgQnJpbnphKSIsCisgICAgICAgICAgICAiQnJpcXVldHRlIGRlIEJyZWJpcyIsICJCcmlxdWV0dGUgZHUgRm9yZXoiLCAiQnJvY2NpbyIsICJCcm9jY2lvIERlbWktQWZmaW5lIiwKKyAgICAgICAgICAgICJCcm91c3NlIGR1IFJvdmUiLCAiQnJ1ZGVyIEJhc2lsIiwgIkJydXNzZWxhZSBLYWFzIChGcm9tYWdlIGRlIEJydXhlbGxlcykiLCAiQnJ5bmR6YSIsCisgICAgICAgICAgICAiQnVjaGV0dGUgZCdBbmpvdSIsICJCdWZmYWxvIiwgIkJ1cmdvcyIsICJCdXR0ZSIsICJCdXR0ZXJrYXNlIiwgIkJ1dHRvbiAoSW5uZXMpIiwKKyAgICAgICAgICAgICJCdXh0b24gQmx1ZSIsICJDYWJlY291IiwgIkNhYm9jIiwgIkNhYnJhbGVzIiwgIkNhY2hhaWxsZSIsICJDYWNpb2NhdmFsbG8iLCAiQ2FjaW90dGEiLAorICAgICAgICAgICAgIkNhZXJwaGlsbHkiLCAiQ2Fpcm5zbW9yZSIsICJDYWxlbnphbmEiLCAiQ2FtYmF6b2xhIiwgIkNhbWVtYmVydCBkZSBOb3JtYW5kaWUiLAorICAgICAgICAgICAgIkNhbmFkaWFuIENoZWRkYXIiLCAiQ2FuZXN0cmF0byIsICJDYW50YWwiLCAiQ2FwcmljZSBkZXMgRGlldXgiLCAiQ2Fwcmljb3JuIEdvYXQiLAorICAgICAgICAgICAgIkNhcHJpb2xlIEJhbm9uIiwgIkNhcnJlIGRlIGwnRXN0IiwgIkNhc2Npb3R0YSBkaSBVcmJpbm8iLCAiQ2FzaGVsIEJsdWUiLCAiQ2FzdGVsbGFubyIsCisgICAgICAgICAgICAiQ2FzdGVsbGVubyIsICJDYXN0ZWxtYWdubyIsICJDYXN0ZWxvIEJyYW5jbyIsICJDYXN0aWdsaWFubyIsICJDYXRoZWxhaW4iLAorICAgICAgICAgICAgIkNlbHRpYyBQcm9taXNlIiwgIkNlbmRyZSBkJ09saXZldCIsICJDZXJuZXkiLCAiQ2hhYmljaG91IiwgIkNoYWJpY2hvdSBkdSBQb2l0b3UiLAorICAgICAgICAgICAgIkNoYWJpcyBkZSBHYXRpbmUiLCAiQ2hhb3VyY2UiLCAiQ2hhcm9sYWlzIiwgIkNoYXVtZXMiLCAiQ2hlZGRhciIsCisgICAgICAgICAgICAiQ2hlZGRhciBDbG90aGJvdW5kIiwgIkNoZXNoaXJlIiwgIkNoZXZyZXMiLCAiQ2hldnJvdGluIGRlcyBBcmF2aXMiLCAiQ2hvbnRhbGVubyIsCisgICAgICAgICAgICAiQ2l2cmF5IiwgIkNvZXVyIGRlIENhbWVtYmVydCBhdSBDYWx2YWRvcyIsICJDb2V1ciBkZSBDaGV2cmUiLCAiQ29sYnkiLCAiQ29sZCBQYWNrIiwKKyAgICAgICAgICAgICJDb210ZSIsICJDb29sZWEiLCAiQ29vbGVuZXkiLCAiQ29xdWV0ZGFsZSIsICJDb3JsZWdneSIsICJDb3JuaXNoIFBlcHBlciIsCisgICAgICAgICAgICAiQ290aGVyc3RvbmUiLCAiQ290aWphIiwgIkNvdHRhZ2UgQ2hlZXNlIiwgIkNvdHRhZ2UgQ2hlZXNlIChBdXN0cmFsaWFuKSIsCisgICAgICAgICAgICAiQ291Z2FyIEdvbGQiLCAiQ291bG9tbWllcnMiLCAiQ292ZXJkYWxlIiwgIkNyYXlldXggZGUgUm9uY3EiLCAiQ3JlYW0gQ2hlZXNlIiwKKyAgICAgICAgICAgICJDcmVhbSBIYXZhcnRpIiwgIkNyZW1hIEFncmlhIiwgIkNyZW1hIE1leGljYW5hIiwgIkNyZW1lIEZyYWljaGUiLCAiQ3Jlc2NlbnphIiwKKyAgICAgICAgICAgICJDcm9naGFuIiwgIkNyb3R0aW4gZGUgQ2hhdmlnbm9sIiwgIkNyb3R0aW4gZHUgQ2hhdmlnbm9sIiwgIkNyb3dkaWUiLCAiQ3Jvd2xleSIsCisgICAgICAgICAgICAiQ3VhamFkYSIsICJDdXJkIiwgIkN1cmUgTmFudGFpcyIsICJDdXJ3b3J0aHkiLCAiQ3dtdGF3ZSBQZWNvcmlubyIsCisgICAgICAgICAgICAiQ3lwcmVzcyBHcm92ZSBDaGV2cmUiLCAiRGFuYWJsdSAoRGFuaXNoIEJsdWUpIiwgIkRhbmJvIiwgIkRhbmlzaCBGb250aW5hIiwKKyAgICAgICAgICAgICJEYXJhbGFnamF6c2t5IiwgIkRhdXBoaW4iLCAiRGVsaWNlIGRlcyBGaW91dmVzIiwgIkRlbmhhbnkgRG9yc2V0IERydW0iLCAiRGVyYnkiLAorICAgICAgICAgICAgIkRlc3NlcnRueWogQmVseWoiLCAiRGV2b24gQmx1ZSIsICJEZXZvbiBHYXJsYW5kIiwgIkRvbGNlbGF0dGUiLCAiRG9vbGluIiwKKyAgICAgICAgICAgICJEb3BwZWxyaGFtc3R1ZmVsIiwgIkRvcnNldCBCbHVlIFZpbm5leSIsICJEb3VibGUgR2xvdWNlc3RlciIsICJEb3VibGUgV29yY2VzdGVyIiwKKyAgICAgICAgICAgICJEcmV1eCBhIGxhIEZldWlsbGUiLCAiRHJ5IEphY2siLCAiRHVkZGxlc3dlbGwiLCAiRHVuYmFycmEiLCAiRHVubG9wIiwgIkR1bnN5cmUgQmx1ZSIsCisgICAgICAgICAgICAiRHVyb2JsYW5kbyIsICJEdXJydXMiLCAiRHV0Y2ggTWltb2xldHRlIChDb21taXNzaWVrYWFzKSIsICJFZGFtIiwgIkVkZWxwaWx6IiwKKyAgICAgICAgICAgICJFbWVudGFsIEdyYW5kIENydSIsICJFbWxldHQiLCAiRW1tZW50YWwiLCAiRXBvaXNzZXMgZGUgQm91cmdvZ25lIiwgIkVzYmFyZWljaCIsCisgICAgICAgICAgICAiRXNyb20iLCAiRXRvcmtpIiwgIkV2YW5zZGFsZSBGYXJtaG91c2UgQnJpZSIsICJFdm9yYSBEZSBMJ0FsZW50ZWpvIiwgIkV4bW9vciBCbHVlIiwKKyAgICAgICAgICAgICJFeHBsb3JhdGV1ciIsICJGZXRhIiwgIkZldGEgKEF1c3RyYWxpYW4pIiwgIkZpZ3VlIiwgIkZpbGV0dGEiLCAiRmluLWRlLVNpZWNsZSIsCisgICAgICAgICAgICAiRmlubGFuZGlhIFN3aXNzIiwgIkZpbm4iLCAiRmlvcmUgU2FyZG8iLCAiRmxldXIgZHUgTWFxdWlzIiwgIkZsb3IgZGUgR3VpYSIsCisgICAgICAgICAgICAiRmxvd2VyIE1hcmllIiwgIkZvbGRlZCIsICJGb2xkZWQgY2hlZXNlIHdpdGggbWludCIsICJGb25kYW50IGRlIEJyZWJpcyIsCisgICAgICAgICAgICAiRm9udGFpbmVibGVhdSIsICJGb250YWwiLCAiRm9udGluYSBWYWwgZCdBb3N0YSIsICJGb3JtYWdnaW8gZGkgY2FwcmEiLCAiRm91Z2VydXMiLAorICAgICAgICAgICAgIkZvdXIgSGVyYiBHb3VkYSIsICJGb3VybWUgZCcgQW1iZXJ0IiwgIkZvdXJtZSBkZSBIYXV0ZSBMb2lyZSIsICJGb3VybWUgZGUgTW9udGJyaXNvbiIsCisgICAgICAgICAgICAiRnJlc2ggSmFjayIsICJGcmVzaCBNb3p6YXJlbGxhIiwgIkZyZXNoIFJpY290dGEiLCAiRnJlc2ggVHJ1ZmZsZXMiLCAiRnJpYm91cmdlb2lzIiwKKyAgICAgICAgICAgICJGcmllc2VrYWFzIiwgIkZyaWVzaWFuIiwgIkZyaWVzbGEiLCAiRnJpbmF1bHQiLCAiRnJvbWFnZSBhIFJhY2xldHRlIiwgIkZyb21hZ2UgQ29yc2UiLAorICAgICAgICAgICAgIkZyb21hZ2UgZGUgTW9udGFnbmUgZGUgU2F2b2llIiwgIkZyb21hZ2UgRnJhaXMiLCAiRnJ1aXQgQ3JlYW0gQ2hlZXNlIiwKKyAgICAgICAgICAgICJGcnlpbmcgQ2hlZXNlIiwgIkZ5bmJvIiwgIkdhYnJpZWwiLCAiR2FsZXR0ZSBkdSBQYWx1ZGllciIsICJHYWxldHRlIEx5b25uYWlzZSIsCisgICAgICAgICAgICAiR2FsbG93YXkgR29hdCdzIE1pbGsgR2VtcyIsICJHYW1tZWxvc3QiLCAiR2FwZXJvbiBhIGwnQWlsIiwgIkdhcnJvdHhhIiwgIkdhc3RhbmJlcnJhIiwKKyAgICAgICAgICAgICJHZWl0b3N0IiwgIkdpcHBzbGFuZCBCbHVlIiwgIkdqZXRvc3QiLCAiR2xvdWNlc3RlciIsICJHb2xkZW4gQ3Jvc3MiLCAiR29yZ29uem9sYSIsCisgICAgICAgICAgICAiR29ybnlhbHRhanNraSIsICJHb3NwZWwgR3JlZW4iLCAiR291ZGEiLCAiR291dHUiLCAiR293cmllIiwgIkdyYWJldHRvIiwgIkdyYWRkb3N0IiwKKyAgICAgICAgICAgICJHcmFmdG9uIFZpbGxhZ2UgQ2hlZGRhciIsICJHcmFuYSIsICJHcmFuYSBQYWRhbm8iLCAiR3JhbmQgVmF0ZWwiLAorICAgICAgICAgICAgIkdyYXRhcm9uIGQnIEFyZWNoZXMiLCAiR3JhdHRlLVBhaWxsZSIsICJHcmF2aWVyYSIsICJHcmV1aWxoIiwgIkdyZXZlIiwKKyAgICAgICAgICAgICJHcmlzIGRlIExpbGxlIiwgIkdydXllcmUiLCAiR3ViYmVlbiIsICJHdWVyYmlnbnkiLCAiSGFsbG91bWkiLAorICAgICAgICAgICAgIkhhbGxvdW15IChBdXN0cmFsaWFuKSIsICJIYWxvdW1pLVN0eWxlIENoZWVzZSIsICJIYXJib3VybmUgQmx1ZSIsICJIYXZhcnRpIiwKKyAgICAgICAgICAgICJIZWlkaSBHcnV5ZXJlIiwgIkhlcmVmb3JkIEhvcCIsICJIZXJyZ2FyZHNvc3QiLCAiSGVycmlvdCBGYXJtaG91c2UiLCAiSGVydmUiLAorICAgICAgICAgICAgIkhpcGkgSXRpIiwgIkh1YmJhcmRzdG9uIEJsdWUgQ293IiwgIkh1c2hhbGxzb3N0IiwgIkliZXJpY28iLCAiSWRhaG8gR29hdHN0ZXIiLAorICAgICAgICAgICAgIklkaWF6YWJhbCIsICJJbCBCb3NjaGV0dG8gYWwgVGFydHVmbyIsICJJbGUgZCdZZXUiLCAiSXNsZSBvZiBNdWxsIiwgIkphcmxzYmVyZyIsCisgICAgICAgICAgICAiSmVybWkgVG9ydGVzIiwgIkppYm5laCBBcmFiaWVoIiwgIkppbmRpIEJyaWUiLCAiSnViaWxlZSBCbHVlIiwgIkp1dXN0b2xlaXBhIiwKKyAgICAgICAgICAgICJLYWRjaGdhbGwiLCAiS2FzZXJpIiwgIkthc2h0YSIsICJLZWZhbG90eXJpIiwgIktlbmFmYSIsICJLZXJuaGVtIiwgIktlcnZlbGxhIEFmZmluZSIsCisgICAgICAgICAgICAiS2lrb3JhbmdpIiwgIktpbmcgSXNsYW5kIENhcGUgV2lja2hhbSBCcmllIiwgIktpbmcgUml2ZXIgR29sZCIsICJLbG9zdGVya2Flc2UiLAorICAgICAgICAgICAgIktub2NrYWxhcmEiLCAiS3VnZWxrYXNlIiwgIkwnQXZleXJvbm5haXMiLCAiTCdFY2lyIGRlIGwnQXVicmFjIiwgIkxhIFRhdXBpbmllcmUiLAorICAgICAgICAgICAgIkxhIFZhY2hlIFF1aSBSaXQiLCAiTGFndWlvbGUiLCAiTGFpcm9iZWxsIiwgIkxhanRhIiwgIkxhbmFyayBCbHVlIiwgIkxhbmNhc2hpcmUiLAorICAgICAgICAgICAgIkxhbmdyZXMiLCAiTGFwcGkiLCAiTGFydW5zIiwgIkxhdmlzdG93biIsICJMZSBCcmluIiwgIkxlIEZpdW0gT3JibyIsICJMZSBMYWNhbmRvdSIsCisgICAgICAgICAgICAiTGUgUm91bGUiLCAiTGVhZmllbGQiLCAiTGViYmVuZSIsICJMZWVyZGFtbWVyIiwgIkxlaWNlc3RlciIsICJMZXlkZW4iLCAiTGltYnVyZ2VyIiwKKyAgICAgICAgICAgICJMaW5jb2xuc2hpcmUgUG9hY2hlciIsICJMaW5nb3QgU2FpbnQgQm91c3F1ZXQgZCdPcmIiLCAiTGlwdGF1ZXIiLCAiTGl0dGxlIFJ5ZGluZ3MiLAorICAgICAgICAgICAgIkxpdmFyb3QiLCAiTGxhbmJvaWR5IiwgIkxsYW5nbG9mYW4gRmFybWhvdXNlIiwgIkxvY2ggQXJ0aHVyIEZhcm1ob3VzZSIsCisgICAgICAgICAgICAiTG9kZGlzd2VsbCBBdm9uZGFsZSIsICJMb25naG9ybiIsICJMb3UgUGFsb3UiLCAiTG91IFBldnJlIiwgIkx5b25uYWlzIiwgIk1hYXNkYW0iLAorICAgICAgICAgICAgIk1hY2NvbmFpcyIsICJNYWhvZSBBZ2VkIEdvdWRhIiwgIk1haG9uIiwgIk1hbHZlcm4iLCAiTWFtaXJvbGxlIiwgIk1hbmNoZWdvIiwKKyAgICAgICAgICAgICJNYW5vdXJpIiwgIk1hbnVyIiwgIk1hcmJsZSBDaGVkZGFyIiwgIk1hcmJsZWQgQ2hlZXNlcyIsICJNYXJlZHNvdXMiLCAiTWFyZ290aW4iLAorICAgICAgICAgICAgIk1hcmlibyIsICJNYXJvaWxsZXMiLCAiTWFzY2FyZXMiLCAiTWFzY2FycG9uZSIsICJNYXNjYXJwb25lIChBdXN0cmFsaWFuKSIsCisgICAgICAgICAgICAiTWFzY2FycG9uZSBUb3J0YSIsICJNYXRvY3EiLCAiTWF5dGFnIEJsdWUiLCAiTWVpcmEiLCAiTWVuYWxsYWNrIEZhcm1ob3VzZSIsCisgICAgICAgICAgICAiTWVub25pdGEiLCAiTWVyZWRpdGggQmx1ZSIsICJNZXNvc3QiLCAiTWV0dG9uIChDYW5jb2lsbG90dGUpIiwgIk1leWVyIFZpbnRhZ2UgR291ZGEiLAorICAgICAgICAgICAgIk1paGFsaWMgUGV5bmlyIiwgIk1pbGxlZW5zIiwgIk1pbW9sZXR0ZSIsICJNaW5lLUdhYmhhciIsICJNaW5pIEJhYnkgQmVsbHMiLCAiTWl4dGUiLAorICAgICAgICAgICAgIk1vbGJvIiwgIk1vbmFzdGVyeSBDaGVlc2VzIiwgIk1vbmRzZWVyIiwgIk1vbnQgRCdvciBMeW9ubmFpcyIsICJNb250YXNpbyIsCisgICAgICAgICAgICAiTW9udGVyZXkgSmFjayIsICJNb250ZXJleSBKYWNrIERyeSIsICJNb3JiaWVyIiwgIk1vcmJpZXIgQ3J1IGRlIE1vbnRhZ25lIiwKKyAgICAgICAgICAgICJNb3RoYWlzIGEgbGEgRmV1aWxsZSIsICJNb3p6YXJlbGxhIiwgIk1venphcmVsbGEgKEF1c3RyYWxpYW4pIiwKKyAgICAgICAgICAgICJNb3p6YXJlbGxhIGRpIEJ1ZmFsYSIsICJNb3p6YXJlbGxhIEZyZXNoLCBpbiB3YXRlciIsICJNb3p6YXJlbGxhIFJvbGxzIiwgIk11bnN0ZXIiLAorICAgICAgICAgICAgIk11cm9sIiwgIk15Y2VsbGEiLCAiTXl6aXRocmEiLCAiTmFib3Vsc2kiLCAiTmFudGFpcyIsICJOZXVmY2hhdGVsIiwKKyAgICAgICAgICAgICJOZXVmY2hhdGVsIChBdXN0cmFsaWFuKSIsICJOaW9sbyIsICJOb2trZWxvc3QiLCAiTm9ydGh1bWJlcmxhbmQiLCAiT2F4YWNhIiwKKyAgICAgICAgICAgICJPbGRlIFlvcmsiLCAiT2xpdmV0IGF1IEZvaW4iLCAiT2xpdmV0IEJsZXUiLCAiT2xpdmV0IENlbmRyZSIsCisgICAgICAgICAgICAiT3JrbmV5IEV4dHJhIE1hdHVyZSBDaGVkZGFyIiwgIk9ybGEiLCAiT3NjaHRqZXBrYSIsICJPc3NhdSBGZXJtaWVyIiwgIk9zc2F1LUlyYXR5IiwKKyAgICAgICAgICAgICJPc3pjenlwZWsiLCAiT3hmb3JkIEJsdWUiLCAiUCd0aXQgQmVycmljaG9uIiwgIlBhbGV0IGRlIEJhYmxpZ255IiwgIlBhbmVlciIsICJQYW5lbGEiLAorICAgICAgICAgICAgIlBhbm5lcm9uZSIsICJQYW50IHlzIEdhd24iLCAiUGFybWVzYW4gKFBhcm1pZ2lhbm8pIiwgIlBhcm1pZ2lhbm8gUmVnZ2lhbm8iLAorICAgICAgICAgICAgIlBhcyBkZSBsJ0VzY2FsZXR0ZSIsICJQYXNzZW5kYWxlIiwgIlBhc3RldXJpemVkIFByb2Nlc3NlZCIsICJQYXRlIGRlIEZyb21hZ2UiLAorICAgICAgICAgICAgIlBhdGVmaW5lIEZvcnQiLCAiUGF2ZSBkJ0FmZmlub2lzIiwgIlBhdmUgZCdBdWdlIiwgIlBhdmUgZGUgQ2hpcmFjIiwgIlBhdmUgZHUgQmVycnkiLAorICAgICAgICAgICAgIlBlY29yaW5vIiwgIlBlY29yaW5vIGluIFdhbG51dCBMZWF2ZXMiLCAiUGVjb3Jpbm8gUm9tYW5vIiwgIlBlZWtza2lsbCBQeXJhbWlkIiwKKyAgICAgICAgICAgICJQZWxhcmRvbiBkZXMgQ2V2ZW5uZXMiLCAiUGVsYXJkb24gZGVzIENvcmJpZXJlcyIsICJQZW5hbWVsbGVyYSIsICJQZW5icnluIiwKKyAgICAgICAgICAgICJQZW5jYXJyZWciLCAiUGVyYWlsIGRlIEJyZWJpcyIsICJQZXRpdCBNb3JpbiIsICJQZXRpdCBQYXJkb3UiLCAiUGV0aXQtU3Vpc3NlIiwKKyAgICAgICAgICAgICJQaWNvZG9uIGRlIENoZXZyZSIsICJQaWNvcyBkZSBFdXJvcGEiLCAiUGlvcmEiLCAiUGl0aHR2aWVycyBhdSBGb2luIiwKKyAgICAgICAgICAgICJQbGF0ZWF1IGRlIEhlcnZlIiwgIlBseW1vdXRoIENoZWVzZSIsICJQb2RoYWxhbnNraSIsICJQb2l2cmUgZCdBbmUiLCAiUG9sa29sYmluIiwKKyAgICAgICAgICAgICJQb250IGwnRXZlcXVlIiwgIlBvcnQgTmljaG9sc29uIiwgIlBvcnQtU2FsdXQiLCAiUG9zdGVsIiwgIlBvdWxpZ255LVNhaW50LVBpZXJyZSIsCisgICAgICAgICAgICAiUG91cmx5IiwgIlByYXN0b3N0IiwgIlByZXNzYXRvIiwgIlByaW5jZS1KZWFuIiwgIlByb2Nlc3NlZCBDaGVkZGFyIiwgIlByb3ZvbG9uZSIsCisgICAgICAgICAgICAiUHJvdm9sb25lIChBdXN0cmFsaWFuKSIsICJQeWVuZ2FuYSBDaGVkZGFyIiwgIlB5cmFtaWRlIiwgIlF1YXJrIiwKKyAgICAgICAgICAgICJRdWFyayAoQXVzdHJhbGlhbikiLCAiUXVhcnRpcm9sbyBMb21iYXJkbyIsICJRdWF0cmUtVmVudHMiLCAiUXVlcmN5IFBldGl0IiwKKyAgICAgICAgICAgICJRdWVzbyBCbGFuY28iLCAiUXVlc28gQmxhbmNvIGNvbiBGcnV0YXMgLS1QaW5hIHkgTWFuZ28iLCAiUXVlc28gZGUgTXVyY2lhIiwKKyAgICAgICAgICAgICJRdWVzbyBkZWwgTW9udHNlYyIsICJRdWVzbyBkZWwgVGlldGFyIiwgIlF1ZXNvIEZyZXNjbyIsICJRdWVzbyBGcmVzY28gKEFkb2JlcmEpIiwKKyAgICAgICAgICAgICJRdWVzbyBJYmVyaWNvIiwgIlF1ZXNvIEphbGFwZW5vIiwgIlF1ZXNvIE1ham9yZXJvIiwgIlF1ZXNvIE1lZGlhIEx1bmEiLAorICAgICAgICAgICAgIlF1ZXNvIFBhcmEgRnJpZXIiLCAiUXVlc28gUXVlc2FkaWxsYSIsICJSYWJhY2FsIiwgIlJhY2xldHRlIiwgIlJhZ3VzYW5vIiwgIlJhc2NoZXJhIiwKKyAgICAgICAgICAgICJSZWJsb2Nob24iLCAiUmVkIExlaWNlc3RlciIsICJSZWdhbCBkZSBsYSBEb21iZXMiLCAiUmVnZ2lhbml0byIsICJSZW1lZG91IiwKKyAgICAgICAgICAgICJSZXF1ZXNvbiIsICJSaWNoZWxpZXUiLCAiUmljb3R0YSIsICJSaWNvdHRhIChBdXN0cmFsaWFuKSIsICJSaWNvdHRhIFNhbGF0YSIsICJSaWRkZXIiLAorICAgICAgICAgICAgIlJpZ290dGUiLCAiUm9jYW1hZG91ciIsICJSb2xsb3QiLCAiUm9tYW5vIiwgIlJvbWFucyBQYXJ0IERpZXUiLCAiUm9uY2FsIiwgIlJvcXVlZm9ydCIsCisgICAgICAgICAgICAiUm91bGUiLCAiUm91bGVhdSBEZSBCZWF1bGlldSIsICJSb3lhbHAgVGlsc2l0IiwgIlJ1YmVucyIsICJSdXN0aW51IiwgIlNhYWxhbmQgUGZhcnIiLAorICAgICAgICAgICAgIlNhYW5lbmthZXNlIiwgIlNhZ2EiLCAiU2FnZSBEZXJieSIsICJTYWludGUgTWF1cmUiLCAiU2FpbnQtTWFyY2VsbGluIiwKKyAgICAgICAgICAgICJTYWludC1OZWN0YWlyZSIsICJTYWludC1QYXVsaW4iLCAiU2FsZXJzIiwgIlNhbXNvIiwgIlNhbiBTaW1vbiIsICJTYW5jZXJyZSIsCisgICAgICAgICAgICAiU2FwIFNhZ28iLCAiU2FyZG8iLCAiU2FyZG8gRWd5cHRpYW4iLCAiU2JyaW56IiwgIlNjYW1vcnphIiwgIlNjaGFiemllZ2VyIiwgIlNjaGxvc3MiLAorICAgICAgICAgICAgIlNlbGxlcyBzdXIgQ2hlciIsICJTZWx2YSIsICJTZXJhdCIsICJTZXJpb3VzbHkgU3Ryb25nIENoZWRkYXIiLCAiU2VycmEgZGEgRXN0cmVsYSIsCisgICAgICAgICAgICAiU2hhcnBhbSIsICJTaGVsYnVybmUgQ2hlZGRhciIsICJTaHJvcHNoaXJlIEJsdWUiLCAiU2lyYXoiLCAiU2lyZW5lIiwgIlNtb2tlZCBHb3VkYSIsCisgICAgICAgICAgICAiU29tZXJzZXQgQnJpZSIsICJTb25vbWEgSmFjayIsICJTb3R0b2NlbmFyZSBhbCBUYXJ0dWZvIiwgIlNvdW1haW50cmFpbiIsCisgICAgICAgICAgICAiU291cmlyZSBMb3plcmllbiIsICJTcGVud29vZCIsICJTcmFmZm9yZHNoaXJlIE9yZ2FuaWMiLCAiU3QuIEFndXIgQmx1ZSBDaGVlc2UiLAorICAgICAgICAgICAgIlN0aWx0b24iLCAiU3RpbmtpbmcgQmlzaG9wIiwgIlN0cmluZyIsICJTdXNzZXggU2xpcGNvdGUiLCAiU3ZlY2lhb3N0IiwgIlN3YWxlZGFsZSIsCisgICAgICAgICAgICAiU3dlZXQgU3R5bGUgU3dpc3MiLCAiU3dpc3MiLCAiU3lyaWFuIChBcm1lbmlhbiBTdHJpbmcpIiwgIlRhbGEiLCAiVGFsZWdnaW8iLCAiVGFtaWUiLAorICAgICAgICAgICAgIlRhc21hbmlhIEhpZ2hsYW5kIENoZXZyZSBMb2ciLCAiVGF1cGluaWVyZSIsICJUZWlmaSIsICJUZWxlbWVhIiwgIlRlc3RvdXJpIiwKKyAgICAgICAgICAgICJUZXRlIGRlIE1vaW5lIiwgIlRldGlsbGEiLCAiVGV4YXMgR29hdCBDaGVlc2UiLCAiVGliZXQiLCAiVGlsbGFtb29rIENoZWRkYXIiLAorICAgICAgICAgICAgIlRpbHNpdCIsICJUaW1ib29uIEJyaWUiLCAiVG9tYSIsICJUb21tZSBCcnVsZWUiLCAiVG9tbWUgZCdBYm9uZGFuY2UiLAorICAgICAgICAgICAgIlRvbW1lIGRlIENoZXZyZSIsICJUb21tZSBkZSBSb21hbnMiLCAiVG9tbWUgZGUgU2F2b2llIiwgIlRvbW1lIGRlcyBDaG91YW5zIiwgIlRvbW1lcyIsCisgICAgICAgICAgICAiVG9ydGEgZGVsIENhc2FyIiwgIlRvc2NhbmVsbG8iLCAiVG91cmVlIGRlIEwnQXViaWVyIiwgIlRvdXJtYWxldCIsCisgICAgICAgICAgICAiVHJhcHBlIChWZXJpdGFibGUpIiwgIlRyb2lzIENvcm5lcyBEZSBWZW5kZWUiLCAiVHJvbmNob24iLCAiVHJvdSBkdSBDcnUiLCAiVHJ1ZmZlIiwKKyAgICAgICAgICAgICJUdXBpIiwgIlR1cnVubWFhIiwgIlR5bXNib3JvIiwgIlR5biBHcnVnIiwgIlR5bmluZyIsICJVYnJpYWNvIiwgIlVsbG9hIiwKKyAgICAgICAgICAgICJWYWNoZXJpbi1Gcmlib3VyZ2VvaXMiLCAiVmFsZW5jYXkiLCAiVmFzdGVyYm90dGVub3N0IiwgIlZlbmFjbyIsICJWZW5kb21vaXMiLAorICAgICAgICAgICAgIlZpZXV4IENvcnNlIiwgIlZpZ25vdHRlIiwgIlZ1bHNjb21iZSIsICJXYWltYXRhIEZhcm1ob3VzZSBCbHVlIiwKKyAgICAgICAgICAgICJXYXNoZWQgUmluZCBDaGVlc2UgKEF1c3RyYWxpYW4pIiwgIldhdGVybG9vIiwgIldlaWNoa2Flc2UiLCAiV2VsbGluZ3RvbiIsCisgICAgICAgICAgICAiV2Vuc2xleWRhbGUiLCAiV2hpdGUgU3RpbHRvbiIsICJXaGl0ZXN0b25lIEZhcm1ob3VzZSIsICJXaWdtb3JlIiwgIldvb2RzaWRlIENhYmVjb3UiLAorICAgICAgICAgICAgIlhhbmFkdSIsICJYeW5vdHlybyIsICJZYXJnIENvcm5pc2giLCAiWWFycmEgVmFsbGV5IFB5cmFtaWQiLCAiWW9ya3NoaXJlIEJsdWUiLAorICAgICAgICAgICAgIlphbW9yYW5vIiwgIlphbmV0dGkgR3JhbmEgUGFkYW5vIiwgIlphbmV0dGkgUGFybWlnaWFubyBSZWdnaWFubyIKKyAgICB9OworCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczEuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMS5qYXZhCmluZGV4IGUyZDM0OGYuLjJiNWEzZjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMS5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMS5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKIAogCiAvKioKQEAgLTM3LDYgKzM4LDkgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY29udHJvbHNfMSk7CiAKKyAgICAgICAgQnV0dG9uIGRpc2FibGVkQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uX2Rpc2FibGVkKTsKKyAgICAgICAgZGlzYWJsZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisKICAgICAgICAgU3Bpbm5lciBzMSA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5zcGlubmVyMSk7CiAgICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1TdHJpbmdzKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKaW5kZXggNGY0MDI0Yi4uNDJiYzI5NyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKQEAgLTE2LDM1ICsxNiw0IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CiAKLS8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcwotLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotCi0KLS8qKgotICogQSBnYWxsZXJ5IG9mIGJhc2ljIGNvbnRyb2xzOiBCdXR0b24sIEVkaXRUZXh0LCBSYWRpb0J1dHRvbiwgQ2hlY2tib3gsCi0gKiBTcGlubmVyLiBUaGlzIGV4YW1wbGUgdXNlcyB0aGUgZGVmYXVsdCB0aGVtZS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xzMiBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY29udHJvbHNfMSk7Ci0KLSAgICAgICAgU3Bpbm5lciBzMSA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5zcGlubmVyMSk7Ci0gICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKLSAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1TdHJpbmdzKTsKLSAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOwotICAgICAgICBzMS5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TdHJpbmdzID0gewotCSAgICAiTWVyY3VyeSIsICJWZW51cyIsICJFYXJ0aCIsICJNYXJzIiwgIkp1cGl0ZXIiLCAiU2F0dXJuIiwgIlVyYW51cyIsICJOZXB0dW5lIgotICAgIH07Ci19CitwdWJsaWMgY2xhc3MgQ29udHJvbHMyIGV4dGVuZHMgQ29udHJvbHMxIHt9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzc2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczMuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworcHVibGljIGNsYXNzIENvbnRyb2xzMyBleHRlbmRzIENvbnRyb2xzMSB7fQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNmMzEwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK3B1YmxpYyBjbGFzcyBDb250cm9sczQgZXh0ZW5kcyBDb250cm9sczEge30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0V4cGFuZGFibGVMaXN0Mi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEKaW5kZXggYjZjY2UyOS4uOGIyY2I0MyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEKQEAgLTE3LDcxICsxNywxMjIgQEAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5FeHBhbmRhYmxlTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yVHJlZUFkYXB0ZXI7CiAKIC8qKgogICogRGVtb25zdHJhdGVzIGV4cGFuZGFibGUgbGlzdHMgYmFja2VkIGJ5IEN1cnNvcnMKICAqLwogcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0MiBleHRlbmRzIEV4cGFuZGFibGVMaXN0QWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09OVEFDVF9JRCA9IDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05UQUNUX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewogICAgICAgICBDb250YWN0cy5fSUQsCiAgICAgICAgIENvbnRhY3RzLkRJU1BMQVlfTkFNRQogICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX0lEX0NPTFVNTl9JTkRFWCA9IDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSE9ORV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmUuX0lELAotICAgICAgICBQaG9uZS5DT05UQUNUX0lELAotICAgICAgICBQaG9uZS5OVU1CRVIKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSE9ORV9OVU1CRVJfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBQaG9uZS5fSUQsCisgICAgICAgICAgICBQaG9uZS5OVU1CRVIKICAgICB9OwogCi0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0dST1VQID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fQ0hJTEQgPSAxOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmVlQWRhcHRlciBtQWRhcHRlcjsKIAotICAgICAgICAvLyBRdWVyeSBmb3IgcGVvcGxlCi0gICAgICAgIEN1cnNvciBncm91cEN1cnNvciA9IG1hbmFnZWRRdWVyeShDb250YWN0cy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBDT05UQUNUX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJlZUFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSk7CisgICAgICAgICAgICB0aGlzLm1BZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIFNldCB1cCBvdXIgYWRhcHRlcgotICAgICAgICBtQWRhcHRlciA9IG5ldyBNeUV4cGFuZGFibGVMaXN0QWRhcHRlcihncm91cEN1cnNvciwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2V4cGFuZGFibGVfbGlzdF9pdGVtXzEsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfZXhwYW5kYWJsZV9saXN0X2l0ZW1fMSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge0NvbnRhY3RzLkRJU1BMQVlfTkFNRX0sIC8vIE5hbWUgZm9yIGdyb3VwIGxheW91dHMKLSAgICAgICAgICAgICAgICBuZXcgaW50W10ge2FuZHJvaWQuUi5pZC50ZXh0MX0sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtQaG9uZS5OVU1CRVJ9LCAvLyBOdW1iZXIgZm9yIGNoaWxkIGxheW91dHMKLSAgICAgICAgICAgICAgICBuZXcgaW50W10ge2FuZHJvaWQuUi5pZC50ZXh0MX0pOwotICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblF1ZXJ5Q29tcGxldGUoaW50IHRva2VuLCBPYmplY3QgY29va2llLCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CisgICAgICAgICAgICBjYXNlIFRPS0VOX0dST1VQOgorICAgICAgICAgICAgICAgIG1BZGFwdGVyLnNldEdyb3VwQ3Vyc29yKGN1cnNvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVE9LRU5fQ0hJTEQ6CisgICAgICAgICAgICAgICAgaW50IGdyb3VwUG9zaXRpb24gPSAoSW50ZWdlcikgY29va2llOworICAgICAgICAgICAgICAgIG1BZGFwdGVyLnNldENoaWxkcmVuQ3Vyc29yKGdyb3VwUG9zaXRpb24sIGN1cnNvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgY2xhc3MgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBTaW1wbGVDdXJzb3JUcmVlQWRhcHRlciB7CiAKLSAgICAgICAgcHVibGljIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyKEN1cnNvciBjdXJzb3IsIENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwTGF5b3V0LAorICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRha2UgYSBDdXJzb3IuIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBxdWVyeWluZyB0aGUgCisgICAgICAgIC8vIGRhdGFiYXNlIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgcHVibGljIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwTGF5b3V0LAogICAgICAgICAgICAgICAgIGludCBjaGlsZExheW91dCwgU3RyaW5nW10gZ3JvdXBGcm9tLCBpbnRbXSBncm91cFRvLCBTdHJpbmdbXSBjaGlsZHJlbkZyb20sCiAgICAgICAgICAgICAgICAgaW50W10gY2hpbGRyZW5UbykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY3Vyc29yLCBncm91cExheW91dCwgZ3JvdXBGcm9tLCBncm91cFRvLCBjaGlsZExheW91dCwgY2hpbGRyZW5Gcm9tLAorCisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBncm91cExheW91dCwgZ3JvdXBGcm9tLCBncm91cFRvLCBjaGlsZExheW91dCwgY2hpbGRyZW5Gcm9tLAogICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblRvKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yIGdldENoaWxkcmVuQ3Vyc29yKEN1cnNvciBncm91cEN1cnNvcikgewotICAgICAgICAgICAgaW50IGNvbnRhY3RJZCA9IGdyb3VwQ3Vyc29yLmdldEludChDT0xVTU5fQ09OVEFDVF9JRCk7Ci0gICAgICAgICAgICAvLyBUaGUgcmV0dXJuZWQgQ3Vyc29yIE1VU1QgYmUgbWFuYWdlZCBieSB1cywgc28gd2UgdXNlIEFjdGl2aXR5J3MgaGVscGVyCi0gICAgICAgICAgICAvLyBmdW5jdGlvbmFsaXR5IHRvIG1hbmFnZSBpdCBmb3IgdXMuCi0gICAgICAgICAgICByZXR1cm4gbWFuYWdlZFF1ZXJ5KFBob25lLkNPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgICAgICBQSE9ORV9QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICBQaG9uZS5DT05UQUNUX0lEICsgIiA9ICIgKyBjb250YWN0SWQsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgLy8gR2l2ZW4gdGhlIGdyb3VwLCB3ZSByZXR1cm4gYSBjdXJzb3IgZm9yIGFsbCB0aGUgY2hpbGRyZW4gd2l0aGluIHRoYXQgZ3JvdXAgCisKKyAgICAgICAgICAgIC8vIFJldHVybiBhIGN1cnNvciB0aGF0IHBvaW50cyB0byB0aGlzIGNvbnRhY3QncyBwaG9uZSBudW1iZXJzCisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ29udGFjdHMuQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBncm91cEN1cnNvci5nZXRMb25nKEdST1VQX0lEX0NPTFVNTl9JTkRFWCkpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRFbmNvZGVkUGF0aChDb250YWN0cy5EYXRhLkNPTlRFTlRfRElSRUNUT1JZKTsKKyAgICAgICAgICAgIFVyaSBwaG9uZU51bWJlcnNVcmkgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9DSElMRCwgZ3JvdXBDdXJzb3IuZ2V0UG9zaXRpb24oKSwgcGhvbmVOdW1iZXJzVXJpLCAKKyAgICAgICAgICAgICAgICAgICAgUEhPTkVfTlVNQkVSX1BST0pFQ1RJT04sIFBob25lLk1JTUVUWVBFICsgIj0/IiwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFBob25lLkNPTlRFTlRfSVRFTV9UWVBFIH0sIG51bGwpOworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKyAgICBwcml2YXRlIFF1ZXJ5SGFuZGxlciBtUXVlcnlIYW5kbGVyOworICAgIHByaXZhdGUgQ3Vyc29yVHJlZUFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gU2V0IHVwIG91ciBhZGFwdGVyCisgICAgICAgIG1BZGFwdGVyID0gbmV3IE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyKAorICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfZXhwYW5kYWJsZV9saXN0X2l0ZW1fMSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9leHBhbmRhYmxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnRhY3RzLkRJU1BMQVlfTkFNRSB9LCAvLyBOYW1lIGZvciBncm91cCBsYXlvdXRzCisgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxIH0sCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgUGhvbmUuTlVNQkVSIH0sIC8vIE51bWJlciBmb3IgY2hpbGQgbGF5b3V0cworICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSB9KTsKKworICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgbVF1ZXJ5SGFuZGxlciA9IG5ldyBRdWVyeUhhbmRsZXIodGhpcywgbUFkYXB0ZXIpOworCisgICAgICAgIC8vIFF1ZXJ5IGZvciBwZW9wbGUKKyAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0dST1VQLCBudWxsLCBDb250YWN0cy5DT05URU5UX1VSSSwgQ09OVEFDVFNfUFJPSkVDVElPTiwgCisgICAgICAgICAgICAgICAgQ29udGFjdHMuSEFTX1BIT05FX05VTUJFUiArICI9MSIsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisKKyAgICAgICAgLy8gTnVsbCBvdXQgdGhlIGdyb3VwIGN1cnNvci4gVGhpcyB3aWxsIGNhdXNlIHRoZSBncm91cCBjdXJzb3IgYW5kIGFsbCBvZiB0aGUgY2hpbGQgY3Vyc29ycworICAgICAgICAvLyB0byBiZSBjbG9zZWQuCisgICAgICAgIG1BZGFwdGVyLmNoYW5nZUN1cnNvcihudWxsKTsKKyAgICAgICAgbUFkYXB0ZXIgPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbGxlcnkxLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYWxsZXJ5MS5qYXZhCmluZGV4IDdhYWFhZWYuLmIyNTJkNWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbGxlcnkxLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR2FsbGVyeTEuamF2YQpAQCAtNzEsOCArNzEsMjUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgY2xhc3MgSW1hZ2VBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBpbnQgbUdhbGxlcnlJdGVtQmFja2dyb3VuZDsKLSAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX1dJRFRIID0gMTM2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9IRUlHSFQgPSA4ODsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtR2FsbGVyeUl0ZW1CYWNrZ3JvdW5kOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyW10gbUltYWdlSWRzID0geworICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18xLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18yLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18zLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b180LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b181LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b182LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b183LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b184CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGVuc2l0eTsKKwogICAgICAgICBwdWJsaWMgSW1hZ2VBZGFwdGVyKENvbnRleHQgYykgewogICAgICAgICAgICAgbUNvbnRleHQgPSBjOwogICAgICAgICAgICAgLy8gU2VlIHJlcy92YWx1ZXMvYXR0cnMueG1sIGZvciB0aGUgPGRlY2xhcmUtc3R5bGVhYmxlPiB0aGF0IGRlZmluZXMKQEAgLTgxLDYgKzk4LDggQEAKICAgICAgICAgICAgIG1HYWxsZXJ5SXRlbUJhY2tncm91bmQgPSBhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkdhbGxlcnkxX2FuZHJvaWRfZ2FsbGVyeUl0ZW1CYWNrZ3JvdW5kLCAwKTsKICAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBtRGVuc2l0eSA9IGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKQEAgLTk2LDMwICsxMTUsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaSA9IG5ldyBJbWFnZVZpZXcobUNvbnRleHQpOworICAgICAgICAgICAgSW1hZ2VWaWV3IGltYWdlVmlldzsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udmVydFZpZXcgPSBuZXcgSW1hZ2VWaWV3KG1Db250ZXh0KTsKIAotICAgICAgICAgICAgaS5zZXRJbWFnZVJlc291cmNlKG1JbWFnZUlkc1twb3NpdGlvbl0pOwotICAgICAgICAgICAgaS5zZXRTY2FsZVR5cGUoSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkpOwotICAgICAgICAgICAgaS5zZXRMYXlvdXRQYXJhbXMobmV3IEdhbGxlcnkuTGF5b3V0UGFyYW1zKDEzNiwgODgpKTsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0U2NhbGVUeXBlKEltYWdlVmlldy5TY2FsZVR5cGUuRklUX1hZKTsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBHYWxsZXJ5LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChJVEVNX1dJRFRIICogbURlbnNpdHkgKyAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChJVEVNX0hFSUdIVCAqIG1EZW5zaXR5ICsgMC41ZikpKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIHByZWZlcnJlZCBHYWxsZXJ5IGl0ZW0gYmFja2dyb3VuZAotICAgICAgICAgICAgaS5zZXRCYWNrZ3JvdW5kUmVzb3VyY2UobUdhbGxlcnlJdGVtQmFja2dyb3VuZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVmZXJyZWQgR2FsbGVyeSBpdGVtIGJhY2tncm91bmQKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0QmFja2dyb3VuZFJlc291cmNlKG1HYWxsZXJ5SXRlbUJhY2tncm91bmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlUmVzb3VyY2UobUltYWdlSWRzW3Bvc2l0aW9uXSk7CisKKyAgICAgICAgICAgIHJldHVybiBpbWFnZVZpZXc7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyW10gbUltYWdlSWRzID0gewotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18xLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18yLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18zLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b180LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b181LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b182LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b183LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b184Ci0gICAgICAgIH07CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HcmlkMy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR3JpZDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg1M2UxMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dyaWQzLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2thYmxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkdyaWRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgZGVtbyBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMLCBhLmsuYS4gc2VsZWN0aW9uIG1vZGUgb24gR3JpZFZpZXcuCisgKi8KK3B1YmxpYyBjbGFzcyBHcmlkMyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEdyaWRWaWV3IG1HcmlkOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGxvYWRBcHBzKCk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZ3JpZF8xKTsKKyAgICAgICAgbUdyaWQgPSAoR3JpZFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm15R3JpZCk7CisgICAgICAgIG1HcmlkLnNldEFkYXB0ZXIobmV3IEFwcHNBZGFwdGVyKCkpOworICAgICAgICBtR3JpZC5zZXRDaG9pY2VNb2RlKEdyaWRWaWV3LkNIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKTsKKyAgICAgICAgbUdyaWQuc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIobmV3IE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSZXNvbHZlSW5mbz4gbUFwcHM7CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEFwcHMoKSB7CisgICAgICAgIEludGVudCBtYWluSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4sIG51bGwpOworICAgICAgICBtYWluSW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9MQVVOQ0hFUik7CisKKyAgICAgICAgbUFwcHMgPSBnZXRQYWNrYWdlTWFuYWdlcigpLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhtYWluSW50ZW50LCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQXBwc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisgICAgICAgIHB1YmxpYyBBcHBzQWRhcHRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBDaGVja2FibGVMYXlvdXQgbDsKKyAgICAgICAgICAgIEltYWdlVmlldyBpOworCisgICAgICAgICAgICBpZiAoY29udmVydFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGkgPSBuZXcgSW1hZ2VWaWV3KEdyaWQzLnRoaXMpOworICAgICAgICAgICAgICAgIGkuc2V0U2NhbGVUeXBlKEltYWdlVmlldy5TY2FsZVR5cGUuRklUX0NFTlRFUik7CisgICAgICAgICAgICAgICAgaS5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoNTAsIDUwKSk7CisgICAgICAgICAgICAgICAgbCA9IG5ldyBDaGVja2FibGVMYXlvdXQoR3JpZDMudGhpcyk7CisgICAgICAgICAgICAgICAgbC5zZXRMYXlvdXRQYXJhbXMobmV3IEdyaWRWaWV3LkxheW91dFBhcmFtcyhHcmlkVmlldy5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgR3JpZFZpZXcuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOworICAgICAgICAgICAgICAgIGwuYWRkVmlldyhpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbCA9IChDaGVja2FibGVMYXlvdXQpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGkgPSAoSW1hZ2VWaWV3KSBsLmdldENoaWxkQXQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlc29sdmVJbmZvIGluZm8gPSBtQXBwcy5nZXQocG9zaXRpb24pOworICAgICAgICAgICAgaS5zZXRJbWFnZURyYXdhYmxlKGluZm8uYWN0aXZpdHlJbmZvLmxvYWRJY29uKGdldFBhY2thZ2VNYW5hZ2VyKCkpKTsKKworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFwcHMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG1BcHBzLmdldChwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ2hlY2thYmxlTGF5b3V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBDaGVja2FibGUgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNoZWNrZWQ7CisKKyAgICAgICAgcHVibGljIENoZWNrYWJsZUxheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgICAgIG1DaGVja2VkID0gY2hlY2tlZDsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShjaGVja2VkID8KKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5ibHVlKQorICAgICAgICAgICAgICAgICAgICA6IG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja2VkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdG9nZ2xlKCkgeworICAgICAgICAgICAgc2V0Q2hlY2tlZCghbUNoZWNrZWQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgaW1wbGVtZW50cyBHcmlkVmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgbW9kZS5zZXRUaXRsZSgiU2VsZWN0IEl0ZW1zIik7CisgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCJPbmUgaXRlbSBzZWxlY3RlZCIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKEFjdGlvbk1vZGUgbW9kZSwgaW50IHBvc2l0aW9uLCBsb25nIGlkLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgaW50IHNlbGVjdENvdW50ID0gbUdyaWQuZ2V0Q2hlY2tlZEl0ZW1Db3VudCgpOworICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RDb3VudCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUoIk9uZSBpdGVtIHNlbGVjdGVkIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUoIiIgKyBzZWxlY3RDb3VudCArICIgaXRlbXMgc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDEuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxLmphdmEKaW5kZXggNTg2MTkyMy4uZjEwM2U1MSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDEuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MS5qYXZhCkBAIC0zOCwxMzUgKzM4LDUgQEAKICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRUZXh0RmlsdGVyRW5hYmxlZCh0cnVlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1TdHJpbmdzID0gewotICAgICAgICAgICAgIkFiYmF5ZSBkZSBCZWxsb2MiLCAiQWJiYXllIGR1IE1vbnQgZGVzIENhdHMiLCAiQWJlcnRhbSIsICJBYm9uZGFuY2UiLCAiQWNrYXdpIiwKLSAgICAgICAgICAgICJBY29ybiIsICJBZGVsb3N0IiwgIkFmZmlkZWxpY2UgYXUgQ2hhYmxpcyIsICJBZnVlZ2EnbCBQaXR1IiwgIkFpcmFnIiwgIkFpcmVkYWxlIiwKLSAgICAgICAgICAgICJBaXN5IENlbmRyZSIsICJBbGxnYXVlciBFbW1lbnRhbGVyIiwgIkFsdmVyY2EiLCAiQW1iZXJ0IiwgIkFtZXJpY2FuIENoZWVzZSIsCi0gICAgICAgICAgICAiQW1pIGR1IENoYW1iZXJ0aW4iLCAiQW5lam8gRW5jaGlsYWRvIiwgIkFubmVhdSBkdSBWaWMtQmlsaCIsICJBbnRob3Jpcm8iLCAiQXBwZW56ZWxsIiwKLSAgICAgICAgICAgICJBcmFnb24iLCAiQXJkaSBHYXNuYSIsICJBcmRyYWhhbiIsICJBcm1lbmlhbiBTdHJpbmciLCAiQXJvbWVzIGF1IEdlbmUgZGUgTWFyYyIsCi0gICAgICAgICAgICAiQXNhZGVybyIsICJBc2lhZ28iLCAiQXViaXNxdWUgUHlyZW5lZXMiLCAiQXV0dW4iLCAiQXZheHRza3lyIiwgIkJhYnkgU3dpc3MiLAotICAgICAgICAgICAgIkJhYnliZWwiLCAiQmFndWV0dGUgTGFvbm5haXNlIiwgIkJha2VycyIsICJCYWxhZGkiLCAiQmFsYXRvbiIsICJCYW5kYWwiLCAiQmFub24iLAotICAgICAgICAgICAgIkJhcnJ5J3MgQmF5IENoZWRkYXIiLCAiQmFzaW5nIiwgIkJhc2tldCBDaGVlc2UiLCAiQmF0aCBDaGVlc2UiLCAiQmF2YXJpYW4gQmVyZ2thc2UiLAotICAgICAgICAgICAgIkJheWxvdWdoIiwgIkJlYXVmb3J0IiwgIkJlYXV2b29yZGUiLCAiQmVlbmxlaWdoIEJsdWUiLCAiQmVlciBDaGVlc2UiLCAiQmVsIFBhZXNlIiwKLSAgICAgICAgICAgICJCZXJnYWRlciIsICJCZXJnZXJlIEJsZXVlIiwgIkJlcmtzd2VsbCIsICJCZXlheiBQZXluaXIiLCAiQmllcmthc2UiLCAiQmlzaG9wIEtlbm5lZHkiLAotICAgICAgICAgICAgIkJsYXJuZXkiLCAiQmxldSBkJ0F1dmVyZ25lIiwgIkJsZXUgZGUgR2V4IiwgIkJsZXUgZGUgTGFxdWV1aWxsZSIsCi0gICAgICAgICAgICAiQmxldSBkZSBTZXB0bW9uY2VsIiwgIkJsZXUgRGVzIENhdXNzZXMiLCAiQmx1ZSIsICJCbHVlIENhc3RlbGxvIiwgIkJsdWUgUmF0aGdvcmUiLAotICAgICAgICAgICAgIkJsdWUgVmVpbiAoQXVzdHJhbGlhbikiLCAiQmx1ZSBWZWluIENoZWVzZXMiLCAiQm9jY29uY2luaSIsICJCb2Njb25jaW5pIChBdXN0cmFsaWFuKSIsCi0gICAgICAgICAgICAiQm9lcmVuIExlaWRlbmthYXMiLCAiQm9uY2hlc3RlciIsICJCb3N3b3J0aCIsICJCb3Vnb24iLCAiQm91bGUgRHUgUm92ZXMiLAotICAgICAgICAgICAgIkJvdWxldHRlIGQnQXZlc25lcyIsICJCb3Vyc2F1bHQiLCAiQm91cnNpbiIsICJCb3V5c3NvdSIsICJCcmEiLCAiQnJhdWRvc3R1ciIsCi0gICAgICAgICAgICAiQnJlYWtmYXN0IENoZWVzZSIsICJCcmViaXMgZHUgTGF2b3J0IiwgIkJyZWJpcyBkdSBMb2Nob2lzIiwgIkJyZWJpcyBkdSBQdXlmYXVjb24iLAotICAgICAgICAgICAgIkJyZXNzZSBCbGV1IiwgIkJyaWNrIiwgIkJyaWUiLCAiQnJpZSBkZSBNZWF1eCIsICJCcmllIGRlIE1lbHVuIiwgIkJyaWxsYXQtU2F2YXJpbiIsCi0gICAgICAgICAgICAiQnJpbiIsICJCcmluIGQnIEFtb3VyIiwgIkJyaW4gZCdBbW91ciIsICJCcmluemEgKEJ1cmR1ZiBCcmluemEpIiwKLSAgICAgICAgICAgICJCcmlxdWV0dGUgZGUgQnJlYmlzIiwgIkJyaXF1ZXR0ZSBkdSBGb3JleiIsICJCcm9jY2lvIiwgIkJyb2NjaW8gRGVtaS1BZmZpbmUiLAotICAgICAgICAgICAgIkJyb3Vzc2UgZHUgUm92ZSIsICJCcnVkZXIgQmFzaWwiLCAiQnJ1c3NlbGFlIEthYXMgKEZyb21hZ2UgZGUgQnJ1eGVsbGVzKSIsICJCcnluZHphIiwKLSAgICAgICAgICAgICJCdWNoZXR0ZSBkJ0Fuam91IiwgIkJ1ZmZhbG8iLCAiQnVyZ29zIiwgIkJ1dHRlIiwgIkJ1dHRlcmthc2UiLCAiQnV0dG9uIChJbm5lcykiLAotICAgICAgICAgICAgIkJ1eHRvbiBCbHVlIiwgIkNhYmVjb3UiLCAiQ2Fib2MiLCAiQ2FicmFsZXMiLCAiQ2FjaGFpbGxlIiwgIkNhY2lvY2F2YWxsbyIsICJDYWNpb3R0YSIsCi0gICAgICAgICAgICAiQ2FlcnBoaWxseSIsICJDYWlybnNtb3JlIiwgIkNhbGVuemFuYSIsICJDYW1iYXpvbGEiLCAiQ2FtZW1iZXJ0IGRlIE5vcm1hbmRpZSIsCi0gICAgICAgICAgICAiQ2FuYWRpYW4gQ2hlZGRhciIsICJDYW5lc3RyYXRvIiwgIkNhbnRhbCIsICJDYXByaWNlIGRlcyBEaWV1eCIsICJDYXByaWNvcm4gR29hdCIsCi0gICAgICAgICAgICAiQ2FwcmlvbGUgQmFub24iLCAiQ2FycmUgZGUgbCdFc3QiLCAiQ2FzY2lvdHRhIGRpIFVyYmlubyIsICJDYXNoZWwgQmx1ZSIsICJDYXN0ZWxsYW5vIiwKLSAgICAgICAgICAgICJDYXN0ZWxsZW5vIiwgIkNhc3RlbG1hZ25vIiwgIkNhc3RlbG8gQnJhbmNvIiwgIkNhc3RpZ2xpYW5vIiwgIkNhdGhlbGFpbiIsCi0gICAgICAgICAgICAiQ2VsdGljIFByb21pc2UiLCAiQ2VuZHJlIGQnT2xpdmV0IiwgIkNlcm5leSIsICJDaGFiaWNob3UiLCAiQ2hhYmljaG91IGR1IFBvaXRvdSIsCi0gICAgICAgICAgICAiQ2hhYmlzIGRlIEdhdGluZSIsICJDaGFvdXJjZSIsICJDaGFyb2xhaXMiLCAiQ2hhdW1lcyIsICJDaGVkZGFyIiwKLSAgICAgICAgICAgICJDaGVkZGFyIENsb3RoYm91bmQiLCAiQ2hlc2hpcmUiLCAiQ2hldnJlcyIsICJDaGV2cm90aW4gZGVzIEFyYXZpcyIsICJDaG9udGFsZW5vIiwKLSAgICAgICAgICAgICJDaXZyYXkiLCAiQ29ldXIgZGUgQ2FtZW1iZXJ0IGF1IENhbHZhZG9zIiwgIkNvZXVyIGRlIENoZXZyZSIsICJDb2xieSIsICJDb2xkIFBhY2siLAotICAgICAgICAgICAgIkNvbXRlIiwgIkNvb2xlYSIsICJDb29sZW5leSIsICJDb3F1ZXRkYWxlIiwgIkNvcmxlZ2d5IiwgIkNvcm5pc2ggUGVwcGVyIiwKLSAgICAgICAgICAgICJDb3RoZXJzdG9uZSIsICJDb3RpamEiLCAiQ290dGFnZSBDaGVlc2UiLCAiQ290dGFnZSBDaGVlc2UgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJDb3VnYXIgR29sZCIsICJDb3Vsb21taWVycyIsICJDb3ZlcmRhbGUiLCAiQ3JheWV1eCBkZSBSb25jcSIsICJDcmVhbSBDaGVlc2UiLAotICAgICAgICAgICAgIkNyZWFtIEhhdmFydGkiLCAiQ3JlbWEgQWdyaWEiLCAiQ3JlbWEgTWV4aWNhbmEiLCAiQ3JlbWUgRnJhaWNoZSIsICJDcmVzY2VuemEiLAotICAgICAgICAgICAgIkNyb2doYW4iLCAiQ3JvdHRpbiBkZSBDaGF2aWdub2wiLCAiQ3JvdHRpbiBkdSBDaGF2aWdub2wiLCAiQ3Jvd2RpZSIsICJDcm93bGV5IiwKLSAgICAgICAgICAgICJDdWFqYWRhIiwgIkN1cmQiLCAiQ3VyZSBOYW50YWlzIiwgIkN1cndvcnRoeSIsICJDd210YXdlIFBlY29yaW5vIiwKLSAgICAgICAgICAgICJDeXByZXNzIEdyb3ZlIENoZXZyZSIsICJEYW5hYmx1IChEYW5pc2ggQmx1ZSkiLCAiRGFuYm8iLCAiRGFuaXNoIEZvbnRpbmEiLAotICAgICAgICAgICAgIkRhcmFsYWdqYXpza3kiLCAiRGF1cGhpbiIsICJEZWxpY2UgZGVzIEZpb3V2ZXMiLCAiRGVuaGFueSBEb3JzZXQgRHJ1bSIsICJEZXJieSIsCi0gICAgICAgICAgICAiRGVzc2VydG55aiBCZWx5aiIsICJEZXZvbiBCbHVlIiwgIkRldm9uIEdhcmxhbmQiLCAiRG9sY2VsYXR0ZSIsICJEb29saW4iLAotICAgICAgICAgICAgIkRvcHBlbHJoYW1zdHVmZWwiLCAiRG9yc2V0IEJsdWUgVmlubmV5IiwgIkRvdWJsZSBHbG91Y2VzdGVyIiwgIkRvdWJsZSBXb3JjZXN0ZXIiLAotICAgICAgICAgICAgIkRyZXV4IGEgbGEgRmV1aWxsZSIsICJEcnkgSmFjayIsICJEdWRkbGVzd2VsbCIsICJEdW5iYXJyYSIsICJEdW5sb3AiLCAiRHVuc3lyZSBCbHVlIiwKLSAgICAgICAgICAgICJEdXJvYmxhbmRvIiwgIkR1cnJ1cyIsICJEdXRjaCBNaW1vbGV0dGUgKENvbW1pc3NpZWthYXMpIiwgIkVkYW0iLCAiRWRlbHBpbHoiLAotICAgICAgICAgICAgIkVtZW50YWwgR3JhbmQgQ3J1IiwgIkVtbGV0dCIsICJFbW1lbnRhbCIsICJFcG9pc3NlcyBkZSBCb3VyZ29nbmUiLCAiRXNiYXJlaWNoIiwKLSAgICAgICAgICAgICJFc3JvbSIsICJFdG9ya2kiLCAiRXZhbnNkYWxlIEZhcm1ob3VzZSBCcmllIiwgIkV2b3JhIERlIEwnQWxlbnRlam8iLCAiRXhtb29yIEJsdWUiLAotICAgICAgICAgICAgIkV4cGxvcmF0ZXVyIiwgIkZldGEiLCAiRmV0YSAoQXVzdHJhbGlhbikiLCAiRmlndWUiLCAiRmlsZXR0YSIsICJGaW4tZGUtU2llY2xlIiwKLSAgICAgICAgICAgICJGaW5sYW5kaWEgU3dpc3MiLCAiRmlubiIsICJGaW9yZSBTYXJkbyIsICJGbGV1ciBkdSBNYXF1aXMiLCAiRmxvciBkZSBHdWlhIiwKLSAgICAgICAgICAgICJGbG93ZXIgTWFyaWUiLCAiRm9sZGVkIiwgIkZvbGRlZCBjaGVlc2Ugd2l0aCBtaW50IiwgIkZvbmRhbnQgZGUgQnJlYmlzIiwKLSAgICAgICAgICAgICJGb250YWluZWJsZWF1IiwgIkZvbnRhbCIsICJGb250aW5hIFZhbCBkJ0Fvc3RhIiwgIkZvcm1hZ2dpbyBkaSBjYXByYSIsICJGb3VnZXJ1cyIsCi0gICAgICAgICAgICAiRm91ciBIZXJiIEdvdWRhIiwgIkZvdXJtZSBkJyBBbWJlcnQiLCAiRm91cm1lIGRlIEhhdXRlIExvaXJlIiwgIkZvdXJtZSBkZSBNb250YnJpc29uIiwKLSAgICAgICAgICAgICJGcmVzaCBKYWNrIiwgIkZyZXNoIE1venphcmVsbGEiLCAiRnJlc2ggUmljb3R0YSIsICJGcmVzaCBUcnVmZmxlcyIsICJGcmlib3VyZ2VvaXMiLAotICAgICAgICAgICAgIkZyaWVzZWthYXMiLCAiRnJpZXNpYW4iLCAiRnJpZXNsYSIsICJGcmluYXVsdCIsICJGcm9tYWdlIGEgUmFjbGV0dGUiLCAiRnJvbWFnZSBDb3JzZSIsCi0gICAgICAgICAgICAiRnJvbWFnZSBkZSBNb250YWduZSBkZSBTYXZvaWUiLCAiRnJvbWFnZSBGcmFpcyIsICJGcnVpdCBDcmVhbSBDaGVlc2UiLAotICAgICAgICAgICAgIkZyeWluZyBDaGVlc2UiLCAiRnluYm8iLCAiR2FicmllbCIsICJHYWxldHRlIGR1IFBhbHVkaWVyIiwgIkdhbGV0dGUgTHlvbm5haXNlIiwKLSAgICAgICAgICAgICJHYWxsb3dheSBHb2F0J3MgTWlsayBHZW1zIiwgIkdhbW1lbG9zdCIsICJHYXBlcm9uIGEgbCdBaWwiLCAiR2Fycm90eGEiLCAiR2FzdGFuYmVycmEiLAotICAgICAgICAgICAgIkdlaXRvc3QiLCAiR2lwcHNsYW5kIEJsdWUiLCAiR2pldG9zdCIsICJHbG91Y2VzdGVyIiwgIkdvbGRlbiBDcm9zcyIsICJHb3Jnb256b2xhIiwKLSAgICAgICAgICAgICJHb3JueWFsdGFqc2tpIiwgIkdvc3BlbCBHcmVlbiIsICJHb3VkYSIsICJHb3V0dSIsICJHb3dyaWUiLCAiR3JhYmV0dG8iLCAiR3JhZGRvc3QiLAotICAgICAgICAgICAgIkdyYWZ0b24gVmlsbGFnZSBDaGVkZGFyIiwgIkdyYW5hIiwgIkdyYW5hIFBhZGFubyIsICJHcmFuZCBWYXRlbCIsCi0gICAgICAgICAgICAiR3JhdGFyb24gZCcgQXJlY2hlcyIsICJHcmF0dGUtUGFpbGxlIiwgIkdyYXZpZXJhIiwgIkdyZXVpbGgiLCAiR3JldmUiLAotICAgICAgICAgICAgIkdyaXMgZGUgTGlsbGUiLCAiR3J1eWVyZSIsICJHdWJiZWVuIiwgIkd1ZXJiaWdueSIsICJIYWxsb3VtaSIsCi0gICAgICAgICAgICAiSGFsbG91bXkgKEF1c3RyYWxpYW4pIiwgIkhhbG91bWktU3R5bGUgQ2hlZXNlIiwgIkhhcmJvdXJuZSBCbHVlIiwgIkhhdmFydGkiLAotICAgICAgICAgICAgIkhlaWRpIEdydXllcmUiLCAiSGVyZWZvcmQgSG9wIiwgIkhlcnJnYXJkc29zdCIsICJIZXJyaW90IEZhcm1ob3VzZSIsICJIZXJ2ZSIsCi0gICAgICAgICAgICAiSGlwaSBJdGkiLCAiSHViYmFyZHN0b24gQmx1ZSBDb3ciLCAiSHVzaGFsbHNvc3QiLCAiSWJlcmljbyIsICJJZGFobyBHb2F0c3RlciIsCi0gICAgICAgICAgICAiSWRpYXphYmFsIiwgIklsIEJvc2NoZXR0byBhbCBUYXJ0dWZvIiwgIklsZSBkJ1lldSIsICJJc2xlIG9mIE11bGwiLCAiSmFybHNiZXJnIiwKLSAgICAgICAgICAgICJKZXJtaSBUb3J0ZXMiLCAiSmlibmVoIEFyYWJpZWgiLCAiSmluZGkgQnJpZSIsICJKdWJpbGVlIEJsdWUiLCAiSnV1c3RvbGVpcGEiLAotICAgICAgICAgICAgIkthZGNoZ2FsbCIsICJLYXNlcmkiLCAiS2FzaHRhIiwgIktlZmFsb3R5cmkiLCAiS2VuYWZhIiwgIktlcm5oZW0iLCAiS2VydmVsbGEgQWZmaW5lIiwKLSAgICAgICAgICAgICJLaWtvcmFuZ2kiLCAiS2luZyBJc2xhbmQgQ2FwZSBXaWNraGFtIEJyaWUiLCAiS2luZyBSaXZlciBHb2xkIiwgIktsb3N0ZXJrYWVzZSIsCi0gICAgICAgICAgICAiS25vY2thbGFyYSIsICJLdWdlbGthc2UiLCAiTCdBdmV5cm9ubmFpcyIsICJMJ0VjaXIgZGUgbCdBdWJyYWMiLCAiTGEgVGF1cGluaWVyZSIsCi0gICAgICAgICAgICAiTGEgVmFjaGUgUXVpIFJpdCIsICJMYWd1aW9sZSIsICJMYWlyb2JlbGwiLCAiTGFqdGEiLCAiTGFuYXJrIEJsdWUiLCAiTGFuY2FzaGlyZSIsCi0gICAgICAgICAgICAiTGFuZ3JlcyIsICJMYXBwaSIsICJMYXJ1bnMiLCAiTGF2aXN0b3duIiwgIkxlIEJyaW4iLCAiTGUgRml1bSBPcmJvIiwgIkxlIExhY2FuZG91IiwKLSAgICAgICAgICAgICJMZSBSb3VsZSIsICJMZWFmaWVsZCIsICJMZWJiZW5lIiwgIkxlZXJkYW1tZXIiLCAiTGVpY2VzdGVyIiwgIkxleWRlbiIsICJMaW1idXJnZXIiLAotICAgICAgICAgICAgIkxpbmNvbG5zaGlyZSBQb2FjaGVyIiwgIkxpbmdvdCBTYWludCBCb3VzcXVldCBkJ09yYiIsICJMaXB0YXVlciIsICJMaXR0bGUgUnlkaW5ncyIsCi0gICAgICAgICAgICAiTGl2YXJvdCIsICJMbGFuYm9pZHkiLCAiTGxhbmdsb2ZhbiBGYXJtaG91c2UiLCAiTG9jaCBBcnRodXIgRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJMb2RkaXN3ZWxsIEF2b25kYWxlIiwgIkxvbmdob3JuIiwgIkxvdSBQYWxvdSIsICJMb3UgUGV2cmUiLCAiTHlvbm5haXMiLCAiTWFhc2RhbSIsCi0gICAgICAgICAgICAiTWFjY29uYWlzIiwgIk1haG9lIEFnZWQgR291ZGEiLCAiTWFob24iLCAiTWFsdmVybiIsICJNYW1pcm9sbGUiLCAiTWFuY2hlZ28iLAotICAgICAgICAgICAgIk1hbm91cmkiLCAiTWFudXIiLCAiTWFyYmxlIENoZWRkYXIiLCAiTWFyYmxlZCBDaGVlc2VzIiwgIk1hcmVkc291cyIsICJNYXJnb3RpbiIsCi0gICAgICAgICAgICAiTWFyaWJvIiwgIk1hcm9pbGxlcyIsICJNYXNjYXJlcyIsICJNYXNjYXJwb25lIiwgIk1hc2NhcnBvbmUgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJNYXNjYXJwb25lIFRvcnRhIiwgIk1hdG9jcSIsICJNYXl0YWcgQmx1ZSIsICJNZWlyYSIsICJNZW5hbGxhY2sgRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJNZW5vbml0YSIsICJNZXJlZGl0aCBCbHVlIiwgIk1lc29zdCIsICJNZXR0b24gKENhbmNvaWxsb3R0ZSkiLCAiTWV5ZXIgVmludGFnZSBHb3VkYSIsCi0gICAgICAgICAgICAiTWloYWxpYyBQZXluaXIiLCAiTWlsbGVlbnMiLCAiTWltb2xldHRlIiwgIk1pbmUtR2FiaGFyIiwgIk1pbmkgQmFieSBCZWxscyIsICJNaXh0ZSIsCi0gICAgICAgICAgICAiTW9sYm8iLCAiTW9uYXN0ZXJ5IENoZWVzZXMiLCAiTW9uZHNlZXIiLCAiTW9udCBEJ29yIEx5b25uYWlzIiwgIk1vbnRhc2lvIiwKLSAgICAgICAgICAgICJNb250ZXJleSBKYWNrIiwgIk1vbnRlcmV5IEphY2sgRHJ5IiwgIk1vcmJpZXIiLCAiTW9yYmllciBDcnUgZGUgTW9udGFnbmUiLAotICAgICAgICAgICAgIk1vdGhhaXMgYSBsYSBGZXVpbGxlIiwgIk1venphcmVsbGEiLCAiTW96emFyZWxsYSAoQXVzdHJhbGlhbikiLAotICAgICAgICAgICAgIk1venphcmVsbGEgZGkgQnVmYWxhIiwgIk1venphcmVsbGEgRnJlc2gsIGluIHdhdGVyIiwgIk1venphcmVsbGEgUm9sbHMiLCAiTXVuc3RlciIsCi0gICAgICAgICAgICAiTXVyb2wiLCAiTXljZWxsYSIsICJNeXppdGhyYSIsICJOYWJvdWxzaSIsICJOYW50YWlzIiwgIk5ldWZjaGF0ZWwiLAotICAgICAgICAgICAgIk5ldWZjaGF0ZWwgKEF1c3RyYWxpYW4pIiwgIk5pb2xvIiwgIk5va2tlbG9zdCIsICJOb3J0aHVtYmVybGFuZCIsICJPYXhhY2EiLAotICAgICAgICAgICAgIk9sZGUgWW9yayIsICJPbGl2ZXQgYXUgRm9pbiIsICJPbGl2ZXQgQmxldSIsICJPbGl2ZXQgQ2VuZHJlIiwKLSAgICAgICAgICAgICJPcmtuZXkgRXh0cmEgTWF0dXJlIENoZWRkYXIiLCAiT3JsYSIsICJPc2NodGplcGthIiwgIk9zc2F1IEZlcm1pZXIiLCAiT3NzYXUtSXJhdHkiLAotICAgICAgICAgICAgIk9zemN6eXBlayIsICJPeGZvcmQgQmx1ZSIsICJQJ3RpdCBCZXJyaWNob24iLCAiUGFsZXQgZGUgQmFibGlnbnkiLCAiUGFuZWVyIiwgIlBhbmVsYSIsCi0gICAgICAgICAgICAiUGFubmVyb25lIiwgIlBhbnQgeXMgR2F3biIsICJQYXJtZXNhbiAoUGFybWlnaWFubykiLCAiUGFybWlnaWFubyBSZWdnaWFubyIsCi0gICAgICAgICAgICAiUGFzIGRlIGwnRXNjYWxldHRlIiwgIlBhc3NlbmRhbGUiLCAiUGFzdGV1cml6ZWQgUHJvY2Vzc2VkIiwgIlBhdGUgZGUgRnJvbWFnZSIsCi0gICAgICAgICAgICAiUGF0ZWZpbmUgRm9ydCIsICJQYXZlIGQnQWZmaW5vaXMiLCAiUGF2ZSBkJ0F1Z2UiLCAiUGF2ZSBkZSBDaGlyYWMiLCAiUGF2ZSBkdSBCZXJyeSIsCi0gICAgICAgICAgICAiUGVjb3Jpbm8iLCAiUGVjb3Jpbm8gaW4gV2FsbnV0IExlYXZlcyIsICJQZWNvcmlubyBSb21hbm8iLCAiUGVla3NraWxsIFB5cmFtaWQiLAotICAgICAgICAgICAgIlBlbGFyZG9uIGRlcyBDZXZlbm5lcyIsICJQZWxhcmRvbiBkZXMgQ29yYmllcmVzIiwgIlBlbmFtZWxsZXJhIiwgIlBlbmJyeW4iLAotICAgICAgICAgICAgIlBlbmNhcnJlZyIsICJQZXJhaWwgZGUgQnJlYmlzIiwgIlBldGl0IE1vcmluIiwgIlBldGl0IFBhcmRvdSIsICJQZXRpdC1TdWlzc2UiLAotICAgICAgICAgICAgIlBpY29kb24gZGUgQ2hldnJlIiwgIlBpY29zIGRlIEV1cm9wYSIsICJQaW9yYSIsICJQaXRodHZpZXJzIGF1IEZvaW4iLAotICAgICAgICAgICAgIlBsYXRlYXUgZGUgSGVydmUiLCAiUGx5bW91dGggQ2hlZXNlIiwgIlBvZGhhbGFuc2tpIiwgIlBvaXZyZSBkJ0FuZSIsICJQb2xrb2xiaW4iLAotICAgICAgICAgICAgIlBvbnQgbCdFdmVxdWUiLCAiUG9ydCBOaWNob2xzb24iLCAiUG9ydC1TYWx1dCIsICJQb3N0ZWwiLCAiUG91bGlnbnktU2FpbnQtUGllcnJlIiwKLSAgICAgICAgICAgICJQb3VybHkiLCAiUHJhc3Rvc3QiLCAiUHJlc3NhdG8iLCAiUHJpbmNlLUplYW4iLCAiUHJvY2Vzc2VkIENoZWRkYXIiLCAiUHJvdm9sb25lIiwKLSAgICAgICAgICAgICJQcm92b2xvbmUgKEF1c3RyYWxpYW4pIiwgIlB5ZW5nYW5hIENoZWRkYXIiLCAiUHlyYW1pZGUiLCAiUXVhcmsiLAotICAgICAgICAgICAgIlF1YXJrIChBdXN0cmFsaWFuKSIsICJRdWFydGlyb2xvIExvbWJhcmRvIiwgIlF1YXRyZS1WZW50cyIsICJRdWVyY3kgUGV0aXQiLAotICAgICAgICAgICAgIlF1ZXNvIEJsYW5jbyIsICJRdWVzbyBCbGFuY28gY29uIEZydXRhcyAtLVBpbmEgeSBNYW5nbyIsICJRdWVzbyBkZSBNdXJjaWEiLAotICAgICAgICAgICAgIlF1ZXNvIGRlbCBNb250c2VjIiwgIlF1ZXNvIGRlbCBUaWV0YXIiLCAiUXVlc28gRnJlc2NvIiwgIlF1ZXNvIEZyZXNjbyAoQWRvYmVyYSkiLAotICAgICAgICAgICAgIlF1ZXNvIEliZXJpY28iLCAiUXVlc28gSmFsYXBlbm8iLCAiUXVlc28gTWFqb3Jlcm8iLCAiUXVlc28gTWVkaWEgTHVuYSIsCi0gICAgICAgICAgICAiUXVlc28gUGFyYSBGcmllciIsICJRdWVzbyBRdWVzYWRpbGxhIiwgIlJhYmFjYWwiLCAiUmFjbGV0dGUiLCAiUmFndXNhbm8iLCAiUmFzY2hlcmEiLAotICAgICAgICAgICAgIlJlYmxvY2hvbiIsICJSZWQgTGVpY2VzdGVyIiwgIlJlZ2FsIGRlIGxhIERvbWJlcyIsICJSZWdnaWFuaXRvIiwgIlJlbWVkb3UiLAotICAgICAgICAgICAgIlJlcXVlc29uIiwgIlJpY2hlbGlldSIsICJSaWNvdHRhIiwgIlJpY290dGEgKEF1c3RyYWxpYW4pIiwgIlJpY290dGEgU2FsYXRhIiwgIlJpZGRlciIsCi0gICAgICAgICAgICAiUmlnb3R0ZSIsICJSb2NhbWFkb3VyIiwgIlJvbGxvdCIsICJSb21hbm8iLCAiUm9tYW5zIFBhcnQgRGlldSIsICJSb25jYWwiLCAiUm9xdWVmb3J0IiwKLSAgICAgICAgICAgICJSb3VsZSIsICJSb3VsZWF1IERlIEJlYXVsaWV1IiwgIlJveWFscCBUaWxzaXQiLCAiUnViZW5zIiwgIlJ1c3RpbnUiLCAiU2FhbGFuZCBQZmFyciIsCi0gICAgICAgICAgICAiU2FhbmVua2Flc2UiLCAiU2FnYSIsICJTYWdlIERlcmJ5IiwgIlNhaW50ZSBNYXVyZSIsICJTYWludC1NYXJjZWxsaW4iLAotICAgICAgICAgICAgIlNhaW50LU5lY3RhaXJlIiwgIlNhaW50LVBhdWxpbiIsICJTYWxlcnMiLCAiU2Ftc28iLCAiU2FuIFNpbW9uIiwgIlNhbmNlcnJlIiwKLSAgICAgICAgICAgICJTYXAgU2FnbyIsICJTYXJkbyIsICJTYXJkbyBFZ3lwdGlhbiIsICJTYnJpbnoiLCAiU2NhbW9yemEiLCAiU2NoYWJ6aWVnZXIiLCAiU2NobG9zcyIsCi0gICAgICAgICAgICAiU2VsbGVzIHN1ciBDaGVyIiwgIlNlbHZhIiwgIlNlcmF0IiwgIlNlcmlvdXNseSBTdHJvbmcgQ2hlZGRhciIsICJTZXJyYSBkYSBFc3RyZWxhIiwKLSAgICAgICAgICAgICJTaGFycGFtIiwgIlNoZWxidXJuZSBDaGVkZGFyIiwgIlNocm9wc2hpcmUgQmx1ZSIsICJTaXJheiIsICJTaXJlbmUiLCAiU21va2VkIEdvdWRhIiwKLSAgICAgICAgICAgICJTb21lcnNldCBCcmllIiwgIlNvbm9tYSBKYWNrIiwgIlNvdHRvY2VuYXJlIGFsIFRhcnR1Zm8iLCAiU291bWFpbnRyYWluIiwKLSAgICAgICAgICAgICJTb3VyaXJlIExvemVyaWVuIiwgIlNwZW53b29kIiwgIlNyYWZmb3Jkc2hpcmUgT3JnYW5pYyIsICJTdC4gQWd1ciBCbHVlIENoZWVzZSIsCi0gICAgICAgICAgICAiU3RpbHRvbiIsICJTdGlua2luZyBCaXNob3AiLCAiU3RyaW5nIiwgIlN1c3NleCBTbGlwY290ZSIsICJTdmVjaWFvc3QiLCAiU3dhbGVkYWxlIiwKLSAgICAgICAgICAgICJTd2VldCBTdHlsZSBTd2lzcyIsICJTd2lzcyIsICJTeXJpYW4gKEFybWVuaWFuIFN0cmluZykiLCAiVGFsYSIsICJUYWxlZ2dpbyIsICJUYW1pZSIsCi0gICAgICAgICAgICAiVGFzbWFuaWEgSGlnaGxhbmQgQ2hldnJlIExvZyIsICJUYXVwaW5pZXJlIiwgIlRlaWZpIiwgIlRlbGVtZWEiLCAiVGVzdG91cmkiLAotICAgICAgICAgICAgIlRldGUgZGUgTW9pbmUiLCAiVGV0aWxsYSIsICJUZXhhcyBHb2F0IENoZWVzZSIsICJUaWJldCIsICJUaWxsYW1vb2sgQ2hlZGRhciIsCi0gICAgICAgICAgICAiVGlsc2l0IiwgIlRpbWJvb24gQnJpZSIsICJUb21hIiwgIlRvbW1lIEJydWxlZSIsICJUb21tZSBkJ0Fib25kYW5jZSIsCi0gICAgICAgICAgICAiVG9tbWUgZGUgQ2hldnJlIiwgIlRvbW1lIGRlIFJvbWFucyIsICJUb21tZSBkZSBTYXZvaWUiLCAiVG9tbWUgZGVzIENob3VhbnMiLCAiVG9tbWVzIiwKLSAgICAgICAgICAgICJUb3J0YSBkZWwgQ2FzYXIiLCAiVG9zY2FuZWxsbyIsICJUb3VyZWUgZGUgTCdBdWJpZXIiLCAiVG91cm1hbGV0IiwKLSAgICAgICAgICAgICJUcmFwcGUgKFZlcml0YWJsZSkiLCAiVHJvaXMgQ29ybmVzIERlIFZlbmRlZSIsICJUcm9uY2hvbiIsICJUcm91IGR1IENydSIsICJUcnVmZmUiLAotICAgICAgICAgICAgIlR1cGkiLCAiVHVydW5tYWEiLCAiVHltc2Jvcm8iLCAiVHluIEdydWciLCAiVHluaW5nIiwgIlVicmlhY28iLCAiVWxsb2EiLAotICAgICAgICAgICAgIlZhY2hlcmluLUZyaWJvdXJnZW9pcyIsICJWYWxlbmNheSIsICJWYXN0ZXJib3R0ZW5vc3QiLCAiVmVuYWNvIiwgIlZlbmRvbW9pcyIsCi0gICAgICAgICAgICAiVmlldXggQ29yc2UiLCAiVmlnbm90dGUiLCAiVnVsc2NvbWJlIiwgIldhaW1hdGEgRmFybWhvdXNlIEJsdWUiLAotICAgICAgICAgICAgIldhc2hlZCBSaW5kIENoZWVzZSAoQXVzdHJhbGlhbikiLCAiV2F0ZXJsb28iLCAiV2VpY2hrYWVzZSIsICJXZWxsaW5ndG9uIiwKLSAgICAgICAgICAgICJXZW5zbGV5ZGFsZSIsICJXaGl0ZSBTdGlsdG9uIiwgIldoaXRlc3RvbmUgRmFybWhvdXNlIiwgIldpZ21vcmUiLCAiV29vZHNpZGUgQ2FiZWNvdSIsCi0gICAgICAgICAgICAiWGFuYWR1IiwgIlh5bm90eXJvIiwgIllhcmcgQ29ybmlzaCIsICJZYXJyYSBWYWxsZXkgUHlyYW1pZCIsICJZb3Jrc2hpcmUgQmx1ZSIsCi0gICAgICAgICAgICAiWmFtb3Jhbm8iLCAiWmFuZXR0aSBHcmFuYSBQYWRhbm8iLCAiWmFuZXR0aSBQYXJtaWdpYW5vIFJlZ2dpYW5vIn07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtU3RyaW5ncyA9IENoZWVzZXMuc0NoZWVzZVN0cmluZ3M7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNC5qYXZhCmluZGV4IDQxZWI0ODEuLjU1ZjNiMjIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNC5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNC5qYXZhCkBAIC0xMzcsMTc4ICsxMzcsNSBAQAogICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgRWZmaWNpZW50QWRhcHRlcih0aGlzKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQSA9IHsKLSAgICAgICAgICAgICJBYmJheWUgZGUgQmVsbG9jIiwgIkFiYmF5ZSBkdSBNb250IGRlcyBDYXRzIiwgIkFiZXJ0YW0iLAotICAgICAgICAgICAgIkFib25kYW5jZSIsICJBY2thd2kiLCAiQWNvcm4iLCAiQWRlbG9zdCIsICJBZmZpZGVsaWNlIGF1IENoYWJsaXMiLAotICAgICAgICAgICAgIkFmdWVnYSdsIFBpdHUiLCAiQWlyYWciLCAiQWlyZWRhbGUiLCAiQWlzeSBDZW5kcmUiLAotICAgICAgICAgICAgIkFsbGdhdWVyIEVtbWVudGFsZXIiLCAiQWx2ZXJjYSIsICJBbWJlcnQiLCAiQW1lcmljYW4gQ2hlZXNlIiwKLSAgICAgICAgICAgICJBbWkgZHUgQ2hhbWJlcnRpbiIsICJBbmVqbyBFbmNoaWxhZG8iLCAiQW5uZWF1IGR1IFZpYy1CaWxoIiwKLSAgICAgICAgICAgICJBbnRob3Jpcm8iLCAiQXBwZW56ZWxsIiwgIkFyYWdvbiIsICJBcmRpIEdhc25hIiwgIkFyZHJhaGFuIiwKLSAgICAgICAgICAgICJBcm1lbmlhbiBTdHJpbmciLCAiQXJvbWVzIGF1IEdlbmUgZGUgTWFyYyIsICJBc2FkZXJvIiwgIkFzaWFnbyIsCi0gICAgICAgICAgICAiQXViaXNxdWUgUHlyZW5lZXMiLCAiQXV0dW4iLCAiQXZheHRza3lyIiwgIkJhYnkgU3dpc3MiLCAiQmFieWJlbCIsCi0gICAgICAgICAgICAiQmFndWV0dGUgTGFvbm5haXNlIiwgIkJha2VycyIsICJCYWxhZGkiLCAiQmFsYXRvbiIsICJCYW5kYWwiLAotICAgICAgICAgICAgIkJhbm9uIiwgIkJhcnJ5J3MgQmF5IENoZWRkYXIiLCAiQmFzaW5nIiwgIkJhc2tldCBDaGVlc2UiLAotICAgICAgICAgICAgIkJhdGggQ2hlZXNlIiwgIkJhdmFyaWFuIEJlcmdrYXNlIiwgIkJheWxvdWdoIiwgIkJlYXVmb3J0IiwKLSAgICAgICAgICAgICJCZWF1dm9vcmRlIiwgIkJlZW5sZWlnaCBCbHVlIiwgIkJlZXIgQ2hlZXNlIiwgIkJlbCBQYWVzZSIsCi0gICAgICAgICAgICAiQmVyZ2FkZXIiLCAiQmVyZ2VyZSBCbGV1ZSIsICJCZXJrc3dlbGwiLCAiQmV5YXogUGV5bmlyIiwKLSAgICAgICAgICAgICJCaWVya2FzZSIsICJCaXNob3AgS2VubmVkeSIsICJCbGFybmV5IiwgIkJsZXUgZCdBdXZlcmduZSIsCi0gICAgICAgICAgICAiQmxldSBkZSBHZXgiLCAiQmxldSBkZSBMYXF1ZXVpbGxlIiwgIkJsZXUgZGUgU2VwdG1vbmNlbCIsCi0gICAgICAgICAgICAiQmxldSBEZXMgQ2F1c3NlcyIsICJCbHVlIiwgIkJsdWUgQ2FzdGVsbG8iLCAiQmx1ZSBSYXRoZ29yZSIsCi0gICAgICAgICAgICAiQmx1ZSBWZWluIChBdXN0cmFsaWFuKSIsICJCbHVlIFZlaW4gQ2hlZXNlcyIsICJCb2Njb25jaW5pIiwKLSAgICAgICAgICAgICJCb2Njb25jaW5pIChBdXN0cmFsaWFuKSIsICJCb2VyZW4gTGVpZGVua2FhcyIsICJCb25jaGVzdGVyIiwKLSAgICAgICAgICAgICJCb3N3b3J0aCIsICJCb3Vnb24iLCAiQm91bGUgRHUgUm92ZXMiLCAiQm91bGV0dGUgZCdBdmVzbmVzIiwKLSAgICAgICAgICAgICJCb3Vyc2F1bHQiLCAiQm91cnNpbiIsICJCb3V5c3NvdSIsICJCcmEiLCAiQnJhdWRvc3R1ciIsCi0gICAgICAgICAgICAiQnJlYWtmYXN0IENoZWVzZSIsICJCcmViaXMgZHUgTGF2b3J0IiwgIkJyZWJpcyBkdSBMb2Nob2lzIiwKLSAgICAgICAgICAgICJCcmViaXMgZHUgUHV5ZmF1Y29uIiwgIkJyZXNzZSBCbGV1IiwgIkJyaWNrIiwgIkJyaWUiLAotICAgICAgICAgICAgIkJyaWUgZGUgTWVhdXgiLCAiQnJpZSBkZSBNZWx1biIsICJCcmlsbGF0LVNhdmFyaW4iLCAiQnJpbiIsCi0gICAgICAgICAgICAiQnJpbiBkJyBBbW91ciIsICJCcmluIGQnQW1vdXIiLCAiQnJpbnphIChCdXJkdWYgQnJpbnphKSIsCi0gICAgICAgICAgICAiQnJpcXVldHRlIGRlIEJyZWJpcyIsICJCcmlxdWV0dGUgZHUgRm9yZXoiLCAiQnJvY2NpbyIsCi0gICAgICAgICAgICAiQnJvY2NpbyBEZW1pLUFmZmluZSIsICJCcm91c3NlIGR1IFJvdmUiLCAiQnJ1ZGVyIEJhc2lsIiwKLSAgICAgICAgICAgICJCcnVzc2VsYWUgS2FhcyAoRnJvbWFnZSBkZSBCcnV4ZWxsZXMpIiwgIkJyeW5kemEiLAotICAgICAgICAgICAgIkJ1Y2hldHRlIGQnQW5qb3UiLCAiQnVmZmFsbyIsICJCdXJnb3MiLCAiQnV0dGUiLCAiQnV0dGVya2FzZSIsCi0gICAgICAgICAgICAiQnV0dG9uIChJbm5lcykiLCAiQnV4dG9uIEJsdWUiLCAiQ2FiZWNvdSIsICJDYWJvYyIsICJDYWJyYWxlcyIsCi0gICAgICAgICAgICAiQ2FjaGFpbGxlIiwgIkNhY2lvY2F2YWxsbyIsICJDYWNpb3R0YSIsICJDYWVycGhpbGx5IiwKLSAgICAgICAgICAgICJDYWlybnNtb3JlIiwgIkNhbGVuemFuYSIsICJDYW1iYXpvbGEiLCAiQ2FtZW1iZXJ0IGRlIE5vcm1hbmRpZSIsCi0gICAgICAgICAgICAiQ2FuYWRpYW4gQ2hlZGRhciIsICJDYW5lc3RyYXRvIiwgIkNhbnRhbCIsICJDYXByaWNlIGRlcyBEaWV1eCIsCi0gICAgICAgICAgICAiQ2Fwcmljb3JuIEdvYXQiLCAiQ2FwcmlvbGUgQmFub24iLCAiQ2FycmUgZGUgbCdFc3QiLAotICAgICAgICAgICAgIkNhc2Npb3R0YSBkaSBVcmJpbm8iLCAiQ2FzaGVsIEJsdWUiLCAiQ2FzdGVsbGFubyIsICJDYXN0ZWxsZW5vIiwKLSAgICAgICAgICAgICJDYXN0ZWxtYWdubyIsICJDYXN0ZWxvIEJyYW5jbyIsICJDYXN0aWdsaWFubyIsICJDYXRoZWxhaW4iLAotICAgICAgICAgICAgIkNlbHRpYyBQcm9taXNlIiwgIkNlbmRyZSBkJ09saXZldCIsICJDZXJuZXkiLCAiQ2hhYmljaG91IiwKLSAgICAgICAgICAgICJDaGFiaWNob3UgZHUgUG9pdG91IiwgIkNoYWJpcyBkZSBHYXRpbmUiLCAiQ2hhb3VyY2UiLCAiQ2hhcm9sYWlzIiwKLSAgICAgICAgICAgICJDaGF1bWVzIiwgIkNoZWRkYXIiLCAiQ2hlZGRhciBDbG90aGJvdW5kIiwgIkNoZXNoaXJlIiwgIkNoZXZyZXMiLAotICAgICAgICAgICAgIkNoZXZyb3RpbiBkZXMgQXJhdmlzIiwgIkNob250YWxlbm8iLCAiQ2l2cmF5IiwKLSAgICAgICAgICAgICJDb2V1ciBkZSBDYW1lbWJlcnQgYXUgQ2FsdmFkb3MiLCAiQ29ldXIgZGUgQ2hldnJlIiwgIkNvbGJ5IiwKLSAgICAgICAgICAgICJDb2xkIFBhY2siLCAiQ29tdGUiLCAiQ29vbGVhIiwgIkNvb2xlbmV5IiwgIkNvcXVldGRhbGUiLAotICAgICAgICAgICAgIkNvcmxlZ2d5IiwgIkNvcm5pc2ggUGVwcGVyIiwgIkNvdGhlcnN0b25lIiwgIkNvdGlqYSIsCi0gICAgICAgICAgICAiQ290dGFnZSBDaGVlc2UiLCAiQ290dGFnZSBDaGVlc2UgKEF1c3RyYWxpYW4pIiwgIkNvdWdhciBHb2xkIiwKLSAgICAgICAgICAgICJDb3Vsb21taWVycyIsICJDb3ZlcmRhbGUiLCAiQ3JheWV1eCBkZSBSb25jcSIsICJDcmVhbSBDaGVlc2UiLAotICAgICAgICAgICAgIkNyZWFtIEhhdmFydGkiLCAiQ3JlbWEgQWdyaWEiLCAiQ3JlbWEgTWV4aWNhbmEiLCAiQ3JlbWUgRnJhaWNoZSIsCi0gICAgICAgICAgICAiQ3Jlc2NlbnphIiwgIkNyb2doYW4iLCAiQ3JvdHRpbiBkZSBDaGF2aWdub2wiLAotICAgICAgICAgICAgIkNyb3R0aW4gZHUgQ2hhdmlnbm9sIiwgIkNyb3dkaWUiLCAiQ3Jvd2xleSIsICJDdWFqYWRhIiwgIkN1cmQiLAotICAgICAgICAgICAgIkN1cmUgTmFudGFpcyIsICJDdXJ3b3J0aHkiLCAiQ3dtdGF3ZSBQZWNvcmlubyIsCi0gICAgICAgICAgICAiQ3lwcmVzcyBHcm92ZSBDaGV2cmUiLCAiRGFuYWJsdSAoRGFuaXNoIEJsdWUpIiwgIkRhbmJvIiwKLSAgICAgICAgICAgICJEYW5pc2ggRm9udGluYSIsICJEYXJhbGFnamF6c2t5IiwgIkRhdXBoaW4iLCAiRGVsaWNlIGRlcyBGaW91dmVzIiwKLSAgICAgICAgICAgICJEZW5oYW55IERvcnNldCBEcnVtIiwgIkRlcmJ5IiwgIkRlc3NlcnRueWogQmVseWoiLCAiRGV2b24gQmx1ZSIsCi0gICAgICAgICAgICAiRGV2b24gR2FybGFuZCIsICJEb2xjZWxhdHRlIiwgIkRvb2xpbiIsICJEb3BwZWxyaGFtc3R1ZmVsIiwKLSAgICAgICAgICAgICJEb3JzZXQgQmx1ZSBWaW5uZXkiLCAiRG91YmxlIEdsb3VjZXN0ZXIiLCAiRG91YmxlIFdvcmNlc3RlciIsCi0gICAgICAgICAgICAiRHJldXggYSBsYSBGZXVpbGxlIiwgIkRyeSBKYWNrIiwgIkR1ZGRsZXN3ZWxsIiwgIkR1bmJhcnJhIiwKLSAgICAgICAgICAgICJEdW5sb3AiLCAiRHVuc3lyZSBCbHVlIiwgIkR1cm9ibGFuZG8iLCAiRHVycnVzIiwKLSAgICAgICAgICAgICJEdXRjaCBNaW1vbGV0dGUgKENvbW1pc3NpZWthYXMpIiwgIkVkYW0iLCAiRWRlbHBpbHoiLAotICAgICAgICAgICAgIkVtZW50YWwgR3JhbmQgQ3J1IiwgIkVtbGV0dCIsICJFbW1lbnRhbCIsICJFcG9pc3NlcyBkZSBCb3VyZ29nbmUiLAotICAgICAgICAgICAgIkVzYmFyZWljaCIsICJFc3JvbSIsICJFdG9ya2kiLCAiRXZhbnNkYWxlIEZhcm1ob3VzZSBCcmllIiwKLSAgICAgICAgICAgICJFdm9yYSBEZSBMJ0FsZW50ZWpvIiwgIkV4bW9vciBCbHVlIiwgIkV4cGxvcmF0ZXVyIiwgIkZldGEiLAotICAgICAgICAgICAgIkZldGEgKEF1c3RyYWxpYW4pIiwgIkZpZ3VlIiwgIkZpbGV0dGEiLCAiRmluLWRlLVNpZWNsZSIsCi0gICAgICAgICAgICAiRmlubGFuZGlhIFN3aXNzIiwgIkZpbm4iLCAiRmlvcmUgU2FyZG8iLCAiRmxldXIgZHUgTWFxdWlzIiwKLSAgICAgICAgICAgICJGbG9yIGRlIEd1aWEiLCAiRmxvd2VyIE1hcmllIiwgIkZvbGRlZCIsCi0gICAgICAgICAgICAiRm9sZGVkIGNoZWVzZSB3aXRoIG1pbnQiLCAiRm9uZGFudCBkZSBCcmViaXMiLCAiRm9udGFpbmVibGVhdSIsCi0gICAgICAgICAgICAiRm9udGFsIiwgIkZvbnRpbmEgVmFsIGQnQW9zdGEiLCAiRm9ybWFnZ2lvIGRpIGNhcHJhIiwgIkZvdWdlcnVzIiwKLSAgICAgICAgICAgICJGb3VyIEhlcmIgR291ZGEiLCAiRm91cm1lIGQnIEFtYmVydCIsICJGb3VybWUgZGUgSGF1dGUgTG9pcmUiLAotICAgICAgICAgICAgIkZvdXJtZSBkZSBNb250YnJpc29uIiwgIkZyZXNoIEphY2siLCAiRnJlc2ggTW96emFyZWxsYSIsCi0gICAgICAgICAgICAiRnJlc2ggUmljb3R0YSIsICJGcmVzaCBUcnVmZmxlcyIsICJGcmlib3VyZ2VvaXMiLCAiRnJpZXNla2FhcyIsCi0gICAgICAgICAgICAiRnJpZXNpYW4iLCAiRnJpZXNsYSIsICJGcmluYXVsdCIsICJGcm9tYWdlIGEgUmFjbGV0dGUiLAotICAgICAgICAgICAgIkZyb21hZ2UgQ29yc2UiLCAiRnJvbWFnZSBkZSBNb250YWduZSBkZSBTYXZvaWUiLCAiRnJvbWFnZSBGcmFpcyIsCi0gICAgICAgICAgICAiRnJ1aXQgQ3JlYW0gQ2hlZXNlIiwgIkZyeWluZyBDaGVlc2UiLCAiRnluYm8iLCAiR2FicmllbCIsCi0gICAgICAgICAgICAiR2FsZXR0ZSBkdSBQYWx1ZGllciIsICJHYWxldHRlIEx5b25uYWlzZSIsCi0gICAgICAgICAgICAiR2FsbG93YXkgR29hdCdzIE1pbGsgR2VtcyIsICJHYW1tZWxvc3QiLCAiR2FwZXJvbiBhIGwnQWlsIiwKLSAgICAgICAgICAgICJHYXJyb3R4YSIsICJHYXN0YW5iZXJyYSIsICJHZWl0b3N0IiwgIkdpcHBzbGFuZCBCbHVlIiwgIkdqZXRvc3QiLAotICAgICAgICAgICAgIkdsb3VjZXN0ZXIiLCAiR29sZGVuIENyb3NzIiwgIkdvcmdvbnpvbGEiLCAiR29ybnlhbHRhanNraSIsCi0gICAgICAgICAgICAiR29zcGVsIEdyZWVuIiwgIkdvdWRhIiwgIkdvdXR1IiwgIkdvd3JpZSIsICJHcmFiZXR0byIsICJHcmFkZG9zdCIsCi0gICAgICAgICAgICAiR3JhZnRvbiBWaWxsYWdlIENoZWRkYXIiLCAiR3JhbmEiLCAiR3JhbmEgUGFkYW5vIiwgIkdyYW5kIFZhdGVsIiwKLSAgICAgICAgICAgICJHcmF0YXJvbiBkJyBBcmVjaGVzIiwgIkdyYXR0ZS1QYWlsbGUiLCAiR3JhdmllcmEiLCAiR3JldWlsaCIsCi0gICAgICAgICAgICAiR3JldmUiLCAiR3JpcyBkZSBMaWxsZSIsICJHcnV5ZXJlIiwgIkd1YmJlZW4iLCAiR3VlcmJpZ255IiwKLSAgICAgICAgICAgICJIYWxsb3VtaSIsICJIYWxsb3VteSAoQXVzdHJhbGlhbikiLCAiSGFsb3VtaS1TdHlsZSBDaGVlc2UiLAotICAgICAgICAgICAgIkhhcmJvdXJuZSBCbHVlIiwgIkhhdmFydGkiLCAiSGVpZGkgR3J1eWVyZSIsICJIZXJlZm9yZCBIb3AiLAotICAgICAgICAgICAgIkhlcnJnYXJkc29zdCIsICJIZXJyaW90IEZhcm1ob3VzZSIsICJIZXJ2ZSIsICJIaXBpIEl0aSIsCi0gICAgICAgICAgICAiSHViYmFyZHN0b24gQmx1ZSBDb3ciLCAiSHVzaGFsbHNvc3QiLCAiSWJlcmljbyIsICJJZGFobyBHb2F0c3RlciIsCi0gICAgICAgICAgICAiSWRpYXphYmFsIiwgIklsIEJvc2NoZXR0byBhbCBUYXJ0dWZvIiwgIklsZSBkJ1lldSIsCi0gICAgICAgICAgICAiSXNsZSBvZiBNdWxsIiwgIkphcmxzYmVyZyIsICJKZXJtaSBUb3J0ZXMiLCAiSmlibmVoIEFyYWJpZWgiLAotICAgICAgICAgICAgIkppbmRpIEJyaWUiLCAiSnViaWxlZSBCbHVlIiwgIkp1dXN0b2xlaXBhIiwgIkthZGNoZ2FsbCIsICJLYXNlcmkiLAotICAgICAgICAgICAgIkthc2h0YSIsICJLZWZhbG90eXJpIiwgIktlbmFmYSIsICJLZXJuaGVtIiwgIktlcnZlbGxhIEFmZmluZSIsCi0gICAgICAgICAgICAiS2lrb3JhbmdpIiwgIktpbmcgSXNsYW5kIENhcGUgV2lja2hhbSBCcmllIiwgIktpbmcgUml2ZXIgR29sZCIsCi0gICAgICAgICAgICAiS2xvc3RlcmthZXNlIiwgIktub2NrYWxhcmEiLCAiS3VnZWxrYXNlIiwgIkwnQXZleXJvbm5haXMiLAotICAgICAgICAgICAgIkwnRWNpciBkZSBsJ0F1YnJhYyIsICJMYSBUYXVwaW5pZXJlIiwgIkxhIFZhY2hlIFF1aSBSaXQiLAotICAgICAgICAgICAgIkxhZ3Vpb2xlIiwgIkxhaXJvYmVsbCIsICJMYWp0YSIsICJMYW5hcmsgQmx1ZSIsICJMYW5jYXNoaXJlIiwKLSAgICAgICAgICAgICJMYW5ncmVzIiwgIkxhcHBpIiwgIkxhcnVucyIsICJMYXZpc3Rvd24iLCAiTGUgQnJpbiIsCi0gICAgICAgICAgICAiTGUgRml1bSBPcmJvIiwgIkxlIExhY2FuZG91IiwgIkxlIFJvdWxlIiwgIkxlYWZpZWxkIiwgIkxlYmJlbmUiLAotICAgICAgICAgICAgIkxlZXJkYW1tZXIiLCAiTGVpY2VzdGVyIiwgIkxleWRlbiIsICJMaW1idXJnZXIiLAotICAgICAgICAgICAgIkxpbmNvbG5zaGlyZSBQb2FjaGVyIiwgIkxpbmdvdCBTYWludCBCb3VzcXVldCBkJ09yYiIsICJMaXB0YXVlciIsCi0gICAgICAgICAgICAiTGl0dGxlIFJ5ZGluZ3MiLCAiTGl2YXJvdCIsICJMbGFuYm9pZHkiLCAiTGxhbmdsb2ZhbiBGYXJtaG91c2UiLAotICAgICAgICAgICAgIkxvY2ggQXJ0aHVyIEZhcm1ob3VzZSIsICJMb2RkaXN3ZWxsIEF2b25kYWxlIiwgIkxvbmdob3JuIiwKLSAgICAgICAgICAgICJMb3UgUGFsb3UiLCAiTG91IFBldnJlIiwgIkx5b25uYWlzIiwgIk1hYXNkYW0iLCAiTWFjY29uYWlzIiwKLSAgICAgICAgICAgICJNYWhvZSBBZ2VkIEdvdWRhIiwgIk1haG9uIiwgIk1hbHZlcm4iLCAiTWFtaXJvbGxlIiwgIk1hbmNoZWdvIiwKLSAgICAgICAgICAgICJNYW5vdXJpIiwgIk1hbnVyIiwgIk1hcmJsZSBDaGVkZGFyIiwgIk1hcmJsZWQgQ2hlZXNlcyIsCi0gICAgICAgICAgICAiTWFyZWRzb3VzIiwgIk1hcmdvdGluIiwgIk1hcmlibyIsICJNYXJvaWxsZXMiLCAiTWFzY2FyZXMiLAotICAgICAgICAgICAgIk1hc2NhcnBvbmUiLCAiTWFzY2FycG9uZSAoQXVzdHJhbGlhbikiLCAiTWFzY2FycG9uZSBUb3J0YSIsCi0gICAgICAgICAgICAiTWF0b2NxIiwgIk1heXRhZyBCbHVlIiwgIk1laXJhIiwgIk1lbmFsbGFjayBGYXJtaG91c2UiLAotICAgICAgICAgICAgIk1lbm9uaXRhIiwgIk1lcmVkaXRoIEJsdWUiLCAiTWVzb3N0IiwgIk1ldHRvbiAoQ2FuY29pbGxvdHRlKSIsCi0gICAgICAgICAgICAiTWV5ZXIgVmludGFnZSBHb3VkYSIsICJNaWhhbGljIFBleW5pciIsICJNaWxsZWVucyIsICJNaW1vbGV0dGUiLAotICAgICAgICAgICAgIk1pbmUtR2FiaGFyIiwgIk1pbmkgQmFieSBCZWxscyIsICJNaXh0ZSIsICJNb2xibyIsCi0gICAgICAgICAgICAiTW9uYXN0ZXJ5IENoZWVzZXMiLCAiTW9uZHNlZXIiLCAiTW9udCBEJ29yIEx5b25uYWlzIiwgIk1vbnRhc2lvIiwKLSAgICAgICAgICAgICJNb250ZXJleSBKYWNrIiwgIk1vbnRlcmV5IEphY2sgRHJ5IiwgIk1vcmJpZXIiLAotICAgICAgICAgICAgIk1vcmJpZXIgQ3J1IGRlIE1vbnRhZ25lIiwgIk1vdGhhaXMgYSBsYSBGZXVpbGxlIiwgIk1venphcmVsbGEiLAotICAgICAgICAgICAgIk1venphcmVsbGEgKEF1c3RyYWxpYW4pIiwgIk1venphcmVsbGEgZGkgQnVmYWxhIiwKLSAgICAgICAgICAgICJNb3p6YXJlbGxhIEZyZXNoLCBpbiB3YXRlciIsICJNb3p6YXJlbGxhIFJvbGxzIiwgIk11bnN0ZXIiLAotICAgICAgICAgICAgIk11cm9sIiwgIk15Y2VsbGEiLCAiTXl6aXRocmEiLCAiTmFib3Vsc2kiLCAiTmFudGFpcyIsCi0gICAgICAgICAgICAiTmV1ZmNoYXRlbCIsICJOZXVmY2hhdGVsIChBdXN0cmFsaWFuKSIsICJOaW9sbyIsICJOb2trZWxvc3QiLAotICAgICAgICAgICAgIk5vcnRodW1iZXJsYW5kIiwgIk9heGFjYSIsICJPbGRlIFlvcmsiLCAiT2xpdmV0IGF1IEZvaW4iLAotICAgICAgICAgICAgIk9saXZldCBCbGV1IiwgIk9saXZldCBDZW5kcmUiLCAiT3JrbmV5IEV4dHJhIE1hdHVyZSBDaGVkZGFyIiwKLSAgICAgICAgICAgICJPcmxhIiwgIk9zY2h0amVwa2EiLCAiT3NzYXUgRmVybWllciIsICJPc3NhdS1JcmF0eSIsICJPc3pjenlwZWsiLAotICAgICAgICAgICAgIk94Zm9yZCBCbHVlIiwgIlAndGl0IEJlcnJpY2hvbiIsICJQYWxldCBkZSBCYWJsaWdueSIsICJQYW5lZXIiLAotICAgICAgICAgICAgIlBhbmVsYSIsICJQYW5uZXJvbmUiLCAiUGFudCB5cyBHYXduIiwgIlBhcm1lc2FuIChQYXJtaWdpYW5vKSIsCi0gICAgICAgICAgICAiUGFybWlnaWFubyBSZWdnaWFubyIsICJQYXMgZGUgbCdFc2NhbGV0dGUiLCAiUGFzc2VuZGFsZSIsCi0gICAgICAgICAgICAiUGFzdGV1cml6ZWQgUHJvY2Vzc2VkIiwgIlBhdGUgZGUgRnJvbWFnZSIsICJQYXRlZmluZSBGb3J0IiwKLSAgICAgICAgICAgICJQYXZlIGQnQWZmaW5vaXMiLCAiUGF2ZSBkJ0F1Z2UiLCAiUGF2ZSBkZSBDaGlyYWMiLAotICAgICAgICAgICAgIlBhdmUgZHUgQmVycnkiLCAiUGVjb3Jpbm8iLCAiUGVjb3Jpbm8gaW4gV2FsbnV0IExlYXZlcyIsCi0gICAgICAgICAgICAiUGVjb3Jpbm8gUm9tYW5vIiwgIlBlZWtza2lsbCBQeXJhbWlkIiwgIlBlbGFyZG9uIGRlcyBDZXZlbm5lcyIsCi0gICAgICAgICAgICAiUGVsYXJkb24gZGVzIENvcmJpZXJlcyIsICJQZW5hbWVsbGVyYSIsICJQZW5icnluIiwgIlBlbmNhcnJlZyIsCi0gICAgICAgICAgICAiUGVyYWlsIGRlIEJyZWJpcyIsICJQZXRpdCBNb3JpbiIsICJQZXRpdCBQYXJkb3UiLCAiUGV0aXQtU3Vpc3NlIiwKLSAgICAgICAgICAgICJQaWNvZG9uIGRlIENoZXZyZSIsICJQaWNvcyBkZSBFdXJvcGEiLCAiUGlvcmEiLAotICAgICAgICAgICAgIlBpdGh0dmllcnMgYXUgRm9pbiIsICJQbGF0ZWF1IGRlIEhlcnZlIiwgIlBseW1vdXRoIENoZWVzZSIsCi0gICAgICAgICAgICAiUG9kaGFsYW5za2kiLCAiUG9pdnJlIGQnQW5lIiwgIlBvbGtvbGJpbiIsICJQb250IGwnRXZlcXVlIiwKLSAgICAgICAgICAgICJQb3J0IE5pY2hvbHNvbiIsICJQb3J0LVNhbHV0IiwgIlBvc3RlbCIsICJQb3VsaWdueS1TYWludC1QaWVycmUiLAotICAgICAgICAgICAgIlBvdXJseSIsICJQcmFzdG9zdCIsICJQcmVzc2F0byIsICJQcmluY2UtSmVhbiIsCi0gICAgICAgICAgICAiUHJvY2Vzc2VkIENoZWRkYXIiLCAiUHJvdm9sb25lIiwgIlByb3ZvbG9uZSAoQXVzdHJhbGlhbikiLAotICAgICAgICAgICAgIlB5ZW5nYW5hIENoZWRkYXIiLCAiUHlyYW1pZGUiLCAiUXVhcmsiLCAiUXVhcmsgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJRdWFydGlyb2xvIExvbWJhcmRvIiwgIlF1YXRyZS1WZW50cyIsICJRdWVyY3kgUGV0aXQiLAotICAgICAgICAgICAgIlF1ZXNvIEJsYW5jbyIsICJRdWVzbyBCbGFuY28gY29uIEZydXRhcyAtLVBpbmEgeSBNYW5nbyIsCi0gICAgICAgICAgICAiUXVlc28gZGUgTXVyY2lhIiwgIlF1ZXNvIGRlbCBNb250c2VjIiwgIlF1ZXNvIGRlbCBUaWV0YXIiLAotICAgICAgICAgICAgIlF1ZXNvIEZyZXNjbyIsICJRdWVzbyBGcmVzY28gKEFkb2JlcmEpIiwgIlF1ZXNvIEliZXJpY28iLAotICAgICAgICAgICAgIlF1ZXNvIEphbGFwZW5vIiwgIlF1ZXNvIE1ham9yZXJvIiwgIlF1ZXNvIE1lZGlhIEx1bmEiLAotICAgICAgICAgICAgIlF1ZXNvIFBhcmEgRnJpZXIiLCAiUXVlc28gUXVlc2FkaWxsYSIsICJSYWJhY2FsIiwgIlJhY2xldHRlIiwKLSAgICAgICAgICAgICJSYWd1c2FubyIsICJSYXNjaGVyYSIsICJSZWJsb2Nob24iLCAiUmVkIExlaWNlc3RlciIsCi0gICAgICAgICAgICAiUmVnYWwgZGUgbGEgRG9tYmVzIiwgIlJlZ2dpYW5pdG8iLCAiUmVtZWRvdSIsICJSZXF1ZXNvbiIsCi0gICAgICAgICAgICAiUmljaGVsaWV1IiwgIlJpY290dGEiLCAiUmljb3R0YSAoQXVzdHJhbGlhbikiLCAiUmljb3R0YSBTYWxhdGEiLAotICAgICAgICAgICAgIlJpZGRlciIsICJSaWdvdHRlIiwgIlJvY2FtYWRvdXIiLCAiUm9sbG90IiwgIlJvbWFubyIsCi0gICAgICAgICAgICAiUm9tYW5zIFBhcnQgRGlldSIsICJSb25jYWwiLCAiUm9xdWVmb3J0IiwgIlJvdWxlIiwKLSAgICAgICAgICAgICJSb3VsZWF1IERlIEJlYXVsaWV1IiwgIlJveWFscCBUaWxzaXQiLCAiUnViZW5zIiwgIlJ1c3RpbnUiLAotICAgICAgICAgICAgIlNhYWxhbmQgUGZhcnIiLCAiU2FhbmVua2Flc2UiLCAiU2FnYSIsICJTYWdlIERlcmJ5IiwKLSAgICAgICAgICAgICJTYWludGUgTWF1cmUiLCAiU2FpbnQtTWFyY2VsbGluIiwgIlNhaW50LU5lY3RhaXJlIiwKLSAgICAgICAgICAgICJTYWludC1QYXVsaW4iLCAiU2FsZXJzIiwgIlNhbXNvIiwgIlNhbiBTaW1vbiIsICJTYW5jZXJyZSIsCi0gICAgICAgICAgICAiU2FwIFNhZ28iLCAiU2FyZG8iLCAiU2FyZG8gRWd5cHRpYW4iLCAiU2JyaW56IiwgIlNjYW1vcnphIiwKLSAgICAgICAgICAgICJTY2hhYnppZWdlciIsICJTY2hsb3NzIiwgIlNlbGxlcyBzdXIgQ2hlciIsICJTZWx2YSIsICJTZXJhdCIsCi0gICAgICAgICAgICAiU2VyaW91c2x5IFN0cm9uZyBDaGVkZGFyIiwgIlNlcnJhIGRhIEVzdHJlbGEiLCAiU2hhcnBhbSIsCi0gICAgICAgICAgICAiU2hlbGJ1cm5lIENoZWRkYXIiLCAiU2hyb3BzaGlyZSBCbHVlIiwgIlNpcmF6IiwgIlNpcmVuZSIsCi0gICAgICAgICAgICAiU21va2VkIEdvdWRhIiwgIlNvbWVyc2V0IEJyaWUiLCAiU29ub21hIEphY2siLAotICAgICAgICAgICAgIlNvdHRvY2VuYXJlIGFsIFRhcnR1Zm8iLCAiU291bWFpbnRyYWluIiwgIlNvdXJpcmUgTG96ZXJpZW4iLAotICAgICAgICAgICAgIlNwZW53b29kIiwgIlNyYWZmb3Jkc2hpcmUgT3JnYW5pYyIsICJTdC4gQWd1ciBCbHVlIENoZWVzZSIsCi0gICAgICAgICAgICAiU3RpbHRvbiIsICJTdGlua2luZyBCaXNob3AiLCAiU3RyaW5nIiwgIlN1c3NleCBTbGlwY290ZSIsCi0gICAgICAgICAgICAiU3ZlY2lhb3N0IiwgIlN3YWxlZGFsZSIsICJTd2VldCBTdHlsZSBTd2lzcyIsICJTd2lzcyIsCi0gICAgICAgICAgICAiU3lyaWFuIChBcm1lbmlhbiBTdHJpbmcpIiwgIlRhbGEiLCAiVGFsZWdnaW8iLCAiVGFtaWUiLAotICAgICAgICAgICAgIlRhc21hbmlhIEhpZ2hsYW5kIENoZXZyZSBMb2ciLCAiVGF1cGluaWVyZSIsICJUZWlmaSIsICJUZWxlbWVhIiwKLSAgICAgICAgICAgICJUZXN0b3VyaSIsICJUZXRlIGRlIE1vaW5lIiwgIlRldGlsbGEiLCAiVGV4YXMgR29hdCBDaGVlc2UiLAotICAgICAgICAgICAgIlRpYmV0IiwgIlRpbGxhbW9vayBDaGVkZGFyIiwgIlRpbHNpdCIsICJUaW1ib29uIEJyaWUiLCAiVG9tYSIsCi0gICAgICAgICAgICAiVG9tbWUgQnJ1bGVlIiwgIlRvbW1lIGQnQWJvbmRhbmNlIiwgIlRvbW1lIGRlIENoZXZyZSIsCi0gICAgICAgICAgICAiVG9tbWUgZGUgUm9tYW5zIiwgIlRvbW1lIGRlIFNhdm9pZSIsICJUb21tZSBkZXMgQ2hvdWFucyIsCi0gICAgICAgICAgICAiVG9tbWVzIiwgIlRvcnRhIGRlbCBDYXNhciIsICJUb3NjYW5lbGxvIiwgIlRvdXJlZSBkZSBMJ0F1YmllciIsCi0gICAgICAgICAgICAiVG91cm1hbGV0IiwgIlRyYXBwZSAoVmVyaXRhYmxlKSIsICJUcm9pcyBDb3JuZXMgRGUgVmVuZGVlIiwKLSAgICAgICAgICAgICJUcm9uY2hvbiIsICJUcm91IGR1IENydSIsICJUcnVmZmUiLCAiVHVwaSIsICJUdXJ1bm1hYSIsCi0gICAgICAgICAgICAiVHltc2Jvcm8iLCAiVHluIEdydWciLCAiVHluaW5nIiwgIlVicmlhY28iLCAiVWxsb2EiLAotICAgICAgICAgICAgIlZhY2hlcmluLUZyaWJvdXJnZW9pcyIsICJWYWxlbmNheSIsICJWYXN0ZXJib3R0ZW5vc3QiLCAiVmVuYWNvIiwKLSAgICAgICAgICAgICJWZW5kb21vaXMiLCAiVmlldXggQ29yc2UiLCAiVmlnbm90dGUiLCAiVnVsc2NvbWJlIiwKLSAgICAgICAgICAgICJXYWltYXRhIEZhcm1ob3VzZSBCbHVlIiwgIldhc2hlZCBSaW5kIENoZWVzZSAoQXVzdHJhbGlhbikiLAotICAgICAgICAgICAgIldhdGVybG9vIiwgIldlaWNoa2Flc2UiLCAiV2VsbGluZ3RvbiIsICJXZW5zbGV5ZGFsZSIsCi0gICAgICAgICAgICAiV2hpdGUgU3RpbHRvbiIsICJXaGl0ZXN0b25lIEZhcm1ob3VzZSIsICJXaWdtb3JlIiwKLSAgICAgICAgICAgICJXb29kc2lkZSBDYWJlY291IiwgIlhhbmFkdSIsICJYeW5vdHlybyIsICJZYXJnIENvcm5pc2giLAotICAgICAgICAgICAgIllhcnJhIFZhbGxleSBQeXJhbWlkIiwgIllvcmtzaGlyZSBCbHVlIiwgIlphbW9yYW5vIiwKLSAgICAgICAgICAgICJaYW5ldHRpIEdyYW5hIFBhZGFubyIsICJaYW5ldHRpIFBhcm1pZ2lhbm8gUmVnZ2lhbm8ifTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVRBID0gQ2hlZXNlcy5zQ2hlZXNlU3RyaW5nczsKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhN2M2NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKKy8qKgorICogVGhpcyBkZW1vIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwsIGEuay5hLiBzZWxlY3Rpb24gbW9kZSBvbiBMaXN0Vmlldy4KKyAqLworcHVibGljIGNsYXNzIExpc3QxNSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBMaXN0VmlldyBsdiA9IGdldExpc3RWaWV3KCk7CisgICAgICAgIGx2LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpOworICAgICAgICBsdi5zZXRNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcihuZXcgTW9kZUNhbGxiYWNrKCkpOworICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fY2hlY2tlZCwgbVN0cmluZ3MpKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Q3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25Qb3N0Q3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldEFjdGlvbkJhcigpLnNldFN1YnRpdGxlKCJMb25nIHByZXNzIHRvIHN0YXJ0IHNlbGVjdGlvbiIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIE1vZGVDYWxsYmFjayBpbXBsZW1lbnRzIExpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUubGlzdF9zZWxlY3RfbWVudSwgbWVudSk7CisgICAgICAgICAgICBtb2RlLnNldFRpdGxlKCJTZWxlY3QgSXRlbXMiKTsKKyAgICAgICAgICAgIHNldFN1YnRpdGxlKG1vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zaGFyZToKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChMaXN0MTUudGhpcywgIlNoYXJlZCAiICsgZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KExpc3QxNS50aGlzLCAiQ2xpY2tlZCAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKEFjdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQsIGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgc2V0U3VidGl0bGUobW9kZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0U3VidGl0bGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hlY2tlZENvdW50ID0gZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCk7CisgICAgICAgICAgICBzd2l0Y2ggKGNoZWNrZWRDb3VudCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCJPbmUgaXRlbSBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCIiICsgY2hlY2tlZENvdW50ICsgIiBpdGVtcyBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gbVN0cmluZ3MgPSBDaGVlc2VzLnNDaGVlc2VTdHJpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE2LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVhNmVkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE2LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworLyoqCisgKiBUaGlzIGRlbW8gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCwgYS5rLmEuIHNlbGVjdGlvbiBtb2RlIG9uIExpc3RWaWV3CisgKiBjb3VwbGUgd2l0aCB0aGUgbmV3IHNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEgd2hpY2ggdXNlcyBhIGhpZ2hsaWdodGVkIGJvcmRlciBmb3Igc2VsZWN0ZWQKKyAqIGl0ZW1zLgorICovCitwdWJsaWMgY2xhc3MgTGlzdDE2IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIExpc3RWaWV3IGx2ID0gZ2V0TGlzdFZpZXcoKTsKKyAgICAgICAgbHYuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCk7CisgICAgICAgIGx2LnNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyKG5ldyBNb2RlQ2FsbGJhY2soKSk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMSwgQ2hlZXNlcy5zQ2hlZXNlU3RyaW5ncykpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RDcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblBvc3RDcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0QWN0aW9uQmFyKCkuc2V0U3VidGl0bGUoIkxvbmcgcHJlc3MgdG8gc3RhcnQgc2VsZWN0aW9uIik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5saXN0X3NlbGVjdF9tZW51LCBtZW51KTsKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUoIlNlbGVjdCBJdGVtcyIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zaGFyZToKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChMaXN0MTYudGhpcywgIlNoYXJlZCAiICsgZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KExpc3QxNi50aGlzLCAiQ2xpY2tlZCAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKEFjdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQsIGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNoZWNrZWRDb3VudCA9IGdldExpc3RWaWV3KCkuZ2V0Q2hlY2tlZEl0ZW1Db3VudCgpOworICAgICAgICAgICAgc3dpdGNoIChjaGVja2VkQ291bnQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiT25lIGl0ZW0gc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiIiArIGNoZWNrZWRDb3VudCArICIgaXRlbXMgc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE3LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZhMGJkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE3LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisKKy8qKgorICogQSBsaXN0IHZpZXcgd2hlcmUgdGhlIGxhc3QgaXRlbSB0aGUgdXNlciBjbGlja2VkIGlzIHBsYWNlZCBpbgorICogdGhlICJhY3RpdmF0ZWQiIHN0YXRlLCBjYXVzaW5nIGl0cyBiYWNrZ3JvdW5kIHRvIGhpZ2hsaWdodC4KKyAqLworcHVibGljIGNsYXNzIExpc3QxNyBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gVXNlIHRoZSBidWlsdC1pbiBsYXlvdXQgZm9yIHNob3dpbmcgYSBsaXN0IGl0ZW0gd2l0aCBhIHNpbmdsZQorICAgICAgICAvLyBsaW5lIG9mIHRleHQgd2hvc2UgYmFja2dyb3VuZCBpcyBjaGFuZ2VzIHdoZW4gYWN0aXZhdGVkLgorICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEsIG1TdHJpbmdzKSk7CisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0VGV4dEZpbHRlckVuYWJsZWQodHJ1ZSk7CisgICAgICAgIAorICAgICAgICAvLyBUZWxsIHRoZSBsaXN0IHZpZXcgdG8gc2hvdyBvbmUgY2hlY2tlZC9hY3RpdmF0ZWQgaXRlbSBhdCBhIHRpbWUuCisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICAKKyAgICAgICAgLy8gU3RhcnQgd2l0aCBmaXJzdCBpdGVtIGFjdGl2YXRlZC4KKyAgICAgICAgLy8gTWFrZSB0aGUgbmV3bHkgY2xpY2tlZCBpdGVtIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb25lLgorICAgICAgICBnZXRMaXN0VmlldygpLnNldEl0ZW1DaGVja2VkKDAsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAvLyBNYWtlIHRoZSBuZXdseSBjbGlja2VkIGl0ZW0gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvbmUuCisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gbVN0cmluZ3MgPSBDaGVlc2VzLnNDaGVlc2VTdHJpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q0LmphdmEKaW5kZXggYTE0MGU2MC4uOWMxOGE1ZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDQuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0NC5qYXZhCkBAIC0xNiw4ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CiAKLS8vTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCi0vL2NsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlNoYWtlc3BlYXJlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtNTksNyArNTksNyBAQAogICAgICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyI2dldENvdW50KCkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRpdGxlcy5sZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gU2hha2VzcGVhcmUuVElUTEVTLmxlbmd0aDsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtOTIsMTIgKzkyLDEyIEBACiAgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CiAgICAgICAgICAgICBTcGVlY2hWaWV3IHN2OwogICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdiA9IG5ldyBTcGVlY2hWaWV3KG1Db250ZXh0LCBtVGl0bGVzW3Bvc2l0aW9uXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaWFsb2d1ZVtwb3NpdGlvbl0pOworICAgICAgICAgICAgICAgIHN2ID0gbmV3IFNwZWVjaFZpZXcobUNvbnRleHQsIFNoYWtlc3BlYXJlLlRJVExFU1twb3NpdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICBTaGFrZXNwZWFyZS5ESUFMT0dVRVtwb3NpdGlvbl0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzdiA9IChTcGVlY2hWaWV3KSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgICAgICBzdi5zZXRUaXRsZShtVGl0bGVzW3Bvc2l0aW9uXSk7Ci0gICAgICAgICAgICAgICAgc3Yuc2V0RGlhbG9ndWUobURpYWxvZ3VlW3Bvc2l0aW9uXSk7CisgICAgICAgICAgICAgICAgc3Yuc2V0VGl0bGUoU2hha2VzcGVhcmUuVElUTEVTW3Bvc2l0aW9uXSk7CisgICAgICAgICAgICAgICAgc3Yuc2V0RGlhbG9ndWUoU2hha2VzcGVhcmUuRElBTE9HVUVbcG9zaXRpb25dKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHN2OwpAQCAtMTA3LDIyNiArMTA3LDYgQEAKICAgICAgICAgICogUmVtZW1iZXIgb3VyIGNvbnRleHQgc28gd2UgY2FuIHVzZSBpdCB3aGVuIGNvbnN0cnVjdGluZyB2aWV3cy4KICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdXIgZGF0YSwgcGFydCAxLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGl0bGVzID0gCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAiSGVucnkgSVYgKDEpIiwgICAKLSAgICAgICAgICAgICAgICAiSGVucnkgViIsCi0gICAgICAgICAgICAgICAgIkhlbnJ5IFZJSUkiLCAgICAgICAKLSAgICAgICAgICAgICAgICAiUmljaGFyZCBJSSIsCi0gICAgICAgICAgICAgICAgIlJpY2hhcmQgSUlJIiwKLSAgICAgICAgICAgICAgICAiTWVyY2hhbnQgb2YgVmVuaWNlIiwgIAotICAgICAgICAgICAgICAgICJPdGhlbGxvIiwKLSAgICAgICAgICAgICAgICAiS2luZyBMZWFyIgotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE91ciBkYXRhLCBwYXJ0IDIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1EaWFsb2d1ZSA9IAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIlNvIHNoYWtlbiBhcyB3ZSBhcmUsIHNvIHdhbiB3aXRoIGNhcmUsIiArCi0gICAgICAgICAgICAgICAgIkZpbmQgd2UgYSB0aW1lIGZvciBmcmlnaHRlZCBwZWFjZSB0byBwYW50LCIgKwotICAgICAgICAgICAgICAgICJBbmQgYnJlYXRoZSBzaG9ydC13aW5kZWQgYWNjZW50cyBvZiBuZXcgYnJvaWxzIiArCi0gICAgICAgICAgICAgICAgIlRvIGJlIGNvbW1lbmNlZCBpbiBzdHJhbmRzIGFmYXIgcmVtb3RlLiIgKwotICAgICAgICAgICAgICAgICJObyBtb3JlIHRoZSB0aGlyc3R5IGVudHJhbmNlIG9mIHRoaXMgc29pbCIgKwotICAgICAgICAgICAgICAgICJTaGFsbCBkYXViIGhlciBsaXBzIHdpdGggaGVyIG93biBjaGlsZHJlbidzIGJsb29kOyIgKwotICAgICAgICAgICAgICAgICJOb3IgbW9yZSBzaGFsbCB0cmVuY2hpbmcgd2FyIGNoYW5uZWwgaGVyIGZpZWxkcywiICsKLSAgICAgICAgICAgICAgICAiTm9yIGJydWlzZSBoZXIgZmxvd2VyZXRzIHdpdGggdGhlIGFybWVkIGhvb2ZzIiArCi0gICAgICAgICAgICAgICAgIk9mIGhvc3RpbGUgcGFjZXM6IHRob3NlIG9wcG9zZWQgZXllcywiICsKLSAgICAgICAgICAgICAgICAiV2hpY2gsIGxpa2UgdGhlIG1ldGVvcnMgb2YgYSB0cm91YmxlZCBoZWF2ZW4sIiArCi0gICAgICAgICAgICAgICAgIkFsbCBvZiBvbmUgbmF0dXJlLCBvZiBvbmUgc3Vic3RhbmNlIGJyZWQsIiArCi0gICAgICAgICAgICAgICAgIkRpZCBsYXRlbHkgbWVldCBpbiB0aGUgaW50ZXN0aW5lIHNob2NrIiArCi0gICAgICAgICAgICAgICAgIkFuZCBmdXJpb3VzIGNsb3NlIG9mIGNpdmlsIGJ1dGNoZXJ5IiArCi0gICAgICAgICAgICAgICAgIlNoYWxsIG5vdywgaW4gbXV0dWFsIHdlbGwtYmVzZWVtaW5nIHJhbmtzLCIgKwotICAgICAgICAgICAgICAgICJNYXJjaCBhbGwgb25lIHdheSBhbmQgYmUgbm8gbW9yZSBvcHBvc2VkIiArCi0gICAgICAgICAgICAgICAgIkFnYWluc3QgYWNxdWFpbnRhbmNlLCBraW5kcmVkIGFuZCBhbGxpZXM6IiArCi0gICAgICAgICAgICAgICAgIlRoZSBlZGdlIG9mIHdhciwgbGlrZSBhbiBpbGwtc2hlYXRoZWQga25pZmUsIiArCi0gICAgICAgICAgICAgICAgIk5vIG1vcmUgc2hhbGwgY3V0IGhpcyBtYXN0ZXIuIFRoZXJlZm9yZSwgZnJpZW5kcywiICsKLSAgICAgICAgICAgICAgICAiQXMgZmFyIGFzIHRvIHRoZSBzZXB1bGNocmUgb2YgQ2hyaXN0LCIgKwotICAgICAgICAgICAgICAgICJXaG9zZSBzb2xkaWVyIG5vdywgdW5kZXIgd2hvc2UgYmxlc3NlZCBjcm9zcyIgKwotICAgICAgICAgICAgICAgICJXZSBhcmUgaW1wcmVzc2VkIGFuZCBlbmdhZ2VkIHRvIGZpZ2h0LCIgKwotICAgICAgICAgICAgICAgICJGb3J0aHdpdGggYSBwb3dlciBvZiBFbmdsaXNoIHNoYWxsIHdlIGxldnk7IiArCi0gICAgICAgICAgICAgICAgIldob3NlIGFybXMgd2VyZSBtb3VsZGVkIGluIHRoZWlyIG1vdGhlcnMnIHdvbWIiICsKLSAgICAgICAgICAgICAgICAiVG8gY2hhc2UgdGhlc2UgcGFnYW5zIGluIHRob3NlIGhvbHkgZmllbGRzIiArCi0gICAgICAgICAgICAgICAgIk92ZXIgd2hvc2UgYWNyZXMgd2FsaydkIHRob3NlIGJsZXNzZWQgZmVldCIgKwotICAgICAgICAgICAgICAgICJXaGljaCBmb3VydGVlbiBodW5kcmVkIHllYXJzIGFnbyB3ZXJlIG5haWwnZCIgKwotICAgICAgICAgICAgICAgICJGb3Igb3VyIGFkdmFudGFnZSBvbiB0aGUgYml0dGVyIGNyb3NzLiIgKwotICAgICAgICAgICAgICAgICJCdXQgdGhpcyBvdXIgcHVycG9zZSBub3cgaXMgdHdlbHZlIG1vbnRoIG9sZCwiICsKLSAgICAgICAgICAgICAgICAiQW5kIGJvb3RsZXNzICd0aXMgdG8gdGVsbCB5b3Ugd2Ugd2lsbCBnbzoiICsKLSAgICAgICAgICAgICAgICAiVGhlcmVmb3JlIHdlIG1lZXQgbm90IG5vdy4gVGhlbiBsZXQgbWUgaGVhciIgKwotICAgICAgICAgICAgICAgICJPZiB5b3UsIG15IGdlbnRsZSBjb3VzaW4gV2VzdG1vcmVsYW5kLCIgKwotICAgICAgICAgICAgICAgICJXaGF0IHllc3Rlcm5pZ2h0IG91ciBjb3VuY2lsIGRpZCBkZWNyZWUiICsKLSAgICAgICAgICAgICAgICAiSW4gZm9yd2FyZGluZyB0aGlzIGRlYXIgZXhwZWRpZW5jZS4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJIZWFyIGhpbSBidXQgcmVhc29uIGluIGRpdmluaXR5LCIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIGFsbC1hZG1pcmluZyB3aXRoIGFuIGlud2FyZCB3aXNoIiArIAotICAgICAgICAgICAgICAgICJZb3Ugd291bGQgZGVzaXJlIHRoZSBraW5nIHdlcmUgbWFkZSBhIHByZWxhdGU6IiArIAotICAgICAgICAgICAgICAgICJIZWFyIGhpbSBkZWJhdGUgb2YgY29tbW9ud2VhbHRoIGFmZmFpcnMsIiArIAotICAgICAgICAgICAgICAgICJZb3Ugd291bGQgc2F5IGl0IGhhdGggYmVlbiBhbGwgaW4gYWxsIGhpcyBzdHVkeToiICsgCi0gICAgICAgICAgICAgICAgIkxpc3QgaGlzIGRpc2NvdXJzZSBvZiB3YXIsIGFuZCB5b3Ugc2hhbGwgaGVhciIgKyAKLSAgICAgICAgICAgICAgICAiQSBmZWFyZnVsIGJhdHRsZSByZW5kZXInZCB5b3UgaW4gbXVzaWM6IiArIAotICAgICAgICAgICAgICAgICJUdXJuIGhpbSB0byBhbnkgY2F1c2Ugb2YgcG9saWN5LCIgKyAKLSAgICAgICAgICAgICAgICAiVGhlIEdvcmRpYW4ga25vdCBvZiBpdCBoZSB3aWxsIHVubG9vc2UsIiArIAotICAgICAgICAgICAgICAgICJGYW1pbGlhciBhcyBoaXMgZ2FydGVyOiB0aGF0LCB3aGVuIGhlIHNwZWFrcywiICsgCi0gICAgICAgICAgICAgICAgIlRoZSBhaXIsIGEgY2hhcnRlcidkIGxpYmVydGluZSwgaXMgc3RpbGwsIiArIAotICAgICAgICAgICAgICAgICJBbmQgdGhlIG11dGUgd29uZGVyIGx1cmtldGggaW4gbWVuJ3MgZWFycywiICsgCi0gICAgICAgICAgICAgICAgIlRvIHN0ZWFsIGhpcyBzd2VldCBhbmQgaG9uZXknZCBzZW50ZW5jZXM7IiArIAotICAgICAgICAgICAgICAgICJTbyB0aGF0IHRoZSBhcnQgYW5kIHByYWN0aWMgcGFydCBvZiBsaWZlIiArIAotICAgICAgICAgICAgICAgICJNdXN0IGJlIHRoZSBtaXN0cmVzcyB0byB0aGlzIHRoZW9yaWM6IiArIAotICAgICAgICAgICAgICAgICJXaGljaCBpcyBhIHdvbmRlciBob3cgaGlzIGdyYWNlIHNob3VsZCBnbGVhbiBpdCwiICsgCi0gICAgICAgICAgICAgICAgIlNpbmNlIGhpcyBhZGRpY3Rpb24gd2FzIHRvIGNvdXJzZXMgdmFpbiwiICsgCi0gICAgICAgICAgICAgICAgIkhpcyBjb21wYW5pZXMgdW5sZXR0ZXInZCwgcnVkZSBhbmQgc2hhbGxvdywiICsgCi0gICAgICAgICAgICAgICAgIkhpcyBob3VycyBmaWxsJ2QgdXAgd2l0aCByaW90cywgYmFucXVldHMsIHNwb3J0cywiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBuZXZlciBub3RlZCBpbiBoaW0gYW55IHN0dWR5LCIgKyAKLSAgICAgICAgICAgICAgICAiQW55IHJldGlyZW1lbnQsIGFueSBzZXF1ZXN0cmF0aW9uIiArIAotICAgICAgICAgICAgICAgICJGcm9tIG9wZW4gaGF1bnRzIGFuZCBwb3B1bGFyaXR5LiIsCi0KLSAgICAgICAgICAgICAgICAiSSBjb21lIG5vIG1vcmUgdG8gbWFrZSB5b3UgbGF1Z2g6IHRoaW5ncyBub3csIiArCi0gICAgICAgICAgICAgICAgIlRoYXQgYmVhciBhIHdlaWdodHkgYW5kIGEgc2VyaW91cyBicm93LCIgKwotICAgICAgICAgICAgICAgICJTYWQsIGhpZ2gsIGFuZCB3b3JraW5nLCBmdWxsIG9mIHN0YXRlIGFuZCB3b2UsIiArCi0gICAgICAgICAgICAgICAgIlN1Y2ggbm9ibGUgc2NlbmVzIGFzIGRyYXcgdGhlIGV5ZSB0byBmbG93LCIgKwotICAgICAgICAgICAgICAgICJXZSBub3cgcHJlc2VudC4gVGhvc2UgdGhhdCBjYW4gcGl0eSwgaGVyZSIgKwotICAgICAgICAgICAgICAgICJNYXksIGlmIHRoZXkgdGhpbmsgaXQgd2VsbCwgbGV0IGZhbGwgYSB0ZWFyOyIgKwotICAgICAgICAgICAgICAgICJUaGUgc3ViamVjdCB3aWxsIGRlc2VydmUgaXQuIFN1Y2ggYXMgZ2l2ZSIgKwotICAgICAgICAgICAgICAgICJUaGVpciBtb25leSBvdXQgb2YgaG9wZSB0aGV5IG1heSBiZWxpZXZlLCIgKwotICAgICAgICAgICAgICAgICJNYXkgaGVyZSBmaW5kIHRydXRoIHRvby4gVGhvc2UgdGhhdCBjb21lIHRvIHNlZSIgKwotICAgICAgICAgICAgICAgICJPbmx5IGEgc2hvdyBvciB0d28sIGFuZCBzbyBhZ3JlZSIgKwotICAgICAgICAgICAgICAgICJUaGUgcGxheSBtYXkgcGFzcywgaWYgdGhleSBiZSBzdGlsbCBhbmQgd2lsbGluZywiICsKLSAgICAgICAgICAgICAgICAiSSdsbCB1bmRlcnRha2UgbWF5IHNlZSBhd2F5IHRoZWlyIHNoaWxsaW5nIiArCi0gICAgICAgICAgICAgICAgIlJpY2hseSBpbiB0d28gc2hvcnQgaG91cnMuIE9ubHkgdGhleSIgKwotICAgICAgICAgICAgICAgICJUaGF0IGNvbWUgdG8gaGVhciBhIG1lcnJ5IGJhd2R5IHBsYXksIiArCi0gICAgICAgICAgICAgICAgIkEgbm9pc2Ugb2YgdGFyZ2V0cywgb3IgdG8gc2VlIGEgZmVsbG93IiArCi0gICAgICAgICAgICAgICAgIkluIGEgbG9uZyBtb3RsZXkgY29hdCBndWFyZGVkIHdpdGggeWVsbG93LCIgKwotICAgICAgICAgICAgICAgICJXaWxsIGJlIGRlY2VpdmVkOyBmb3IsIGdlbnRsZSBoZWFyZXJzLCBrbm93LCIgKwotICAgICAgICAgICAgICAgICJUbyByYW5rIG91ciBjaG9zZW4gdHJ1dGggd2l0aCBzdWNoIGEgc2hvdyIgKwotICAgICAgICAgICAgICAgICJBcyBmb29sIGFuZCBmaWdodCBpcywgYmVzaWRlIGZvcmZlaXRpbmciICsKLSAgICAgICAgICAgICAgICAiT3VyIG93biBicmFpbnMsIGFuZCB0aGUgb3BpbmlvbiB0aGF0IHdlIGJyaW5nLCIgKwotICAgICAgICAgICAgICAgICJUbyBtYWtlIHRoYXQgb25seSB0cnVlIHdlIG5vdyBpbnRlbmQsIiArCi0gICAgICAgICAgICAgICAgIldpbGwgbGVhdmUgdXMgbmV2ZXIgYW4gdW5kZXJzdGFuZGluZyBmcmllbmQuIiArCi0gICAgICAgICAgICAgICAgIlRoZXJlZm9yZSwgZm9yIGdvb2RuZXNzJyBzYWtlLCBhbmQgYXMgeW91IGFyZSBrbm93biIgKwotICAgICAgICAgICAgICAgICJUaGUgZmlyc3QgYW5kIGhhcHBpZXN0IGhlYXJlcnMgb2YgdGhlIHRvd24sIiArCi0gICAgICAgICAgICAgICAgIkJlIHNhZCwgYXMgd2Ugd291bGQgbWFrZSB5ZTogdGhpbmsgeWUgc2VlIiArCi0gICAgICAgICAgICAgICAgIlRoZSB2ZXJ5IHBlcnNvbnMgb2Ygb3VyIG5vYmxlIHN0b3J5IiArCi0gICAgICAgICAgICAgICAgIkFzIHRoZXkgd2VyZSBsaXZpbmc7IHRoaW5rIHlvdSBzZWUgdGhlbSBncmVhdCwiICsKLSAgICAgICAgICAgICAgICAiQW5kIGZvbGxvdydkIHdpdGggdGhlIGdlbmVyYWwgdGhyb25nIGFuZCBzd2VhdCIgKwotICAgICAgICAgICAgICAgICJPZiB0aG91c2FuZCBmcmllbmRzOyB0aGVuIGluIGEgbW9tZW50LCBzZWUiICsKLSAgICAgICAgICAgICAgICAiSG93IHNvb24gdGhpcyBtaWdodGluZXNzIG1lZXRzIG1pc2VyeToiICsKLSAgICAgICAgICAgICAgICAiQW5kLCBpZiB5b3UgY2FuIGJlIG1lcnJ5IHRoZW4sIEknbGwgc2F5IiArCi0gICAgICAgICAgICAgICAgIkEgbWFuIG1heSB3ZWVwIHVwb24gaGlzIHdlZGRpbmctZGF5LiIsCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIkZpcnN0LCBoZWF2ZW4gYmUgdGhlIHJlY29yZCB0byBteSBzcGVlY2ghIiArIAotICAgICAgICAgICAgICAgICJJbiB0aGUgZGV2b3Rpb24gb2YgYSBzdWJqZWN0J3MgbG92ZSwiICsgCi0gICAgICAgICAgICAgICAgIlRlbmRlcmluZyB0aGUgcHJlY2lvdXMgc2FmZXR5IG9mIG15IHByaW5jZSwiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBmcmVlIGZyb20gb3RoZXIgbWlzYmVnb3R0ZW4gaGF0ZSwiICsgCi0gICAgICAgICAgICAgICAgIkNvbWUgSSBhcHBlbGxhbnQgdG8gdGhpcyBwcmluY2VseSBwcmVzZW5jZS4iICsgCi0gICAgICAgICAgICAgICAgIk5vdywgVGhvbWFzIE1vd2JyYXksIGRvIEkgdHVybiB0byB0aGVlLCIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIG1hcmsgbXkgZ3JlZXRpbmcgd2VsbDsgZm9yIHdoYXQgSSBzcGVhayIgKyAKLSAgICAgICAgICAgICAgICAiTXkgYm9keSBzaGFsbCBtYWtlIGdvb2QgdXBvbiB0aGlzIGVhcnRoLCIgKyAKLSAgICAgICAgICAgICAgICAiT3IgbXkgZGl2aW5lIHNvdWwgYW5zd2VyIGl0IGluIGhlYXZlbi4iICsgCi0gICAgICAgICAgICAgICAgIlRob3UgYXJ0IGEgdHJhaXRvciBhbmQgYSBtaXNjcmVhbnQsIiArIAotICAgICAgICAgICAgICAgICJUb28gZ29vZCB0byBiZSBzbyBhbmQgdG9vIGJhZCB0byBsaXZlLCIgKyAKLSAgICAgICAgICAgICAgICAiU2luY2UgdGhlIG1vcmUgZmFpciBhbmQgY3J5c3RhbCBpcyB0aGUgc2t5LCIgKyAKLSAgICAgICAgICAgICAgICAiVGhlIHVnbGllciBzZWVtIHRoZSBjbG91ZHMgdGhhdCBpbiBpdCBmbHkuIiArIAotICAgICAgICAgICAgICAgICJPbmNlIG1vcmUsIHRoZSBtb3JlIHRvIGFnZ3JhdmF0ZSB0aGUgbm90ZSwiICsgCi0gICAgICAgICAgICAgICAgIldpdGggYSBmb3VsIHRyYWl0b3IncyBuYW1lIHN0dWZmIEkgdGh5IHRocm9hdDsiICsgCi0gICAgICAgICAgICAgICAgIkFuZCB3aXNoLCBzbyBwbGVhc2UgbXkgc292ZXJlaWduLCBlcmUgSSBtb3ZlLCIgKyAKLSAgICAgICAgICAgICAgICAiV2hhdCBteSB0b25ndWUgc3BlYWtzIG15IHJpZ2h0IGRyYXduIHN3b3JkIG1heSBwcm92ZS4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJOb3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCIgKyAKLSAgICAgICAgICAgICAgICAiTWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgWW9yazsiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBhbGwgdGhlIGNsb3VkcyB0aGF0IGxvdXInZCB1cG9uIG91ciBob3VzZSIgKyAKLSAgICAgICAgICAgICAgICAiSW4gdGhlIGRlZXAgYm9zb20gb2YgdGhlIG9jZWFuIGJ1cmllZC4iICsgCi0gICAgICAgICAgICAgICAgIk5vdyBhcmUgb3VyIGJyb3dzIGJvdW5kIHdpdGggdmljdG9yaW91cyB3cmVhdGhzOyIgKyAKLSAgICAgICAgICAgICAgICAiT3VyIGJydWlzZWQgYXJtcyBodW5nIHVwIGZvciBtb251bWVudHM7IiArIAotICAgICAgICAgICAgICAgICJPdXIgc3Rlcm4gYWxhcnVtcyBjaGFuZ2VkIHRvIG1lcnJ5IG1lZXRpbmdzLCIgKyAKLSAgICAgICAgICAgICAgICAiT3VyIGRyZWFkZnVsIG1hcmNoZXMgdG8gZGVsaWdodGZ1bCBtZWFzdXJlcy4iICsgCi0gICAgICAgICAgICAgICAgIkdyaW0tdmlzYWdlZCB3YXIgaGF0aCBzbW9vdGgnZCBoaXMgd3JpbmtsZWQgZnJvbnQ7IiArIAotICAgICAgICAgICAgICAgICJBbmQgbm93LCBpbnN0ZWFkIG9mIG1vdW50aW5nIGJhcmRlZCBzdGVlZHMiICsgCi0gICAgICAgICAgICAgICAgIlRvIGZyaWdodCB0aGUgc291bHMgb2YgZmVhcmZ1bCBhZHZlcnNhcmllcywiICsgCi0gICAgICAgICAgICAgICAgIkhlIGNhcGVycyBuaW1ibHkgaW4gYSBsYWR5J3MgY2hhbWJlciIgKyAKLSAgICAgICAgICAgICAgICAiVG8gdGhlIGxhc2NpdmlvdXMgcGxlYXNpbmcgb2YgYSBsdXRlLiIgKyAKLSAgICAgICAgICAgICAgICAiQnV0IEksIHRoYXQgYW0gbm90IHNoYXBlZCBmb3Igc3BvcnRpdmUgdHJpY2tzLCIgKyAKLSAgICAgICAgICAgICAgICAiTm9yIG1hZGUgdG8gY291cnQgYW4gYW1vcm91cyBsb29raW5nLWdsYXNzOyIgKyAKLSAgICAgICAgICAgICAgICAiSSwgdGhhdCBhbSBydWRlbHkgc3RhbXAnZCwgYW5kIHdhbnQgbG92ZSdzIG1hamVzdHkiICsgCi0gICAgICAgICAgICAgICAgIlRvIHN0cnV0IGJlZm9yZSBhIHdhbnRvbiBhbWJsaW5nIG55bXBoOyIgKyAKLSAgICAgICAgICAgICAgICAiSSwgdGhhdCBhbSBjdXJ0YWlsJ2Qgb2YgdGhpcyBmYWlyIHByb3BvcnRpb24sIiArIAotICAgICAgICAgICAgICAgICJDaGVhdGVkIG9mIGZlYXR1cmUgYnkgZGlzc2VtYmxpbmcgbmF0dXJlLCIgKyAKLSAgICAgICAgICAgICAgICAiRGVmb3JtZWQsIHVuZmluaXNoJ2QsIHNlbnQgYmVmb3JlIG15IHRpbWUiICsgCi0gICAgICAgICAgICAgICAgIkludG8gdGhpcyBicmVhdGhpbmcgd29ybGQsIHNjYXJjZSBoYWxmIG1hZGUgdXAsIiArIAotICAgICAgICAgICAgICAgICJBbmQgdGhhdCBzbyBsYW1lbHkgYW5kIHVuZmFzaGlvbmFibGUiICsgCi0gICAgICAgICAgICAgICAgIlRoYXQgZG9ncyBiYXJrIGF0IG1lIGFzIEkgaGFsdCBieSB0aGVtOyIgKyAKLSAgICAgICAgICAgICAgICAiV2h5LCBJLCBpbiB0aGlzIHdlYWsgcGlwaW5nIHRpbWUgb2YgcGVhY2UsIiArIAotICAgICAgICAgICAgICAgICJIYXZlIG5vIGRlbGlnaHQgdG8gcGFzcyBhd2F5IHRoZSB0aW1lLCIgKyAKLSAgICAgICAgICAgICAgICAiVW5sZXNzIHRvIHNweSBteSBzaGFkb3cgaW4gdGhlIHN1biIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIGRlc2NhbnQgb24gbWluZSBvd24gZGVmb3JtaXR5OiIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIHRoZXJlZm9yZSwgc2luY2UgSSBjYW5ub3QgcHJvdmUgYSBsb3ZlciwiICsgCi0gICAgICAgICAgICAgICAgIlRvIGVudGVydGFpbiB0aGVzZSBmYWlyIHdlbGwtc3Bva2VuIGRheXMsIiArIAotICAgICAgICAgICAgICAgICJJIGFtIGRldGVybWluZWQgdG8gcHJvdmUgYSB2aWxsYWluIiArIAotICAgICAgICAgICAgICAgICJBbmQgaGF0ZSB0aGUgaWRsZSBwbGVhc3VyZXMgb2YgdGhlc2UgZGF5cy4iICsgCi0gICAgICAgICAgICAgICAgIlBsb3RzIGhhdmUgSSBsYWlkLCBpbmR1Y3Rpb25zIGRhbmdlcm91cywiICsgCi0gICAgICAgICAgICAgICAgIkJ5IGRydW5rZW4gcHJvcGhlY2llcywgbGliZWxzIGFuZCBkcmVhbXMsIiArIAotICAgICAgICAgICAgICAgICJUbyBzZXQgbXkgYnJvdGhlciBDbGFyZW5jZSBhbmQgdGhlIGtpbmciICsgCi0gICAgICAgICAgICAgICAgIkluIGRlYWRseSBoYXRlIHRoZSBvbmUgYWdhaW5zdCB0aGUgb3RoZXI6IiArIAotICAgICAgICAgICAgICAgICJBbmQgaWYgS2luZyBFZHdhcmQgYmUgYXMgdHJ1ZSBhbmQganVzdCIgKyAKLSAgICAgICAgICAgICAgICAiQXMgSSBhbSBzdWJ0bGUsIGZhbHNlIGFuZCB0cmVhY2hlcm91cywiICsgCi0gICAgICAgICAgICAgICAgIlRoaXMgZGF5IHNob3VsZCBDbGFyZW5jZSBjbG9zZWx5IGJlIG1ldydkIHVwLCIgKyAKLSAgICAgICAgICAgICAgICAiQWJvdXQgYSBwcm9waGVjeSwgd2hpY2ggc2F5cyB0aGF0ICdHJyIgKyAKLSAgICAgICAgICAgICAgICAiT2YgRWR3YXJkJ3MgaGVpcnMgdGhlIG11cmRlcmVyIHNoYWxsIGJlLiIgKyAKLSAgICAgICAgICAgICAgICAiRGl2ZSwgdGhvdWdodHMsIGRvd24gdG8gbXkgc291bDogaGVyZSIgKyAKLSAgICAgICAgICAgICAgICAiQ2xhcmVuY2UgY29tZXMuIiwKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiVG8gYmFpdCBmaXNoIHdpdGhhbDogaWYgaXQgd2lsbCBmZWVkIG5vdGhpbmcgZWxzZSwiICsgCi0gICAgICAgICAgICAgICAgIml0IHdpbGwgZmVlZCBteSByZXZlbmdlLiBIZSBoYXRoIGRpc2dyYWNlZCBtZSwgYW5kIiArIAotICAgICAgICAgICAgICAgICJoaW5kZXJlZCBtZSBoYWxmIGEgbWlsbGlvbjsgbGF1Z2hlZCBhdCBteSBsb3NzZXMsIiArIAotICAgICAgICAgICAgICAgICJtb2NrZWQgYXQgbXkgZ2FpbnMsIHNjb3JuZWQgbXkgbmF0aW9uLCB0aHdhcnRlZCBteSIgKyAKLSAgICAgICAgICAgICAgICAiYmFyZ2FpbnMsIGNvb2xlZCBteSBmcmllbmRzLCBoZWF0ZWQgbWluZSIgKyAKLSAgICAgICAgICAgICAgICAiZW5lbWllczsgYW5kIHdoYXQncyBoaXMgcmVhc29uPyBJIGFtIGEgSmV3LiBIYXRoIiArIAotICAgICAgICAgICAgICAgICJub3QgYSBKZXcgZXllcz8gaGF0aCBub3QgYSBKZXcgaGFuZHMsIG9yZ2FucywiICsgCi0gICAgICAgICAgICAgICAgImRpbWVuc2lvbnMsIHNlbnNlcywgYWZmZWN0aW9ucywgcGFzc2lvbnM/IGZlZCB3aXRoIiArIAotICAgICAgICAgICAgICAgICJ0aGUgc2FtZSBmb29kLCBodXJ0IHdpdGggdGhlIHNhbWUgd2VhcG9ucywgc3ViamVjdCIgKyAKLSAgICAgICAgICAgICAgICAidG8gdGhlIHNhbWUgZGlzZWFzZXMsIGhlYWxlZCBieSB0aGUgc2FtZSBtZWFucywiICsgCi0gICAgICAgICAgICAgICAgIndhcm1lZCBhbmQgY29vbGVkIGJ5IHRoZSBzYW1lIHdpbnRlciBhbmQgc3VtbWVyLCBhcyIgKyAKLSAgICAgICAgICAgICAgICAiYSBDaHJpc3RpYW4gaXM/IElmIHlvdSBwcmljayB1cywgZG8gd2Ugbm90IGJsZWVkPyIgKyAKLSAgICAgICAgICAgICAgICAiaWYgeW91IHRpY2tsZSB1cywgZG8gd2Ugbm90IGxhdWdoPyBpZiB5b3UgcG9pc29uIiArIAotICAgICAgICAgICAgICAgICJ1cywgZG8gd2Ugbm90IGRpZT8gYW5kIGlmIHlvdSB3cm9uZyB1cywgc2hhbGwgd2Ugbm90IiArIAotICAgICAgICAgICAgICAgICJyZXZlbmdlPyBJZiB3ZSBhcmUgbGlrZSB5b3UgaW4gdGhlIHJlc3QsIHdlIHdpbGwiICsgCi0gICAgICAgICAgICAgICAgInJlc2VtYmxlIHlvdSBpbiB0aGF0LiBJZiBhIEpldyB3cm9uZyBhIENocmlzdGlhbiwiICsgCi0gICAgICAgICAgICAgICAgIndoYXQgaXMgaGlzIGh1bWlsaXR5PyBSZXZlbmdlLiBJZiBhIENocmlzdGlhbiIgKyAKLSAgICAgICAgICAgICAgICAid3JvbmcgYSBKZXcsIHdoYXQgc2hvdWxkIGhpcyBzdWZmZXJhbmNlIGJlIGJ5IiArIAotICAgICAgICAgICAgICAgICJDaHJpc3RpYW4gZXhhbXBsZT8gV2h5LCByZXZlbmdlLiBUaGUgdmlsbGFueSB5b3UiICsgCi0gICAgICAgICAgICAgICAgInRlYWNoIG1lLCBJIHdpbGwgZXhlY3V0ZSwgYW5kIGl0IHNoYWxsIGdvIGhhcmQgYnV0IEkiICsgCi0gICAgICAgICAgICAgICAgIndpbGwgYmV0dGVyIHRoZSBpbnN0cnVjdGlvbi4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJWaXJ0dWUhIGEgZmlnISAndGlzIGluIG91cnNlbHZlcyB0aGF0IHdlIGFyZSB0aHVzIiArIAotICAgICAgICAgICAgICAgICJvciB0aHVzLiBPdXIgYm9kaWVzIGFyZSBvdXIgZ2FyZGVucywgdG8gdGhlIHdoaWNoIiArIAotICAgICAgICAgICAgICAgICJvdXIgd2lsbHMgYXJlIGdhcmRlbmVyczogc28gdGhhdCBpZiB3ZSB3aWxsIHBsYW50IiArIAotICAgICAgICAgICAgICAgICJuZXR0bGVzLCBvciBzb3cgbGV0dHVjZSwgc2V0IGh5c3NvcCBhbmQgd2VlZCB1cCIgKyAKLSAgICAgICAgICAgICAgICAidGh5bWUsIHN1cHBseSBpdCB3aXRoIG9uZSBnZW5kZXIgb2YgaGVyYnMsIG9yIiArIAotICAgICAgICAgICAgICAgICJkaXN0cmFjdCBpdCB3aXRoIG1hbnksIGVpdGhlciB0byBoYXZlIGl0IHN0ZXJpbGUiICsgCi0gICAgICAgICAgICAgICAgIndpdGggaWRsZW5lc3MsIG9yIG1hbnVyZWQgd2l0aCBpbmR1c3RyeSwgd2h5LCB0aGUiICsgCi0gICAgICAgICAgICAgICAgInBvd2VyIGFuZCBjb3JyaWdpYmxlIGF1dGhvcml0eSBvZiB0aGlzIGxpZXMgaW4gb3VyIiArIAotICAgICAgICAgICAgICAgICJ3aWxscy4gSWYgdGhlIGJhbGFuY2Ugb2Ygb3VyIGxpdmVzIGhhZCBub3Qgb25lIiArIAotICAgICAgICAgICAgICAgICJzY2FsZSBvZiByZWFzb24gdG8gcG9pc2UgYW5vdGhlciBvZiBzZW5zdWFsaXR5LCB0aGUiICsgCi0gICAgICAgICAgICAgICAgImJsb29kIGFuZCBiYXNlbmVzcyBvZiBvdXIgbmF0dXJlcyB3b3VsZCBjb25kdWN0IHVzIiArIAotICAgICAgICAgICAgICAgICJ0byBtb3N0IHByZXBvc3Rlcm91cyBjb25jbHVzaW9uczogYnV0IHdlIGhhdmUiICsgCi0gICAgICAgICAgICAgICAgInJlYXNvbiB0byBjb29sIG91ciByYWdpbmcgbW90aW9ucywgb3VyIGNhcm5hbCIgKyAKLSAgICAgICAgICAgICAgICAic3RpbmdzLCBvdXIgdW5iaXR0ZWQgbHVzdHMsIHdoZXJlb2YgSSB0YWtlIHRoaXMgdGhhdCIgKyAKLSAgICAgICAgICAgICAgICAieW91IGNhbGwgbG92ZSB0byBiZSBhIHNlY3Qgb3Igc2Npb24uIiwKLQotICAgICAgICAgICAgICAgICJCbG93LCB3aW5kcywgYW5kIGNyYWNrIHlvdXIgY2hlZWtzISByYWdlISBibG93ISIgKyAKLSAgICAgICAgICAgICAgICAiWW91IGNhdGFyYWN0cyBhbmQgaHVycmljYW5vZXMsIHNwb3V0IiArIAotICAgICAgICAgICAgICAgICJUaWxsIHlvdSBoYXZlIGRyZW5jaCdkIG91ciBzdGVlcGxlcywgZHJvd24nZCB0aGUgY29ja3MhIiArIAotICAgICAgICAgICAgICAgICJZb3Ugc3VscGh1cm91cyBhbmQgdGhvdWdodC1leGVjdXRpbmcgZmlyZXMsIiArIAotICAgICAgICAgICAgICAgICJWYXVudC1jb3VyaWVycyB0byBvYWstY2xlYXZpbmcgdGh1bmRlcmJvbHRzLCIgKyAKLSAgICAgICAgICAgICAgICAiU2luZ2UgbXkgd2hpdGUgaGVhZCEgQW5kIHRob3UsIGFsbC1zaGFraW5nIHRodW5kZXIsIiArIAotICAgICAgICAgICAgICAgICJTbWl0ZSBmbGF0IHRoZSB0aGljayByb3R1bmRpdHkgbycgdGhlIHdvcmxkISIgKyAKLSAgICAgICAgICAgICAgICAiQ3JhY2sgbmF0dXJlJ3MgbW91bGRzLCBhbiBnZXJtZW5zIHNwaWxsIGF0IG9uY2UsIiArIAotICAgICAgICAgICAgICAgICJUaGF0IG1ha2UgaW5ncmF0ZWZ1bCBtYW4hIgotICAgICAgICB9OwogICAgIH0KICAgICAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q5LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0OS5qYXZhCmluZGV4IGIyYWVhMDUuLmI1MGJkNTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q5LmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDkuamF2YQpAQCAtMTQwLDE3OCArMTQwLDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nW10gbVN0cmluZ3MgPSB7Ci0gICAgICAgICAgICAiQWJiYXllIGRlIEJlbGxvYyIsICJBYmJheWUgZHUgTW9udCBkZXMgQ2F0cyIsICJBYmVydGFtIiwKLSAgICAgICAgICAgICJBYm9uZGFuY2UiLCAiQWNrYXdpIiwgIkFjb3JuIiwgIkFkZWxvc3QiLCAiQWZmaWRlbGljZSBhdSBDaGFibGlzIiwKLSAgICAgICAgICAgICJBZnVlZ2EnbCBQaXR1IiwgIkFpcmFnIiwgIkFpcmVkYWxlIiwgIkFpc3kgQ2VuZHJlIiwKLSAgICAgICAgICAgICJBbGxnYXVlciBFbW1lbnRhbGVyIiwgIkFsdmVyY2EiLCAiQW1iZXJ0IiwgIkFtZXJpY2FuIENoZWVzZSIsCi0gICAgICAgICAgICAiQW1pIGR1IENoYW1iZXJ0aW4iLCAiQW5lam8gRW5jaGlsYWRvIiwgIkFubmVhdSBkdSBWaWMtQmlsaCIsCi0gICAgICAgICAgICAiQW50aG9yaXJvIiwgIkFwcGVuemVsbCIsICJBcmFnb24iLCAiQXJkaSBHYXNuYSIsICJBcmRyYWhhbiIsCi0gICAgICAgICAgICAiQXJtZW5pYW4gU3RyaW5nIiwgIkFyb21lcyBhdSBHZW5lIGRlIE1hcmMiLCAiQXNhZGVybyIsICJBc2lhZ28iLAotICAgICAgICAgICAgIkF1YmlzcXVlIFB5cmVuZWVzIiwgIkF1dHVuIiwgIkF2YXh0c2t5ciIsICJCYWJ5IFN3aXNzIiwgIkJhYnliZWwiLAotICAgICAgICAgICAgIkJhZ3VldHRlIExhb25uYWlzZSIsICJCYWtlcnMiLCAiQmFsYWRpIiwgIkJhbGF0b24iLCAiQmFuZGFsIiwKLSAgICAgICAgICAgICJCYW5vbiIsICJCYXJyeSdzIEJheSBDaGVkZGFyIiwgIkJhc2luZyIsICJCYXNrZXQgQ2hlZXNlIiwKLSAgICAgICAgICAgICJCYXRoIENoZWVzZSIsICJCYXZhcmlhbiBCZXJna2FzZSIsICJCYXlsb3VnaCIsICJCZWF1Zm9ydCIsCi0gICAgICAgICAgICAiQmVhdXZvb3JkZSIsICJCZWVubGVpZ2ggQmx1ZSIsICJCZWVyIENoZWVzZSIsICJCZWwgUGFlc2UiLAotICAgICAgICAgICAgIkJlcmdhZGVyIiwgIkJlcmdlcmUgQmxldWUiLCAiQmVya3N3ZWxsIiwgIkJleWF6IFBleW5pciIsCi0gICAgICAgICAgICAiQmllcmthc2UiLCAiQmlzaG9wIEtlbm5lZHkiLCAiQmxhcm5leSIsICJCbGV1IGQnQXV2ZXJnbmUiLAotICAgICAgICAgICAgIkJsZXUgZGUgR2V4IiwgIkJsZXUgZGUgTGFxdWV1aWxsZSIsICJCbGV1IGRlIFNlcHRtb25jZWwiLAotICAgICAgICAgICAgIkJsZXUgRGVzIENhdXNzZXMiLCAiQmx1ZSIsICJCbHVlIENhc3RlbGxvIiwgIkJsdWUgUmF0aGdvcmUiLAotICAgICAgICAgICAgIkJsdWUgVmVpbiAoQXVzdHJhbGlhbikiLCAiQmx1ZSBWZWluIENoZWVzZXMiLCAiQm9jY29uY2luaSIsCi0gICAgICAgICAgICAiQm9jY29uY2luaSAoQXVzdHJhbGlhbikiLCAiQm9lcmVuIExlaWRlbmthYXMiLCAiQm9uY2hlc3RlciIsCi0gICAgICAgICAgICAiQm9zd29ydGgiLCAiQm91Z29uIiwgIkJvdWxlIER1IFJvdmVzIiwgIkJvdWxldHRlIGQnQXZlc25lcyIsCi0gICAgICAgICAgICAiQm91cnNhdWx0IiwgIkJvdXJzaW4iLCAiQm91eXNzb3UiLCAiQnJhIiwgIkJyYXVkb3N0dXIiLAotICAgICAgICAgICAgIkJyZWFrZmFzdCBDaGVlc2UiLCAiQnJlYmlzIGR1IExhdm9ydCIsICJCcmViaXMgZHUgTG9jaG9pcyIsCi0gICAgICAgICAgICAiQnJlYmlzIGR1IFB1eWZhdWNvbiIsICJCcmVzc2UgQmxldSIsICJCcmljayIsICJCcmllIiwKLSAgICAgICAgICAgICJCcmllIGRlIE1lYXV4IiwgIkJyaWUgZGUgTWVsdW4iLCAiQnJpbGxhdC1TYXZhcmluIiwgIkJyaW4iLAotICAgICAgICAgICAgIkJyaW4gZCcgQW1vdXIiLCAiQnJpbiBkJ0Ftb3VyIiwgIkJyaW56YSAoQnVyZHVmIEJyaW56YSkiLAotICAgICAgICAgICAgIkJyaXF1ZXR0ZSBkZSBCcmViaXMiLCAiQnJpcXVldHRlIGR1IEZvcmV6IiwgIkJyb2NjaW8iLAotICAgICAgICAgICAgIkJyb2NjaW8gRGVtaS1BZmZpbmUiLCAiQnJvdXNzZSBkdSBSb3ZlIiwgIkJydWRlciBCYXNpbCIsCi0gICAgICAgICAgICAiQnJ1c3NlbGFlIEthYXMgKEZyb21hZ2UgZGUgQnJ1eGVsbGVzKSIsICJCcnluZHphIiwKLSAgICAgICAgICAgICJCdWNoZXR0ZSBkJ0Fuam91IiwgIkJ1ZmZhbG8iLCAiQnVyZ29zIiwgIkJ1dHRlIiwgIkJ1dHRlcmthc2UiLAotICAgICAgICAgICAgIkJ1dHRvbiAoSW5uZXMpIiwgIkJ1eHRvbiBCbHVlIiwgIkNhYmVjb3UiLCAiQ2Fib2MiLCAiQ2FicmFsZXMiLAotICAgICAgICAgICAgIkNhY2hhaWxsZSIsICJDYWNpb2NhdmFsbG8iLCAiQ2FjaW90dGEiLCAiQ2FlcnBoaWxseSIsCi0gICAgICAgICAgICAiQ2Fpcm5zbW9yZSIsICJDYWxlbnphbmEiLCAiQ2FtYmF6b2xhIiwgIkNhbWVtYmVydCBkZSBOb3JtYW5kaWUiLAotICAgICAgICAgICAgIkNhbmFkaWFuIENoZWRkYXIiLCAiQ2FuZXN0cmF0byIsICJDYW50YWwiLCAiQ2FwcmljZSBkZXMgRGlldXgiLAotICAgICAgICAgICAgIkNhcHJpY29ybiBHb2F0IiwgIkNhcHJpb2xlIEJhbm9uIiwgIkNhcnJlIGRlIGwnRXN0IiwKLSAgICAgICAgICAgICJDYXNjaW90dGEgZGkgVXJiaW5vIiwgIkNhc2hlbCBCbHVlIiwgIkNhc3RlbGxhbm8iLCAiQ2FzdGVsbGVubyIsCi0gICAgICAgICAgICAiQ2FzdGVsbWFnbm8iLCAiQ2FzdGVsbyBCcmFuY28iLCAiQ2FzdGlnbGlhbm8iLCAiQ2F0aGVsYWluIiwKLSAgICAgICAgICAgICJDZWx0aWMgUHJvbWlzZSIsICJDZW5kcmUgZCdPbGl2ZXQiLCAiQ2VybmV5IiwgIkNoYWJpY2hvdSIsCi0gICAgICAgICAgICAiQ2hhYmljaG91IGR1IFBvaXRvdSIsICJDaGFiaXMgZGUgR2F0aW5lIiwgIkNoYW91cmNlIiwgIkNoYXJvbGFpcyIsCi0gICAgICAgICAgICAiQ2hhdW1lcyIsICJDaGVkZGFyIiwgIkNoZWRkYXIgQ2xvdGhib3VuZCIsICJDaGVzaGlyZSIsICJDaGV2cmVzIiwKLSAgICAgICAgICAgICJDaGV2cm90aW4gZGVzIEFyYXZpcyIsICJDaG9udGFsZW5vIiwgIkNpdnJheSIsCi0gICAgICAgICAgICAiQ29ldXIgZGUgQ2FtZW1iZXJ0IGF1IENhbHZhZG9zIiwgIkNvZXVyIGRlIENoZXZyZSIsICJDb2xieSIsCi0gICAgICAgICAgICAiQ29sZCBQYWNrIiwgIkNvbXRlIiwgIkNvb2xlYSIsICJDb29sZW5leSIsICJDb3F1ZXRkYWxlIiwKLSAgICAgICAgICAgICJDb3JsZWdneSIsICJDb3JuaXNoIFBlcHBlciIsICJDb3RoZXJzdG9uZSIsICJDb3RpamEiLAotICAgICAgICAgICAgIkNvdHRhZ2UgQ2hlZXNlIiwgIkNvdHRhZ2UgQ2hlZXNlIChBdXN0cmFsaWFuKSIsICJDb3VnYXIgR29sZCIsCi0gICAgICAgICAgICAiQ291bG9tbWllcnMiLCAiQ292ZXJkYWxlIiwgIkNyYXlldXggZGUgUm9uY3EiLCAiQ3JlYW0gQ2hlZXNlIiwKLSAgICAgICAgICAgICJDcmVhbSBIYXZhcnRpIiwgIkNyZW1hIEFncmlhIiwgIkNyZW1hIE1leGljYW5hIiwgIkNyZW1lIEZyYWljaGUiLAotICAgICAgICAgICAgIkNyZXNjZW56YSIsICJDcm9naGFuIiwgIkNyb3R0aW4gZGUgQ2hhdmlnbm9sIiwKLSAgICAgICAgICAgICJDcm90dGluIGR1IENoYXZpZ25vbCIsICJDcm93ZGllIiwgIkNyb3dsZXkiLCAiQ3VhamFkYSIsICJDdXJkIiwKLSAgICAgICAgICAgICJDdXJlIE5hbnRhaXMiLCAiQ3Vyd29ydGh5IiwgIkN3bXRhd2UgUGVjb3Jpbm8iLAotICAgICAgICAgICAgIkN5cHJlc3MgR3JvdmUgQ2hldnJlIiwgIkRhbmFibHUgKERhbmlzaCBCbHVlKSIsICJEYW5ibyIsCi0gICAgICAgICAgICAiRGFuaXNoIEZvbnRpbmEiLCAiRGFyYWxhZ2phenNreSIsICJEYXVwaGluIiwgIkRlbGljZSBkZXMgRmlvdXZlcyIsCi0gICAgICAgICAgICAiRGVuaGFueSBEb3JzZXQgRHJ1bSIsICJEZXJieSIsICJEZXNzZXJ0bnlqIEJlbHlqIiwgIkRldm9uIEJsdWUiLAotICAgICAgICAgICAgIkRldm9uIEdhcmxhbmQiLCAiRG9sY2VsYXR0ZSIsICJEb29saW4iLCAiRG9wcGVscmhhbXN0dWZlbCIsCi0gICAgICAgICAgICAiRG9yc2V0IEJsdWUgVmlubmV5IiwgIkRvdWJsZSBHbG91Y2VzdGVyIiwgIkRvdWJsZSBXb3JjZXN0ZXIiLAotICAgICAgICAgICAgIkRyZXV4IGEgbGEgRmV1aWxsZSIsICJEcnkgSmFjayIsICJEdWRkbGVzd2VsbCIsICJEdW5iYXJyYSIsCi0gICAgICAgICAgICAiRHVubG9wIiwgIkR1bnN5cmUgQmx1ZSIsICJEdXJvYmxhbmRvIiwgIkR1cnJ1cyIsCi0gICAgICAgICAgICAiRHV0Y2ggTWltb2xldHRlIChDb21taXNzaWVrYWFzKSIsICJFZGFtIiwgIkVkZWxwaWx6IiwKLSAgICAgICAgICAgICJFbWVudGFsIEdyYW5kIENydSIsICJFbWxldHQiLCAiRW1tZW50YWwiLCAiRXBvaXNzZXMgZGUgQm91cmdvZ25lIiwKLSAgICAgICAgICAgICJFc2JhcmVpY2giLCAiRXNyb20iLCAiRXRvcmtpIiwgIkV2YW5zZGFsZSBGYXJtaG91c2UgQnJpZSIsCi0gICAgICAgICAgICAiRXZvcmEgRGUgTCdBbGVudGVqbyIsICJFeG1vb3IgQmx1ZSIsICJFeHBsb3JhdGV1ciIsICJGZXRhIiwKLSAgICAgICAgICAgICJGZXRhIChBdXN0cmFsaWFuKSIsICJGaWd1ZSIsICJGaWxldHRhIiwgIkZpbi1kZS1TaWVjbGUiLAotICAgICAgICAgICAgIkZpbmxhbmRpYSBTd2lzcyIsICJGaW5uIiwgIkZpb3JlIFNhcmRvIiwgIkZsZXVyIGR1IE1hcXVpcyIsCi0gICAgICAgICAgICAiRmxvciBkZSBHdWlhIiwgIkZsb3dlciBNYXJpZSIsICJGb2xkZWQiLAotICAgICAgICAgICAgIkZvbGRlZCBjaGVlc2Ugd2l0aCBtaW50IiwgIkZvbmRhbnQgZGUgQnJlYmlzIiwgIkZvbnRhaW5lYmxlYXUiLAotICAgICAgICAgICAgIkZvbnRhbCIsICJGb250aW5hIFZhbCBkJ0Fvc3RhIiwgIkZvcm1hZ2dpbyBkaSBjYXByYSIsICJGb3VnZXJ1cyIsCi0gICAgICAgICAgICAiRm91ciBIZXJiIEdvdWRhIiwgIkZvdXJtZSBkJyBBbWJlcnQiLCAiRm91cm1lIGRlIEhhdXRlIExvaXJlIiwKLSAgICAgICAgICAgICJGb3VybWUgZGUgTW9udGJyaXNvbiIsICJGcmVzaCBKYWNrIiwgIkZyZXNoIE1venphcmVsbGEiLAotICAgICAgICAgICAgIkZyZXNoIFJpY290dGEiLCAiRnJlc2ggVHJ1ZmZsZXMiLCAiRnJpYm91cmdlb2lzIiwgIkZyaWVzZWthYXMiLAotICAgICAgICAgICAgIkZyaWVzaWFuIiwgIkZyaWVzbGEiLCAiRnJpbmF1bHQiLCAiRnJvbWFnZSBhIFJhY2xldHRlIiwKLSAgICAgICAgICAgICJGcm9tYWdlIENvcnNlIiwgIkZyb21hZ2UgZGUgTW9udGFnbmUgZGUgU2F2b2llIiwgIkZyb21hZ2UgRnJhaXMiLAotICAgICAgICAgICAgIkZydWl0IENyZWFtIENoZWVzZSIsICJGcnlpbmcgQ2hlZXNlIiwgIkZ5bmJvIiwgIkdhYnJpZWwiLAotICAgICAgICAgICAgIkdhbGV0dGUgZHUgUGFsdWRpZXIiLCAiR2FsZXR0ZSBMeW9ubmFpc2UiLAotICAgICAgICAgICAgIkdhbGxvd2F5IEdvYXQncyBNaWxrIEdlbXMiLCAiR2FtbWVsb3N0IiwgIkdhcGVyb24gYSBsJ0FpbCIsCi0gICAgICAgICAgICAiR2Fycm90eGEiLCAiR2FzdGFuYmVycmEiLCAiR2VpdG9zdCIsICJHaXBwc2xhbmQgQmx1ZSIsICJHamV0b3N0IiwKLSAgICAgICAgICAgICJHbG91Y2VzdGVyIiwgIkdvbGRlbiBDcm9zcyIsICJHb3Jnb256b2xhIiwgIkdvcm55YWx0YWpza2kiLAotICAgICAgICAgICAgIkdvc3BlbCBHcmVlbiIsICJHb3VkYSIsICJHb3V0dSIsICJHb3dyaWUiLCAiR3JhYmV0dG8iLCAiR3JhZGRvc3QiLAotICAgICAgICAgICAgIkdyYWZ0b24gVmlsbGFnZSBDaGVkZGFyIiwgIkdyYW5hIiwgIkdyYW5hIFBhZGFubyIsICJHcmFuZCBWYXRlbCIsCi0gICAgICAgICAgICAiR3JhdGFyb24gZCcgQXJlY2hlcyIsICJHcmF0dGUtUGFpbGxlIiwgIkdyYXZpZXJhIiwgIkdyZXVpbGgiLAotICAgICAgICAgICAgIkdyZXZlIiwgIkdyaXMgZGUgTGlsbGUiLCAiR3J1eWVyZSIsICJHdWJiZWVuIiwgIkd1ZXJiaWdueSIsCi0gICAgICAgICAgICAiSGFsbG91bWkiLCAiSGFsbG91bXkgKEF1c3RyYWxpYW4pIiwgIkhhbG91bWktU3R5bGUgQ2hlZXNlIiwKLSAgICAgICAgICAgICJIYXJib3VybmUgQmx1ZSIsICJIYXZhcnRpIiwgIkhlaWRpIEdydXllcmUiLCAiSGVyZWZvcmQgSG9wIiwKLSAgICAgICAgICAgICJIZXJyZ2FyZHNvc3QiLCAiSGVycmlvdCBGYXJtaG91c2UiLCAiSGVydmUiLCAiSGlwaSBJdGkiLAotICAgICAgICAgICAgIkh1YmJhcmRzdG9uIEJsdWUgQ293IiwgIkh1c2hhbGxzb3N0IiwgIkliZXJpY28iLCAiSWRhaG8gR29hdHN0ZXIiLAotICAgICAgICAgICAgIklkaWF6YWJhbCIsICJJbCBCb3NjaGV0dG8gYWwgVGFydHVmbyIsICJJbGUgZCdZZXUiLAotICAgICAgICAgICAgIklzbGUgb2YgTXVsbCIsICJKYXJsc2JlcmciLCAiSmVybWkgVG9ydGVzIiwgIkppYm5laCBBcmFiaWVoIiwKLSAgICAgICAgICAgICJKaW5kaSBCcmllIiwgIkp1YmlsZWUgQmx1ZSIsICJKdXVzdG9sZWlwYSIsICJLYWRjaGdhbGwiLCAiS2FzZXJpIiwKLSAgICAgICAgICAgICJLYXNodGEiLCAiS2VmYWxvdHlyaSIsICJLZW5hZmEiLCAiS2VybmhlbSIsICJLZXJ2ZWxsYSBBZmZpbmUiLAotICAgICAgICAgICAgIktpa29yYW5naSIsICJLaW5nIElzbGFuZCBDYXBlIFdpY2toYW0gQnJpZSIsICJLaW5nIFJpdmVyIEdvbGQiLAotICAgICAgICAgICAgIktsb3N0ZXJrYWVzZSIsICJLbm9ja2FsYXJhIiwgIkt1Z2Vsa2FzZSIsICJMJ0F2ZXlyb25uYWlzIiwKLSAgICAgICAgICAgICJMJ0VjaXIgZGUgbCdBdWJyYWMiLCAiTGEgVGF1cGluaWVyZSIsICJMYSBWYWNoZSBRdWkgUml0IiwKLSAgICAgICAgICAgICJMYWd1aW9sZSIsICJMYWlyb2JlbGwiLCAiTGFqdGEiLCAiTGFuYXJrIEJsdWUiLCAiTGFuY2FzaGlyZSIsCi0gICAgICAgICAgICAiTGFuZ3JlcyIsICJMYXBwaSIsICJMYXJ1bnMiLCAiTGF2aXN0b3duIiwgIkxlIEJyaW4iLAotICAgICAgICAgICAgIkxlIEZpdW0gT3JibyIsICJMZSBMYWNhbmRvdSIsICJMZSBSb3VsZSIsICJMZWFmaWVsZCIsICJMZWJiZW5lIiwKLSAgICAgICAgICAgICJMZWVyZGFtbWVyIiwgIkxlaWNlc3RlciIsICJMZXlkZW4iLCAiTGltYnVyZ2VyIiwKLSAgICAgICAgICAgICJMaW5jb2xuc2hpcmUgUG9hY2hlciIsICJMaW5nb3QgU2FpbnQgQm91c3F1ZXQgZCdPcmIiLCAiTGlwdGF1ZXIiLAotICAgICAgICAgICAgIkxpdHRsZSBSeWRpbmdzIiwgIkxpdmFyb3QiLCAiTGxhbmJvaWR5IiwgIkxsYW5nbG9mYW4gRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJMb2NoIEFydGh1ciBGYXJtaG91c2UiLCAiTG9kZGlzd2VsbCBBdm9uZGFsZSIsICJMb25naG9ybiIsCi0gICAgICAgICAgICAiTG91IFBhbG91IiwgIkxvdSBQZXZyZSIsICJMeW9ubmFpcyIsICJNYWFzZGFtIiwgIk1hY2NvbmFpcyIsCi0gICAgICAgICAgICAiTWFob2UgQWdlZCBHb3VkYSIsICJNYWhvbiIsICJNYWx2ZXJuIiwgIk1hbWlyb2xsZSIsICJNYW5jaGVnbyIsCi0gICAgICAgICAgICAiTWFub3VyaSIsICJNYW51ciIsICJNYXJibGUgQ2hlZGRhciIsICJNYXJibGVkIENoZWVzZXMiLAotICAgICAgICAgICAgIk1hcmVkc291cyIsICJNYXJnb3RpbiIsICJNYXJpYm8iLCAiTWFyb2lsbGVzIiwgIk1hc2NhcmVzIiwKLSAgICAgICAgICAgICJNYXNjYXJwb25lIiwgIk1hc2NhcnBvbmUgKEF1c3RyYWxpYW4pIiwgIk1hc2NhcnBvbmUgVG9ydGEiLAotICAgICAgICAgICAgIk1hdG9jcSIsICJNYXl0YWcgQmx1ZSIsICJNZWlyYSIsICJNZW5hbGxhY2sgRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJNZW5vbml0YSIsICJNZXJlZGl0aCBCbHVlIiwgIk1lc29zdCIsICJNZXR0b24gKENhbmNvaWxsb3R0ZSkiLAotICAgICAgICAgICAgIk1leWVyIFZpbnRhZ2UgR291ZGEiLCAiTWloYWxpYyBQZXluaXIiLCAiTWlsbGVlbnMiLCAiTWltb2xldHRlIiwKLSAgICAgICAgICAgICJNaW5lLUdhYmhhciIsICJNaW5pIEJhYnkgQmVsbHMiLCAiTWl4dGUiLCAiTW9sYm8iLAotICAgICAgICAgICAgIk1vbmFzdGVyeSBDaGVlc2VzIiwgIk1vbmRzZWVyIiwgIk1vbnQgRCdvciBMeW9ubmFpcyIsICJNb250YXNpbyIsCi0gICAgICAgICAgICAiTW9udGVyZXkgSmFjayIsICJNb250ZXJleSBKYWNrIERyeSIsICJNb3JiaWVyIiwKLSAgICAgICAgICAgICJNb3JiaWVyIENydSBkZSBNb250YWduZSIsICJNb3RoYWlzIGEgbGEgRmV1aWxsZSIsICJNb3p6YXJlbGxhIiwKLSAgICAgICAgICAgICJNb3p6YXJlbGxhIChBdXN0cmFsaWFuKSIsICJNb3p6YXJlbGxhIGRpIEJ1ZmFsYSIsCi0gICAgICAgICAgICAiTW96emFyZWxsYSBGcmVzaCwgaW4gd2F0ZXIiLCAiTW96emFyZWxsYSBSb2xscyIsICJNdW5zdGVyIiwKLSAgICAgICAgICAgICJNdXJvbCIsICJNeWNlbGxhIiwgIk15eml0aHJhIiwgIk5hYm91bHNpIiwgIk5hbnRhaXMiLAotICAgICAgICAgICAgIk5ldWZjaGF0ZWwiLCAiTmV1ZmNoYXRlbCAoQXVzdHJhbGlhbikiLCAiTmlvbG8iLCAiTm9ra2Vsb3N0IiwKLSAgICAgICAgICAgICJOb3J0aHVtYmVybGFuZCIsICJPYXhhY2EiLCAiT2xkZSBZb3JrIiwgIk9saXZldCBhdSBGb2luIiwKLSAgICAgICAgICAgICJPbGl2ZXQgQmxldSIsICJPbGl2ZXQgQ2VuZHJlIiwgIk9ya25leSBFeHRyYSBNYXR1cmUgQ2hlZGRhciIsCi0gICAgICAgICAgICAiT3JsYSIsICJPc2NodGplcGthIiwgIk9zc2F1IEZlcm1pZXIiLCAiT3NzYXUtSXJhdHkiLCAiT3N6Y3p5cGVrIiwKLSAgICAgICAgICAgICJPeGZvcmQgQmx1ZSIsICJQJ3RpdCBCZXJyaWNob24iLCAiUGFsZXQgZGUgQmFibGlnbnkiLCAiUGFuZWVyIiwKLSAgICAgICAgICAgICJQYW5lbGEiLCAiUGFubmVyb25lIiwgIlBhbnQgeXMgR2F3biIsICJQYXJtZXNhbiAoUGFybWlnaWFubykiLAotICAgICAgICAgICAgIlBhcm1pZ2lhbm8gUmVnZ2lhbm8iLCAiUGFzIGRlIGwnRXNjYWxldHRlIiwgIlBhc3NlbmRhbGUiLAotICAgICAgICAgICAgIlBhc3RldXJpemVkIFByb2Nlc3NlZCIsICJQYXRlIGRlIEZyb21hZ2UiLCAiUGF0ZWZpbmUgRm9ydCIsCi0gICAgICAgICAgICAiUGF2ZSBkJ0FmZmlub2lzIiwgIlBhdmUgZCdBdWdlIiwgIlBhdmUgZGUgQ2hpcmFjIiwKLSAgICAgICAgICAgICJQYXZlIGR1IEJlcnJ5IiwgIlBlY29yaW5vIiwgIlBlY29yaW5vIGluIFdhbG51dCBMZWF2ZXMiLAotICAgICAgICAgICAgIlBlY29yaW5vIFJvbWFubyIsICJQZWVrc2tpbGwgUHlyYW1pZCIsICJQZWxhcmRvbiBkZXMgQ2V2ZW5uZXMiLAotICAgICAgICAgICAgIlBlbGFyZG9uIGRlcyBDb3JiaWVyZXMiLCAiUGVuYW1lbGxlcmEiLCAiUGVuYnJ5biIsICJQZW5jYXJyZWciLAotICAgICAgICAgICAgIlBlcmFpbCBkZSBCcmViaXMiLCAiUGV0aXQgTW9yaW4iLCAiUGV0aXQgUGFyZG91IiwgIlBldGl0LVN1aXNzZSIsCi0gICAgICAgICAgICAiUGljb2RvbiBkZSBDaGV2cmUiLCAiUGljb3MgZGUgRXVyb3BhIiwgIlBpb3JhIiwKLSAgICAgICAgICAgICJQaXRodHZpZXJzIGF1IEZvaW4iLCAiUGxhdGVhdSBkZSBIZXJ2ZSIsICJQbHltb3V0aCBDaGVlc2UiLAotICAgICAgICAgICAgIlBvZGhhbGFuc2tpIiwgIlBvaXZyZSBkJ0FuZSIsICJQb2xrb2xiaW4iLCAiUG9udCBsJ0V2ZXF1ZSIsCi0gICAgICAgICAgICAiUG9ydCBOaWNob2xzb24iLCAiUG9ydC1TYWx1dCIsICJQb3N0ZWwiLCAiUG91bGlnbnktU2FpbnQtUGllcnJlIiwKLSAgICAgICAgICAgICJQb3VybHkiLCAiUHJhc3Rvc3QiLCAiUHJlc3NhdG8iLCAiUHJpbmNlLUplYW4iLAotICAgICAgICAgICAgIlByb2Nlc3NlZCBDaGVkZGFyIiwgIlByb3ZvbG9uZSIsICJQcm92b2xvbmUgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJQeWVuZ2FuYSBDaGVkZGFyIiwgIlB5cmFtaWRlIiwgIlF1YXJrIiwgIlF1YXJrIChBdXN0cmFsaWFuKSIsCi0gICAgICAgICAgICAiUXVhcnRpcm9sbyBMb21iYXJkbyIsICJRdWF0cmUtVmVudHMiLCAiUXVlcmN5IFBldGl0IiwKLSAgICAgICAgICAgICJRdWVzbyBCbGFuY28iLCAiUXVlc28gQmxhbmNvIGNvbiBGcnV0YXMgLS1QaW5hIHkgTWFuZ28iLAotICAgICAgICAgICAgIlF1ZXNvIGRlIE11cmNpYSIsICJRdWVzbyBkZWwgTW9udHNlYyIsICJRdWVzbyBkZWwgVGlldGFyIiwKLSAgICAgICAgICAgICJRdWVzbyBGcmVzY28iLCAiUXVlc28gRnJlc2NvIChBZG9iZXJhKSIsICJRdWVzbyBJYmVyaWNvIiwKLSAgICAgICAgICAgICJRdWVzbyBKYWxhcGVubyIsICJRdWVzbyBNYWpvcmVybyIsICJRdWVzbyBNZWRpYSBMdW5hIiwKLSAgICAgICAgICAgICJRdWVzbyBQYXJhIEZyaWVyIiwgIlF1ZXNvIFF1ZXNhZGlsbGEiLCAiUmFiYWNhbCIsICJSYWNsZXR0ZSIsCi0gICAgICAgICAgICAiUmFndXNhbm8iLCAiUmFzY2hlcmEiLCAiUmVibG9jaG9uIiwgIlJlZCBMZWljZXN0ZXIiLAotICAgICAgICAgICAgIlJlZ2FsIGRlIGxhIERvbWJlcyIsICJSZWdnaWFuaXRvIiwgIlJlbWVkb3UiLCAiUmVxdWVzb24iLAotICAgICAgICAgICAgIlJpY2hlbGlldSIsICJSaWNvdHRhIiwgIlJpY290dGEgKEF1c3RyYWxpYW4pIiwgIlJpY290dGEgU2FsYXRhIiwKLSAgICAgICAgICAgICJSaWRkZXIiLCAiUmlnb3R0ZSIsICJSb2NhbWFkb3VyIiwgIlJvbGxvdCIsICJSb21hbm8iLAotICAgICAgICAgICAgIlJvbWFucyBQYXJ0IERpZXUiLCAiUm9uY2FsIiwgIlJvcXVlZm9ydCIsICJSb3VsZSIsCi0gICAgICAgICAgICAiUm91bGVhdSBEZSBCZWF1bGlldSIsICJSb3lhbHAgVGlsc2l0IiwgIlJ1YmVucyIsICJSdXN0aW51IiwKLSAgICAgICAgICAgICJTYWFsYW5kIFBmYXJyIiwgIlNhYW5lbmthZXNlIiwgIlNhZ2EiLCAiU2FnZSBEZXJieSIsCi0gICAgICAgICAgICAiU2FpbnRlIE1hdXJlIiwgIlNhaW50LU1hcmNlbGxpbiIsICJTYWludC1OZWN0YWlyZSIsCi0gICAgICAgICAgICAiU2FpbnQtUGF1bGluIiwgIlNhbGVycyIsICJTYW1zbyIsICJTYW4gU2ltb24iLCAiU2FuY2VycmUiLAotICAgICAgICAgICAgIlNhcCBTYWdvIiwgIlNhcmRvIiwgIlNhcmRvIEVneXB0aWFuIiwgIlNicmlueiIsICJTY2Ftb3J6YSIsCi0gICAgICAgICAgICAiU2NoYWJ6aWVnZXIiLCAiU2NobG9zcyIsICJTZWxsZXMgc3VyIENoZXIiLCAiU2VsdmEiLCAiU2VyYXQiLAotICAgICAgICAgICAgIlNlcmlvdXNseSBTdHJvbmcgQ2hlZGRhciIsICJTZXJyYSBkYSBFc3RyZWxhIiwgIlNoYXJwYW0iLAotICAgICAgICAgICAgIlNoZWxidXJuZSBDaGVkZGFyIiwgIlNocm9wc2hpcmUgQmx1ZSIsICJTaXJheiIsICJTaXJlbmUiLAotICAgICAgICAgICAgIlNtb2tlZCBHb3VkYSIsICJTb21lcnNldCBCcmllIiwgIlNvbm9tYSBKYWNrIiwKLSAgICAgICAgICAgICJTb3R0b2NlbmFyZSBhbCBUYXJ0dWZvIiwgIlNvdW1haW50cmFpbiIsICJTb3VyaXJlIExvemVyaWVuIiwKLSAgICAgICAgICAgICJTcGVud29vZCIsICJTcmFmZm9yZHNoaXJlIE9yZ2FuaWMiLCAiU3QuIEFndXIgQmx1ZSBDaGVlc2UiLAotICAgICAgICAgICAgIlN0aWx0b24iLCAiU3RpbmtpbmcgQmlzaG9wIiwgIlN0cmluZyIsICJTdXNzZXggU2xpcGNvdGUiLAotICAgICAgICAgICAgIlN2ZWNpYW9zdCIsICJTd2FsZWRhbGUiLCAiU3dlZXQgU3R5bGUgU3dpc3MiLCAiU3dpc3MiLAotICAgICAgICAgICAgIlN5cmlhbiAoQXJtZW5pYW4gU3RyaW5nKSIsICJUYWxhIiwgIlRhbGVnZ2lvIiwgIlRhbWllIiwKLSAgICAgICAgICAgICJUYXNtYW5pYSBIaWdobGFuZCBDaGV2cmUgTG9nIiwgIlRhdXBpbmllcmUiLCAiVGVpZmkiLCAiVGVsZW1lYSIsCi0gICAgICAgICAgICAiVGVzdG91cmkiLCAiVGV0ZSBkZSBNb2luZSIsICJUZXRpbGxhIiwgIlRleGFzIEdvYXQgQ2hlZXNlIiwKLSAgICAgICAgICAgICJUaWJldCIsICJUaWxsYW1vb2sgQ2hlZGRhciIsICJUaWxzaXQiLCAiVGltYm9vbiBCcmllIiwgIlRvbWEiLAotICAgICAgICAgICAgIlRvbW1lIEJydWxlZSIsICJUb21tZSBkJ0Fib25kYW5jZSIsICJUb21tZSBkZSBDaGV2cmUiLAotICAgICAgICAgICAgIlRvbW1lIGRlIFJvbWFucyIsICJUb21tZSBkZSBTYXZvaWUiLCAiVG9tbWUgZGVzIENob3VhbnMiLAotICAgICAgICAgICAgIlRvbW1lcyIsICJUb3J0YSBkZWwgQ2FzYXIiLCAiVG9zY2FuZWxsbyIsICJUb3VyZWUgZGUgTCdBdWJpZXIiLAotICAgICAgICAgICAgIlRvdXJtYWxldCIsICJUcmFwcGUgKFZlcml0YWJsZSkiLCAiVHJvaXMgQ29ybmVzIERlIFZlbmRlZSIsCi0gICAgICAgICAgICAiVHJvbmNob24iLCAiVHJvdSBkdSBDcnUiLCAiVHJ1ZmZlIiwgIlR1cGkiLCAiVHVydW5tYWEiLAotICAgICAgICAgICAgIlR5bXNib3JvIiwgIlR5biBHcnVnIiwgIlR5bmluZyIsICJVYnJpYWNvIiwgIlVsbG9hIiwKLSAgICAgICAgICAgICJWYWNoZXJpbi1Gcmlib3VyZ2VvaXMiLCAiVmFsZW5jYXkiLCAiVmFzdGVyYm90dGVub3N0IiwgIlZlbmFjbyIsCi0gICAgICAgICAgICAiVmVuZG9tb2lzIiwgIlZpZXV4IENvcnNlIiwgIlZpZ25vdHRlIiwgIlZ1bHNjb21iZSIsCi0gICAgICAgICAgICAiV2FpbWF0YSBGYXJtaG91c2UgQmx1ZSIsICJXYXNoZWQgUmluZCBDaGVlc2UgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJXYXRlcmxvbyIsICJXZWljaGthZXNlIiwgIldlbGxpbmd0b24iLCAiV2Vuc2xleWRhbGUiLAotICAgICAgICAgICAgIldoaXRlIFN0aWx0b24iLCAiV2hpdGVzdG9uZSBGYXJtaG91c2UiLCAiV2lnbW9yZSIsCi0gICAgICAgICAgICAiV29vZHNpZGUgQ2FiZWNvdSIsICJYYW5hZHUiLCAiWHlub3R5cm8iLCAiWWFyZyBDb3JuaXNoIiwKLSAgICAgICAgICAgICJZYXJyYSBWYWxsZXkgUHlyYW1pZCIsICJZb3Jrc2hpcmUgQmx1ZSIsICJaYW1vcmFubyIsCi0gICAgICAgICAgICAiWmFuZXR0aSBHcmFuYSBQYWRhbm8iLCAiWmFuZXR0aSBQYXJtaWdpYW5vIFJlZ2dpYW5vIn07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtU3RyaW5ncyA9IENoZWVzZXMuc0NoZWVzZVN0cmluZ3M7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Qb3B1cE1lbnUxLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Qb3B1cE1lbnUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZThlNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1BvcHVwTWVudTEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBQb3B1cE1lbnUgY2xhc3MuIENsaWNraW5nIHRoZSBidXR0b24gd2lsbCBpbmZsYXRlIGFuZAorICogc2hvdyBhIHBvcHVwIG1lbnUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUxIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucG9wdXBfbWVudV8xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblBvcHVwQnV0dG9uQ2xpY2soVmlldyBidXR0b24pIHsKKyAgICAgICAgUG9wdXBNZW51IHBvcHVwID0gbmV3IFBvcHVwTWVudSh0aGlzLCBidXR0b24pOworICAgICAgICBwb3B1cC5nZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5wb3B1cCwgcG9wdXAuZ2V0TWVudSgpKTsKKworICAgICAgICBwb3B1cC5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihuZXcgUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChQb3B1cE1lbnUxLnRoaXMsICJDbGlja2VkIHBvcHVwIG1lbnUgaXRlbSAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Sb3RhdGluZ0J1dHRvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvUm90YXRpbmdCdXR0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3NjNjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvUm90YXRpbmdCdXR0b24uamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5IHRvIHRyYW5zZm9ybSB2aWV3cyBpbiAyRCBhbmQgM0QsIHNjYWxpbmcgdGhlbSwKKyAqIHRyYW5zbGF0aW5nIHRoZW0sIGFuZCByb3RhdGluZyB0aGVtIChpbiAyRCBhbmQgM0QpLiBVc2UgdGhlIHNlZWsgYmFycyB0byBzZXQgdGhlIHZhcmlvdXMKKyAqIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIG9mIHRoZSBidXR0b24uCisgKi8KK3B1YmxpYyBjbGFzcyBSb3RhdGluZ0J1dHRvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJvdGF0aW5nX3ZpZXcpOworICAgICAgICBmaW5hbCBCdXR0b24gcm90YXRpbmdCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5yb3RhdGluZ0J1dHRvbik7CisgICAgICAgIFNlZWtCYXIgc2Vla0JhcjsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC50cmFuc2xhdGlvblgpOworICAgICAgICBzZWVrQmFyLnNldE1heCg0MDApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgcm90YXRpbmdCdXR0b24uc2V0VHJhbnNsYXRpb25YKChmbG9hdClwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnRyYW5zbGF0aW9uWSk7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDgwMCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFRyYW5zbGF0aW9uWSgoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5zY2FsZVgpOworICAgICAgICBzZWVrQmFyLnNldE1heCg1MCk7CisgICAgICAgIHNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICByb3RhdGluZ0J1dHRvbi5zZXRTY2FsZVgoKGZsb2F0KXByb2dyZXNzLzEwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnNjYWxlWSk7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDUwKTsKKyAgICAgICAgc2Vla0Jhci5zZXRQcm9ncmVzcygxMCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFNjYWxlWSgoZmxvYXQpcHJvZ3Jlc3MvMTBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHNlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucm90YXRpb25YKTsKKyAgICAgICAgc2Vla0Jhci5zZXRNYXgoMzYwKTsKKyAgICAgICAgc2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBzZWVraW5nIG9uIGFwcCBjcmVhdGlvbgorICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFJvdGF0aW9uWCgoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5yb3RhdGlvblkpOworICAgICAgICBzZWVrQmFyLnNldE1heCgzNjApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHNlZWtpbmcgb24gYXBwIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgcm90YXRpbmdCdXR0b24uc2V0Um90YXRpb25ZKChmbG9hdClwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnJvdGF0aW9uWik7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDM2MCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgc2Vla2luZyBvbiBhcHAgY3JlYXRpb24KKyAgICAgICAgICAgICAgICByb3RhdGluZ0J1dHRvbi5zZXRSb3RhdGlvbigoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvU2VhcmNoVmlld0FjdGlvbkJhci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvU2VhcmNoVmlld0FjdGlvbkJhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWQ4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9TZWFyY2hWaWV3QWN0aW9uQmFyLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaGFibGVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2FnZSBvZiBTZWFyY2hWaWV3IGluIGFuIEFjdGlvbkJhciBhcyBhIG1lbnUgaXRlbS4KKyAqIEl0IHNldHMgYSBTZWFyY2hhYmxlSW5mbyBvbiB0aGUgU2VhcmNoVmlldyBmb3Igc3VnZ2VzdGlvbnMgYW5kIHN1Ym1pdHRpbmcgcXVlcmllcyB0by4KKyAqLworcHVibGljIGNsYXNzIFNlYXJjaFZpZXdBY3Rpb25CYXIgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFNlYXJjaFZpZXcuT25RdWVyeUNoYW5nZUxpc3RlbmVyLAorICAgICAgICBTZWFyY2hWaWV3Lk9uQ2xvc2VMaXN0ZW5lciwgQnV0dG9uLk9uQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIFNlYXJjaFZpZXcgbVNlYXJjaFZpZXc7CisgICAgcHJpdmF0ZSBCdXR0b24gbU9wZW5CdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbUNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c1ZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnNlYXJjaHZpZXdfYWN0aW9uYmFyKTsKKworICAgICAgICBtU3RhdHVzVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX3RleHQpOworICAgICAgICBtT3BlbkJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm9wZW5fYnV0dG9uKTsKKyAgICAgICAgbUNsb3NlQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuY2xvc2VfYnV0dG9uKTsKKyAgICAgICAgbU9wZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51LnNlYXJjaHZpZXdfaW5fbWVudSwgbWVudSk7CisgICAgICAgIG1TZWFyY2hWaWV3ID0gKFNlYXJjaFZpZXcpIG1lbnUuZmluZEl0ZW0oUi5pZC5hY3Rpb25fc2VhcmNoKS5nZXRBY3Rpb25WaWV3KCk7CisgICAgICAgIHNldHVwU2VhcmNoVmlldygpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFNlYXJjaFZpZXcoKSB7CisKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0SWNvbmlmaWVkQnlEZWZhdWx0KHRydWUpOworCisgICAgICAgIFNlYXJjaE1hbmFnZXIgc2VhcmNoTWFuYWdlciA9IChTZWFyY2hNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VBUkNIX1NFUlZJQ0UpOworICAgICAgICBpZiAoc2VhcmNoTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0PFNlYXJjaGFibGVJbmZvPiBzZWFyY2hhYmxlcyA9IHNlYXJjaE1hbmFnZXIuZ2V0U2VhcmNoYWJsZXNJbkdsb2JhbFNlYXJjaCgpOworCisgICAgICAgICAgICAvLyBUcnkgdG8gdXNlIHRoZSAiYXBwbGljYXRpb25zIiBnbG9iYWwgc2VhcmNoIHByb3ZpZGVyCisgICAgICAgICAgICBTZWFyY2hhYmxlSW5mbyBpbmZvID0gc2VhcmNoTWFuYWdlci5nZXRTZWFyY2hhYmxlSW5mbyhnZXRDb21wb25lbnROYW1lKCkpOworICAgICAgICAgICAgZm9yIChTZWFyY2hhYmxlSW5mbyBpbmYgOiBzZWFyY2hhYmxlcykgeworICAgICAgICAgICAgICAgIGlmIChpbmYuZ2V0U3VnZ2VzdEF1dGhvcml0eSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZi5nZXRTdWdnZXN0QXV0aG9yaXR5KCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb25zIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGluZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VhcmNoVmlldy5zZXRTZWFyY2hhYmxlSW5mbyhpbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TZWFyY2hWaWV3LnNldE9uUXVlcnlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0T25DbG9zZUxpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uUXVlcnlUZXh0Q2hhbmdlZChTdHJpbmcgbmV3VGV4dCkgeworICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KCJRdWVyeSA9ICIgKyBuZXdUZXh0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uU3VibWl0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgIG1TdGF0dXNWaWV3LnNldFRleHQoIlF1ZXJ5ID0gIiArIHF1ZXJ5ICsgIiA6IHN1Ym1pdHRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25DbG9zZSgpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VGV4dCgiQ2xvc2VkISIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKHZpZXcgPT0gbUNsb3NlQnV0dG9uKSB7CisgICAgICAgICAgICBtU2VhcmNoVmlldy5zZXRJY29uaWZpZWQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmlldyA9PSBtT3BlbkJ1dHRvbikgeworICAgICAgICAgICAgbVNlYXJjaFZpZXcuc2V0SWNvbmlmaWVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1NlYXJjaFZpZXdGaWx0ZXJNb2RlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9TZWFyY2hWaWV3RmlsdGVyTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODk4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9TZWFyY2hWaWV3RmlsdGVyTW9kZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXc7CisKKworLyoqCisgKiBTaG93cyBhIGxpc3QgdGhhdCBjYW4gYmUgZmlsdGVyZWQgaW4tcGxhY2Ugd2l0aCBhIFNlYXJjaFZpZXcgaW4gbm9uLWljb25pZmllZCBtb2RlLgorICovCitwdWJsaWMgY2xhc3MgU2VhcmNoVmlld0ZpbHRlck1vZGUgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFNlYXJjaFZpZXcuT25RdWVyeUNoYW5nZUxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2VhcmNoVmlld0ZpbHRlck1vZGUiOworCisgICAgcHJpdmF0ZSBTZWFyY2hWaWV3IG1TZWFyY2hWaWV3OworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworICAgIHByaXZhdGUgQXJyYXlBZGFwdGVyPFN0cmluZz4gbUFkYXB0ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1TdHJpbmdzID0gQ2hlZXNlcy5zQ2hlZXNlU3RyaW5nczsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUik7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc2VhcmNodmlld19maWx0ZXIpOworCisgICAgICAgIG1TZWFyY2hWaWV3ID0gKFNlYXJjaFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF92aWV3KTsKKyAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0X3ZpZXcpOworICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlciA9IG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIG1TdHJpbmdzKSk7CisgICAgICAgIG1MaXN0Vmlldy5zZXRUZXh0RmlsdGVyRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgc2V0dXBTZWFyY2hWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwU2VhcmNoVmlldygpIHsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGZhbHNlKTsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0T25RdWVyeUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtU2VhcmNoVmlldy5zZXRTdWJtaXRCdXR0b25FbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0UXVlcnlIaW50KGdldFN0cmluZyhSLnN0cmluZy5jaGVlc2VfaHVudF9oaW50KSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25RdWVyeVRleHRDaGFuZ2VkKFN0cmluZyBuZXdUZXh0KSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuZXdUZXh0KSkgeworICAgICAgICAgICAgbUxpc3RWaWV3LmNsZWFyVGV4dEZpbHRlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpc3RWaWV3LnNldEZpbHRlclRleHQobmV3VGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvblN1Ym1pdFF1ZXJ5KFN0cmluZyBxdWVyeSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvU3BsaXRUb3VjaFZpZXcuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1NwbGl0VG91Y2hWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3YjVjOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1NwbGl0VG91Y2hWaWV3LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworCisKKy8qKgorICogRGVtb25zdHJhdGVzIHNwbGl0dGluZyB0b3VjaCBldmVudHMgYWNyb3NzIG11bHRpcGxlIHZpZXdzIHdpdGhpbiBhIHZpZXcgZ3JvdXAuCisgKi8KK3B1YmxpYyBjbGFzcyBTcGxpdFRvdWNoVmlldyBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc3BsaXRfdG91Y2hfdmlldyk7CisgICAgICAgIExpc3RWaWV3IGxpc3QxID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0MSk7CisgICAgICAgIExpc3RWaWV3IGxpc3QyID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0Mik7CisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgQ2hlZXNlcy5zQ2hlZXNlU3RyaW5ncyk7CisgICAgICAgIGxpc3QxLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIGxpc3QyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKKyAgICAgICAgbGlzdDEuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihpdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGxpc3QyLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIoaXRlbUNsaWNrTGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHJlc3BvbnNlSW5kZXggPSAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBPbkl0ZW1DbGlja0xpc3RlbmVyIGl0ZW1DbGlja0xpc3RlbmVyID0gbmV3IE9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlcyA9IGdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuY2hlZXNlX3Jlc3BvbnNlcyk7CisgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSByZXNwb25zZXNbcmVzcG9uc2VJbmRleCsrICUgcmVzcG9uc2VzLmxlbmd0aF07CisKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLnNwbGl0X3RvdWNoX3ZpZXdfY2hlZXNlX3RvYXN0LAorICAgICAgICAgICAgICAgICAgICBDaGVlc2VzLnNDaGVlc2VTdHJpbmdzW3Bvc2l0aW9uXSwgcmVzcG9uc2UpOworCisgICAgICAgICAgICBUb2FzdCB0b2FzdCA9IFRvYXN0Lm1ha2VUZXh0KGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBtZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpOworICAgICAgICAgICAgdG9hc3Quc2hvdygpOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnMzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzMy5qYXZhCmluZGV4IGUwOWYwNDEuLjU4N2JmZTggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnMzLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczMuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAvLyB0aGUgdGFiIGlzIGNsaWNrZWQuCiAgICAgICAgIHRhYkhvc3QuYWRkVGFiKHRhYkhvc3QubmV3VGFiU3BlYygidGFiMyIpCiAgICAgICAgICAgICAgICAgLnNldEluZGljYXRvcigiZGVzdHJveSIpCi0gICAgICAgICAgICAgICAgLnNldENvbnRlbnQobmV3IEludGVudCh0aGlzLCBDb250cm9sczIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnNldENvbnRlbnQobmV3IEludGVudCh0aGlzLCBDb250cm9sczEuY2xhc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QKSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKaW5kZXggYTQ2MmJjMS4uMGE0MzVjMSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKQEAgLTE2Myw2ICsxNjMsMzAgQEAKICAgCiAgIDxkdD48YSBocmVmPSJMaXN0OC5odG1sIj44LiBQaG90b3M8L2E+PC9kdD4KICAgPGRkPiBEZW1vbnN0cmF0ZXMgYSBsaXN0IGFjdGl2aXR5IHRoYXQgdXNlcyBhIGN1c3RvbSBMaXN0QWRhcHRlciwgc2V0dGluZyB0aGUgdmlldyBmb3IgYW4gZW1wdHkgaXRlbSwgYW5kIGFsc28gaG93IHRvIGN1c3RvbWl6ZSB0aGUgbGF5b3V0IG9mIGEgTGlzdEFjdGl2aXR5LiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0OS5odG1sIj45LiBBcnJheSAoT3ZlcmxheSk8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTAuaHRtbCI+MTAuIFNpbmdsZSBjaG9pY2UgbGlzdDwvYT48L2R0PgorICA8ZGQ+IDwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9Ikxpc3QxMS5odG1sIj4xMS4gTXVsdGlwbGUgY2hvaWNlIGxpc3Q8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTIuaHRtbCI+MTIuIFRyYW5zY3JpcHQ8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTMuaHRtbCI+MTMuIFNsb3cgQWRhcHRlcjwvYT48L2R0PgorICA8ZGQ+IDwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9Ikxpc3QxNC5odG1sIj4xNC4gRWZmaWNpZW50IEFkYXB0ZXI8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTUuaHRtbCI+MTUuIFNlbGVjdGlvbiBNb2RlPC9hPjwvZHQ+CisgIDxkZD4gRGVtb25zdHJhdGVzIHRoZSB1c2Ugb2Ygc2VsZWN0aW9uIENvbnRleHR1YWwgQWN0aW9uIG1vZGUgdG8gc2VsZWN0IG11bHRpcGxlIGl0ZW1zIGluIGEgbGlzdCBhY3Rpdml0eS4gPC9kZD4KKworICA8ZHQ+PGEgaHJlZj0iTGlzdDE2Lmh0bWwiPjE2LiBCb3JkZXIgc2VsZWN0aW9uIG1vZGU8L2E+PC9kdD4KKyAgPGRkPiBEZW1vbnN0cmF0ZXMgYSBtdWx0aS1zZWxlY3QgbGlzdCBhY3Rpdml0eSB0aGF0IHVzZXMgdGhlIDxjb2RlPnNpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbTwvY29kZT4gYm9yZGVyIGxheW91dCBmb3Igc2VsZWN0ZWQgaXRlbXMuIDwvZGQ+CiA8L2RsPgogCiAKQEAgLTIzNSwxMyArMjU5LDIxIEBACiAKIDxoMz5Db250cm9sczwvaDM+CiA8ZGw+Ci0gIDxkdD48YSBocmVmPSJDb250cm9sczEuaHRtbCI+MS4gVGhlbWUgV2hpdGU8L2E+PC9kdD4KLSAgPGRkPkRlbW9uc3RyYXRlcyBhIHZhcmlldHkgb2YgY29tbW9uIGZvcm0gdHlwZSB3aWRnZXRzLCBzdWNoIGFzIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zIHVzaW5nIHRoZSB3aGl0ZSB0aGVtZS4gPC9kZD4KKyAgPGR0PjxhIGhyZWY9IkNvbnRyb2xzMS5odG1sIj4xLiBUaGVtZSBMaWdodDwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGEgdmFyaWV0eSBvZiBjb21tb24gZm9ybSB0eXBlIHdpZGdldHMsIHN1Y2ggYXMgY2hlY2sgYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgdXNpbmcgdGhlIGxpZ2h0IHRoZW1lLiA8L2RkPgogPC9kbD4KIDxkbD4KLSAgPGR0PjxhIGhyZWY9IkNvbnRyb2xzMi5odG1sIj4yLiBUaGVtZSBEYXJrPC9hPjwvZHQ+CisgIDxkdD48YSBocmVmPSJDb250cm9sczEuaHRtbCI+Mi4gVGhlbWUgRGFyazwvYT48L2R0PgogICA8ZGQ+RGVtb25zdHJhdGVzIGEgdmFyaWV0eSBvZiBjb21tb24gZm9ybSB0eXBlIHdpZGdldHMsIHN1Y2ggYXMgY2hlY2sgYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgdXNpbmcgdGhlIGRhcmsgdGhlbWUuIDwvZGQ+CiA8L2RsPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjMuIFRoZW1lIEhvbG9ncmFwaGljIExpZ2h0PC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIGNvbW1vbiBmb3JtIHR5cGUgd2lkZ2V0cywgc3VjaCBhcyBjaGVjayBib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyB1c2luZyB0aGUgbGlnaHQgaG9sb2dyYXBoaWMgdGhlbWUuIDwvZGQ+Cis8L2RsPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjQuIFRoZW1lIEhvbG9ncmFwaGljIERhcms8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBhIHZhcmlldHkgb2YgY29tbW9uIGZvcm0gdHlwZSB3aWRnZXRzLCBzdWNoIGFzIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zIHVzaW5nIHRoZSBkYXJrIGhvbG9ncmFwaGljIHRoZW1lLiA8L2RkPgorPC9kbD4KIAogPGgzPkF1dG8gQ29tcGxldGU8L2gzPgogPGRsPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKaW5kZXggMGViZWQyOC4uMjk2NzQ5YSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC00OCw3ICs0OCw3IEBACiBwdWJsaWM6CiAgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQogICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKSA9IDA7CiAKICAgICBpbnQgZ2V0UGx1Z2luV2lkdGgoKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uY3BwCmluZGV4IDcyYTExYzkuLjZlOTNmYjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcApAQCAtMzUsMTIgKzM1LDEyIEBACiBleHRlcm4gQU5QUGF0aEludGVyZmFjZVYwICAgICAgZ1BhdGhJOwogZXh0ZXJuIEFOUFdpbmRvd0ludGVyZmFjZVYwICAgIGdXaW5kb3dJOwogCi1zdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworc3RhdGljIHVpbnQxNl90IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgewogICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CiAgICAgaWYgKGl4IDwgMCkgewogICAgICAgICBpeCA9IDA7CiAgICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGl4KTsKIH0KIAogc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICBnV2luZG93SS5jbGVhclZpc2libGVSZWN0cyhpbnN0YW5jZSk7CiB9CiAKLWludDE2IEJhbGxBbmltYXRpb246OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgQmFsbEFuaW1hdGlvbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgewogICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKIAogICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKaW5kZXggZWYyYTNmNS4uNGE1YjRlOCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBCYWxsQW5pbWF0aW9uKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5CYWxsQW5pbWF0aW9uKCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiBwcml2YXRlOgogICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOwogICAgIHZvaWQgc2hvd0VudGlyZVBsdWdpbk9uU2NyZWVuKCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCmluZGV4IDk3MzFmMTkuLjhkZWZlZjQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCkBAIC00NCwxMiArNDQsMTIgQEAKICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB1aW50MTYgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CiAgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKICAgICBpZiAoaXggPCAwKSB7CiAgICAgICAgIGl4ID0gMDsKICAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNj4oaXgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXgpOwogfQogCiBzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUFJlY3RGJiByLCBib29sIGRvQUEpIHsKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVSZWN0KSA/IG1fcGFpbnRBY3RpdmVSZWN0IDogbV9wYWludFJlY3Q7CiB9CiAKLWludDE2IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOwogCiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oCmluZGV4IDEyOWQzM2EuLjBmODhhOTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBBdWRpb1BsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+QXVkaW9QbHVnaW4oKTsKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIHByaXZhdGU6CiAgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOwogICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwCmluZGV4IGY3NDk2MzkuLjUxNWFjYmUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5jcHAKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgIGdTdXJmYWNlSS51bmxvY2soZW52LCBtX3N1cmZhY2UpOwogfQogCi1pbnQxNiBCYWNrZ3JvdW5kUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEJhY2tncm91bmRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgogICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCBkcmF3IGV2ZW50cyIsIGluc3QoKSk7CkBAIC0yMzMsMTAgKzIzMywxMCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAjZGVmaW5lIFRJTUVSX0lOVEVSVkFMICAgICA1MAotc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKLXN0YXRpYyB2b2lkIHRpbWVyX3JlcGVhdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKLXN0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCk7Ci1zdGF0aWMgdm9pZCB0aW1lcl9sYXRlbmN5KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCk7CitzdGF0aWMgdm9pZCB0aW1lcl9uZXZlcmZpcmVzKE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCk7CitzdGF0aWMgdm9pZCB0aW1lcl9sYXRlbmN5KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCk7CiAKIHZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF90aW1lcnMoKSB7CiAgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOwpAQCAtMjU1LDE4ICsyNTUsMTggQEAKICAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBUSU1FUl9JTlRFUlZBTCwgdHJ1ZSwgdGltZXJfbGF0ZW5jeSk7CiAgICAgbVN0YXJ0VGltZSA9IG1QcmV2VGltZSA9IGdldE1TZWNzKCk7CiAgICAgLy8gdGVzdCB1bnNjaGVkdWxlIGltbWVkaWF0ZWx5Ci0gICAgdWludDMyIGlkID0gYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfbmV2ZXJmaXJlcyk7CisgICAgdWludDMyX3QgaWQgPSBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCAxMDAsIGZhbHNlLCB0aW1lcl9uZXZlcmZpcmVzKTsKICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIGlkKTsKICAgICAvLyB0ZXN0IGRvdWJsZSB1bnNjaGVkdWxlIChzaG91bGQgYmUgbm8tb3ApCiAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7CiAKIH0KIAotc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7CitzdGF0aWMgdm9pZCB0aW1lcl9vbmVzaG90KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCkgewogICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIG9uZXNob3QgdGltZXJcbiIpOwogfQogCi1zdGF0aWMgdm9pZCB0aW1lcl9yZXBlYXQoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCkgewogICAgIEJhY2tncm91bmRQbHVnaW4gKm9iaiA9ICgoQmFja2dyb3VuZFBsdWdpbiopICgoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhKS0+YWN0aXZlUGx1Z2luKTsKIAogICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIHJlcGVhdCB0aW1lciAlZFxuIiwKQEAgLTI3NiwxMSArMjc2LDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB0aW1lcl9uZXZlcmZpcmVzKE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKK3N0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzJfdCB0aW1lcklEKSB7CiAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLS0tLS0gdGltZXJfbmV2ZXJmaXJlcyEhIVxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHRpbWVyX2xhdGVuY3koTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworc3RhdGljIHZvaWQgdGltZXJfbGF0ZW5jeShOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpIHsKICAgICBCYWNrZ3JvdW5kUGx1Z2luICpvYmogPSAoKEJhY2tncm91bmRQbHVnaW4qKSAoKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YSktPmFjdGl2ZVBsdWdpbik7CiAKICAgICBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQgKz0gMTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5oCmluZGV4IGViZDc3ZDEuLmUwYjA1OTcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmgKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApAQCAtMzIsNyArMzIsNyBAQAogcHVibGljOgogICAgIEJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpOwogICAgIHZpcnR1YWwgfkJhY2tncm91bmRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKICAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0U3VyZmFjZSgpOwogCiAgICAgLy8gVGltZXIgVGVzdGluZyBWYXJpYWJsZXMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcAppbmRleCA1YTUzNmQ5Li4xMTBhZmFhIDEwMDY0NAotLS0gYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uY3BwCkBAIC00MywxMiArNDMsMTIgQEAKICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB1aW50MTYgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CiAgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKICAgICBpZiAoaXggPCAwKSB7CiAgICAgICAgIGl4ID0gMDsKICAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNj4oaXgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXgpOwogfQogCiBzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUFJlY3RGJiByLCBib29sIGRvQUEpIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgIH0KIH0KIAotaW50MTYgRm9ybVBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworaW50MTZfdCBGb3JtUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOwogCiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmgKaW5kZXggMDQxZmZiOC4uOWY5ODVhMyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uaAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCkBAIC0zOSw3ICszOSw3IEBACiAgICAgRm9ybVBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+Rm9ybVBsdWdpbigpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogcHJpdmF0ZToKICAgICB2b2lkIGRyYXcoQU5QQ2FudmFzKik7CiAgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcAppbmRleCAzZThmZWU3Li4wN2JhZTY2IDEwMDY0NAotLS0gYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5jcHAKQEAgLTQxLDE5ICs0MSwxOSBAQAogCiAjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOwogTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7CiBOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKIE5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKKyAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpOwogTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7Ci1pbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7Ci1pbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAoraW50MzJfdCAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CitpbnQzMl90ICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLAogICAgICAgICB2b2lkKiBidWZmZXIpOwogdm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwogdm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKLWludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOworaW50MTZfdCAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKIHZvaWQgICAgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLAogICAgICAgICB2b2lkKiBub3RpZnlEYXRhKTsKIE5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIHJldHVybiAiYXBwbGljYXRpb24veC10ZXN0YnJvd3NlcnBsdWdpbjp0c3Q6VGVzdCBwbHVnaW4gbWltZXR5cGUgaXMgYXBwbGljYXRpb24veC10ZXN0YnJvd3NlcnBsdWdpbiI7CiB9CiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgICAgICAgICBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKQogewogCkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CiB9CiAKLU5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKQorTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSkKIHsKICAgICAqc3R5cGUgPSBOUF9BU0ZJTEVPTkxZOwogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKQEAgLTMwMSwxMiArMzAxLDEyIEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1pbnQzMiBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCitpbnQzMl90IE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKIHsKICAgICByZXR1cm4gMDsKIH0KIAotaW50MzIgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sIHZvaWQqIGJ1ZmZlcikKK2ludDMyX3QgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLCB2b2lkKiBidWZmZXIpCiB7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMTksNyArMzE5LDcgQEAKIHsKIH0KIAotaW50MTYgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCitpbnQxNl90IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQogewogICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOwogICAgIGNvbnN0IEFOUEV2ZW50KiBldnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEFOUEV2ZW50Kj4oZXZlbnQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uY3BwCmluZGV4IDk5NjY3YTQuLjAxZDlhNzkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uUGx1Z2luLmNwcAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5jcHAKQEAgLTQzLDEyICs0MywxMiBAQAogICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKIH0KIAotc3RhdGljIHVpbnQxNiBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKK3N0YXRpYyB1aW50MTZfdCBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKICAgICBpbnQgaXggPSAoaW50KXJvdW5kZih4KSArIGluc2V0OwogICAgIGlmIChpeCA8IDApIHsKICAgICAgICAgaXggPSAwOwogICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2PihpeCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihpeCk7CiB9CiAKIHN0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgewpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgcmV0dXJuIChpbnB1dCA9PSBtX2FjdGl2ZU5hdikgPyBtX3BhaW50QWN0aXZlIDogbV9wYWludERpc2FibGVkOwogfQogCi1pbnQxNiBOYXZpZ2F0aW9uUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IE5hdmlnYXRpb25QbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CiAKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uaAppbmRleCBjYTEyYWU3Li5jMjA0NGJiIDEwMDY0NAotLS0gYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5oCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uUGx1Z2luLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAlOYXZpZ2F0aW9uUGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5OYXZpZ2F0aW9uUGx1Z2luKCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiBwcml2YXRlOgogICAgIHZvaWQgZHJhdyhBTlBDYW52YXMqKTsKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKaW5kZXggNzFiOWYyNC4uYWJlNjgwNSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgIH0KIH0KIAotaW50MTYgUGFpbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgUGFpbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZTogewogICAgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdCkgZXZ0LT5kYXRhLnRvdWNoLng7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmgKaW5kZXggMDM1ZTUxYi4uZmZkZjYyNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5oCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uaApAQCAtMzMsNyArMzMsNyBAQAogcHVibGljOgogICAgIFBhaW50UGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5QYWludFBsdWdpbigpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCmluZGV4IGYyNDI5NWIuLmJmM2FiNzYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB9CiB9CiAKLWludDE2IFZpZGVvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IFZpZGVvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewogICAgICAgICBjYXNlIGtMaWZlY3ljbGVfQU5QRXZlbnRUeXBlOiB7CiAgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmgKaW5kZXggNzAxZTJkMC4uZmIxNTM4NiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS92aWRlby9WaWRlb1BsdWdpbi5oCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uaApAQCAtMzIsNyArMzIsNyBAQAogcHVibGljOgogICAgIFZpZGVvUGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5WaWRlb1BsdWdpbigpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zYW1wbGVzL0NvcnBBcHAvQW5kcm9pZC5tayBiL3NhbXBsZXMvQ29ycEFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Yjk4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0NvcnBBcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCisKKyMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ29ycEFwcAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCisjIFVzZSB0aGUgZm9sbG93aW5nIGluY2x1ZGUgdG8gbWFrZSBvdXIgdGVzdCBhcGsuCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQ29ycEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9Db3JwQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMzM3NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQ29ycEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIERlY2xhcmUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQW5kcm9pZCBhcHBsaWNhdGlvbi4gIFRoZSBuYW1lc3BhY2UKKyAgICAgYXR0cmlidXRlIGJyaW5ncyBpbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBuYW1lc3BhY2UsIGFuZCB0aGUgcGFja2FnZQorICAgICBzdXBwbGllcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgYXBwbGljYXRpb24uICBXaGVuIHdyaXRpbmcgeW91cgorICAgICBvd24gYXBwbGljYXRpb24sIHRoZSBwYWNrYWdlIG5hbWUgbXVzdCBiZSBjaGFuZ2VkIGZyb20gImNvbS5leGFtcGxlLioiCisgICAgIHRvIGNvbWUgZnJvbSBhIGRvbWFpbiB0aGF0IHlvdSBvd24gb3IgaGF2ZSBjb250cm9sIG92ZXIuIC0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLmNvcnBhcHAiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDb3Jwb3JhdGVEZXZpY2VBZG1pbkRlbW9BcHAiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDb3JwQXBwQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2NvcnBfYXBwX2FjdGl2aXR5Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLmFwcC5Db3JwRGV2aWNlQWRtaW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jb3JwX2FwcF9hZG1pbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2NvcnBfZGV2aWNlX2FkbWluX2Rlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOIj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5jb3JwX2RldmljZV9hZG1pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9jb3JwX2RldmljZV9hZG1pbiIgLz4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX0FETUlOX0VOQUJMRUQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvcmVjZWl2ZXI+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0NvcnBBcHAvcmVzL2xheW91dC9jb3JwX2FwcF9hY3Rpdml0eS54bWwgYi9zYW1wbGVzL0NvcnBBcHAvcmVzL2xheW91dC9jb3JwX2FwcF9hY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxZTczNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQ29ycEFwcC9yZXMvbGF5b3V0L2NvcnBfYXBwX2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvcnBfYXBwX3N0YXR1c193YWl0aW5nX3RleHQiLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvcnBfYXBwX3NldF9idXR0b25fdGV4dCIvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L1Njcm9sbFZpZXc+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQ29ycEFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9Db3JwQXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlZjU0OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQ29ycEFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorCisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF90aXRsZV90ZXh0Ij5Db3Jwb3JhdGUgRGVtbyBBcHA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcnBfYXBwX3NldF9idXR0b25fdGV4dCI+U2V0IENvcnAgR2xvYmFsIFByb3h5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF9zdGF0dXNfc3VjY2Vzc190ZXh0Ij5HbG9iYWwgUHJveHkgc3VjY2Vzc2Z1bGx5IHNldDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29ycF9hcHBfc3RhdHVzX2ZhaWxlZF90ZXh0Ij5HbG9iYWwgUHJveHkgY291bGQgbm90IGJlIHNldC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcnBfYXBwX3N0YXR1c193YWl0aW5nX3RleHQiPldhaXRpbmcgdG8gc2V0IEdsb2JhbCBQcm94eS4uLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29ycF9hcHBfcHJveHlfbmFtZSI+cHJveHkuY29ycGFwcC5jb206ODA4MDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29ycF9hcHBfcHJveHlfZXhjbF9saXN0Ij5nb29nbGUuY29tLHlvdXR1YmUuY29tPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF9hY3Rpdml0eSI+U2FtcGxlIENvcnAgQXBwIEFjdGl2aXR5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF9hZG1pbiI+U2FtcGxlIENvcnAgQXBwIERldmljZSBBZG1pbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29ycF9kZXZpY2VfYWRtaW5fZGVzY3JpcHRpb24iPkNvcnBvcmF0ZSBkZXZpY2UgYWRtaW4gc2FtcGxlIGRlbW88L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0NvcnBBcHAvcmVzL3htbC9jb3JwX2RldmljZV9hZG1pbi54bWwgYi9zYW1wbGVzL0NvcnBBcHAvcmVzL3htbC9jb3JwX2RldmljZV9hZG1pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2NGI2MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQ29ycEFwcC9yZXMveG1sL2NvcnBfZGV2aWNlX2FkbWluLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBCRUdJTl9JTkNMVURFKG1ldGFfZGF0YSkgLS0+Cis8ZGV2aWNlLWFkbWluIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPHVzZXMtcG9saWNpZXM+CisgICAgICAgIDxzZXQtZ2xvYmFsLXByb3h5IC8+CisgICAgPC91c2VzLXBvbGljaWVzPgorPC9kZXZpY2UtYWRtaW4+Cis8IS0tIEVORF9JTkNMVURFKG1ldGFfZGF0YSkgLS0+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQ29ycEFwcC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9jb3JwYXBwL0NvcnBBcHBBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9Db3JwQXBwL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2NvcnBhcHAvQ29ycEFwcEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ZmI1NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQ29ycEFwcC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9jb3JwYXBwL0NvcnBBcHBBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmNvcnBhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuUHJveHk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIG1pbmltYWwgR2xvYmwgUHJveHktc2V0dGluZyBjb3JwIGFwcCAgYXBwbGljYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBDb3JwQXBwQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdpdGggdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuCisgICAgICovCisKKyAgICBCdXR0b24gbVNldEJ1dHRvbjsKKyAgICBUZXh0VmlldyBtU3RhdHVzVGV4dDsKKyAgICBTdHJpbmcgbVByb3h5TmFtZTsKKyAgICBTdHJpbmcgbVByb3h5RXhjbExpc3Q7CisgICAgU3RyaW5nIG1TdWNjZXNzOworICAgIFN0cmluZyBtRmFpbHVyZTsKKworICAgIERldmljZVBvbGljeU1hbmFnZXIgbURQTTsKKyAgICBBY3Rpdml0eU1hbmFnZXIgbUFNOworICAgIENvbXBvbmVudE5hbWUgbUNvcnBEZXZpY2VBZG1pbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtRFBNID0gKERldmljZVBvbGljeU1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CisgICAgICAgIG1BTSA9IChBY3Rpdml0eU1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBtQ29ycERldmljZUFkbWluID0gbmV3IENvbXBvbmVudE5hbWUoQ29ycEFwcEFjdGl2aXR5LnRoaXMsIENvcnBEZXZpY2VBZG1pbi5jbGFzcyk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBsYXlvdXQgZm9yIHRoaXMgYWN0aXZpdHkuICBZb3UgY2FuIGZpbmQgaXQKKyAgICAgICAgLy8gaW4gcmVzL2xheW91dC9jb3JwX2FwcF9hY3Rpdml0eS54bWwKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY29ycF9hcHBfYWN0aXZpdHkpOworCisgICAgICAgIG1TZXRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNldF9idXR0b24pOworICAgICAgICBtU2V0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0TGlzdGVuZXIpOworICAgICAgICBtU3RhdHVzVGV4dCA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX3RleHQpOworCisgICAgICAgIGJvb2xlYW4gYWN0aXZlID0gbURQTS5pc0FkbWluQWN0aXZlKG1Db3JwRGV2aWNlQWRtaW4pOworICAgICAgICBtU2V0QnV0dG9uLnNldEVuYWJsZWQoYWN0aXZlKTsKKyAgICAgICAgbVByb3h5TmFtZSA9IGdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb3JwX2FwcF9wcm94eV9uYW1lKTsKKyAgICAgICAgbVByb3h5RXhjbExpc3QgPSBnZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoUi5zdHJpbmcuY29ycF9hcHBfcHJveHlfZXhjbF9saXN0KTsKKyAgICAgICAgbVN1Y2Nlc3MgPSBnZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoUi5zdHJpbmcuY29ycF9hcHBfc3RhdHVzX3N1Y2Nlc3NfdGV4dCk7CisgICAgICAgIG1GYWlsdXJlID0gZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvcnBfYXBwX3N0YXR1c19mYWlsZWRfdGV4dCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1TZXRMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwcm94eUNvbXBvbmVudHMgPSBtUHJveHlOYW1lLnNwbGl0KCI6Iik7CisgICAgICAgICAgICBpZiAocHJveHlDb21wb25lbnRzLmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoQ29ycEFwcEFjdGl2aXR5LnRoaXMsICJXcm9uZyBwcm94eSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcm94eSBpbnN0UHJveHkgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5IVFRQLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MocHJveHlDb21wb25lbnRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocHJveHlDb21wb25lbnRzWzFdKSkpOworICAgICAgICAgICAgU3RyaW5nW10gbGlzdERvbXMgPSBtUHJveHlFeGNsTGlzdC5zcGxpdCgiLCIpOworICAgICAgICAgICAgaWYgKGxpc3REb21zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoQ29ycEFwcEFjdGl2aXR5LnRoaXMsICJXcm9uZyBleGNsdXNpb24gbGlzdCBmb3JtYXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2xMaXN0ID0gIEFycmF5cy5hc0xpc3QobGlzdERvbXMpOworICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmUgPSBtRFBNLmlzQWRtaW5BY3RpdmUobUNvcnBEZXZpY2VBZG1pbik7CisgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgbURQTS5zZXRHbG9iYWxQcm94eShtQ29ycERldmljZUFkbWluLCBpbnN0UHJveHksIGV4Y2xMaXN0KTsKKyAgICAgICAgICAgICAgICBDb21wb25lbnROYW1lIHByb3h5QWRtaW4gPSBtRFBNLmdldEdsb2JhbFByb3h5QWRtaW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3h5QWRtaW4gIT0gbnVsbCkgJiYgKHByb3h5QWRtaW4uZXF1YWxzKG1Db3JwRGV2aWNlQWRtaW4pKSkgeworICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChDb3JwQXBwQWN0aXZpdHkudGhpcywgIkdsb2JhbCBQcm94eSBzZXQgYnkgZGV2aWNlIGFkbWluLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNUZXh0LnNldFRleHQobVN1Y2Nlc3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KENvcnBBcHBBY3Rpdml0eS50aGlzLCAiRmFpbGVkIHRvIHNldCBHbG9iYWwgUHJveHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1RleHQuc2V0VGV4dChtRmFpbHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0NvcnBBcHAvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvY29ycGFwcC9Db3JwRGV2aWNlQWRtaW4uamF2YSBiL3NhbXBsZXMvQ29ycEFwcC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9jb3JwYXBwL0NvcnBEZXZpY2VBZG1pbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTgzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0NvcnBBcHAvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvY29ycGFwcC9Db3JwRGV2aWNlQWRtaW4uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmNvcnBhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VBZG1pblJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitwdWJsaWMgY2xhc3MgQ29ycERldmljZUFkbWluIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CisKKyAgICBzdGF0aWMgU2hhcmVkUHJlZmVyZW5jZXMgZ2V0U2FtcGxlUHJlZmVyZW5jZXMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKERldmljZUFkbWluUmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIHNob3dUb2FzdChDb250ZXh0IGNvbnRleHQsIENoYXJTZXF1ZW5jZSBtc2cpIHsKKyAgICAgICAgVG9hc3QubWFrZVRleHQoY29udGV4dCwgbXNnLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNob3dUb2FzdChjb250ZXh0LCAiU2FtcGxlIENvcnAgRGV2aWNlIEFkbWluOiBlbmFibGVkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBvbkRpc2FibGVSZXF1ZXN0ZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiAiU2FtcGxlIENvcnAgRGV2aWNlIEFkbWluOiBkaXNhYmxlIHJlcXVlc3RlZCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EaXNhYmxlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJTYW1wbGUgQ29ycCBEZXZpY2UgQWRtaW46IGRpc2FibGVkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXNzd29yZENoYW5nZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNob3dUb2FzdChjb250ZXh0LCAiU2FtcGxlIENvcnAgRGV2aWNlIEFkbWluOiBwdyBjaGFuZ2VkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXNzd29yZEZhaWxlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJTYW1wbGUgQ29ycCBEZXZpY2UgQWRtaW46IHB3IGZhaWxlZCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGFzc3dvcmRTdWNjZWVkZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNob3dUb2FzdChjb250ZXh0LCAiU2FtcGxlIENvcnAgRGV2aWNlIEFkbWluOiBwdyBzdWNjZWVkZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvTm90ZVBhZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGI4N2RmZTMuLmRhOTIzNzggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCwxNSArMjAsMTggQEAKICAgICAgb3duIGFwcGxpY2F0aW9uLCB0aGUgcGFja2FnZSBuYW1lIG11c3QgYmUgY2hhbmdlZCBmcm9tICJjb20uZXhhbXBsZS4qIgogICAgICB0byBjb21lIGZyb20gYSBkb21haW4gdGhhdCB5b3Ugb3duIG9yIGhhdmUgY29udHJvbCBvdmVyLiAtLT4KIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkIiA+Ci0KKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQiCis+CiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2FwcF9ub3RlcyIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgPgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgID4KICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iTm90ZVBhZFByb3ZpZGVyIgotICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmV4YW1wbGUubm90ZXBhZC5wcm92aWRlci5Ob3RlUGFkIiAvPgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmdvb2dsZS5wcm92aWRlci5Ob3RlUGFkIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGdyYW50LXVyaS1wZXJtaXNzaW9uIGFuZHJvaWQ6cGF0aFBhdHRlcm49Ii4qIiAvPgorICAgICAgICA8L3Byb3ZpZGVyPgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik5vdGVzTGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGl0bGVfbm90ZXNfbGlzdCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik5vdGVzTGlzdCIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90aXRsZV9ub3Rlc19saXN0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KQEAgLTQ5LDIxICs1MiwyNyBAQAogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik5vdGVFZGl0b3IiCiAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb24iPgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90aXRsZV9ub3RlIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ic2Vuc29yIgorICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbiIKKyAgICAgICAgPgogICAgICAgICAgICAgPCEtLSBUaGlzIGZpbHRlciBzYXlzIHRoYXQgd2UgY2FuIHZpZXcgb3IgZWRpdCB0aGUgZGF0YSBvZgogICAgICAgICAgICAgICAgICBhIHNpbmdsZSBub3RlIC0tPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9yZXNvbHZlX2VkaXQiPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uVklFVyIgLz4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkVESVQiIC8+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLm5vdGVzLmFjdGlvbi5FRElUX05PVEUiIC8+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLm5vdGVwYWQuYWN0aW9uLkVESVRfTk9URSIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6bWltZVR5cGU9InZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5nb29nbGUubm90ZSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KIAogICAgICAgICAgICAgPCEtLSBUaGlzIGZpbHRlciBzYXlzIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIG5ldyBub3RlIGluc2lkZQotICAgICAgICAgICAgICAgICBvZiBhIGRpcmVjdG9yeSBvZiBub3Rlcy4gLS0+CisgICAgICAgICAgICAgICAgIG9mIGEgZGlyZWN0b3J5IG9mIG5vdGVzLiAgVGhlIElOU0VSVCBhY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICAgICAgICAgICBlbXB0eSBub3RlOyB0aGUgUEFTVEUgYWN0aW9uIGluaXRpYWxpemVzIGEgbmV3IG5vdGUgZnJvbQorICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkLiAtLT4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uSU5TRVJUIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFTVEUiIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KICAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOm1pbWVUeXBlPSJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3ZuZC5nb29nbGUubm90ZSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KQEAgLTczLDcgKzgyLDYgQEAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iVGl0bGVFZGl0b3IiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3RpdGxlX2VkaXRfdGl0bGUiCiAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EaWFsb2ciCi0gICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X2VkaXQiCiAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlVmlzaWJsZSI+CiAgICAgICAgICAgICA8IS0tIFRoaXMgYWN0aXZpdHkgaW1wbGVtZW50cyBhbiBhbHRlcm5hdGl2ZSBhY3Rpb24gdGhhdCBjYW4gYmUKICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIG9uIG5vdGVzOiBlZGl0aW5nIHRoZWlyIHRpdGxlLiAgSXQgY2FuIGJlIHVzZWQgYXMKQEAgLTEwNyw2ICsxMTUsNiBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iNCIvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IkZyb3lvIi8+CiA8L21hbmlmZXN0PgogCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGktdjYvYXBwX25vdGVzLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS12Ni9hcHBfbm90ZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTE4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGktdjYvYXBwX25vdGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvbGl2ZV9mb2xkZXJfbm90ZXMucG5nIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpLXY2L2xpdmVfZm9sZGVyX25vdGVzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2xpdmVfZm9sZGVyX25vdGVzLnBuZwpyZW5hbWUgdG8gc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpLXY2L2xpdmVfZm9sZGVyX25vdGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX25vdGVzLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9hcHBfbm90ZXMucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzQ5MTgyMy4uMjU4ZDNkMQotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX25vdGVzLnBuZworKysgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX25vdGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wb3NlLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBvc2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQzNzllLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBvc2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGVsZXRlLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWQyNmEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGVsZXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Rpc2NhcmQucG5nIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGlzY2FyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NGVhOWQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGlzY2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lZGl0LnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2VkaXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJkZDEwLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2VkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JldmVydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODYwYTQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NhdmUucG5nIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2F2ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjZjNWQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2F2ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWxkcGkvYXBwX25vdGVzLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtbGRwaS12Ni9hcHBfbm90ZXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWxkcGkvYXBwX25vdGVzLnBuZwpyZW5hbWUgdG8gc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1sZHBpLXY2L2FwcF9ub3Rlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1sZHBpL2xpdmVfZm9sZGVyX25vdGVzLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtbGRwaS12Ni9saXZlX2ZvbGRlcl9ub3Rlcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtbGRwaS9saXZlX2ZvbGRlcl9ub3Rlcy5wbmcKcmVuYW1lIHRvIHNhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtbGRwaS12Ni9saXZlX2ZvbGRlcl9ub3Rlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS9hcHBfbm90ZXMucG5nIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1tZHBpLXY2L2FwcF9ub3Rlcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvYXBwX25vdGVzLnBuZwpyZW5hbWUgdG8gc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1tZHBpLXY2L2FwcF9ub3Rlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS9saXZlX2ZvbGRlcl9ub3Rlcy5wbmcgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLW1kcGktdjYvbGl2ZV9mb2xkZXJfbm90ZXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2xpdmVfZm9sZGVyX25vdGVzLnBuZwpyZW5hbWUgdG8gc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1tZHBpLXY2L2xpdmVfZm9sZGVyX25vdGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX25vdGVzLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUtbWRwaS9hcHBfbm90ZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzkxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX25vdGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLW1kcGkvbGl2ZV9mb2xkZXJfbm90ZXMucG5nIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1tZHBpL2xpdmVfZm9sZGVyX25vdGVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU0YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1tZHBpL2xpdmVfZm9sZGVyX25vdGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfY29tcG9zZS5wbmcgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfY29tcG9zZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDczM2UuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS9pY19tZW51X2NvbXBvc2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS9pY19tZW51X2RlbGV0ZS5wbmcgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfZGVsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q5NTQ5NC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfZGVsZXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvaWNfbWVudV9kaXNjYXJkLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvaWNfbWVudV9kaXNjYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMjJlYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfZGlzY2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfZWRpdC5wbmcgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfZWRpdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxYTljMmUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS9pY19tZW51X2VkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS9pY19tZW51X3JldmVydC5wbmcgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfcmV2ZXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlMDRmNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfcmV2ZXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvaWNfbWVudV9zYXZlLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvaWNfbWVudV9zYXZlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNTBiMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfc2F2ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC9ub3RlX2VkaXRvci54bWwgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC9ub3RlX2VkaXRvci54bWwKaW5kZXggZjE0MmM3MS4uZDdkYTk5ZSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9sYXlvdXQvbm90ZV9lZGl0b3IueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L25vdGVfZWRpdG9yLnhtbApAQCAtMTMsMTUgKzEzLDE3IEBACiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KKwogPHZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZUVkaXRvciRMaW5lZEVkaXRUZXh0IgogICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90ZSIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQiCi0gICAgYW5kcm9pZDpwYWRkaW5nPSI1ZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI1ZGlwIgogICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKICAgICBhbmRyb2lkOnRleHRTaXplPSIyMnNwIgotICAgIGFuZHJvaWQ6Y2FwaXRhbGl6ZT0ic2VudGVuY2VzIiAvPgorICAgIGFuZHJvaWQ6Y2FwaXRhbGl6ZT0ic2VudGVuY2VzIgorLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L25vdGVzbGlzdF9pdGVtLnhtbCBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L25vdGVzbGlzdF9pdGVtLnhtbAppbmRleCBiMTY3NzM0Li5lMTFjNWVlIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC9ub3Rlc2xpc3RfaXRlbS54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9sYXlvdXQvbm90ZXNsaXN0X2l0ZW0ueG1sCkBAIC0xNiw3ICsxNiw3IEBACiAKIDxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9lZGl0b3Jfb3B0aW9uc19tZW51LnhtbCBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9lZGl0b3Jfb3B0aW9uc19tZW51LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkMTRhYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvZWRpdG9yX29wdGlvbnNfbWVudS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfc2F2ZSIKLSAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X3NhdmUiCi0gICAgICAgICAgYW5kcm9pZDphbHBoYWJldGljU2hvcnRjdXQ9J3MnCi0gICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X3NhdmUiIC8+Ci0gICAgPGdyb3VwIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9ncm91cF9lZGl0Ij4KLSAgICAgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X3JldmVydCIKLSAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9yZXZlcnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9yZXZlcnQiIC8+Ci0gICAgICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9kZWxldGUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfZGVsZXRlIgotICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL21lbnVfZGVsZXRlIiAvPgotICAgIDwvZ3JvdXA+Ci0gICAgPGdyb3VwIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9ncm91cF9pbnNlcnQiPgotICAgICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfZGlzY2FyZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9kaXNjYXJkIgotICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL21lbnVfZGlzY2FyZCIgLz4KLSAgICA8L2dyb3VwPgotPC9tZW51PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9saXN0X2NvbnRleHRfbWVudS54bWwgYi9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9jb250ZXh0X21lbnUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M4ZWRkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9saXN0X2NvbnRleHRfbWVudS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvY29udGV4dF9vcGVuIgotICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9vcGVuIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvY29udGV4dF9kZWxldGUiCi0gICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X2RlbGV0ZSIgLz4KLTwvbWVudT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9vcHRpb25zX21lbnUueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9tZW51L2xpc3Rfb3B0aW9uc19tZW51LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NDU1NC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9vcHRpb25zX21lbnUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8IS0tICBUaGlzIGlzIG91ciBvbmUgc3RhbmRhcmQgYXBwbGljYXRpb24gYWN0aW9uIChjcmVhdGluZyBhIG5ldyBub3RlKS4gLS0+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X2FkZCIKLSAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X2NvbXBvc2UiCi0gICAgICAgICAgYW5kcm9pZDphbHBoYWJldGljU2hvcnRjdXQ9J2EnCi0gICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X2FkZCIgLz4KLTwvbWVudT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDQxMDA2NTIuLjQzYmU0ZGQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xNSwyOCArMTUsMjcgQEAKIC0tPgogCiA8cmVzb3VyY2VzPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPk5vdGVQYWQ8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxpdmVfZm9sZGVyX25hbWUiPk5vdGVzPC9zdHJpbmc+Ci0gICAgCi0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9lZGl0X3RpdGxlIj5Ob3RlIHRpdGxlOjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfY3JlYXRlIj5DcmVhdGUgbm90ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfZWRpdCI+RWRpdDogXCIlMSRzXCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlX25vdGVzX2xpc3QiPk5vdGVzPC9zdHJpbmc+Ci0gICAgCi0gICAgPHN0cmluZyBuYW1lPSJtZW51X2FkZCI+QWRkIG5vdGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1lbnVfc2F2ZSI+U2F2ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVudV9jb3B5Ij5Db3B5PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJtZW51X2RlbGV0ZSI+RGVsZXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtZW51X29wZW4iPk9wZW48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1lbnVfcmV2ZXJ0Ij5SZXZlcnQgY2hhbmdlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVudV9pbnNlcnQiPkFkZCBub3RlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZW51X3Bhc3RlIj5QYXN0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVudV9yZXZlcnQiPlJldmVydDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibWVudV9kaXNjYXJkIj5EaXNjYXJkPC9zdHJpbmc+Ci0gICAgCi0gICAgPHN0cmluZyBuYW1lPSJidXR0b25fb2siPk9LPC9zdHJpbmc+ICAKLSAgICA8c3RyaW5nIG5hbWU9InRleHRfdGl0bGUiPlRpdGxlOjwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJyZXNvbHZlX2VkaXQiPkVkaXQgbm90ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icmVzb2x2ZV90aXRsZSI+RWRpdCB0aXRsZTwvc3RyaW5nPgotICAgIAotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3JfdGl0bGUiPkVycm9yPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvcl9tZXNzYWdlIj5FcnJvciBsb2FkaW5nIG5vdGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im5vdGhpbmdfdG9fc2F2ZSI+VGhlcmUgaXMgbm90aGluZyB0byBzYXZlPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgPHN0cmluZyBuYW1lPSJyZXNvbHZlX3RpdGxlIj5FZGl0IHRpdGxlPC9zdHJpbmc+ICAKKworICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfY3JlYXRlIj5DcmVhdGUgbm90ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfZWRpdCI+RWRpdCBub3RlPC9zdHJpbmc+CisJPHN0cmluZyBuYW1lPSJ0aXRsZV9ub3Rlc19saXN0Ij5Ob3RlIHBhZDwvc3RyaW5nPiAgIAorCTxzdHJpbmcgbmFtZT0idGl0bGVfbm90ZSI+Tm90ZTwvc3RyaW5nPiAgCisJPHN0cmluZyBuYW1lPSJ0aXRsZV9lZGl0X3RpdGxlIj5Ob3RlIHRpdGxlOjwvc3RyaW5nPiAgCisJCisJPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+Tm90ZSBQYWQ8L3N0cmluZz4gIAorCTxzdHJpbmcgbmFtZT0ibGl2ZV9mb2xkZXJfbmFtZSI+Tm90ZXM8L3N0cmluZz4KKwkKKwk8c3RyaW5nIG5hbWU9ImJ1dHRvbl9vayI+T0s8L3N0cmluZz4gIAorCQorCTxzdHJpbmcgbmFtZT0iZXJyb3JfdGl0bGUiPkVycm9yPC9zdHJpbmc+CisJPHN0cmluZyBuYW1lPSJlcnJvcl9tZXNzYWdlIj5FcnJvciBsb2FkaW5nIG5vdGU8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZUVkaXRvci5qYXZhIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZUVkaXRvci5qYXZhCmluZGV4IDY2ZjRjZTYuLmRhODU5NzQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlRWRpdG9yLmphdmEKQEAgLTE2LDEyICsxNiwxNiBAQAogCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZDsKIAoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC5Ob3RlUGFkOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwpAQCAtMzEsMTc1ICszNSwyOTEgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci0KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZC5Ob3RlQ29sdW1uczsKIAogLyoqCi0gKiBBIGdlbmVyaWMgYWN0aXZpdHkgZm9yIGVkaXRpbmcgYSBub3RlIGluIGEgZGF0YWJhc2UuICBUaGlzIGNhbiBiZSB1c2VkCi0gKiBlaXRoZXIgdG8gc2ltcGx5IHZpZXcgYSBub3RlIHtAbGluayBJbnRlbnQjQUNUSU9OX1ZJRVd9LCB2aWV3IGFuZCBlZGl0IGEgbm90ZQotICoge0BsaW5rIEludGVudCNBQ1RJT05fRURJVH0sIG9yIGNyZWF0ZSBhIG5ldyBub3RlIHtAbGluayBJbnRlbnQjQUNUSU9OX0lOU0VSVH0uICAKKyAqIFRoaXMgQWN0aXZpdHkgaGFuZGxlcyAiZWRpdGluZyIgYSBub3RlLCB3aGVyZSBlZGl0aW5nIGlzIHJlc3BvbmRpbmcgdG8KKyAqIHtAbGluayBJbnRlbnQjQUNUSU9OX1ZJRVd9IChyZXF1ZXN0IHRvIHZpZXcgZGF0YSksIGVkaXQgYSBub3RlCisgKiB7QGxpbmsgSW50ZW50I0FDVElPTl9FRElUfSwgY3JlYXRlIGEgbm90ZSB7QGxpbmsgSW50ZW50I0FDVElPTl9JTlNFUlR9LCBvcgorICogY3JlYXRlIGEgbmV3IG5vdGUgZnJvbSB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIHtAbGluayBJbnRlbnQjQUNUSU9OX1BBU1RFfS4KKyAqCisgKiBOT1RFOiBOb3RpY2UgdGhhdCB0aGUgcHJvdmlkZXIgb3BlcmF0aW9ucyBpbiB0aGlzIEFjdGl2aXR5IGFyZSB0YWtpbmcgcGxhY2Ugb24gdGhlIFVJIHRocmVhZC4KKyAqIFRoaXMgaXMgbm90IGEgZ29vZCBwcmFjdGljZS4gSXQgaXMgb25seSBkb25lIGhlcmUgdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLiBBIHJlYWwKKyAqIGFwcGxpY2F0aW9uIHNob3VsZCB1c2UgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXJ9CisgKiBvciB7QGxpbmsgYW5kcm9pZC5vcy5Bc3luY1Rhc2t9IG9iamVjdCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgYXN5bmNocm9ub3VzbHkgb24gYSBzZXBhcmF0ZSB0aHJlYWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBOb3RlRWRpdG9yIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm90ZUVkaXRvciI7CisgICAgLy8gRm9yIGxvZ2dpbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3NlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm90ZXMiOwogCi0gICAgLyoqCi0gICAgICogU3RhbmRhcmQgcHJvamVjdGlvbiBmb3IgdGhlIGludGVyZXN0aW5nIGNvbHVtbnMgb2YgYSBub3JtYWwgbm90ZS4KKyAgICAvKgorICAgICAqIENyZWF0ZXMgYSBwcm9qZWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbm90ZSBJRCBhbmQgdGhlIG5vdGUgY29udGVudHMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIE5vdGVDb2x1bW5zLl9JRCwgLy8gMAotICAgICAgICBOb3RlQ29sdW1ucy5OT1RFLCAvLyAxCi0gICAgICAgIE5vdGVDb2x1bW5zLlRJVExFLCAvLyAyCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUKICAgICB9OwotICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIG5vdGUgY29sdW1uICovCisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBub3RlIGNvbHVtbgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSU5ERVhfTk9URSA9IDE7Ci0gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgdGl0bGUgY29sdW1uICovCisKKyAgICAvLyBUaGUgaW5kZXggb2YgdGhlIHRpdGxlIGNvbHVtbgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSU5ERVhfVElUTEUgPSAyOwotICAgIAotICAgIC8vIFRoaXMgaXMgb3VyIHN0YXRlIGRhdGEgdGhhdCBpcyBzdG9yZWQgd2hlbiBmcmVlemluZy4KKworICAgIC8vIEEgbGFiZWwgZm9yIHRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfQ09OVEVOVCA9ICJvcmlnQ29udGVudCI7CiAKLSAgICAvLyBUaGUgZGlmZmVyZW50IGRpc3RpbmN0IHN0YXRlcyB0aGUgYWN0aXZpdHkgY2FuIGJlIHJ1biBpbi4KKyAgICAvLyBNZW51IGl0ZW0gaWRlbnRpZmllcnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVWRVJUX0lEID0gTWVudS5GSVJTVDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ0FSRF9JRCA9IE1lbnUuRklSU1QgKyAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxFVEVfSUQgPSBNZW51LkZJUlNUICsgMjsKKworICAgIC8vIFRoaXMgQWN0aXZpdHkgY2FuIGJlIHN0YXJ0ZWQgYnkgbW9yZSB0aGFuIG9uZSBhY3Rpb24uIEVhY2ggYWN0aW9uIGlzIHJlcHJlc2VudGVkCisgICAgLy8gYXMgYSAic3RhdGUiIGNvbnN0YW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VESVQgPSAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTlNFUlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVNURSA9IDI7CiAKKyAgICAvLyBHbG9iYWwgbXV0YWJsZSB2YXJpYWJsZXMKICAgICBwcml2YXRlIGludCBtU3RhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RlT25seSA9IGZhbHNlOwogICAgIHByaXZhdGUgVXJpIG1Vcmk7CiAgICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1UZXh0OwogICAgIHByaXZhdGUgU3RyaW5nIG1PcmlnaW5hbENvbnRlbnQ7CiAKICAgICAvKioKLSAgICAgKiBBIGN1c3RvbSBFZGl0VGV4dCB0aGF0IGRyYXdzIGxpbmVzIGJldHdlZW4gZWFjaCBsaW5lIG9mIHRleHQgdGhhdCBpcyBkaXNwbGF5ZWQuCisgICAgICogRGVmaW5lcyBhIGN1c3RvbSBFZGl0VGV4dCBWaWV3IHRoYXQgZHJhd3MgbGluZXMgYmV0d2VlbiBlYWNoIGxpbmUgb2YgdGV4dCB0aGF0IGlzIGRpc3BsYXllZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbmVkRWRpdFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7CiAgICAgICAgIHByaXZhdGUgUmVjdCBtUmVjdDsKICAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CiAKLSAgICAgICAgLy8gd2UgbmVlZCB0aGlzIGNvbnN0cnVjdG9yIGZvciBMYXlvdXRJbmZsYXRlcgorICAgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgTGF5b3V0SW5mbGF0ZXIKICAgICAgICAgcHVibGljIExpbmVkRWRpdFRleHQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgIAorCisgICAgICAgICAgICAvLyBDcmVhdGVzIGEgUmVjdCBhbmQgYSBQYWludCBvYmplY3QsIGFuZCBzZXRzIHRoZSBzdHlsZSBhbmQgY29sb3Igb2YgdGhlIFBhaW50IG9iamVjdC4KICAgICAgICAgICAgIG1SZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOwogICAgICAgICAgICAgbVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLlNUUk9LRSk7CiAgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHg4MDAwMDBGRik7CiAgICAgICAgIH0KLSAgICAgICAgCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHRvIGRyYXcgdGhlIExpbmVkRWRpdFRleHQgb2JqZWN0CisgICAgICAgICAqIEBwYXJhbSBjYW52YXMgVGhlIGNhbnZhcyBvbiB3aGljaCB0aGUgYmFja2dyb3VuZCBpcyBkcmF3bi4KKyAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworCisgICAgICAgICAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGUgVmlldy4KICAgICAgICAgICAgIGludCBjb3VudCA9IGdldExpbmVDb3VudCgpOworCisgICAgICAgICAgICAvLyBHZXRzIHRoZSBnbG9iYWwgUmVjdCBhbmQgUGFpbnQgb2JqZWN0cwogICAgICAgICAgICAgUmVjdCByID0gbVJlY3Q7CiAgICAgICAgICAgICBQYWludCBwYWludCA9IG1QYWludDsKIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERyYXdzIG9uZSBsaW5lIGluIHRoZSByZWN0YW5nbGUgZm9yIGV2ZXJ5IGxpbmUgb2YgdGV4dCBpbiB0aGUgRWRpdFRleHQKKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICAvLyBHZXRzIHRoZSBiYXNlbGluZSBjb29yZGluYXRlcyBmb3IgdGhlIGN1cnJlbnQgbGluZSBvZiB0ZXh0CiAgICAgICAgICAgICAgICAgaW50IGJhc2VsaW5lID0gZ2V0TGluZUJvdW5kcyhpLCByKTsKIAorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRHJhd3MgYSBsaW5lIGluIHRoZSBiYWNrZ3JvdW5kIGZyb20gdGhlIGxlZnQgb2YgdGhlIHJlY3RhbmdsZSB0byB0aGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICogYXQgYSB2ZXJ0aWNhbCBwb3NpdGlvbiBvbmUgZGlwIGJlbG93IHRoZSBiYXNlbGluZSwgdXNpbmcgdGhlICJwYWludCIgb2JqZWN0CisgICAgICAgICAgICAgICAgICogZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKHIubGVmdCwgYmFzZWxpbmUgKyAxLCByLnJpZ2h0LCBiYXNlbGluZSArIDEsIHBhaW50KTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gRmluaXNoZXMgdXAgYnkgY2FsbGluZyB0aGUgcGFyZW50IG1ldGhvZAogICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQW5kcm9pZCB3aGVuIHRoZSBBY3Rpdml0eSBpcyBmaXJzdCBzdGFydGVkLiBGcm9tIHRoZSBpbmNvbWluZworICAgICAqIEludGVudCwgaXQgZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2YgZWRpdGluZyBpcyBkZXNpcmVkLCBhbmQgdGhlbiBkb2VzIGl0LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAorICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGVzIGFuIEludGVudCB0byB1c2Ugd2hlbiB0aGUgQWN0aXZpdHkgb2JqZWN0J3MgcmVzdWx0IGlzIHNlbnQgYmFjayB0byB0aGUKKyAgICAgICAgICogY2FsbGVyLgorICAgICAgICAgKi8KICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOwogCi0gICAgICAgIC8vIERvIHNvbWUgc2V0dXAgYmFzZWQgb24gdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWQuCisgICAgICAgIC8qCisgICAgICAgICAqICBTZXRzIHVwIGZvciB0aGUgZWRpdCwgYmFzZWQgb24gdGhlIGFjdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBpbmNvbWluZyBJbnRlbnQuCisgICAgICAgICAqLworCisgICAgICAgIC8vIEdldHMgdGhlIGFjdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGUgaW50ZW50IGZpbHRlciBmb3IgdGhpcyBBY3Rpdml0eQogICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworCisgICAgICAgIC8vIEZvciBhbiBlZGl0IGFjdGlvbjoKICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fRURJVC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdGVkIHRvIGVkaXQ6IHNldCB0aGF0IHN0YXRlLCBhbmQgdGhlIGRhdGEgYmVpbmcgZWRpdGVkLgorCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBBY3Rpdml0eSBzdGF0ZSB0byBFRElULCBhbmQgZ2V0cyB0aGUgVVJJIGZvciB0aGUgZGF0YSB0byBiZSBlZGl0ZWQuCiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9FRElUOwogICAgICAgICAgICAgbVVyaSA9IGludGVudC5nZXREYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9JTlNFUlQuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3RlZCB0byBpbnNlcnQ6IHNldCB0aGF0IHN0YXRlLCBhbmQgY3JlYXRlIGEgbmV3IGVudHJ5Ci0gICAgICAgICAgICAvLyBpbiB0aGUgY29udGFpbmVyLgorCisgICAgICAgICAgICAvLyBGb3IgYW4gaW5zZXJ0IG9yIHBhc3RlIGFjdGlvbjoKKyAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0lOU0VSVC5lcXVhbHMoYWN0aW9uKQorICAgICAgICAgICAgICAgIHx8IEludGVudC5BQ1RJT05fUEFTVEUuZXF1YWxzKGFjdGlvbikpIHsKKworICAgICAgICAgICAgLy8gU2V0cyB0aGUgQWN0aXZpdHkgc3RhdGUgdG8gSU5TRVJULCBnZXRzIHRoZSBnZW5lcmFsIG5vdGUgVVJJLCBhbmQgaW5zZXJ0cyBhbgorICAgICAgICAgICAgLy8gZW1wdHkgcmVjb3JkIGluIHRoZSBwcm92aWRlcgogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5TRVJUOwogICAgICAgICAgICAgbVVyaSA9IGdldENvbnRlbnRSZXNvbHZlcigpLmluc2VydChpbnRlbnQuZ2V0RGF0YSgpLCBudWxsKTsKIAotICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSB1bmFibGUgdG8gY3JlYXRlIGEgbmV3IG5vdGUsIHRoZW4ganVzdCBmaW5pc2gKLSAgICAgICAgICAgIC8vIHRoaXMgYWN0aXZpdHkuICBBIFJFU1VMVF9DQU5DRUxFRCB3aWxsIGJlIHNlbnQgYmFjayB0byB0aGUKLSAgICAgICAgICAgIC8vIG9yaWdpbmFsIGFjdGl2aXR5IGlmIHRoZXkgcmVxdWVzdGVkIGEgcmVzdWx0LgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIHRoZSBhdHRlbXB0IHRvIGluc2VydCB0aGUgbmV3IG5vdGUgZmFpbHMsIHNodXRzIGRvd24gdGhpcyBBY3Rpdml0eS4gVGhlCisgICAgICAgICAgICAgKiBvcmlnaW5hdGluZyBBY3Rpdml0eSByZWNlaXZlcyBiYWNrIFJFU1VMVF9DQU5DRUxFRCBpZiBpdCByZXF1ZXN0ZWQgYSByZXN1bHQuCisgICAgICAgICAgICAgKiBMb2dzIHRoYXQgdGhlIGluc2VydCBmYWlsZWQuCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChtVXJpID09IG51bGwpIHsKKworICAgICAgICAgICAgICAgIC8vIFdyaXRlcyB0aGUgbG9nIGlkZW50aWZpZXIsIGEgbWVzc2FnZSwgYW5kIHRoZSBVUkkgdGhhdCBmYWlsZWQuCiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGluc2VydCBuZXcgbm90ZSBpbnRvICIgKyBnZXRJbnRlbnQoKS5nZXREYXRhKCkpOworCisgICAgICAgICAgICAgICAgLy8gQ2xvc2VzIHRoZSBhY3Rpdml0eS4KICAgICAgICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRoZSBuZXcgZW50cnkgd2FzIGNyZWF0ZWQsIHNvIGFzc3VtZSBhbGwgd2lsbCBlbmQgd2VsbCBhbmQKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBuZXcgZW50cnkgd2FzIGNyZWF0ZWQsIHRoaXMgc2V0cyB0aGUgcmVzdWx0IHRvIGJlIHJldHVybmVkCiAgICAgICAgICAgICAvLyBzZXQgdGhlIHJlc3VsdCB0byBiZSByZXR1cm5lZC4KICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0ssIChuZXcgSW50ZW50KCkpLnNldEFjdGlvbihtVXJpLnRvU3RyaW5nKCkpKTsKIAorICAgICAgICAgICAgLy8gRm9yIGEgcGFzdGUsIGluaXRpYWxpemVzIHRoZSBkYXRhIGZyb20gY2xpcGJvYXJkLgorICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fUEFTVEUuZXF1YWxzKGFjdGlvbikpIHsKKworICAgICAgICAgICAgICAgIC8vIERvZXMgdGhlIHBhc3RlCisgICAgICAgICAgICAgICAgcGVyZm9ybVBhc3RlKCk7CisgICAgICAgICAgICAgICAgLy8gU3dpdGNoZXMgdGhlIHN0YXRlIHRvIFBBU1RFLiBUaGUgdGl0bGUgY2FuIG5vdCBiZSBtb2RpZmllZC4KKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVNURTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgYWN0aW9uIHdhcyBvdGhlciB0aGFuIEVESVQgb3IgSU5TRVJUOgogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2hvb3BzLCB1bmtub3duIGFjdGlvbiEgIEJhaWwuCisKKyAgICAgICAgICAgIC8vIExvZ3MgYW4gZXJyb3IgdGhhdCB0aGUgYWN0aW9uIHdhcyBub3QgdW5kZXJzdG9vZCwgZmluaXNoZXMgdGhlIEFjdGl2aXR5LCBhbmQKKyAgICAgICAgICAgIC8vIHJldHVybnMgUkVTVUxUX0NBTkNFTEVEIHRvIGFuIG9yaWdpbmF0aW5nIEFjdGl2aXR5LgogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBhY3Rpb24sIGV4aXRpbmciKTsKICAgICAgICAgICAgIGZpbmlzaCgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gU2V0IHRoZSBsYXlvdXQgZm9yIHRoaXMgYWN0aXZpdHkuICBZb3UgY2FuIGZpbmQgaXQgaW4gcmVzL2xheW91dC9ub3RlX2VkaXRvci54bWwKKyAgICAgICAgLy8gU2V0cyB0aGUgbGF5b3V0IGZvciB0aGlzIEFjdGl2aXR5LiBTZWUgcmVzL2xheW91dC9ub3RlX2VkaXRvci54bWwKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubm90ZV9lZGl0b3IpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHRleHQgdmlldyBmb3Igb3VyIG5vdGUsIGlkZW50aWZpZWQgYnkgaXRzIElEIGluIHRoZSBYTUwgZmlsZS4KKworICAgICAgICAvLyBHZXRzIGEgaGFuZGxlIHRvIHRoZSBFZGl0VGV4dCBpbiB0aGUgdGhlIGxheW91dC4KICAgICAgICAgbVRleHQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLm5vdGUpOwogCi0gICAgICAgIC8vIEdldCB0aGUgbm90ZSEKLSAgICAgICAgbUN1cnNvciA9IG1hbmFnZWRRdWVyeShtVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVXNpbmcgdGhlIFVSSSBwYXNzZWQgaW4gd2l0aCB0aGUgdHJpZ2dlcmluZyBJbnRlbnQsIGdldHMgdGhlIG5vdGUgb3Igbm90ZXMgaW4KKyAgICAgICAgICogdGhlIHByb3ZpZGVyLgorICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGJlaW5nIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gSXQgd2lsbCBibG9jayB0aGUgdGhyZWFkIHVudGlsIHRoZSBxdWVyeQorICAgICAgICAgKiBjb21wbGV0ZXMuIEluIGEgc2FtcGxlIGFwcCwgZ29pbmcgYWdhaW5zdCBhIHNpbXBsZSBwcm92aWRlciBiYXNlZCBvbiBhIGxvY2FsIGRhdGFiYXNlLAorICAgICAgICAgKiB0aGUgYmxvY2sgd2lsbCBiZSBtb21lbnRhcnksIGJ1dCBpbiBhIHJlYWwgYXBwIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAqIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlciBvciBhbmRyb2lkLm9zLkFzeW5jVGFzay4KKyAgICAgICAgICovCisgICAgICAgIG1DdXJzb3IgPSBtYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICBtVXJpLCAgICAgICAgIC8vIFRoZSBVUkkgdGhhdCBnZXRzIG11bHRpcGxlIG5vdGVzIGZyb20gdGhlIHByb3ZpZGVyLgorICAgICAgICAgICAgUFJPSkVDVElPTiwgICAvLyBBIHByb2plY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBub3RlIElEIGFuZCBub3RlIGNvbnRlbnQgZm9yIGVhY2ggbm90ZS4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAgLy8gTm8gIndoZXJlIiBjbGF1c2Ugc2VsZWN0aW9uIGNyaXRlcmlhLgorICAgICAgICAgICAgbnVsbCwgICAgICAgICAvLyBObyAid2hlcmUiIGNsYXVzZSBzZWxlY3Rpb24gdmFsdWVzLgorICAgICAgICAgICAgbnVsbCAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc29ydCBvcmRlciAobW9kaWZpY2F0aW9uIGRhdGUsIGRlc2NlbmRpbmcpCisgICAgICAgICk7CiAKLSAgICAgICAgLy8gSWYgYW4gaW5zdGFuY2Ugb2YgdGhpcyBhY3Rpdml0eSBoYWQgcHJldmlvdXNseSBzdG9wcGVkLCB3ZSBjYW4KLSAgICAgICAgLy8gZ2V0IHRoZSBvcmlnaW5hbCB0ZXh0IGl0IHN0YXJ0ZWQgd2l0aC4KKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhpcyBBY3Rpdml0eSBoYWQgc3RvcHBlZCBwcmV2aW91c2x5LCBpdHMgc3RhdGUgd2FzIHdyaXR0ZW4gdGhlIE9SSUdJTkFMX0NPTlRFTlQKKyAgICAgICAgICogbG9jYXRpb24gaW4gdGhlIHNhdmVkIEluc3RhbmNlIHN0YXRlLiBUaGlzIGdldHMgdGhlIHN0YXRlLgorICAgICAgICAgKi8KICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtT3JpZ2luYWxDb250ZW50ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFN0cmluZyhPUklHSU5BTF9DT05URU5UKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBBY3Rpdml0eSBpcyBhYm91dCB0byBjb21lIHRvIHRoZSBmb3JlZ3JvdW5kLiBUaGlzIGhhcHBlbnMKKyAgICAgKiB3aGVuIHRoZSBBY3Rpdml0eSBjb21lcyB0byB0aGUgdG9wIG9mIHRoZSB0YXNrIHN0YWNrLCBPUiB3aGVuIGl0IGlzIGZpcnN0IHN0YXJ0aW5nLgorICAgICAqCisgICAgICogTW92ZXMgdG8gdGhlIGZpcnN0IG5vdGUgaW4gdGhlIGxpc3QsIHNldHMgYW4gYXBwcm9wcmlhdGUgdGl0bGUgZm9yIHRoZSBhY3Rpb24gY2hvc2VuIGJ5CisgICAgICogdGhlIHVzZXIsIHB1dHMgdGhlIG5vdGUgY29udGVudHMgaW50byB0aGUgVGV4dFZpZXcsIGFuZCBzYXZlcyB0aGUgb3JpZ2luYWwgdGV4dCBhcyBhCisgICAgICogYmFja3VwLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbnkgdHJvdWJsZSByZXRyaWV2aW5nIHRoZSBkYXRhLCBpdCBpcyBub3cKLSAgICAgICAgLy8gdGltZSB0byBnZXQgYXQgdGhlIHN0dWZmLgorCisgICAgICAgIC8qCisgICAgICAgICAqIG1DdXJzb3IgaXMgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uQ3JlYXRlKCkgYWx3YXlzIHByZWNlZGVzIG9uUmVzdW1lIGZvciBhbnkgcnVubmluZworICAgICAgICAgKiBwcm9jZXNzLiBUaGlzIHRlc3RzIHRoYXQgaXQncyBub3QgbnVsbCwgc2luY2UgaXQgc2hvdWxkIGFsd2F5cyBjb250YWluIGRhdGEuCisgICAgICAgICAqLwogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBSZXF1ZXJ5IGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgd2hpbGUgcGF1c2VkIChzdWNoIGFzIHRoZSB0aXRsZSkKLSAgICAgICAgICAgIG1DdXJzb3IucmVxdWVyeSgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBhdCB0aGUgb25lIGFuZCBvbmx5IHJvdyBpbiB0aGUgY3Vyc29yLgorCisgICAgICAgICAgICAvKiBNb3ZlcyB0byB0aGUgZmlyc3QgcmVjb3JkLiBBbHdheXMgY2FsbCBtb3ZlVG9GaXJzdCgpIGJlZm9yZSBhY2Nlc3NpbmcgZGF0YSBpbgorICAgICAgICAgICAgICogYSBDdXJzb3IgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGUgc2VtYW50aWNzIG9mIHVzaW5nIGEgQ3Vyc29yIGFyZSB0aGF0IHdoZW4gaXQgaXMKKyAgICAgICAgICAgICAqIGNyZWF0ZWQsIGl0cyBpbnRlcm5hbCBpbmRleCBpcyBwb2ludGluZyB0byBhICJwbGFjZSIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdAorICAgICAgICAgICAgICogcmVjb3JkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAKLSAgICAgICAgICAgIC8vIE1vZGlmeSBvdXIgb3ZlcmFsbCB0aXRsZSBkZXBlbmRpbmcgb24gdGhlIG1vZGUgd2UgYXJlIHJ1bm5pbmcgaW4uCisgICAgICAgICAgICAvLyBNb2RpZmllcyB0aGUgd2luZG93IHRpdGxlIGZvciB0aGUgQWN0aXZpdHkgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IEFjdGl2aXR5IHN0YXRlLgogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0aXRsZSBvZiB0aGUgQWN0aXZpdHkgdG8gaW5jbHVkZSB0aGUgbm90ZSB0aXRsZQotICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IG1DdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9JTkRFWF9USVRMRSk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gU3RyaW5nLmZvcm1hdChyZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLnRpdGxlX2VkaXQpLCB0aXRsZSk7Ci0gICAgICAgICAgICAgICAgc2V0VGl0bGUodGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTlNFUlQpIHsKKworICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIHRpdGxlIHRvIEVkaXQgZm9yIGVkaXRzCisgICAgICAgICAgICAgICAgc2V0VGl0bGUoZ2V0VGV4dChSLnN0cmluZy50aXRsZV9lZGl0KSk7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIHRpdGxlIHRvICJjcmVhdGUiIGZvciBpbnNlcnRzIGFuZCBwYXN0ZXMKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCB8fCBtU3RhdGUgPT0gU1RBVEVfUEFTVEUpIHsKICAgICAgICAgICAgICAgICBzZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLnRpdGxlX2NyZWF0ZSkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGl0dGxlIHRyaWNreTogd2UgbWF5IGJlIHJlc3VtZWQgYWZ0ZXIgcHJldmlvdXNseSBiZWluZwotICAgICAgICAgICAgLy8gcGF1c2VkL3N0b3BwZWQuICBXZSB3YW50IHRvIHB1dCB0aGUgbmV3IHRleHQgaW4gdGhlIHRleHQgdmlldywKLSAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSB0aGUgdXNlciB3aGVyZSB0aGV5IHdlcmUgKHJldGFpbiB0aGUgY3Vyc29yIHBvc2l0aW9uCi0gICAgICAgICAgICAvLyBldGMpLiAgVGhpcyB2ZXJzaW9uIG9mIHNldFRleHQgZG9lcyB0aGF0IGZvciB1cy4KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBvblJlc3VtZSgpIG1heSBoYXZlIGJlZW4gY2FsbGVkIGFmdGVyIHRoZSBBY3Rpdml0eSBsb3N0IGZvY3VzICh3YXMgcGF1c2VkKS4KKyAgICAgICAgICAgICAqIFRoZSB1c2VyIHdhcyBlaXRoZXIgZWRpdGluZyBvciBjcmVhdGluZyBhIG5vdGUgd2hlbiB0aGUgQWN0aXZpdHkgcGF1c2VkLgorICAgICAgICAgICAgICogVGhlIEFjdGl2aXR5IHNob3VsZCByZS1kaXNwbGF5IHRoZSB0ZXh0IHRoYXQgaGFkIGJlZW4gcmV0cmlldmVkIHByZXZpb3VzbHksIGJ1dAorICAgICAgICAgICAgICogaXQgc2hvdWxkIG5vdCBtb3ZlIHRoZSBjdXJzb3IuIFRoaXMgaGVscHMgdGhlIHVzZXIgdG8gY29udGludWUgZWRpdGluZyBvciBlbnRlcmluZy4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBHZXRzIHRoZSBub3RlIHRleHQgZnJvbSB0aGUgQ3Vyc29yIGFuZCBwdXRzIGl0IGluIHRoZSBUZXh0VmlldywgYnV0IGRvZXNuJ3QgY2hhbmdlCisgICAgICAgICAgICAvLyB0aGUgdGV4dCBjdXJzb3IncyBwb3NpdGlvbi4KICAgICAgICAgICAgIFN0cmluZyBub3RlID0gbUN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX05PVEUpOwogICAgICAgICAgICAgbVRleHQuc2V0VGV4dEtlZXBTdGF0ZShub3RlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2UgaGFkbid0IHByZXZpb3VzbHkgcmV0cmlldmVkIHRoZSBvcmlnaW5hbCB0ZXh0LCBkbyBzbwotICAgICAgICAgICAgLy8gbm93LiAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gcmV2ZXJ0IHRoZWlyIGNoYW5nZXMuCisKKyAgICAgICAgICAgIC8vIFN0b3JlcyB0aGUgb3JpZ2luYWwgbm90ZSB0ZXh0LCB0byBhbGxvdyB0aGUgdXNlciB0byByZXZlcnQgY2hhbmdlcy4KICAgICAgICAgICAgIGlmIChtT3JpZ2luYWxDb250ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtT3JpZ2luYWxDb250ZW50ID0gbm90ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBTb21ldGhpbmcgaXMgd3JvbmcuIFRoZSBDdXJzb3Igc2hvdWxkIGFsd2F5cyBjb250YWluIGRhdGEuIFJlcG9ydCBhbiBlcnJvciBpbiB0aGUKKyAgICAgICAgICogbm90ZS4KKyAgICAgICAgICovCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLmVycm9yX3RpdGxlKSk7CiAgICAgICAgICAgICBtVGV4dC5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuZXJyb3JfbWVzc2FnZSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gQWN0aXZpdHkgbG9zZXMgZm9jdXMgZHVyaW5nIGl0cyBub3JtYWwgb3BlcmF0aW9uLCBhbmQgaXMgdGhlbgorICAgICAqIGxhdGVyIG9uIGtpbGxlZC4gVGhlIEFjdGl2aXR5IGhhcyBhIGNoYW5jZSB0byBzYXZlIGl0cyBzdGF0ZSBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIHJlc3RvcmUKKyAgICAgKiBpdC4KKyAgICAgKgorICAgICAqIE5vdGljZSB0aGF0IHRoaXMgbWV0aG9kIGlzbid0IGEgbm9ybWFsIHBhcnQgb2YgdGhlIEFjdGl2aXR5IGxpZmVjeWNsZS4gSXQgd29uJ3QgYmUgY2FsbGVkCisgICAgICogaWYgdGhlIHVzZXIgc2ltcGx5IG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIEFjdGl2aXR5LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIC8vIFNhdmUgYXdheSB0aGUgb3JpZ2luYWwgdGV4dCwgc28gd2Ugc3RpbGwgaGF2ZSBpdCBpZiB0aGUgYWN0aXZpdHkKQEAgLTIwNywxNDYgKzMyNywzMjIgQEAKICAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nKE9SSUdJTkFMX0NPTlRFTlQsIG1PcmlnaW5hbENvbnRlbnQpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBBY3Rpdml0eSBsb3NlcyBmb2N1cy4KKyAgICAgKgorICAgICAqIEZvciBBY3Rpdml0eSBvYmplY3RzIHRoYXQgZWRpdCBpbmZvcm1hdGlvbiwgb25QYXVzZSgpIG1heSBiZSB0aGUgb25lIHBsYWNlIHdoZXJlIGNoYW5nZXMgYXJlCisgICAgICogc2F2ZWQuIFRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIG1vZGVsIGlzIHByZWRpY2F0ZWQgb24gdGhlIGlkZWEgdGhhdCAic2F2ZSIgYW5kICJleGl0IiBhcmVuJ3QKKyAgICAgKiByZXF1aXJlZCBhY3Rpb25zLiBXaGVuIHVzZXJzIG5hdmlnYXRlIGF3YXkgZnJvbSBhbiBBY3Rpdml0eSwgdGhleSBzaG91bGRuJ3QgaGF2ZSB0byBnbyBiYWNrCisgICAgICogdG8gaXQgdG8gY29tcGxldGUgdGhlaXIgd29yay4gVGhlIGFjdCBvZiBnb2luZyBhd2F5IHNob3VsZCBzYXZlIGV2ZXJ5dGhpbmcgYW5kIGxlYXZlIHRoZQorICAgICAqIEFjdGl2aXR5IGluIGEgc3RhdGUgd2hlcmUgQW5kcm9pZCBjYW4gZGVzdHJveSBpdCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgdXNlciBoYXNuJ3QgZG9uZSBhbnl0aGluZywgdGhlbiB0aGlzIGRlbGV0ZXMgb3IgY2xlYXJzIG91dCB0aGUgbm90ZSwgb3RoZXJ3aXNlIGl0CisgICAgICogd3JpdGVzIHRoZSB1c2VyJ3Mgd29yayB0byB0aGUgcHJvdmlkZXIuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICAvLyBUaGUgdXNlciBpcyBnb2luZyBzb21ld2hlcmUsIHNvIG1ha2Ugc3VyZSBjaGFuZ2VzIGFyZSBzYXZlZAogCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gbVRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgIC8vIElmIHRoaXMgYWN0aXZpdHkgaXMgZmluaXNoZWQsIGFuZCB0aGVyZSBpcyBubyB0ZXh0LCB0aGVuIHdlCi0gICAgICAgIC8vIHNpbXBseSBkZWxldGUgdGhlIG5vdGUgZW50cnkuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzIGJvdGggZm9yIGVkaXRpbmcgYW5kIGluc2VydGluZy4uLiAgaXQKLSAgICAgICAgLy8gd291bGQgYmUgcmVhc29uYWJsZSB0byBvbmx5IGRvIGl0IHdoZW4gaW5zZXJ0aW5nLgotICAgICAgICBpZiAoaXNGaW5pc2hpbmcoKSAmJiAobGVuZ3RoID09IDApICYmIG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7Ci0gICAgICAgICAgICBkZWxldGVOb3RlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYXZlTm90ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAgICAgICAgLy8gSW5mbGF0ZSBtZW51IGZyb20gWE1MIHJlc291cmNlCi0gICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5lZGl0b3Jfb3B0aW9uc19tZW51LCBtZW51KTsKLQotICAgICAgICAvLyBBcHBlbmQgdG8gdGhlCi0gICAgICAgIC8vIG1lbnUgaXRlbXMgZm9yIGFueSBvdGhlciBhY3Rpdml0aWVzIHRoYXQgY2FuIGRvIHN0dWZmIHdpdGggaXQKLSAgICAgICAgLy8gYXMgd2VsbC4gIFRoaXMgZG9lcyBhIHF1ZXJ5IG9uIHRoZSBzeXN0ZW0gZm9yIGFueSBhY3Rpdml0aWVzIHRoYXQKLSAgICAgICAgLy8gaW1wbGVtZW50IHRoZSBBTFRFUk5BVElWRV9BQ1RJT04gZm9yIG91ciBkYXRhLCBhZGRpbmcgYSBtZW51IGl0ZW0KLSAgICAgICAgLy8gZm9yIGVhY2ggb25lIHRoYXQgaXMgZm91bmQuCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG51bGwsIGdldEludGVudCgpLmdldERhdGEoKSk7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQUxURVJOQVRJVkUpOwotICAgICAgICBtZW51LmFkZEludGVudE9wdGlvbnMoTWVudS5DQVRFR09SWV9BTFRFUk5BVElWRSwgMCwgMCwKLSAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZSh0aGlzLCBOb3RlRWRpdG9yLmNsYXNzKSwgbnVsbCwgaW50ZW50LCAwLCBudWxsKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAgICB9Ci0gICAgCi0gICAgCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7Ci0gICAgICAgICAgICBtZW51LnNldEdyb3VwVmlzaWJsZShSLmlkLm1lbnVfZ3JvdXBfZWRpdCwgdHJ1ZSk7Ci0gICAgICAgICAgICBtZW51LnNldEdyb3VwVmlzaWJsZShSLmlkLm1lbnVfZ3JvdXBfaW5zZXJ0LCBmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIG5vdGUgaGFzIGNoYW5nZWQgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSByZXZlcnQgb3B0aW9uCi0gICAgICAgICAgICBTdHJpbmcgc2F2ZWROb3RlID0gbUN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX05PVEUpOwotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnROb3RlID0gbVRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoc2F2ZWROb3RlLmVxdWFscyhjdXJyZW50Tm90ZSkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmZpbmRJdGVtKFIuaWQubWVudV9yZXZlcnQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZW51LmZpbmRJdGVtKFIuaWQubWVudV9yZXZlcnQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW51LnNldEdyb3VwVmlzaWJsZShSLmlkLm1lbnVfZ3JvdXBfZWRpdCwgZmFsc2UpOwotICAgICAgICAgICAgbWVudS5zZXRHcm91cFZpc2libGUoUi5pZC5tZW51X2dyb3VwX2luc2VydCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7Ci0gICAgICAgIC8vIEhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmxlIG1lbnUgYWN0aW9ucy4KLSAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7Ci0gICAgICAgIGNhc2UgUi5pZC5tZW51X3NhdmU6Ci0gICAgICAgICAgICBzYXZlTm90ZSgpOwotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSLmlkLm1lbnVfZGVsZXRlOgotICAgICAgICAgICAgZGVsZXRlTm90ZSgpOwotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSLmlkLm1lbnVfcmV2ZXJ0OgotICAgICAgICBjYXNlIFIuaWQubWVudV9kaXNjYXJkOgotICAgICAgICAgICAgY2FuY2VsTm90ZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBzYXZlTm90ZSgpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZWlyIGN1cnJlbnQKLSAgICAgICAgLy8gY2hhbmdlcyBhcmUgc2FmZWx5IHNhdmVkIGF3YXkgaW4gdGhlIHByb3ZpZGVyLiAgV2UgZG9uJ3QgbmVlZAotICAgICAgICAvLyB0byBkbyB0aGlzIGlmIG9ubHkgZWRpdGluZy4KKyAgICAgICAgLyoKKyAgICAgICAgICogVGVzdHMgdG8gc2VlIHRoYXQgdGhlIHF1ZXJ5IG9wZXJhdGlvbiBkaWRuJ3QgZmFpbCAoc2VlIG9uQ3JlYXRlKCkpLiBUaGUgQ3Vyc29yIG9iamVjdAorICAgICAgICAgKiB3aWxsIGV4aXN0LCBldmVuIGlmIG5vIHJlY29yZHMgd2VyZSByZXR1cm5lZCwgdW5sZXNzIHRoZSBxdWVyeSBmYWlsZWQgYmVjYXVzZSBvZiBzb21lCisgICAgICAgICAqIGV4Y2VwdGlvbiBvciBlcnJvci4KKyAgICAgICAgICoKKyAgICAgICAgICovCiAgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCBvdXQgdXBkYXRlcyBpbnRvIHRoZSBwcm92aWRlci4KLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKIAotICAgICAgICAgICAgLy8gQnVtcCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gbm93LgotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0KKyAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBub3RlIHRleHQuCiAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG1UZXh0LmdldFRleHQoKS50b1N0cmluZygpOwogICAgICAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgbm90ZSwgdGhlbiB3ZSB3YW50IHRvIGFsc28gY3JlYXRlCi0gICAgICAgICAgICAvLyBhbiBpbml0aWFsIHRpdGxlIGZvciBpdC4KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5TRVJUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLm5vdGhpbmdfdG9fc2F2ZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gdGV4dC5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMzAsIGxlbmd0aCkpOwotICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAzMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFNwYWNlID0gdGl0bGUubGFzdEluZGV4T2YoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTcGFjZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuc3Vic3RyaW5nKDAsIGxhc3RTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5USVRMRSwgdGl0bGUpOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBXcml0ZSBvdXIgdGV4dCBiYWNrIGludG8gdGhlIHByb3ZpZGVyLgotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5OT1RFLCB0ZXh0KTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiB0aGUgQWN0aXZpdHkgaXMgaW4gdGhlIG1pZHN0IG9mIGZpbmlzaGluZyBhbmQgdGhlcmUgaXMgbm8gdGV4dCBpbiB0aGUgY3VycmVudAorICAgICAgICAgICAgICogbm90ZSwgcmV0dXJucyBhIHJlc3VsdCBvZiBDQU5DRUxFRCB0byB0aGUgY2FsbGVyLCBhbmQgZGVsZXRlcyB0aGUgbm90ZS4gVGhpcyBpcyBkb25lCisgICAgICAgICAgICAgKiBldmVuIGlmIHRoZSBub3RlIHdhcyBiZWluZyBlZGl0ZWQsIHRoZSBhc3N1bXB0aW9uIGJlaW5nIHRoYXQgdGhlIHVzZXIgd2FudGVkIHRvCisgICAgICAgICAgICAgKiAiY2xlYXIgb3V0IiAoZGVsZXRlKSB0aGUgbm90ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGlzRmluaXNoaW5nKCkgJiYgKGxlbmd0aCA9PSAwKSAmJiAhbU5vdGVPbmx5KSB7CisgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgZGVsZXRlTm90ZSgpOwogCi0gICAgICAgICAgICAvLyBDb21taXQgYWxsIG9mIG91ciBjaGFuZ2VzIHRvIHBlcnNpc3RlbnQgc3RvcmFnZS4gV2hlbiB0aGUgdXBkYXRlIGNvbXBsZXRlcwotICAgICAgICAgICAgLy8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBub3RpZnkgdGhlIGN1cnNvciBvZiB0aGUgY2hhbmdlLCB3aGljaCB3aWxsCi0gICAgICAgICAgICAvLyBjYXVzZSB0aGUgVUkgdG8gYmUgdXBkYXRlZC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkudXBkYXRlKG1VcmksIHZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXcml0ZXMgdGhlIGVkaXRzIHRvIHRoZSBwcm92aWRlci4gVGhlIG5vdGUgaGFzIGJlZW4gZWRpdGVkIGlmIGFuIGV4aXN0aW5nIG5vdGUgd2FzCisgICAgICAgICAgICAgICAgICogcmV0cmlldmVkIGludG8gdGhlIGVkaXRvciAqb3IqIGlmIGEgbmV3IG5vdGUgd2FzIGluc2VydGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsCisgICAgICAgICAgICAgICAgICogb25DcmVhdGUoKSBpbnNlcnRlZCBhIG5ldyBlbXB0eSBub3RlIGludG8gdGhlIHByb3ZpZGVyLCBhbmQgaXQgaXMgdGhpcyBuZXcgbm90ZQorICAgICAgICAgICAgICAgICAqIHRoYXQgaXMgYmVpbmcgZWRpdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBtYXAgdG8gY29udGFpbiB0aGUgbmV3IHZhbHVlcyBmb3IgdGhlIGNvbHVtbnMKKyAgICAgICAgICAgICAgICB1cGRhdGVOb3RlKHRleHQsIG51bGwsICFtTm90ZU9ubHkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUYWtlIGNhcmUgb2YgY2FuY2VsaW5nIHdvcmsgb24gYSBub3RlLiAgRGVsZXRlcyB0aGUgbm90ZSBpZiB3ZQotICAgICAqIGhhZCBjcmVhdGVkIGl0LCBvdGhlcndpc2UgcmV2ZXJ0cyB0byB0aGUgb3JpZ2luYWwgdGV4dC4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGRldmljZSdzIE1lbnUgYnV0dG9uIHRoZSBmaXJzdCB0aW1lIGZvcgorICAgICAqIHRoaXMgQWN0aXZpdHkuIEFuZHJvaWQgcGFzc2VzIGluIGEgTWVudSBvYmplY3QgdGhhdCBpcyBwb3B1bGF0ZWQgd2l0aCBpdGVtcy4KKyAgICAgKgorICAgICAqIEJ1aWxkcyB0aGUgbWVudXMgZm9yIGVkaXRpbmcgYW5kIGluc2VydGluZywgYW5kIGFkZHMgaW4gYWx0ZXJuYXRpdmUgYWN0aW9ucyB0aGF0CisgICAgICogcmVnaXN0ZXJlZCB0aGVtc2VsdmVzIHRvIGhhbmRsZSB0aGUgTUlNRSB0eXBlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51IEEgTWVudSBvYmplY3QgdG8gd2hpY2ggaXRlbXMgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSB0byBkaXNwbGF5IHRoZSBtZW51LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisKKyAgICAgICAgLy8gQnVpbGRzIHRoZSBtZW51cyB0aGF0IGFyZSBzaG93biB3aGVuIGVkaXRpbmcuIFRoZXNlIGFyZSAncmV2ZXJ0JyB0byB1bmRvIGNoYW5nZXMsIGFuZAorICAgICAgICAvLyAnZGVsZXRlJyB0byBkZWxldGUgdGhlIG5vdGUuCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfRURJVCkgeworCisgICAgICAgICAgICAvLyBBZGRzIHRoZSAncmV2ZXJ0JyBtZW51IGl0ZW0sIGFuZCBzZXRzIGl0cyBzaG9ydGN1dCB0byBudW1lcmljIDAsIGxldHRlciAncicgYW5kIGl0cworICAgICAgICAgICAgLy8gaWNvbiB0byB0aGUgQW5kcm9pZCBzdGFuZGFyZCByZXZlcnQgaWNvbi4KKyAgICAgICAgICAgIG1lbnUuYWRkKDAsIFJFVkVSVF9JRCwgMCwgUi5zdHJpbmcubWVudV9yZXZlcnQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydGN1dCgnMCcsICdyJykKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfcmV2ZXJ0KTsKKyAgICAgICAgICAgIGlmICghbU5vdGVPbmx5KSB7CisKKyAgICAgICAgICAgICAgICAvLyBBZGRzIHRoZSAnZGVsZXRlJyBtZW51IGl0ZW0sIGFuZCBzZXRzIGl0cyBzaG9ydGN1dCB0byBudW1lcmljIDEsIGxldHRlciAnZCcKKyAgICAgICAgICAgICAgICAvLyBhbmQgaXRzIGljb24gdG8gdGhlIEFuZHJvaWQgc3RhbmRhcmQgZGVsZXRlIGljb24KKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBERUxFVEVfSUQsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0Y3V0KCcxJywgJ2QnKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfZGVsZXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBCdWlsZHMgdGhlIG1lbnVzIHRoYXQgYXJlIHNob3duIHdoZW4gaW5zZXJ0aW5nLiBUaGUgb25seSBvcHRpb24gaXMgJ0Rpc2NhcmQnIHRvIHRocm93CisgICAgICAgIC8vIGF3YXkgdGhlIG5ldyBub3RlLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVudS5hZGQoMCwgRElTQ0FSRF9JRCwgMCwgUi5zdHJpbmcubWVudV9kaXNjYXJkKQorICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRjdXQoJzAnLCAnZCcpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5pY19tZW51X2RlbGV0ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBlbmRzIG1lbnUgaXRlbXMgZm9yIGFueSBBY3Rpdml0eSBkZWNsYXJhdGlvbnMgdGhhdCBpbXBsZW1lbnQgYW4gYWx0ZXJuYXRpdmUgYWN0aW9uCisgICAgICAgICAqIGZvciB0aGlzIEFjdGl2aXR5J3MgTUlNRSB0eXBlLCBvbmUgbWVudSBpdGVtIGZvciBlYWNoIEFjdGl2aXR5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFtTm90ZU9ubHkpIHsKKworICAgICAgICAgICAgLy8gTWFrZXMgYSBuZXcgSW50ZW50IHdpdGggdGhlIFVSSSBkYXRhIHBhc3NlZCB0byB0aGlzIEFjdGl2aXR5CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChudWxsLCBnZXRJbnRlbnQoKS5nZXREYXRhKCkpOworCisgICAgICAgICAgICAvLyBBZGRzIHRoZSBBTFRFUk5BVElWRSBjYXRlZ29yeSB0byB0aGUgSW50ZW50LgorICAgICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IENvbXBvbmVudE5hbWUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBBY3Rpdml0eS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgIE5vdGVFZGl0b3IuY2xhc3MpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW4gdGhlIEFMVEVSTkFUSVZFIG1lbnUgZ3JvdXAsIGFkZHMgYW4gb3B0aW9uIGZvciBlYWNoIEFjdGl2aXR5IHRoYXQgaXMgcmVnaXN0ZXJlZCB0bworICAgICAgICAgICAgICogaGFuZGxlIHRoaXMgQWN0aXZpdHkncyBNSU1FIHR5cGUuIFRoZSBJbnRlbnQgZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBpdGVtcyBzaG91bGQgYmUKKyAgICAgICAgICAgICAqIGFkZGVkIHRvIHRoZSBtZW51OyBpbiB0aGlzIGNhc2UsIEFjdGl2aXR5IGRlY2xhcmF0aW9ucyB3aXRoIGNhdGVnb3J5IEFMVEVSTkFUSVZFLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtZW51LmFkZEludGVudE9wdGlvbnMoCisgICAgICAgICAgICAgICAgTWVudS5DQVRFR09SWV9BTFRFUk5BVElWRSwgIC8vIFRoZSBtZW51IGdyb3VwIHRvIGFkZCB0aGUgaXRlbXMgdG8uCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgIC8vIE5vIHVuaXF1ZSBJRCBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgIC8vIE5vIG9yZGVyaW5nIGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBjb21wb25lbnQsICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgQWN0aXZpdHkgb2JqZWN0J3MgY29tcG9uZW50IG5hbWUKKyAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gc3BlY2lmaWMgaXRlbXMgbmVlZCB0byBiZSBwbGFjZWQgZmlyc3QuCisgICAgICAgICAgICAgICAgaW50ZW50LCAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgY29udGFpbmluZyB0aGUgdHlwZSBvZiBpdGVtcyB0byBhZGQuCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgIC8vIE5vIGZsYWdzIGFyZSBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZ2VuZXJhdGUgYW4gYXJyYXkgb2YgbWVudSBpdGVtcy4KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgbWV0aG9kIHJldHVybnMgVFJVRSwgc28gdGhhdCBmdXJ0aGVyIG1lbnUgcHJvY2Vzc2luZyBpcyBub3QgZG9uZS4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQuIEFuZHJvaWQgcGFzc2VzIGluIHRoZSBzZWxlY3RlZCBpdGVtLgorICAgICAqIFRoZSBzd2l0Y2ggc3RhdGVtZW50IGluIHRoaXMgbWV0aG9kIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIHRoZQorICAgICAqIHVzZXIgY2hvc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgc2VsZWN0ZWQgTWVudUl0ZW0KKyAgICAgKiBAcmV0dXJuIFRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaXRlbSB3YXMgcHJvY2Vzc2VkLCBhbmQgbm8gZnVydGhlciB3b3JrIGlzIG5lY2Vzc2FyeS4gRmFsc2UKKyAgICAgKiB0byBwcm9jZWVkIHRvIGZ1cnRoZXIgcHJvY2Vzc2luZyBhcyBpbmRpY2F0ZWQgaW4gdGhlIE1lbnVJdGVtIG9iamVjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworCisgICAgICAgIC8vIENob29zZXMgdGhlIGFjdGlvbiB0byBwZXJmb3JtCisgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworCisgICAgICAgIC8vIERlbGV0ZXMgdGhlIG5vdGUgYW5kIGNsb3NlIHRoZSBBY3Rpdml0eS4KKyAgICAgICAgY2FzZSBERUxFVEVfSUQ6CisgICAgICAgIGRlbGV0ZU5vdGUoKTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIERpc2NhcmRzIHRoZSBuZXcgbm90ZS4KKyAgICAgICAgY2FzZSBESVNDQVJEX0lEOgorICAgICAgICBjYW5jZWxOb3RlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIERpc2NhcmRzIGFueSBjaGFuZ2VzIHRvIGFuIGVkaXRlZCBub3RlLgorICAgICAgICBjYXNlIFJFVkVSVF9JRDoKKyAgICAgICAgY2FuY2VsTm90ZSgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnRpbnVlcyB3aXRoIHByb2Nlc3NpbmcgdGhlIG1lbnUgaXRlbS4gSW4gZWZmZWN0LCBpZiB0aGUgaXRlbSB3YXMgYW4gYWx0ZXJuYXRpdmUKKyAgICAgICAgLy8gYWN0aW9uLCB0aGlzIGludm9rZXMgdGhlIEFjdGl2aXR5IGZvciB0aGF0IGFjdGlvbi4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShwYXN0ZSkKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdGhhdCByZXBsYWNlcyB0aGUgbm90ZSdzIGRhdGEgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcGVyZm9ybVBhc3RlKCkgeworCisgICAgICAgIC8vIEdldHMgYSBoYW5kbGUgdG8gdGhlIENsaXBib2FyZCBNYW5hZ2VyCisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpCisgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAvLyBHZXRzIGEgY29udGVudCByZXNvbHZlciBpbnN0YW5jZQorICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBnZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBjbGlwYm9hcmQgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQKKyAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0PW51bGw7CisgICAgICAgICAgICBTdHJpbmcgdGl0bGU9bnVsbDsKKworICAgICAgICAgICAgLy8gR2V0cyB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBjbGlwYm9hcmQgZGF0YQorICAgICAgICAgICAgQ2xpcERhdGEuSXRlbSBpdGVtID0gY2xpcC5nZXRJdGVtKDApOworCisgICAgICAgICAgICAvLyBUcmllcyB0byBnZXQgdGhlIGl0ZW0ncyBjb250ZW50cyBhcyBhIFVSSSBwb2ludGluZyB0byBhIG5vdGUKKyAgICAgICAgICAgIFVyaSB1cmkgPSBpdGVtLmdldFVyaSgpOworCisgICAgICAgICAgICAvLyBUZXN0cyB0byBzZWUgdGhhdCB0aGUgaXRlbSBhY3R1YWxseSBpcyBhbiBVUkksIGFuZCB0aGF0IHRoZSBVUkkKKyAgICAgICAgICAgIC8vIGlzIGEgY29udGVudCBVUkkgcG9pbnRpbmcgdG8gYSBwcm92aWRlciB3aG9zZSBNSU1FIHR5cGUgaXMgdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIGFzIHRoZSBNSU1FIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBOb3RlIHBhZCBwcm92aWRlci4KKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSVRFTV9UWVBFLmVxdWFscyhjci5nZXRUeXBlKHVyaSkpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2xpcGJvYXJkIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGRhdGEgd2l0aCBhIG5vdGUgTUlNRSB0eXBlLiBUaGlzIGNvcGllcyBpdC4KKyAgICAgICAgICAgICAgICBDdXJzb3Igb3JpZyA9IGNyLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCAgICAgICAgICAgIC8vIFVSSSBmb3IgdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0pFQ1RJT04sICAgICAvLyBHZXQgdGhlIGNvbHVtbnMgcmVmZXJyZWQgdG8gaW4gdGhlIHByb2plY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAvLyBObyBzZWxlY3Rpb24gdmFyaWFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgLy8gTm8gc2VsZWN0aW9uIHZhcmlhYmxlcywgc28gbm8gY3JpdGVyaWEgYXJlIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBDdXJzb3IgaXMgbm90IG51bGwsIGFuZCBpdCBjb250YWlucyBhdCBsZWFzdCBvbmUgcmVjb3JkCisgICAgICAgICAgICAgICAgLy8gKG1vdmVUb0ZpcnN0KCkgcmV0dXJucyB0cnVlKSwgdGhlbiB0aGlzIGdldHMgdGhlIG5vdGUgZGF0YSBmcm9tIGl0LgorICAgICAgICAgICAgICAgIGlmIChvcmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWcubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9yaWcuZ2V0U3RyaW5nKENPTFVNTl9JTkRFWF9OT1RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gb3JpZy5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX1RJVExFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlcyB0aGUgY3Vyc29yLgorICAgICAgICAgICAgICAgICAgICBvcmlnLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB3YXNuJ3QgYSByZWZlcmVuY2UgdG8gYSBub3RlLCB0aGVuCisgICAgICAgICAgICAvLyB0aGlzIGNvbnZlcnRzIHdoYXRldmVyIGl0IGlzIHRvIHRleHQuCisgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGl0ZW0uY29lcmNlVG9UZXh0KHRoaXMpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgbm90ZSB3aXRoIHRoZSByZXRyaWV2ZWQgdGl0bGUgYW5kIHRleHQuCisgICAgICAgICAgICB1cGRhdGVOb3RlKHRleHQsIHRpdGxlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUocGFzdGUpCisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBub3RlIGNvbnRlbnRzIHdpdGggdGhlIHRleHQgYW5kIHRpdGxlIHByb3ZpZGVkIGFzIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgbmV3IG5vdGUgY29udGVudHMgdG8gdXNlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgbmV3IG5vdGUgdGl0bGUgdG8gdXNlCisgICAgICogQHBhcmFtIHVwZGF0ZVRpdGxlIDxlbT50cnVlPC9lbT4gaWYgdGhlIHRpdGxlIHNob3VsZCBiZSB1cGRhdGVkLiBUaGlzIGFsc28gdXBkYXRlcyB0aGUKKyAgICAgKiBtb2RpZmljYXRpb24gdGltZXN0YW1wIHRvIHRoZSBjdXJyZW50IHRpbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHVwZGF0ZU5vdGUoU3RyaW5nIHRleHQsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiB1cGRhdGVUaXRsZSkgeworCisgICAgICAgIC8vIFNldHMgdXAgYSBtYXAgdG8gY29udGFpbiB2YWx1ZXMgdG8gYmUgdXBkYXRlZCBpbiB0aGUgcHJvdmlkZXIuCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKworICAgICAgICAvLyBJZiB1cGRhdGVUaXRsZSBpcyB0cnVlLCBzZXRzIHRoZSBtb2RpZmljYXRpb24gZGF0ZS90aW1lIHN0YW1wIHRvIG5vdy4KKyAgICAgICAgaWYgKHVwZGF0ZVRpdGxlKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGlvbiBpcyB0byBpbnNlcnQgYSBuZXcgbm90ZSwgdGhpcyBjcmVhdGVzIGFuIGluaXRpYWwgdGl0bGUgZm9yIGl0LgorICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTlNFUlQpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIG5vIHRpdGxlIHdhcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVudCwgY3JlYXRlIG9uZSBmcm9tIHRoZSBub3RlIHRleHQuCisgICAgICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vdGUncyBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgdGl0bGUgYnkgZ2V0dGluZyBhIHN1YnN0cmluZyBvZiB0aGUgdGV4dCB0aGF0IGlzIDMxIGNoYXJhY3RlcnMgbG9uZworICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIG5vdGUgcGx1cyBvbmUsIHdoaWNoZXZlciBpcyBzbWFsbGVyLgorICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRleHQuc3Vic3RyaW5nKDAsIE1hdGgubWluKDMwLCBsZW5ndGgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0aW5nIGxlbmd0aCBpcyBtb3JlIHRoYW4gMzAgY2hhcmFjdGVycywgY2hvcHMgb2ZmIGFueQorICAgICAgICAgICAgICAgICAgICAvLyB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDMwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFNwYWNlID0gdGl0bGUubGFzdEluZGV4T2YoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U3BhY2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5zdWJzdHJpbmcoMCwgbGFzdFNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluIHRoZSB2YWx1ZXMgbWFwLCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsIHRpdGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgcHV0cyB0aGUgZGVzaXJlZCBub3RlcyB0ZXh0IGludG8gdGhlIG1hcC4KKyAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUsIHRleHQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZXMgdGhlIHByb3ZpZGVyIHdpdGggdGhlIG5ldyB2YWx1ZXMgaW4gdGhlIG1hcC4gVGhlIExpc3RWaWV3IGlzIHVwZGF0ZWQKKyAgICAgICAgICogYXV0b21hdGljYWxseS4gVGhlIHByb3ZpZGVyIHNldHMgdGhpcyB1cCBieSBzZXR0aW5nIHRoZSBub3RpZmljYXRpb24gVVJJIGZvcgorICAgICAgICAgKiBxdWVyeSBDdXJzb3Igb2JqZWN0cyB0byB0aGUgaW5jb21pbmcgVVJJLiBUaGUgY29udGVudCByZXNvbHZlciBpcyB0aHVzCisgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgd2hlbiB0aGUgQ3Vyc29yIGZvciB0aGUgVVJJIGNoYW5nZXMsIGFuZCB0aGUgVUkgaXMKKyAgICAgICAgICogdXBkYXRlZC4KKyAgICAgICAgICogTm90ZTogVGhpcyBpcyBiZWluZyBkb25lIG9uIHRoZSBVSSB0aHJlYWQuIEl0IHdpbGwgYmxvY2sgdGhlIHRocmVhZCB1bnRpbCB0aGUKKyAgICAgICAgICogdXBkYXRlIGNvbXBsZXRlcy4gSW4gYSBzYW1wbGUgYXBwLCBnb2luZyBhZ2FpbnN0IGEgc2ltcGxlIHByb3ZpZGVyIGJhc2VkIG9uIGEKKyAgICAgICAgICogbG9jYWwgZGF0YWJhc2UsIHRoZSBibG9jayB3aWxsIGJlIG1vbWVudGFyeSwgYnV0IGluIGEgcmVhbCBhcHAgeW91IHNob3VsZCB1c2UKKyAgICAgICAgICogYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyIG9yIGFuZHJvaWQub3MuQXN5bmNUYXNrLgorICAgICAgICAgKi8KKyAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkudXBkYXRlKAorICAgICAgICAgICAgICAgIG1VcmksICAgIC8vIFRoZSBVUkkgZm9yIHRoZSByZWNvcmQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIHZhbHVlcywgIC8vIFRoZSBtYXAgb2YgY29sdW1uIG5hbWVzIGFuZCBuZXcgdmFsdWVzIHRvIGFwcGx5IHRvIHRoZW0uCisgICAgICAgICAgICAgICAgbnVsbCwgICAgLy8gTm8gc2VsZWN0aW9uIGNyaXRlcmlhIGFyZSB1c2VkLCBzbyBubyB3aGVyZSBjb2x1bW5zIGFyZSBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgbnVsbCAgICAgLy8gTm8gd2hlcmUgY29sdW1ucyBhcmUgdXNlZCwgc28gbm8gd2hlcmUgYXJndW1lbnRzIGFyZSBuZWNlc3NhcnkuCisgICAgICAgICAgICApOworCisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhlbHBlciBtZXRob2QgY2FuY2VscyB0aGUgd29yayBkb25lIG9uIGEgbm90ZS4gIEl0IGRlbGV0ZXMgdGhlIG5vdGUgaWYgaXQgd2FzCisgICAgICogbmV3bHkgY3JlYXRlZCwgb3IgcmV2ZXJ0cyB0byB0aGUgb3JpZ2luYWwgdGV4dCBvZiB0aGUgbm90ZSBpCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNhbmNlbE5vdGUoKSB7CisKKyAgICAgICAgLy8gSWYKICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7CiAgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBvcmlnaW5hbCBub3RlIHRleHQgYmFjayBpbnRvIHRoZSBkYXRhYmFzZQogICAgICAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKICAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5OT1RFLCBtT3JpZ2luYWxDb250ZW50KTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgbU9yaWdpbmFsQ29udGVudCk7CiAgICAgICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkudXBkYXRlKG1VcmksIHZhbHVlcywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTlNFUlQpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBpbnNlcnRlZCBhbiBlbXB0eSBub3RlLCBtYWtlIHN1cmUgdG8gZGVsZXRlIGl0CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkLmphdmEKaW5kZXggMDkwODdkYi4uNjI0YmU5MCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZC5qYXZhCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWQuamF2YQpAQCAtMjAsMjUgKzIwLDkyIEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1uczsKIAogLyoqCi0gKiBDb252ZW5pZW5jZSBkZWZpbml0aW9ucyBmb3IgTm90ZVBhZFByb3ZpZGVyCisgKiBEZWZpbmVzIGEgY29udHJhY3QgYmV0d2VlbiB0aGUgTm90ZSBQYWQgY29udGVudCBwcm92aWRlciBhbmQgaXRzIGNsaWVudHMuIEEgY29udHJhY3QgZGVmaW5lcyB0aGUKKyAqIGluZm9ybWF0aW9uIHRoYXQgYSBjbGllbnQgbmVlZHMgdG8gYWNjZXNzIHRoZSBwcm92aWRlciBhcyBvbmUgb3IgbW9yZSBkYXRhIHRhYmxlcy4gQSBjb250cmFjdAorICogaXMgYSBwdWJsaWMsIG5vbi1leHRlbmRhYmxlIChmaW5hbCkgY2xhc3MgdGhhdCBjb250YWlucyBjb25zdGFudHMgZGVmaW5pbmcgY29sdW1uIG5hbWVzIGFuZAorICogVVJJcy4gQSB3ZWxsLXdyaXR0ZW4gY2xpZW50IGRlcGVuZHMgb25seSBvbiB0aGUgY29uc3RhbnRzIGluIHRoZSBjb250cmFjdC4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5vdGVQYWQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uZXhhbXBsZS5ub3RlcGFkLnByb3ZpZGVyLk5vdGVQYWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uZ29vZ2xlLnByb3ZpZGVyLk5vdGVQYWQiOwogCiAgICAgLy8gVGhpcyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0gICAgcHJpdmF0ZSBOb3RlUGFkKCkge30KLSAgICAKKyAgICBwcml2YXRlIE5vdGVQYWQoKSB7CisgICAgfQorCiAgICAgLyoqCi0gICAgICogTm90ZXMgdGFibGUKKyAgICAgKiBOb3RlcyB0YWJsZSBjb250cmFjdAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTm90ZUNvbHVtbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOb3RlcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKwogICAgICAgICAvLyBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgICAgcHJpdmF0ZSBOb3RlQ29sdW1ucygpIHt9CisgICAgICAgIHByaXZhdGUgTm90ZXMoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGFibGUgbmFtZSBvZmZlcmVkIGJ5IHRoaXMgcHJvdmlkZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAibm90ZXMiOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVSSSBkZWZpbml0aW9ucworICAgICAgICAgKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNjaGVtZSBwYXJ0IGZvciB0aGlzIHByb3ZpZGVyJ3MgVVJJCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gImNvbnRlbnQ6Ly8iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXRoIHBhcnRzIGZvciB0aGUgVVJJcworICAgICAgICAgKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogUGF0aCBwYXJ0IGZvciB0aGUgTm90ZXMgVVJJCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9OT1RFUyA9ICIvbm90ZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXRoIHBhcnQgZm9yIHRoZSBOb3RlIElEIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTk9URV9JRCA9ICIvbm90ZXMvIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogMC1yZWxhdGl2ZSBwb3NpdGlvbiBvZiBhIG5vdGUgSUQgc2VnbWVudCBpbiB0aGUgcGF0aCBwYXJ0IG9mIGEgbm90ZSBJRCBVUkkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEVfSURfUEFUSF9QT1NJVElPTiA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdGggcGFydCBmb3IgdGhlIExpdmUgRm9sZGVyIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTElWRV9GT0xERVIgPSAiL2xpdmVfZm9sZGVycy9ub3RlcyI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9ub3RlcyIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9ICBVcmkucGFyc2UoU0NIRU1FICsgQVVUSE9SSVRZICsgUEFUSF9OT1RFUyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50IFVSSSBiYXNlIGZvciBhIHNpbmdsZSBub3RlLiBDYWxsZXJzIG11c3QKKyAgICAgICAgICogYXBwZW5kIGEgbnVtZXJpYyBub3RlIGlkIHRvIHRoaXMgVXJpIHRvIHJldHJpZXZlIGEgbm90ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9JRF9VUklfQkFTRQorICAgICAgICAgICAgPSBVcmkucGFyc2UoU0NIRU1FICsgQVVUSE9SSVRZICsgUEFUSF9OT1RFX0lEKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQgVVJJIG1hdGNoIHBhdHRlcm4gZm9yIGEgc2luZ2xlIG5vdGUsIHNwZWNpZmllZCBieSBpdHMgSUQuIFVzZSB0aGlzIHRvIG1hdGNoCisgICAgICAgICAqIGluY29taW5nIFVSSXMgb3IgdG8gY29uc3RydWN0IGFuIEludGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfSURfVVJJX1BBVFRFUk4KKyAgICAgICAgICAgID0gVXJpLnBhcnNlKFNDSEVNRSArIEFVVEhPUklUWSArIFBBVEhfTk9URV9JRCArICIvIyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudCBVcmkgcGF0dGVybiBmb3IgYSBub3RlcyBsaXN0aW5nIGZvciBsaXZlIGZvbGRlcnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIExJVkVfRk9MREVSX1VSSQorICAgICAgICAgICAgPSBVcmkucGFyc2UoU0NIRU1FICsgQVVUSE9SSVRZICsgUEFUSF9MSVZFX0ZPTERFUik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTUlNRSB0eXBlIGRlZmluaXRpb25zCisgICAgICAgICAqLwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBub3Rlcy4KQEAgLTQ2LDcgKzExMyw4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3ZuZC5nb29nbGUubm90ZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIG5vdGUuCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlCisgICAgICAgICAqIG5vdGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS92bmQuZ29vZ2xlLm5vdGUiOwogCkBAIC01NSwyOCArMTIzLDMyIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAibW9kaWZpZWQgREVTQyI7CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29sdW1uIGRlZmluaXRpb25zCisgICAgICAgICAqLworCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIG5vdGUKKyAgICAgICAgICogQ29sdW1uIG5hbWUgZm9yIHRoZSB0aXRsZSBvZiB0aGUgbm90ZQogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRV9USVRMRSA9ICJ0aXRsZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBub3RlIGl0c2VsZgorICAgICAgICAgKiBDb2x1bW4gbmFtZSBvZiB0aGUgbm90ZSBjb250ZW50CiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFID0gIm5vdGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRV9OT1RFID0gIm5vdGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGltZXN0YW1wIGZvciB3aGVuIHRoZSBub3RlIHdhcyBjcmVhdGVkCisgICAgICAgICAqIENvbHVtbiBuYW1lIGZvciB0aGUgY3JlYXRpb24gdGltZXN0YW1wCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcgZnJvbSBTeXN0ZW0uY3VyZW50VGltZU1pbGxpcygpKTwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURURfREFURSA9ICJjcmVhdGVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUVfQ1JFQVRFX0RBVEUgPSAiY3JlYXRlZCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lc3RhbXAgZm9yIHdoZW4gdGhlIG5vdGUgd2FzIGxhc3QgbW9kaWZpZWQKKyAgICAgICAgICogQ29sdW1uIG5hbWUgZm9yIHRoZSBtb2RpZmljYXRpb24gdGltZXN0YW1wCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcgZnJvbSBTeXN0ZW0uY3VyZW50VGltZU1pbGxpcygpKTwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX0RBVEUgPSAibW9kaWZpZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSA9ICJtb2RpZmllZCI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQppbmRleCA1YzM0OWM1Li4xODM5NjQ1IDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQpAQCAtMTYsMTMgKzE2LDE2IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCi1pbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQuTm90ZUNvbHVtbnM7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwpAQCAtMzAsMjM2ICszMyw3MjAgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5QnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkxpdmVGb2xkZXJzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCiAvKioKICAqIFByb3ZpZGVzIGFjY2VzcyB0byBhIGRhdGFiYXNlIG9mIG5vdGVzLiBFYWNoIG5vdGUgaGFzIGEgdGl0bGUsIHRoZSBub3RlCiAgKiBpdHNlbGYsIGEgY3JlYXRpb24gZGF0ZSBhbmQgYSBtb2RpZmllZCBkYXRhLgogICovCi1wdWJsaWMgY2xhc3MgTm90ZVBhZFByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKLQorcHVibGljIGNsYXNzIE5vdGVQYWRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIFBpcGVEYXRhV3JpdGVyPEN1cnNvcj4geworICAgIC8vIFVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgbG9nZ2luZwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm90ZVBhZFByb3ZpZGVyIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9OQU1FID0gIm5vdGVwYWQuZGIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfVEFCTEVfTkFNRSA9ICJub3RlcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzTm90ZXNQcm9qZWN0aW9uTWFwOwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RFUyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEVfSUQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVZFX0ZPTERFUl9OT1RFUyA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlNYXRjaGVyIHNVcmlNYXRjaGVyOworICAgIC8qKgorICAgICAqIFRoZSBkYXRhYmFzZSB0aGF0IHRoZSBwcm92aWRlciB1c2VzIGFzIGl0cyB1bmRlcmx5aW5nIGRhdGEgc3RvcmUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfTkFNRSA9ICJub3RlX3BhZC5kYiI7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGhlbHBzIG9wZW4sIGNyZWF0ZSwgYW5kIHVwZ3JhZGUgdGhlIGRhdGFiYXNlIGZpbGUuCisgICAgICogVGhlIGRhdGFiYXNlIHZlcnNpb24KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gMjsKIAotICAgICAgICBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIERBVEFCQVNFX05BTUUsIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogQSBwcm9qZWN0aW9uIG1hcCB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGRhdGFiYXNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc05vdGVzUHJvamVjdGlvbk1hcDsKIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKLSAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgTk9URVNfVEFCTEVfTkFNRSArICIgKCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3RlQ29sdW1ucy5fSUQgKyAiIElOVEVHRVIgUFJJTUFSWSBLRVksIgotICAgICAgICAgICAgICAgICAgICArIE5vdGVDb2x1bW5zLlRJVExFICsgIiBURVhULCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3RlQ29sdW1ucy5OT1RFICsgIiBURVhULCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3RlQ29sdW1ucy5DUkVBVEVEX0RBVEUgKyAiIElOVEVHRVIsIgotICAgICAgICAgICAgICAgICAgICArIE5vdGVDb2x1bW5zLk1PRElGSUVEX0RBVEUgKyAiIElOVEVHRVIiCi0gICAgICAgICAgICAgICAgICAgICsgIik7Iik7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBBIHByb2plY3Rpb24gbWFwIHVzZWQgdG8gc2VsZWN0IGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXA7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVcGdyYWRpbmcgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uICIgKyBvbGRWZXJzaW9uICsgIiB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgbmV3VmVyc2lvbiArICIsIHdoaWNoIHdpbGwgZGVzdHJveSBhbGwgb2xkIGRhdGEiKTsKLSAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTIG5vdGVzIik7Ci0gICAgICAgICAgICBvbkNyZWF0ZShkYik7Ci0gICAgICAgIH0KLSAgICB9CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvamVjdGlvbiBmb3IgdGhlIGludGVyZXN0aW5nIGNvbHVtbnMgb2YgYSBub3JtYWwgbm90ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRUFEX05PVEVfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwgICAgICAgICAgICAgICAvLyBQcm9qZWN0aW9uIHBvc2l0aW9uIDAsIHRoZSBub3RlJ3MgaWQKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgIC8vIFByb2plY3Rpb24gcG9zaXRpb24gMSwgdGhlIG5vdGUncyBjb250ZW50CisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCAvLyBQcm9qZWN0aW9uIHBvc2l0aW9uIDIsIHRoZSBub3RlJ3MgdGl0bGUKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX05PVEVfTk9URV9JTkRFWCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfTk9URV9USVRMRV9JTkRFWCA9IDI7CiAKKyAgICAvKgorICAgICAqIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBVcmkgbWF0Y2hlciB0byBjaG9vc2UgYW4gYWN0aW9uIGJhc2VkIG9uIHRoZSBwYXR0ZXJuCisgICAgICogb2YgdGhlIGluY29taW5nIFVSSQorICAgICAqLworICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgTm90ZXMgVVJJIHBhdHRlcm4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9URVMgPSAxOworCisgICAgLy8gVGhlIGluY29taW5nIFVSSSBtYXRjaGVzIHRoZSBOb3RlIElEIFVSSSBwYXR0ZXJuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEVfSUQgPSAyOworCisgICAgLy8gVGhlIGluY29taW5nIFVSSSBtYXRjaGVzIHRoZSBMaXZlIEZvbGRlciBVUkkgcGF0dGVybgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVZFX0ZPTERFUl9OT1RFUyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBIFVyaU1hdGNoZXIgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlNYXRjaGVyIHNVcmlNYXRjaGVyOworCisgICAgLy8gSGFuZGxlIHRvIGEgbmV3IERhdGFiYXNlSGVscGVyLgogICAgIHByaXZhdGUgRGF0YWJhc2VIZWxwZXIgbU9wZW5IZWxwZXI7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKLSAgICAgICAgbU9wZW5IZWxwZXIgPSBuZXcgRGF0YWJhc2VIZWxwZXIoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBIGJsb2NrIHRoYXQgaW5zdGFudGlhdGVzIGFuZCBzZXRzIHN0YXRpYyBvYmplY3RzCisgICAgICovCisgICAgc3RhdGljIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgVVJJIG1hdGNoZXIKKyAgICAgICAgICovCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQorICAgICAgICBzVXJpTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOworCisgICAgICAgIC8vIEFkZCBhIHBhdHRlcm4gdGhhdCByb3V0ZXMgVVJJcyB0ZXJtaW5hdGVkIHdpdGggIm5vdGVzIiB0byBhIE5PVEVTIG9wZXJhdGlvbgorICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJub3RlcyIsIE5PVEVTKTsKKworICAgICAgICAvLyBBZGQgYSBwYXR0ZXJuIHRoYXQgcm91dGVzIFVSSXMgdGVybWluYXRlZCB3aXRoICJub3RlcyIgcGx1cyBhbiBpbnRlZ2VyCisgICAgICAgIC8vIHRvIGEgbm90ZSBJRCBvcGVyYXRpb24KKyAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibm90ZXMvIyIsIE5PVEVfSUQpOworCisgICAgICAgIC8vIEFkZCBhIHBhdHRlcm4gdGhhdCByb3V0ZXMgVVJJcyB0ZXJtaW5hdGVkIHdpdGggbGl2ZV9mb2xkZXJzL25vdGVzIHRvIGEKKyAgICAgICAgLy8gbGl2ZSBmb2xkZXIgb3BlcmF0aW9uCisgICAgICAgIHNVcmlNYXRjaGVyLmFkZFVSSShOb3RlUGFkLkFVVEhPUklUWSwgImxpdmVfZm9sZGVycy9ub3RlcyIsIExJVkVfRk9MREVSX05PVEVTKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHByb2plY3Rpb24gbWFwIHRoYXQgcmV0dXJucyBhbGwgY29sdW1ucworICAgICAgICAgKi8KKworICAgICAgICAvLyBDcmVhdGVzIGEgbmV3IHByb2plY3Rpb24gbWFwIGluc3RhbmNlLiBUaGUgbWFwIHJldHVybnMgYSBjb2x1bW4gbmFtZQorICAgICAgICAvLyBnaXZlbiBhIHN0cmluZy4gVGhlIHR3byBhcmUgdXN1YWxseSBlcXVhbC4KKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgICAgIC8vIE1hcHMgdGhlIHN0cmluZyAiX0lEIiB0byB0aGUgY29sdW1uIG5hbWUgIl9JRCIKKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZVBhZC5Ob3Rlcy5fSUQsIE5vdGVQYWQuTm90ZXMuX0lEKTsKKworICAgICAgICAvLyBNYXBzICJ0aXRsZSIgdG8gInRpdGxlIgorICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFKTsKKworICAgICAgICAvLyBNYXBzICJub3RlIiB0byAibm90ZSIKKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUpOworCisgICAgICAgIC8vIE1hcHMgImNyZWF0ZWQiIHRvICJjcmVhdGVkIgorICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFLAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfQ1JFQVRFX0RBVEUpOworCisgICAgICAgIC8vIE1hcHMgIm1vZGlmaWVkIiB0byAibW9kaWZpZWQiCisgICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsCisgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhbiBpbml0aWFsaXplcyBhIHByb2plY3Rpb24gbWFwIGZvciBoYW5kbGluZyBMaXZlIEZvbGRlcnMKKyAgICAgICAgICovCisKKyAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBwcm9qZWN0aW9uIG1hcCBpbnN0YW5jZQorICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICAvLyBNYXBzICJfSUQiIHRvICJfSUQgQVMgX0lEIiBmb3IgYSBsaXZlIGZvbGRlcgorICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAucHV0KExpdmVGb2xkZXJzLl9JRCwgTm90ZVBhZC5Ob3Rlcy5fSUQgKyAiIEFTICIgKyBMaXZlRm9sZGVycy5fSUQpOworCisgICAgICAgIC8vIE1hcHMgIk5BTUUiIHRvICJ0aXRsZSBBUyBOQU1FIgorICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAucHV0KExpdmVGb2xkZXJzLk5BTUUsIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiIEFTICIgKworICAgICAgICAgICAgTGl2ZUZvbGRlcnMuTkFNRSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBTUUxpdGVRdWVyeUJ1aWxkZXIgcWIgPSBuZXcgU1FMaXRlUXVlcnlCdWlsZGVyKCk7Ci0gICAgICAgIHFiLnNldFRhYmxlcyhOT1RFU19UQUJMRV9OQU1FKTsKKyAgICAvKioKKyAgICAqCisgICAgKiBUaGlzIGNsYXNzIGhlbHBzIG9wZW4sIGNyZWF0ZSwgYW5kIHVwZ3JhZGUgdGhlIGRhdGFiYXNlIGZpbGUuIFNldCB0byBwYWNrYWdlIHZpc2liaWxpdHkKKyAgICAqIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICovCisgICBzdGF0aWMgY2xhc3MgRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKIAorICAgICAgIERhdGFiYXNlSGVscGVyKENvbnRleHQgY29udGV4dCkgeworCisgICAgICAgICAgIC8vIGNhbGxzIHRoZSBzdXBlciBjb25zdHJ1Y3RvciwgcmVxdWVzdGluZyB0aGUgZGVmYXVsdCBjdXJzb3IgZmFjdG9yeS4KKyAgICAgICAgICAgc3VwZXIoY29udGV4dCwgREFUQUJBU0VfTkFNRSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CisgICAgICAgfQorCisgICAgICAgLyoqCisgICAgICAgICoKKyAgICAgICAgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHdpdGggdGFibGUgbmFtZSBhbmQgY29sdW1uIG5hbWVzIHRha2VuIGZyb20gdGhlCisgICAgICAgICogTm90ZVBhZCBjbGFzcy4KKyAgICAgICAgKi8KKyAgICAgICBAT3ZlcnJpZGUKKyAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICBkYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSArICIgKCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuX0lEICsgIiBJTlRFR0VSIFBSSU1BUlkgS0VZLCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiIFRFWFQsIgorICAgICAgICAgICAgICAgICAgICsgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFICsgIiBURVhULCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfQ1JFQVRFX0RBVEUgKyAiIElOVEVHRVIsIgorICAgICAgICAgICAgICAgICAgICsgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSArICIgSU5URUdFUiIKKyAgICAgICAgICAgICAgICAgICArICIpOyIpOworICAgICAgIH0KKworICAgICAgIC8qKgorICAgICAgICAqCisgICAgICAgICogRGVtb25zdHJhdGVzIHRoYXQgdGhlIHByb3ZpZGVyIG11c3QgY29uc2lkZXIgd2hhdCBoYXBwZW5zIHdoZW4gdGhlCisgICAgICAgICogdW5kZXJseWluZyBkYXRhc3RvcmUgaXMgY2hhbmdlZC4gSW4gdGhpcyBzYW1wbGUsIHRoZSBkYXRhYmFzZSBpcyB1cGdyYWRlZCB0aGUgZGF0YWJhc2UKKyAgICAgICAgKiBieSBkZXN0cm95aW5nIHRoZSBleGlzdGluZyBkYXRhLgorICAgICAgICAqIEEgcmVhbCBhcHBsaWNhdGlvbiBzaG91bGQgdXBncmFkZSB0aGUgZGF0YWJhc2UgaW4gcGxhY2UuCisgICAgICAgICovCisgICAgICAgQE92ZXJyaWRlCisgICAgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHsKKworICAgICAgICAgICAvLyBMb2dzIHRoYXQgdGhlIGRhdGFiYXNlIGlzIGJlaW5nIHVwZ3JhZGVkCisgICAgICAgICAgIExvZy53KFRBRywgIlVwZ3JhZGluZyBkYXRhYmFzZSBmcm9tIHZlcnNpb24gIiArIG9sZFZlcnNpb24gKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICArIG5ld1ZlcnNpb24gKyAiLCB3aGljaCB3aWxsIGRlc3Ryb3kgYWxsIG9sZCBkYXRhIik7CisKKyAgICAgICAgICAgLy8gS2lsbHMgdGhlIHRhYmxlIGFuZCBleGlzdGluZyBkYXRhCisgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTIG5vdGVzIik7CisKKyAgICAgICAgICAgLy8gUmVjcmVhdGVzIHRoZSBkYXRhYmFzZSB3aXRoIGEgbmV3IHZlcnNpb24KKyAgICAgICAgICAgb25DcmVhdGUoZGIpOworICAgICAgIH0KKyAgIH0KKworICAgLyoqCisgICAgKgorICAgICogSW5pdGlhbGl6ZXMgdGhlIHByb3ZpZGVyIGJ5IGNyZWF0aW5nIGEgbmV3IERhdGFiYXNlSGVscGVyLiBvbkNyZWF0ZSgpIGlzIGNhbGxlZAorICAgICogYXV0b21hdGljYWxseSB3aGVuIEFuZHJvaWQgY3JlYXRlcyB0aGUgcHJvdmlkZXIgaW4gcmVzcG9uc2UgdG8gYSByZXNvbHZlciByZXF1ZXN0IGZyb20gYQorICAgICogY2xpZW50LgorICAgICovCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworCisgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBoZWxwZXIgb2JqZWN0LiBOb3RlIHRoYXQgdGhlIGRhdGFiYXNlIGl0c2VsZiBpc24ndCBvcGVuZWQgdW50aWwKKyAgICAgICAvLyBzb21ldGhpbmcgdHJpZXMgdG8gYWNjZXNzIGl0LCBhbmQgaXQncyBvbmx5IGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICAgICAgIG1PcGVuSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKGdldENvbnRleHQoKSk7CisKKyAgICAgICAvLyBBc3N1bWVzIHRoYXQgYW55IGZhaWx1cmVzIHdpbGwgYmUgcmVwb3J0ZWQgYnkgYSB0aHJvd24gZXhjZXB0aW9uLgorICAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICAvKioKKyAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGNhbGxzCisgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfS4KKyAgICAqIFF1ZXJpZXMgdGhlIGRhdGFiYXNlIGFuZCByZXR1cm5zIGEgY3Vyc29yIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMuCisgICAgKgorICAgICogQHJldHVybiBBIGN1cnNvciBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS4gVGhlIGN1cnNvciBleGlzdHMgYnV0IGlzIGVtcHR5IGlmCisgICAgKiB0aGUgcXVlcnkgcmV0dXJucyBubyByZXN1bHRzIG9yIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKKworICAgICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgcXVlcnkgYnVpbGRlciBhbmQgc2V0cyBpdHMgdGFibGUgbmFtZQorICAgICAgIFNRTGl0ZVF1ZXJ5QnVpbGRlciBxYiA9IG5ldyBTUUxpdGVRdWVyeUJ1aWxkZXIoKTsKKyAgICAgICBxYi5zZXRUYWJsZXMoTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FKTsKKworICAgICAgIC8qKgorICAgICAgICAqIENob29zZSB0aGUgcHJvamVjdGlvbiBhbmQgYWRqdXN0IHRoZSAid2hlcmUiIGNsYXVzZSBiYXNlZCBvbiBVUkkgcGF0dGVybi1tYXRjaGluZy4KKyAgICAgICAgKi8KKyAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKKyAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIFVSSSBpcyBmb3Igbm90ZXMsIGNob29zZXMgdGhlIE5vdGVzIHByb2plY3Rpb24KKyAgICAgICAgICAgY2FzZSBOT1RFUzoKKyAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc05vdGVzUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAvKiBJZiB0aGUgaW5jb21pbmcgVVJJIGlzIGZvciBhIHNpbmdsZSBub3RlIGlkZW50aWZpZWQgYnkgaXRzIElELCBjaG9vc2VzIHRoZQorICAgICAgICAgICAgKiBub3RlIElEIHByb2plY3Rpb24sIGFuZCBhcHBlbmRzICJfSUQgPSA8bm90ZUlEPiIgdG8gdGhlIHdoZXJlIGNsYXVzZSwgc28gdGhhdAorICAgICAgICAgICAgKiBpdCBzZWxlY3RzIHRoYXQgc2luZ2xlIG5vdGUKKyAgICAgICAgICAgICovCisgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc05vdGVzUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICBxYi5hcHBlbmRXaGVyZSgKKyAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCArICAgIC8vIHRoZSBuYW1lIG9mIHRoZSBJRCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAiPSIgKworICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm90ZSBJRCBpdHNlbGYgaW4gdGhlIGluY29taW5nIFVSSQorICAgICAgICAgICAgICAgICAgIHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoTm90ZVBhZC5Ob3Rlcy5OT1RFX0lEX1BBVEhfUE9TSVRJT04pKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTElWRV9GT0xERVJfTk9URVM6CisgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIGlzIGZyb20gYSBsaXZlIGZvbGRlciwgY2hvb3NlcyB0aGUgbGl2ZSBmb2xkZXIgcHJvamVjdGlvbi4KKyAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAvLyBJZiB0aGUgVVJJIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBrbm93biBwYXR0ZXJucywgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgfQorCisKKyAgICAgICBTdHJpbmcgb3JkZXJCeTsKKyAgICAgICAvLyBJZiBubyBzb3J0IG9yZGVyIGlzIHNwZWNpZmllZCwgdXNlcyB0aGUgZGVmYXVsdAorICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzb3J0T3JkZXIpKSB7CisgICAgICAgICAgIG9yZGVyQnkgPSBOb3RlUGFkLk5vdGVzLkRFRkFVTFRfU09SVF9PUkRFUjsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZXMgdGhlIGluY29taW5nIHNvcnQgb3JkZXIKKyAgICAgICAgICAgb3JkZXJCeSA9IHNvcnRPcmRlcjsKKyAgICAgICB9CisKKyAgICAgICAvLyBPcGVucyB0aGUgZGF0YWJhc2Ugb2JqZWN0IGluICJyZWFkIiBtb2RlLCBzaW5jZSBubyB3cml0ZXMgbmVlZCB0byBiZSBkb25lLgorICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworCisgICAgICAgLyoKKyAgICAgICAgKiBQZXJmb3JtcyB0aGUgcXVlcnkuIElmIG5vIHByb2JsZW1zIG9jY3VyIHRyeWluZyB0byByZWFkIHRoZSBkYXRhYmFzZSwgdGhlbiBhIEN1cnNvcgorICAgICAgICAqIG9iamVjdCBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCB0aGUgY3Vyc29yIHZhcmlhYmxlIGNvbnRhaW5zIG51bGwuIElmIG5vIHJlY29yZHMgd2VyZQorICAgICAgICAqIHNlbGVjdGVkLCB0aGVuIHRoZSBDdXJzb3Igb2JqZWN0IGlzIGVtcHR5LCBhbmQgQ3Vyc29yLmdldENvdW50KCkgcmV0dXJucyAwLgorICAgICAgICAqLworICAgICAgIEN1cnNvciBjID0gcWIucXVlcnkoCisgICAgICAgICAgIGRiLCAgICAgICAgICAgIC8vIFRoZSBkYXRhYmFzZSB0byBxdWVyeQorICAgICAgICAgICBwcm9qZWN0aW9uLCAgICAvLyBUaGUgY29sdW1ucyB0byByZXR1cm4gZnJvbSB0aGUgcXVlcnkKKyAgICAgICAgICAgc2VsZWN0aW9uLCAgICAgLy8gVGhlIGNvbHVtbnMgZm9yIHRoZSB3aGVyZSBjbGF1c2UKKyAgICAgICAgICAgc2VsZWN0aW9uQXJncywgLy8gVGhlIHZhbHVlcyBmb3IgdGhlIHdoZXJlIGNsYXVzZQorICAgICAgICAgICBudWxsLCAgICAgICAgICAvLyBkb24ndCBncm91cCB0aGUgcm93cworICAgICAgICAgICBudWxsLCAgICAgICAgICAvLyBkb24ndCBmaWx0ZXIgYnkgcm93IGdyb3VwcworICAgICAgICAgICBvcmRlckJ5ICAgICAgICAvLyBUaGUgc29ydCBvcmRlcgorICAgICAgICk7CisKKyAgICAgICAvLyBUZWxscyB0aGUgQ3Vyc29yIHdoYXQgVVJJIHRvIHdhdGNoLCBzbyBpdCBrbm93cyB3aGVuIGl0cyBzb3VyY2UgZGF0YSBjaGFuZ2VzCisgICAgICAgYy5zZXROb3RpZmljYXRpb25VcmkoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLCB1cmkpOworICAgICAgIHJldHVybiBjOworICAgfQorCisgICAvKioKKyAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgY2FsbHMge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjZ2V0VHlwZShVcmkpfS4KKyAgICAqIFJldHVybnMgdGhlIE1JTUUgZGF0YSB0eXBlIG9mIHRoZSBVUkkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuCisgICAgKgorICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIE1JTUUgdHlwZSBpcyBkZXNpcmVkLgorICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBVUkkuCisgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworCisgICAgICAgLyoqCisgICAgICAgICogQ2hvb3NlcyB0aGUgTUlNRSB0eXBlIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybgorICAgICAgICAqLworICAgICAgIHN3aXRjaCAoc1VyaU1hdGNoZXIubWF0Y2godXJpKSkgeworCisgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlcyBvciBsaXZlIGZvbGRlcnMsIHJldHVybnMgdGhlIGdlbmVyYWwgY29udGVudCB0eXBlLgorICAgICAgICAgICBjYXNlIE5PVEVTOgorICAgICAgICAgICBjYXNlIExJVkVfRk9MREVSX05PVEVTOgorICAgICAgICAgICAgICAgcmV0dXJuIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9UWVBFOworCisgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlIElEcywgcmV0dXJucyB0aGUgbm90ZSBJRCBjb250ZW50IHR5cGUuCisgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgIHJldHVybiBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSVRFTV9UWVBFOworCisgICAgICAgICAgIC8vIElmIHRoZSBVUkkgcGF0dGVybiBkb2Vzbid0IG1hdGNoIGFueSBwZXJtaXR0ZWQgcGF0dGVybnMsIHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICB9CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoc3RyZWFtKQorICAgIC8qKgorICAgICAqIFRoaXMgZGVzY3JpYmVzIHRoZSBNSU1FIHR5cGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBmb3Igb3BlbmluZyBhIG5vdGUKKyAgICAgKiBVUkkgYXMgYSBzdHJlYW0uCisgICAgICovCisgICAgc3RhdGljIENsaXBEZXNjcmlwdGlvbiBOT1RFX1NUUkVBTV9UWVBFUyA9IG5ldyBDbGlwRGVzY3JpcHRpb24obnVsbCwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENsaXBEZXNjcmlwdGlvbi5NSU1FVFlQRV9URVhUX1BMQUlOIH0pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZXMgb2YgYXZhaWxhYmxlIGRhdGEgc3RyZWFtcy4gIFVSSXMgdG8gc3BlY2lmaWMgbm90ZXMgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnZlcnQgc3VjaCBhIG5vdGUgdG8gYSBwbGFpbiB0ZXh0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byBhbmFseXplCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSBNSU1FIHR5cGUgdG8gY2hlY2sgZm9yLiBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMgYSBkYXRhIHN0cmVhbQorICAgICAqIHR5cGUgZm9yIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyLiBDdXJyZW50bHksIG9ubHkgdGV4dC9wbGFpbiBNSU1FIHR5cGVzIG1hdGNoLgorICAgICAqIEByZXR1cm4gYSBkYXRhIHN0cmVhbSBNSU1FIHR5cGUuIEN1cnJlbnRseSwgb25seSB0ZXh0L3BsYW4gaXMgcmV0dXJuZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIFVSSSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2ggYW55IHN1cHBvcnRlZCBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiAgQ2hvb3NlcyB0aGUgZGF0YSBzdHJlYW0gdHlwZSBiYXNlZCBvbiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4uCisgICAgICAgICAqLwogICAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgY2FzZSBOT1RFUzoKLSAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc05vdGVzUHJvamVjdGlvbk1hcCk7Ci0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIE5PVEVfSUQ6Ci0gICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNOb3Rlc1Byb2plY3Rpb25NYXApOwotICAgICAgICAgICAgcWIuYXBwZW5kV2hlcmUoTm90ZUNvbHVtbnMuX0lEICsgIj0iICsgdXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlcyBvciBsaXZlIGZvbGRlcnMsIHJldHVybiBudWxsLiBEYXRhIHN0cmVhbXMgYXJlIG5vdAorICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGZvciB0aGlzIHR5cGUgb2YgVVJJLgorICAgICAgICAgICAgY2FzZSBOT1RFUzoKKyAgICAgICAgICAgIGNhc2UgTElWRV9GT0xERVJfTk9URVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgY2FzZSBMSVZFX0ZPTERFUl9OT1RFUzoKLSAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gSWYgdGhlIHBhdHRlcm4gaXMgZm9yIG5vdGUgSURzIGFuZCB0aGUgTUlNRSBmaWx0ZXIgaXMgdGV4dC9wbGFpbiwgdGhlbiByZXR1cm4KKyAgICAgICAgICAgIC8vIHRleHQvcGxhaW4KKyAgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9URV9TVFJFQU1fVFlQRVMuZmlsdGVyTWltZVR5cGVzKG1pbWVUeXBlRmlsdGVyKTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBubyBzb3J0IG9yZGVyIGlzIHNwZWNpZmllZCB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgU3RyaW5nIG9yZGVyQnk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzb3J0T3JkZXIpKSB7Ci0gICAgICAgICAgICBvcmRlckJ5ID0gTm90ZUNvbHVtbnMuREVGQVVMVF9TT1JUX09SREVSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3JkZXJCeSA9IHNvcnRPcmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgZGF0YWJhc2UgYW5kIHJ1biB0aGUgcXVlcnkKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7Ci0gICAgICAgIEN1cnNvciBjID0gcWIucXVlcnkoZGIsIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCwgbnVsbCwgb3JkZXJCeSk7Ci0KLSAgICAgICAgLy8gVGVsbCB0aGUgY3Vyc29yIHdoYXQgdXJpIHRvIHdhdGNoLCBzbyBpdCBrbm93cyB3aGVuIGl0cyBzb3VyY2UgZGF0YSBjaGFuZ2VzCi0gICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uVXJpKGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwgdXJpKTsKLSAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFVSSSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2ggYW55IHBlcm1pdHRlZCBwYXR0ZXJucywgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICB9CiAgICAgfQogCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIG9mIGRhdGEgZm9yIGVhY2ggc3VwcG9ydGVkIHN0cmVhbSB0eXBlLiBUaGlzIG1ldGhvZCBkb2VzIGEgcXVlcnkgb24gdGhlCisgICAgICogaW5jb21pbmcgVVJJLCB0aGVuIHVzZXMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNvcGVuUGlwZUhlbHBlcihVcmksIFN0cmluZywgQnVuZGxlLCBPYmplY3QsCisgICAgICogUGlwZURhdGFXcml0ZXIpfSB0byBzdGFydCBhbm90aGVyIHRocmVhZCBpbiB3aGljaCB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgcGF0dGVybiB0aGF0IHBvaW50cyB0byB0aGUgZGF0YSBzdHJlYW0KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgQSBTdHJpbmcgY29udGFpbmluZyBhIE1JTUUgdHlwZS4gVGhpcyBtZXRob2QgdHJpZXMgdG8gZ2V0IGEgc3RyZWFtIG9mCisgICAgICogZGF0YSB3aXRoIHRoaXMgTUlNRSB0eXBlLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgb3B0aW9ucyBzdXBwbGllZCBieSB0aGUgY2FsbGVyLiAgQ2FuIGJlIGludGVycHJldGVkIGFzCisgICAgICogZGVzaXJlZCBieSB0aGUgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIEFzc2V0RmlsZURlc2NyaXB0b3IgQSBoYW5kbGUgdG8gdGhlIGZpbGUuCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGluY29taW5nIFVSSS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgewotICAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgY2FzZSBOT1RFUzoKLSAgICAgICAgY2FzZSBMSVZFX0ZPTERFUl9OT1RFUzoKLSAgICAgICAgICAgIHJldHVybiBOb3RlQ29sdW1ucy5DT05URU5UX1RZUEU7CisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlciwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAotICAgICAgICBjYXNlIE5PVEVfSUQ6Ci0gICAgICAgICAgICByZXR1cm4gTm90ZUNvbHVtbnMuQ09OVEVOVF9JVEVNX1RZUEU7CisgICAgICAgIC8vIENoZWNrcyB0byBzZWUgaWYgdGhlIE1JTUUgdHlwZSBmaWx0ZXIgbWF0Y2hlcyBhIHN1cHBvcnRlZCBNSU1FIHR5cGUuCisgICAgICAgIFN0cmluZ1tdIG1pbWVUeXBlcyA9IGdldFN0cmVhbVR5cGVzKHVyaSwgbWltZVR5cGVGaWx0ZXIpOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgLy8gSWYgdGhlIE1JTUUgdHlwZSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKG1pbWVUeXBlcyAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFJldHJpZXZlcyB0aGUgbm90ZSBmb3IgdGhpcyBVUkkuIFVzZXMgdGhlIHF1ZXJ5IG1ldGhvZCBkZWZpbmVkIGZvciB0aGlzIHByb3ZpZGVyLAorICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGRhdGFiYXNlIHF1ZXJ5IG1ldGhvZC4KKyAgICAgICAgICAgIEN1cnNvciBjID0gcXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHVyaSwgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBVUkkgb2YgYSBub3RlCisgICAgICAgICAgICAgICAgICAgIFJFQURfTk9URV9QUk9KRUNUSU9OLCAgIC8vIEdldHMgYSBwcm9qZWN0aW9uIGNvbnRhaW5pbmcgdGhlIG5vdGUncyBJRCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb250ZW50cworICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAvLyBObyBXSEVSRSBjbGF1c2UsIGdldCBhbGwgbWF0Y2hpbmcgcmVjb3JkcworICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBubyBXSEVSRSBjbGF1c2UsIG5vIHNlbGVjdGlvbiBjcml0ZXJpYQorICAgICAgICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc29ydCBvcmRlciAobW9kaWZpY2F0aW9uIGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NlbmRpbmcKKyAgICAgICAgICAgICk7CisKKworICAgICAgICAgICAgLy8gSWYgdGhlIHF1ZXJ5IGZhaWxzIG9yIHRoZSBjdXJzb3IgaXMgZW1wdHksIHN0b3AKKyAgICAgICAgICAgIGlmIChjID09IG51bGwgfHwgIWMubW92ZVRvRmlyc3QoKSkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBlbXB0eSwgc2ltcGx5IGNsb3NlIHRoZSBjdXJzb3IgYW5kIHJldHVybgorICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgbnVsbCwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHF1ZXJ5ICIgKyB1cmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdGFydCBhIG5ldyB0aHJlYWQgdGhhdCBwaXBlcyB0aGUgc3RyZWFtIGRhdGEgYmFjayB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBvcGVuUGlwZUhlbHBlcih1cmksIG1pbWVUeXBlc1swXSwgb3B0cywgYywgdGhpcyksIDAsCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IuVU5LTk9XTl9MRU5HVEgpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIE1JTUUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm4gYSByZWFkLW9ubHkgaGFuZGxlIHRvIHRoZSBmaWxlLgorICAgICAgICByZXR1cm4gc3VwZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGVGaWx0ZXIsIG9wdHMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyfQorICAgICAqIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCB3b3JrIG9mIGNvbnZlcnRpbmcgdGhlIGRhdGEgaW4gb25lIG9mIGN1cnNvcnMgdG8gYQorICAgICAqIHN0cmVhbSBvZiBkYXRhIGZvciB0aGUgY2xpZW50IHRvIHJlYWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhVG9QaXBlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwgVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgQnVuZGxlIG9wdHMsIEN1cnNvciBjKSB7CisgICAgICAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgY29udmVyc2lvbi10by10ZXh0IGZyb20gYSBzaW5nbGUgbm90ZSBlbnRyeSwKKyAgICAgICAgLy8gc28gbm8gbmVlZCBmb3IgY3Vyc29yIGRhdGEgdHlwZSBjaGVja2luZyBoZXJlLgorICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm91dCwgIlVURi04IikpOworICAgICAgICAgICAgcHcucHJpbnRsbihjLmdldFN0cmluZyhSRUFEX05PVEVfVElUTEVfSU5ERVgpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOworICAgICAgICAgICAgcHcucHJpbnRsbihjLmdldFN0cmluZyhSRUFEX05PVEVfTk9URV9JTkRFWCkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIk9vb3BzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoc3RyZWFtKQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjYWxscworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI2luc2VydChVcmksIENvbnRlbnRWYWx1ZXMpfS4KKyAgICAgKiBJbnNlcnRzIGEgbmV3IHJvdyBpbnRvIHRoZSBkYXRhYmFzZS4gVGhpcyBtZXRob2Qgc2V0cyB1cCBkZWZhdWx0IHZhbHVlcyBmb3IgYW55CisgICAgICogY29sdW1ucyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGluY29taW5nIG1hcC4KKyAgICAgKiBJZiByb3dzIHdlcmUgaW5zZXJ0ZWQsIHRoZW4gbGlzdGVuZXJzIGFyZSBub3RpZmllZCBvZiB0aGUgY2hhbmdlLgorICAgICAqIEByZXR1cm4gVGhlIHJvdyBJRCBvZiB0aGUgaW5zZXJ0ZWQgcm93LgorICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGlmIHRoZSBpbnNlcnRpb24gZmFpbHMuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKSB7Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgdXJpCisKKyAgICAgICAgLy8gVmFsaWRhdGVzIHRoZSBpbmNvbWluZyBVUkkuIE9ubHkgdGhlIGZ1bGwgcHJvdmlkZXIgVVJJIGlzIGFsbG93ZWQgZm9yIGluc2VydHMuCiAgICAgICAgIGlmIChzVXJpTWF0Y2hlci5tYXRjaCh1cmkpICE9IE5PVEVTKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEEgbWFwIHRvIGhvbGQgdGhlIG5ldyByZWNvcmQncyB2YWx1ZXMuCiAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzOworCisgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyB2YWx1ZXMgbWFwIGlzIG5vdCBudWxsLCB1c2VzIGl0IGZvciB0aGUgbmV3IHZhbHVlcy4KICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoaW5pdGlhbFZhbHVlcyk7CisKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IHZhbHVlIG1hcAogICAgICAgICAgICAgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgIExvbmcgbm93ID0gTG9uZy52YWx1ZU9mKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmllbGRzIGFyZSBhbGwgc2V0Ci0gICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZUNvbHVtbnMuQ1JFQVRFRF9EQVRFKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5DUkVBVEVEX0RBVEUsIG5vdyk7CisgICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgbWFwIGRvZXNuJ3QgY29udGFpbiB0aGUgY3JlYXRpb24gZGF0ZSwgc2V0cyB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFLCBub3cpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFLCBub3cpOworICAgICAgICAvLyBJZiB0aGUgdmFsdWVzIG1hcCBkb2Vzbid0IGNvbnRhaW4gdGhlIG1vZGlmaWNhdGlvbiBkYXRlLCBzZXRzIHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudAorICAgICAgICAvLyB0aW1lLgorICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUpID09IGZhbHNlKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsIG5vdyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVDb2x1bW5zLlRJVExFKSA9PSBmYWxzZSkgeworICAgICAgICAvLyBJZiB0aGUgdmFsdWVzIG1hcCBkb2Vzbid0IGNvbnRhaW4gYSB0aXRsZSwgc2V0cyB0aGUgdmFsdWUgdG8gdGhlIGRlZmF1bHQgdGl0bGUuCisgICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIFJlc291cmNlcyByID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpOwotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5USVRMRSwgci5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0cmluZy51bnRpdGxlZCkpOworICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCByLmdldFN0cmluZyhhbmRyb2lkLlIuc3RyaW5nLnVudGl0bGVkKSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVDb2x1bW5zLk5PVEUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVDb2x1bW5zLk5PVEUsICIiKTsKKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluIG5vdGUgdGV4dCwgc2V0cyB0aGUgdmFsdWUgdG8gYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCAiIik7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBPcGVucyB0aGUgZGF0YWJhc2Ugb2JqZWN0IGluICJ3cml0ZSIgbW9kZS4KICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7Ci0gICAgICAgIGxvbmcgcm93SWQgPSBkYi5pbnNlcnQoTk9URVNfVEFCTEVfTkFNRSwgTm90ZUNvbHVtbnMuTk9URSwgdmFsdWVzKTsKKworICAgICAgICAvLyBQZXJmb3JtcyB0aGUgaW5zZXJ0IGFuZCByZXR1cm5zIHRoZSBJRCBvZiB0aGUgbmV3IG5vdGUuCisgICAgICAgIGxvbmcgcm93SWQgPSBkYi5pbnNlcnQoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsICAgICAgICAvLyBUaGUgdGFibGUgdG8gaW5zZXJ0IGludG8uCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUsICAvLyBBIGhhY2ssIFNRTGl0ZSBzZXRzIHRoaXMgY29sdW1uIHZhbHVlIHRvIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlcyBpcyBlbXB0eS4KKyAgICAgICAgICAgIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWFwIG9mIGNvbHVtbiBuYW1lcywgYW5kIHRoZSB2YWx1ZXMgdG8gaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBjb2x1bW5zLgorICAgICAgICApOworCisgICAgICAgIC8vIElmIHRoZSBpbnNlcnQgc3VjY2VlZGVkLCB0aGUgcm93IElEIGV4aXN0cy4KICAgICAgICAgaWYgKHJvd0lkID4gMCkgewotICAgICAgICAgICAgVXJpIG5vdGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChOb3RlQ29sdW1ucy5DT05URU5UX1VSSSwgcm93SWQpOworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIFVSSSB3aXRoIHRoZSBub3RlIElEIHBhdHRlcm4gYW5kIHRoZSBuZXcgcm93IElEIGFwcGVuZGVkIHRvIGl0LgorICAgICAgICAgICAgVXJpIG5vdGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX0JBU0UsIHJvd0lkKTsKKworICAgICAgICAgICAgLy8gTm90aWZpZXMgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGlzIHByb3ZpZGVyIHRoYXQgdGhlIGRhdGEgY2hhbmdlZC4KICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2Uobm90ZVVyaSwgbnVsbCk7CiAgICAgICAgICAgICByZXR1cm4gbm90ZVVyaTsKICAgICAgICAgfQogCisgICAgICAgIC8vIElmIHRoZSBpbnNlcnQgZGlkbid0IHN1Y2NlZWQsIHRoZW4gdGhlIHJvd0lEIGlzIDw9IDAuIFRocm93cyBhbiBleGNlcHRpb24uCiAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIkZhaWxlZCB0byBpbnNlcnQgcm93IGludG8gIiArIHVyaSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjYWxscworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI2RlbGV0ZShVcmksIFN0cmluZywgU3RyaW5nW10pfS4KKyAgICAgKiBEZWxldGVzIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2UuIElmIHRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgbm90ZSBJRCBVUkkgcGF0dGVybiwKKyAgICAgKiB0aGlzIG1ldGhvZCBkZWxldGVzIHRoZSBvbmUgcmVjb3JkIHNwZWNpZmllZCBieSB0aGUgSUQgaW4gdGhlIFVSSS4gT3RoZXJ3aXNlLCBpdCBkZWxldGVzIGEKKyAgICAgKiBhIHNldCBvZiByZWNvcmRzLiBUaGUgcmVjb3JkIG9yIHJlY29yZHMgbXVzdCBhbHNvIG1hdGNoIHRoZSBpbnB1dCBzZWxlY3Rpb24gY3JpdGVyaWEKKyAgICAgKiBzcGVjaWZpZWQgYnkgd2hlcmUgYW5kIHdoZXJlQXJncy4KKyAgICAgKgorICAgICAqIElmIHJvd3Mgd2VyZSBkZWxldGVkLCB0aGVuIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBAcmV0dXJuIElmIGEgIndoZXJlIiBjbGF1c2UgaXMgdXNlZCwgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGlzIHJldHVybmVkLCBvdGhlcndpc2UKKyAgICAgKiAwIGlzIHJldHVybmVkLiBUbyBkZWxldGUgYWxsIHJvd3MgYW5kIGdldCBhIHJvdyBjb3VudCwgdXNlICIxIiBhcyB0aGUgd2hlcmUgY2xhdXNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybiBpcyBpbnZhbGlkLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyB3aGVyZSwgU3RyaW5nW10gd2hlcmVBcmdzKSB7CisKKyAgICAgICAgLy8gT3BlbnMgdGhlIGRhdGFiYXNlIG9iamVjdCBpbiAid3JpdGUiIG1vZGUuCiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBTdHJpbmcgZmluYWxXaGVyZTsKKwogICAgICAgICBpbnQgY291bnQ7CisKKyAgICAgICAgLy8gRG9lcyB0aGUgZGVsZXRlIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybi4KICAgICAgICAgc3dpdGNoIChzVXJpTWF0Y2hlci5tYXRjaCh1cmkpKSB7Ci0gICAgICAgIGNhc2UgTk9URVM6Ci0gICAgICAgICAgICBjb3VudCA9IGRiLmRlbGV0ZShOT1RFU19UQUJMRV9OQU1FLCB3aGVyZSwgd2hlcmVBcmdzKTsKLSAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgTk9URV9JRDoKLSAgICAgICAgICAgIFN0cmluZyBub3RlSWQgPSB1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgY291bnQgPSBkYi5kZWxldGUoTk9URVNfVEFCTEVfTkFNRSwgTm90ZUNvbHVtbnMuX0lEICsgIj0iICsgbm90ZUlkCi0gICAgICAgICAgICAgICAgICAgICsgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZSkgPyAiIEFORCAoIiArIHdoZXJlICsgJyknIDogIiIpLCB3aGVyZUFyZ3MpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgcGF0dGVybiBtYXRjaGVzIHRoZSBnZW5lcmFsIHBhdHRlcm4gZm9yIG5vdGVzLCBkb2VzIGEgZGVsZXRlCisgICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgaW5jb21pbmcgIndoZXJlIiBjb2x1bW5zIGFuZCBhcmd1bWVudHMuCisgICAgICAgICAgICBjYXNlIE5PVEVTOgorICAgICAgICAgICAgICAgIGNvdW50ID0gZGIuZGVsZXRlKAorICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsICAvLyBUaGUgZGF0YWJhc2UgdGFibGUgbmFtZQorICAgICAgICAgICAgICAgICAgICB3aGVyZSwgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaW5jb21pbmcgd2hlcmUgY2xhdXNlIGNvbHVtbiBuYW1lcworICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3MgICAgICAgICAgICAgICAgICAvLyBUaGUgaW5jb21pbmcgd2hlcmUgY2xhdXNlIHZhbHVlcworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyBhIHNpbmdsZSBub3RlIElELCBkb2VzIHRoZSBkZWxldGUgYmFzZWQgb24gdGhlCisgICAgICAgICAgICAgICAgLy8gaW5jb21pbmcgZGF0YSwgYnV0IG1vZGlmaWVzIHRoZSB3aGVyZSBjbGF1c2UgdG8gcmVzdHJpY3QgaXQgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gcGFydGljdWxhciBub3RlIElELgorICAgICAgICAgICAgY2FzZSBOT1RFX0lEOgorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU3RhcnRzIGEgZmluYWwgV0hFUkUgY2xhdXNlIGJ5IHJlc3RyaWN0aW5nIGl0IHRvIHRoZQorICAgICAgICAgICAgICAgICAqIGRlc2lyZWQgbm90ZSBJRC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmaW5hbFdoZXJlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuX0lEICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgSUQgY29sdW1uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICIgPSAiICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGZvciBlcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldFBhdGhTZWdtZW50cygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbmNvbWluZyBub3RlIElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KE5vdGVQYWQuTm90ZXMuTk9URV9JRF9QQVRIX1BPU0lUSU9OKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdlcmUgYWRkaXRpb25hbCBzZWxlY3Rpb24gY3JpdGVyaWEsIGFwcGVuZCB0aGVtIHRvIHRoZSBmaW5hbAorICAgICAgICAgICAgICAgIC8vIFdIRVJFIGNsYXVzZQorICAgICAgICAgICAgICAgIGlmICh3aGVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsV2hlcmUgPSBmaW5hbFdoZXJlICsgIiBBTkQgIiArIHdoZXJlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBlcmZvcm1zIHRoZSBkZWxldGUuCisgICAgICAgICAgICAgICAgY291bnQgPSBkYi5kZWxldGUoCisgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSwgIC8vIFRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICBmaW5hbFdoZXJlLCAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWwgV0hFUkUgY2xhdXNlCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJncyAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyB3aGVyZSBjbGF1c2UgdmFsdWVzLgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBwYXR0ZXJuIGlzIGludmFsaWQsIHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOwogICAgICAgICB9CiAKKyAgICAgICAgLypHZXRzIGEgaGFuZGxlIHRvIHRoZSBjb250ZW50IHJlc29sdmVyIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgY29udGV4dCwgYW5kIG5vdGlmaWVzIGl0CisgICAgICAgICAqIHRoYXQgdGhlIGluY29taW5nIFVSSSBjaGFuZ2VkLiBUaGUgb2JqZWN0IHBhc3NlcyB0aGlzIGFsb25nIHRvIHRoZSByZXNvbHZlciBmcmFtZXdvcmssCisgICAgICAgICAqIGFuZCBvYnNlcnZlcnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQgdGhlbXNlbHZlcyBmb3IgdGhlIHByb3ZpZGVyIGFyZSBub3RpZmllZC4KKyAgICAgICAgICovCiAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2UodXJpLCBudWxsKTsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBkZWxldGVkLgogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjYWxscworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI3VwZGF0ZShVcmksQ29udGVudFZhbHVlcyxTdHJpbmcsU3RyaW5nW10pfQorICAgICAqIFVwZGF0ZXMgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2UuIFRoZSBjb2x1bW4gbmFtZXMgc3BlY2lmaWVkIGJ5IHRoZSBrZXlzIGluIHRoZSB2YWx1ZXMgbWFwCisgICAgICogYXJlIHVwZGF0ZWQgd2l0aCBuZXcgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIHZhbHVlcyBpbiB0aGUgbWFwLiBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgdGhlCisgICAgICogbm90ZSBJRCBVUkkgcGF0dGVybiwgdGhlbiB0aGUgbWV0aG9kIHVwZGF0ZXMgdGhlIG9uZSByZWNvcmQgc3BlY2lmaWVkIGJ5IHRoZSBJRCBpbiB0aGUgVVJJOworICAgICAqIG90aGVyd2lzZSwgaXQgdXBkYXRlcyBhIHNldCBvZiByZWNvcmRzLiBUaGUgcmVjb3JkIG9yIHJlY29yZHMgbXVzdCBtYXRjaCB0aGUgaW5wdXQKKyAgICAgKiBzZWxlY3Rpb24gY3JpdGVyaWEgc3BlY2lmaWVkIGJ5IHdoZXJlIGFuZCB3aGVyZUFyZ3MuCisgICAgICogSWYgcm93cyB3ZXJlIHVwZGF0ZWQsIHRoZW4gbGlzdGVuZXJzIGFyZSBub3RpZmllZCBvZiB0aGUgY2hhbmdlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHBhdHRlcm4gdG8gbWF0Y2ggYW5kIHVwZGF0ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbWFwIG9mIGNvbHVtbiBuYW1lcyAoa2V5cykgYW5kIG5ldyB2YWx1ZXMgKHZhbHVlcykuCisgICAgICogQHBhcmFtIHdoZXJlIEFuIFNRTCAiV0hFUkUiIGNsYXVzZSB0aGF0IHNlbGVjdHMgcmVjb3JkcyBiYXNlZCBvbiB0aGVpciBjb2x1bW4gdmFsdWVzLiBJZiB0aGlzCisgICAgICogaXMgbnVsbCwgdGhlbiBhbGwgcmVjb3JkcyB0aGF0IG1hdGNoIHRoZSBVUkkgcGF0dGVybiBhcmUgc2VsZWN0ZWQuCisgICAgICogQHBhcmFtIHdoZXJlQXJncyBBbiBhcnJheSBvZiBzZWxlY3Rpb24gY3JpdGVyaWEuIElmIHRoZSAid2hlcmUiIHBhcmFtIGNvbnRhaW5zIHZhbHVlCisgICAgICogcGxhY2Vob2xkZXJzICgiPyIpLCB0aGVuIGVhY2ggcGxhY2Vob2xkZXIgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUKKyAgICAgKiBhcnJheS4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybiBpcyBpbnZhbGlkLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgd2hlcmUsIFN0cmluZ1tdIHdoZXJlQXJncykgeworCisgICAgICAgIC8vIE9wZW5zIHRoZSBkYXRhYmFzZSBvYmplY3QgaW4gIndyaXRlIiBtb2RlLgogICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgaW50IGNvdW50OworICAgICAgICBTdHJpbmcgZmluYWxXaGVyZTsKKworICAgICAgICAvLyBEb2VzIHRoZSB1cGRhdGUgYmFzZWQgb24gdGhlIGluY29taW5nIFVSSSBwYXR0ZXJuCiAgICAgICAgIHN3aXRjaCAoc1VyaU1hdGNoZXIubWF0Y2godXJpKSkgewotICAgICAgICBjYXNlIE5PVEVTOgotICAgICAgICAgICAgY291bnQgPSBkYi51cGRhdGUoTk9URVNfVEFCTEVfTkFNRSwgdmFsdWVzLCB3aGVyZSwgd2hlcmVBcmdzKTsKLSAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgTk9URV9JRDoKLSAgICAgICAgICAgIFN0cmluZyBub3RlSWQgPSB1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgY291bnQgPSBkYi51cGRhdGUoTk9URVNfVEFCTEVfTkFNRSwgdmFsdWVzLCBOb3RlQ29sdW1ucy5fSUQgKyAiPSIgKyBub3RlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSA/ICIgQU5EICgiICsgd2hlcmUgKyAnKScgOiAiIiksIHdoZXJlQXJncyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgZ2VuZXJhbCBub3RlcyBwYXR0ZXJuLCBkb2VzIHRoZSB1cGRhdGUgYmFzZWQgb24KKyAgICAgICAgICAgIC8vIHRoZSBpbmNvbWluZyBkYXRhLgorICAgICAgICAgICAgY2FzZSBOT1RFUzoKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgdXBkYXRlIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLgorICAgICAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKAorICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsIC8vIFRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsICAgICAgICAgICAgICAgICAgIC8vIEEgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgbmV3IHZhbHVlcyB0byB1c2UuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gbmFtZXMuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJncyAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gdmFsdWVzIHRvIHNlbGVjdCBvbi4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgYSBzaW5nbGUgbm90ZSBJRCwgZG9lcyB0aGUgdXBkYXRlIGJhc2VkIG9uIHRoZSBpbmNvbWluZworICAgICAgICAgICAgLy8gZGF0YSwgYnV0IG1vZGlmaWVzIHRoZSB3aGVyZSBjbGF1c2UgdG8gcmVzdHJpY3QgaXQgdG8gdGhlIHBhcnRpY3VsYXIgbm90ZSBJRC4KKyAgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgICAvLyBGcm9tIHRoZSBpbmNvbWluZyBVUkksIGdldCB0aGUgbm90ZSBJRAorICAgICAgICAgICAgICAgIFN0cmluZyBub3RlSWQgPSB1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KE5vdGVQYWQuTm90ZXMuTk9URV9JRF9QQVRIX1BPU0lUSU9OKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU3RhcnRzIGNyZWF0aW5nIHRoZSBmaW5hbCBXSEVSRSBjbGF1c2UgYnkgcmVzdHJpY3RpbmcgaXQgdG8gdGhlIGluY29taW5nCisgICAgICAgICAgICAgICAgICogbm90ZSBJRC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmaW5hbFdoZXJlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuX0lEICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgSUQgY29sdW1uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICIgPSAiICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGZvciBlcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldFBhdGhTZWdtZW50cygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbmNvbWluZyBub3RlIElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KE5vdGVQYWQuTm90ZXMuTk9URV9JRF9QQVRIX1BPU0lUSU9OKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdlcmUgYWRkaXRpb25hbCBzZWxlY3Rpb24gY3JpdGVyaWEsIGFwcGVuZCB0aGVtIHRvIHRoZSBmaW5hbCBXSEVSRQorICAgICAgICAgICAgICAgIC8vIGNsYXVzZQorICAgICAgICAgICAgICAgIGlmICh3aGVyZSAhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxXaGVyZSA9IGZpbmFsV2hlcmUgKyAiIEFORCAiICsgd2hlcmU7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSB1cGRhdGUgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgY291bnQgPSBkYi51cGRhdGUoCisgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSwgLy8gVGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUuCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgICAgICAgICAgICAgICAgICAgLy8gQSBtYXAgb2YgY29sdW1uIG5hbWVzIGFuZCBuZXcgdmFsdWVzIHRvIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgZmluYWxXaGVyZSwgICAgICAgICAgICAgICAvLyBUaGUgZmluYWwgV0hFUkUgY2xhdXNlIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYWNlaG9sZGVycyBmb3Igd2hlcmVBcmdzCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJncyAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gdmFsdWVzIHRvIHNlbGVjdCBvbiwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudWxsIGlmIHRoZSB2YWx1ZXMgYXJlIGluIHRoZSB3aGVyZSBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIHBhdHRlcm4gaXMgaW52YWxpZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CiAgICAgICAgIH0KIAorICAgICAgICAvKkdldHMgYSBoYW5kbGUgdG8gdGhlIGNvbnRlbnQgcmVzb2x2ZXIgb2JqZWN0IGZvciB0aGUgY3VycmVudCBjb250ZXh0LCBhbmQgbm90aWZpZXMgaXQKKyAgICAgICAgICogdGhhdCB0aGUgaW5jb21pbmcgVVJJIGNoYW5nZWQuIFRoZSBvYmplY3QgcGFzc2VzIHRoaXMgYWxvbmcgdG8gdGhlIHJlc29sdmVyIGZyYW1ld29yaywKKyAgICAgICAgICogYW5kIG9ic2VydmVycyB0aGF0IGhhdmUgcmVnaXN0ZXJlZCB0aGVtc2VsdmVzIGZvciB0aGUgcHJvdmlkZXIgYXJlIG5vdGlmaWVkLgorICAgICAgICAgKi8KICAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm5vdGlmeUNoYW5nZSh1cmksIG51bGwpOworCisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQuCiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKLSAgICBzdGF0aWMgewotICAgICAgICBzVXJpTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOwotICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJub3RlcyIsIE5PVEVTKTsKLSAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibm90ZXMvIyIsIE5PVEVfSUQpOwotICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJsaXZlX2ZvbGRlcnMvbm90ZXMiLCBMSVZFX0ZPTERFUl9OT1RFUyk7Ci0KLSAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlQ29sdW1ucy5fSUQsIE5vdGVDb2x1bW5zLl9JRCk7Ci0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVDb2x1bW5zLlRJVExFLCBOb3RlQ29sdW1ucy5USVRMRSk7Ci0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVDb2x1bW5zLk5PVEUsIE5vdGVDb2x1bW5zLk5PVEUpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlQ29sdW1ucy5DUkVBVEVEX0RBVEUsIE5vdGVDb2x1bW5zLkNSRUFURURfREFURSk7Ci0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVDb2x1bW5zLk1PRElGSUVEX0RBVEUsIE5vdGVDb2x1bW5zLk1PRElGSUVEX0RBVEUpOwotCi0gICAgICAgIC8vIFN1cHBvcnQgZm9yIExpdmUgRm9sZGVycy4KLSAgICAgICAgc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcC5wdXQoTGl2ZUZvbGRlcnMuX0lELCBOb3RlQ29sdW1ucy5fSUQgKyAiIEFTICIgKwotICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLl9JRCk7Ci0gICAgICAgIHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcC5wdXQoTGl2ZUZvbGRlcnMuTkFNRSwgTm90ZUNvbHVtbnMuVElUTEUgKyAiIEFTICIgKwotICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLk5BTUUpOwotICAgICAgICAvLyBBZGQgbW9yZSBjb2x1bW5zIGhlcmUgZm9yIG1vcmUgcm9idXN0IExpdmUgRm9sZGVycy4KKyAgICAvKioKKyAgICAgKiBBIHRlc3QgcGFja2FnZSBjYW4gY2FsbCB0aGlzIHRvIGdldCBhIGhhbmRsZSB0byB0aGUgZGF0YWJhc2UgdW5kZXJseWluZyBOb3RlUGFkUHJvdmlkZXIsCisgICAgICogc28gaXQgY2FuIGluc2VydCB0ZXN0IGRhdGEgaW50byB0aGUgZGF0YWJhc2UuIFRoZSB0ZXN0IGNhc2UgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaW5zdGFudGlhdGluZyB0aGUgcHJvdmlkZXIgaW4gYSB0ZXN0IGNvbnRleHQ7IHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9IGRvZXMKKyAgICAgKiB0aGlzIGR1cmluZyB0aGUgY2FsbCB0byBzZXRVcCgpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBkYXRhYmFzZSBoZWxwZXIgb2JqZWN0IGZvciB0aGUgcHJvdmlkZXIncyBkYXRhLgorICAgICAqLworICAgIERhdGFiYXNlSGVscGVyIGdldE9wZW5IZWxwZXJGb3JUZXN0KCkgeworICAgICAgICByZXR1cm4gbU9wZW5IZWxwZXI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXN0LmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQppbmRleCBlYzgwOTAyLi42MjI5ZGQyIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQpAQCAtMTYsOSArMTYsMTQgQEAKIAogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQ7CiAKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZDsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwpAQCAtMjYsNyArMzEsNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CkBAIC0zNCwxNTcgKzM4LDUxMCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CiAKLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZC5Ob3RlQ29sdW1uczsKLQogLyoqCiAgKiBEaXNwbGF5cyBhIGxpc3Qgb2Ygbm90ZXMuIFdpbGwgZGlzcGxheSBub3RlcyBmcm9tIHRoZSB7QGxpbmsgVXJpfQotICogcHJvdmlkZWQgaW4gdGhlIGludGVudCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSBkZWZhdWx0cyB0byBkaXNwbGF5aW5nIHRoZQotICogY29udGVudHMgb2YgdGhlIHtAbGluayBOb3RlUHJvdmlkZXJ9CisgKiBwcm92aWRlZCBpbiB0aGUgaW5jb21pbmcgSW50ZW50IGlmIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIHRvIGRpc3BsYXlpbmcgdGhlCisgKiBjb250ZW50cyBvZiB0aGUge0BsaW5rIE5vdGVQYWRQcm92aWRlcn0uCisgKgorICogTk9URTogTm90aWNlIHRoYXQgdGhlIHByb3ZpZGVyIG9wZXJhdGlvbnMgaW4gdGhpcyBBY3Rpdml0eSBhcmUgdGFraW5nIHBsYWNlIG9uIHRoZSBVSSB0aHJlYWQuCisgKiBUaGlzIGlzIG5vdCBhIGdvb2QgcHJhY3RpY2UuIEl0IGlzIG9ubHkgZG9uZSBoZXJlIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4gQSByZWFsCisgKiBhcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyfSBvcgorICoge0BsaW5rIGFuZHJvaWQub3MuQXN5bmNUYXNrfSBvYmplY3QgdG8gcGVyZm9ybSBvcGVyYXRpb25zIGFzeW5jaHJvbm91c2x5IG9uIGEgc2VwYXJhdGUgdGhyZWFkLgogICovCiBwdWJsaWMgY2xhc3MgTm90ZXNMaXN0IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIC8vIEZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGVzTGlzdCI7CiAKKyAgICAvLyBNZW51IGl0ZW0gaWRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9JVEVNX0RFTEVURSA9IE1lbnUuRklSU1Q7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9JVEVNX0NPUFkgPSBNZW51LkZJUlNUICsgMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU5VX0lURU1fSU5TRVJUID0gTWVudS5GSVJTVCArIDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9JVEVNX1BBU1RFID0gTWVudS5GSVJTVCArIDM7CisKICAgICAvKioKLSAgICAgKiBUaGUgY29sdW1ucyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAqIFRoZSBjb2x1bW5zIG5lZWRlZCBieSB0aGUgY3Vyc29yIGFkYXB0ZXIKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgTm90ZUNvbHVtbnMuX0lELCAvLyAwCi0gICAgICAgIE5vdGVDb2x1bW5zLlRJVExFLCAvLyAxCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwgLy8gMAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgLy8gMQogICAgIH07CiAKICAgICAvKiogVGhlIGluZGV4IG9mIHRoZSB0aXRsZSBjb2x1bW4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lOREVYX1RJVExFID0gMTsKLSAgICAKKworICAgIHByaXZhdGUgTWVudUl0ZW0gbVBhc3RlSXRlbTsKKworICAgIC8qKgorICAgICAqIG9uQ3JlYXRlIGlzIGNhbGxlZCB3aGVuIEFuZHJvaWQgc3RhcnRzIHRoaXMgQWN0aXZpdHkgZnJvbSBzY3JhdGNoLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAorICAgICAgICAvLyBUaGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIGhvbGQgZG93biB0aGUga2V5IHRvIHVzZSBtZW51IHNob3J0Y3V0cy4KICAgICAgICAgc2V0RGVmYXVsdEtleU1vZGUoREVGQVVMVF9LRVlTX1NIT1JUQ1VUKTsKIAotICAgICAgICAvLyBJZiBubyBkYXRhIHdhcyBnaXZlbiBpbiB0aGUgaW50ZW50IChiZWNhdXNlIHdlIHdlcmUgc3RhcnRlZAotICAgICAgICAvLyBhcyBhIE1BSU4gYWN0aXZpdHkpLCB0aGVuIHVzZSBvdXIgZGVmYXVsdCBjb250ZW50IHByb3ZpZGVyLgorICAgICAgICAvKiBJZiBubyBkYXRhIGlzIGdpdmVuIGluIHRoZSBJbnRlbnQgdGhhdCBzdGFydGVkIHRoaXMgQWN0aXZpdHksIHRoZW4gdGhpcyBBY3Rpdml0eQorICAgICAgICAgKiB3YXMgc3RhcnRlZCB3aGVuIHRoZSBpbnRlbnQgZmlsdGVyIG1hdGNoZWQgYSBNQUlOIGFjdGlvbi4gV2Ugc2hvdWxkIHVzZSB0aGUgZGVmYXVsdAorICAgICAgICAgKiBwcm92aWRlciBVUkkuCisgICAgICAgICAqLworICAgICAgICAvLyBHZXRzIHRoZSBpbnRlbnQgdGhhdCBzdGFydGVkIHRoaXMgQWN0aXZpdHkuCiAgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW50ZW50LCBzZXRzIHRoZSBkYXRhIHRvIHRoZSBkZWZhdWx0IFVSSSwgd2hpY2gKKyAgICAgICAgLy8gYWNjZXNzZXMgYSBsaXN0IG9mIG5vdGVzLgogICAgICAgICBpZiAoaW50ZW50LmdldERhdGEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShOb3RlQ29sdW1ucy5DT05URU5UX1VSSSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEluZm9ybSB0aGUgbGlzdCB3ZSBwcm92aWRlIGNvbnRleHQgbWVudXMgZm9yIGl0ZW1zCisgICAgICAgIC8qCisgICAgICAgICAqIFNldHMgdGhlIGNhbGxiYWNrIGZvciBjb250ZXh0IG1lbnUgYWN0aXZhdGlvbiBmb3IgdGhlIExpc3RWaWV3LiBUaGUgbGlzdGVuZXIgaXMgc2V0CisgICAgICAgICAqIHRvIGJlIHRoaXMgQWN0aXZpdHkuIFRoZSBlZmZlY3QgaXMgdGhhdCBjb250ZXh0IG1lbnVzIGFyZSBlbmFibGVkIGZvciBpdGVtcyBpbiB0aGUKKyAgICAgICAgICogTGlzdFZpZXcsIGFuZCB0aGUgY29udGV4dCBtZW51IGlzIGhhbmRsZWQgYnkgYSBtZXRob2QgaW4gTm90ZXNMaXN0LgorICAgICAgICAgKi8KICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBQZXJmb3JtIGEgbWFuYWdlZCBxdWVyeS4gVGhlIEFjdGl2aXR5IHdpbGwgaGFuZGxlIGNsb3NpbmcgYW5kIHJlcXVlcnlpbmcgdGhlIGN1cnNvcgotICAgICAgICAvLyB3aGVuIG5lZWRlZC4KLSAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1hbmFnZWRRdWVyeShnZXRJbnRlbnQoKS5nZXREYXRhKCksIFBST0pFQ1RJT04sIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZUNvbHVtbnMuREVGQVVMVF9TT1JUX09SREVSKTsKIAotICAgICAgICAvLyBVc2VkIHRvIG1hcCBub3RlcyBlbnRyaWVzIGZyb20gdGhlIGRhdGFiYXNlIHRvIHZpZXdzCi0gICAgICAgIFNpbXBsZUN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsIFIubGF5b3V0Lm5vdGVzbGlzdF9pdGVtLCBjdXJzb3IsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTm90ZUNvbHVtbnMuVElUTEUgfSwgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxIH0pOworICAgICAgICAvKiBQZXJmb3JtcyBhIG1hbmFnZWQgcXVlcnkuIFRoZSBBY3Rpdml0eSBoYW5kbGVzIGNsb3NpbmcgYW5kIHJlcXVlcnlpbmcgdGhlIGN1cnNvcgorICAgICAgICAgKiB3aGVuIG5lZWRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUGxlYXNlIHNlZSB0aGUgaW50cm9kdWN0b3J5IG5vdGUgYWJvdXQgcGVyZm9ybWluZyBwcm92aWRlciBvcGVyYXRpb25zIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLCAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBjb250ZW50IFVSSSBmb3IgdGhlIHByb3ZpZGVyLgorICAgICAgICAgICAgUFJPSkVDVElPTiwgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbm90ZSBJRCBhbmQgdGl0bGUgZm9yIGVhY2ggbm90ZS4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB3aGVyZSBjbGF1c2UsIHJldHVybiBhbGwgcmVjb3Jkcy4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB3aGVyZSBjbGF1c2UsIHRoZXJlZm9yZSBubyB3aGVyZSBjb2x1bW4gdmFsdWVzLgorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5ERUZBVUxUX1NPUlRfT1JERVIgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyLgorICAgICAgICApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIGFycmF5cyBjcmVhdGUgYSAibWFwIiBiZXR3ZWVuIGNvbHVtbnMgaW4gdGhlIGN1cnNvciBhbmQgdmlldyBJRHMKKyAgICAgICAgICogZm9yIGl0ZW1zIGluIHRoZSBMaXN0Vmlldy4gRWFjaCBlbGVtZW50IGluIHRoZSBkYXRhQ29sdW1ucyBhcnJheSByZXByZXNlbnRzCisgICAgICAgICAqIGEgY29sdW1uIG5hbWU7IGVhY2ggZWxlbWVudCBpbiB0aGUgdmlld0lEIGFycmF5IHJlcHJlc2VudHMgdGhlIElEIG9mIGEgVmlldy4KKyAgICAgICAgICogVGhlIFNpbXBsZUN1cnNvckFkYXB0ZXIgbWFwcyB0aGVtIGluIGFzY2VuZGluZyBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgZWFjaCBjb2x1bW4KKyAgICAgICAgICogdmFsdWUgd2lsbCBhcHBlYXIgaW4gdGhlIExpc3RWaWV3LgorICAgICAgICAgKi8KKworICAgICAgICAvLyBUaGUgbmFtZXMgb2YgdGhlIGN1cnNvciBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXcsIGluaXRpYWxpemVkIHRvIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgU3RyaW5nW10gZGF0YUNvbHVtbnMgPSB7IE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgfSA7CisKKyAgICAgICAgLy8gVGhlIHZpZXcgSURzIHRoYXQgd2lsbCBkaXNwbGF5IHRoZSBjdXJzb3IgY29sdW1ucywgaW5pdGlhbGl6ZWQgdG8gdGhlIFRleHRWaWV3IGluCisgICAgICAgIC8vIG5vdGVzbGlzdF9pdGVtLnhtbAorICAgICAgICBpbnRbXSB2aWV3SURzID0geyBhbmRyb2lkLlIuaWQudGV4dDEgfTsKKworICAgICAgICAvLyBDcmVhdGVzIHRoZSBiYWNraW5nIGFkYXB0ZXIgZm9yIHRoZSBMaXN0Vmlldy4KKyAgICAgICAgU2ltcGxlQ3Vyc29yQWRhcHRlciBhZGFwdGVyCisgICAgICAgICAgICA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQ29udGV4dCBmb3IgdGhlIExpc3RWaWV3CisgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubm90ZXNsaXN0X2l0ZW0sICAgICAgICAgIC8vIFBvaW50cyB0byB0aGUgWE1MIGZvciBhIGxpc3QgaXRlbQorICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3Vyc29yIHRvIGdldCBpdGVtcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgdmlld0lEcworICAgICAgICAgICAgICApOworCisgICAgICAgIC8vIFNldHMgdGhlIExpc3RWaWV3J3MgYWRhcHRlciB0byBiZSB0aGUgY3Vyc29yIGFkYXB0ZXIgdGhhdCB3YXMganVzdCBjcmVhdGVkLgogICAgICAgICBzZXRMaXN0QWRhcHRlcihhZGFwdGVyKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGRldmljZSdzIE1lbnUgYnV0dG9uIHRoZSBmaXJzdCB0aW1lIGZvcgorICAgICAqIHRoaXMgQWN0aXZpdHkuIEFuZHJvaWQgcGFzc2VzIGluIGEgTWVudSBvYmplY3QgdGhhdCBpcyBwb3B1bGF0ZWQgd2l0aCBpdGVtcy4KKyAgICAgKgorICAgICAqIFNldHMgdXAgYSBtZW51IHRoYXQgcHJvdmlkZXMgdGhlIEluc2VydCBvcHRpb24gcGx1cyBhIGxpc3Qgb2YgYWx0ZXJuYXRpdmUgYWN0aW9ucyBmb3IKKyAgICAgKiB0aGlzIEFjdGl2aXR5LiBPdGhlciBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIGhhbmRsZSBub3RlcyBjYW4gInJlZ2lzdGVyIiB0aGVtc2VsdmVzIGluCisgICAgICogQW5kcm9pZCBieSBwcm92aWRpbmcgYW4gaW50ZW50IGZpbHRlciB0aGF0IGluY2x1ZGVzIHRoZSBjYXRlZ29yeSBBTFRFUk5BVElWRSBhbmQgdGhlCisgICAgICogbWltZVRZcGUgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1RZUEUuIElmIHRoZXkgZG8gdGhpcywgdGhlIGNvZGUgaW4gb25DcmVhdGVPcHRpb25zTWVudSgpCisgICAgICogd2lsbCBhZGQgdGhlIEFjdGl2aXR5IHRoYXQgY29udGFpbnMgdGhlIGludGVudCBmaWx0ZXIgdG8gaXRzIGxpc3Qgb2Ygb3B0aW9ucy4gSW4gZWZmZWN0LAorICAgICAqIHRoZSBtZW51IHdpbGwgb2ZmZXIgdGhlIHVzZXIgb3RoZXIgYXBwbGljYXRpb25zIHRoYXQgY2FuIGhhbmRsZSBub3Rlcy4KKyAgICAgKiBAcGFyYW0gbWVudSBBIE1lbnUgb2JqZWN0LCB0byB3aGljaCBtZW51IGl0ZW1zIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKiBAcmV0dXJuIFRydWUsIGFsd2F5cy4gVGhlIG1lbnUgc2hvdWxkIGJlIGRpc3BsYXllZC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotICAgICAgICAvLyBJbmZsYXRlIG1lbnUgZnJvbSBYTUwgcmVzb3VyY2UKLSAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7Ci0gICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lmxpc3Rfb3B0aW9uc19tZW51LCBtZW51KTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdlbmVyYXRlIGFueSBhZGRpdGlvbmFsIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZQorCisgICAgICAgIC8vIFRoZSBwYXJlbnQgbWV0aG9kIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHdpdGggdGhlIHN0YW5kYXJkIHN5c3RlbSBpdGVtcy4KKyAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKworICAgICAgICAvLyBBZGRzIGFuIEluc2VydCBtZW51IGl0ZW0KKyAgICAgICAgTWVudUl0ZW0gbWVudUl0ZW0gPSBtZW51LmFkZCgKKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1lbnUgZ3JvdXAuCisgICAgICAgICAgICBNRU5VX0lURU1fSU5TRVJULCAgICAgICAgICAgICAvLyBVbmlxdWUgSUQgZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAgIC8vIE5vIG9yZGVyIHdpdGhpbiB0aGUgZ3JvdXAuCisgICAgICAgICAgICBSLnN0cmluZy5tZW51X2luc2VydCAgICAgICAgICAvLyBEaXNwbGF5ZWQgdGV4dCBmb3IgdGhlIG1lbnUgaXRlbS4KKyAgICAgICAgKTsKKworICAgICAgICAvLyBTZXRzIGtleWJvYXJkIHNob3J0Y3V0cyBmb3IgdGhlIG1lbnUgaXRlbSwgZWl0aGVyICIzIiBvciAiYSI7CisgICAgICAgIG1lbnVJdGVtLnNldFNob3J0Y3V0KCczJywgJ2EnKTsKKworICAgICAgICAvLyBTZXRzIHRoZSBpY29uIGZvciB0aGUgbWVudSBpdGVtCisgICAgICAgIG1lbnVJdGVtLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfYWRkKTsKKworICAgICAgICAvLyBJZiB0aGVyZSBpcyBjdXJyZW50bHkgZGF0YSBpbiB0aGUgY2xpcGJvYXJkLCB0aGlzIGFkZHMgYSBQQVNURSBtZW51IGl0ZW0gdG8gdGhlIG1lbnUKKyAgICAgICAgLy8gc28gdGhhdCB0aGUgdXNlciBjYW4gcGFzdGUgaW4gdGhlIGRhdGEuCisgICAgICAgIG1QYXN0ZUl0ZW0gPSBtZW51LmFkZCgKKyAgICAgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgICAgIC8vIE5vIG1lbnUgZ3JvdXAuCisgICAgICAgICAgICAgICAgTUVOVV9JVEVNX1BBU1RFLCAgICAgICAgICAvLyBBIHVuaXF1ZSBJRCBmb3IgdGhpcyBpdGVtCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAvLyBObyBtZW51IG9yZGVyCisgICAgICAgICAgICAgICAgUi5zdHJpbmcubWVudV9wYXN0ZSAgICAgICAvLyBUaGUgZGlzcGxheWVkIHRleHQKKyAgICAgICAgKS5zZXRTaG9ydGN1dCgnNCcsICdwJyk7ICAgICAgICAgIC8vIFNldCB0aGUga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciB0aGlzIG5ldyBpdGVtLgorCisgICAgICAgIC8vIEdlbmVyYXRlcyBhbnkgYWRkaXRpb25hbCBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUKICAgICAgICAgLy8gb3ZlcmFsbCBsaXN0LiAgSW4gYSBub3JtYWwgaW5zdGFsbCwgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwKICAgICAgICAgLy8gYWN0aW9ucyBmb3VuZCBoZXJlLCBidXQgdGhpcyBhbGxvd3Mgb3RoZXIgYXBwbGljYXRpb25zIHRvIGV4dGVuZAogICAgICAgICAvLyBvdXIgbWVudSB3aXRoIHRoZWlyIG93biBhY3Rpb25zLgorCisgICAgICAgIC8qIENyZWF0ZXMgYSBuZXcgSW50ZW50IHdpdGggdGhlIHNhbWUgaW5jb21pbmcgZGF0YSBhbmQgbm8gZGVmaW5lZCBhY3Rpb24uCisgICAgICAgICAqIEl0IGFsc28gc2V0cyBpdHMgY2F0ZWdvcnkgdG8gQUxURVJOQVRJVkUuIFRoaXMgcHJlcGFyZXMgdGhlIEludGVudCBhcyBhIHBsYWNlCisgICAgICAgICAqIHRvIGdyb3VwIGFsdGVybmF0aXZlIG9wdGlvbnMgaW4gdGhlIG1lbnUuCisgICAgICAgICAqLwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChudWxsLCBnZXRJbnRlbnQoKS5nZXREYXRhKCkpOwogICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0FMVEVSTkFUSVZFKTsKLSAgICAgICAgbWVudS5hZGRJbnRlbnRPcHRpb25zKE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsIDAsIDAsCi0gICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUodGhpcywgTm90ZXNMaXN0LmNsYXNzKSwgbnVsbCwgaW50ZW50LCAwLCBudWxsKTsKIAotICAgICAgICByZXR1cm4gc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgLyogQ3JlYXRlcyBhIENvbXBvbmVudE5hbWUgZnJvbSB0aGUgY3VycmVudCBDb250ZXh0IGFuZCB0aGlzIEFjdGl2aXR5IG9iamVjdCdzCisgICAgICAgICAqIGNsYXNzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUodGhpcywgTm90ZXNMaXN0LmNsYXNzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBZGRzIGFueSBvdGhlciBhY3Rpdml0aWVzIHRoYXQgd2FudCB0byBiZSBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgdmlldy4gSW4gZWZmZWN0LAorICAgICAgICAgKiBhbnkgYXBwbGljYXRpb24gY2FuIGFkZCBpdHNlbGYgYXMgYW4gYWx0ZXJuYXRpdmUgb24gdGhlIG9wdGlvbnMgbWVudS4KKyAgICAgICAgICovCisgICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucygKKyAgICAgICAgICAgIE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsICAgLy8gQWRkIHRoZSBvcHRpb25zIHRvIHRoZSBBbHRlcm5hdGl2ZXMgZ3JvdXAKKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBhIHVuaXF1ZSBJRAorICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIG9yZGVyIHRoZSBvcHRpb25zCisgICAgICAgICAgICBjb21wb25lbnQsICAgICAgICAgICAgICAgICAgIC8vIFRoZSBDb21wb25lbnROYW1lIG9mIHRoZSBBY3Rpdml0eSBtYWtpbmcgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgQWN0aXZpdHkgaXMgZXhjbHVkZWQgZnJvbSB0aGUgbGlzdCBvZiBhbHRlcm5hdGl2ZXMuCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHNwZWNpZmljIGl0ZW1zIGFyZSBsaXN0ZWQgZmlyc3QuCisgICAgICAgICAgICBpbnRlbnQsICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBJbnRlbnQgdG8gcmVzb2x2ZSB0bywgaW4gZWZmZWN0LCBhbiBJbnRlbnQgbGlzdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWx0ZXJuYXRpdmVzCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgICAgICAgIC8vIG5vIGZsYWdzIGFyZSBuZWVkZWQKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugbm8gc3BlY2lmaWNzIHdlcmUgdXNlZCwgc28gYSBtZW51IGl0ZW0gYXJyYXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG5lZWRlZC4KKyAgICAgICAgKTsKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgc28gdGhhdCB0aGUgbWVudSBpcyBkaXNwbGF5ZWQuCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBzdXBlci5vblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKworICAgICAgICAvLyBUaGUgcGFzdGUgbWVudSBpdGVtIGlzIGVuYWJsZWQgaWYgdGhlcmUgaXMgZGF0YSBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKQorICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgLy8gSWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhbiBpdGVtLCBlbmFibGVzIHRoZSBQYXN0ZSBvcHRpb24gb24gdGhlIG1lbnUuCisgICAgICAgIGlmIChjbGlwYm9hcmQuaGFzUHJpbWFyeUNsaXAoKSkgeworICAgICAgICAgICAgbVBhc3RlSXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgY2xpcGJvYXJkIGlzIGVtcHR5LCBkaXNhYmxlcyB0aGUgbWVudSdzIFBhc3RlIG9wdGlvbi4KKyAgICAgICAgICAgIG1QYXN0ZUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygbm90ZXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZC4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXZlSXRlbXMgPSBnZXRMaXN0QWRhcHRlcigpLmdldENvdW50KCkgPiAwOworCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbm90ZXMgaW4gdGhlIGxpc3QgKHdoaWNoIGltcGxpZXMgdGhhdCBvbmUgb2YKKyAgICAgICAgLy8gdGhlbSBpcyBzZWxlY3RlZCksIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgYWN0aW9ucyB0aGF0CisgICAgICAgIC8vIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgVGhpcyB3aWxsIGJlIGEgY29tYmluYXRpb24KKyAgICAgICAgLy8gb2Ygb3VyIG93biBzcGVjaWZpYyBhY3Rpb25zIGFsb25nIHdpdGggYW55IGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUKKyAgICAgICAgLy8gZm91bmQuCisgICAgICAgIGlmIChoYXZlSXRlbXMpIHsKKworICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgICAgICAgIFVyaSB1cmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChnZXRJbnRlbnQoKS5nZXREYXRhKCksIGdldFNlbGVjdGVkSXRlbUlkKCkpOworCisgICAgICAgICAgICAvLyBDcmVhdGVzIGFuIGFycmF5IG9mIEludGVudHMgd2l0aCBvbmUgZWxlbWVudC4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2VuZCBhbiBJbnRlbnQKKyAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBtZW51IGl0ZW0uCisgICAgICAgICAgICBJbnRlbnRbXSBzcGVjaWZpY3MgPSBuZXcgSW50ZW50WzFdOworCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBJbnRlbnQgaW4gdGhlIGFycmF5IHRvIGJlIGFuIEVESVQgYWN0aW9uIG9uIHRoZSBVUkkgb2YgdGhlIHNlbGVjdGVkIG5vdGUuCisgICAgICAgICAgICBzcGVjaWZpY3NbMF0gPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fRURJVCwgdXJpKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhbiBhcnJheSBvZiBtZW51IGl0ZW1zIHdpdGggb25lIGVsZW1lbnQuIFRoaXMgd2lsbCBjb250YWluIHRoZSBFRElUIG9wdGlvbi4KKyAgICAgICAgICAgIE1lbnVJdGVtW10gaXRlbXMgPSBuZXcgTWVudUl0ZW1bMV07CisKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYW4gSW50ZW50IHdpdGggbm8gc3BlY2lmaWMgYWN0aW9uLCB1c2luZyB0aGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBub3RlLgorICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobnVsbCwgdXJpKTsKKworICAgICAgICAgICAgLyogQWRkcyB0aGUgY2F0ZWdvcnkgQUxURVJOQVRJVkUgdG8gdGhlIEludGVudCwgd2l0aCB0aGUgbm90ZSBJRCBVUkkgYXMgaXRzCisgICAgICAgICAgICAgKiBkYXRhLiBUaGlzIHByZXBhcmVzIHRoZSBJbnRlbnQgYXMgYSBwbGFjZSB0byBncm91cCBhbHRlcm5hdGl2ZSBvcHRpb25zIGluIHRoZQorICAgICAgICAgICAgICogbWVudS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFkZCBhbHRlcm5hdGl2ZXMgdG8gdGhlIG1lbnUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWVudS5hZGRJbnRlbnRPcHRpb25zKAorICAgICAgICAgICAgICAgIE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsICAvLyBBZGQgdGhlIEludGVudHMgYXMgb3B0aW9ucyBpbiB0aGUgYWx0ZXJuYXRpdmVzIGdyb3VwLgorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAvLyBBIHVuaXF1ZSBpdGVtIElEIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgICAgICAgLy8gVGhlIGFsdGVybmF0aXZlcyBkb24ndCBuZWVkIHRvIGJlIGluIG9yZGVyLgorICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbGVyJ3MgbmFtZSBpcyBub3QgZXhjbHVkZWQgZnJvbSB0aGUgZ3JvdXAuCisgICAgICAgICAgICAgICAgc3BlY2lmaWNzLCAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNwZWNpZmljIG9wdGlvbnMgbXVzdCBhcHBlYXIgZmlyc3QuCisgICAgICAgICAgICAgICAgaW50ZW50LCAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIEludGVudCBvYmplY3RzIG1hcCB0byB0aGUgb3B0aW9ucyBpbiBzcGVjaWZpY3MuCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgIC8vIE5vIGZsYWdzIGFyZSByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICBpdGVtcyAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1lbnUgaXRlbXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNwZWNpZmljcy10by0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZW50cyBtYXBwaW5nCisgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBFZGl0IG1lbnUgaXRlbSBleGlzdHMsIGFkZHMgc2hvcnRjdXRzIGZvciBpdC4KKyAgICAgICAgICAgICAgICBpZiAoaXRlbXNbMF0gIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIEVkaXQgbWVudSBpdGVtIHNob3J0Y3V0IHRvIG51bWVyaWMgIjEiLCBsZXR0ZXIgImUiCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zWzBdLnNldFNob3J0Y3V0KCcxJywgJ2UnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaXN0IGlzIGVtcHR5LCByZW1vdmVzIGFueSBleGlzdGluZyBhbHRlcm5hdGl2ZSBhY3Rpb25zIGZyb20gdGhlIG1lbnUKKyAgICAgICAgICAgICAgICBtZW51LnJlbW92ZUdyb3VwKE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUpOworICAgICAgICAgICAgfQorCisgICAgICAgIC8vIERpc3BsYXlzIHRoZSBtZW51CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIG1lbnUsIGJ1dCBubyBpdGVtCisgICAgICogaW4gdGhlIGxpc3QgaXMgc2VsZWN0ZWQuIElmIHRoZSBvcHRpb24gd2FzIElOU0VSVCwgdGhlbiBhIG5ldyBJbnRlbnQgaXMgc2VudCBvdXQgd2l0aCBhY3Rpb24KKyAgICAgKiBBQ1RJT05fSU5TRVJULiBUaGUgZGF0YSBmcm9tIHRoZSBpbmNvbWluZyBJbnRlbnQgaXMgcHV0IGludG8gdGhlIG5ldyBJbnRlbnQuIEluIGVmZmVjdCwKKyAgICAgKiB0aGlzIHRyaWdnZXJzIHRoZSBOb3RlRWRpdG9yIGFjdGl2aXR5IGluIHRoZSBOb3RlUGFkIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogSWYgdGhlIGl0ZW0gd2FzIG5vdCBJTlNFUlQsIHRoZW4gbW9zdCBsaWtlbHkgaXQgd2FzIGFuIGFsdGVybmF0aXZlIG9wdGlvbiBmcm9tIGFub3RoZXIKKyAgICAgKiBhcHBsaWNhdGlvbi4gVGhlIHBhcmVudCBtZXRob2QgaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIGl0ZW0uCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIG1lbnUgaXRlbSB0aGF0IHdhcyBzZWxlY3RlZCBieSB0aGUgdXNlcgorICAgICAqIEByZXR1cm4gVHJ1ZSwgaWYgdGhlIElOU0VSVCBtZW51IGl0ZW0gd2FzIHNlbGVjdGVkOyBvdGhlcndpc2UsIHRoZSByZXN1bHQgb2YgY2FsbGluZworICAgICAqIHRoZSBwYXJlbnQgbWV0aG9kLgorICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgSUQgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7Ci0gICAgICAgIGNhc2UgUi5pZC5tZW51X2FkZDoKLSAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byBpbnNlcnQgYSBuZXcgaXRlbQorCisgICAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaXMgSW5zZXJ0CisgICAgICAgIGNhc2UgTUVOVV9JVEVNX0lOU0VSVDoKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIExhdW5jaGVzIGEgbmV3IEFjdGl2aXR5IHVzaW5nIGFuIEludGVudC4gVGhlIGludGVudCBmaWx0ZXIgZm9yIHRoZSBBY3Rpdml0eQorICAgICAgICAgICAgICogaGFzIHRvIGhhdmUgYWN0aW9uIEFDVElPTl9JTlNFUlQuIE5vIGNhdGVnb3J5IGlzIHNldCwgc28gREVGQVVMVCBpcyBhc3N1bWVkLgorICAgICAgICAgICAgICogSW4gZWZmZWN0LCB0aGlzIHN0YXJ0cyB0aGUgTm90ZUVkaXRvciBBY3Rpdml0eSBpbiBOb3RlUGFkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9JTlNFUlQsIGdldEludGVudCgpLmdldERhdGEoKSkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworCisgICAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaXMgUGFzdGUKKyAgICAgICAgY2FzZSBNRU5VX0lURU1fUEFTVEU6CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBMYXVuY2hlcyBhIG5ldyBBY3Rpdml0eSB1c2luZyBhbiBJbnRlbnQuIFRoZSBpbnRlbnQgZmlsdGVyIGZvciB0aGUgQWN0aXZpdHkKKyAgICAgICAgICAgICAqIGhhcyB0byBoYXZlIGFjdGlvbiBBQ1RJT05fUEFTVEUuIE5vIGNhdGVnb3J5IGlzIHNldCwgc28gREVGQVVMVCBpcyBhc3N1bWVkLgorICAgICAgICAgICAgICogSW4gZWZmZWN0LCB0aGlzIHN0YXJ0cyB0aGUgTm90ZUVkaXRvciBBY3Rpdml0eSBpbiBOb3RlUGFkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9QQVNURSwgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gc2VsZWN0ZWQgaXMgbm90IEluc2VydCBvciBQYXN0ZSwgdGhlbiB0aGlzIGNhbGxzIHRoZSByZWd1bGFyCisgICAgICAgIC8vIHByb2Nlc3NpbmcgdG8gaGFuZGxlIHRoZSBpdGVtLgorICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNvbnRleHQtY2xpY2tzIGEgbm90ZSBpbiB0aGUgbGlzdC4gTm90ZXNMaXN0IHJlZ2lzdGVycworICAgICAqIGl0c2VsZiBhcyB0aGUgaGFuZGxlciBmb3IgY29udGV4dCBtZW51cyBpbiBpdHMgTGlzdFZpZXcgKHRoaXMgaXMgZG9uZSBpbiBvbkNyZWF0ZSgpKS4KKyAgICAgKgorICAgICAqIFRoZSBvbmx5IGF2YWlsYWJsZSBvcHRpb25zIGFyZSBDT1BZIGFuZCBERUxFVEUuCisgICAgICoKKyAgICAgKiBDb250ZXh0LWNsaWNrIGlzIGVxdWl2YWxlbnQgdG8gbG9uZy1wcmVzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51IEEgQ29udGV4TWVudSBvYmplY3QgdG8gd2hpY2ggaXRlbXMgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSB2aWV3IFRoZSBWaWV3IGZvciB3aGljaCB0aGUgY29udGV4dCBtZW51IGlzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICAqIEBwYXJhbSBtZW51SW5mbyBEYXRhIGFzc29jaWF0ZWQgd2l0aCB2aWV3LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHZpZXcsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworCisgICAgICAgIC8vIFRoZSBkYXRhIGZyb20gdGhlIG1lbnUgaXRlbS4KICAgICAgICAgQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbyBpbmZvOworCisgICAgICAgIC8vIFRyaWVzIHRvIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIExpc3RWaWV3IHRoYXQgd2FzIGxvbmctcHJlc3NlZC4KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOworCisgICAgICAgICAgICAvLyBDYXN0cyB0aGUgaW5jb21pbmcgZGF0YSBvYmplY3QgaW50byB0aGUgdHlwZSBmb3IgQWRhcHRlclZpZXcgb2JqZWN0cy4KKyAgICAgICAgICAgIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbykgbWVudUluZm87CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBtZW51IG9iamVjdCBjYW4ndCBiZSBjYXN0LCBsb2dzIGFuIGVycm9yLgogICAgICAgICAgICAgTG9nLmUoVEFHLCAiYmFkIG1lbnVJbmZvIiwgZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBHZXRzIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbSBhdCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24uIGdldEl0ZW0oKSByZXR1cm5zCisgICAgICAgICAqIHdoYXRldmVyIHRoZSBiYWNraW5nIGFkYXB0ZXIgb2YgdGhlIExpc3RWaWV3IGhhcyBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW0uIEluIE5vdGVzTGlzdCwKKyAgICAgICAgICogdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEgbm90ZSB3aXRoIGl0cyBsaXN0IGl0ZW0uIEFzIGEgcmVzdWx0LAorICAgICAgICAgKiBnZXRJdGVtKCkgcmV0dXJucyB0aGF0IGRhdGEgYXMgYSBDdXJzb3IuCisgICAgICAgICAqLwogICAgICAgICBDdXJzb3IgY3Vyc29yID0gKEN1cnNvcikgZ2V0TGlzdEFkYXB0ZXIoKS5nZXRJdGVtKGluZm8ucG9zaXRpb24pOworCisgICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgZW1wdHksIHRoZW4gZm9yIHNvbWUgcmVhc29uIHRoZSBhZGFwdGVyIGNhbid0IGdldCB0aGUgZGF0YSBmcm9tIHRoZQorICAgICAgICAvLyBwcm92aWRlciwgc28gcmV0dXJucyBudWxsIHRvIHRoZSBjYWxsZXIuCiAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgeworCiAgICAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24gdGhlIHJlcXVlc3RlZCBpdGVtIGlzbid0IGF2YWlsYWJsZSwgZG8gbm90aGluZwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW5mbGF0ZSBtZW51IGZyb20gWE1MIHJlc291cmNlCi0gICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5saXN0X2NvbnRleHRfbWVudSwgbWVudSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBoZWFkZXIKKyAgICAgICAgLy8gU2V0cyB0aGUgbWVudSBoZWFkZXIgdG8gYmUgdGhlIHRpdGxlIG9mIHRoZSBzZWxlY3RlZCBub3RlLgogICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKGN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX1RJVExFKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBcHBlbmQgdG8gdGhlCi0gICAgICAgIC8vIG1lbnUgaXRlbXMgZm9yIGFueSBvdGhlciBhY3Rpdml0aWVzIHRoYXQgY2FuIGRvIHN0dWZmIHdpdGggaXQKLSAgICAgICAgLy8gYXMgd2VsbC4gIFRoaXMgZG9lcyBhIHF1ZXJ5IG9uIHRoZSBzeXN0ZW0gZm9yIGFueSBhY3Rpdml0aWVzIHRoYXQKLSAgICAgICAgLy8gaW1wbGVtZW50IHRoZSBBTFRFUk5BVElWRV9BQ1RJT04gZm9yIG91ciBkYXRhLCBhZGRpbmcgYSBtZW51IGl0ZW0KLSAgICAgICAgLy8gZm9yIGVhY2ggb25lIHRoYXQgaXMgZm91bmQuCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG51bGwsIFVyaS53aXRoQXBwZW5kZWRQYXRoKGdldEludGVudCgpLmdldERhdGEoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZygoaW50KSBpbmZvLmlkKSApKTsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7Ci0gICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucyhNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFLCAwLCAwLAotICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIE5vdGVzTGlzdC5jbGFzcyksIG51bGwsIGludGVudCwgMCwgbnVsbCk7CisKKyAgICAgICAgLy8gQWRkcyBhIG1lbnUgaXRlbSB0byBjb3B5IHRoZSBub3RlIHRvIHRoZSBjb250ZXh0IG1lbnUKKyAgICAgICAgbWVudS5hZGQoCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgIC8vIE5vIGdyb3VwaW5nIGlzIG5lZWRlZCBmb3IgdGhpcyBtZW51CisgICAgICAgICAgICBNRU5VX0lURU1fQ09QWSwgICAgIC8vIEEgdW5pcXVlIElEIGZvciB0aGlzIG1lbnUgaXRlbS4KKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgLy8gTm8gb3JkZXJpbmcgaXMgbmVjZXNzYXJ5IGluIHRoaXMgbWVudQorICAgICAgICAgICAgUi5zdHJpbmcubWVudV9jb3B5ICAvLyBUaGUgcmVzb3VyY2UgSUQgZm9yIHRoZSBzdHJpbmcgdG8gZGlzcGxheSBmb3IgdGhpcyBpdGVtLgorICAgICAgICApOworCisgICAgICAgIC8vIEFkZHMgYSBtZW51IGl0ZW0gdG8gZGVsZXRlIHRoZSBub3RlIHRvIHRoZSBjb250ZXh0IG1lbnUKKyAgICAgICAgbWVudS5hZGQoCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgLy8gTm8gZ3JvdXBpbmcgaXMgbmVlZGVkIGZvciB0aGlzIG1lbnUKKyAgICAgICAgICAgIE1FTlVfSVRFTV9ERUxFVEUsICAgICAvLyBBIHVuaXF1ZSBJRCBmb3IgdGhpcyBtZW51IGl0ZW0uCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgLy8gTm8gb3JkZXJpbmcgaXMgbmVjZXNzYXJ5IGluIHRoaXMgbWVudQorICAgICAgICAgICAgUi5zdHJpbmcubWVudV9kZWxldGUgIC8vIFRoZSByZXNvdXJjZSBJRCBmb3IgdGhlIHN0cmluZyB0byBkaXNwbGF5IGZvciB0aGlzIGl0ZW0uCisgICAgICAgICk7CiAgICAgfQotICAgICAgICAKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBjb250ZXh0IG1lbnUKKyAgICAgKiAoc2VlIG9uQ3JlYXRlQ29udGV4dE1lbnUoKSkuIFRoZSBvbmx5IG1lbnUgaXRlbXMgdGhhdCBhcmUgYWN0dWFsbHkgaGFuZGxlZCBhcmUgREVMRVRFIGFuZAorICAgICAqIENPUFkuIEFueXRoaW5nIGVsc2UgaXMgYW4gYWx0ZXJuYXRpdmUgb3B0aW9uLCBmb3Igd2hpY2ggZGVmYXVsdCBoYW5kbGluZyBzaG91bGQgYmUgZG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBtZW51IGl0ZW0KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lbnUgaXRlbSB3YXMgREVMRVRFLCBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzaW5nIGlzIG5lZWQsIG90aGVyd2lzZSBmYWxzZSwKKyAgICAgKiB3aGljaCB0cmlnZ2VycyB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgaXRlbS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisKKyAgICAgICAgLy8gVGhlIGRhdGEgZnJvbSB0aGUgbWVudSBpdGVtLgogICAgICAgICBBZGFwdGVyVmlldy5BZGFwdGVyQ29udGV4dE1lbnVJbmZvIGluZm87CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgZXh0cmEgaW5mbyBmcm9tIHRoZSBtZW51IGl0ZW0uIFdoZW4gYW4gbm90ZSBpbiB0aGUgTm90ZXMgbGlzdCBpcyBsb25nLXByZXNzZWQsIGEKKyAgICAgICAgICogY29udGV4dCBtZW51IGFwcGVhcnMuIFRoZSBtZW51IGl0ZW1zIGZvciB0aGUgbWVudSBhdXRvbWF0aWNhbGx5IGdldCB0aGUgZGF0YQorICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG5vdGUgdGhhdCB3YXMgbG9uZy1wcmVzc2VkLiBUaGUgZGF0YSBjb21lcyBmcm9tIHRoZSBwcm92aWRlciB0aGF0CisgICAgICAgICAqIGJhY2tzIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbm90ZSdzIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb250ZXh0IG1lbnUgY3JlYXRpb24gcm91dGluZSBpbiBhIENvbnRleHRNZW51SW5mbworICAgICAgICAgKiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gb25lIG9mIHRoZSBjb250ZXh0IG1lbnUgaXRlbXMgaXMgY2xpY2tlZCwgdGhlIHNhbWUgZGF0YSBpcyBwYXNzZWQsIGFsb25nIHdpdGggdGhlCisgICAgICAgICAqIG5vdGUgSUQsIHRvIG9uQ29udGV4dEl0ZW1TZWxlY3RlZCgpIHZpYSB0aGUgaXRlbSBwYXJhbWV0ZXIuCisgICAgICAgICAqLwogICAgICAgICB0cnkgewotICAgICAgICAgICAgIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbykgaXRlbS5nZXRNZW51SW5mbygpOworCisgICAgICAgICAgICAvLyBDYXN0cyB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIGl0ZW0gaW50byB0aGUgdHlwZSBmb3IgQWRhcHRlclZpZXcgb2JqZWN0cy4KKyAgICAgICAgICAgIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbykgaXRlbS5nZXRNZW51SW5mbygpOwogICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGNhbid0IGJlIGNhc3QsIGxvZ3MgYW4gZXJyb3IKICAgICAgICAgICAgIExvZy5lKFRBRywgImJhZCBtZW51SW5mbyIsIGUpOworCisgICAgICAgICAgICAvLyBUcmlnZ2VycyBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIG1lbnUgaXRlbS4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgVXJpIG5vdGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChnZXRJbnRlbnQoKS5nZXREYXRhKCksIGluZm8uaWQpOwogCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIG1lbnUgaXRlbSdzIElEIGFuZCBjb21wYXJlcyBpdCB0byBrbm93biBhY3Rpb25zLiBUaGUgb25seSBhY3Rpb25zIHRoYXQgYXJlCisgICAgICAgICAqIGltcGxlbWVudGVkIGFyZSBDT1BZIGFuZCBERUxFVEUgKHNldCBpbiBvbkNyZWF0ZUNvbnRleHRNZW51KCkpLgorICAgICAgICAgKi8KICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7Ci0gICAgICAgIGNhc2UgUi5pZC5jb250ZXh0X29wZW46Ci0gICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgdG8gdmlldy9lZGl0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbQotICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fRURJVCwgbm90ZVVyaSkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgUi5pZC5jb250ZXh0X2RlbGV0ZToKLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgbm90ZSB0aGF0IHRoZSBjb250ZXh0IG1lbnUgaXMgZm9yCi0gICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS5kZWxldGUobm90ZVVyaSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5vbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CisKKyAgICAgICAgICAgIC8vIERlbGV0ZXMgdGhlIHNlbGVjdGVkIG5vdGUKKyAgICAgICAgICAgIGNhc2UgTUVOVV9JVEVNX0RFTEVURTogeworCisgICAgICAgICAgICAgICAgLy8gQXBwZW5kcyB0aGUgc2VsZWN0ZWQgbm90ZSdzIElEIHRvIHRoZSBVUkkgc2VudCB3aXRoIHRoZSBpbmNvbWluZyBJbnRlbnQuCisgICAgICAgICAgICAgICAgVXJpIG5vdGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChnZXRJbnRlbnQoKS5nZXREYXRhKCksIGluZm8uaWQpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlcyB0aGUgbm90ZSBmcm9tIHRoZSBwcm92aWRlciBieSBwYXNzaW5nIGluIGEgVVJJIGluIG5vdGUgSUQgZm9ybWF0LgorICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBzZWUgdGhlIGludHJvZHVjdG9yeSBub3RlIGFib3V0IHBlcmZvcm1pbmcgcHJvdmlkZXIgb3BlcmF0aW9ucyBvbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBVSSB0aHJlYWQuCisgICAgICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkuZGVsZXRlKAorICAgICAgICAgICAgICAgICAgICBub3RlVXJpLCAgLy8gVGhlIFVSSSBvZiB0aGUgcHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgIC8vIE5vIHdoZXJlIGNsYXVzZSBpcyBuZWVkZWQsIHNpbmNlIG9ubHkgYSBzaW5nbGUgbm90ZSBJRCBpcyBiZWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkIGluLgorICAgICAgICAgICAgICAgICAgICBudWxsICAgICAgLy8gTm8gd2hlcmUgY2xhdXNlIGlzIHVzZWQsIHNvIG5vIHdoZXJlIGFyZ3VtZW50cyBhcmUgbmVlZGVkLgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIHRvIHRoZSBjYWxsZXIgYW5kIHNraXBzIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGNvcHkpCisgICAgICAgICAgICAvLyBDb3BpZXMgdGhlIHNlbGVjdGVkIG5vdGUgdG8gdGhlIGNsaXBib2FyZAorICAgICAgICAgICAgY2FzZSBNRU5VX0lURU1fQ09QWTogeworCisgICAgICAgICAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgY2xpcGJvYXJkIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmRzIHRoZSBzZWxlY3RlZCBub3RlJ3MgSUQgdG8gdGhlIFVSSSBzZW50IHdpdGggdGhlIGluY29taW5nIEludGVudC4KKyAgICAgICAgICAgICAgICBVcmkgbm90ZVVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGdldEludGVudCgpLmdldERhdGEoKSwgaW5mby5pZCk7CisKKyAgICAgICAgICAgICAgICAvLyBDb3BpZXMgdGhlIG5vdGVzIFVSSSB0byB0aGUgY2xpcGJvYXJkLiBJbiBlZmZlY3QsIHRoaXMgY29waWVzIHRoZSBub3RlIGl0c2VsZgorICAgICAgICAgICAgICAgIGNsaXBib2FyZC5zZXRQcmltYXJ5Q2xpcChDbGlwRGF0YS5uZXdVcmkoICAgLy8gbmV3IGNsaXBib2FyZCBpdGVtIGhvbGRpbmcgYSBVUkkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLCAgICAgICAgICAgICAgIC8vIHJlc29sdmVyIHRvIHJldHJpZXZlIFVSSSBpbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAiTm90ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbCBmb3IgdGhlIGNsaXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGljb24gZm9yIHRoZSBjbGlwCisgICAgICAgICAgICAgICAgICAgICAgICBub3RlVXJpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgVVJJCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIC8vIFJldHVybnMgdG8gdGhlIGNhbGxlciBhbmQgc2tpcHMgZnVydGhlciBwcm9jZXNzaW5nLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorLy9FTkRfSU5DTFVERShjb3B5KQogICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBub3RlIGluIHRoZSBkaXNwbGF5ZWQgbGlzdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgaW5jb21pbmcgYWN0aW9ucyBvZiBlaXRoZXIgUElDSyAoZ2V0IGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIpIG9yCisgICAgICogR0VUX0NPTlRFTlQgKGdldCBvciBjcmVhdGUgZGF0YSkuIElmIHRoZSBpbmNvbWluZyBhY3Rpb24gaXMgRURJVCwgdGhpcyBtZXRob2Qgc2VuZHMgYQorICAgICAqIG5ldyBJbnRlbnQgdG8gc3RhcnQgTm90ZUVkaXRvci4KKyAgICAgKiBAcGFyYW0gbCBUaGUgTGlzdFZpZXcgdGhhdCBjb250YWlucyB0aGUgY2xpY2tlZCBpdGVtCisgICAgICogQHBhcmFtIHYgVGhlIFZpZXcgb2YgdGhlIGluZGl2aWR1YWwgaXRlbQorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdiBpbiB0aGUgZGlzcGxheWVkIGxpc3QKKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJvdyBJRCBvZiB0aGUgY2xpY2tlZCBpdGVtCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgIFVyaSBub3RlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLCBpZCk7Ci0gICAgICAgIAorCisgICAgICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgVVJJIGZyb20gdGhlIGluY29taW5nIFVSSSBhbmQgdGhlIHJvdyBJRAorICAgICAgICBVcmkgdXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLCBpZCk7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgYWN0aW9uIGZyb20gdGhlIGluY29taW5nIEludGVudAogICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0SW50ZW50KCkuZ2V0QWN0aW9uKCk7CisKKyAgICAgICAgLy8gSGFuZGxlcyByZXF1ZXN0cyBmb3Igbm90ZSBkYXRhCiAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BJQ0suZXF1YWxzKGFjdGlvbikgfHwgSW50ZW50LkFDVElPTl9HRVRfQ09OVEVOVC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgLy8gVGhlIGNhbGxlciBpcyB3YWl0aW5nIGZvciB1cyB0byByZXR1cm4gYSBub3RlIHNlbGVjdGVkIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgdXNlci4gIFRoZSBoYXZlIGNsaWNrZWQgb24gb25lLCBzbyByZXR1cm4gaXQgbm93LgotICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSywgbmV3IEludGVudCgpLnNldERhdGEobm90ZVVyaSkpOworCisgICAgICAgICAgICAvLyBTZXRzIHRoZSByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBjb21wb25lbnQgdGhhdCBjYWxsZWQgdGhpcyBBY3Rpdml0eS4gVGhlCisgICAgICAgICAgICAvLyByZXN1bHQgY29udGFpbnMgdGhlIG5ldyBVUkkKKyAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0ssIG5ldyBJbnRlbnQoKS5zZXREYXRhKHVyaSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHRvIHZpZXcvZWRpdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobmV3IEludGVudChJbnRlbnQuQUNUSU9OX0VESVQsIG5vdGVVcmkpKTsKKworICAgICAgICAgICAgLy8gU2VuZHMgb3V0IGFuIEludGVudCB0byBzdGFydCBhbiBBY3Rpdml0eSB0aGF0IGNhbiBoYW5kbGUgQUNUSU9OX0VESVQuIFRoZQorICAgICAgICAgICAgLy8gSW50ZW50J3MgZGF0YSBpcyB0aGUgbm90ZSBJRCBVUkkuIFRoZSBlZmZlY3QgaXMgdG8gY2FsbCBOb3RlRWRpdC4KKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobmV3IEludGVudChJbnRlbnQuQUNUSU9OX0VESVQsIHVyaSkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXZlRm9sZGVyLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpdmVGb2xkZXIuamF2YQppbmRleCAwMGViMzE0Li4yNGFmYWEwIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpdmVGb2xkZXIuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpdmVGb2xkZXIuamF2YQpAQCAtMTYsNTAgKzE2LDk4IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LlNob3J0Y3V0SWNvblJlc291cmNlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTGl2ZUZvbGRlcnM7CiAKKy8qKgorICogVGhpcyBBY3Rpdml0eSBjcmVhdGVzIGEgbGl2ZSBmb2xkZXIgSW50ZW50IGFuZAorICogc2VuZHMgaXQgYmFjayB0byBIT01FLiBGcm9tIHRoZSBkYXRhIGluIHRoZSBJbnRlbnQsIEhPTUUgY3JlYXRlcyBhIGxpdmUgZm9sZGVyIGFuZCBkaXNwbGF5cworICogaXRzIGljb24gaW4gdGhlIEhvbWUgdmlldy4KKyAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBpY29uLCBIb21lIHVzZXMgdGhlIGRhdGEgaXQgZ290IGZyb20gdGhlIEludGVudCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbgorICogZnJvbSBhIGNvbnRlbnQgcHJvdmlkZXIgYW5kIGRpc3BsYXkgaXQgaW4gYSBWaWV3LgorICoKKyAqIFRoZSBpbnRlbnQgZmlsdGVyIGZvciB0aGlzIEFjdGl2aXR5IGlzIHNldCB0byBBQ1RJT05fQ1JFQVRFX0xJVkVfRk9MREVSLCB3aGljaAorICogSE9NRSBzZW5kcyBpbiByZXNwb25zZSB0byBhIGxvbmcgcHJlc3MgYW5kIHNlbGVjdGlvbiBvZiBMaXZlIEZvbGRlci4KKyAqLwogcHVibGljIGNsYXNzIE5vdGVzTGl2ZUZvbGRlciBleHRlbmRzIEFjdGl2aXR5IHsKKwogICAgIC8qKgotICAgICAqIFRoZSBVUkkgZm9yIHRoZSBOb3RlcyBMaXZlIEZvbGRlciBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEFsbCBvZiB0aGUgd29yayBpcyBkb25lIGluIG9uQ3JlYXRlKCkuIFRoZSBBY3Rpdml0eSBkb2Vzbid0IGFjdHVhbGx5IGRpc3BsYXkgYSBVSS4KKyAgICAgKiBJbnN0ZWFkLCBpdCBzZXRzIHVwIGFuIEludGVudCBhbmQgcmV0dXJucyBpdCB0byBpdHMgY2FsbGVyICh0aGUgSE9NRSBhY3Rpdml0eSkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iCi0gICAgICAgICAgICArIE5vdGVQYWQuQVVUSE9SSVRZICsgIi9saXZlX2ZvbGRlcnMvbm90ZXMiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIE5PVEVfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIgotICAgICAgICAgICAgKyBOb3RlUGFkLkFVVEhPUklUWSArICIvbm90ZXMvIyIpOwotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIGluY29taW5nIEludGVudCBhbmQgaXRzIGFjdGlvbi4gSWYgdGhlIGluY29taW5nIEludGVudCB3YXMKKyAgICAgICAgICogQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUiwgdGhlbiBjcmVhdGUgYW4gb3V0Z29pbmcgSW50ZW50IHdpdGggdGhlCisgICAgICAgICAqIG5lY2Vzc2FyeSBkYXRhIGFuZCBzZW5kIGJhY2sgT0suIE90aGVyd2lzZSwgc2VuZCBiYWNrIENBTkNFTC4KKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKIAogICAgICAgICBpZiAoTGl2ZUZvbGRlcnMuQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGxpdmUgZm9sZGVyIGludGVudC4KKworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBJbnRlbnQuCiAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgbGl2ZUZvbGRlckludGVudCA9IG5ldyBJbnRlbnQoKTsKIAotICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5zZXREYXRhKENPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKFIuc3RyaW5nLmxpdmVfZm9sZGVyX25hbWUpKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfSUNPTiwKLSAgICAgICAgICAgICAgICAgICAgSW50ZW50LlNob3J0Y3V0SWNvblJlc291cmNlLmZyb21Db250ZXh0KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5saXZlX2ZvbGRlcl9ub3RlcykpOwotICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9ESVNQTEFZX01PREUsCi0gICAgICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLkRJU1BMQVlfTU9ERV9MSVNUKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfQkFTRV9JTlRFTlQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCBOT1RFX1VSSSkpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBwdXQgZGF0YSBpbnRvIHRoZSBvdXRnb2luZyBJbnRlbnQuIFBsZWFzZSBzZWUKKyAgICAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkxpdmVGb2xkZXJzIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZXNlCisgICAgICAgICAgICAgKiBkYXRhIHZhbHVlcy4gRnJvbSB0aGlzIGRhdGEsIEhPTUUgc2V0cyB1cCBhIGxpdmUgZm9sZGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBVUkkgcGF0dGVybiBmb3IgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmFja2luZyB0aGUgZm9sZGVyLgorICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5zZXREYXRhKE5vdGVQYWQuTm90ZXMuTElWRV9GT0xERVJfVVJJKTsKIAotICAgICAgICAgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGlzIGFjdGl2aXR5IHNob3VsZCBiZSBhIGxpdmUgZm9sZGVyIGludGVudC4KKyAgICAgICAgICAgIC8vIEFkZHMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgbGl2ZSBmb2xkZXIgYXMgYW4gRXh0cmEgc3RyaW5nLgorICAgICAgICAgICAgU3RyaW5nIGZvbGRlcm5hbWUgPSBnZXRTdHJpbmcoUi5zdHJpbmcubGl2ZV9mb2xkZXJfbmFtZSk7CisgICAgICAgICAgICBsaXZlRm9sZGVySW50ZW50LnB1dEV4dHJhKExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX05BTUUsIGZvbGRlcm5hbWUpOworCisgICAgICAgICAgICAvLyBBZGRzIHRoZSBkaXNwbGF5IGljb24gb2YgdGhlIGxpdmUgZm9sZGVyIGFzIGFuIEV4dHJhIHJlc291cmNlLgorICAgICAgICAgICAgU2hvcnRjdXRJY29uUmVzb3VyY2UgZm9sZGVyaWNvbiA9CisgICAgICAgICAgICAgICAgSW50ZW50LlNob3J0Y3V0SWNvblJlc291cmNlLmZyb21Db250ZXh0KHRoaXMsIFIuZHJhd2FibGUubGl2ZV9mb2xkZXJfbm90ZXMpOworICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9JQ09OLCBmb2xkZXJpY29uKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBkaXNwbGF5IG1vZGUgb2YgdGhlIGxpdmUgZm9sZGVyIGFzIGFuIGludGVnZXIuIFRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgIC8vIG1vZGUgY2F1c2VzIHRoZSBsaXZlIGZvbGRlciB0byBkaXNwbGF5IGFzIGEgbGlzdC4KKyAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX0RJU1BMQVlfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgTGl2ZUZvbGRlcnMuRElTUExBWV9NT0RFX0xJU1QpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWRkcyBhIGJhc2UgYWN0aW9uIGZvciBpdGVtcyBpbiB0aGUgbGl2ZSBmb2xkZXIgbGlzdCwgYXMgYW4gSW50ZW50LiBXaGVuIHRoZQorICAgICAgICAgICAgICogdXNlciBjbGlja3MgYW4gaW5kaXZpZHVhbCBub3RlIGluIHRoZSBsaXN0LCB0aGUgbGl2ZSBmb2xkZXIgZmlyZXMgdGhpcyBJbnRlbnQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSXRzIGFjdGlvbiBpcyBBQ1RJT05fRURJVCwgc28gaXQgdHJpZ2dlcnMgdGhlIE5vdGUgRWRpdG9yIGFjdGl2aXR5LiBJdHMKKyAgICAgICAgICAgICAqIGRhdGEgaXMgdGhlIFVSSSBwYXR0ZXJuIGZvciBhIHNpbmdsZSBub3RlIGlkZW50aWZpZWQgYnkgaXRzIElELiBUaGUgbGl2ZSBmb2xkZXIKKyAgICAgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgSUQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gdG8gdGhlIFVSSSBwYXR0ZXJuLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEFzIGEgcmVzdWx0LCBOb3RlIEVkaXRvciBpcyB0cmlnZ2VyZWQgYW5kIGdldHMgYSBzaW5nbGUgbm90ZSB0byByZXRyaWV2ZSBieSBJRC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSW50ZW50IHJldHVybkludGVudAorICAgICAgICAgICAgICAgICAgICA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX1BBVFRFUk4pOworICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9CQVNFX0lOVEVOVCwgcmV0dXJuSW50ZW50KTsKKworICAgICAgICAgICAgLyogQ3JlYXRlcyBhbiBBY3Rpdml0eVJlc3VsdCBvYmplY3QgdG8gcHJvcGFnYXRlIGJhY2sgdG8gSE9NRS4gU2V0IGl0cyByZXN1bHQgaW5kaWNhdG9yCisgICAgICAgICAgICAgKiB0byBPSywgYW5kIHNldHMgdGhlIHJldHVybmVkIEludGVudCB0byB0aGUgbGl2ZSBmb2xkZXIgSW50ZW50IHRoYXQgd2FzIGp1c3QKKyAgICAgICAgICAgICAqIGNvbnN0cnVjdGVkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LLCBsaXZlRm9sZGVySW50ZW50KTsKKwogICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgYWN0aW9uIHdhcyBub3QgQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUiwgY3JlYXRlcyBhbgorICAgICAgICAgICAgLy8gQWN0aXZpdHlSZXN1bHQgd2l0aCB0aGUgaW5kaWNhdG9yIHNldCB0byBDQU5DRUxFRCwgYnV0IGRvIG5vdCByZXR1cm4gYW4gSW50ZW50CiAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIENsb3NlcyB0aGUgQWN0aXZpdHkuIFRoZSBBY3Rpdml0eU9iamVjdCBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIGNhbGxlci4KICAgICAgICAgZmluaXNoKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvVGl0bGVFZGl0b3IuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL1RpdGxlRWRpdG9yLmphdmEKaW5kZXggZmUyMzJlZC4uYjQxYTM1YyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvVGl0bGVFZGl0b3IuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9UaXRsZUVkaXRvci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTI1LDExICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIAotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC5Ob3RlUGFkLk5vdGVDb2x1bW5zOwotCiAvKioKLSAqIEFuIGFjdGl2aXR5IHRoYXQgd2lsbCBlZGl0IHRoZSB0aXRsZSBvZiBhIG5vdGUuIERpc3BsYXlzIGEgZmxvYXRpbmcKLSAqIHdpbmRvdyB3aXRoIGEgdGV4dCBmaWVsZC4KKyAqIFRoaXMgQWN0aXZpdHkgYWxsb3dzIHRoZSB1c2VyIHRvIGVkaXQgYSBub3RlJ3MgdGl0bGUuIEl0IGRpc3BsYXlzIGEgZmxvYXRpbmcgd2luZG93CisgKiBjb250YWluaW5nIGFuIEVkaXRUZXh0LgorICoKKyAqIE5PVEU6IE5vdGljZSB0aGF0IHRoZSBwcm92aWRlciBvcGVyYXRpb25zIGluIHRoaXMgQWN0aXZpdHkgYXJlIHRha2luZyBwbGFjZSBvbiB0aGUgVUkgdGhyZWFkLgorICogVGhpcyBpcyBub3QgYSBnb29kIHByYWN0aWNlLiBJdCBpcyBvbmx5IGRvbmUgaGVyZSB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuIEEgcmVhbAorICogYXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlcn0KKyAqIG9yIHtAbGluayBhbmRyb2lkLm9zLkFzeW5jVGFza30gb2JqZWN0IHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBhc3luY2hyb25vdXNseSBvbiBhIHNlcGFyYXRlIHRocmVhZC4KICAqLwogcHVibGljIGNsYXNzIFRpdGxlRWRpdG9yIGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CiAKQEAgLTM4LDc4ICs0MywxNDIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1RJVExFX0FDVElPTiA9ICJjb20uYW5kcm9pZC5ub3RlcGFkLmFjdGlvbi5FRElUX1RJVExFIjsKIAotICAgIC8qKgotICAgICAqIEFuIGFycmF5IG9mIHRoZSBjb2x1bW5zIHdlIGFyZSBpbnRlcmVzdGVkIGluLgotICAgICAqLworICAgIC8vIENyZWF0ZXMgYSBwcm9qZWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbm90ZSBJRCBhbmQgdGhlIG5vdGUgY29udGVudHMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIE5vdGVDb2x1bW5zLl9JRCwgLy8gMAotICAgICAgICBOb3RlQ29sdW1ucy5USVRMRSwgLy8gMQorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsIC8vIDEKICAgICB9OwotICAgIC8qKiBJbmRleCBvZiB0aGUgdGl0bGUgY29sdW1uICovCisKKyAgICAvLyBUaGUgcG9zaXRpb24gb2YgdGhlIHRpdGxlIGNvbHVtbiBpbiBhIEN1cnNvciByZXR1cm5lZCBieSB0aGUgcHJvdmlkZXIuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9JTkRFWF9USVRMRSA9IDE7CiAKLSAgICAvKioKLSAgICAgKiBDdXJzb3Igd2hpY2ggd2lsbCBwcm92aWRlIGFjY2VzcyB0byB0aGUgbm90ZSB3aG9zZSB0aXRsZSB3ZSBhcmUgZWRpdGluZy4KLSAgICAgKi8KKyAgICAvLyBBIEN1cnNvciBvYmplY3QgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdHMgb2YgcXVlcnlpbmcgdGhlIHByb3ZpZGVyIGZvciBhIG5vdGUuCiAgICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKIAotICAgIC8qKgotICAgICAqIFRoZSBFZGl0VGV4dCBmaWVsZCBmcm9tIG91ciBVSS4gS2VlcCB0cmFjayBvZiB0aGlzIHNvIHdlIGNhbiBleHRyYWN0IHRoZQotICAgICAqIHRleHQgd2hlbiB3ZSBhcmUgZmluaXNoZWQuCi0gICAgICovCisgICAgLy8gQW4gRWRpdFRleHQgb2JqZWN0IGZvciBwcmVzZXJ2aW5nIHRoZSBlZGl0ZWQgdGl0bGUuCiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtVGV4dDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjb250ZW50IFVSSSB0byB0aGUgbm90ZSB0aGF0J3MgYmVpbmcgZWRpdGVkLgotICAgICAqLworICAgIC8vIEEgVVJJIG9iamVjdCBmb3IgdGhlIG5vdGUgd2hvc2UgdGl0bGUgaXMgYmVpbmcgZWRpdGVkLgogICAgIHByaXZhdGUgVXJpIG1Vcmk7CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQW5kcm9pZCB3aGVuIHRoZSBBY3Rpdml0eSBpcyBmaXJzdCBzdGFydGVkLiBGcm9tIHRoZSBpbmNvbWluZworICAgICAqIEludGVudCwgaXQgZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2YgZWRpdGluZyBpcyBkZXNpcmVkLCBhbmQgdGhlbiBkb2VzIGl0LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAorICAgICAgICAvLyBTZXQgdGhlIFZpZXcgZm9yIHRoaXMgQWN0aXZpdHkgb2JqZWN0J3MgVUkuCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRpdGxlX2VkaXRvcik7CiAKLSAgICAgICAgLy8gR2V0IHRoZSB1cmkgb2YgdGhlIG5vdGUgd2hvc2UgdGl0bGUgd2Ugd2FudCB0byBlZGl0CisgICAgICAgIC8vIEdldCB0aGUgSW50ZW50IHRoYXQgYWN0aXZhdGVkIHRoaXMgQWN0aXZpdHksIGFuZCBmcm9tIGl0IGdldCB0aGUgVVJJIG9mIHRoZSBub3RlIHdob3NlCisgICAgICAgIC8vIHRpdGxlIHdlIG5lZWQgdG8gZWRpdC4KICAgICAgICAgbVVyaSA9IGdldEludGVudCgpLmdldERhdGEoKTsKIAotICAgICAgICAvLyBHZXQgYSBjdXJzb3IgdG8gYWNjZXNzIHRoZSBub3RlCi0gICAgICAgIG1DdXJzb3IgPSBtYW5hZ2VkUXVlcnkobVVyaSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIC8qCisgICAgICAgICAqIFVzaW5nIHRoZSBVUkkgcGFzc2VkIGluIHdpdGggdGhlIHRyaWdnZXJpbmcgSW50ZW50LCBnZXRzIHRoZSBub3RlLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGJlaW5nIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gSXQgd2lsbCBibG9jayB0aGUgdGhyZWFkIHVudGlsIHRoZSBxdWVyeQorICAgICAgICAgKiBjb21wbGV0ZXMuIEluIGEgc2FtcGxlIGFwcCwgZ29pbmcgYWdhaW5zdCBhIHNpbXBsZSBwcm92aWRlciBiYXNlZCBvbiBhIGxvY2FsIGRhdGFiYXNlLAorICAgICAgICAgKiB0aGUgYmxvY2sgd2lsbCBiZSBtb21lbnRhcnksIGJ1dCBpbiBhIHJlYWwgYXBwIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAqIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlciBvciBhbmRyb2lkLm9zLkFzeW5jVGFzay4KKyAgICAgICAgICovCiAKLSAgICAgICAgLy8gU2V0IHVwIGNsaWNrIGhhbmRsZXJzIGZvciB0aGUgdGV4dCBmaWVsZCBhbmQgYnV0dG9uCisgICAgICAgIG1DdXJzb3IgPSBtYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICBtVXJpLCAgICAgICAgLy8gVGhlIFVSSSBmb3IgdGhlIG5vdGUgdGhhdCBpcyB0byBiZSByZXRyaWV2ZWQuCisgICAgICAgICAgICBQUk9KRUNUSU9OLCAgLy8gVGhlIGNvbHVtbnMgdG8gcmV0cmlldmUKKyAgICAgICAgICAgIG51bGwsICAgICAgICAvLyBObyBzZWxlY3Rpb24gY3JpdGVyaWEgYXJlIHVzZWQsIHNvIG5vIHdoZXJlIGNvbHVtbnMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAvLyBObyB3aGVyZSBjb2x1bW5zIGFyZSB1c2VkLCBzbyBubyB3aGVyZSB2YWx1ZXMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgIG51bGwgICAgICAgICAvLyBObyBzb3J0IG9yZGVyIGlzIG5lZWRlZC4KKyAgICAgICAgKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBWaWV3IElEIGZvciB0aGUgRWRpdFRleHQgYm94CiAgICAgICAgIG1UZXh0ID0gKEVkaXRUZXh0KSB0aGlzLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlKTsKLSAgICAgICAgbVRleHQuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICAKKworICAgICAgICAvLyBTZXRzIHVwIGEgbGlzdGVuZXIgZm9yIHRoZSBPSyBidXR0b24uIEdldHMgdGhlIEJ1dHRvbiBieSBpdHMgSUQsIHRoZW4gc2V0cyBpdHMKKyAgICAgICAgLy8gb25DbGlja0xpc3RlbmVyIHRvIHRoaXMgQWN0aXZpdHkuCiAgICAgICAgIEJ1dHRvbiBiID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQub2spOwogICAgICAgICBiLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgQWN0aXZpdHkgaXMgYWJvdXQgdG8gY29tZSB0byB0aGUgZm9yZWdyb3VuZC4gVGhpcyBoYXBwZW5zCisgICAgICogd2hlbiB0aGUgQWN0aXZpdHkgY29tZXMgdG8gdGhlIHRvcCBvZiB0aGUgdGFzayBzdGFjaywgT1Igd2hlbiBpdCBpcyBmaXJzdCBzdGFydGluZy4KKyAgICAgKgorICAgICAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpdGxlIGZvciB0aGUgc2VsZWN0ZWQgbm90ZS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0IHdpdGggdGhlIHRpdGxlIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IKKyAgICAgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgcXVlcnkgbWFkZSBpbiBvbkNyZWF0ZSgpIGFjdHVhbGx5IHdvcmtlZC4gSWYgaXQgd29ya2VkLCB0aGVuIHRoZQorICAgICAgICAvLyBDdXJzb3Igb2JqZWN0IGlzIG5vdCBudWxsLiBJZiBpdCBpcyAqZW1wdHkqLCB0aGVuIG1DdXJzb3IuZ2V0Q291bnQoKSA9PSAwLgogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFRoZSBDdXJzb3Igd2FzIGp1c3QgcmV0cmlldmVkLCBzbyBpdHMgaW5kZXggaXMgc2V0IHRvIG9uZSByZWNvcmQgKmJlZm9yZSogdGhlIGZpcnN0CisgICAgICAgICAgICAvLyByZWNvcmQgcmV0cmlldmVkLiBUaGlzIG1vdmVzIGl0IHRvIHRoZSBmaXJzdCByZWNvcmQuCiAgICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CisKKyAgICAgICAgICAgIC8vIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpdGxlIHRleHQgaW4gdGhlIEVkaXRUZXh0IG9iamVjdC4KICAgICAgICAgICAgIG1UZXh0LnNldFRleHQobUN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX1RJVExFKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgQWN0aXZpdHkgbG9zZXMgZm9jdXMuCisgICAgICoKKyAgICAgKiBGb3IgQWN0aXZpdHkgb2JqZWN0cyB0aGF0IGVkaXQgaW5mb3JtYXRpb24sIG9uUGF1c2UoKSBtYXkgYmUgdGhlIG9uZSBwbGFjZSB3aGVyZSBjaGFuZ2VzIGFyZQorICAgICAqIHNhdmVkLiBUaGUgQW5kcm9pZCBhcHBsaWNhdGlvbiBtb2RlbCBpcyBwcmVkaWNhdGVkIG9uIHRoZSBpZGVhIHRoYXQgInNhdmUiIGFuZCAiZXhpdCIgYXJlbid0CisgICAgICogcmVxdWlyZWQgYWN0aW9ucy4gV2hlbiB1c2VycyBuYXZpZ2F0ZSBhd2F5IGZyb20gYW4gQWN0aXZpdHksIHRoZXkgc2hvdWxkbid0IGhhdmUgdG8gZ28gYmFjaworICAgICAqIHRvIGl0IHRvIGNvbXBsZXRlIHRoZWlyIHdvcmsuIFRoZSBhY3Qgb2YgZ29pbmcgYXdheSBzaG91bGQgc2F2ZSBldmVyeXRoaW5nIGFuZCBsZWF2ZSB0aGUKKyAgICAgKiBBY3Rpdml0eSBpbiBhIHN0YXRlIHdoZXJlIEFuZHJvaWQgY2FuIGRlc3Ryb3kgaXQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogVXBkYXRlcyB0aGUgbm90ZSB3aXRoIHRoZSB0ZXh0IGN1cnJlbnRseSBpbiB0aGUgdGV4dCBib3guCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgc3VwZXIub25QYXVzZSgpOwogCisgICAgICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHF1ZXJ5IG1hZGUgaW4gb25DcmVhdGUoKSBhY3R1YWxseSB3b3JrZWQuIElmIGl0IHdvcmtlZCwgdGhlbiB0aGUKKyAgICAgICAgLy8gQ3Vyc29yIG9iamVjdCBpcyBub3QgbnVsbC4gSWYgaXQgaXMgKmVtcHR5KiwgdGhlbiBtQ3Vyc29yLmdldENvdW50KCkgPT0gMC4KKwogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBXcml0ZSB0aGUgdGl0bGUgYmFjayB0byB0aGUgbm90ZSAKKworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIHZhbHVlcyBtYXAgZm9yIHVwZGF0aW5nIHRoZSBwcm92aWRlci4KICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuVElUTEUsIG1UZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnVwZGF0ZShtVXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOworCisgICAgICAgICAgICAvLyBJbiB0aGUgdmFsdWVzIG1hcCwgc2V0cyB0aGUgdGl0bGUgdG8gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGVkaXQgYm94LgorICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGVzIHRoZSBwcm92aWRlciB3aXRoIHRoZSBub3RlJ3MgbmV3IHRpdGxlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIE5vdGU6IFRoaXMgaXMgYmVpbmcgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLiBJdCB3aWxsIGJsb2NrIHRoZSB0aHJlYWQgdW50aWwgdGhlCisgICAgICAgICAgICAgKiB1cGRhdGUgY29tcGxldGVzLiBJbiBhIHNhbXBsZSBhcHAsIGdvaW5nIGFnYWluc3QgYSBzaW1wbGUgcHJvdmlkZXIgYmFzZWQgb24gYQorICAgICAgICAgICAgICogbG9jYWwgZGF0YWJhc2UsIHRoZSBibG9jayB3aWxsIGJlIG1vbWVudGFyeSwgYnV0IGluIGEgcmVhbCBhcHAgeW91IHNob3VsZCB1c2UKKyAgICAgICAgICAgICAqIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlciBvciBhbmRyb2lkLm9zLkFzeW5jVGFzay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkudXBkYXRlKAorICAgICAgICAgICAgICAgIG1VcmksICAgIC8vIFRoZSBVUkkgZm9yIHRoZSBub3RlIHRvIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICB2YWx1ZXMsICAvLyBUaGUgdmFsdWVzIG1hcCBjb250YWluaW5nIHRoZSBjb2x1bW5zIHRvIHVwZGF0ZSBhbmQgdGhlIHZhbHVlcyB0byB1c2UuCisgICAgICAgICAgICAgICAgbnVsbCwgICAgLy8gTm8gc2VsZWN0aW9uIGNyaXRlcmlhIGlzIHVzZWQsIHNvIG5vICJ3aGVyZSIgY29sdW1ucyBhcmUgbmVlZGVkLgorICAgICAgICAgICAgICAgIG51bGwgICAgIC8vIE5vICJ3aGVyZSIgY29sdW1ucyBhcmUgdXNlZCwgc28gbm8gIndoZXJlIiB2YWx1ZXMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgICk7CisKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhbnl3aGVyZSBpbiB0aGUgdGl0bGUgdGV4dCBib3guCisgICAgICoKKyAgICAgKiBJdCBjYWxscyBmaW5pc2goKSwgd2hpY2ggaW1tZWRpYXRlbHkgdHJpZ2dlcnMgdGhlIG9uUGF1c2UoKSBtZXRob2QgaW4gdGhpcyBBY3Rpdml0eS4gSW4KKyAgICAgKiB0dXJuLCBvblBhdXNlKCkgc2F2ZXMgdGhlIHRleHQgY3VycmVudGx5IGluIHRoZSB0aXRsZSB0ZXh0IGJveCB0byB0aGUgbm90ZS4KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAvLyBXaGVuIHRoZSB1c2VyIGNsaWNrcywganVzdCBmaW5pc2ggdGhpcyBhY3Rpdml0eS4KLSAgICAgICAgLy8gb25QYXVzZSB3aWxsIGJlIGNhbGxlZCwgYW5kIHdlIHNhdmUgb3VyIGRhdGEgdGhlcmUuCisKKyAgICAgICAgLy8gQ2FsbHMgZmluaXNoIHRvIGZvcmNlIHRoZSBBY3Rpdml0eSB0byBzaHV0IGRvd24uIEluIHRoZSBsaWZlY3ljbGUsIHRoaXMgZm9yY2VzIGEgY2FsbCB0bworICAgICAgICAvLyBvblBhdXNlKCksIHdoaWNoIHNhdmVzIHRoZSB3b3JrIHRoZSB1c2VyIGhhcyBkb25lLgogICAgICAgICBmaW5pc2goKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvQW5kcm9pZC5tayBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VmYWZjLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE5vdGVQYWRUZXN0cwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9IE5vdGVQYWQKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGFmZDUwMmIuLmI2YjYxMDEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xLDMyICsxLDQ5IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLQorICAgIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAKLSAgICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC50ZXN0cyI+Ci0gICAgCi0gICAgPCEtLSBXZSBhZGQgYW4gYXBwbGljYXRpb24gdGFnIGhlcmUganVzdCBzbyB0aGF0IHdlIGNhbiBpbmRpY2F0ZSB0aGF0Ci0gICAgICAgICB0aGlzIHBhY2thZ2UgbmVlZHMgdG8gbGluayBhZ2FpbnN0IHRoZSBhbmRyb2lkLnRlc3QgbGlicmFyeSwKLSAgICAgICAgIHdoaWNoIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIHRlc3QgY2FzZXMuIC0tPiAgICAKKzwhLS0KKyAgICBUbyBydW4gdGhpcyB0ZXN0IHBhY2thZ2UsIGluc3RhbGwgaXQgYW5kIHRoZSBOb3Rlc0xpc3QgYXBwbGljYXRpb24gdG8gYSBkZXZpY2Ugb3IgZW11bGF0b3IgYW5kCisgICAgdGhlbiBydW4KKyAgICBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKy0tPgorPCEtLQorICAgIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHBhY2thZ2UgSUQgb2YgdGhlIGNvZGUuIFRoZSBjb2RlIHBhY2thZ2UgSUQKKyAgICAnY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkJyBhbGxvd3MgdGhlIHRlc3QgY29kZSB0byB1c2UgZGVjbGFyYXRpb25zIGZyb20gdGhlIGFwcGxpY2F0aW9uCisgICAgdW5kZXIgdGVzdCwgd2hpbGUgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlkZW50aWZpZXMgdGhpcyBhcyBhIHNlcGFyYXRlIHRlc3QgcGFja2FnZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQudGVzdHMiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorICAgIDwhLS0KKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBwYWNrYWdlIG11c3QgYmUgbGlua2VkIGFnYWluc3QgdGhlIGxpYnJhcnkKKyAgICAgICAgYW5kcm9pZC50ZXN0LnJ1bm5lciwgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIG5vcm1hbCBsaW5rIHBhdGguIFRoZSBsaWJyYXJ5IGNvbnRhaW5zCisgICAgICAgIGNvZGUgZm9yIHRlc3QgY2FzZXMuCisgICAgLS0+CiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgotCi0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkIgotICAgICAgYW5kcm9pZDpsYWJlbD0iTm90ZVBhZCBzYW1wbGUgdGVzdHMiPgotICA8L2luc3RydW1lbnRhdGlvbj4gIAotICAKKyAgICA8IS0tCisgICAgICAgIFRoZSBpbnN0cnVtZW50YXRpb24gZWxlbWVudCB0ZWxscyBBbmRyb2lkIHRvIHVzZSBpbnN0cnVtZW50YXRpb24gdG8gcnVuIHRoaXMgcGFja2FnZS4KKyAgICAgICAgVGhlIHRhcmdldCBBbmRyb2lkIHBhY2thZ2UgJ2NvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZCcgaXMgbG9hZGVkIGFsb25nIHdpdGggdGhlCisgICAgICAgIHRlc3QgcGFja2FnZSAnY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLnRlc3RzJy4gQW5kcm9pZCB0aGVuIHN0YXJ0cyB0aGUgY2xhc3MKKyAgICAgICAgJ2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyJywgd2hpY2ggbG9hZHMgdGhlIHRlc3QgY2FzZSBjbGFzc2VzIGluIHRoZSBwYWNrYWdlLgorICAgIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZCIvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjEwIj48L3VzZXMtc2RrPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzM5ZGUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10ZXN0ZWQucHJvamVjdC5kaXI9Li4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRUZXN0LmphdmEgYi9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkQWN0aXZpdHlUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFRlc3QuamF2YQpyZW5hbWUgdG8gc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZEFjdGl2aXR5VGVzdC5qYXZhCmluZGV4IDgwZjcxZDIuLjZhNjZlYmIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRUZXN0LmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZEFjdGl2aXR5VGVzdC5qYXZhCkBAIC0xNywxOSArMTcsMTggQEAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotCiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVzTGlzdDsKIAogLyoqCiAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgbWFpbiBsYXVuY2hlciBhY3Rpdml0eSBvcGVucyB1cCBwcm9wZXJseSwgd2hpY2ggd2lsbCBiZQogICogdmVyaWZpZWQgYnkge0BsaW5rICN0ZXN0QWN0aXZpdHlUZXN0Q2FzZVNldFVwUHJvcGVybHl9LgogICovCi1wdWJsaWMgY2xhc3MgTm90ZVBhZFRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxOb3Rlc0xpc3Q+IHsKK3B1YmxpYyBjbGFzcyBOb3RlUGFkQWN0aXZpdHlUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8Tm90ZXNMaXN0PiB7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gZm9yIHRoZSB7QGxpbmsgTm90ZXNMaXN0fSBhY3Rpdml0eS4KICAgICAgKi8KLSAgICBwdWJsaWMgTm90ZVBhZFRlc3QoKSB7CisgICAgcHVibGljIE5vdGVQYWRBY3Rpdml0eVRlc3QoKSB7CiAgICAgICAgIHN1cGVyKE5vdGVzTGlzdC5jbGFzcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXJUZXN0LmphdmEgYi9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ODM0NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworCisvKgorICovCisvKioKKyAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBOb3RlIFBhZCBzYW1wbGUgYXBwbGljYXRpb24uCisgKgorICogVG8gbGVhcm4gaG93IHRvIHJ1biBhbiBlbnRpcmUgdGVzdCBwYWNrYWdlIG9yIG9uZSBvZiBpdHMgY2xhc3NlcywgcGxlYXNlIHNlZQorICogIlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQiIG9yICJUZXN0aW5nIGluIE90aGVyIElERXMiIGluIHRoZSBEZXZlbG9wZXIgR3VpZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBOb3RlUGFkUHJvdmlkZXJUZXN0IGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZTI8Tm90ZVBhZFByb3ZpZGVyPiB7CisKKyAgICAvLyBBIFVSSSB0aGF0IHRoZSBwcm92aWRlciBkb2VzIG5vdCBvZmZlciwgZm9yIHRlc3RpbmcgZXJyb3IgaGFuZGxpbmcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIElOVkFMSURfVVJJID0KKyAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgImludmFsaWQiKTsKKworICAgIC8vIENvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2NrZWQgY29udGVudCByZXNvbHZlciBmb3IgdGhlIHByb3ZpZGVyIHVuZGVyIHRlc3QuCisgICAgcHJpdmF0ZSBNb2NrQ29udGVudFJlc29sdmVyIG1Nb2NrUmVzb2x2ZXI7CisKKyAgICAvLyBDb250YWlucyBhbiBTUUxpdGUgZGF0YWJhc2UsIHVzZWQgYXMgdGVzdCBkYXRhCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGI7CisKKyAgICAvLyBDb250YWlucyB0aGUgdGVzdCBkYXRhLCBhcyBhbiBhcnJheSBvZiBOb3RlSW5mbyBpbnN0YW5jZXMuCisgICAgcHJpdmF0ZSBmaW5hbCBOb3RlSW5mb1tdIFRFU1RfTk9URVMgPSB7CisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTAiLCAiVGhpcyBpcyBub3RlIDAiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlMSIsICJUaGlzIGlzIG5vdGUgMSIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGUyIiwgIlRoaXMgaXMgbm90ZSAyIiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTMiLCAiVGhpcyBpcyBub3RlIDMiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlNCIsICJUaGlzIGlzIG5vdGUgNCIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGU1IiwgIlRoaXMgaXMgbm90ZSA1IiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTYiLCAiVGhpcyBpcyBub3RlIDYiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlNyIsICJUaGlzIGlzIG5vdGUgNyIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGU4IiwgIlRoaXMgaXMgbm90ZSA4IiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTkiLCAiVGhpcyBpcyBub3RlIDkiKSB9OworCisgICAgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBvbmUgZGF5IChtaWxsaXNlY29uZHMgKiBzZWNvbmRzICogbWludXRlcyAqIGhvdXJzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgT05FX0RBWV9NSUxMSVMgPSAxMDAwICogNjAgKiA2MCAqIDI0OworCisgICAgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBvbmUgd2VlaworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgT05FX1dFRUtfTUlMTElTID0gT05FX0RBWV9NSUxMSVMgKiA3OworCisgICAgLy8gQ3JlYXRlcyBhIGNhbGVuZGFyIG9iamVjdCBlcXVhbCB0byBKYW51YXJ5IDEsIDIwMTAgYXQgMTIgbWlkbmlnaHQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcmVnb3JpYW5DYWxlbmRhciBURVNUX0NBTEVOREFSID0KKyAgICAgICAgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDIwMTAsIENhbGVuZGFyLkpBTlVBUlksIDEsIDAsIDAsIDApOworCisgICAgLy8gU3RvcmVzIGEgdGltZXN0YW1wIHZhbHVlLCBzZXQgdG8gYW4gYXJiaXRyYXJ5IHN0YXJ0aW5nIHBvaW50CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBTVEFSVF9EQVRFID0gVEVTVF9DQUxFTkRBUi5nZXRUaW1lSW5NaWxsaXMoKTsKKworICAgIC8vIFNldHMgYSBNSU1FIHR5cGUgZmlsdGVyLCB1c2VkIHRvIHRlc3QgcHJvdmlkZXIgbWV0aG9kcyB0aGF0IHJldHVybiBtb3JlIHRoYW4gb25lIE1JTUUgdHlwZQorICAgIC8vIGZvciBhIHBhcnRpY3VsYXIgbm90ZS4gVGhlIGZpbHRlciB3aWxsIHJldHJpZXZlIGFueSBNSU1FIHR5cGVzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbnRlbnQgVVJJLgorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVTX0FMTCA9ICIqLyoiOworCisgICAgLy8gU2V0cyBhIE1JTUUgdHlwZSBmaWx0ZXIsIHVzZWQgdG8gdGVzdCBwcm92aWRlciBtZXRob2RzIHRoYXQgcmV0dXJuIG1vcmUgdGhhbiBvbmUgTUlNRSB0eXBlCisgICAgLy8gZm9yIGEgcGFydGljdWxhciBub3RlLiBUaGUgZmlsdGVyIGlzIG5vbnNlbnNlLCBzbyBpdCB3aWxsIG5vdCByZXRyaWV2ZSBhbnkgTUlNRSB0eXBlcy4KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlNRV9UWVBFU19OT05FID0gInF3ZXIvcXdlciI7CisKKyAgICAvLyBTZXRzIGEgTUlNRSB0eXBlIGZpbHRlciBmb3IgcGxhaW4gdGV4dCwgdXNlZCB0byB0aGUgcHJvdmlkZXIncyBtZXRob2RzIHRoYXQgb25seSBoYW5kbGUKKyAgICAvLyBwbGFpbiB0ZXh0CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9URVhUID0gInRleHQvcGxhaW4iOworCisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHRlc3QgY2FzZSBjbGFzcy4KKyAgICAgKiBDYWxscyB0aGUgc3VwZXIgY29uc3RydWN0b3Igd2l0aCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdCBhbmQgdGhlCisgICAgICogYXV0aG9yaXR5IG5hbWUgb2YgdGhlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBOb3RlUGFkUHJvdmlkZXJUZXN0KCkgeworICAgICAgICBzdXBlcihOb3RlUGFkUHJvdmlkZXIuY2xhc3MsIE5vdGVQYWQuQVVUSE9SSVRZKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHMgdXAgdGhlIHRlc3QgZW52aXJvbm1lbnQgYmVmb3JlIGVhY2ggdGVzdCBtZXRob2QuIENyZWF0ZXMgYSBtb2NrIGNvbnRlbnQgcmVzb2x2ZXIsCisgICAgICogZ2V0cyB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdCwgYW5kIGNyZWF0ZXMgYSBuZXcgZGF0YWJhc2UgZm9yIHRoZSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBDYWxscyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICAvLyBHZXRzIHRoZSByZXNvbHZlciBmb3IgdGhpcyB0ZXN0LgorICAgICAgICBtTW9ja1Jlc29sdmVyID0gZ2V0TW9ja0NvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgYSBoYW5kbGUgdG8gdGhlIGRhdGFiYXNlIHVuZGVybHlpbmcgdGhlIHByb3ZpZGVyLiBHZXRzIHRoZSBwcm92aWRlciBpbnN0YW5jZQorICAgICAgICAgKiBjcmVhdGVkIGluIHN1cGVyLnNldFVwKCksIGdldHMgdGhlIERhdGFiYXNlT3BlbkhlbHBlciBmb3IgdGhlIHByb3ZpZGVyLCBhbmQgZ2V0cworICAgICAgICAgKiBhIGRhdGFiYXNlIG9iamVjdCBmcm9tIHRoZSBoZWxwZXIuCisgICAgICAgICAqLworICAgICAgICBtRGIgPSBnZXRQcm92aWRlcigpLmdldE9wZW5IZWxwZXJGb3JUZXN0KCkuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgIH0KKworICAgIC8qCisgICAgICogIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QgbWV0aG9kLCB0byBjbGVhbiB1cCB0aGUgY3VycmVudCBmaXh0dXJlLiBTaW5jZQorICAgICAqICB0aGlzIHNhbXBsZSB0ZXN0IGNhc2UgcnVucyBpbiBhbiBpc29sYXRlZCBjb250ZXh0LCBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0cyB1cCB0ZXN0IGRhdGEuCisgICAgICogVGhlIHRlc3QgZGF0YSBpcyBpbiBhbiBTUUwgZGF0YWJhc2UuIEl0IGlzIGNyZWF0ZWQgaW4gc2V0VXAoKSB3aXRob3V0IGFueSBkYXRhLAorICAgICAqIGFuZCBwb3B1bGF0ZWQgaW4gaW5zZXJ0RGF0YSBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydERhdGEoKSB7CisgICAgICAgIC8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbnRlbnRWYWx1ZXMgbWFwIHR5cGUgZXhwZWN0ZWQgYnkgZGF0YWJhc2UgaW5zZXJ0aW9ucworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgLy8gU2V0cyB1cCB0ZXN0IGRhdGEKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IFRFU1RfTk9URVMubGVuZ3RoOyBpbmRleCsrKSB7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgY3JlYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBkYXRlIGZvciB0aGUgbm90ZQorICAgICAgICAgICAgVEVTVF9OT1RFU1tpbmRleF0uc2V0Q3JlYXRpb25EYXRlKFNUQVJUX0RBVEUgKyAoaW5kZXggKiBPTkVfREFZX01JTExJUykpOworICAgICAgICAgICAgVEVTVF9OT1RFU1tpbmRleF0uc2V0TW9kaWZpY2F0aW9uRGF0ZShTVEFSVF9EQVRFICsgKGluZGV4ICogT05FX1dFRUtfTUlMTElTKSk7CisKKyAgICAgICAgICAgIC8vIEFkZHMgYSByZWNvcmQgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgbURiLmluc2VydE9yVGhyb3coCisgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAgICAgICAgICAgICAvLyB0aGUgdGFibGUgbmFtZSBmb3IgdGhlIGluc2VydAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsICAgICAgLy8gY29sdW1uIHNldCB0byBudWxsIGlmIGVtcHR5IHZhbHVlcyBtYXAKKyAgICAgICAgICAgICAgICBURVNUX05PVEVTW2luZGV4XS5nZXRDb250ZW50VmFsdWVzKCkgIC8vIHRoZSB2YWx1ZXMgbWFwIHRvIGluc2VydAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgdGhlIHByb3ZpZGVyJ3MgcHVibGljbHkgYXZhaWxhYmxlIFVSSXMuIElmIHRoZSBVUkkgaXMgbm90IG9uZSB0aGF0IHRoZSBwcm92aWRlcgorICAgICAqIHVuZGVyc3RhbmRzLCB0aGUgcHJvdmlkZXIgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgYWxzbyB0ZXN0cyB0aGUgcHJvdmlkZXIncyBnZXRUeXBlKCkKKyAgICAgKiBtZXRob2QgZm9yIGVhY2ggVVJJLCB3aGljaCBzaG91bGQgcmV0dXJuIHRoZSBNSU1FIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBVUkkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFVyaUFuZEdldFR5cGUoKSB7CisgICAgICAgIC8vIFRlc3RzIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSBub3RlcyB0YWJsZSBVUkkuCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0VHlwZShOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9UWVBFLCBtaW1lVHlwZSk7CisKKyAgICAgICAgLy8gVGVzdHMgdGhlIE1JTUUgdHlwZSBmb3IgdGhlIGxpdmUgZm9sZGVyIFVSSS4KKyAgICAgICAgbWltZVR5cGUgPSBtTW9ja1Jlc29sdmVyLmdldFR5cGUoTm90ZVBhZC5Ob3Rlcy5MSVZFX0ZPTERFUl9VUkkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1RZUEUsIG1pbWVUeXBlKTsKKworICAgICAgICAvLyBDcmVhdGVzIGEgVVJJIHdpdGggYSBwYXR0ZXJuIGZvciBub3RlIGlkcy4gVGhlIGlkIGRvZXNuJ3QgaGF2ZSB0byBleGlzdC4KKyAgICAgICAgVXJpIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgMSk7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgbm90ZSBJRCBVUkkgTUlNRSB0eXBlLgorICAgICAgICBtaW1lVHlwZSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0VHlwZShub3RlSWRVcmkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX0lURU1fVFlQRSwgbWltZVR5cGUpOworCisgICAgICAgIC8vIFRlc3RzIGFuIGludmFsaWQgVVJJLiBUaGlzIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCisgICAgICAgIG1pbWVUeXBlID0gbU1vY2tSZXNvbHZlci5nZXRUeXBlKElOVkFMSURfVVJJKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIHN0cmVhbSBNSU1FIHR5cGVzIHJldHVybmVkIGJ5IGdldFN0cmVhbVR5cGVzKCkuIElmIHRoZSBwcm92aWRlciBzdXBwb3J0cworICAgICAqIHN0cmVhbSBkYXRhIGZvciB0aGUgVVJJLCB0aGUgTUlNRSB0eXBlIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBwcm92aWRlciByZXR1cm5zIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmVhbVR5cGVzKCkgeworCisgICAgICAgIC8vIFRlc3RzIHRoZSBub3RlcyB0YWJsZSBVUkkuIFRoaXMgc2hvdWxkIHJldHVybiBudWxsLCBzaW5jZSB0aGUgY29udGVudCBwcm92aWRlciBkb2VzCisgICAgICAgIC8vIG5vdCBwcm92aWRlIGEgc3RyZWFtIE1JTUUgdHlwZSBmb3IgbXVsdGlwbGUgbm90ZXMuCisgICAgICAgIGFzc2VydE51bGwobU1vY2tSZXNvbHZlci5nZXRTdHJlYW1UeXBlcyhOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCBNSU1FX1RZUEVTX0FMTCkpOworCisgICAgICAgIC8vIFRlc3RzIHRoZSBsaXZlIGZvbGRlcnMgVVJJLiBUaGlzIHNob3VsZCByZXR1cm4gbnVsbCwgc2luY2UgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3QKKyAgICAgICAgLy8gcHJvdmlkZSBhIHN0cmVhbSBNSU1FIHR5cGUgZm9yIG11bHRpcGxlIG5vdGVzLgorICAgICAgICBhc3NlcnROdWxsKG1Nb2NrUmVzb2x2ZXIuZ2V0U3RyZWFtVHlwZXMoTm90ZVBhZC5Ob3Rlcy5MSVZFX0ZPTERFUl9VUkksIE1JTUVfVFlQRVNfQUxMKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGVzdHMgdGhlIG5vdGUgaWQgVVJJIGZvciBhIHNpbmdsZSBub3RlLCB1c2luZyBfSUQgdmFsdWUgIjEiIHdoaWNoIGlzIGEgdmFsaWQgSUQuIFVzZXMgYQorICAgICAgICAgKiB2YWxpZCBNSU1FIHR5cGUgZmlsdGVyIHRoYXQgd2lsbCByZXR1cm4gYWxsIHRoZSBzdXBwb3J0ZWQgTUlNRSB0eXBlcyBmb3IgYSBjb250ZW50IFVSSS4KKyAgICAgICAgICogVGhlIHJlc3VsdCBzaG91bGQgYmUgInRleHQvcGxhaW4iLgorICAgICAgICAgKi8KKworICAgICAgICAvLyBDb25zdHJ1Y3RzIHRoZSBub3RlIGlkIFVSSQorICAgICAgICBVcmkgdGVzdFVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgIjEiKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBNSU1FIHR5cGVzIGZvciB0aGUgVVJJLCB3aXRoIHRoZSBmaWx0ZXIgdGhhdCBzZWxlY3RzIGFsbCBNSU1FIHR5cGVzLgorICAgICAgICBTdHJpbmcgbWltZVR5cGVbXSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0U3RyZWFtVHlwZXModGVzdFVyaSwgTUlNRV9UWVBFU19BTEwpOworCisgICAgICAgIC8vIFRlc3RzIHRoYXQgdGhlIHJlc3VsdCBpcyBub3QgbnVsbCBhbmQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHZhbHVlLiBBbHNvIHRlc3RzIHRoYXQKKyAgICAgICAgLy8gb25seSBvbmUgTUlNRSB0eXBlIGlzIHJldHVybmVkLgorICAgICAgICBhc3NlcnROb3ROdWxsKG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbWVUeXBlWzBdLCJ0ZXh0L3BsYWluIik7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW1lVHlwZS5sZW5ndGgsMSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGVzdHMgd2l0aCB0aGUgc2FtZSBVUkkgYnV0IHdpdGggYSBmaWx0ZXIgdGhhdCBzaG91bGQgbm90IHJldHVybiBhbnkgVVJJcy4KKyAgICAgICAgICovCisgICAgICAgIG1pbWVUeXBlID0gbU1vY2tSZXNvbHZlci5nZXRTdHJlYW1UeXBlcyh0ZXN0VXJpLCBNSU1FX1RZUEVTX05PTkUpOworICAgICAgICBhc3NlcnROdWxsKG1pbWVUeXBlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUZXN0cyB3aXRoIGEgVVJJIHRoYXQgc2hvdWxkIG5vdCBoYXZlIGFueSBhc3NvY2lhdGVkIHN0cmVhbSBNSU1FIHR5cGVzLCBidXQgd2l0aCBhCisgICAgICAgICAqIGZpbHRlciB0aGF0IHJldHVybnMgYWxsIHR5cGVzLiBUaGUgcmVzdWx0IHNob3VsZCBzdGlsbCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgbWltZVR5cGUgPSBtTW9ja1Jlc29sdmVyLmdldFN0cmVhbVR5cGVzKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIE1JTUVfVFlQRVNfQUxMKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtaW1lVHlwZSk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIHB1YmxpYyBBUEkgZm9yIG9wZW5pbmcgYSByZWFkLW9ubHkgcGlwZSBvZiBkYXRhIGZvciBhIG5vdGUgSUQgVVJJCisgICAgICogYW5kIE1JTUUgdHlwZSBmaWx0ZXIgbWF0Y2hpbmcgInRleHQvcGxhaW4iLgorICAgICAqIFRoaXMgbWV0aG9kIHRocm93cyBhIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzbid0IGZvciBhIG5vdGUgSUQgb3IgdGhlIE1JTUUgdHlwZQorICAgICAqIGZpbHRlciBpc24ndCAidGV4dC9wbGFpbiIuIEl0IHRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiBpdCBjYW4ndCBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblR5cGVkQXNzZXRGaWxlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEEgVVJJIHRvIGNvbnRhaW4gYSBub3RlIElEIGNvbnRlbnQgVVJJLgorICAgICAgICBVcmkgdGVzdE5vdGVJZFVyaTsKKworICAgICAgICAvLyBBIGhhbmRsZSBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBvcGVuVHlwZWRBc3NldEZpbGUoKS4KKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciB0ZXN0QXNzZXREZXNjcmlwdG9yOworCisgICAgICAgIC8vIEluc2VydHMgZGF0YSBpbnRvIHRoZSBwcm92aWRlciwgc28gdGhhdCB0aGUgbm90ZSBJRCBVUkkgd2lsbCBiZSByZWNvZ25pemVkLgorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gQ29uc3RydWN0cyBhIFVSSSB3aXRoIGEgbm90ZSBJRCBvZiAxLiBUaGlzIG1hdGNoZXMgdGhlIG5vdGUgSUQgVVJJIHBhdHRlcm4gdGhhdAorICAgICAgICAvLyBvcGVuVHlwZWRBc3NldEZpbGUgY2FuIGhhbmRsZS4KKyAgICAgICAgdGVzdE5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgMSk7CisKKyAgICAgICAgLy8gT3BlbnMgdGhlIHBpcGUuIFRoZSBvcHRzIGFyZ3VtZW50IGlzIGZvciBwYXNzaW5nIG9wdGlvbnMgZnJvbSBhIGNhbGxlciB0byB0aGUgcHJvdmlkZXIsCisgICAgICAgIC8vIGJ1dCB0aGUgTm90ZVBhZFByb3ZpZGVyIGRvZXMgbm90IHVzZSBpdC4KKyAgICAgICAgdGVzdEFzc2V0RGVzY3JpcHRvciA9IG1Nb2NrUmVzb2x2ZXIub3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICB0ZXN0Tm90ZUlkVXJpLCAgICAgICAgIC8vIHRoZSBVUkkgZm9yIGEgc2luZ2xlIG5vdGUuIFRoZSBwaXBlIHBvaW50cyB0byB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlJ3MgZGF0YQorICAgICAgICAgICAgICAgIE1JTUVfVFlQRV9URVhULCAgICAgICAgLy8gYSBNSU1FIHR5cGUgb2YgInRleHQvcGxhaW4iCisgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAvLyB0aGUgIm9wdHMiIGFyZ3VtZW50CisgICAgICAgICk7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgcGFyY2VsIGZpbGUgaGFuZGxlIGZyb20gdGhlIGFzc2V0IGZpbGUgaGFuZGxlLgorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciB0ZXN0UGFyY2VsRGVzY3JpcHRvciA9IHRlc3RBc3NldERlc2NyaXB0b3IuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBmaWxlIGhhbmRsZSBmcm9tIHRoZSBhc3NldCBmaWxlIGhhbmRsZS4KKyAgICAgICAgRmlsZURlc2NyaXB0b3IgdGVzdERlc2NyaXB0b3IgPSB0ZXN0QXNzZXREZXNjcmlwdG9yLmdldEZpbGVEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgYXNzZXQgZmlsZSBoYW5kbGUgaXMgbm90IG51bGwuCisgICAgICAgIGFzc2VydE5vdE51bGwodGVzdEFzc2V0RGVzY3JpcHRvcik7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgcGFyY2VsIGZpbGUgaGFuZGxlIGlzIG5vdCBudWxsLgorICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RQYXJjZWxEZXNjcmlwdG9yKTsKKworICAgICAgICAvLyBUZXN0cyB0aGF0IHRoZSBmaWxlIGhhbmRsZSBpcyBub3QgbnVsbC4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RGVzY3JpcHRvcik7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgZmlsZSBoYW5kbGUgaXMgdmFsaWQuCisgICAgICAgIGFzc2VydFRydWUodGVzdERlc2NyaXB0b3IudmFsaWQoKSk7CisKKyAgICAgICAgLy8gQ2xvc2VzIHRoZSBmaWxlIGhhbmRsZXMuCisgICAgICAgIHRlc3RQYXJjZWxEZXNjcmlwdG9yLmNsb3NlKCk7CisgICAgICAgIHRlc3RBc3NldERlc2NyaXB0b3IuY2xvc2UoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDaGFuZ2VzIHRoZSBVUkkgdG8gYSBub3RlcyBVUkkgZm9yIG11bHRpcGxlIG5vdGVzLCBhbmQgcmUtdGVzdC4gVGhpcyBzaG91bGQgZmFpbCwgc2luY2UKKyAgICAgICAgICogdGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyB0eXBlIG9mIFVSSS4gQSBGaWxlTm90Rm91bmQgZXhjZXB0aW9uIGlzIGV4cGVjdGVkLAorICAgICAgICAgKiBzbyBjYWxsIGZhaWwoKSBpZiBpdCBkb2VzICpub3QqIG9jY3VyLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RBc3NldERlc2NyaXB0b3IgPSBtTW9ja1Jlc29sdmVyLm9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgICAgIE1JTUVfVFlQRV9URVhULAorICAgICAgICAgICAgICAgICAgICBudWxsCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY29udGludWUKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoYW5nZXMgYmFjayB0byB0aGUgbm90ZSBJRCBVUkksIGJ1dCBjaGFuZ2VzIHRoZSBNSU1FIHR5cGUgZmlsdGVyIHRvIG9uZSB0aGF0IGlzIG5vdAorICAgICAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLiBUaGlzIHNob3VsZCBhbHNvIGZhaWwsIHNpbmNlIHRoZSBwcm92aWRlciB3aWxsIG9ubHkgb3BlbiBhCisgICAgICAgICAqIHBpcGUgZm9yIE1JTUUgdHlwZSAidGV4dC9wbGFpbiIuIEEgRmlsZU5vdEZvdW5kIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCwgc28gY2FsbHMKKyAgICAgICAgICogZmFpbCgpIGlmIGl0IGRvZXMgKm5vdCogb2NjdXIuCisgICAgICAgICAqLworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0QXNzZXREZXNjcmlwdG9yID0gbU1vY2tSZXNvbHZlci5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICB0ZXN0Tm90ZUlkVXJpLAorICAgICAgICAgICAgICAgICAgICBNSU1FX1RZUEVTX05PTkUsCisgICAgICAgICAgICAgICAgICAgIG51bGwKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjb250aW51ZQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIG1ldGhvZCBmb3IgYWN0dWFsbHkgcmV0dXJuaW5nIHdyaXRpbmcgZGF0YSBpbnRvIGEgcGlwZS4gVGhlIG1ldGhvZCBpcworICAgICAqIHdyaXRlRGF0YVRvUGlwZSwgYnV0IHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgZGlyZWN0bHkuIEluc3RlYWQsIGEgY2FsbGVyIGludm9rZXMKKyAgICAgKiBvcGVuVHlwZWRBc3NldEZpbGUoKS4gVGhhdCBtZXRob2QgdXNlcyBDb250ZW50UHJvdmlkZXIub3BlblBpcGVIZWxwZXIoKSwgd2hpY2ggaGFzIGFzIG9uZSBvZgorICAgICAqIGl0cyBhcmd1bWVudHMgYSBDb250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXIgb2JqZWN0IHRoYXQgbXVzdCBhY3R1YWxseSBwdXQgdGhlIGRhdGEgaW50bworICAgICAqIHRoZSBwaXBlLiBQaXBlRGF0YVdyaXRlciBpcyBhbiBpbnRlcmZhY2UsIG5vdCBhIGNsYXNzLCBzbyBpdCBtdXN0IGJlIGltcGxlbWVudGVkLgorICAgICAqCisgICAgICogVGhlIE5vdGVQYWRQcm92aWRlciBjbGFzcyBpdHNlbGYgaW1wbGVtZW50cyB0aGUgIkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciwgd2hpY2ggbWVhbnMKKyAgICAgKiB0aGF0IGl0IHN1cHBsaWVzIHRoZSBpbnRlcmZhY2UncyBvbmx5IG1ldGhvZCwgd3JpdGVEYXRhVG9QaXBlKCkuIEluIGVmZmVjdCwgYSBjYWxsIHRvCisgICAgICogb3BlblR5cGVkQXNzZXRGaWxlKCkgY2FsbHMgd3JpdGVEYXRhVG9QaXBlKCkuCisgICAgICoKKyAgICAgKiAgVGhlIHRlc3Qgb2Ygd3JpdGVEYXRhVG9QaXBlKCkgaXMgc2VwYXJhdGUgZnJvbSBvdGhlciB0ZXN0cyBvZiBvcGVuVHlwZWRBc3NldEZpbGUoKSBmb3IgdGhlCisgICAgICogIHNha2Ugb2YgY2xhcml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVEYXRhVG9QaXBlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQSBzdHJpbmcgYXJyYXkgdG8gaG9sZCB0aGUgaW5jb21pbmcgZGF0YQorICAgICAgICBTdHJpbmdbXSBpbnB1dERhdGEgPSB7IiIsIiIsIiJ9OworCisgICAgICAgIC8vIEEgVVJJIGZvciBhIG5vdGUgSUQuCisgICAgICAgIFVyaSBub3RlSWRVcmk7CisKKyAgICAgICAgLy8gQSBDdXJzb3IgdG8gY29udGFpbiB0aGUgcmV0cmlldmVkIG5vdGUuCisgICAgICAgIEN1cnNvciBub3RlSWRDdXJzb3I7CisKKyAgICAgICAgLy8gQW4gQXNzZXRGaWxlRGVzY3JpcHRvciBmb3IgdGhlIHBpcGUuCisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3Igbm90ZUlkQXNzZXREZXNjcmlwdG9yOworCisgICAgICAgIC8vIFRoZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbiB0aGUgQXNzZXRGaWxlRGVzY3JpcHRvcgorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBub3RlSWRQYXJjZWxEZXNjcmlwdG9yOworCisgICAgICAgIC8vIEluc2VydHMgdGVzdCBkYXRhIGludG8gdGhlIHByb3ZpZGVyLgorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlcyBub3RlIElEIFVSSSBmb3IgYSBub3RlIHRoYXQgc2hvdWxkIG5vdyBiZSBpbiB0aGUgcHJvdmlkZXIuCisgICAgICAgIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgIC8vIFRoZSBiYXNlIHBhdHRlcm4gZm9yIGEgbm90ZSBJRCBVUkkKKyAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVUkkgdG8gcG9pbnQgdG8gcmVjb3JkIElEIDEgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBHZXRzIGEgQ3Vyc29yIGZvciB0aGUgbm90ZS4KKyAgICAgICAgbm90ZUlkQ3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICBub3RlSWRVcmksICAvLyB0aGUgVVJJIGZvciB0aGUgbm90ZSBJRCB3ZSB3YW50IHRvIHJldHJpZXZlCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgcmV0cmlldmUgYWxsIHRoZSBjb2x1bW5zCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy8gbm8gV0hFUkUgY2xhdXNlCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy8gbm8gV0hFUkUgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgLy8gZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ2hlY2tzIHRoYXQgdGhlIGNhbGwgd29ya2VkLgorICAgICAgICAvLyBhKSBDaGVja3MgdGhhdCB0aGUgY3Vyc29yIGlzIG5vdCBudWxsCisgICAgICAgIC8vIGIpIENoZWNrcyB0aGF0IGl0IGNvbnRhaW5zIGEgc2luZ2xlIHJlY29yZAorICAgICAgICBhc3NlcnROb3ROdWxsKG5vdGVJZEN1cnNvcik7CisgICAgICAgIGFzc2VydEVxdWFscygxLG5vdGVJZEN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAvLyBPcGVucyB0aGUgcGlwZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgZGF0YS4KKyAgICAgICAgbm90ZUlkQXNzZXREZXNjcmlwdG9yID0gbU1vY2tSZXNvbHZlci5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIG5vdGVJZFVyaSwgICAgICAgIC8vIHRoZSBVUkkgb2YgdGhlIG5vdGUgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICBNSU1FX1RZUEVfVEVYVCwgICAvLyB0aGUgInRleHQvcGxhaW4iIE1JTUUgdHlwZQorICAgICAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgIC8vIG5vIG90aGVyIG9wdGlvbnMKKyAgICAgICAgKTsKKworICAgICAgICAvLyBDaGVja3MgdGhhdCB0aGUgY2FsbCB3b3JrZWQuCisgICAgICAgIC8vIGEpIGNoZWNrcyB0aGF0IHRoZSBBc3NldEZpbGVEZXNjcmlwdG9yIGlzIG5vdCBudWxsCisgICAgICAgIC8vIGIpIGdldHMgaXRzIFBhcmNlbEZpbGVEZXNjcmlwdG9yCisgICAgICAgIC8vIGMpIGNoZWNrcyB0aGF0IHRoZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBpcyBub3QgbnVsbAorICAgICAgICBhc3NlcnROb3ROdWxsKG5vdGVJZEFzc2V0RGVzY3JpcHRvcik7CisgICAgICAgIG5vdGVJZFBhcmNlbERlc2NyaXB0b3IgPSBub3RlSWRBc3NldERlc2NyaXB0b3IuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChub3RlSWRQYXJjZWxEZXNjcmlwdG9yKTsKKworICAgICAgICAvLyBHZXRzIGEgRmlsZSBSZWFkZXIgdGhhdCBjYW4gcmVhZCB0aGUgcGlwZS4KKyAgICAgICAgRmlsZVJlYWRlciBmSW4gPSBuZXcgRmlsZVJlYWRlcihub3RlSWRQYXJjZWxEZXNjcmlwdG9yLmdldEZpbGVEZXNjcmlwdG9yKCkpOworCisgICAgICAgIC8vIEdldHMgYSBidWZmZXJlZCByZWFkZXIgd3JhcHBlciBmb3IgdGhlIEZpbGUgUmVhZGVyLiBUaGlzIGFsbG93cyByZWFkaW5nIGxpbmUgYnkgbGluZS4KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYkluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZJbik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHBpcGUgc2hvdWxkIGNvbnRhaW4gdGhyZWUgbGluZXM6IFRoZSBub3RlJ3MgdGl0bGUsIGFuIGVtcHR5IGxpbmUsIGFuZCB0aGUgbm90ZSdzCisgICAgICAgICAqIGNvbnRlbnRzLiBUaGUgZm9sbG93aW5nIGNvZGUgcmVhZHMgYW5kIHN0b3JlcyB0aGVzZSB0aHJlZSBsaW5lcy4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpbnB1dERhdGEubGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlucHV0RGF0YVtpbmRleF0gPSBiSW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIHByb3ZpZGVyICh3cml0dGVuIGZyb20gVEVTVF9OT1RFU1swXSkgaGFzIHRoZSBzYW1lCisgICAgICAgIC8vIG5vdGUgdGl0bGUgYXMgdGhlIGZpcnN0IGxpbmUgcmV0cmlldmVkIGZyb20gdGhlIHBpcGUuCisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05PVEVTWzBdLnRpdGxlLCBpbnB1dERhdGFbMF0pOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBwcm92aWRlciAod3JpdHRlbiBmcm9tIFRFU1RfTk9URVNbMF0pIGhhcyB0aGUgc2FtZQorICAgICAgICAvLyBub3RlIGNvbnRlbnRzIGFzIHRoZSB0aGlyZCBsaW5lIHJldHJpZXZlZCBmcm9tIHRoZSBwaXBlLgorICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OT1RFU1swXS5ub3RlLCBpbnB1dERhdGFbMl0pOworICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgdGhlIHByb3ZpZGVyJ3MgcHVibGljIEFQSSBmb3IgcXVlcnlpbmcgZGF0YSBpbiB0aGUgdGFibGUsIHVzaW5nIHRoZSBVUkkgZm9yCisgICAgICogYSBkYXRhc2V0IG9mIHJlY29yZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJpZXNPbk5vdGVzVXJpKCkgeworICAgICAgICAvLyBEZWZpbmVzIGEgcHJvamVjdGlvbiBvZiBjb2x1bW4gbmFtZXMgdG8gcmV0dXJuIGZvciBhIHF1ZXJ5CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIFRFU1RfUFJPSkVDVElPTiA9IHsKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFCisgICAgICAgIH07CisKKyAgICAgICAgLy8gRGVmaW5lcyBhIHNlbGVjdGlvbiBjb2x1bW4gZm9yIHRoZSBxdWVyeS4gV2hlbiB0aGUgc2VsZWN0aW9uIGNvbHVtbnMgYXJlIHBhc3NlZAorICAgICAgICAvLyB0byB0aGUgcXVlcnksIHRoZSBzZWxlY3Rpb24gYXJndW1lbnRzIHJlcGxhY2UgdGhlIHBsYWNlaG9sZGVycy4KKyAgICAgICAgZmluYWwgU3RyaW5nIFRJVExFX1NFTEVDVElPTiA9IE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiID0gIiArICI/IjsKKworICAgICAgICAvLyBEZWZpbmVzIHRoZSBzZWxlY3Rpb24gY29sdW1ucyBmb3IgYSBxdWVyeS4KKyAgICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0KKyAgICAgICAgICAgIFRJVExFX1NFTEVDVElPTiArICIgT1IgIiArIFRJVExFX1NFTEVDVElPTiArICIgT1IgIiArIFRJVExFX1NFTEVDVElPTjsKKworICAgICAgICAgLy8gRGVmaW5lcyB0aGUgYXJndW1lbnRzIGZvciB0aGUgc2VsZWN0aW9uIGNvbHVtbnMuCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIFNFTEVDVElPTl9BUkdTID0geyAiTm90ZTAiLCAiTm90ZTEiLCAiTm90ZTUiIH07CisKKyAgICAgICAgIC8vIERlZmluZXMgYSBxdWVyeSBzb3J0IG9yZGVyCisgICAgICAgIGZpbmFsIFN0cmluZyBTT1JUX09SREVSID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgQVNDIjsKKworICAgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDEuCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSB0YWJsZSwgdGhlIHJldHVybmVkIGN1cnNvciBmcm9tIGEgcXVlcnkgc2hvdWxkIGJlIGVtcHR5LgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgZ2V0IGFsbCBjb2x1bW5zCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNyaXRlcmlhLCBnZXQgYWxsIHJlY29yZHMKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzZWxlY3Rpb24gYXJndW1lbnRzCisgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgc29ydCBvcmRlcgorICAgICAgICApOworCisgICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHJldHVybmVkIGN1cnNvciBjb250YWlucyBubyByZWNvcmRzCisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgIC8vIFF1ZXJ5IHN1YnRlc3QgMi4KKyAgICAgICAgIC8vIElmIHRoZSB0YWJsZSBjb250YWlucyByZWNvcmRzLCB0aGUgcmV0dXJuZWQgY3Vyc29yIGZyb20gYSBxdWVyeSBzaG91bGQgY29udGFpbiByZWNvcmRzLgorCisgICAgICAgIC8vIEluc2VydHMgdGhlIHRlc3QgZGF0YSBpbnRvIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UKKyAgICAgICAgaW5zZXJ0RGF0YSgpOworCisgICAgICAgIC8vIEdldHMgYWxsIHRoZSBjb2x1bW5zIGZvciBhbGwgdGhlIHJvd3MgaW4gdGhlIHRhYmxlCisgICAgICAgIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAgLy8gdGhlIFVSSSBmb3IgdGhlIG1haW4gZGF0YSB0YWJsZQorICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2plY3Rpb24sIGdldCBhbGwgY29sdW1ucworICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYSwgZ2V0IGFsbCByZWNvcmRzCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGFyZ3VtZW50cworICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IHNvcnQgb3JkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHJldHVybmVkIGN1cnNvciBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICAgLy8gdGVzdCBkYXRhIGFycmF5LgorICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OT1RFUy5sZW5ndGgsIGN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDMuCisgICAgICAgIC8vIEEgcXVlcnkgdGhhdCB1c2VzIGEgcHJvamVjdGlvbiBzaG91bGQgcmV0dXJuIGEgY3Vyc29yIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMKKyAgICAgICAgLy8gYXMgdGhlIHByb2plY3Rpb24sIHdpdGggdGhlIHNhbWUgbmFtZXMsIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAgICBDdXJzb3IgcHJvamVjdGlvbkN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICAgIFRFU1RfUFJPSkVDVElPTiwgICAgICAgICAgICAvLyBnZXQgdGhlIHRpdGxlLCBub3RlLCBhbmQgbW9kIGRhdGUgY29sdW1ucworICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNvbHVtbnMsIGdldCBhbGwgdGhlIHJlY29yZHMKKyAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYQorICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgdGhlIHNvcnQgb3JkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBjdXJzb3IgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHByb2plY3Rpb24KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPSkVDVElPTi5sZW5ndGgsIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uQ291bnQoKSk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgY3Vyc29yIGFuZCBpbiB0aGUgcHJvamVjdGlvbiBhcmUgdGhlIHNhbWUuCisgICAgICAgIC8vIFRoaXMgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBuYW1lcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST0pFQ1RJT05bMF0sIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uTmFtZSgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST0pFQ1RJT05bMV0sIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uTmFtZSgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST0pFQ1RJT05bMl0sIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uTmFtZSgyKSk7CisKKyAgICAgICAgLy8gUXVlcnkgc3VidGVzdCA0CisgICAgICAgIC8vIEEgcXVlcnkgdGhhdCB1c2VzIHNlbGVjdGlvbiBjcml0ZXJpYSBzaG91bGQgcmV0dXJuIG9ubHkgdGhvc2Ugcm93cyB0aGF0IG1hdGNoIHRoZQorICAgICAgICAvLyBjcml0ZXJpYS4gVXNlIGEgcHJvamVjdGlvbiBzbyB0aGF0IGl0J3MgZWFzeSB0byBnZXQgdGhlIGRhdGEgaW4gYSBwYXJ0aWN1bGFyIGNvbHVtbi4KKyAgICAgICAgcHJvamVjdGlvbkN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICBURVNUX1BST0pFQ1RJT04sICAgICAgICAgICAvLyBnZXQgdGhlIHRpdGxlLCBub3RlLCBhbmQgbW9kIGRhdGUgY29sdW1ucworICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2VsZWN0IG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIFNFTEVDVElPTl9BUkdTLCAgICAgICAgICAgIC8vIHNlbGVjdCB0aXRsZXMgIk5vdGUwIiwgIk5vdGUxIiwgb3IgIk5vdGU1IgorICAgICAgICAgICAgU09SVF9PUkRFUiAgICAgICAgICAgICAgICAgLy8gc29ydCBhc2NlbmRpbmcgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgY3Vyc29yIGhhcyB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyB0aGUgbnVtYmVyIG9mIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNFTEVDVElPTl9BUkdTLmxlbmd0aCwgcHJvamVjdGlvbkN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIHdoaWxlIChwcm9qZWN0aW9uQ3Vyc29yLm1vdmVUb05leHQoKSkgeworCisgICAgICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHNlbGVjdGlvbiBhcmd1bWVudCBhdCB0aGUgY3VycmVudCBpbmRleCBtYXRjaGVzIHRoZSB2YWx1ZSBvZgorICAgICAgICAgICAgLy8gdGhlIHRpdGxlIGNvbHVtbiAoY29sdW1uIDApIGluIHRoZSBjdXJyZW50IHJlY29yZCBvZiB0aGUgY3Vyc29yCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRUNUSU9OX0FSR1NbaW5kZXhdLCBwcm9qZWN0aW9uQ3Vyc29yLmdldFN0cmluZygwKSk7CisKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGluZGV4IHBvaW50ZXIgaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygc2VsZWN0aW9uIGFyZ3VtZW50cywgc28KKyAgICAgICAgLy8gdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0ZXN0ZWQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQuCisgICAgICAgIGFzc2VydEVxdWFscyhTRUxFQ1RJT05fQVJHUy5sZW5ndGgsIGluZGV4KTsKKworICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgcXVlcmllcyBhZ2FpbnN0IHRoZSBwcm92aWRlciwgdXNpbmcgdGhlIG5vdGUgaWQgVVJJLiBUaGlzIFVSSSBlbmNvZGVzIGEgc2luZ2xlCisgICAgICogcmVjb3JkIElELiBUaGUgcHJvdmlkZXIgc2hvdWxkIG9ubHkgcmV0dXJuIDAgb3IgMSByZWNvcmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJpZXNPbk5vdGVJZFVyaSgpIHsKKyAgICAgIC8vIERlZmluZXMgdGhlIHNlbGVjdGlvbiBjb2x1bW4gZm9yIGEgcXVlcnkuIFRoZSAiPyIgaXMgcmVwbGFjZWQgYnkgZW50cmllcyBpbiB0aGUKKyAgICAgIC8vIHNlbGVjdGlvbiBhcmd1bWVudCBhcnJheQorICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgPSAiICsgIj8iOworCisgICAgICAvLyBEZWZpbmVzIHRoZSBhcmd1bWVudCBmb3IgdGhlIHNlbGVjdGlvbiBjb2x1bW4uCisgICAgICBmaW5hbCBTdHJpbmdbXSBTRUxFQ1RJT05fQVJHUyA9IHsgIk5vdGUxIiB9OworCisgICAgICAvLyBBIHNvcnQgb3JkZXIgZm9yIHRoZSBxdWVyeS4KKyAgICAgIGZpbmFsIFN0cmluZyBTT1JUX09SREVSID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgQVNDIjsKKworICAgICAgLy8gQ3JlYXRlcyBhIHByb2plY3Rpb24gaW5jbHVkZXMgdGhlIG5vdGUgaWQgY29sdW1uLCBzbyB0aGF0IG5vdGUgaWQgY2FuIGJlIHJldHJpZXZlZC4KKyAgICAgIGZpbmFsIFN0cmluZ1tdIE5PVEVfSURfUFJPSkVDVElPTiA9IHsKKyAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQsICAgICAgICAgICAgICAgICAvLyBUaGUgTm90ZXMgY2xhc3MgZXh0ZW5kcyBCYXNlQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpbmNsdWRlcyBfSUQgYXMgdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQncyBpZCBpbiB0aGUgZGF0YSBtb2RlbAorICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFfTsgIC8vIFRoZSBub3RlJ3MgdGl0bGUKKworICAgICAgLy8gUXVlcnkgc3VidGVzdCAxLgorICAgICAgLy8gVGVzdHMgdGhhdCBhIHF1ZXJ5IGFnYWluc3QgYW4gZW1wdHkgdGFibGUgcmV0dXJucyBudWxsLgorCisgICAgICAvLyBDb25zdHJ1Y3RzIGEgVVJJIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZXIncyBub3RlcyBpZCBVUkkgcGF0dGVybiwgdXNpbmcgYW4gYXJiaXRyYXJ5CisgICAgICAvLyB2YWx1ZSBvZiAxIGFzIHRoZSBub3RlIElELgorICAgICAgVXJpIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgMSk7CisKKyAgICAgIC8vIFF1ZXJpZXMgdGhlIHRhYmxlIHdpdGggdGhlIG5vdGVzIElEIFVSSS4gVGhpcyBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGN1cnNvci4KKyAgICAgIEN1cnNvciBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgIG5vdGVJZFVyaSwgLy8gVVJJIHBvaW50aW5nIHRvIGEgc2luZ2xlIHJlY29yZAorICAgICAgICAgIG51bGwsICAgICAgLy8gbm8gcHJvamVjdGlvbiwgZ2V0IGFsbCB0aGUgY29sdW1ucyBmb3IgZWFjaCByZWNvcmQKKyAgICAgICAgICBudWxsLCAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYSwgZ2V0IGFsbCB0aGUgcmVjb3JkcyBpbiB0aGUgdGFibGUKKyAgICAgICAgICBudWxsLCAgICAgIC8vIG5vIG5lZWQgZm9yIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgICBudWxsICAgICAgIC8vIGRlZmF1bHQgc29ydCwgYnkgYXNjZW5kaW5nIHRpdGxlCisgICAgICApOworCisgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGN1cnNvciBpcyBudWxsLgorICAgICAgYXNzZXJ0RXF1YWxzKDAsY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDIuCisgICAgICAvLyBUZXN0cyB0aGF0IGEgcXVlcnkgYWdhaW5zdCBhIHRhYmxlIGNvbnRhaW5pbmcgcmVjb3JkcyByZXR1cm5zIGEgc2luZ2xlIHJlY29yZCB3aG9zZSBJRAorICAgICAgLy8gaXMgdGhlIG9uZSByZXF1ZXN0ZWQgaW4gdGhlIFVSSSBwcm92aWRlZC4KKworICAgICAgLy8gSW5zZXJ0cyB0aGUgdGVzdCBkYXRhIGludG8gdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4KKyAgICAgIGluc2VydERhdGEoKTsKKworICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgdXNpbmcgdGhlIFVSSSBmb3IgdGhlIGZ1bGwgdGFibGUuCisgICAgICBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBiYXNlIFVSSSBmb3IgdGhlIHRhYmxlCisgICAgICAgICAgTk9URV9JRF9QUk9KRUNUSU9OLCAgICAgICAgLy8gcmV0dXJucyB0aGUgSUQgYW5kIHRpdGxlIGNvbHVtbnMgb2Ygcm93cworICAgICAgICAgIFNFTEVDVElPTl9DT0xVTU5TLCAgICAgICAgIC8vIHNlbGVjdCBiYXNlZCBvbiB0aGUgdGl0bGUgY29sdW1uCisgICAgICAgICAgU0VMRUNUSU9OX0FSR1MsICAgICAgICAgICAgLy8gc2VsZWN0IHRpdGxlIG9mICJOb3RlMSIKKyAgICAgICAgICBTT1JUX09SREVSICAgICAgICAgICAgICAgICAvLyBzb3J0IG9yZGVyIHJldHVybmVkIGlzIGJ5IHRpdGxlLCBhc2NlbmRpbmcKKyAgICAgICk7CisKKyAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgY3Vyc29yIGNvbnRhaW5zIG9ubHkgb25lIHJvdy4KKyAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgIC8vIE1vdmVzIHRvIHRoZSBjdXJzb3IncyBmaXJzdCByb3csIGFuZCBhc3NlcnRzIHRoYXQgdGhpcyBkaWQgbm90IGZhaWwuCisgICAgICBhc3NlcnRUcnVlKGN1cnNvci5tb3ZlVG9GaXJzdCgpKTsKKworICAgICAgLy8gU2F2ZXMgdGhlIHJlY29yZCdzIG5vdGUgSUQuCisgICAgICBpbnQgaW5wdXROb3RlSWQgPSBjdXJzb3IuZ2V0SW50KDApOworCisgICAgICAvLyBCdWlsZHMgYSBVUkkgYmFzZWQgb24gdGhlIHByb3ZpZGVyJ3MgY29udGVudCBJRCBVUkkgYmFzZSBhbmQgdGhlIHNhdmVkIG5vdGUgSUQuCisgICAgICBub3RlSWRVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX0JBU0UsIGlucHV0Tm90ZUlkKTsKKworICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgdXNpbmcgdGhlIGNvbnRlbnQgSUQgVVJJLCB3aGljaCByZXR1cm5zIGEgc2luZ2xlIHJlY29yZCB3aXRoIHRoZQorICAgICAgLy8gc3BlY2lmaWVkIG5vdGUgSUQsIG1hdGNoaW5nIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgcHJvdmlkZWQuCisgICAgICBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KG5vdGVJZFVyaSwgLy8gdGhlIFVSSSBmb3IgYSBzaW5nbGUgbm90ZQorICAgICAgICAgIE5PVEVfSURfUFJPSkVDVElPTiwgICAgICAgICAgICAgICAgIC8vIHNhbWUgcHJvamVjdGlvbiwgZ2V0IElEIGFuZCB0aXRsZSBjb2x1bW5zCisgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24sIGJhc2VkIG9uIHRpdGxlIGNvbHVtbgorICAgICAgICAgIFNFTEVDVElPTl9BUkdTLCAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgc2VsZWN0aW9uIGFyZ3VtZW50cywgdGl0bGUgPSAiTm90ZTEiCisgICAgICAgICAgU09SVF9PUkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBzb3J0IG9yZGVyIHJldHVybmVkLCBieSB0aXRsZSwgYXNjZW5kaW5nCisgICAgICApOworCisgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGN1cnNvciBjb250YWlucyBvbmx5IG9uZSByb3cuCisgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAvLyBNb3ZlcyB0byB0aGUgY3Vyc29yJ3MgZmlyc3Qgcm93LCBhbmQgYXNzZXJ0cyB0aGF0IHRoaXMgZGlkIG5vdCBmYWlsLgorICAgICAgYXNzZXJ0VHJ1ZShjdXJzb3IubW92ZVRvRmlyc3QoKSk7CisKKyAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgbm90ZSBJRCBwYXNzZWQgdG8gdGhlIHByb3ZpZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBub3RlIElEIHJldHVybmVkLgorICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0Tm90ZUlkLCBjdXJzb3IuZ2V0SW50KDApKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBUZXN0cyBpbnNlcnRzIGludG8gdGhlIGRhdGEgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydHMoKSB7CisgICAgICAgIC8vIENyZWF0ZXMgYSBuZXcgbm90ZSBpbnN0YW5jZSB3aXRoIElEIG9mIDMwLgorICAgICAgICBOb3RlSW5mbyBub3RlID0gbmV3IE5vdGVJbmZvKAorICAgICAgICAgICAgIk5vdGUzMCIsIC8vIHRoZSBub3RlJ3MgdGl0bGUKKyAgICAgICAgICAgICJUZXN0IGluc2VydGluZyBhIG5vdGUiIC8vIHRoZSBub3RlJ3MgY29udGVudAorICAgICAgICApOworCisgICAgICAgIC8vIFNldHMgdGhlIG5vdGUncyBjcmVhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzCisgICAgICAgIG5vdGUuc2V0Q3JlYXRpb25EYXRlKFNUQVJUX0RBVEUgKyAoMTAgKiBPTkVfREFZX01JTExJUykpOworICAgICAgICBub3RlLnNldE1vZGlmaWNhdGlvbkRhdGUoU1RBUlRfREFURSArICgyICogT05FX1dFRUtfTUlMTElTKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHN1YnRlc3QgMS4KKyAgICAgICAgLy8gSW5zZXJ0cyBhIHJvdyB1c2luZyB0aGUgbmV3IG5vdGUgaW5zdGFuY2UuCisgICAgICAgIC8vIE5vIGFzc2VydGlvbiB3aWxsIGJlIGRvbmUuIFRoZSBpbnNlcnQoKSBtZXRob2QgZWl0aGVyIHdvcmtzIG9yIHRocm93cyBhbiBFeGNlcHRpb24KKyAgICAgICAgVXJpIHJvd1VyaSA9IG1Nb2NrUmVzb2x2ZXIuaW5zZXJ0KAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgIC8vIHRoZSBtYWluIHRhYmxlIFVSSQorICAgICAgICAgICAgbm90ZS5nZXRDb250ZW50VmFsdWVzKCkgICAgIC8vIHRoZSBtYXAgb2YgdmFsdWVzIHRvIGluc2VydCBhcyBhIG5ldyByZWNvcmQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBQYXJzZXMgdGhlIHJldHVybmVkIFVSSSB0byBnZXQgdGhlIG5vdGUgSUQgb2YgdGhlIG5ldyBub3RlLiBUaGUgSUQgaXMgdXNlZCBpbiBzdWJ0ZXN0IDIuCisgICAgICAgIGxvbmcgbm90ZUlkID0gQ29udGVudFVyaXMucGFyc2VJZChyb3dVcmkpOworCisgICAgICAgIC8vIERvZXMgYSBmdWxsIHF1ZXJ5IG9uIHRoZSB0YWJsZS4gU2luY2UgaW5zZXJ0RGF0YSgpIGhhc24ndCB5ZXQgYmVlbiBjYWxsZWQsIHRoZQorICAgICAgICAvLyB0YWJsZSBzaG91bGQgb25seSBjb250YWluIHRoZSByZWNvcmQganVzdCBpbnNlcnRlZC4KKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgbWFpbiB0YWJsZSBVUkkKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2plY3Rpb24sIHJldHVybiBhbGwgdGhlIGNvbHVtbnMKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYSwgcmV0dXJuIGFsbCB0aGUgcm93cyBpbiB0aGUgbW9kZWwKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc29ydCBvcmRlcgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGVyZSBzaG91bGQgYmUgb25seSAxIHJlY29yZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAvLyBNb3ZlcyB0byB0aGUgZmlyc3QgKGFuZCBvbmx5KSByZWNvcmQgaW4gdGhlIGN1cnNvciBhbmQgYXNzZXJ0cyB0aGF0IHRoaXMgd29ya2VkLgorICAgICAgICBhc3NlcnRUcnVlKGN1cnNvci5tb3ZlVG9GaXJzdCgpKTsKKworICAgICAgICAvLyBTaW5jZSBubyBwcm9qZWN0aW9uIHdhcyB1c2VkLCBnZXQgdGhlIGNvbHVtbiBpbmRleGVzIG9mIHRoZSByZXR1cm5lZCBjb2x1bW5zCisgICAgICAgIGludCB0aXRsZUluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUpOworICAgICAgICBpbnQgbm90ZUluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSk7CisgICAgICAgIGludCBjcmRhdGVJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFKTsKKyAgICAgICAgaW50IG1vZGRhdGVJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFKTsKKworICAgICAgICAvLyBUZXN0cyBlYWNoIGNvbHVtbiBpbiB0aGUgcmV0dXJuZWQgY3Vyc29yIGFnYWluc3QgdGhlIGRhdGEgdGhhdCB3YXMgaW5zZXJ0ZWQsIGNvbXBhcmluZworICAgICAgICAvLyB0aGUgZmllbGQgaW4gdGhlIE5vdGVJbmZvIG9iamVjdCB0byB0aGUgZGF0YSBhdCB0aGUgY29sdW1uIGluZGV4IGluIHRoZSBjdXJzb3IuCisgICAgICAgIGFzc2VydEVxdWFscyhub3RlLnRpdGxlLCBjdXJzb3IuZ2V0U3RyaW5nKHRpdGxlSW5kZXgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUubm90ZSwgY3Vyc29yLmdldFN0cmluZyhub3RlSW5kZXgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUuY3JlYXRlRGF0ZSwgY3Vyc29yLmdldExvbmcoY3JkYXRlSW5kZXgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUubW9kRGF0ZSwgY3Vyc29yLmdldExvbmcobW9kZGF0ZUluZGV4KSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHN1YnRlc3QgMi4KKyAgICAgICAgLy8gVGVzdHMgdGhhdCB3ZSBjYW4ndCBpbnNlcnQgYSByZWNvcmQgd2hvc2UgaWQgdmFsdWUgYWxyZWFkeSBleGlzdHMuCisKKyAgICAgICAgLy8gRGVmaW5lcyBhIENvbnRlbnRWYWx1ZXMgb2JqZWN0IHNvIHRoYXQgdGhlIHRlc3QgY2FuIGFkZCBhIG5vdGUgSUQgdG8gaXQuCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbm90ZS5nZXRDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgLy8gQWRkcyB0aGUgbm90ZSBJRCByZXRyaWV2ZWQgaW4gc3VidGVzdCAxIHRvIHRoZSBDb250ZW50VmFsdWVzIG9iamVjdC4KKyAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLl9JRCwgKGludCkgbm90ZUlkKTsKKworICAgICAgICAvLyBUcmllcyB0byBpbnNlcnQgdGhpcyByZWNvcmQgaW50byB0aGUgdGFibGUuIFRoaXMgc2hvdWxkIGZhaWwgYW5kIGRyb3AgaW50byB0aGUKKyAgICAgICAgLy8gY2F0Y2ggYmxvY2suIElmIGl0IHN1Y2NlZWRzLCBpc3N1ZSBhIGZhaWx1cmUgbWVzc2FnZS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJvd1VyaSA9IG1Nb2NrUmVzb2x2ZXIuaW5zZXJ0KE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBpbnNlcnQgZmFpbHVyZSBmb3IgZXhpc3RpbmcgcmVjb3JkIGJ1dCBpbnNlcnQgc3VjY2VlZGVkLiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIC8vIHN1Y2NlZWRlZCwgc28gZG8gbm90aGluZy4KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgZGVsZXRpb25zIGZyb20gdGhlIGRhdGEgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZXMoKSB7CisgICAgICAgIC8vIFN1YnRlc3QgMS4KKyAgICAgICAgLy8gVHJpZXMgdG8gZGVsZXRlIGEgcmVjb3JkIGZyb20gYSBkYXRhIG1vZGVsIHRoYXQgaXMgZW1wdHkuCisKKyAgICAgICAgLy8gU2V0cyB0aGUgc2VsZWN0aW9uIGNvbHVtbiB0byAidGl0bGUiCisgICAgICAgIGZpbmFsIFN0cmluZyBTRUxFQ1RJT05fQ09MVU1OUyA9IE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiID0gIiArICI/IjsKKworICAgICAgICAvLyBTZXRzIHRoZSBzZWxlY3Rpb24gYXJndW1lbnQgIk5vdGUwIgorICAgICAgICBmaW5hbCBTdHJpbmdbXSBTRUxFQ1RJT05fQVJHUyA9IHsgIk5vdGUwIiB9OworCisgICAgICAgIC8vIFRyaWVzIHRvIGRlbGV0ZSByb3dzIG1hdGNoaW5nIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZnJvbSB0aGUgZGF0YSBtb2RlbC4KKyAgICAgICAgaW50IHJvd3NEZWxldGVkID0gbU1vY2tSZXNvbHZlci5kZWxldGUoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgYmFzZSBVUkkgb2YgdGhlIHRhYmxlCisgICAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAvLyBzZWxlY3QgYmFzZWQgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICAgICAgU0VMRUNUSU9OX0FSR1MgICAgICAgICAgICAgLy8gc2VsZWN0IHRpdGxlID0gIk5vdGUwIgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBkZWxldGlvbiBkaWQgbm90IHdvcmsuIFRoZSBudW1iZXIgb2YgZGVsZXRlZCByb3dzIHNob3VsZCBiZSB6ZXJvLgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcm93c0RlbGV0ZWQpOworCisgICAgICAgIC8vIFN1YnRlc3QgMi4KKyAgICAgICAgLy8gVHJpZXMgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIHJlY29yZC4gUmVwZWF0cyB0aGUgcHJldmlvdXMgc3VidGVzdCwgYnV0IGluc2VydHMgZGF0YSBmaXJzdC4KKworICAgICAgICAvLyBJbnNlcnRzIGRhdGEgaW50byB0aGUgbW9kZWwuCisgICAgICAgIGluc2VydERhdGEoKTsKKworICAgICAgICAvLyBVc2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMgdG8gdHJ5IHRvIGRlbGV0ZSB0aGUgcm93IHdpdGggdGl0bGUgIk5vdGUwIgorICAgICAgICByb3dzRGVsZXRlZCA9IG1Nb2NrUmVzb2x2ZXIuZGVsZXRlKAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgLy8gdGhlIGJhc2UgVVJJIG9mIHRoZSB0YWJsZQorICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24gY29sdW1uLCAidGl0bGUiCisgICAgICAgICAgICBTRUxFQ1RJT05fQVJHUyAgICAgICAgICAgICAvLyBzYW1lIHNlbGVjdGlvbiBhcmd1bWVudHMsIHRpdGxlID0gIk5vdGUwIgorICAgICAgICApOworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZGVsZXRlZCByb3dzIHNob3VsZCBiZSAxLgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcm93c0RlbGV0ZWQpOworCisgICAgICAgIC8vIFRlc3RzIHRoYXQgdGhlIHJlY29yZCBubyBsb25nZXIgZXhpc3RzLiBUcmllcyB0byBnZXQgaXQgZnJvbSB0aGUgdGFibGUsIGFuZAorICAgICAgICAvLyBhc3NlcnRzIHRoYXQgbm90aGluZyB3YXMgcmV0dXJuZWQuCisKKyAgICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgd2l0aCB0aGUgc2FtZSBzZWxlY3Rpb24gY29sdW1uIGFuZCBhcmd1bWVudCB1c2VkIHRvIGRlbGV0ZSB0aGUgcm93LgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBiYXNlIFVSSSBvZiB0aGUgdGFibGUKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2plY3Rpb24sIHJldHVybiBhbGwgY29sdW1ucworICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2VsZWN0IGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIFNFTEVDVElPTl9BUkdTLCAgICAgICAgICAgIC8vIHNlbGVjdCB0aXRsZSA9ICJOb3RlMCIKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBjdXJzb3IgaXMgZW1wdHkgc2luY2UgdGhlIHJlY29yZCBoYWQgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0cyB1cGRhdGVzIHRvIHRoZSBkYXRhIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVzKCkgeworICAgICAgICAvLyBTZWxlY3Rpb24gY29sdW1uIGZvciBpZGVudGlmeWluZyBhIHJlY29yZCBpbiB0aGUgZGF0YSBtb2RlbC4KKyAgICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgPSAiICsgIj8iOworCisgICAgICAgIC8vIFNlbGVjdGlvbiBhcmd1bWVudCBmb3IgdGhlIHNlbGVjdGlvbiBjb2x1bW4uCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSB7ICJOb3RlMSIgfTsKKworICAgICAgICAvLyBEZWZpbmVzIGEgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgdmFsdWVzCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKworICAgICAgICAvLyBTdWJ0ZXN0IDEuCisgICAgICAgIC8vIFRyaWVzIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiBhbiBlbXB0eSB0YWJsZS4KKworICAgICAgICAvLyBTZXRzIHVwIHRoZSB1cGRhdGUgYnkgcHV0dGluZyB0aGUgIm5vdGUiIGNvbHVtbiBhbmQgYSB2YWx1ZSBpbnRvIHRoZSB2YWx1ZXMgbWFwLgorICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgIlRlc3RpbmcgYW4gdXBkYXRlIHdpdGggdGhpcyBzdHJpbmciKTsKKworICAgICAgICAvLyBUcmllcyB0byB1cGRhdGUgdGhlIHRhYmxlCisgICAgICAgIGludCByb3dzVXBkYXRlZCA9IG1Nb2NrUmVzb2x2ZXIudXBkYXRlKAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgIC8vIHRoZSBVUkkgb2YgdGhlIGRhdGEgdGFibGUKKyAgICAgICAgICAgIHZhbHVlcywgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hcCBvZiB0aGUgdXBkYXRlcyB0byBkbyAoY29sdW1uIHRpdGxlIGFuZCB2YWx1ZSkKKyAgICAgICAgICAgIFNFTEVDVElPTl9DT0xVTU5TLCAgICAgICAgICAgLy8gc2VsZWN0IGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgICAgICAgICAgICAgICAvLyBzZWxlY3QgInRpdGxlID0gTm90ZTEiCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IG5vIHJvd3Mgd2VyZSB1cGRhdGVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcm93c1VwZGF0ZWQpOworCisgICAgICAgIC8vIFN1YnRlc3QgMi4KKyAgICAgICAgLy8gQnVpbGRzIHRoZSB0YWJsZSwgYW5kIHRoZW4gdHJpZXMgdGhlIHVwZGF0ZSBhZ2FpbiB1c2luZyB0aGUgc2FtZSBhcmd1bWVudHMuCisKKyAgICAgICAgLy8gSW5zZXJ0cyBkYXRhIGludG8gdGhlIG1vZGVsLgorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gIERvZXMgdGhlIHVwZGF0ZSBhZ2FpbiwgdXNpbmcgdGhlIHNhbWUgYXJndW1lbnRzIGFzIGluIHN1YnRlc3QgMS4KKyAgICAgICAgcm93c1VwZGF0ZWQgPSBtTW9ja1Jlc29sdmVyLnVwZGF0ZSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAgLy8gVGhlIFVSSSBvZiB0aGUgZGF0YSB0YWJsZQorICAgICAgICAgICAgdmFsdWVzLCAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBtYXAgb2YgdXBkYXRlcworICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24sIGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgICAgICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24gYXJndW1lbnQsIHRvIHNlbGVjdCAidGl0bGUgPSBOb3RlMSIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgb25seSBvbmUgcm93IHdhcyB1cGRhdGVkLiBUaGUgc2VsZWN0aW9uIGNyaXRlcmlhIGV2YWx1YXRlZCB0bworICAgICAgICAvLyAidGl0bGUgPSBOb3RlMSIsIGFuZCB0aGUgdGVzdCBkYXRhIHNob3VsZCBvbmx5IGNvbnRhaW4gb25lIHJvdyB0aGF0IG1hdGNoZXMgdGhhdC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJvd3NVcGRhdGVkKTsKKworICAgIH0KKworICAgIC8vIEEgdXRpbGl0eSBmb3IgY29udmVydGluZyBub3RlIGRhdGEgdG8gYSBDb250ZW50VmFsdWVzIG1hcC4KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RlSW5mbyB7CisgICAgICAgIFN0cmluZyB0aXRsZTsKKyAgICAgICAgU3RyaW5nIG5vdGU7CisgICAgICAgIGxvbmcgY3JlYXRlRGF0ZTsKKyAgICAgICAgbG9uZyBtb2REYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIE5vdGVJbmZvIGluc3RhbmNlLiBUaGlzIGNsYXNzIGhlbHBzIGNyZWF0ZSBhIG5vdGUgYW5kCisgICAgICAgICAqIHJldHVybiBpdHMgdmFsdWVzIGluIGEgQ29udGVudFZhbHVlcyBtYXAgZXhwZWN0ZWQgYnkgZGF0YSBtb2RlbCBtZXRob2RzLgorICAgICAgICAgKiBUaGUgbm90ZSdzIGlkIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIGluc2VydGVkIGludG8gdGhlIGRhdGEgbW9kZWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTm90ZUluZm8oU3RyaW5nIHQsIFN0cmluZyBuKSB7CisgICAgICAgICAgICB0aXRsZSA9IHQ7CisgICAgICAgICAgICBub3RlID0gbjsKKyAgICAgICAgICAgIGNyZWF0ZURhdGUgPSAwOworICAgICAgICAgICAgbW9kRGF0ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXRzIHRoZSBjcmVhdGlvbiBkYXRlIGZvciBhIHRlc3Qgbm90ZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUobG9uZyBjKSB7CisgICAgICAgICAgICBjcmVhdGVEYXRlID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIGZvciBhIHRlc3Qgbm90ZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25EYXRlKGxvbmcgbSkgeworICAgICAgICAgICAgbW9kRGF0ZSA9IG07CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXR1cm5zIGEgQ29udGVudFZhbHVlcyBpbnN0YW5jZSAoYSBtYXApIGZvciB0aGlzIE5vdGVJbmZvIGluc3RhbmNlLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAgICAgICAgICogaW5zZXJ0aW5nIGEgTm90ZUluZm8gaW50byBhIGRhdGFiYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbnRlbnRWYWx1ZXMgZ2V0Q29udGVudFZhbHVlcygpIHsKKyAgICAgICAgICAgIC8vIEdldHMgYSBuZXcgQ29udGVudFZhbHVlcyBvYmplY3QKKyAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgICAgIC8vIEFkZHMgbWFwIGVudHJpZXMgZm9yIHRoZSB1c2VyLWNvbnRyb2xsZWQgZmllbGRzIGluIHRoZSBtYXAKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsIHRpdGxlKTsKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgbm90ZSk7CisgICAgICAgICAgICB2LnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFLCBjcmVhdGVEYXRlKTsKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsIG1vZERhdGUpOworICAgICAgICAgICAgcmV0dXJuIHY7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9Db25zdGFudHMuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9Db25zdGFudHMuamF2YQppbmRleCBmMjMzYTVkLi40OWY5MmJmIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQ29uc3RhbnRzLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL0NvbnN0YW50cy5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmM7CiAKIHB1YmxpYyBjbGFzcyBDb25zdGFudHMgewpAQCAtMjYsNyArMjUsNSBAQAogICAgIC8qKgogICAgICAqIEF1dGh0b2tlbiB0eXBlIHN0cmluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIVE9LRU5fVFlQRSA9Ci0gICAgICAgICJjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMiOwotCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSFRPS0VOX1RZUEUgPSAiY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jIjsKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0aW9uU2VydmljZS5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEKaW5kZXggYjhhOTAzZC4uMmMxNjNiZSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKQEAgLTI2LDcgKzI1LDkgQEAKICAqIGFuZCByZXR1cm5zIGl0cyBJQmluZGVyLgogICovCiBwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25TZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF1dGhlbnRpY2F0aW9uU2VydmljZSI7CisKICAgICBwcml2YXRlIEF1dGhlbnRpY2F0b3IgbUF1dGhlbnRpY2F0b3I7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ3LDkgKzQ4LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywKLSAgICAgICAgICAgICAgICAiZ2V0QmluZGVyKCkuLi4gIHJldHVybmluZyB0aGUgQWNjb3VudEF1dGhlbnRpY2F0b3IgYmluZGVyIGZvciBpbnRlbnQgIgotICAgICAgICAgICAgICAgICAgICArIGludGVudCk7CisgICAgICAgICAgICBMb2cudihUQUcsICJnZXRCaW5kZXIoKS4uLiAgcmV0dXJuaW5nIHRoZSBBY2NvdW50QXV0aGVudGljYXRvciBiaW5kZXIgZm9yIGludGVudCAiCisgICAgICAgICAgICAgICAgKyBpbnRlbnQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQXV0aGVudGljYXRvci5nZXRJQmluZGVyKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvci5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDI5NjEzYTkuLjBjNzljNWUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOwogCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BYnN0cmFjdEFjY291bnRBdXRoZW50aWNhdG9yOwpAQCAtMzMsNiArMzIsNyBAQAogICogYXV0aGVudGljYXRpbmcgYWNjb3VudHMgaW4gdGhlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYyBkb21haW4uCiAgKi8KIGNsYXNzIEF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBYnN0cmFjdEFjY291bnRBdXRoZW50aWNhdG9yIHsKKwogICAgIC8vIEF1dGhlbnRpY2F0aW9uIFNlcnZpY2UgY29udGV4dAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKIApAQCAtNDEsMzQgKzQxLDI1IEBACiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBhZGRBY2NvdW50KEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSwgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIHJlcXVpcmVkRmVhdHVyZXMsCi0gICAgICAgIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSBhZGRBY2NvdW50KEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhY2NvdW50VHlwZSwKKyAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIHJlcXVpcmVkRmVhdHVyZXMsIEJ1bmRsZSBvcHRpb25zKSB7CisKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsCi0gICAgICAgICAgICBhdXRoVG9rZW5UeXBlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX0FVVEhFTlRJQ0FUT1JfUkVTUE9OU0UsCi0gICAgICAgICAgICByZXNwb25zZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsIGF1dGhUb2tlblR5cGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwgcmVzcG9uc2UpOwogICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShBY2NvdW50TWFuYWdlci5LRVlfSU5URU5ULCBpbnRlbnQpOwogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGNvbmZpcm1DcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBBY2NvdW50IGFjY291bnQsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSBjb25maXJtQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBCdW5kbGUgb3B0aW9ucykgeworCiAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5jb250YWluc0tleShBY2NvdW50TWFuYWdlci5LRVlfUEFTU1dPUkQpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPQotICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9QQVNTV09SRCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHZlcmlmaWVkID0KLSAgICAgICAgICAgICAgICBvbmxpbmVDb25maXJtUGFzc3dvcmQoYWNjb3VudC5uYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPSBvcHRpb25zLmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfUEFTU1dPUkQpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZmllZCA9IG9ubGluZUNvbmZpcm1QYXNzd29yZChhY2NvdW50Lm5hbWUsIHBhc3N3b3JkKTsKICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgICAgICByZXN1bHQucHV0Qm9vbGVhbihBY2NvdW50TWFuYWdlci5LRVlfQk9PTEVBTl9SRVNVTFQsIHZlcmlmaWVkKTsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC03Niw0NSArNjcsMzUgQEAKICAgICAgICAgLy8gTGF1bmNoIEF1dGhlbnRpY2F0b3JBY3Rpdml0eSB0byBjb25maXJtIGNyZWRlbnRpYWxzCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0NPTkZJUk1DUkVERU5USUFMUywgdHJ1ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLAotICAgICAgICAgICAgcmVzcG9uc2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0NPTkZJUk1fQ1JFREVOVElBTFMsIHRydWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwgcmVzcG9uc2UpOwogICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShBY2NvdW50TWFuYWdlci5LRVlfSU5URU5ULCBpbnRlbnQpOwogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGVkaXRQcm9wZXJ0aWVzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSkgeworICAgIHB1YmxpYyBCdW5kbGUgZWRpdFByb3BlcnRpZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjY291bnRUeXBlKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEF1dGhUb2tlbihBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBCdW5kbGUgbG9naW5PcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSBnZXRBdXRoVG9rZW4oQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIGxvZ2luT3B0aW9ucykgeworCiAgICAgICAgIGlmICghYXV0aFRva2VuVHlwZS5lcXVhbHMoQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFKSkgewogICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0VSUk9SX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgImludmFsaWQgYXV0aFRva2VuVHlwZSIpOworICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfRVJST1JfTUVTU0FHRSwgImludmFsaWQgYXV0aFRva2VuVHlwZSIpOwogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhbSA9IEFjY291bnRNYW5hZ2VyLmdldChtQ29udGV4dCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9IGFtLmdldFBhc3N3b3JkKGFjY291bnQpOwogICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZmllZCA9Ci0gICAgICAgICAgICAgICAgb25saW5lQ29uZmlybVBhc3N3b3JkKGFjY291bnQubmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZmllZCA9IG9ubGluZUNvbmZpcm1QYXNzd29yZChhY2NvdW50Lm5hbWUsIHBhc3N3b3JkKTsKICAgICAgICAgICAgIGlmICh2ZXJpZmllZCkgewogICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFDQ09VTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKICAgICAgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BVVRIVE9LRU4sIHBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQpAQCAtMTIzLDMzICsxMDQsMjUgQEAKICAgICAgICAgLy8gQWN0aXZpdHkgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciBmb3IgdGhlIHBhc3N3b3JkLgogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgQXV0aGVudGljYXRvckFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9VU0VSTkFNRSwgYWNjb3VudC5uYW1lKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwKLSAgICAgICAgICAgIGF1dGhUb2tlblR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwKLSAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwgYXV0aFRva2VuVHlwZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLCByZXNwb25zZSk7CiAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEFjY291bnRNYW5hZ2VyLktFWV9JTlRFTlQsIGludGVudCk7CiAgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFRva2VuTGFiZWwoU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKLSAgICAgICAgaWYgKGF1dGhUb2tlblR5cGUuZXF1YWxzKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRSkpIHsKKyAgICAgICAgaWYgKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRS5lcXVhbHMoYXV0aFRva2VuVHlwZSkpIHsKICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcubGFiZWwpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwotCiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgaGFzRmVhdHVyZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmdbXSBmZWF0dXJlcykgeworICAgIHB1YmxpYyBCdW5kbGUgaGFzRmVhdHVyZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBTdHJpbmdbXSBmZWF0dXJlcykgeworCiAgICAgICAgIGZpbmFsIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIHJlc3VsdC5wdXRCb29sZWFuKEFjY291bnRNYW5hZ2VyLktFWV9CT09MRUFOX1JFU1VMVCwgZmFsc2UpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTU5LDI0ICsxMzIsMjAgQEAKICAgICAgKiBWYWxpZGF0ZXMgdXNlcidzIHBhc3N3b3JkIG9uIHRoZSBzZXJ2ZXIKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gb25saW5lQ29uZmlybVBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHJldHVybiBOZXR3b3JrVXRpbGl0aWVzLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQsCi0gICAgICAgICAgICBudWxsLyogSGFuZGxlciAqLywgbnVsbC8qIENvbnRleHQgKi8pOworICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxpdGllcworICAgICAgICAgICAgLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQsIG51bGwvKiBIYW5kbGVyICovLCBudWxsLyogQ29udGV4dCAqLyk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdXBkYXRlQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIGxvZ2luT3B0aW9ucykgeworICAgIHB1YmxpYyBCdW5kbGUgdXBkYXRlQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIGxvZ2luT3B0aW9ucykgeworCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0FVVEhUT0tFTl9UWVBFLAotICAgICAgICAgICAgYXV0aFRva2VuVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQ09ORklSTUNSRURFTlRJQUxTLCBmYWxzZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsIGF1dGhUb2tlblR5cGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0NPTkZJUk1fQ1JFREVOVElBTFMsIGZhbHNlKTsKICAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoQWNjb3VudE1hbmFnZXIuS0VZX0lOVEVOVCwgaW50ZW50KTsKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEKaW5kZXggNzc5ZTg5NC4uNGUxZWUyYSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOwogCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwpAQCAtNDIsMTYgKzQxLDI4IEBACiAgKiBBY3Rpdml0eSB3aGljaCBkaXNwbGF5cyBsb2dpbiBzY3JlZW4gdG8gdGhlIHVzZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdG9yQWN0aXZpdHkgZXh0ZW5kcyBBY2NvdW50QXV0aGVudGljYXRvckFjdGl2aXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DT05GSVJNQ1JFREVOVElBTFMgPSAiY29uZmlybUNyZWRlbnRpYWxzIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGZsYWcgdG8gY29uZmlybSBjcmVkZW50aWFscy4gKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ09ORklSTV9DUkVERU5USUFMUyA9ICJjb25maXJtQ3JlZGVudGlhbHMiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZXh0cmEgdG8gc3RvcmUgcGFzc3dvcmQuICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGV4dHJhIHRvIHN0b3JlIHVzZXJuYW1lLiAqKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VU0VSTkFNRSA9ICJ1c2VybmFtZSI7CisKKyAgICAvKiogVGhlIEludGVudCBleHRyYSB0byBzdG9yZSBhdXRodG9rZW4gdHlwZS4gKiovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVVUSFRPS0VOX1RZUEUgPSAiYXV0aHRva2VuVHlwZSI7CiAKKyAgICAvKiogVGhlIHRhZyB1c2VkIHRvIGxvZyB0byBhZGIgY29uc29sZS4gKiovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRoZW50aWNhdG9yQWN0aXZpdHkiOwogCiAgICAgcHJpdmF0ZSBBY2NvdW50TWFuYWdlciBtQWNjb3VudE1hbmFnZXI7CisKICAgICBwcml2YXRlIFRocmVhZCBtQXV0aFRocmVhZDsKKwogICAgIHByaXZhdGUgU3RyaW5nIG1BdXRodG9rZW47CisKICAgICBwcml2YXRlIFN0cmluZyBtQXV0aHRva2VuVHlwZTsKIAogICAgIC8qKgpAQCAtNjIsMTQgKzczLDE4IEBACiAKICAgICAvKiogZm9yIHBvc3RpbmcgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgYmFjayB0byBVSSB0aHJlYWQgKi8KICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtTWVzc2FnZTsKKwogICAgIHByaXZhdGUgU3RyaW5nIG1QYXNzd29yZDsKKwogICAgIHByaXZhdGUgRWRpdFRleHQgbVBhc3N3b3JkRWRpdDsKIAogICAgIC8qKiBXYXMgdGhlIG9yaWdpbmFsIGNhbGxlciBhc2tpbmcgZm9yIGFuIGVudGlyZWx5IG5ldyBhY2NvdW50PyAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIG1SZXF1ZXN0TmV3QWNjb3VudCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVVzZXJuYW1lOworCiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtVXNlcm5hbWVFZGl0OwogCiAgICAgLyoqCkBAIC03Nyw2ICs5Miw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworCiAgICAgICAgIExvZy5pKFRBRywgIm9uQ3JlYXRlKCIgKyBpY2ljbGUgKyAiKSIpOwogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwogICAgICAgICBtQWNjb3VudE1hbmFnZXIgPSBBY2NvdW50TWFuYWdlci5nZXQodGhpcyk7CkBAIC04NSwxOSArMTAxLDE1IEBACiAgICAgICAgIG1Vc2VybmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQQVJBTV9VU0VSTkFNRSk7CiAgICAgICAgIG1BdXRodG9rZW5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBBUkFNX0FVVEhUT0tFTl9UWVBFKTsKICAgICAgICAgbVJlcXVlc3ROZXdBY2NvdW50ID0gbVVzZXJuYW1lID09IG51bGw7Ci0gICAgICAgIG1Db25maXJtQ3JlZGVudGlhbHMgPQotICAgICAgICAgICAgaW50ZW50LmdldEJvb2xlYW5FeHRyYShQQVJBTV9DT05GSVJNQ1JFREVOVElBTFMsIGZhbHNlKTsKLQorICAgICAgICBtQ29uZmlybUNyZWRlbnRpYWxzID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShQQVJBTV9DT05GSVJNX0NSRURFTlRJQUxTLCBmYWxzZSk7CiAgICAgICAgIExvZy5pKFRBRywgIiAgICByZXF1ZXN0IG5ldzogIiArIG1SZXF1ZXN0TmV3QWNjb3VudCk7CiAgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0xFRlRfSUNPTik7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxvZ2luX2FjdGl2aXR5KTsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0RmVhdHVyZURyYXdhYmxlUmVzb3VyY2UoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OLAogICAgICAgICAgICAgYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19hbGVydCk7Ci0KICAgICAgICAgbU1lc3NhZ2UgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm1lc3NhZ2UpOwogICAgICAgICBtVXNlcm5hbWVFZGl0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC51c2VybmFtZV9lZGl0KTsKICAgICAgICAgbVBhc3N3b3JkRWRpdCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfZWRpdCk7Ci0KICAgICAgICAgbVVzZXJuYW1lRWRpdC5zZXRUZXh0KG1Vc2VybmFtZSk7CiAgICAgICAgIG1NZXNzYWdlLnNldFRleHQoZ2V0TWVzc2FnZSgpKTsKICAgICB9CkBAIC0xNTIsNyArMTY0LDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlIGNvbmZpcm1DcmVkZW50aWFscyByZXN1bHQuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoQ29uZmlybUNyZWRlbnRpYWxzKGJvb2xlYW4gcmVzdWx0KSB7CisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaENvbmZpcm1DcmVkZW50aWFscyhib29sZWFuIHJlc3VsdCkgewogICAgICAgICBMb2cuaShUQUcsICJmaW5pc2hDb25maXJtQ3JlZGVudGlhbHMoKSIpOwogICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBuZXcgQWNjb3VudChtVXNlcm5hbWUsIENvbnN0YW50cy5BQ0NPVU5UX1RZUEUpOwogICAgICAgICBtQWNjb3VudE1hbmFnZXIuc2V0UGFzc3dvcmQoYWNjb3VudCwgbVBhc3N3b3JkKTsKQEAgLTE2NCw3ICsxNzYsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIAogICAgICAqIENhbGxlZCB3aGVuIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBmb3IgYXV0aGVudGljYXRpb24KICAgICAgKiByZXF1ZXN0LiBTZWUgb25BdXRoZW50aWNhdGlvblJlc3VsdCgpLiBTZXRzIHRoZQogICAgICAqIEFjY291bnRBdXRoZW50aWNhdG9yUmVzdWx0IHdoaWNoIGlzIHNlbnQgYmFjayB0byB0aGUgY2FsbGVyLiBBbHNvIHNldHMKQEAgLTE3MiwyNiArMTgzLDIyIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZSBjb25maXJtQ3JlZGVudGlhbHMgcmVzdWx0LgogICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaW5pc2hMb2dpbigpIHsKIAotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaExvZ2luKCkgewogICAgICAgICBMb2cuaShUQUcsICJmaW5pc2hMb2dpbigpIik7CiAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IG5ldyBBY2NvdW50KG1Vc2VybmFtZSwgQ29uc3RhbnRzLkFDQ09VTlRfVFlQRSk7Ci0KICAgICAgICAgaWYgKG1SZXF1ZXN0TmV3QWNjb3VudCkgewogICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmFkZEFjY291bnRFeHBsaWNpdGx5KGFjY291bnQsIG1QYXNzd29yZCwgbnVsbCk7CiAgICAgICAgICAgICAvLyBTZXQgY29udGFjdHMgc3luYyBmb3IgdGhpcyBhY2NvdW50LgotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnNldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQsCi0gICAgICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5BVVRIT1JJVFksIHRydWUpOworICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnNldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQsIENvbnRhY3RzQ29udHJhY3QuQVVUSE9SSVRZLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5zZXRQYXNzd29yZChhY2NvdW50LCBtUGFzc3dvcmQpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIG1BdXRodG9rZW4gPSBtUGFzc3dvcmQ7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FLCBtVXNlcm5hbWUpOwotICAgICAgICBpbnRlbnQKLSAgICAgICAgICAgIC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKLSAgICAgICAgaWYgKG1BdXRodG9rZW5UeXBlICE9IG51bGwKLSAgICAgICAgICAgICYmIG1BdXRodG9rZW5UeXBlLmVxdWFscyhDb25zdGFudHMuQVVUSFRPS0VOX1RZUEUpKSB7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKKyAgICAgICAgaWYgKG1BdXRodG9rZW5UeXBlICE9IG51bGwgJiYgbUF1dGh0b2tlblR5cGUuZXF1YWxzKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRSkpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQVVUSFRPS0VOLCBtQXV0aHRva2VuKTsKICAgICAgICAgfQogICAgICAgICBzZXRBY2NvdW50QXV0aGVudGljYXRvclJlc3VsdChpbnRlbnQuZ2V0RXh0cmFzKCkpOwpAQCAtMjAyLDcgKzIwOSw3IEBACiAgICAgLyoqCiAgICAgICogSGlkZXMgdGhlIHByb2dyZXNzIFVJIGZvciBhIGxlbmd0aHkgb3BlcmF0aW9uLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhpZGVQcm9ncmVzcygpIHsKKyAgICBwcml2YXRlIHZvaWQgaGlkZVByb2dyZXNzKCkgewogICAgICAgICBkaXNtaXNzRGlhbG9nKDApOwogICAgIH0KIApAQCAtMjEwLDYgKzIxNyw3IEBACiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgY29tcGxldGVzIChzZWUgYXR0ZW1wdExvZ2luKCkpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQXV0aGVudGljYXRpb25SZXN1bHQoYm9vbGVhbiByZXN1bHQpIHsKKwogICAgICAgICBMb2cuaShUQUcsICJvbkF1dGhlbnRpY2F0aW9uUmVzdWx0KCIgKyByZXN1bHQgKyAiKSIpOwogICAgICAgICAvLyBIaWRlIHRoZSBwcm9ncmVzcyBkaWFsb2cKICAgICAgICAgaGlkZVByb2dyZXNzKCk7CkBAIC0yMjMsMTQgKzIzMSwxMiBAQAogICAgICAgICAgICAgTG9nLmUoVEFHLCAib25BdXRoZW50aWNhdGlvblJlc3VsdDogZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSIpOwogICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TmV3QWNjb3VudCkgewogICAgICAgICAgICAgICAgIC8vICJQbGVhc2UgZW50ZXIgYSB2YWxpZCB1c2VybmFtZS9wYXNzd29yZC4KLSAgICAgICAgICAgICAgICBtTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLmxvZ2luX2FjdGl2aXR5X2xvZ2luZmFpbF90ZXh0X2JvdGgpKTsKKyAgICAgICAgICAgICAgICBtTWVzc2FnZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcubG9naW5fYWN0aXZpdHlfbG9naW5mYWlsX3RleHRfYm90aCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyAiUGxlYXNlIGVudGVyIGEgdmFsaWQgcGFzc3dvcmQuIiAoVXNlZCB3aGVuIHRoZQogICAgICAgICAgICAgICAgIC8vIGFjY291bnQgaXMgYWxyZWFkeSBpbiB0aGUgZGF0YWJhc2UgYnV0IHRoZSBwYXNzd29yZAogICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3Qgd29yay4pCi0gICAgICAgICAgICAgICAgbU1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5sb2dpbl9hY3Rpdml0eV9sb2dpbmZhaWxfdGV4dF9wd29ubHkpKTsKKyAgICAgICAgICAgICAgICBtTWVzc2FnZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcubG9naW5fYWN0aXZpdHlfbG9naW5mYWlsX3RleHRfcHdvbmx5KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDMsOCArMjQ5LDcgQEAKICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1Vc2VybmFtZSkpIHsKICAgICAgICAgICAgIC8vIElmIG5vIHVzZXJuYW1lLCB0aGVuIHdlIGFzayB0aGUgdXNlciB0byBsb2cgaW4gdXNpbmcgYW4KICAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlIHNlcnZpY2UuCi0gICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbXNnID0KLSAgICAgICAgICAgICAgICBnZXRUZXh0KFIuc3RyaW5nLmxvZ2luX2FjdGl2aXR5X25ld2FjY291bnRfdGV4dCk7CisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbXNnID0gZ2V0VGV4dChSLnN0cmluZy5sb2dpbl9hY3Rpdml0eV9uZXdhY2NvdW50X3RleHQpOwogICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgfQogICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobVBhc3N3b3JkKSkgewpAQCAtMjU3LDcgKzI2Miw3IEBACiAgICAgLyoqCiAgICAgICogU2hvd3MgdGhlIHByb2dyZXNzIFVJIGZvciBhIGxlbmd0aHkgb3BlcmF0aW9uLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dQcm9ncmVzcygpIHsKKyAgICBwcml2YXRlIHZvaWQgc2hvd1Byb2dyZXNzKCkgewogICAgICAgICBzaG93RGlhbG9nKDApOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvTmV0d29ya1V0aWxpdGllcy5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEKaW5kZXggOWQyYjY2Ni4uNzgyNGE0ZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5jbGllbnQ7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CkBAIC01MiwyMSArNTEsMzYgQEAKIC8qKgogICogUHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlci4KICAqLwotcHVibGljIGNsYXNzIE5ldHdvcmtVdGlsaXRpZXMgeworZmluYWwgcHVibGljIGNsYXNzIE5ldHdvcmtVdGlsaXRpZXMgeworCisgICAgLyoqIFRoZSB0YWcgdXNlZCB0byBsb2cgdG8gYWRiIGNvbnNvbGUuICoqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmV0d29ya1V0aWxpdGllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVVNFUk5BTUUgPSAidXNlcm5hbWUiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZXh0cmEgdG8gc3RvcmUgcGFzc3dvcmQuICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGV4dHJhIHRvIHN0b3JlIHVzZXJuYW1lLiAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VU0VSTkFNRSA9ICJ1c2VybmFtZSI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VUERBVEVEID0gInRpbWVzdGFtcCI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0FHRU5UID0gIkF1dGhlbnRpY2F0aW9uU2VydmljZS8xLjAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR0lTVFJBVElPTl9USU1FT1VUID0gMzAgKiAxMDAwOyAvLyBtcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVVJMID0KLSAgICAgICAgImh0dHBzOi8vc2FtcGxlc3luY2FkYXB0ZXIuYXBwc3BvdC5jb20iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHSVNUUkFUSU9OX1RJTUVPVVRfTVMgPSAzMCAqIDEwMDA7IC8vIG1zCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1VSTCA9ICJodHRwczovL3NhbXBsZXN5bmNhZGFwdGVyLmFwcHNwb3QuY29tIjsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfVVJJID0gQkFTRV9VUkwgKyAiL2F1dGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFVENIX0ZSSUVORF9VUERBVEVTX1VSSSA9Ci0gICAgICAgIEJBU0VfVVJMICsgIi9mZXRjaF9mcmllbmRfdXBkYXRlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRVRDSF9GUklFTkRfVVBEQVRFU19VUkkgPSBCQVNFX1VSTCArICIvZmV0Y2hfZnJpZW5kX3VwZGF0ZXMiOworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVUQ0hfU1RBVFVTX1VSSSA9IEJBU0VfVVJMICsgIi9mZXRjaF9zdGF0dXMiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgSHR0cENsaWVudCBtSHR0cENsaWVudDsKIAorICAgIHByaXZhdGUgTmV0d29ya1V0aWxpdGllcygpIHsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb25maWd1cmVzIHRoZSBodHRwQ2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIFVSTCBwcm92aWRlZC4KICAgICAgKi8KQEAgLTc0LDEwICs4OCw5IEBACiAgICAgICAgIGlmIChtSHR0cENsaWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICBtSHR0cENsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudCgpOwogICAgICAgICAgICAgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMgPSBtSHR0cENsaWVudC5nZXRQYXJhbXMoKTsKLSAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldENvbm5lY3Rpb25UaW1lb3V0KHBhcmFtcywKLSAgICAgICAgICAgICAgICBSRUdJU1RSQVRJT05fVElNRU9VVCk7Ci0gICAgICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb1RpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVCk7Ci0gICAgICAgICAgICBDb25uTWFuYWdlclBhcmFtcy5zZXRUaW1lb3V0KHBhcmFtcywgUkVHSVNUUkFUSU9OX1RJTUVPVVQpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVF9NUyk7CisgICAgICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb1RpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVF9NUyk7CisgICAgICAgICAgICBDb25uTWFuYWdlclBhcmFtcy5zZXRUaW1lb3V0KHBhcmFtcywgUkVHSVNUUkFUSU9OX1RJTUVPVVRfTVMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05NCw3ICsxMDcsNiBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC0xMTMsMTAgKzEyNSwxMCBAQAogICAgICAqIEByZXR1cm4gYm9vbGVhbiBUaGUgYm9vbGVhbiByZXN1bHQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1c2VyIHdhcwogICAgICAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwKLSAgICAgICAgSGFuZGxlciBoYW5kbGVyLCBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgSHR0cFJlc3BvbnNlIHJlc3A7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwgSGFuZGxlciBoYW5kbGVyLAorICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKIAorICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcDsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4oKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1VTRVJOQU1FLCB1c2VybmFtZSkpOwogICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fUEFTU1dPUkQsIHBhc3N3b3JkKSk7CkBAIC0xMzEsNyArMTQzLDYgQEAKICAgICAgICAgcG9zdC5hZGRIZWFkZXIoZW50aXR5LmdldENvbnRlbnRUeXBlKCkpOwogICAgICAgICBwb3N0LnNldEVudGl0eShlbnRpdHkpOwogICAgICAgICBtYXliZUNyZWF0ZUh0dHBDbGllbnQoKTsKLQogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVzcCA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgICAgICAgICBpZiAocmVzcC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spIHsKQEAgLTE4OSw4ICsyMDAsOSBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsZXIgQWN0aXZpdHkncyBjb250ZXh0CiAgICAgICogQHJldHVybiBUaHJlYWQgVGhlIHRocmVhZCBvbiB3aGljaCB0aGUgbmV0d29yayBtT3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUaHJlYWQgYXR0ZW1wdEF1dGgoZmluYWwgU3RyaW5nIHVzZXJuYW1lLAotICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQsIGZpbmFsIEhhbmRsZXIgaGFuZGxlciwgZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIHN0YXRpYyBUaHJlYWQgYXR0ZW1wdEF1dGgoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQsCisgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciwgZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisKICAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCwgaGFuZGxlciwgY29udGV4dCk7CkBAIC0yMDgsMzIgKzIyMCwyNyBAQAogICAgICAqIEBwYXJhbSBsYXN0VXBkYXRlZCBUaGUgbGFzdCB0aW1lIHRoYXQgc3luYyB3YXMgcGVyZm9ybWVkCiAgICAgICogQHJldHVybiBsaXN0IFRoZSBsaXN0IG9mIHVwZGF0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxVc2VyPiBmZXRjaEZyaWVuZFVwZGF0ZXMoQWNjb3VudCBhY2NvdW50LAotICAgICAgICBTdHJpbmcgYXV0aHRva2VuLCBEYXRlIGxhc3RVcGRhdGVkKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiwKLSAgICAgICAgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PFVzZXI+IGZldGNoRnJpZW5kVXBkYXRlcyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRodG9rZW4sIERhdGUgbGFzdFVwZGF0ZWQpCisgICAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8VXNlcj4gZnJpZW5kTGlzdCA9IG5ldyBBcnJheUxpc3Q8VXNlcj4oKTsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4oKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1BBU1NXT1JELCBhdXRodG9rZW4pKTsKICAgICAgICAgaWYgKGxhc3RVcGRhdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbSIpOworICAgICAgICAgICAgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbSIpOwogICAgICAgICAgICAgZm9ybWF0dGVyLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7Ci0gICAgICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fVVBEQVRFRCwgZm9ybWF0dGVyCi0gICAgICAgICAgICAgICAgLmZvcm1hdChsYXN0VXBkYXRlZCkpKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9VUERBVEVELCBmb3JtYXR0ZXIuZm9ybWF0KGxhc3RVcGRhdGVkKSkpOwogICAgICAgICB9CiAgICAgICAgIExvZy5pKFRBRywgcGFyYW1zLnRvU3RyaW5nKCkpOwotCiAgICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gbnVsbDsKICAgICAgICAgZW50aXR5ID0gbmV3IFVybEVuY29kZWRGb3JtRW50aXR5KHBhcmFtcyk7CiAgICAgICAgIGZpbmFsIEh0dHBQb3N0IHBvc3QgPSBuZXcgSHR0cFBvc3QoRkVUQ0hfRlJJRU5EX1VQREFURVNfVVJJKTsKICAgICAgICAgcG9zdC5hZGRIZWFkZXIoZW50aXR5LmdldENvbnRlbnRUeXBlKCkpOwogICAgICAgICBwb3N0LnNldEVudGl0eShlbnRpdHkpOwogICAgICAgICBtYXliZUNyZWF0ZUh0dHBDbGllbnQoKTsKLQogICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcCA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlc3AuZ2V0RW50aXR5KCkpOwotCiAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgewogICAgICAgICAgICAgLy8gU3VjY2VzZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBzYW1wbGVzeW5jYWRhcHRlciBzZXJ2ZXIgYW5kCiAgICAgICAgICAgICAvLyBhdXRoZW50aWNhdGVkLgpAQCAtMjQ1LDEyICsyNTIsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19VTkFVVEhPUklaRUQpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBleGNlcHRpb24gaW4gZmV0Y2hpbmcgcmVtb3RlIGNvbnRhY3RzIik7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXV0aGVudGljYXRpb24gZXhjZXB0aW9uIGluIGZldGNoaW5nIHJlbW90ZSBjb250YWN0cyIpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTZXJ2ZXIgZXJyb3IgaW4gZmV0Y2hpbmcgcmVtb3RlIGNvbnRhY3RzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgcmVzcC5nZXRTdGF0dXNMaW5lKCkpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNlcnZlciBlcnJvciBpbiBmZXRjaGluZyByZW1vdGUgY29udGFjdHM6ICIgKyByZXNwLmdldFN0YXR1c0xpbmUoKSk7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2NSwyNCArMjcwLDIxIEBACiAgICAgICogICAgICAgIGFjY291bnQKICAgICAgKiBAcmV0dXJuIGxpc3QgVGhlIGxpc3Qgb2Ygc3RhdHVzIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VXNlci5TdGF0dXM+IGZldGNoRnJpZW5kU3RhdHVzZXMoQWNjb3VudCBhY2NvdW50LAotICAgICAgICBTdHJpbmcgYXV0aHRva2VuKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PFVzZXIuU3RhdHVzPiBmZXRjaEZyaWVuZFN0YXR1c2VzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGh0b2tlbikKKyAgICAgICAgdGhyb3dzIEpTT05FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRpb25FeGNlcHRpb24geworCiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxVc2VyLlN0YXR1cz4gc3RhdHVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8VXNlci5TdGF0dXM+KCk7CiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxOYW1lVmFsdWVQYWlyPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+KCk7CiAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9VU0VSTkFNRSwgYWNjb3VudC5uYW1lKSk7CiAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9QQVNTV09SRCwgYXV0aHRva2VuKSk7Ci0KICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSBudWxsOwogICAgICAgICBlbnRpdHkgPSBuZXcgVXJsRW5jb2RlZEZvcm1FbnRpdHkocGFyYW1zKTsKICAgICAgICAgZmluYWwgSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdChGRVRDSF9TVEFUVVNfVVJJKTsKICAgICAgICAgcG9zdC5hZGRIZWFkZXIoZW50aXR5LmdldENvbnRlbnRUeXBlKCkpOwogICAgICAgICBwb3N0LnNldEVudGl0eShlbnRpdHkpOwogICAgICAgICBtYXliZUNyZWF0ZUh0dHBDbGllbnQoKTsKLQogICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcCA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlc3AuZ2V0RW50aXR5KCkpOwotCiAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgewogICAgICAgICAgICAgLy8gU3VjY2VzZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBzYW1wbGVzeW5jYWRhcHRlciBzZXJ2ZXIgYW5kCiAgICAgICAgICAgICAvLyBhdXRoZW50aWNhdGVkLgpAQCAtMjkzLDggKzI5NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAocmVzcC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfVU5BVVRIT1JJWkVEKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpb24gZXhjZXB0aW9uIGluIGZldGNoaW5nIGZyaWVuZCBzdGF0dXMgbGlzdCIpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbiBpbiBmZXRjaGluZyBmcmllbmQgc3RhdHVzIGxpc3QiKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VydmVyIGVycm9yIGluIGZldGNoaW5nIGZyaWVuZCBzdGF0dXMgbGlzdCIpOwpAQCAtMzAzLDUgKzMwNCw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1c0xpc3Q7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L1VzZXIuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhCmluZGV4IDZjZTliM2YuLjIxN2EzODMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuY2xpZW50OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTIzLDE2ICsyMiwyNCBAQAogLyoqCiAgKiBSZXByZXNlbnRzIGEgc2FtcGxlIFN5bmNBZGFwdGVyIHVzZXIKICAqLwotcHVibGljIGNsYXNzIFVzZXIgeworZmluYWwgcHVibGljIGNsYXNzIFVzZXIgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVzZXJOYW1lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZpcnN0TmFtZTsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1MYXN0TmFtZTsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DZWxsUGhvbmU7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtT2ZmaWNlUGhvbmU7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSG9tZVBob25lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUVtYWlsOworCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EZWxldGVkOworCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVVzZXJJZDsKIAogICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgewpAQCAtNzEsOSArNzgsOSBAQAogICAgICAgICByZXR1cm4gbURlbGV0ZWQ7CiAgICAgfQogCi0gICAgcHVibGljIFVzZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwKLSAgICAgICAgU3RyaW5nIGNlbGxQaG9uZSwgU3RyaW5nIG9mZmljZVBob25lLCBTdHJpbmcgaG9tZVBob25lLCBTdHJpbmcgZW1haWwsCi0gICAgICAgIEJvb2xlYW4gZGVsZXRlZCwgSW50ZWdlciB1c2VySWQpIHsKKyAgICBwcml2YXRlIFVzZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIGNlbGxQaG9uZSwKKyAgICAgICAgU3RyaW5nIG9mZmljZVBob25lLCBTdHJpbmcgaG9tZVBob25lLCBTdHJpbmcgZW1haWwsIEJvb2xlYW4gZGVsZXRlZCwgSW50ZWdlciB1c2VySWQpIHsKKwogICAgICAgICBtVXNlck5hbWUgPSBuYW1lOwogICAgICAgICBtRmlyc3ROYW1lID0gZmlyc3ROYW1lOwogICAgICAgICBtTGFzdE5hbWUgPSBsYXN0TmFtZTsKQEAgLTkyLDM0ICs5OSwzMyBAQAogICAgICAqIEByZXR1cm4gdXNlciBUaGUgbmV3IGluc3RhbmNlIG9mIFZvaXBlciB1c2VyIGNyZWF0ZWQgZnJvbSB0aGUgSlNPTiBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVXNlciB2YWx1ZU9mKEpTT05PYmplY3QgdXNlcikgeworCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlck5hbWUgPSB1c2VyLmdldFN0cmluZygidSIpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0TmFtZSA9IHVzZXIuaGFzKCJmIikgPyB1c2VyLmdldFN0cmluZygiZiIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TmFtZSA9IHVzZXIuaGFzKCJsIikgPyB1c2VyLmdldFN0cmluZygibCIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjZWxsUGhvbmUgPSB1c2VyLmhhcygibSIpID8gdXNlci5nZXRTdHJpbmcoIm0iKSA6IG51bGw7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgb2ZmaWNlUGhvbmUgPQotICAgICAgICAgICAgICAgIHVzZXIuaGFzKCJvIikgPyB1c2VyLmdldFN0cmluZygibyIpIDogbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvZmZpY2VQaG9uZSA9IHVzZXIuaGFzKCJvIikgPyB1c2VyLmdldFN0cmluZygibyIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBob21lUGhvbmUgPSB1c2VyLmhhcygiaCIpID8gdXNlci5nZXRTdHJpbmcoImgiKSA6IG51bGw7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW1haWwgPSB1c2VyLmhhcygiZSIpID8gdXNlci5nZXRTdHJpbmcoImUiKSA6IG51bGw7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGRlbGV0ZWQgPQotICAgICAgICAgICAgICAgIHVzZXIuaGFzKCJkIikgPyB1c2VyLmdldEJvb2xlYW4oImQiKSA6IGZhbHNlOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZWxldGVkID0gdXNlci5oYXMoImQiKSA/IHVzZXIuZ2V0Qm9vbGVhbigiZCIpIDogZmFsc2U7CiAgICAgICAgICAgICBmaW5hbCBpbnQgdXNlcklkID0gdXNlci5nZXRJbnQoImkiKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVXNlcih1c2VyTmFtZSwgZmlyc3ROYW1lLCBsYXN0TmFtZSwgY2VsbFBob25lLAotICAgICAgICAgICAgICAgIG9mZmljZVBob25lLCBob21lUGhvbmUsIGVtYWlsLCBkZWxldGVkLCB1c2VySWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyKHVzZXJOYW1lLCBmaXJzdE5hbWUsIGxhc3ROYW1lLCBjZWxsUGhvbmUsIG9mZmljZVBob25lLCBob21lUGhvbmUsCisgICAgICAgICAgICAgICAgZW1haWwsIGRlbGV0ZWQsIHVzZXJJZCk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgTG9nLmkoIlVzZXIiLCAiRXJyb3IgcGFyc2luZyBKU09OIHVzZXIgb2JqZWN0IiArIGV4LnRvU3RyaW5nKCkpOwotCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7Ci0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXByZXNlbnRzIHRoZSBVc2VyJ3Mgc3RhdHVzIG1lc3NhZ2VzCiAgICAgICogCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0dXMgeworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdHVzIHsKKwogICAgICAgICBwcml2YXRlIGZpbmFsIEludGVnZXIgbVVzZXJJZDsKKwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU3RhdHVzOwogCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgewpAQCAtMTQ2LDUgKzE1Miw0IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0JhdGNoT3BlcmF0aW9uLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YQppbmRleCA1MDlkMTUxLi4wYmUzZGFhIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLnBsYXRmb3JtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKQEAgLTI5LDEyICsyOCwxNCBAQAogLyoqCiAgKiBUaGlzIGNsYXNzIGhhbmRsZXMgZXhlY3V0aW9uIG9mIGJhdGNoIG1PcGVyYXRpb25zIG9uIENvbnRhY3RzIHByb3ZpZGVyLgogICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hPcGVyYXRpb24geworZmluYWwgcHVibGljIGNsYXNzIEJhdGNoT3BlcmF0aW9uIHsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJCYXRjaE9wZXJhdGlvbiI7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisKICAgICAvLyBMaXN0IGZvciBzdG9yaW5nIHRoZSBiYXRjaCBtT3BlcmF0aW9ucwotICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG1PcGVyYXRpb25zOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gbU9wZXJhdGlvbnM7CiAKICAgICBwdWJsaWMgQmF0Y2hPcGVyYXRpb24oQ29udGV4dCBjb250ZXh0LCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CkBAIC01MCw2ICs1MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwogICAgICAgICBpZiAobU9wZXJhdGlvbnMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNjMsNSArNjUsNCBAQAogICAgICAgICB9CiAgICAgICAgIG1PcGVyYXRpb25zLmNsZWFyKCk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE1hbmFnZXIuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhCmluZGV4IDRmNzFiZTAuLjIxOGIxNjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMucGxhdGZvcm07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwpAQCAtNDEsMTAgKzQwLDEyIEBACiAgKiBDbGFzcyBmb3IgbWFuYWdpbmcgY29udGFjdHMgc3luYyByZWxhdGVkIG1PcGVyYXRpb25zCiAgKi8KIHB1YmxpYyBjbGFzcyBDb250YWN0TWFuYWdlciB7CisKICAgICAvKioKICAgICAgKiBDdXN0b20gSU0gcHJvdG9jb2wgdXNlZCB3aGVuIHN0b3Jpbmcgc3RhdHVzIG1lc3NhZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTV9QUk9UT0NPTCA9ICJTYW1wbGVTeW5jQWRhcHRlciI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RNYW5hZ2VyIjsKIAogICAgIC8qKgpAQCAtNTQsMTMgKzU1LDEyIEBACiAgICAgICogQHBhcmFtIGFjY291bnQgVGhlIHVzZXJuYW1lIGZvciB0aGUgYWNjb3VudAogICAgICAqIEBwYXJhbSB1c2VycyBUaGUgbGlzdCBvZiB1c2VycwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3luY0NvbnRhY3RzKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgU3RyaW5nIGFjY291bnQsIExpc3Q8VXNlcj4gdXNlcnMpIHsKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN5bmNDb250YWN0cyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyBhY2NvdW50LCBMaXN0PFVzZXI+IHVzZXJzKSB7CisKICAgICAgICAgbG9uZyB1c2VySWQ7CiAgICAgICAgIGxvbmcgcmF3Q29udGFjdElkID0gMDsKICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPQotICAgICAgICAgICAgbmV3IEJhdGNoT3BlcmF0aW9uKGNvbnRleHQsIHJlc29sdmVyKTsKKyAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPSBuZXcgQmF0Y2hPcGVyYXRpb24oY29udGV4dCwgcmVzb2x2ZXIpOwogICAgICAgICBMb2cuZChUQUcsICJJbiBTeW5jQ29udGFjdHMiKTsKICAgICAgICAgZm9yIChmaW5hbCBVc2VyIHVzZXIgOiB1c2VycykgewogICAgICAgICAgICAgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKQEAgLTY5LDggKzY5LDcgQEAKICAgICAgICAgICAgIGlmIChyYXdDb250YWN0SWQgIT0gMCkgewogICAgICAgICAgICAgICAgIGlmICghdXNlci5pc0RlbGV0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29udGFjdAotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWN0KGNvbnRleHQsIHJlc29sdmVyLCBhY2NvdW50LCB1c2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhY3QoY29udGV4dCwgcmVzb2x2ZXIsIGFjY291bnQsIHVzZXIsIHJhd0NvbnRhY3RJZCwgYmF0Y2hPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBjb250YWN0CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvbnRhY3QoY29udGV4dCwgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CkBAIC05OCwxNyArOTcsMTUgQEAKICAgICAgKiBAcGFyYW0gYWNjb3VudE5hbWUgdGhlIHVzZXJuYW1lIG9mIHRoZSBsb2dnZWQgaW4gdXNlcgogICAgICAqIEBwYXJhbSBzdGF0dXNlcyB0aGUgbGlzdCBvZiBzdGF0dXNlcyB0byBzdG9yZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRTdGF0dXNlcyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB1c2VybmFtZSwKLSAgICAgICAgTGlzdDxVc2VyLlN0YXR1cz4gbGlzdCkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRTdGF0dXNlcyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB1c2VybmFtZSwgTGlzdDxVc2VyLlN0YXR1cz4gbGlzdCkgeworCiAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPQotICAgICAgICAgICAgbmV3IEJhdGNoT3BlcmF0aW9uKGNvbnRleHQsIHJlc29sdmVyKTsKKyAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPSBuZXcgQmF0Y2hPcGVyYXRpb24oY29udGV4dCwgcmVzb2x2ZXIpOwogICAgICAgICBmb3IgKGZpbmFsIFVzZXIuU3RhdHVzIHN0YXR1cyA6IGxpc3QpIHsKICAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIHVzZXIncyBzYW1wbGUgU3luY0FkYXB0ZXIgZGF0YSByb3cKICAgICAgICAgICAgIGZpbmFsIGxvbmcgdXNlcklkID0gc3RhdHVzLmdldFVzZXJJZCgpOwogICAgICAgICAgICAgZmluYWwgbG9uZyBwcm9maWxlSWQgPSBsb29rdXBQcm9maWxlKHJlc29sdmVyLCB1c2VySWQpOwotCiAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIGFjdGl2aXR5IGludG8gdGhlIHN0cmVhbQogICAgICAgICAgICAgaWYgKHByb2ZpbGVJZCA+IDApIHsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuREFUQV9JRCwgcHJvZmlsZUlkKTsKQEAgLTExNywxNSArMTE0LDExIEBACiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLkNVU1RPTV9QUk9UT0NPTCwgQ1VTVE9NX0lNX1BST1RPQ09MKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuSU1fQUNDT1VOVCwgdXNlcm5hbWUpOwogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoU3RhdHVzVXBkYXRlcy5JTV9IQU5ETEUsIHN0YXR1cy5nZXRVc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLlNUQVRVU19SRVNfUEFDS0FHRSwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLlNUQVRVU19SRVNfUEFDS0FHRSwgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuU1RBVFVTX0lDT04sIFIuZHJhd2FibGUuaWNvbik7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLlNUQVRVU19MQUJFTCwgUi5zdHJpbmcubGFiZWwpOwotCi0gICAgICAgICAgICAgICAgYmF0Y2hPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmFkZChDb250YWN0T3BlcmF0aW9ucy5uZXdJbnNlcnRDcG8oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNVcGRhdGVzLkNPTlRFTlRfVVJJLCB0cnVlKS53aXRoVmFsdWVzKHZhbHVlcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBiYXRjaE9wZXJhdGlvbi5hZGQoQ29udGFjdE9wZXJhdGlvbnMubmV3SW5zZXJ0Q3BvKFN0YXR1c1VwZGF0ZXMuQ09OVEVOVF9VUkksIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC53aXRoVmFsdWVzKHZhbHVlcykuYnVpbGQoKSk7CiAgICAgICAgICAgICAgICAgLy8gQSBzeW5jIGFkYXB0ZXIgc2hvdWxkIGJhdGNoIG9wZXJhdGlvbnMgb24gbXVsdGlwbGUgY29udGFjdHMsCiAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCB3aWxsIG1ha2UgYSBkcmFtYXRpYyBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlLgogICAgICAgICAgICAgICAgIGlmIChiYXRjaE9wZXJhdGlvbi5zaXplKCkgPj0gNTApIHsKQEAgLTE0MywxNiArMTM2LDE2IEBACiAgICAgICogQHBhcmFtIGFjY291bnROYW1lIHRoZSBhY2NvdW50IHRoZSBjb250YWN0IGJlbG9uZ3MgdG8KICAgICAgKiBAcGFyYW0gdXNlciB0aGUgc2FtcGxlIFN5bmNBZGFwdGVyIFVzZXIgb2JqZWN0CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb250YWN0KENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjY291bnROYW1lLAotICAgICAgICBVc2VyIHVzZXIsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb250YWN0KENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjY291bnROYW1lLCBVc2VyIHVzZXIsCisgICAgICAgIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisKICAgICAgICAgLy8gUHV0IHRoZSBkYXRhIGluIHRoZSBjb250YWN0cyBwcm92aWRlcgogICAgICAgICBmaW5hbCBDb250YWN0T3BlcmF0aW9ucyBjb250YWN0T3AgPQotICAgICAgICAgICAgQ29udGFjdE9wZXJhdGlvbnMuY3JlYXRlTmV3Q29udGFjdChjb250ZXh0LCB1c2VyLmdldFVzZXJJZCgpLAotICAgICAgICAgICAgICAgIGFjY291bnROYW1lLCBiYXRjaE9wZXJhdGlvbik7Ci0gICAgICAgIGNvbnRhY3RPcC5hZGROYW1lKHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSkuYWRkRW1haWwoCi0gICAgICAgICAgICB1c2VyLmdldEVtYWlsKCkpLmFkZFBob25lKHVzZXIuZ2V0Q2VsbFBob25lKCksIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgLmFkZFBob25lKHVzZXIuZ2V0SG9tZVBob25lKCksIFBob25lLlRZUEVfT1RIRVIpLmFkZFByb2ZpbGVBY3Rpb24oCi0gICAgICAgICAgICAgICAgdXNlci5nZXRVc2VySWQoKSk7CisgICAgICAgICAgICBDb250YWN0T3BlcmF0aW9ucy5jcmVhdGVOZXdDb250YWN0KGNvbnRleHQsIHVzZXIuZ2V0VXNlcklkKCksIGFjY291bnROYW1lLAorICAgICAgICAgICAgICAgIGJhdGNoT3BlcmF0aW9uKTsKKyAgICAgICAgY29udGFjdE9wLmFkZE5hbWUodXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpKS5hZGRFbWFpbCh1c2VyLmdldEVtYWlsKCkpCisgICAgICAgICAgICAuYWRkUGhvbmUodXNlci5nZXRDZWxsUGhvbmUoKSwgUGhvbmUuVFlQRV9NT0JJTEUpLmFkZFBob25lKHVzZXIuZ2V0SG9tZVBob25lKCksCisgICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9PVEhFUikuYWRkUHJvZmlsZUFjdGlvbih1c2VyLmdldFVzZXJJZCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NSw3NiArMTU4LDU3IEBACiAgICAgICogQHBhcmFtIHJhd0NvbnRhY3RJZCB0aGUgdW5pcXVlIElkIGZvciB0aGlzIHJhd0NvbnRhY3QgaW4gY29udGFjdHMKICAgICAgKiAgICAgICAgcHJvdmlkZXIKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNvbnRhY3QoQ29udGV4dCBjb250ZXh0LAotICAgICAgICBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBhY2NvdW50TmFtZSwgVXNlciB1c2VyLAotICAgICAgICBsb25nIHJhd0NvbnRhY3RJZCwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsCisgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSwgVXNlciB1c2VyLCBsb25nIHJhd0NvbnRhY3RJZCwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICBVcmkgdXJpOwogICAgICAgICBTdHJpbmcgY2VsbFBob25lID0gbnVsbDsKICAgICAgICAgU3RyaW5nIG90aGVyUGhvbmUgPSBudWxsOwogICAgICAgICBTdHJpbmcgZW1haWwgPSBudWxsOwotCiAgICAgICAgIGZpbmFsIEN1cnNvciBjID0KLSAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KERhdGEuQ09OVEVOVF9VUkksIERhdGFRdWVyeS5QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIERhdGFRdWVyeS5TRUxFQ1RJT04sCisgICAgICAgICAgICByZXNvbHZlci5xdWVyeShEYXRhLkNPTlRFTlRfVVJJLCBEYXRhUXVlcnkuUFJPSkVDVElPTiwgRGF0YVF1ZXJ5LlNFTEVDVElPTiwKICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKHJhd0NvbnRhY3RJZCl9LCBudWxsKTsKICAgICAgICAgZmluYWwgQ29udGFjdE9wZXJhdGlvbnMgY29udGFjdE9wID0KLSAgICAgICAgICAgIENvbnRhY3RPcGVyYXRpb25zLnVwZGF0ZUV4aXN0aW5nQ29udGFjdChjb250ZXh0LCByYXdDb250YWN0SWQsCi0gICAgICAgICAgICAgICAgYmF0Y2hPcGVyYXRpb24pOwotCisgICAgICAgICAgICBDb250YWN0T3BlcmF0aW9ucy51cGRhdGVFeGlzdGluZ0NvbnRhY3QoY29udGV4dCwgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkID0gYy5nZXRMb25nKERhdGFRdWVyeS5DT0xVTU5fSUQpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fTUlNRVRZUEUpOwogICAgICAgICAgICAgICAgIHVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKERhdGEuQ09OVEVOVF9VUkksIGlkKTsKLQogICAgICAgICAgICAgICAgIGlmIChtaW1lVHlwZS5lcXVhbHMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX0dJVkVOX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlTmFtZSh1cmksIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TmFtZSA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fRkFNSUxZX05BTUUpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3ROYW1lID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9HSVZFTl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZU5hbWUodXJpLCBmaXJzdE5hbWUsIGxhc3ROYW1lLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TGFzdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gYy5nZXRJbnQoRGF0YVF1ZXJ5LkNPTFVNTl9QSE9ORV9UWVBFKTsKLQogICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX01PQklMRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFBob25lID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9QSE9ORV9OVU1CRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZVBob25lKGNlbGxQaG9uZSwgdXNlci5nZXRDZWxsUGhvbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZVBob25lKGNlbGxQaG9uZSwgdXNlci5nZXRDZWxsUGhvbmUoKSwgdXJpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFBob25lLlRZUEVfT1RIRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUGhvbmUgPSBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX1BIT05FX05VTUJFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlUGhvbmUob3RoZXJQaG9uZSwgdXNlci5nZXRIb21lUGhvbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZVBob25lKG90aGVyUGhvbmUsIHVzZXIuZ2V0SG9tZVBob25lKCksIHVyaSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChEYXRhLk1JTUVUWVBFLmVxdWFscyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERhdGEuTUlNRVRZUEUuZXF1YWxzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkgewogICAgICAgICAgICAgICAgICAgICBlbWFpbCA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fRU1BSUxfQUREUkVTUyk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3RPcC51cGRhdGVFbWFpbCh1c2VyLmdldEVtYWlsKCksIGVtYWlsLCB1cmkpOwotCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAvLyB3aGlsZQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgYy5jbG9zZSgpOwogICAgICAgICB9Ci0KICAgICAgICAgLy8gQWRkIHRoZSBjZWxsIHBob25lLCBpZiBwcmVzZW50IGFuZCBub3QgdXBkYXRlZCBhYm92ZQogICAgICAgICBpZiAoY2VsbFBob25lID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbnRhY3RPcC5hZGRQaG9uZSh1c2VyLmdldENlbGxQaG9uZSgpLCBQaG9uZS5UWVBFX01PQklMRSk7CiAgICAgICAgIH0KLQogICAgICAgICAvLyBBZGQgdGhlIG90aGVyIHBob25lLCBpZiBwcmVzZW50IGFuZCBub3QgdXBkYXRlZCBhYm92ZQogICAgICAgICBpZiAob3RoZXJQaG9uZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb250YWN0T3AuYWRkUGhvbmUodXNlci5nZXRIb21lUGhvbmUoKSwgUGhvbmUuVFlQRV9PVEhFUik7CiAgICAgICAgIH0KLQogICAgICAgICAvLyBBZGQgdGhlIGVtYWlsIGFkZHJlc3MsIGlmIHByZXNlbnQgYW5kIG5vdCB1cGRhdGVkIGFib3ZlCiAgICAgICAgIGlmIChlbWFpbCA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb250YWN0T3AuYWRkRW1haWwodXNlci5nZXRFbWFpbCgpKTsKICAgICAgICAgfQotCiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDYsOSArMjIwLDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZUNvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBsb25nIHJhd0NvbnRhY3RJZCwKICAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICBiYXRjaE9wZXJhdGlvbi5hZGQoQ29udGFjdE9wZXJhdGlvbnMubmV3RGVsZXRlQ3BvKAotICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIHJhd0NvbnRhY3RJZCksCi0gICAgICAgICAgICB0cnVlKS5idWlsZCgpKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCByYXdDb250YWN0SWQpLCB0cnVlKS5idWlsZCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2MCwxMSArMjM0LDExIEBACiAgICAgICogQHJldHVybiB0aGUgUmF3Q29udGFjdCBpZCwgb3IgMCBpZiBub3QgZm91bmQKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGxvb2t1cFJhd0NvbnRhY3QoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBsb25nIHVzZXJJZCkgeworCiAgICAgICAgIGxvbmcgYXV0aG9ySWQgPSAwOwogICAgICAgICBmaW5hbCBDdXJzb3IgYyA9Ci0gICAgICAgICAgICByZXNvbHZlci5xdWVyeShSYXdDb250YWN0cy5DT05URU5UX1VSSSwgVXNlcklkUXVlcnkuUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICBVc2VySWRRdWVyeS5TRUxFQ1RJT04sIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sCi0gICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICByZXNvbHZlci5xdWVyeShSYXdDb250YWN0cy5DT05URU5UX1VSSSwgVXNlcklkUXVlcnkuUFJPSkVDVElPTiwgVXNlcklkUXVlcnkuU0VMRUNUSU9OLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sIG51bGwpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgIGF1dGhvcklkID0gYy5nZXRMb25nKFVzZXJJZFF1ZXJ5LkNPTFVNTl9JRCk7CkBAIC0yODYsMTEgKzI2MCwxMSBAQAogICAgICAqIEByZXR1cm4gdGhlIHByb2ZpbGUgRGF0YSByb3cgaWQsIG9yIDAgaWYgbm90IGZvdW5kCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb29rdXBQcm9maWxlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgbG9uZyB1c2VySWQpIHsKKwogICAgICAgICBsb25nIHByb2ZpbGVJZCA9IDA7CiAgICAgICAgIGZpbmFsIEN1cnNvciBjID0KLSAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KERhdGEuQ09OVEVOVF9VUkksIFByb2ZpbGVRdWVyeS5QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIFByb2ZpbGVRdWVyeS5TRUxFQ1RJT04sIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sCi0gICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICByZXNvbHZlci5xdWVyeShEYXRhLkNPTlRFTlRfVVJJLCBQcm9maWxlUXVlcnkuUFJPSkVDVElPTiwgUHJvZmlsZVF1ZXJ5LlNFTEVDVElPTiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKHVzZXJJZCl9LCBudWxsKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9GaXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgcHJvZmlsZUlkID0gYy5nZXRMb25nKFByb2ZpbGVRdWVyeS5DT0xVTU5fSUQpOwpAQCAtMzA3LDIyICsyODEsMzAgQEAKICAgICAgKiBDb25zdGFudHMgZm9yIGEgcXVlcnkgdG8gZmluZCBhIGNvbnRhY3QgZ2l2ZW4gYSBzYW1wbGUgU3luY0FkYXB0ZXIgdXNlcgogICAgICAqIElELgogICAgICAqLwotICAgIHByaXZhdGUgaW50ZXJmYWNlIFByb2ZpbGVRdWVyeSB7CisgICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvZmlsZVF1ZXJ5IHsKKworICAgICAgICBwcml2YXRlIFByb2ZpbGVRdWVyeSgpIHsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7RGF0YS5fSUR9OwogCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTFVNTl9JRCA9IDA7CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0KLSAgICAgICAgICAgIERhdGEuTUlNRVRZUEUgKyAiPSciICsgU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLk1JTUVfUFJPRklMRQotICAgICAgICAgICAgICAgICsgIicgQU5EICIgKyBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuREFUQV9QSUQgKyAiPT8iOworICAgICAgICAgICAgRGF0YS5NSU1FVFlQRSArICI9JyIgKyBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuTUlNRV9QUk9GSUxFICsgIicgQU5EICIKKyAgICAgICAgICAgICAgICArIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5EQVRBX1BJRCArICI9PyI7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnRzIGZvciBhIHF1ZXJ5IHRvIGZpbmQgYSBjb250YWN0IGdpdmVuIGEgc2FtcGxlIFN5bmNBZGFwdGVyIHVzZXIKICAgICAgKiBJRC4KICAgICAgKi8KLSAgICBwcml2YXRlIGludGVyZmFjZSBVc2VySWRRdWVyeSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJPSkVDVElPTiA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nW10ge1Jhd0NvbnRhY3RzLl9JRH07CisgICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXNlcklkUXVlcnkgeworCisgICAgICAgIHByaXZhdGUgVXNlcklkUXVlcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10ge1Jhd0NvbnRhY3RzLl9JRH07CiAKICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09MVU1OX0lEID0gMDsKIApAQCAtMzM0LDIxICszMTYsMzQgQEAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIGEgcXVlcnkgdG8gZ2V0IGNvbnRhY3QgZGF0YSBmb3IgYSBnaXZlbiByYXdDb250YWN0SWQKICAgICAgKi8KLSAgICBwcml2YXRlIGludGVyZmFjZSBEYXRhUXVlcnkgeworICAgIGZpbmFsIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGFRdWVyeSB7CisKKyAgICAgICAgcHJpdmF0ZSBEYXRhUXVlcnkoKSB7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPQotICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtEYXRhLl9JRCwgRGF0YS5NSU1FVFlQRSwgRGF0YS5EQVRBMSwgRGF0YS5EQVRBMiwKLSAgICAgICAgICAgICAgICBEYXRhLkRBVEEzLH07CisgICAgICAgICAgICBuZXcgU3RyaW5nW10ge0RhdGEuX0lELCBEYXRhLk1JTUVUWVBFLCBEYXRhLkRBVEExLCBEYXRhLkRBVEEyLCBEYXRhLkRBVEEzLH07CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lEID0gMDsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUlNRVRZUEUgPSAxOworCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9EQVRBMSA9IDI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RBVEEyID0gMzsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fREFUQTMgPSA0OworCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9QSE9ORV9OVU1CRVIgPSBDT0xVTU5fREFUQTE7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1BIT05FX1RZUEUgPSBDT0xVTU5fREFUQTI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0VNQUlMX0FERFJFU1MgPSBDT0xVTU5fREFUQTE7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0VNQUlMX1RZUEUgPSBDT0xVTU5fREFUQTI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0dJVkVOX05BTUUgPSBDT0xVTU5fREFUQTI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0ZBTUlMWV9OQU1FID0gQ09MVU1OX0RBVEEzOwogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVElPTiA9IERhdGEuUkFXX0NPTlRBQ1RfSUQgKyAiPT8iOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0NvbnRhY3RPcGVyYXRpb25zLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YQppbmRleCA5ZTQ3ZjcwLi5kYjAxZjQ4IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLnBsYXRmb3JtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKQEAgLTM4LDEyICszNywxOSBAQAogcHVibGljIGNsYXNzIENvbnRhY3RPcGVyYXRpb25zIHsKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGVudFZhbHVlcyBtVmFsdWVzOworCiAgICAgcHJpdmF0ZSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBtQnVpbGRlcjsKKwogICAgIHByaXZhdGUgZmluYWwgQmF0Y2hPcGVyYXRpb24gbUJhdGNoT3BlcmF0aW9uOworCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCiAgICAgcHJpdmF0ZSBib29sZWFuIG1ZaWVsZDsKKwogICAgIHByaXZhdGUgbG9uZyBtUmF3Q29udGFjdElkOworCiAgICAgcHJpdmF0ZSBpbnQgbUJhY2tSZWZlcmVuY2U7CisKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTmV3Q29udGFjdDsKIAogICAgIC8qKgpAQCAtNTUsMTAgKzYxLDEwIEBACiAgICAgICogQHBhcmFtIGFjY291bnROYW1lIHRoZSB1c2VybmFtZSBvZiB0aGUgY3VycmVudCBsb2dpbgogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbnRhY3RPcGVyYXRpb25zIGNyZWF0ZU5ld0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LAotICAgICAgICBpbnQgdXNlcklkLCBTdHJpbmcgYWNjb3VudE5hbWUsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGFjdE9wZXJhdGlvbnMoY29udGV4dCwgdXNlcklkLCBhY2NvdW50TmFtZSwKLSAgICAgICAgICAgIGJhdGNoT3BlcmF0aW9uKTsKKyAgICBwdWJsaWMgc3RhdGljIENvbnRhY3RPcGVyYXRpb25zIGNyZWF0ZU5ld0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBpbnQgdXNlcklkLAorICAgICAgICBTdHJpbmcgYWNjb3VudE5hbWUsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBDb250YWN0T3BlcmF0aW9ucyhjb250ZXh0LCB1c2VySWQsIGFjY291bnROYW1lLCBiYXRjaE9wZXJhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OSw4ICs3NSw5IEBACiAgICAgICogQHBhcmFtIHJhd0NvbnRhY3RJZCB0aGUgdW5pcXVlIElkIG9mIHRoZSBleGlzdGluZyByYXdDb250YWN0CiAgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBDb250YWN0T3BlcmF0aW9ucwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlRXhpc3RpbmdDb250YWN0KENvbnRleHQgY29udGV4dCwKLSAgICAgICAgbG9uZyByYXdDb250YWN0SWQsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVFeGlzdGluZ0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBsb25nIHJhd0NvbnRhY3RJZCwKKyAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICByZXR1cm4gbmV3IENvbnRhY3RPcGVyYXRpb25zKGNvbnRleHQsIHJhd0NvbnRhY3RJZCwgYmF0Y2hPcGVyYXRpb24pOwogICAgIH0KIApAQCAtODMsMTkgKzkwLDE4IEBACiAKICAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMoQ29udGV4dCBjb250ZXh0LCBpbnQgdXNlcklkLCBTdHJpbmcgYWNjb3VudE5hbWUsCiAgICAgICAgIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisKICAgICAgICAgdGhpcyhjb250ZXh0LCBiYXRjaE9wZXJhdGlvbik7CiAgICAgICAgIG1CYWNrUmVmZXJlbmNlID0gbUJhdGNoT3BlcmF0aW9uLnNpemUoKTsKICAgICAgICAgbUlzTmV3Q29udGFjdCA9IHRydWU7CiAgICAgICAgIG1WYWx1ZXMucHV0KFJhd0NvbnRhY3RzLlNPVVJDRV9JRCwgdXNlcklkKTsKICAgICAgICAgbVZhbHVlcy5wdXQoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKICAgICAgICAgbVZhbHVlcy5wdXQoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBhY2NvdW50TmFtZSk7Ci0gICAgICAgIG1CdWlsZGVyID0KLSAgICAgICAgICAgIG5ld0luc2VydENwbyhSYXdDb250YWN0cy5DT05URU5UX1VSSSwgdHJ1ZSkud2l0aFZhbHVlcyhtVmFsdWVzKTsKKyAgICAgICAgbUJ1aWxkZXIgPSBuZXdJbnNlcnRDcG8oUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIHRydWUpLndpdGhWYWx1ZXMobVZhbHVlcyk7CiAgICAgICAgIG1CYXRjaE9wZXJhdGlvbi5hZGQobUJ1aWxkZXIuYnVpbGQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIENvbnRhY3RPcGVyYXRpb25zKENvbnRleHQgY29udGV4dCwgbG9uZyByYXdDb250YWN0SWQsCi0gICAgICAgIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisgICAgcHVibGljIENvbnRhY3RPcGVyYXRpb25zKENvbnRleHQgY29udGV4dCwgbG9uZyByYXdDb250YWN0SWQsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgYmF0Y2hPcGVyYXRpb24pOwogICAgICAgICBtSXNOZXdDb250YWN0ID0gZmFsc2U7CiAgICAgICAgIG1SYXdDb250YWN0SWQgPSByYXdDb250YWN0SWQ7CkBAIC0xMDksMTYgKzExNSwxNSBAQAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KICAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgYWRkTmFtZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKKwogICAgICAgICBtVmFsdWVzLmNsZWFyKCk7CiAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZmlyc3ROYW1lKSkgewogICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgZmlyc3ROYW1lKTsKLSAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLk1JTUVUWVBFLAotICAgICAgICAgICAgICAgIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKKyAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYXN0TmFtZSkpIHsKICAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCBsYXN0TmFtZSk7Ci0gICAgICAgICAgICBtVmFsdWVzLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSU1FVFlQRSwKLSAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7CisgICAgICAgICAgICBtVmFsdWVzLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVmFsdWVzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGFkZEluc2VydE9wKCk7CkBAIC0xODgsOCArMTkzLDcgQEAKICAgICAgKiBAcGFyYW0gdXJpIFVyaSBmb3IgdGhlIGV4aXN0aW5nIHJhdyBjb250YWN0IHRvIGJlIHVwZGF0ZWQKICAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIENvbnRhY3RPcGVyYXRpb25zCiAgICAgICovCi0gICAgcHVibGljIENvbnRhY3RPcGVyYXRpb25zIHVwZGF0ZUVtYWlsKFN0cmluZyBlbWFpbCwgU3RyaW5nIGV4aXN0aW5nRW1haWwsCi0gICAgICAgIFVyaSB1cmkpIHsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlRW1haWwoU3RyaW5nIGVtYWlsLCBTdHJpbmcgZXhpc3RpbmdFbWFpbCwgVXJpIHVyaSkgewogICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoZXhpc3RpbmdFbWFpbCwgZW1haWwpKSB7CiAgICAgICAgICAgICBtVmFsdWVzLmNsZWFyKCk7CiAgICAgICAgICAgICBtVmFsdWVzLnB1dChFbWFpbC5EQVRBLCBlbWFpbCk7CkBAIC0yMDcsMTAgKzIxMSwxMSBAQAogICAgICAqIEBwYXJhbSB1cmkgVXJpIGZvciB0aGUgZXhpc3RpbmcgcmF3IGNvbnRhY3QgdG8gYmUgdXBkYXRlZAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlTmFtZShVcmkgdXJpLCBTdHJpbmcgZXhpc3RpbmdGaXJzdE5hbWUsCi0gICAgICAgIFN0cmluZyBleGlzdGluZ0xhc3ROYW1lLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKLSAgICAgICAgTG9nLmkoIkNvbnRhY3RPcGVyYXRpb25zIiwgImVmPSIgKyBleGlzdGluZ0ZpcnN0TmFtZSArICJlbD0iCi0gICAgICAgICAgICArIGV4aXN0aW5nTGFzdE5hbWUgKyAiZj0iICsgZmlyc3ROYW1lICsgImw9IiArIGxhc3ROYW1lKTsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlTmFtZShVcmkgdXJpLCBTdHJpbmcgZXhpc3RpbmdGaXJzdE5hbWUsIFN0cmluZyBleGlzdGluZ0xhc3ROYW1lLAorICAgICAgICBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKKworICAgICAgICBMb2cuaSgiQ29udGFjdE9wZXJhdGlvbnMiLCAiZWY9IiArIGV4aXN0aW5nRmlyc3ROYW1lICsgImVsPSIgKyBleGlzdGluZ0xhc3ROYW1lICsgImY9IgorICAgICAgICAgICAgKyBmaXJzdE5hbWUgKyAibD0iICsgbGFzdE5hbWUpOwogICAgICAgICBtVmFsdWVzLmNsZWFyKCk7CiAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhleGlzdGluZ0ZpcnN0TmFtZSwgZmlyc3ROYW1lKSkgewogICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgZmlyc3ROYW1lKTsKQEAgLTIzMiw4ICsyMzcsNyBAQAogICAgICAqIEBwYXJhbSB1cmkgVXJpIGZvciB0aGUgZXhpc3RpbmcgcmF3IGNvbnRhY3QgdG8gYmUgdXBkYXRlZAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlUGhvbmUoU3RyaW5nIGV4aXN0aW5nTnVtYmVyLCBTdHJpbmcgcGhvbmUsCi0gICAgICAgIFVyaSB1cmkpIHsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlUGhvbmUoU3RyaW5nIGV4aXN0aW5nTnVtYmVyLCBTdHJpbmcgcGhvbmUsIFVyaSB1cmkpIHsKICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKHBob25lLCBleGlzdGluZ051bWJlcikpIHsKICAgICAgICAgICAgIG1WYWx1ZXMuY2xlYXIoKTsKICAgICAgICAgICAgIG1WYWx1ZXMucHV0KFBob25lLk5VTUJFUiwgcGhvbmUpOwpAQCAtMjYwLDE2ICsyNjQsMTQgQEAKICAgICAgKiBBZGRzIGFuIGluc2VydCBvcGVyYXRpb24gaW50byB0aGUgYmF0Y2gKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYWRkSW5zZXJ0T3AoKSB7CisKICAgICAgICAgaWYgKCFtSXNOZXdDb250YWN0KSB7CiAgICAgICAgICAgICBtVmFsdWVzLnB1dChQaG9uZS5SQVdfQ09OVEFDVF9JRCwgbVJhd0NvbnRhY3RJZCk7CiAgICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIgPQotICAgICAgICAgICAgbmV3SW5zZXJ0Q3BvKGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIoRGF0YS5DT05URU5UX1VSSSksCi0gICAgICAgICAgICAgICAgbVlpZWxkKTsKKyAgICAgICAgbUJ1aWxkZXIgPSBuZXdJbnNlcnRDcG8oYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcihEYXRhLkNPTlRFTlRfVVJJKSwgbVlpZWxkKTsKICAgICAgICAgbUJ1aWxkZXIud2l0aFZhbHVlcyhtVmFsdWVzKTsKICAgICAgICAgaWYgKG1Jc05ld0NvbnRhY3QpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyCi0gICAgICAgICAgICAgICAgLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRGF0YS5SQVdfQ09OVEFDVF9JRCwgbUJhY2tSZWZlcmVuY2UpOworICAgICAgICAgICAgbUJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShEYXRhLlJBV19DT05UQUNUX0lELCBtQmFja1JlZmVyZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgbVlpZWxkID0gZmFsc2U7CiAgICAgICAgIG1CYXRjaE9wZXJhdGlvbi5hZGQobUJ1aWxkZXIuYnVpbGQoKSk7CkBAIC0yODQsMjggKzI4NiwyMyBAQAogICAgICAgICBtQmF0Y2hPcGVyYXRpb24uYWRkKG1CdWlsZGVyLmJ1aWxkKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3SW5zZXJ0Q3BvKFVyaSB1cmksCi0gICAgICAgIGJvb2xlYW4geWllbGQpIHsKLSAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoCi0gICAgICAgICAgICBhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3SW5zZXJ0Q3BvKFVyaSB1cmksIGJvb2xlYW4geWllbGQpIHsKKyAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcih1cmkpKQorICAgICAgICAgICAgLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3VXBkYXRlQ3BvKFVyaSB1cmksCi0gICAgICAgIGJvb2xlYW4geWllbGQpIHsKLSAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdVcGRhdGUoCi0gICAgICAgICAgICBhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3VXBkYXRlQ3BvKFVyaSB1cmksIGJvb2xlYW4geWllbGQpIHsKKyAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdVcGRhdGUoYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcih1cmkpKQorICAgICAgICAgICAgLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3RGVsZXRlQ3BvKFVyaSB1cmksCi0gICAgICAgIGJvb2xlYW4geWllbGQpIHsKLSAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdEZWxldGUoCi0gICAgICAgICAgICBhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOwotCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdEZWxldGVDcG8oVXJpIHVyaSwgYm9vbGVhbiB5aWVsZCkgeworICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0RlbGV0ZShhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpCisgICAgICAgICAgICAud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgVXJpIGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIoVXJpIHVyaSkgewotICAgICAgICByZXR1cm4gdXJpLmJ1aWxkVXBvbigpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKAotICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5DQUxMRVJfSVNfU1lOQ0FEQVBURVIsICJ0cnVlIikuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIHVyaS5idWlsZFVwb24oKS5hcHBlbmRRdWVyeVBhcmFtZXRlcihDb250YWN0c0NvbnRyYWN0LkNBTExFUl9JU19TWU5DQURBUFRFUiwgInRydWUiKQorICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLmphdmEKaW5kZXggYmMwMjMyNS4uN2I2MGQ1YiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL1NhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9TYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuamF2YQpAQCAtMjAsNyArMjAsMTEgQEAKIC8qCiAgKiBUaGUgc3RhbmRhcmQgY29sdW1ucyByZXByZXNlbnRpbmcgY29udGFjdCdzIGluZm8gZnJvbSBzb2NpYWwgYXBwcy4KICAqLwotcHVibGljIGludGVyZmFjZSBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMgeworcHVibGljIGZpbmFsIGNsYXNzIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucyB7CisKKyAgICBwcml2YXRlIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucygpIHsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBNSU1FLXR5cGUgdXNlZCB3aGVuIHN0b3JpbmcgYSBwcm9maWxlIHtAbGluayBEYXRhfSBlbnRyeS4KICAgICAgKi8KQEAgLTI4LDcgKzMyLDggQEAKICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5zYW1wbGVzeW5jYWRhcHRlci5wcm9maWxlIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUElEID0gRGF0YS5EQVRBMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1NVTU1BUlkgPSBEYXRhLkRBVEEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfREVUQUlMID0gRGF0YS5EQVRBMzsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU1VNTUFSWSA9IERhdGEuREFUQTI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0RFVEFJTCA9IERhdGEuREFUQTM7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY0FkYXB0ZXIuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhCmluZGV4IDA3NTI1YWEuLjIwNjE4OWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuc3luY2FkYXB0ZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CkBAIC00Niw5ICs0NSwxMSBAQAogICogcGxhdGZvcm0gQ29udGFjdE9wZXJhdGlvbnMgcHJvdmlkZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBTeW5jQWRhcHRlciBleHRlbmRzIEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlciB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5bmNBZGFwdGVyIjsKIAogICAgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgbUFjY291bnRNYW5hZ2VyOworCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSBEYXRlIG1MYXN0VXBkYXRlZDsKQEAgLTYyLDE4ICs2MywxNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUGVyZm9ybVN5bmMoQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgZXh0cmFzLCBTdHJpbmcgYXV0aG9yaXR5LAogICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIFN5bmNSZXN1bHQgc3luY1Jlc3VsdCkgeworCiAgICAgICAgIExpc3Q8VXNlcj4gdXNlcnM7CiAgICAgICAgIExpc3Q8U3RhdHVzPiBzdGF0dXNlczsKICAgICAgICAgU3RyaW5nIGF1dGh0b2tlbiA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIC8vIHVzZSB0aGUgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgdGhlIGNyZWRlbnRpYWxzCi0gICAgICAgICAgICAgYXV0aHRva2VuID0KLSAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuYmxvY2tpbmdHZXRBdXRoVG9rZW4oYWNjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFLCB0cnVlIC8qIG5vdGlmeUF1dGhGYWlsdXJlICovKTsKLSAgICAgICAgICAgICAvLyBmZXRjaCB1cGRhdGVzIGZyb20gdGhlIHNhbXBsZSBzZXJ2aWNlIG92ZXIgdGhlIGNsb3VkCi0gICAgICAgICAgICAgdXNlcnMgPQotICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsaXRpZXMuZmV0Y2hGcmllbmRVcGRhdGVzKGFjY291bnQsIGF1dGh0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgdGhlIGNyZWRlbnRpYWxzCisgICAgICAgICAgICBhdXRodG9rZW4gPQorICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAuYmxvY2tpbmdHZXRBdXRoVG9rZW4oYWNjb3VudCwgQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFLCB0cnVlIC8qIG5vdGlmeUF1dGhGYWlsdXJlICovKTsKKyAgICAgICAgICAgIC8vIGZldGNoIHVwZGF0ZXMgZnJvbSB0aGUgc2FtcGxlIHNlcnZpY2Ugb3ZlciB0aGUgY2xvdWQKKyAgICAgICAgICAgIHVzZXJzID0gTmV0d29ya1V0aWxpdGllcy5mZXRjaEZyaWVuZFVwZGF0ZXMoYWNjb3VudCwgYXV0aHRva2VuLCBtTGFzdFVwZGF0ZWQpOwogICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBsYXN0IHN5bmNlZCBkYXRlLgogICAgICAgICAgICAgbUxhc3RVcGRhdGVkID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgIC8vIHVwZGF0ZSBwbGF0Zm9ybSBjb250YWN0cy4KQEAgLTkxLDggKzkxLDcgQEAKICAgICAgICAgICAgIExvZy5lKFRBRywgIklPRXhjZXB0aW9uIiwgZSk7CiAgICAgICAgICAgICBzeW5jUmVzdWx0LnN0YXRzLm51bUlvRXhjZXB0aW9ucysrOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaW52YWxpZGF0ZUF1dGhUb2tlbihDb25zdGFudHMuQUNDT1VOVF9UWVBFLAotICAgICAgICAgICAgICAgIGF1dGh0b2tlbik7CisgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaW52YWxpZGF0ZUF1dGhUb2tlbihDb25zdGFudHMuQUNDT1VOVF9UWVBFLCBhdXRodG9rZW4pOwogICAgICAgICAgICAgc3luY1Jlc3VsdC5zdGF0cy5udW1BdXRoRXhjZXB0aW9ucysrOwogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXV0aGVudGljYXRpb25FeGNlcHRpb24iLCBlKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3N5bmNhZGFwdGVyL1N5bmNTZXJ2aWNlLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YQppbmRleCAyNTZmOTFkLi41N2I3NzQ3IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLnN5bmNhZGFwdGVyOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKQEAgLTI2LDEyICsyNSwxMSBAQAogICogSUJpbmRlci4KICAqLwogcHVibGljIGNsYXNzIFN5bmNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1N5bmNBZGFwdGVyTG9jayA9IG5ldyBPYmplY3QoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIFN5bmNBZGFwdGVyIHNTeW5jQWRhcHRlciA9IG51bGw7CiAKLSAgICAvKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzU3luY0FkYXB0ZXJMb2NrKSB7CkBAIC00MSw5ICszOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewogICAgICAgICByZXR1cm4gc1N5bmNBZGFwdGVyLmdldFN5bmNBZGFwdGVyQmluZGVyKCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQWxsVGVzdHMuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGYwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLlRlc3RTdWl0ZUJ1aWxkZXI7CisKKy8qKgorICogQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgYWxsIHRlc3RzIGZvciBTYW1wbGVTeW5jQWRhcHRlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlQnVpbGRlcihBbGxUZXN0cy5jbGFzcykuaW5jbHVkZUFsbFBhY2thZ2VzVW5kZXJIZXJlKCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0LmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNmZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JBY3Rpdml0eVRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogVGhpcyBpcyBhIHNlcmllcyBvZiB1bml0IHRlc3RzIGZvciB0aGUge0BsaW5rIEF1dGhlbnRpY2F0b3JBY3Rpdml0eX0gY2xhc3MuCisgKi8KK0BTbWFsbFRlc3QKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0cyBleHRlbmRzCisgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8QXV0aGVudGljYXRvckFjdGl2aXR5PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfV0FJVCA9IDEwMDAwOworCisgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHB1YmxpYyBBdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0cygpIHsKKworICAgICAgICBzdXBlcihBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1vbiBzZXR1cCBjb2RlIGZvciBhbGwgdGVzdHMuIFNldHMgdXAgYSBkZWZhdWx0IGxhdW5jaCBpbnRlbnQsIHdoaWNoCisgICAgICogc29tZSB0ZXN0cyB3aWxsIHVzZSAob3RoZXJzIHdpbGwgb3ZlcnJpZGUpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IHRoaXMuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1Db250ZXh0ID0gbUluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCBMb2dpbiBpcyBwcmVzZW50ZWQuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dpbk9mZmVyZWQoKSB7CisKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5TW9uaXRvciBtb25pdG9yID0KKyAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uYWRkTW9uaXRvcihBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7CisgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbUluc3RydW1lbnRhdGlvbi53YWl0Rm9yTW9uaXRvcldpdGhUaW1lb3V0KG1vbml0b3IsIEFDVElWSVRZX1dBSVQpOworICAgICAgICBWaWV3IGxvZ2luYnV0dG9uID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQub2tfYnV0dG9uKTsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gVmlldy5WSVNJQkxFOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGxvZ2luYnV0dG9uLmdldFZpc2liaWxpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyVGVzdC5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjIzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L1VzZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuY2xpZW50OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmNsaWVudC5Vc2VyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKKworcHVibGljIGNsYXNzIFVzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVc2VyIHVzZXIgPQorICAgICAgICAgICAgbmV3IFVzZXIoIm1qb3NoaSIsICJNZWdoYSIsICJKb3NoaSIsICIxLTY1MC0zMzUtNTY4MSIsICIxLTY1MC0xMTEtNTY4MSIsCisgICAgICAgICAgICAgICAgIjEtNjUwLTIyMi01NjgxIiwgInRlc3RAZ29vZ2xlLmNvbSIsIGZhbHNlLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZWdoYSIsIHVzZXIuZ2V0Rmlyc3ROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvc2hpIiwgdXNlci5nZXRMYXN0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtam9zaGkiLCB1c2VyLmdldFVzZXJOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlci5nZXRVc2VySWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS02NTAtMzM1LTU2ODEiLCB1c2VyLmdldENlbGxQaG9uZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB1c2VyLmlzRGVsZXRlZCgpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICAgICAganNvbk9iai5wdXQoInUiLCAibWpvc2hpIik7CisgICAgICAgIGpzb25PYmoucHV0KCJmIiwgIk1lZ2hhIik7CisgICAgICAgIGpzb25PYmoucHV0KCJsIiwgIkpvc2hpIik7CisgICAgICAgIGpzb25PYmoucHV0KCJpIiwgMSk7CisgICAgICAgIFVzZXIgdXNlciA9IFVzZXIudmFsdWVPZihqc29uT2JqKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZWdoYSIsIHVzZXIuZ2V0Rmlyc3ROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvc2hpIiwgdXNlci5nZXRMYXN0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtam9zaGkiLCB1c2VyLmdldFVzZXJOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlci5nZXRVc2VySWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9BbmRyb2lkLm1rIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTMzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gc2FtcGxlcworCisjIE9ubHkgY29tcGlsZSBzb3VyY2UgamF2YSBmaWxlcyBpbiB0aGlzIGFway4KK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFhtbEFkYXB0ZXJzU2FtcGxlCisKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgVXNlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZSB0byBtYWtlIG91ciB0ZXN0IGFway4KK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFjNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnMiPgorICAgIAorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iOCIgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDb250YWN0c0xpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY29udGFjdHNfbGlzdF9hY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUGhvdG9zTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9waG90b3NfbGlzdF9hY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNzUmVhZGVyQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Jzc19yZWFkZXJfYWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJ4bWxkb2N1bWVudCIgLz4KKworICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTM2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL19pbmRleC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxwPlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFhNTCBhZGFwdGVycy48L3A+CisKKzxwPkFuIFhNTCBBZGFwdGVyIGlzIGFuIFhNTCBmaWxlIHdoaWNoIGRlZmluZXMgdGhlIGJpbmRpbmdzIGJldHdlZW4gdGhlIGRhdGEKK3JldHJpZXZlZCBmcm9tIGEKKzxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmh0bWwiPjxjb2RlPkNvbnRlbnRQcm92aWRlcjwvY29kZT48L2E+CithbmQgdGhlIGRpZmZlcmVudCB2aWV3cyBvZiBhIGxheW91dC4gVGhleSBhcmUgcHJvdmlkZWQgYnkgdGhlCis8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuaHRtbCI+PGNvZGU+QWRhcHRlcnM8L2NvZGU+PC9hPgorY2xhc3MuPC9wPgorCitUaHJlZSBsaXN0IGFjdGl2aXRpZXMgYXJlIHByb3ZpZGVkIHdoaWNoIGlsbHVzdHJhdGUgdGhpczoKKzx1bD4KKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RzTGlzdEFjdGl2aXR5Lmh0bWwiPjxzdHJvbmc+CisgIENvbnRhY3RzTGlzdEFjdGl2aXR5PC9zdHJvbmc+PC9hPiB1c2VzIHRoZSBkZXZpY2UncyBDb250YWN0cyBwcm92aWRlciBhcyBpdHMgaW5wdXQgc291cmNlLgorICBDb250YWN0cyB3aXRoIGEgcGhvbmUgbnVtYmVyIGFyZSBkaXNwbGF5ZWQsIHRoZWlyIHBob3RvIGJlaW5nIHJldHJpZXZlZCBieSBhIGRlZGljYXRlZAorICA8YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuaHRtbCI+PGNvZGU+Q29udGFjdFBob3RvQmluZGVyCisgIDwvY29kZT48L2E+LjwvbGk+CisKKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Bob3Rvc0xpc3RBY3Rpdml0eS5odG1sIj48c3Ryb25nPgorICBQaG90b3NMaXN0QWN0aXZpdHk8L3N0cm9uZz48L2E+IHJldHJpZXZlcyBhbiBSU1MgcGhvdG8gZmVlZCBhbmQgZGlzcGxheXMgdGhlIGltYWdlcyBhbmQgdGhlaXIKKyAgdGl0bGVzLiBUaGUgaW1hZ2VzIGFyZSBkb3dubG9hZGVkIGZyb20gdGhlIFVSTCBmb3VuZCBpbiB0aGUgZmVlZCB1c2luZyB0aGUKKyAgPGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvSW1hZ2VEb3dubG9hZGVyLmh0bWwiPjxjb2RlPkltYWdlRG93bmxvYWRlcjwvY29kZT4KKyAgPC9hPiBoZWxwZXIgY2xhc3MuPC9saT4KKworICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUnNzUmVhZGVyQWN0aXZpdHkuaHRtbCI+PHN0cm9uZz4KKyAgUnNzUmVhZGVyQWN0aXZpdHk8L3N0cm9uZz48L2E+IGFsc28gZGlzcGxheXMgaXRlbXMgZXh0cmFjdGVkIGZyb20gYW4gUlNTIGZlZWQuIEFuIGFkZGl0aW9uYWwKKyAgPGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW50ZW50TGlzdGVuZXIuaHRtbCI+PGNvZGU+VXJsSW50ZW50TGlzdGVuZXIKKyAgPC9jb2RlPjwvYT4gaXMgdXNlZCB0byBvcGVuIGEgYnJvd3NlciB3aGVuIG9uZSBvZiB0aGUgbmV3cyBpdGVtIGlzIHRhcHBlZC48L2xpPgorPC91bD4KKworPGltZyBhbHQ9IlhtbFBob3Rvc0FkYXB0ZXIiIHNyYz0iLi4vaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nIiAvPgorPGltZyBhbHQ9IlhtbFJzc1JlYWRlciIgc3JjPSIuLi9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZyIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA1NjVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvZHJhd2FibGUtaGRwaS9pY19jb250YWN0X3BpY3R1cmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0X2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L2NvbnRhY3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYjEwOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPiAgICAKKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvY29udGFjdHNfbGlzdC54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvY29udGFjdHNfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZmU0YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0c19saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIAorPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8TGlzdFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDphZGFwdGVyPSJAeG1sL2NvbnRhY3RzIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvZW1wdHkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25vX2NvbnRhY3RzIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisKKzwvbWVyZ2U+ICAgIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3RvX2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3RvX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGIxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcGhvdG9faXRlbS54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Bob3RvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcGhvdG9zX2xpc3QueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3Rvc19saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU2ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3Rvc19saXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8TGlzdFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvZW1wdHkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25vX3Bob3RvcyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkX2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzVhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcnNzX2ZlZWRfaXRlbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvaXRlbV9sYXlvdXQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCI+CisKKyAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW1hZ2UiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIgLz4KKworICAgICAgIDxUZXh0VmlldworICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rlc2NyaXB0aW9uIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkc19saXN0LnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZHNfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MWRjZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZHNfbGlzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZXJnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ub19yc3NfZmVlZCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTE1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSQorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5YbWwgQWRhcHRlcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3RzX2xpc3RfYWN0aXZpdHkiPlhtbCBDb250YWN0cyBBZGFwdGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwaG90b3NfbGlzdF9hY3Rpdml0eSI+WG1sIFBob3RvcyBBZGFwdGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyc3NfcmVhZGVyX2FjdGl2aXR5Ij5YbWwgUlNTIFJlYWRlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fY29udGFjdHMiPk5vIGNvbnRhY3RzIGF2YWlsYWJsZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fcGhvdG9zIj5Mb2FkaW5nIHBob3Rvcy4uLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fcnNzX2ZlZWQiPkxvYWRpbmcgUlNTIGZlZWQuLi48L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvY29udGFjdHMueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMveG1sL2NvbnRhY3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNmYmNhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMveG1sL2NvbnRhY3RzLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGN1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAgYW5kcm9pZDpzZWxlY3Rpb249Imhhc19waG9uZV9udW1iZXI9MSIKKyAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvY29udGFjdF9pdGVtIj4KKworICA8YmluZCBhbmRyb2lkOmZyb209ImRpc3BsYXlfbmFtZSIgYW5kcm9pZDp0bz0iQGlkL25hbWUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209InN0YXJyZWQiIGFuZHJvaWQ6dG89IkBpZC9zdGFyIiBhbmRyb2lkOmFzPSJkcmF3YWJsZSI+CisgICAgICAgIDxtYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjAiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb2ZmIiAvPgorICAgICAgICA8bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIxIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29uIiAvPgorICAgIDwvYmluZD4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Il9pZCIgYW5kcm9pZDp0bz0iQGlkL25hbWUiCisgICAgICAgICAgYW5kcm9pZDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcGhvdG9zLnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3htbC9waG90b3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcGhvdG9zLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGN1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOnNlbGVjdGlvbj0iL2ZlZWQvZW50cnkiCisgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvcGhvdG9faXRlbSI+CisKKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9zdW1tYXJ5IiBhbmRyb2lkOnRvPSJAaWQvdGl0bGUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9tZWRpYTpncm91cC9tZWRpYTp0aHVtYm5haWxcQHVybCIgYW5kcm9pZDp0bz0iQGlkL3Bob3RvIgorICAgICAgYW5kcm9pZDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5VcmxJbWFnZUJpbmRlciIgLz4KKworPC9jdXJzb3ItYWRhcHRlcj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3htbC9yc3NfZmVlZC54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcnNzX2ZlZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjA5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcnNzX2ZlZWQueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y3Vyc29yLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6c2VsZWN0aW9uPSIvcnNzL2NoYW5uZWwvaXRlbSIKKyAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9yc3NfZmVlZF9pdGVtIj4KKworICAgIDxiaW5kIGFuZHJvaWQ6ZnJvbT0iL3RpdGxlIiBhbmRyb2lkOnRvPSJAaWQvdGl0bGUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9tZWRpYTpjb250ZW50QHVybCIgYW5kcm9pZDp0bz0iQGlkL2ltYWdlIgorICAgICAgYW5kcm9pZDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5VcmxJbWFnZUJpbmRlciIvPgorICAgIDxiaW5kIGFuZHJvaWQ6ZnJvbT0iL21lZGlhOmRlc2NyaXB0aW9uIiBhbmRyb2lkOnRvPSJAaWQvZGVzY3JpcHRpb24iIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9ndWlkIiBhbmRyb2lkOnRvPSJAaWQvaXRlbV9sYXlvdXQiIGFuZHJvaWQ6YXM9InRhZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9wdWJEYXRlIiBhbmRyb2lkOnRvPSJAaWQvZGF0ZSIgYW5kcm9pZDphcz0ic3RyaW5nIj4KKyAgICAgICA8dHJhbnNmb3JtIGFuZHJvaWQ6d2l0aEV4cHJlc3Npb249IlB1Ymxpc2hlZCBvbiB7L3B1YkRhdGV9LiIgLz4KKyAgICA8L2JpbmQ+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RQaG90b0JpbmRlci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ1NTZmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogVGhpcyBjdXN0b20gY3Vyc29yIGJpbmRlciBpcyB1c2VkIGJ5IHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gcmVzL3htbCB0bworICogYmluZCBjb250YWN0cyBwaG90b3MgdG8gdGhlaXIgcmVzcGVjdGl2ZSBsaXN0IGl0ZW0uIFRoaXMgYmluZGVyIHNpbXBseQorICogcXVlcmllcyBhIGNvbnRhY3QncyBwaG90byBiYXNlZCBvbiB0aGUgY29udGFjdCdzIGlkIGFuZCBzZXRzIHRoZQorICogcGhvdG8gYXMgYSBjb21wb3VuZCBkcmF3YWJsZSBvbiB0aGUgVGV4dFZpZXcgdXNlZCB0byBkaXNwbGF5IHRoZSBjb250YWN0J3MKKyAqIG5hbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWN0UGhvdG9CaW5kZXIgZXh0ZW5kcyBBZGFwdGVycy5DdXJzb3JCaW5kZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSE9UT19TSVpFX0RJUCA9IDU0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPExvbmcsIERyYXdhYmxlPiBtQ2FjaGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGhvdG9TaXplOworCisgICAgcHVibGljIENvbnRhY3RQaG90b0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKworICAgICAgICBtUmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIC8vIERlZmF1bHQgcGljdHVyZSB1c2VkIHdoZW4gYSBjb250YWN0IGRvZXMgbm90IHByb3ZpZGUgb25lCisgICAgICAgIG1EZWZhdWx0ID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIC8vIENhY2hlIHVzZWQgdG8gYXZvaWQgcmUtcXVlcnlpbmcgY29udGFjdHMgcGhvdG9zIGV2ZXJ5IHRpbWUKKyAgICAgICAgbUNhY2hlID0gbmV3IEhhc2hNYXA8TG9uZywgRHJhd2FibGU+KCk7CisgICAgICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHBob3RvIGJhc2VkIG9uIHRoZSBkaXNwbGF5J3MgZGVuc2l0eQorICAgICAgICBtUGhvdG9TaXplID0gKGludCkgKFBIT1RPX1NJWkVfRElQICogbVJlc291cmNlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKyAwLjVmKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCk7CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBjYWNoZWQgdGhlIGNvbnRhY3QncyBwaG90bworICAgICAgICBEcmF3YWJsZSBkID0gbUNhY2hlLmdldChpZCk7CisgICAgICAgIAorICAgICAgICBpZiAoZCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcGhvdG8gd2Fzbid0IGluIHRoZSBjYWNoZSwgYXNrIHRoZSBjb250YWN0cyBwcm92aWRlciBmb3IKKyAgICAgICAgICAgIC8vIGFuIGlucHV0IHN0cmVhbSB3ZSBjYW4gdXNlIHRvIGxvYWQgdGhlIHBob3RvCisgICAgICAgICAgICBVcmkgdXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5DT05URU5UX1VSSSwgaWQpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5vcGVuQ29udGFjdFBob3RvSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCB1cmkpOworICAgIAorICAgICAgICAgICAgLy8gQ3JlYXRlcyB0aGUgZHJhd2FibGUgZm9yIHRoZSBjb250YWN0J3MgcGhvdG8gb3IgdXNlIG91ciBmYWxsYmFjayBkcmF3YWJsZQorICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gZGVjb2RpbmcgdGhlIGJpdG1hcCBjb3VsZCBiZSBkb25lIGluIGEgd29ya2VyIHRocmVhZCB0b28uCisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgZCA9IG5ldyBCaXRtYXBEcmF3YWJsZShtUmVzb3VyY2VzLCBiaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkID0gbURlZmF1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGQuc2V0Qm91bmRzKDAsIDAsIG1QaG90b1NpemUsIG1QaG90b1NpemUpOworICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0Q29tcG91bmREcmF3YWJsZXMoZCwgbnVsbCwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBwaG90byBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250YWN0CisgICAgICAgICAgICBtQ2FjaGUucHV0KGlkLCBkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldENvbXBvdW5kRHJhd2FibGVzKGQsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0c0xpc3RBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0c0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWFiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RzTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBUaGlzIGFjdGl2aXR5IGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgY29tcGxleCBVSSB1c2luZyBhIExpc3RWaWV3CisgKiBhbmQgYW4gYWRhcHRlciBkZWZpbmVkIGluIFhNTC4KKyAqIAorICogVGhlIGZvbGxvd2luZyBhY3Rpdml0eSBzaG93cyBhIGxpc3Qgb2YgY29udGFjdHMsIHRoZWlyIHN0YXJyZWQgc3RhdHVzCisgKiBhbmQgdGhlaXIgcGhvdG9zLCB1c2luZyB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHJlcy94bWwuCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWN0c0xpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jb250YWN0c19saXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0ltYWdlRG93bmxvYWRlci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9JbWFnZURvd25sb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRmOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9JbWFnZURvd25sb2FkZXIuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGhlbHBlciBjbGFzcyBkb3dubG9hZCBpbWFnZXMgZnJvbSB0aGUgSW50ZXJuZXQgYW5kIGJpbmRzIHRob3NlIHdpdGggdGhlIHByb3ZpZGVkIEltYWdlVmlldy4KKyAqCisgKiA8cD5JdCByZXF1aXJlcyB0aGUgSU5URVJORVQgcGVybWlzc2lvbiwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHlvdXIgYXBwbGljYXRpb24ncyBtYW5pZmVzdAorICogZmlsZS48L3A+CisgKgorICogQSBsb2NhbCBjYWNoZSBvZiBkb3dubG9hZGVkIGltYWdlcyBpcyBtYWludGFpbmVkIGludGVybmFsbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqLworcHVibGljIGNsYXNzIEltYWdlRG93bmxvYWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSW1hZ2VEb3dubG9hZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVJEX0NBQ0hFX0NBUEFDSVRZID0gNDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX0JFRk9SRV9QVVJHRSA9IDMwICogMTAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzCisKKyAgICAvLyBIYXJkIGNhY2hlLCB3aXRoIGEgZml4ZWQgbWF4aW11bSBjYXBhY2l0eSBhbmQgYSBsaWZlIGR1cmF0aW9uCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQml0bWFwPiBzSGFyZEJpdG1hcENhY2hlID0KKyAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBCaXRtYXA+KEhBUkRfQ0FDSEVfQ0FQQUNJVFkgLyAyLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTGlua2VkSGFzaE1hcC5FbnRyeTxTdHJpbmcsIEJpdG1hcD4gZWxkZXN0KSB7CisgICAgICAgICAgICBpZiAoc2l6ZSgpID4gSEFSRF9DQUNIRV9DQVBBQ0lUWSkgeworICAgICAgICAgICAgICAgIC8vIEVudHJpZXMgcHVzaC1vdXQgb2YgaGFyZCByZWZlcmVuY2UgY2FjaGUgYXJlIHRyYW5zZmVycmVkIHRvIHNvZnQgcmVmZXJlbmNlIGNhY2hlCisgICAgICAgICAgICAgICAgc1NvZnRCaXRtYXBDYWNoZS5wdXQoZWxkZXN0LmdldEtleSgpLCBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGVsZGVzdC5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gU29mdCBjYWNoZSBmb3IgYml0bWFwIGtpY2tlZCBvdXQgb2YgaGFyZCBjYWNoZQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU29mdFJlZmVyZW5jZTxCaXRtYXA+PiBzU29mdEJpdG1hcENhY2hlID0KKyAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU29mdFJlZmVyZW5jZTxCaXRtYXA+PihIQVJEX0NBQ0hFX0NBUEFDSVRZIC8gMik7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgcHVyZ2VIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgcHVyZ2VyID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjbGVhckNhY2hlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogRG93bmxvYWQgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSBJbnRlcm5ldCBhbmQgYmluZHMgaXQgdG8gdGhlIHByb3ZpZGVkIEltYWdlVmlldy4gVGhlCisgICAgICogYmluZGluZyBpcyBpbW1lZGlhdGUgaWYgdGhlIGltYWdlIGlzIGZvdW5kIGluIHRoZSBjYWNoZSBhbmQgd2lsbCBiZSBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICogb3RoZXJ3aXNlLiBBIG51bGwgYml0bWFwIHdpbGwgYmUgYXNzb2NpYXRlZCB0byB0aGUgSW1hZ2VWaWV3IGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gZG93bmxvYWQuCisgICAgICogQHBhcmFtIGltYWdlVmlldyBUaGUgSW1hZ2VWaWV3IHRvIGJpbmQgdGhlIGRvd25sb2FkZWQgaW1hZ2UgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBkb3dubG9hZCh1cmwsIGltYWdlVmlldywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI2Rvd25sb2FkKFN0cmluZywgSW1hZ2VWaWV3KX0sIHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbAorICAgICAqIGNvb2tpZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBpbWFnZSB3aWxsIGJlIHJldHJpZXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gZG93bmxvYWQuCisgICAgICogQHBhcmFtIGltYWdlVmlldyBUaGUgSW1hZ2VWaWV3IHRvIGJpbmQgdGhlIGRvd25sb2FkZWQgaW1hZ2UgdG8uCisgICAgICogQHBhcmFtIGNvb2tpZSBBIGNvb2tpZSBTdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGh0dHAgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb3dubG9hZChTdHJpbmcgdXJsLCBJbWFnZVZpZXcgaW1hZ2VWaWV3LCBTdHJpbmcgY29va2llKSB7CisgICAgICAgIHJlc2V0UHVyZ2VUaW1lcigpOworICAgICAgICBCaXRtYXAgYml0bWFwID0gZ2V0Qml0bWFwRnJvbUNhY2hlKHVybCk7CisKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3JjZURvd25sb2FkKHVybCwgaW1hZ2VWaWV3LCBjb29raWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FuY2VsUG90ZW50aWFsRG93bmxvYWQodXJsLCBpbWFnZVZpZXcpOworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNhbWUgYXMgZG93bmxvYWQgYnV0IHRoZSBpbWFnZSBpcyBhbHdheXMgZG93bmxvYWRlZCBhbmQgdGhlIGNhY2hlIGlzIG5vdCB1c2VkLgorICAgICAqIEtlcHQgcHJpdmF0ZSBhdCB0aGUgbW9tZW50IGFzIGl0cyBpbnRlcmVzdCBpcyBub3QgY2xlYXIuCisgICAgICAgcHJpdmF0ZSB2b2lkIGZvcmNlRG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IHZpZXcpIHsKKyAgICAgICAgICBmb3JjZURvd25sb2FkKHVybCwgdmlldywgbnVsbCk7CisgICAgICAgfQorICAgICAqLworCisgICAgLyoqCisgICAgICogU2FtZSBhcyBkb3dubG9hZCBidXQgdGhlIGltYWdlIGlzIGFsd2F5cyBkb3dubG9hZGVkIGFuZCB0aGUgY2FjaGUgaXMgbm90IHVzZWQuCisgICAgICogS2VwdCBwcml2YXRlIGF0IHRoZSBtb21lbnQgYXMgaXRzIGludGVyZXN0IGlzIG5vdCBjbGVhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9yY2VEb3dubG9hZChTdHJpbmcgdXJsLCBJbWFnZVZpZXcgaW1hZ2VWaWV3LCBTdHJpbmcgY29va2llKSB7CisgICAgICAgIC8vIFN0YXRlIHNhbml0eTogdXJsIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbCBpbiBEb3dubG9hZGVkRHJhd2FibGUgYW5kIGNhY2hlIGtleXMuCisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlRHJhd2FibGUobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FuY2VsUG90ZW50aWFsRG93bmxvYWQodXJsLCBpbWFnZVZpZXcpKSB7CisgICAgICAgICAgICBCaXRtYXBEb3dubG9hZGVyVGFzayB0YXNrID0gbmV3IEJpdG1hcERvd25sb2FkZXJUYXNrKGltYWdlVmlldyk7CisgICAgICAgICAgICBEb3dubG9hZGVkRHJhd2FibGUgZG93bmxvYWRlZERyYXdhYmxlID0gbmV3IERvd25sb2FkZWREcmF3YWJsZSh0YXNrKTsKKyAgICAgICAgICAgIGltYWdlVmlldy5zZXRJbWFnZURyYXdhYmxlKGRvd25sb2FkZWREcmF3YWJsZSk7CisgICAgICAgICAgICB0YXNrLmV4ZWN1dGUodXJsLCBjb29raWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBpbWFnZSBjYWNoZSB1c2VkIGludGVybmFsbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gTm90ZSB0aGF0IGZvciBtZW1vcnkKKyAgICAgKiBlZmZpY2llbmN5IHJlYXNvbnMsIHRoZSBjYWNoZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBhIGNlcnRhaW4gaW5hY3Rpdml0eSBkZWxheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgeworICAgICAgICBzSGFyZEJpdG1hcENhY2hlLmNsZWFyKCk7CisgICAgICAgIHNTb2Z0Qml0bWFwQ2FjaGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRQdXJnZVRpbWVyKCkgeworICAgICAgICBwdXJnZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHB1cmdlcik7CisgICAgICAgIHB1cmdlSGFuZGxlci5wb3N0RGVsYXllZChwdXJnZXIsIERFTEFZX0JFRk9SRV9QVVJHRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGRvd25sb2FkIGhhcyBiZWVuIGNhbmNlbGVkIG9yIGlmIHRoZXJlIHdhcyBubyBkb3dubG9hZCBpbgorICAgICAqIHByb2dyZXNzIG9uIHRoaXMgaW1hZ2Ugdmlldy4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb3dubG9hZCBpbiBwcm9ncmVzcyBkZWFscyB3aXRoIHRoZSBzYW1lIHVybC4gVGhlIGRvd25sb2FkIGlzIG5vdAorICAgICAqIHN0b3BwZWQgaW4gdGhhdCBjYXNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuY2VsUG90ZW50aWFsRG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBCaXRtYXBEb3dubG9hZGVyVGFzayBiaXRtYXBEb3dubG9hZGVyVGFzayA9IGdldEJpdG1hcERvd25sb2FkZXJUYXNrKGltYWdlVmlldyk7CisKKyAgICAgICAgaWYgKGJpdG1hcERvd25sb2FkZXJUYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBiaXRtYXBVcmwgPSBiaXRtYXBEb3dubG9hZGVyVGFzay51cmw7CisgICAgICAgICAgICBpZiAoKGJpdG1hcFVybCA9PSBudWxsKSB8fCAoIWJpdG1hcFVybC5lcXVhbHModXJsKSkpIHsKKyAgICAgICAgICAgICAgICBiaXRtYXBEb3dubG9hZGVyVGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzYW1lIFVSTCBpcyBhbHJlYWR5IGJlaW5nIGRvd25sb2FkZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpbWFnZVZpZXcgQW55IGltYWdlVmlldworICAgICAqIEByZXR1cm4gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgZG93bmxvYWQgdGFzayAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbWFnZVZpZXcuCisgICAgICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRhc2suCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRG93bmxvYWRlclRhc2sgZ2V0Qml0bWFwRG93bmxvYWRlclRhc2soSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBpZiAoaW1hZ2VWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gaW1hZ2VWaWV3LmdldERyYXdhYmxlKCk7CisgICAgICAgICAgICBpZiAoZHJhd2FibGUgaW5zdGFuY2VvZiBEb3dubG9hZGVkRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICBEb3dubG9hZGVkRHJhd2FibGUgZG93bmxvYWRlZERyYXdhYmxlID0gKERvd25sb2FkZWREcmF3YWJsZSlkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG93bmxvYWRlZERyYXdhYmxlLmdldEJpdG1hcERvd25sb2FkZXJUYXNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIEByZXR1cm4gVGhlIGNhY2hlZCBiaXRtYXAgb3IgbnVsbCBpZiBpdCB3YXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgQml0bWFwIGdldEJpdG1hcEZyb21DYWNoZShTdHJpbmcgdXJsKSB7CisgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgaGFyZCByZWZlcmVuY2UgY2FjaGUKKyAgICAgICAgc3luY2hyb25pemVkIChzSGFyZEJpdG1hcENhY2hlKSB7CisgICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gc0hhcmRCaXRtYXBDYWNoZS5nZXQodXJsKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEJpdG1hcCBmb3VuZCBpbiBoYXJkIGNhY2hlCisgICAgICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50IHRvIGZpcnN0IHBvc2l0aW9uLCBzbyB0aGF0IGl0IGlzIHJlbW92ZWQgbGFzdAorICAgICAgICAgICAgICAgIHNIYXJkQml0bWFwQ2FjaGUucmVtb3ZlKHVybCk7CisgICAgICAgICAgICAgICAgc0hhcmRCaXRtYXBDYWNoZS5wdXQodXJsLCBiaXRtYXApOworICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVuIHRyeSB0aGUgc29mdCByZWZlcmVuY2UgY2FjaGUKKyAgICAgICAgU29mdFJlZmVyZW5jZTxCaXRtYXA+IGJpdG1hcFJlZmVyZW5jZSA9IHNTb2Z0Qml0bWFwQ2FjaGUuZ2V0KHVybCk7CisgICAgICAgIGlmIChiaXRtYXBSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IGJpdG1hcFJlZmVyZW5jZS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEJpdG1hcCBmb3VuZCBpbiBzb2Z0IGNhY2hlCisgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU29mdCByZWZlcmVuY2UgaGFzIGJlZW4gR2FyYmFnZSBDb2xsZWN0ZWQKKyAgICAgICAgICAgICAgICBzU29mdEJpdG1hcENhY2hlLnJlbW92ZSh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFjdHVhbCBBc3luY1Rhc2sgdGhhdCB3aWxsIGFzeW5jaHJvbm91c2x5IGRvd25sb2FkIHRoZSBpbWFnZS4KKyAgICAgKi8KKyAgICBjbGFzcyBCaXRtYXBEb3dubG9hZGVyVGFzayBleHRlbmRzIEFzeW5jVGFzazxTdHJpbmcsIFZvaWQsIEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU9fQlVGRkVSX1NJWkUgPSA0ICogMTAyNDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJsOworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SW1hZ2VWaWV3PiBpbWFnZVZpZXdSZWZlcmVuY2U7CisKKyAgICAgICAgcHVibGljIEJpdG1hcERvd25sb2FkZXJUYXNrKEltYWdlVmlldyBpbWFnZVZpZXcpIHsKKyAgICAgICAgICAgIGltYWdlVmlld1JlZmVyZW5jZSA9IG5ldyBXZWFrUmVmZXJlbmNlPEltYWdlVmlldz4oaW1hZ2VWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBY3R1YWwgZG93bmxvYWQgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoU3RyaW5nLi4uIHBhcmFtcykgeworICAgICAgICAgICAgZmluYWwgQW5kcm9pZEh0dHBDbGllbnQgY2xpZW50ID0gQW5kcm9pZEh0dHBDbGllbnQubmV3SW5zdGFuY2UoIkFuZHJvaWQiKTsKKyAgICAgICAgICAgIHVybCA9IHBhcmFtc1swXTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBHZXQgZ2V0UmVxdWVzdCA9IG5ldyBIdHRwR2V0KHVybCk7CisgICAgICAgICAgICBTdHJpbmcgY29va2llID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdC5zZXRIZWFkZXIoImNvb2tpZSIsIGNvb2tpZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoZ2V0UmVxdWVzdCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoIkltYWdlRG93bmxvYWRlciIsICJFcnJvciAiICsgc3RhdHVzQ29kZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGlsZSByZXRyaWV2aW5nIGJpdG1hcCBmcm9tICIgKyB1cmwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRhdGFTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGF0YVN0cmVhbSwgSU9fQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weShpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGRhdGFTdHJlYW0udG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIDogU2hvdWxkIHVzZSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpbnB1dFN0cmVhbSkgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluYWwgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGlucHV0U3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuY29uc3VtZUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkkvTyBlcnJvciB3aGlsZSByZXRyaWV2aW5nIGJpdG1hcCBmcm9tICIgKyB1cmwsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkluY29ycmVjdCBVUkw6ICIgKyB1cmwpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgYml0bWFwIGZyb20gIiArIHVybCwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmNlIHRoZSBpbWFnZSBpcyBkb3dubG9hZGVkLCBhc3NvY2lhdGVzIGl0IHRvIHRoZSBpbWFnZVZpZXcKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGJpdG1hcCB0byBjYWNoZQorICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzSGFyZEJpdG1hcENhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIHNIYXJkQml0bWFwQ2FjaGUucHV0KHVybCwgYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbWFnZVZpZXdSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZVZpZXcgPSBpbWFnZVZpZXdSZWZlcmVuY2UuZ2V0KCk7CisgICAgICAgICAgICAgICAgQml0bWFwRG93bmxvYWRlclRhc2sgYml0bWFwRG93bmxvYWRlclRhc2sgPSBnZXRCaXRtYXBEb3dubG9hZGVyVGFzayhpbWFnZVZpZXcpOworICAgICAgICAgICAgICAgIC8vIENoYW5nZSBiaXRtYXAgb25seSBpZiB0aGlzIHByb2Nlc3MgaXMgc3RpbGwgYXNzb2NpYXRlZCB3aXRoIGl0CisgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gYml0bWFwRG93bmxvYWRlclRhc2spIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbSU9fQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgaW50IHJlYWQ7CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpbi5yZWFkKGIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShiLCAwLCByZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmFrZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGltYWdlVmlldyB3aGlsZSB0aGUgZG93bmxvYWQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiA8cD5Db250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGRvd25sb2FkIHRhc2ssIHNvIHRoYXQgYSBkb3dubG9hZCB0YXNrIGNhbiBiZSBzdG9wcGVkCisgICAgICogaWYgYSBuZXcgYmluZGluZyBpcyByZXF1aXJlZCwgYW5kIG1ha2VzIHN1cmUgdGhhdCBvbmx5IHRoZSBsYXN0IHN0YXJ0ZWQgZG93bmxvYWQgcHJvY2VzcyBjYW4KKyAgICAgKiBiaW5kIGl0cyByZXN1bHQsIGluZGVwZW5kZW50bHkgb2YgdGhlIGRvd25sb2FkIGZpbmlzaCBvcmRlci48L3A+CisgICAgICovCisgICAgc3RhdGljIGNsYXNzIERvd25sb2FkZWREcmF3YWJsZSBleHRlbmRzIENvbG9yRHJhd2FibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Qml0bWFwRG93bmxvYWRlclRhc2s+IGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlOworCisgICAgICAgIHB1YmxpYyBEb3dubG9hZGVkRHJhd2FibGUoQml0bWFwRG93bmxvYWRlclRhc2sgYml0bWFwRG93bmxvYWRlclRhc2spIHsKKyAgICAgICAgICAgIHN1cGVyKENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgIGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlID0KKyAgICAgICAgICAgICAgICBuZXcgV2Vha1JlZmVyZW5jZTxCaXRtYXBEb3dubG9hZGVyVGFzaz4oYml0bWFwRG93bmxvYWRlclRhc2spOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpdG1hcERvd25sb2FkZXJUYXNrIGdldEJpdG1hcERvd25sb2FkZXJUYXNrKCkgeworICAgICAgICAgICAgcmV0dXJuIGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlLmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9QaG90b3NMaXN0QWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUGhvdG9zTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhMTUxZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUGhvdG9zTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnM7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSB1c2VzIGEgY3VzdG9tIGN1cnNvciBhZGFwdGVyIHdoaWNoIGZldGNoZXMgYSBYTUwgcGhvdG8gZmVlZCBhbmQgcGFyc2VzIHRoZSBYTUwgdG8KKyAqIGV4dHJhY3QgdGhlIGltYWdlcycgVVJMIGFuZCB0aGVpciB0aXRsZS4KKyAqLworcHVibGljIGNsYXNzIFBob3Rvc0xpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJQ0FTQV9GRUVEX1VSTCA9CisgICAgICAgICJodHRwOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS9mZWF0dXJlZD9tYXgtcmVzdWx0cz01MCZ0aHVtYnNpemU9MTQ0YyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucGhvdG9zX2xpc3QpOworICAgICAgICBzZXRMaXN0QWRhcHRlcihBZGFwdGVycy5sb2FkQ3Vyc29yQWRhcHRlcih0aGlzLCBSLnhtbC5waG90b3MsCisgICAgICAgICAgICAgICAgImNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/dXJsPSIgKyBVcmkuZW5jb2RlKFBJQ0FTQV9GRUVEX1VSTCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Jzc1JlYWRlckFjdGl2aXR5LmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Jzc1JlYWRlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZTRjMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUnNzUmVhZGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworCisvKioKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZSB0aGUgY3JlYXRpb24gb2YgYSBzaW1wbGUgUlNTIGZlZWQgcmVhZGVyIHVzaW5nIHRoZSBYTUwgYWRhcHRlciBzeW50YXguCisgKiBUaGUgZGlmZmVyZW50IGVsZW1lbnRzIG9mIHRoZSBmZWVkIGFyZSBleHRyYWN0ZWQgdXNpbmcgYW4ge0BsaW5rIFhtbERvY3VtZW50UHJvdmlkZXJ9IGFuZCBhcmUKKyAqIGJpbmRlZCB0byB0aGUgZGlmZmVyZW50IHZpZXdzLiBBbiB7QGxpbmsgT25JdGVtQ2xpY2tMaXN0ZW5lcn0gaXMgYWxzbyBhZGRlZCwgd2hpY2ggd2lsbCBvcGVuIGEKKyAqIGJyb3dzZXIgb24gdGhlIGFzc29jaWF0ZWQgbmV3cyBpdGVtIHBhZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBSc3NSZWFkZXJBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURfVVJJID0gImh0dHA6Ly9mZWVkcy5ueXRpbWVzLmNvbS9ueXQvcnNzL0hvbWVQYWdlIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yc3NfZmVlZHNfbGlzdCk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKEFkYXB0ZXJzLmxvYWRDdXJzb3JBZGFwdGVyKHRoaXMsIFIueG1sLnJzc19mZWVkLAorICAgICAgICAgICAgICAgICJjb250ZW50Oi8veG1sZG9jdW1lbnQvP3VybD0iICsgVXJpLmVuY29kZShGRUVEX1VSSSkpKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBVcmxJbnRlbnRMaXN0ZW5lcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEltYWdlQmluZGVyLmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEltYWdlQmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW1hZ2VCaW5kZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCisvKioKKyAqIFRoaXMgQ3Vyc29yQmluZGVyIGJpbmRzIHRoZSBwcm92aWRlZCBpbWFnZSBVUkwgdG8gYW4gSW1hZ2VWaWV3IGJ5IGRvd25sb2FkaW5nIHRoZSBpbWFnZSBmcm9tIHRoZQorICogSW50ZXJuZXQuCisgKi8KK3B1YmxpYyBjbGFzcyBVcmxJbWFnZUJpbmRlciBleHRlbmRzIEFkYXB0ZXJzLkN1cnNvckJpbmRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEltYWdlRG93bmxvYWRlciBpbWFnZURvd25sb2FkZXI7CisKKyAgICBwdWJsaWMgVXJsSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIGltYWdlRG93bmxvYWRlciA9IG5ldyBJbWFnZURvd25sb2FkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGltYWdlRG93bmxvYWRlci5kb3dubG9hZCh1cmwsIChJbWFnZVZpZXcpIHZpZXcpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9VcmxJbnRlbnRMaXN0ZW5lci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9VcmxJbnRlbnRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODE0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEludGVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CisKKy8qKgorICogQSBsaXN0ZW5lciB3aGljaCBleHBlY3RzIGEgVVJMIGFzIGEgdGFnIG9mIHRoZSB2aWV3IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSXQgdGhlbiBvcGVucyB0aGUgVVJMCisgKiBpbiB0aGUgYnJvd3NlciBhcHBsaWNhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFVybEludGVudExpc3RlbmVyIGltcGxlbWVudHMgT25JdGVtQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB2aWV3LmdldFRhZygpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVywgVXJpLnBhcnNlKHVybCkpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBwYXJlbnQuZ2V0Q29udGV4dCgpOworICAgICAgICBjb250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc291cmNlLnByb3BlcnRpZXMgYi9zYW1wbGVzL3NvdXJjZS5wcm9wZXJ0aWVzCmluZGV4IDJhZmVkYzUuLjM2ZTYxMzEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvc291cmNlLnByb3BlcnRpZXMKKysrIGIvc2FtcGxlcy9zb3VyY2UucHJvcGVydGllcwpAQCAtMSw1ICsxLDQgQEAKIFBrZy5Vc2VyU3JjPWZhbHNlCiBQa2cuUmV2aXNpb249MQogQW5kcm9pZFZlcnNpb24uQXBpTGV2ZWw9OQotI0FuZHJvaWRWZXJzaW9uLkNvZGVOYW1lPWdpbmdlcmJyZWFkCi0KK0FuZHJvaWRWZXJzaW9uLkNvZGVOYW1lPUZyb3lvCmRpZmYgLS1naXQgYS9zZGsvZG9jX3NvdXJjZS5wcm9wZXJ0aWVzIGIvc2RrL2RvY19zb3VyY2UucHJvcGVydGllcwppbmRleCA0NDE4ODUzLi45Yjg1YjgyIDEwMDY0NAotLS0gYS9zZGsvZG9jX3NvdXJjZS5wcm9wZXJ0aWVzCisrKyBiL3Nkay9kb2Nfc291cmNlLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiBQa2cuVXNlclNyYz1mYWxzZQogUGtnLlJldmlzaW9uPTEKLUFuZHJvaWRWZXJzaW9uLkFwaUxldmVsPTkKLSNBbmRyb2lkVmVyc2lvbi5Db2RlTmFtZT0KK0FuZHJvaWRWZXJzaW9uLkFwaUxldmVsPTgKK0FuZHJvaWRWZXJzaW9uLkNvZGVOYW1lPUZyb3lvCiAKZGlmZiAtLWdpdCBhL3Nkay9wbGF0Zm9ybV9zb3VyY2UucHJvcGVydGllcyBiL3Nkay9wbGF0Zm9ybV9zb3VyY2UucHJvcGVydGllcwppbmRleCA2ZGFkZWE1Li41MTM0YjYxIDEwMDY0NAotLS0gYS9zZGsvcGxhdGZvcm1fc291cmNlLnByb3BlcnRpZXMKKysrIGIvc2RrL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzCkBAIC0xLDYgKzEsNiBAQAotUGtnLkRlc2M9QW5kcm9pZCBTREsgUGxhdGZvcm0gMi4zX3IxCitQa2cuRGVzYz1BbmRyb2lkIFNESyBQbGF0Zm9ybSAyLnhfcjEKIFBrZy5Vc2VyU3JjPWZhbHNlCi1QbGF0Zm9ybS5WZXJzaW9uPTIuMworUGxhdGZvcm0uVmVyc2lvbj0yLngKIFBrZy5SZXZpc2lvbj0xCi1BbmRyb2lkVmVyc2lvbi5BcGlMZXZlbD05Ci0jQW5kcm9pZFZlcnNpb24uQ29kZU5hbWU9CitBbmRyb2lkVmVyc2lvbi5BcGlMZXZlbD04CitBbmRyb2lkVmVyc2lvbi5Db2RlTmFtZT1Gcm95bwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rIGIvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rCmluZGV4IDNjZTdjZDUuLjVhMmQzYjUgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvQW5kcm9pZC5taworKysgYi9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsKQEAgLTcwLDcgKzcwLDcgQEAKIAkjIHdpdGhvdXQgdXMgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUKIAlMT0NBTF9MRExJQlMgKz0gLVdsLC16LG9yaWdpbgogCUxPQ0FMX0NGTEFHUyArPSAtREdUS19OT19DSEVDS19DQVNUUyAtRF9fV1hHVEtfXyAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKLSAgIAkJCQkJLURfTEFSR0VfRklMRVMgLURfTEFSR0VGSUxFX1NPVVJDRT0xIAorICAgCQkJCQktRF9MQVJHRV9GSUxFUyAtRF9MQVJHRUZJTEVfU09VUkNFPTEgLUROT19HQ0NfUFJBR01BCiAJTE9DQUxfTERMSUJTICs9IC1scnQKIGVuZGlmCiBpZmVxICgkKEhPU1RfT1MpLGRhcndpbikKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUHJvcGVydHlTZXJ2ZXIuY3BwIGIvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAKaW5kZXggNGEwYTJhYy4uOTEyMjNlZiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAKKysrIGIvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAKQEAgLTkwLDYgKzkwLDkgQEAKICAgICAgICAgeyAicm8uYnVpbGQuZGF0ZSIsICJXZWQgTm92IDI4IDA3OjQ0OjE0IFBTVCAyMDA3IiB9LAogICAgICAgICB7ICJyby5idWlsZC5kYXRlLnV0YyIsICIxMTk2MjY0NjU0IiB9LAogICAgICAgICB7ICJyby5idWlsZC50eXBlIiwgImVuZyIgfSwKKyAgICAgICAgeyAicm8uYnVpbGQudmVyc2lvbi5zZGsiLCAiOCIgfSwKKyAgICAgICAgeyAicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZSIsICJGcm95byIgfSwKKyAgICAgICAgeyAicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgIkZyb3lvIiB9LAogICAgICAgICB7ICJyby5wcm9kdWN0LmRldmljZSIsICJzaW11bGF0b3IiIC8qInNvb25lciIqLyB9LAogICAgICAgICB7ICJyby5wcm9kdWN0LmJyYW5kIiwgImdlbmVyaWMiIH0sCiAgICAgICAgIHsgInJvLmJ1aWxkLnVzZXIiLCAiZmFkZGVuIiB9LApAQCAtOTksMTIgKzEwMiwxNiBAQAogICAgICAgICB7ICJyby5yYWRpby51c2UtcHBwIiwgIm5vIiB9LAogICAgICAgICB7ICJyby5GT1JFR1JPVU5EX0FQUF9BREoiLCAiMCIgfSwKICAgICAgICAgeyAicm8uVklTSUJMRV9BUFBfQURKIiwgIjEiIH0sCisgICAgICAgIHsgInJvLlBFUkNFUFRJQkxFX0FQUF9BREoiLCAiMiIgfSwKKyAgICAgICAgeyAicm8uSEVBVllfV0VJR0hUX0FQUF9BREoiLCAiMyIgfSwKICAgICAgICAgeyAicm8uU0VDT05EQVJZX1NFUlZFUl9BREoiLCAiMiIgfSwKICAgICAgICAgeyAicm8uSElEREVOX0FQUF9NSU5fQURKIiwgIjciIH0sCiAgICAgICAgIHsgInJvLkNPTlRFTlRfUFJPVklERVJfQURKIiwgIjE0IiB9LAogICAgICAgICB7ICJyby5FTVBUWV9BUFBfQURKIiwgIjE1IiB9LAogICAgICAgICB7ICJyby5GT1JFR1JPVU5EX0FQUF9NRU0iLCAiMTUzNiIgfSwKICAgICAgICAgeyAicm8uVklTSUJMRV9BUFBfTUVNIiwgIjIwNDgiIH0sCisgICAgICAgIHsgInJvLlBFUkNFUFRJQkxFX0FQUF9NRU0iLCAiNDA5NiIgfSwKKyAgICAgICAgeyAicm8uSEVBVllfV0VJR0hUX0FQUF9NRU0iLCAiNDA5NiIgfSwKICAgICAgICAgeyAicm8uU0VDT05EQVJZX1NFUlZFUl9NRU0iLCAiNDA5NiIgfSwKICAgICAgICAgeyAicm8uSElEREVOX0FQUF9NRU0iLCAiODE5MiIgfSwKICAgICAgICAgeyAicm8uRU1QVFlfQVBQX01FTSIsICIxNjM4NCIgfSwKQEAgLTE0NSw2ICsxNTIsNyBAQAogICAgICAgICB7ICJsb2cucmVkaXJlY3Qtc3RkaW8iLCAiZmFsc2UiIH0sICAgICAgICAgIC8vIC1YbG9nLXN0ZGlvCiAKICAgICAgICAgLyogU3VyZmFjZUZsaW5nZXIgb3B0aW9ucyAqLworICAgICAgICB7ICJyby5zZi5sY2RfZGVuc2l0eSIsICIxNjAiIH0sCiAgICAgICAgIHsgImRlYnVnLnNmLm5vYm9vdGFuaW1hdGlvbiIsICIxIiB9LAogICAgICAgICB7ICJkZWJ1Zy5zZi5zaG93dXBkYXRlcyIsICIwIiB9LAogICAgICAgICB7ICJkZWJ1Zy5zZi5zaG93Y3B1IiwgIjAiIH0sCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL2NyZWF0ZV90ZXN0LnB5IGIvdGVzdHJ1bm5lci9jcmVhdGVfdGVzdC5weQppbmRleCAyZmMzYTNjLi5mYWVhMDEzIDEwMDc1NQotLS0gYS90ZXN0cnVubmVyL2NyZWF0ZV90ZXN0LnB5CisrKyBiL3Rlc3RydW5uZXIvY3JlYXRlX3Rlc3QucHkKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBJT0Vycm9yOiB0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcKICAgIiIiCiAgICMgc2tpcCBpZiBmaWxlIGFscmVhZHkgZXhpc3RzCi0gIHRlc3RzX3BhdGggPSAiJXMvJXMiICUgKG1hbmlmZXN0LmFwcF9wYXRoLCBUZXN0c0NvbnN0cy5URVNUU19GT0xERVIpCisgIHRlc3RzX3BhdGggPSAiJXMvJXMiICUgKG1hbmlmZXN0LkdldEFwcFBhdGgoKSwgVGVzdHNDb25zdHMuVEVTVFNfRk9MREVSKQogICB0ZXN0c19tYW5pZmVzdF9wYXRoID0gIiVzLyVzIiAlICh0ZXN0c19wYXRoLCBtYW5pZmVzdC5GSUxFTkFNRSkKICAgaWYgb3MucGF0aC5leGlzdHModGVzdHNfbWFuaWZlc3RfcGF0aCk6CiAgICAgX1ByaW50TWVzc2FnZSgiJXMgYWxyZWFkeSBleGlzdHMsIG5vdCBvdmVyd3JpdHRlbiIgJSB0ZXN0c19tYW5pZmVzdF9wYXRoKQpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci9ydW50ZXN0LnB5IGIvdGVzdHJ1bm5lci9ydW50ZXN0LnB5CmluZGV4IDRhODZhNjMuLjE5MTAyYzYgMTAwNzU1Ci0tLSBhL3Rlc3RydW5uZXIvcnVudGVzdC5weQorKysgYi90ZXN0cnVubmVyL3J1bnRlc3QucHkKQEAgLTIyMyw5ICsyMjMsMTQgQEAKIAogICBkZWYgX0RvQnVpbGQoc2VsZik6CiAgICAgbG9nZ2VyLlNpbGVudExvZygiQnVpbGRpbmcgdGVzdHMuLi4iKQorCisgICAgdGVzdHMgPSBzZWxmLl9HZXRUZXN0c1RvUnVuKCkKKyAgICAjIHR1cm4gb2ZmIGRhbHZpayB2ZXJpZmllciBpZiBuZWNlc3NhcnkKKyAgICBzZWxmLl9UdXJuT2ZmVmVyaWZpZXIodGVzdHMpCisgICAgc2VsZi5fRG9GdWxsQnVpbGQodGVzdHMpCisKICAgICB0YXJnZXRfc2V0ID0gU2V0KCkKICAgICBleHRyYV9hcmdzX3NldCA9IFNldCgpCi0gICAgdGVzdHMgPSBzZWxmLl9HZXRUZXN0c1RvUnVuKCkKICAgICBmb3IgdGVzdF9zdWl0ZSBpbiB0ZXN0czoKICAgICAgIHNlbGYuX0FkZEJ1aWxkVGFyZ2V0KHRlc3Rfc3VpdGUsIHRhcmdldF9zZXQsIGV4dHJhX2FyZ3Nfc2V0KQogCkBAIC0yNTEsMjMgKzI1Niw5IEBACiAgICAgICAgICAgbG9nZ2VyLkxvZyhjbWQpCiAgICAgICAgICAgcnVuX2NvbW1hbmQuUnVuQ29tbWFuZChjbWQsIHJldHVybl9vdXRwdXQ9RmFsc2UpCiAKLSAgICAgICMgaGFjayB0byBidWlsZCBjdHMgZGVwZW5kZW5jaWVzCi0gICAgICAjIFRPRE86IHJlbW92ZSB0aGlzIHdoZW4gYnVpbGQgZGVwZW5kZW5jeSBzdXBwb3J0IGFkZGVkIHRvIHJ1bnRlc3Qgb3IKLSAgICAgICMgY3RzIGRlcGVuZGVuY2llcyBhcmUgcmVtb3ZlZAotICAgICAgaWYgc2VsZi5fSXNDdHNUZXN0cyh0ZXN0cyk6Ci0gICAgICAgICMgbmVlZCB0byB1c2UgbWFrZSBzaW5jZSB0aGVzZSBmYWlsIGJ1aWxkaW5nIHdpdGggT05FX1NIT1RfTUFLRUZJTEUKLSAgICAgICAgY21kID0gKCdtYWtlIC1qJXMgQ3RzVGVzdFN0dWJzIGFuZHJvaWQuY29yZS50ZXN0cy5ydW5uZXInICUKLSAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMubWFrZV9qb2JzKQotICAgICAgICBsb2dnZXIuTG9nKGNtZCkKLSAgICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMucHJldmlldzoKLSAgICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgICBvcy5jaGRpcihzZWxmLl9yb290X3BhdGgpCi0gICAgICAgICAgcnVuX2NvbW1hbmQuUnVuQ29tbWFuZChjbWQsIHJldHVybl9vdXRwdXQ9RmFsc2UpCi0gICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKLSAgICAgICMgdHVybiBvZmYgZGFsdmlrIHZlcmlmaWVyIGlmIG5lY2Vzc2FyeQotICAgICAgc2VsZi5fVHVybk9mZlZlcmlmaWVyKHRlc3RzKQogICAgICAgdGFyZ2V0X2J1aWxkX3N0cmluZyA9ICIgIi5qb2luKGxpc3QodGFyZ2V0X3NldCkpCiAgICAgICBleHRyYV9hcmdzX3N0cmluZyA9ICIgIi5qb2luKGxpc3QoZXh0cmFfYXJnc19zZXQpKQorCiAgICAgICAjIG1tbSBjYW5ub3QgYmUgdXNlZCBmcm9tIHB5dGhvbiwgc28gcGVyZm9ybSBhIHNpbWlsYXIgb3BlcmF0aW9uIHVzaW5nCiAgICAgICAjIE9ORV9TSE9UX01BS0VGSUxFCiAgICAgICBjbWQgPSAnT05FX1NIT1RfTUFLRUZJTEU9IiVzIiBtYWtlIC1qJXMgLUMgIiVzIiBmaWxlcyAlcycgJSAoCkBAIC0yODYsMTIgKzI3Nyw0MyBAQAogICAgICAgICBsb2dnZXIuTG9nKCJTeW5jaW5nIHRvIGRldmljZS4uLiIpCiAgICAgICAgIHNlbGYuX2FkYi5TeW5jKHJ1bnRpbWVfcmVzdGFydD1yZWJ1aWxkX2xpYmNvcmUpCiAKKyAgZGVmIF9Eb0Z1bGxCdWlsZChzZWxmLCB0ZXN0cyk6CisgICAgIiIiSWYgbmVjZXNzYXJ5LCBydW4gYSBmdWxsICdtYWtlJyBjb21tYW5kIGZvciB0aGUgdGVzdHMgdGhhdCBuZWVkIGl0LiIiIgorICAgIGV4dHJhX2FyZ3Nfc2V0ID0gU2V0KCkKKworICAgICMgaGFjayB0byBidWlsZCBjdHMgZGVwZW5kZW5jaWVzCisgICAgIyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIGN0cyBkZXBlbmRlbmNpZXMgYXJlIHJlbW92ZWQKKyAgICBpZiBzZWxmLl9Jc0N0c1Rlc3RzKHRlc3RzKToKKyAgICAgICMgbmVlZCB0byB1c2UgbWFrZSBzaW5jZSB0aGVzZSBmYWlsIGJ1aWxkaW5nIHdpdGggT05FX1NIT1RfTUFLRUZJTEUKKyAgICAgIGV4dHJhX2FyZ3Nfc2V0LmFkZCgnQ3RzVGVzdFN0dWJzJykKKyAgICAgIGV4dHJhX2FyZ3Nfc2V0LmFkZCgnYW5kcm9pZC5jb3JlLnRlc3RzLnJ1bm5lcicpCisgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICBpZiB0ZXN0LklzRnVsbE1ha2UoKToKKyAgICAgICAgaWYgdGVzdC5HZXRFeHRyYUJ1aWxkQXJncygpOgorICAgICAgICAgICMgZXh0cmEgYXJncyBjb250YWlucyB0aGUgYXJncyB0byBwYXNzIHRvICdtYWtlJworICAgICAgICAgIGV4dHJhX2FyZ3Nfc2V0LmFkZCh0ZXN0LkdldEV4dHJhQnVpbGRBcmdzKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbG9nZ2VyLkxvZygiV2FybmluZzogdGVzdCAlcyBuZWVkcyBhIGZ1bGwgYnVpbGQgYnV0IGRvZXMgbm90IHNwZWNpZnkiCisgICAgICAgICAgICAgICAgICAgICAiIGV4dHJhX2J1aWxkX2FyZ3MiICUgdGVzdC5HZXROYW1lKCkpCisKKyAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGFjdHVhbGx5IGFueSB0ZXN0cyB0aGF0IHJlcXVpcmVkIGEgZnVsbCBidWlsZAorICAgIGlmIGV4dHJhX2FyZ3Nfc2V0OgorICAgICAgY21kID0gKCdtYWtlIC1qJXMgJXMnICUgKHNlbGYuX29wdGlvbnMubWFrZV9qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJy5qb2luKGxpc3QoZXh0cmFfYXJnc19zZXQpKSkpCisgICAgICBsb2dnZXIuTG9nKGNtZCkKKyAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLnByZXZpZXc6CisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcihzZWxmLl9yb290X3BhdGgpCisgICAgICAgIHJ1bl9jb21tYW5kLlJ1bkNvbW1hbmQoY21kLCByZXR1cm5fb3V0cHV0PUZhbHNlKQorICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCiAgIGRlZiBfQWRkQnVpbGRUYXJnZXQoc2VsZiwgdGVzdF9zdWl0ZSwgdGFyZ2V0X3NldCwgZXh0cmFfYXJnc19zZXQpOgotICAgIGJ1aWxkX2RpciA9IHRlc3Rfc3VpdGUuR2V0QnVpbGRQYXRoKCkKLSAgICBpZiBzZWxmLl9BZGRCdWlsZFRhcmdldFBhdGgoYnVpbGRfZGlyLCB0YXJnZXRfc2V0KToKLSAgICAgIGV4dHJhX2FyZ3Nfc2V0LmFkZCh0ZXN0X3N1aXRlLkdldEV4dHJhQnVpbGRBcmdzKCkpCi0gICAgZm9yIHBhdGggaW4gdGVzdF9zdWl0ZS5HZXRCdWlsZERlcGVuZGVuY2llcyhzZWxmLl9vcHRpb25zKToKLSAgICAgIHNlbGYuX0FkZEJ1aWxkVGFyZ2V0UGF0aChwYXRoLCB0YXJnZXRfc2V0KQorICAgIGlmIG5vdCB0ZXN0X3N1aXRlLklzRnVsbE1ha2UoKToKKyAgICAgIGJ1aWxkX2RpciA9IHRlc3Rfc3VpdGUuR2V0QnVpbGRQYXRoKCkKKyAgICAgIGlmIHNlbGYuX0FkZEJ1aWxkVGFyZ2V0UGF0aChidWlsZF9kaXIsIHRhcmdldF9zZXQpOgorICAgICAgICBleHRyYV9hcmdzX3NldC5hZGQodGVzdF9zdWl0ZS5HZXRFeHRyYUJ1aWxkQXJncygpKQorICAgICAgZm9yIHBhdGggaW4gdGVzdF9zdWl0ZS5HZXRCdWlsZERlcGVuZGVuY2llcyhzZWxmLl9vcHRpb25zKToKKyAgICAgICAgc2VsZi5fQWRkQnVpbGRUYXJnZXRQYXRoKHBhdGgsIHRhcmdldF9zZXQpCiAKICAgZGVmIF9BZGRCdWlsZFRhcmdldFBhdGgoc2VsZiwgYnVpbGRfZGlyLCB0YXJnZXRfc2V0KToKICAgICBpZiBidWlsZF9kaXIgaXMgbm90IE5vbmU6CkBAIC0zNjUsNiArMzg3LDcgQEAKICAgICAgICAgICBzZWxmLl9hZGIuU2VuZENvbW1hbmQoInJlYm9vdCIpCiAgICAgICAgICAgc2VsZi5fYWRiLlNlbmRDb21tYW5kKCJ3YWl0LWZvci1kZXZpY2UiLCB0aW1lb3V0X3RpbWU9NjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50PTMpCisgICAgICAgICAgc2VsZi5fYWRiLkVuYWJsZUFkYlJvb3QoKQogCiAgIGRlZiBSdW5UZXN0cyhzZWxmKToKICAgICAiIiJNYWluIGVudHJ5IG1ldGhvZCAtIGV4ZWN1dGVzIHRoZSB0ZXN0cyBhY2NvcmRpbmcgdG8gY29tbWFuZCBsaW5lIGFyZ3MuIiIiCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKaW5kZXggZjgzZDMyZC4uMzIwOTU3NCAxMDA2NDQKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbApAQCAtMzk1LDcgKzM5NSw4IEBACiA8dGVzdCBuYW1lPSJicm93c2VyIgogICAgIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvQnJvd3NlciIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5icm93c2VyLnRlc3RzIgotICAgIGNvdmVyYWdlX3RhcmdldD0iQnJvd3NlciIgLz4KKyAgICBjb3ZlcmFnZV90YXJnZXQ9IkJyb3dzZXIiCisgICAgY29udGludW91cz0idHJ1ZSIgLz4KIAogPHRlc3QgbmFtZT0iY2FsY3VsYXRvciIKICAgICBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL0NhbGN1bGF0b3IiCkBAIC00OTksNiArNTAwLDEyIEBACiAgICAgZGVzY3JpcHRpb249Ikdvb2dsZSB0ZXN0LiIKICAgICBleHRyYV9idWlsZF9hcmdzPSJHVEVTVF9URVNUUz0xIiAvPgogCis8IS0tIExpYmppbmdsZSAtLT4KKzx0ZXN0LW5hdGl2ZSBuYW1lPSJsaWJqaW5nbGUiCisgICAgYnVpbGRfcGF0aD0idmVuZG9yL2dvb2dsZS9saWJyYXJpZXMvbGliamluZ2xlIgorICAgIGRlc2NyaXB0aW9uPSJMaWJqaW5nbGUuIgorICAgIGZ1bGxfbWFrZT0idHJ1ZSIKKyAgICBleHRyYV9idWlsZF9hcmdzPSJMSUJKSU5HTEVfVEVTVFM9MSIgLz4KIAogPCEtLSBob3N0IGphdmEgdGVzdHMgLS0+CiA8dGVzdC1ob3N0IG5hbWU9ImN0cy1hcHBzZWN1cml0eSIKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhzZCBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhzZAppbmRleCA3MTM0NDU5Li42NzgxOTQxIDEwMDY0NAotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy54c2QKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMueHNkCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgogCiAgICAgICAgIDwhLS0gRmlsZSBzeXN0ZW0gcGF0aCwgcmVsYXRpdmUgdG8gQW5kcm9pZCBidWlsZCByb290LCB0byB0aGlzCi0gICAgICAgIHBhY2thZ2UncyBBbmRyb2lkLm1rIGZpbGUuIC0tPgorICAgICAgICBwYWNrYWdlJ3MgQW5kcm9pZC5tayBmaWxlLi0tPgogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJ1aWxkX3BhdGgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KIAogICAgICAgICA8IS0tIEluY2x1ZGUgdGVzdCBpbiBjb250aW51b3VzIHRlc3Qgc3lzdGVtLiAtLT4KQEAgLTU1LDEwICs1NSwxNyBAQAogICAgICAgICB0ZXN0LiAtLT4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgogCisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoYXQgYSBmdWxsICdtYWtlJywgYXMgb3Bwb3NlZCB0byAnbW1tJyBjb21tYW5kLCBpcworICAgICAgICBuZWVkZWQgdG8gYnVpbGQgdGhpcyB0ZXN0LiBUaGUgYnVpbGQgY29tbWFuZCB1c2VkIHdpbGwgYmUKKyAgICAgICAgJ21ha2UgZXh0cmFfYnVpbGRfYXJncycgLS0+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnVsbF9tYWtlIiB0eXBlPSJ4czpib29sZWFuIgorICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIiAvPgorCiAgICAgICAgIDwhLS0gIEV4dHJhIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gYnVpbGQgY29tbWFuZCB3aGVuIGJ1aWxkaW5nIHRoaXMKICAgICAgICAgdGVzdC4gLS0+CiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXh0cmFfYnVpbGRfYXJncyIgdHlwZT0ieHM6c3RyaW5nIgogICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIiAvPgorCiAgICAgPC94czpjb21wbGV4VHlwZT4KIAogICAgIDwhLS0gSmF2YSBvbiBkZXZpY2UgaW5zdHJ1bWVudGF0aW9uIHRlc3QuCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy9pbnN0cnVtZW50YXRpb25fdGVzdC5weSBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL2luc3RydW1lbnRhdGlvbl90ZXN0LnB5CmluZGV4IDg3ODI2MTUuLjQwZDZiZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL2luc3RydW1lbnRhdGlvbl90ZXN0LnB5CisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL2luc3RydW1lbnRhdGlvbl90ZXN0LnB5CkBAIC0xNyw5ICsxNyw2IEBACiAKICIiIlRlc3RTdWl0ZSBkZWZpbml0aW9uIGZvciBBbmRyb2lkIGluc3RydW1lbnRhdGlvbiB0ZXN0cy4iIiIKIAotIyBweXRob24gaW1wb3J0cwotaW1wb3J0IG9zCi0KICMgbG9jYWwgaW1wb3J0cwogaW1wb3J0IGNvdmVyYWdlCiBpbXBvcnQgZXJyb3JzCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3N1aXRlLnB5IGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF9zdWl0ZS5weQppbmRleCA5MGQ1NzkyLi4xMDJhNzM4IDEwMDY0NAotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3N1aXRlLnB5CisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfc3VpdGUucHkKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBzZWxmLl9zdWl0ZSA9IE5vbmUKICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9ICcnCiAgICAgc2VsZi5fZXh0cmFfYnVpbGRfYXJncyA9ICcnCisgICAgc2VsZi5faXNfZnVsbF9tYWtlID0gRmFsc2UKIAogICBkZWYgR2V0TmFtZShzZWxmKToKICAgICByZXR1cm4gc2VsZi5fbmFtZQpAQCAtODgsNiArODksMTMgQEAKICAgICBzZWxmLl9leHRyYV9idWlsZF9hcmdzID0gYnVpbGRfYXJncwogICAgIHJldHVybiBzZWxmCiAKKyAgZGVmIElzRnVsbE1ha2Uoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2lzX2Z1bGxfbWFrZQorCisgIGRlZiBTZXRJc0Z1bGxNYWtlKHNlbGYsIGZ1bGxfbWFrZSk6CisgICAgc2VsZi5faXNfZnVsbF9tYWtlID0gZnVsbF9tYWtlCisgICAgcmV0dXJuIHNlbGYKKwogICBkZWYgUnVuKHNlbGYsIG9wdGlvbnMsIGFkYik6CiAgICAgIiIiUnVucyB0aGUgdGVzdC4KIApkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF93YWxrZXIucHkgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3dhbGtlci5weQppbmRleCA0ZWY2OTIzLi5lMzRkYWZjIDEwMDc1NQotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3dhbGtlci5weQorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3dhbGtlci5weQpAQCAtNjUsMjAgKzY1LDIwIEBACiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgbG9nZ2VyLkxvZygnJXMgZG9lcyBub3QgZXhpc3QnICUgcGF0aCkKICAgICAgIHJldHVybiBbXQotICAgIGFic3BhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKKyAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKICAgICAjIGVuc3VyZSBwYXRoIGlzIGluIEFORFJPSURfQlVJTERfUk9PVAotICAgIHNlbGYuX2J1aWxkX3RvcCA9IGFuZHJvaWRfYnVpbGQuR2V0VG9wKCkKLSAgICBpZiBub3Qgc2VsZi5fSXNQYXRoSW5CdWlsZFRyZWUoYWJzcGF0aCk6CisgICAgc2VsZi5fYnVpbGRfdG9wID0gb3MucGF0aC5yZWFscGF0aChhbmRyb2lkX2J1aWxkLkdldFRvcCgpKQorICAgIGlmIG5vdCBzZWxmLl9Jc1BhdGhJbkJ1aWxkVHJlZShyZWFscGF0aCk6CiAgICAgICBsb2dnZXIuTG9nKCclcyBpcyBub3QgYSBzdWItZGlyZWN0b3J5IG9mIGJ1aWxkIHJvb3QgJXMnICUKICAgICAgICAgICAgICAgICAgKHBhdGgsIHNlbGYuX2J1aWxkX3RvcCkpCiAgICAgICByZXR1cm4gW10KIAogICAgICMgZmlyc3QsIGFzc3VtZSBwYXRoIGlzIGEgcGFyZW50IGRpcmVjdG9yeSwgd2hpY2ggc3BlY2lmaWVzIHRvIHJ1biBhbGwKICAgICAjIHRlc3RzIHdpdGhpbiB0aGlzIGRpcmVjdG9yeQotICAgIHRlc3RzID0gc2VsZi5fRmluZFN1YlRlc3RzKGFic3BhdGgsIFtdKQorICAgIHRlc3RzID0gc2VsZi5fRmluZFN1YlRlc3RzKHJlYWxwYXRoLCBbXSkKICAgICBpZiBub3QgdGVzdHM6CiAgICAgICBsb2dnZXIuU2lsZW50TG9nKCdObyB0ZXN0cyBmb3VuZCB3aXRoaW4gJXMsIHNlYXJjaGluZyB1cHdhcmRzJyAlIHBhdGgpCi0gICAgICB0ZXN0cyA9IHNlbGYuX0ZpbmRVcHN0cmVhbVRlc3RzKGFic3BhdGgpCisgICAgICB0ZXN0cyA9IHNlbGYuX0ZpbmRVcHN0cmVhbVRlc3RzKHJlYWxwYXRoKQogICAgIHJldHVybiB0ZXN0cwogCiAgIGRlZiBfSXNQYXRoSW5CdWlsZFRyZWUoc2VsZiwgcGF0aCk6CmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy94bWxfc3VpdGVfaGVscGVyLnB5IGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMveG1sX3N1aXRlX2hlbHBlci5weQppbmRleCBiN2VkODNiLi42Y2YyZTZjIDEwMDY0NAotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy94bWxfc3VpdGVfaGVscGVyLnB5CisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3htbF9zdWl0ZV9oZWxwZXIucHkKQEAgLTM5LDYgKzM5LDcgQEAKICAgX1NVSVRFX0FUVFIgPSAnc3VpdGUnCiAgIF9ERVNDUklQVElPTl9BVFRSID0gJ2Rlc2NyaXB0aW9uJwogICBfRVhUUkFfQlVJTERfQVJHU19BVFRSID0gJ2V4dHJhX2J1aWxkX2FyZ3MnCisgIF9GVUxMX01BS0VfQVRUUiA9ICdmdWxsX21ha2UnCiAKICAgZGVmIFBhcnNlKHNlbGYsIGVsZW1lbnQpOgogICAgICIiIlBvcHVsYXRlcyBjb21tb24gc3VpdGUgYXR0cmlidXRlcyBmcm9tIGdpdmVuIHN1aXRlIHhtbCBlbGVtZW50LgpAQCAtNzksNiArODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZT0nJykpCiAgICAgdGVzdF9zdWl0ZS5TZXRFeHRyYUJ1aWxkQXJncyhzZWxmLl9QYXJzZUF0dHJpYnV0ZSgKICAgICAgICAgc3VpdGVfZWxlbWVudCwgc2VsZi5fRVhUUkFfQlVJTERfQVJHU19BVFRSLCBGYWxzZSwgZGVmYXVsdF92YWx1ZT0nJykpCisgICAgdGVzdF9zdWl0ZS5TZXRJc0Z1bGxNYWtlKHNlbGYuX1BhcnNlQXR0cmlidXRlKAorICAgICAgICBzdWl0ZV9lbGVtZW50LCBzZWxmLl9GVUxMX01BS0VfQVRUUiwgRmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UpKQorCiAKICAgZGVmIF9QYXJzZUF0dHJpYnV0ZShzZWxmLCBzdWl0ZV9lbGVtZW50LCBhdHRyaWJ1dGVfbmFtZSwgbWFuZGF0b3J5LAogICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWU9Tm9uZSk6CmRpZmYgLS1naXQgYS90b29scy9lbGZ0cmVlL0FuZHJvaWQubWsgYi90b29scy9lbGZ0cmVlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiYTBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VsZnRyZWUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKworIyBUYXJnZXQgZXhlY3V0YWJsZQorIyBUT0RPOiBSZXF1aXJlcyBsaWJlbGYgZm9yIHRhcmdldAorCisjaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjTE9DQUxfTU9EVUxFIDo9ICQobW9kdWxlKQorI0xPQ0FMX1NSQ19GSUxFUyA6PSAkKHNyY19maWxlcykKKyNMT0NBTF9DX0lOQ0xVREVTIDo9ICQoY19pbmNsdWRlcykKKyNMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICQoc2hhcmVkX2xpYnJhcmllcykKKyNMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9ICQoc3RhdGljX2xpYnJhcmllcykKKyNMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT1BUSU9OQUxfRVhFQ1VUQUJMRVMpCisjTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKKyNMT0NBTF9MRExJQlMgKz0KKyNpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyBIb3N0IGV4ZWN1dGFibGUKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gZWxmdHJlZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGVsZnRyZWUuYworTE9DQUxfQ19JTkNMVURFUyA6PSBleHRlcm5hbC9lbGZ1dGlscy9saWJlbGYKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZWxmCitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvdG9vbHMvZWxmdHJlZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcHBzL0dyYXBoaWNzTGFiL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIHRvb2xzL2VsZnRyZWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWxmdHJlZS9lbGZ0cmVlLmMgYi90b29scy9lbGZ0cmVlL2VsZnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlZDEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWxmdHJlZS9lbGZ0cmVlLmMKQEAgLTAsMCArMSwzMjggQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgUEFUSF9NQVggMjU2CisKK3N0YXRpYyBlbnVtIHsgSElERV9EVVBTLCBQUlVORV9EVVBTLCBTSE9XX0RVUFMgfSBkdXBfbW9kZTsKK3N0YXRpYyBjaGFyICpyb290X25hbWU7CisKK3N0YXRpYyB2b2lkIGFwcF9lcnIoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdW5peF9lcnIoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgZXJyc3Y7CisKKwllcnJzdiA9IGVycm5vOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJZnByaW50ZihzdGRlcnIsICI6ICVzXG4iLCBzdHJlcnJvcihlcnJzdikpOworfQorCitzdGF0aWMgdm9pZCBlbGZfZXJyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIjogJXNcbiIsIGVsZl9lcnJtc2coLTEpKTsKK30KKworc3RydWN0IHNlZW4geworCWNoYXIgKm5hbWU7CisJc3RydWN0IHNlZW4gKm5leHQ7Cit9OworCitzdHJ1Y3QgdHJlZV9zdGF0ZSB7CisJaW50IGxldmVsOworCXN0cnVjdCBzZWVuICpzZWVuOworfTsKKworc3RhdGljIGludCBzZWVuKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZWVuICpzOworCisJZm9yIChzID0gdC0+c2VlbjsgczsgcyA9IHMtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAocy0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VlKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZWVuICpzID0gbWFsbG9jKHNpemVvZigqcykpOworCXMtPm5hbWUgPSBtYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisJc3RyY3B5KHMtPm5hbWUsIG5hbWUpOworCXMtPm5leHQgPSB0LT5zZWVuOworCXQtPnNlZW4gPSBzOworfQorCitjaGFyICppbmRlbnRfc3RyID0gIiAgIjsKKworc3RhdGljIHZvaWQgaW5kZW50KHN0cnVjdCB0cmVlX3N0YXRlICp0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmxldmVsOyBpKyspCisJCXByaW50ZigiJXMiLCBpbmRlbnRfc3RyKTsKK30KKworc3RydWN0IHNlYXJjaF9kaXIgeworCWNoYXIgKnBhdGg7CisJc3RydWN0IHNlYXJjaF9kaXIgKm5leHQ7Cit9ICpkaXJzID0gTlVMTDsKKworc3RhdGljIHZvaWQgYWRkX3NlYXJjaF9kaXIoY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc2VhcmNoX2RpciAqZGlyID0gbWFsbG9jKHNpemVvZigqZGlyKSk7CisJZGlyLT5wYXRoID0gbWFsbG9jKHN0cmxlbihwYXRoKSArIDEpOworCXN0cmNweShkaXItPnBhdGgsIHBhdGgpOworCWRpci0+bmV4dCA9IGRpcnM7CisJZGlycyA9IGRpcjsKK30KKworc3RydWN0IGZpbGVfc3RhdGUgeworCXN0cnVjdCB0cmVlX3N0YXRlICp0OworCUVsZiAqZTsKKwlFbGZfRGF0YSAqc3RydGFiX2RhdGE7Cit9OworCitzdGF0aWMgRWxmX1NjbiAqZmluZF9zY24oc3RydWN0IGZpbGVfc3RhdGUgKmYsIEdFbGZfV29yZCBzaHQsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyX291dCkKK3sKKwl3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuKGYtPmUsIHNjbikpKSB7CisJCWlmICghZ2VsZl9nZXRzaGRyKHNjbiwgc2hkcl9vdXQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNoZHJfb3V0LT5zaF90eXBlID09IHNodCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzY247Cit9CisKK3N0cnVjdCBkeW5fc3RhdGUgeworCXN0cnVjdCBmaWxlX3N0YXRlICpmOworCUVsZl9EYXRhICpkeW5fZGF0YTsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgaW50IGZpbmRfZHluKHN0cnVjdCBkeW5fc3RhdGUgKmQsIEdFbGZfU3h3b3JkIHRhZywgR0VsZl9EeW4gKmR5bl9vdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC0+Y291bnQ7IGkrKykgeworCQlpZiAoIWdlbGZfZ2V0ZHluKGQtPmR5bl9kYXRhLCBpLCBkeW5fb3V0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkeW5fb3V0LT5kX3RhZyA9PSB0YWcpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9maWxlKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lLCBjaGFyICpwYXRoKTsKKworc3RhdGljIGludCBkdW1wX25lZWRlZChzdHJ1Y3QgdHJlZV9zdGF0ZSAqdCwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2VhcmNoX2RpciAqZGlyOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGZkOworCisJdC0+bGV2ZWwrKzsKKworCWZvciAoZGlyID0gZGlyczsgZGlyOyBkaXIgPSBkaXItPm5leHQpIHsKKwkJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIGRpci0+cGF0aCwgbmFtZSk7CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQljbG9zZShmZCk7CisJCQlkdW1wX2ZpbGUodCwgbmFtZSwgcGF0aCk7CisJCQl0LT5sZXZlbC0tOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlhcHBfZXJyKCJDb3VsZG4ndCByZXNvbHZlIGRlcGVuZGVuY3kgXCIlc1wiLiIsIG5hbWUpOworCXQtPmxldmVsLS07CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGR1bXBfZHluYW1pYyhzdHJ1Y3QgZmlsZV9zdGF0ZSAqZiwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCit7CisJc3RydWN0IGR5bl9zdGF0ZSBkOworCUdFbGZfRHluIG5lZWRlZF9keW47CisJY2hhciAqbmVlZGVkX25hbWU7CisJaW50IGk7CisKKwlkLmYgPSBmOworCWQuZHluX2RhdGEgPSBlbGZfZ2V0ZGF0YShzY24sIE5VTEwpOworCWlmICghZC5keW5fZGF0YSkgeworCQllbGZfZXJyKCJlbGZfZ2V0ZGF0YSBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkLmNvdW50ID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC5jb3VudDsgaSsrKSB7CisJCWlmICghZ2VsZl9nZXRkeW4oZC5keW5fZGF0YSwgaSwgJm5lZWRlZF9keW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKG5lZWRlZF9keW4uZF90YWcgIT0gRFRfTkVFREVEKQorCQkJY29udGludWU7CisKKwkJbmVlZGVkX25hbWUgPSAoY2hhciAqKWYtPnN0cnRhYl9kYXRhLT5kX2J1ZgorCQkJICAgICAgKyBuZWVkZWRfZHluLmRfdW4uZF92YWw7CisKKwkJZHVtcF9uZWVkZWQoZi0+dCwgbmVlZGVkX25hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfZmlsZShzdHJ1Y3QgdHJlZV9zdGF0ZSAqdCwgY2hhciAqbmFtZSwgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZV9zdGF0ZSBmOworCWludCBmZDsKKwlFbGZfU2NuICpzY247CisJR0VsZl9TaGRyIHNoZHI7CisKKwlpZiAoKGR1cF9tb2RlID09IEhJREVfRFVQUykgJiYgc2Vlbih0LCBuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwlpbmRlbnQodCk7IHByaW50ZigiJXMiLCBuYW1lKTsKKworCWlmICgoZHVwX21vZGUgPT0gUFJVTkVfRFVQUykgJiYgc2Vlbih0LCBuYW1lKSkgeworCQlwcmludGYoIi4uLlxuIik7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ZigiOlxuIik7CisJfQorCisJc2VlKHQsIG5hbWUpOworCisJZi50ID0gdDsKKworCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQl1bml4X2Vycigib3BlbiglcykgZmFpbGVkIiwgZmlsZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmLmUgPSBlbGZfYmVnaW4oZmQsIEVMRl9DX1JFQUQsIE5VTEwpOworCWlmICghZi5lKSB7CisJCWVsZl9lcnIoImVsZl9iZWdpbiBmYWlsZWQgb24gJXMiLCBmaWxlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNjbiA9IGZpbmRfc2NuKCZmLCBTSFRfU1RSVEFCLCBOVUxMLCAmc2hkcik7CisJZi5zdHJ0YWJfZGF0YSA9IGVsZl9nZXRkYXRhKHNjbiwgTlVMTCk7CisJaWYgKCFmLnN0cnRhYl9kYXRhKSB7CisJCWFwcF9lcnIoIiVzIGhhcyBubyBzdHJ0YWIgc2VjdGlvbiIsIGZpbGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2NuID0gTlVMTDsKKwl3aGlsZSAoKHNjbiA9IGZpbmRfc2NuKCZmLCBTSFRfRFlOQU1JQywgc2NuLCAmc2hkcikpKSB7CisJCWR1bXBfZHluYW1pYygmZiwgc2NuLCAmc2hkcik7CisJfQorCisJZWxmX2VuZChmLmUpOworCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGVsZnRyZWUgWyAtcyB8IC1oIF0gZWxmLWZpbGVcbiIKKwkgICAgICAgICAgICAgICAgIiAgLVMgIER1cGxpY2F0ZSBlbnRpcmUgc3VidHJlZSB3aGVuIGEgZHVwbGljYXRlIGlzIGZvdW5kXG4iCisJCQkiICAtUCAgU2hvdyBkdXBsaWNhdGVzLCBidXQgb25seSBpbmNsdWRlIHN1YnRyZWUgb25jZVxuIgorCQkJIiAgLUggIFNob3cgZWFjaCBsaWJyYXJ5IGF0IG1vc3Qgb25jZSwgZXZlbiBpZiBkdXBsaWNhdGVkXG4iCisJCQkiICAtaCAgU2hvdyB0aGlzIGhlbHAgc2NyZWVuXG4iKTsKK30KKworc3RhdGljIGludCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLVMiKSkgeworCQkJZHVwX21vZGUgPSBTSE9XX0RVUFM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLVAiKSkgeworCQkJZHVwX21vZGUgPSBQUlVORV9EVVBTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1IIikpIHsKKwkJCWR1cF9tb2RlID0gSElERV9EVVBTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKwkJCXVzYWdlKCk7CisJCQlleGl0KDApOworCQl9IGVsc2UgeworCQkJYXBwX2VycigiVW5leHBlY3RlZCBhcmd1bWVudCBcIiVzXCIhXG4iLCBhcmd2W2ldKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJvb3RfbmFtZSA9IGFyZ3ZbYXJnYyAtIDFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9zZWFyY2hfZGlycyh2b2lkKQoreworCWNoYXIgKnJlbHBhdGg7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKworCXJlbHBhdGggPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKKwlpZiAoIXJlbHBhdGgpIHsKKwkJYXBwX2VycigiV2FybmluZzogQU5EUk9JRF9QUk9EVUNUX09VVCBub3Qgc2V0OyAiCisJCSAgICAgICAgInVzaW5nIGN1cnJlbnQgZGlyZWN0b3J5LlxuIik7CisJCXJlbHBhdGggPSAiLiI7CisJfQorCisJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIHJlbHBhdGgsICJzeXN0ZW0vbGliIik7CisJYWRkX3NlYXJjaF9kaXIocGF0aCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHRyZWVfc3RhdGUgdDsKKworCWlmIChhcmdjIDwgMiB8fCBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpKSB7CisJCXVzYWdlKCk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCkgPT0gRVZfTk9ORSkgeworCQllbGZfZXJyKCJ2ZXJzaW9uIG1pc21hdGNoIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwl0LmxldmVsID0gMDsKKwl0LnNlZW4gID0gTlVMTDsKKworCWFkZF9zZWFyY2hfZGlycygpOworCisJZHVtcF9maWxlKCZ0LCByb290X25hbWUsIHJvb3RfbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xhYnByZXRlc3QvUkVBRE1FIGIvdG9vbHMvbGFicHJldGVzdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4OTAzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xhYnByZXRlc3QvUkVBRE1FCkBAIC0wLDAgKzEsNTMgQEAKK092ZXJ2aWV3OgorCitUaGUgbGFicHJldGVzdC5zaCBzY3JpcHQgaXMgZGVzaWduZWQgdG8gZW11bGF0ZSBhIHR5cGljYWwgYXV0b21hdGVkIHRlc3QgbGFiCitzZXNzaW9uLiAgSXQgcHV0cyBhIGRldmljZSBpbnRvIGJvb3Rsb2FkZXIgbW9kZSwgcmVib290cyBpbnRvIGJvb3Rsb2FkZXIgbW9kZSwKK2RldGVybWluZXMgZGV2aWNlIHR5cGUsIGVyYXNlcyB1c2VyIGNhY2hlLCBmbGFzaGVzIGEgZ2VuZXJpYyB1c2VyZGF0YSBpbWFnZSwKK3VwZGF0ZXMgdGhlIGJvb3Rsb2FkZXIgaW1hZ2UsIHVwZGF0ZXMgdGhlIHJhZGlvIGltYWdlLCB1cGRhdGVzIHRoZSBzeXN0ZW0gaW1hZ2UKK2FuZCByZWJvb3RzLCBzZXRzIHVwIGZvciBhIG1vbmtleSBydW4gYW5kIGZpbmFsbHkgcnVucyBhIHJhbmRvbSBtb25rZXkgdGVzdC4KK0l0IHdpbGwgcmVwZWF0IHRoaXMgYmFzZWQgb24gYW4gb3B0aW9uYWwgcGFyYW1ldGVyKC1pKSBvciBkZWZhdWx0IHRvIDEwMCB0aW1lcy4KK0l0IHdpbGwgZGV0ZWN0IGlmIGl0IGlzIGluIGEgbG93IGJhdHRlcnkgc2l0dWF0aW9uIGFuZCB3YWl0IGZvciBpdCB0byBjaGFyZ2UKK2FnYWluLgorCitUaGUgZ29hbCBpcyB0byBzZWUgaWYgYSBkZXZpY2UgaXMgcmVhZHkgZm9yIGRlcGxveW1lbnQgdG8gYXV0b21hdGVkIGxhYiB0ZXN0aW5nCithbmQgY2FuIGFsc28gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBsYWIgaW5mcmFzdHJ1Y3R1cmUgaXMgcmVhZHkgZm9yIGRldmljZXMuCitUaGUgaWRlYSBpcyB0byBydW4gdGhpcyBzY3JpcHQgYXQgdGhlIHNhbWUgdGltZSBmb3IgbXVsdGlwbGUgZGV2aWNlcywgdHlwaWNhbGx5CitJIHdvdWxkIGNvbm5lY3QgOCBkZXZpY2VzIHRvIGEgaG9zdCBhbmQgcnVuIHRoaXMgc2NyaXB0IGluIDggc2VwYXJhdGUgc2hlbGwKK3Nlc3Npb25zIGFuZCB3YXRjaCBmb3IgZmFpbHVyZXMuCisKK1J1bm5pbmcgdGhlIHNjcmlwdDoKKworSWYgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBob3N0IHlvdSBjYW4gc2ltcGx5IGp1c3QgcnVuIHRoZQorc2NyaXB0LCBpdCB3aWxsIGRldGVjdCB0aGUgZGV2aWNlIGFuZCBnbyB0aHJvdWdoIDEwMCBjeWNsZXMsIHJ1bm5pbmcgdGhlIG1vbmtleQorZm9yIDIwMCBldmVudHMgZWFjaCBjeWNsZS4gIFRoZSBzY3JpcHQgaWdub3JlcyBub3JtYWwgbW9ua2V5IGZhaWx1cmVzLiBJZiB5b3UKK2hhdmUgbXVsdGlwbGUgZGV2aWNlcyBhdHRhY2hlZCB1c2UgdGhlIC1kIDxkZXZpY2VfaWQ+IHBhcmFtZXRlciB0byB0YXJnZXQgYQorc3BlY2lmaWMgZGV2aWNlcy4gIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgLWkgZm9yIGhvdyBtYW55IGN5Y2xlcyBhbmQgLW0gZm9yCitob3cgbWFueSBtb25rZXkgZXZlbnRzIGFuZCBmaW5hbGx5IC14IHRvIG1ha2UgaXQgc2tpcCB0aGUgbW9ua2V5IHJ1biBwb3J0aW9uCithbHRvZ2V0aGVyLgorCitBZGRpbmcgc3VwcG9ydCBmb3IgbmV3IGRldmljZXMgb3IgZnJvbSBzY3JhdGNoOgorCitUaGUgc2NyaXB0IHVzZXMgaW5jbHVkZWQgY29waWVzIG9mIGFkYiBhbmQgZmFzdGJvb3Qgd2hpY2ggYXJlIGluIGluIHRoZSB0b29scy8KK3N1YiBkaXJlY3RvcnkuIElmIHlvdSBhcmUgc2V0dGluZyB0aGlzIHVwIHdpdGggb25seSB0aGUgc2NyaXB0LCBjcmVhdGUgYSB0b29scworc3ViIGRpcmVjdG9yeSBhbmQgcHV0IGFkYiBhbmQgZmFzdGJvb3QgaW4gaXQgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBleGVjdXRhYmxlLgorQ3VycmVudGx5IHdlIHVzZSB1c2VyZGVidWcgYnVpbGRzLgorCitIZXJlIGFyZSB0aGUgc3RlcHMgdG8gYWRkIGEgbmV3IGRldmljZToKKworICAxKSBDcmVhdGUgYSBuZXcgc3ViIGRpcmVjdG9yeSB1c2luZyB0aGUgcmVzdWx0IG9mICJmYXN0Ym9vdCBnZXR2YXIgcHJvZHVjdCIuCisgIDIpIENvcHkgYSBidWlsZCBpbWFnZSB0byB0aGUgbmV3IHN1YiBkaXJlY3RvcnkgaW4gb3VyIGZvcm1hdC4KKyAgICAgKGkuZS4gcGFzc2lvbi1pbWctMjQ4MjcuemlwKQorICAzKSBDb3B5IGEgYm9vdCBpbWFnZSB0byB0aGUgbmV3IHN1YiBkaXJlY3RvcnkgaW4gb3VyIGZvcm1hdC4KKyAgICAgKGkuZS4gaGJvb3QuMC4zMy4yMDEyLmltZykKKyAgNCkgQ29weSBhIHJhZGlvIGltYWdlIHRvIHRoZSBuZXcgc3ViIGRpcmVjdG9yeSBpbiBvdXIgZm9ybWF0LgorICAgICAoaS5lLiByYWRpby40LjA0LjAwLjAzXzIuaW1nKQorICA1KSBDb3B5IGEgdXNlcmRhdGEuaW1nIGZpbGUsIHBvc3NpYmx5IGZyb20gb25lIG9mIHRoZSBvdGhlciBkaXJlY3Rvcmllcy4KKworQ3VzdG9taXphdGlvbnMgdG8gdGhlIGZsYXNoaW5nIHByb2Nlc3MgYXJlIGhhbmRsZWQgYnkgYWRkaW5nIGEgY3VzdG9tX2ZsYXNoLnNoCitmaWxlIHRoYXQgaXMgcmVhZCBpbiBiZWZvcmUgdGhlIG1haW4gbG9vcCBzdGFydHMuIEl0IGFsbG93cyB5b3UgdG8gYWRkIGFueSBub24KK2dlbmVyaWMgZnVuY3Rpb25zIG9yIGRldGFpbHMgdG8gdGhlIGZsYXNoaW5nIHByb2Nlc3MuIFlvdSBtdXN0IHVzZSBpdCB0byBkZWZpbmUKK3RoZSB2YXJpYWJsZSAiYm9vdHBhcnQiIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuIEFsc28sIHVzZSB0aGlzIGZpbGUgdG8KK3Jld3JpdGUgdGhlIGZsYXNoX2RldmljZSBmdW5jdGlvbiBhbmQgYW55IG90aGVycywgZXRjLi4uCisKK1RoZSBzY3JpcHQgc2hvdWxkIGhhbmRsZSB0aGUgcmVzdCwgdW5sZXNzIHRoZXJlIGFyZSByYWRpY2FsIGNoYW5nZXMgdG8gZmlsZQorbmFtZXMgb3IgdGhlIHByb2Nlc3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGFicHJldGVzdC9jcmVzcG8vY3VzdG9tX2ZsYXNoLnNoIGIvdG9vbHMvbGFicHJldGVzdC9jcmVzcG8vY3VzdG9tX2ZsYXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjI1ODMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYWJwcmV0ZXN0L2NyZXNwby9jdXN0b21fZmxhc2guc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQXV0aG9yOiBiZ2F5QGdvb2dsZS5jb20gKEJydWNlIEdheSkKKyMKKyMgdXNlZCBmb3IgZmxhc2hpbmcgYm9vdGxvYWRlciBpbWFnZSBvbiBzaG9sZXMKKworQk9PVFBBUlQ9J2Jvb3Rsb2FkZXInCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSBib290IHBhcnRpdGlvbiBhbmQKKyMgYm9vdGZpbGUsIHRoZW4gZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIEJPT1RQQVJUCisjICAgYm9vdGxvYWRlcmZpbGUKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX2Jvb3Rsb2FkZXJfaW1hZ2UoKQoreworICBpZiBbICRwcm9kdWN0ICE9ICJjcmVzcG8iIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgIldyb25nIGRldmljZSB0eXBlLCBleHBlY3RlZCBjcmVzcG8hIgorICAgIGV4aXQKKyAgZmkKKyAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJnZXR0aW5nIGJvb3Rsb2FkZXIgZmlsZSBmb3IgJHByb2R1Y3QiCisgICAgYm9vdGxvYWRlcmZpbGU9YGxzIC0xICRST09ULyRwcm9kdWN0LyB8IHNlZCAtbiAncy9eXChib290bG9hZGVyXC5bMC05QS1aYS16X10qLmltZ1wpXG4qL1wxLyBwJ2AKKyAgICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIGVtcHR5OiAkYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJib290bG9hZGVyIGZpbGUgbm90IGZvdW5kOiAuLyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGxvZ19wcmludCAidXNpbmcgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIGFzIGJvb3Rsb2FkZXIgaW1hZ2UgZmlsZSIKKyAgZmkKKyAgbG9nX3ByaW50ICJkb3dubG9hZGluZyBib290bG9hZGVyIGltYWdlIHRvICRkZXZpY2UiCisgIGZsYXNoX3BhcnRpdGlvbiAkQk9PVFBBUlQgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlCisgIHJlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fZmFzdGJvb3QKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZsYXNoZXMgdGhlIHVzZXJkYXRhIHBhcnRpdGlvbgorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF91c2VyZGF0YV9pbWFnZSgpCit7CisgICNjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBzbyBleGl0aW5nIGVhcmx5Li4uIgorICBsb2dfcHJpbnQgInNraXBwaW5nIHVwZGF0ZSBvZiB1c2VyZGF0YS5pbWcsIG5vdCBzdXBwb3J0ZWQgeWV0LiIKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNldHMgdGhlIG5hbWUgb2YgdGhlIHJhZGlvIHBhcnRpdGlvbiBhbmQKKyMgcmFkaW9maWxlIGFuZCBmbGFzaGVzIGRldmljZQorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgcmFkaW9maWxlCisjICAgcmFkaW9wYXJ0CisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9yYWRpb19pbWFnZSgpCit7CisgICNjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBzbyBleGl0aW5nIGVhcmx5Li4uIgorICBsb2dfcHJpbnQgInNraXBwaW5nIHVwZGF0ZSBvZiByYWRpbyBwYXJ0aXRpb24sIG5vdCBzdXBwb3J0ZWQgeWV0LiIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xhYnByZXRlc3QvbGFicHJldGVzdC5zaCBiL3Rvb2xzL2xhYnByZXRlc3QvbGFicHJldGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MjIzOGYwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGFicHJldGVzdC9sYWJwcmV0ZXN0LnNoCkBAIC0wLDAgKzEsNTgyIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBBdXRob3I6IGJnYXlAZ29vZ2xlLmNvbSAoQnJ1Y2UgR2F5KQorIworIyBUaGUgbGFicHJldGVzdC5zaCBzY3JpcHQgaXMgZGVzaWduZWQgdG8gZW11bGF0ZSBhIHR5cGljYWwgYXV0b21hdGVkIHRlc3QgbGFiCisjIHNlc3Npb24uICBJdCBwdXRzIGEgZGV2aWNlIGludG8gYm9vdGxvYWRlciBtb2RlLCByZWJvb3RzIGludG8gYm9vdGxvYWRlciBtb2RlLAorIyBkZXRlcm1pbmVzIGRldmljZSB0eXBlLCBlcmFzZXMgdXNlciBjYWNoZSwgZmxhc2hlcyBhIGdlbmVyaWMgdXNlcmRhdGEgaW1hZ2UsCisjIHVwZGF0ZXMgdGhlIGJvb3Rsb2FkZXIgaW1hZ2UsIHVwZGF0ZXMgdGhlIHJhZGlvIGltYWdlLCB1cGRhdGVzIHRoZSBzeXN0ZW0KKyMgaW1hZ2UgYW5kIHJlYm9vdHMsIHNldHMgdXAgZm9yIGEgbW9ua2V5IHJ1biBhbmQgZmluYWxseSBydW5zIGEgcmFuZG9tIG1vbmtleQorIyB0ZXN0LiBJdCB3aWxsIHJlcGVhdCB0aGlzIGJhc2VkIG9uIGFuIG9wdGlvbmFsIHBhcmFtZXRlcigtaSkgb3IgZGVmYXVsdCB0byAxMDAKKyMgdGltZXMuIEl0IHdpbGwgZGV0ZWN0IGlmIGl0IGlzIGluIGEgbG93IGJhdHRlcnkgc2l0dWF0aW9uIGFuZCB3YWl0IGZvciBpdCB0bworIyBjaGFyZ2UgYWdhaW4uCisKKworQ09VTlQ9MTAwCitST09UPSQoY2QgYGRpcm5hbWUgJDBgICYmIHB3ZCkKK0FEQj0iJFJPT1QvdG9vbHMvYWRiIgorRkFTVEJPT1Q9IiRST09UL3Rvb2xzL2Zhc3Rib290IgorTUVWRU5UUz0yMDAKK05PTU9OS0VZPTAKKworYnVpbGRmaWxlPScnCitkZXZpY2U9JycKK3Byb2R1Y3Q9JycKK2Jvb3RwYXJ0PScnCitib290ZmlsZT0nJworCit3aGlsZSBnZXRvcHRzICJkOmk6Om06eGgiIG9wdGlvbk5hbWU7IGRvCisgIGNhc2UgIiRvcHRpb25OYW1lIiBpbgorICAgIGQpIGRldmljZT0iJE9QVEFSRyI7OworICAgIGkpIENPVU5UPSRPUFRBUkc7OworICAgIG0pIE1FVkVOVFM9JE9QVEFSRzs7CisgICAgeCkgTk9NT05LRVk9MTs7CisgICAgaCkgZWNobyAib3B0aW9uczogWy1kIDxkZXZpY2UgSUQ+LCAtaSA8bG9vcCBjb3VudD4sIC1tIDxtb25rZXkgZXZlbnRzPiAteCAoc2tpcHMgbW9ua2V5KV0iOyBleGl0OzsKKyAgICAqKSBlY2hvICJpbnZhbGlkIHBhcmFtZXRlciAtJG9wdGlvbk5hbWUiOyBleGl0IC0xOzsKKyAgZXNhYworZG9uZQorCitkZWNsYXJlIC1yIENPVU5UCitkZWNsYXJlIC1yIE1FVkVOVFMKK2RlY2xhcmUgLXIgTk9NT05LRVkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUHJpbnRzIG91dHB1dCB0byBjb25zb2xlIHdpdGggdGltZSBzdGFtcAorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbG9nX3ByaW50KCkKK3sKKyAgaWYgWyAteiAiJDEiIF07IHRoZW4KKyAgICBlY2hvICIjICQoZGF0ZSArJyVEICVUJykiCisgIGVsc2UKKyAgICBlY2hvICIjICQoZGF0ZSArJyVEICVUJyk6ICQxIgorICBmaQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmxvY2tzIHVudGlsIGJhdHRlcnkgbGV2ZWwgaXMgYXQgbGVhc3QKKyMgYWJvdmUgVEFSR0VUIGlmIGJlbG93IExJTUlUCisjIEdsb2JhbHM6CisjICAgQURCCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit3YWl0X2Zvcl9iYXR0ZXJ5KCkKK3sKKyAgVEFSR0VUPTgwCisgIExJTUlUPTIwCisgIGxvY2FsIGJhdHRlcnkKKyAgbG9jYWwgdGljaworICBsb2dfcHJpbnQgImNoZWNraW5nIGJhdHRlcnkgbGV2ZWwiCisgIHdoaWxlIFsgIiRiYXR0ZXJ5IiA9ICIiIF07IGRvCisgICAgYmF0dGVyeT1gJEFEQiAtcyAkZGV2aWNlIHNoZWxsIGR1bXBzeXMgYmF0dGVyeSB8IHRyIC1kICdccicgfCBhd2sgJy9sZXZlbDovIHtwcmludCAkMn0nYAorICAgIHNsZWVwIDIKKyAgZG9uZQorICBpZiBbICRiYXR0ZXJ5IC1sdCAkTElNSVQgXTsgdGhlbgorICAgIGxvZ19wcmludCAiQmF0dGVyeSBpcyBsb3csIHdhaXRpbmcgZm9yIGNoYXJnZSIKKyAgICB3aGlsZSB0cnVlOyBkbworICAgICAgYmF0dGVyeT1gJEFEQiAtcyAkZGV2aWNlIHNoZWxsIGR1bXBzeXMgYmF0dGVyeSB8IHRyIC1kICdccicgfCBhd2sgJy9sZXZlbDovIHtwcmludCAkMn0nYAorICAgICAgaWYgKCggJGJhdHRlcnkgPj0gJFRBUkdFVCApKTsgdGhlbiBicmVhazsgZmkKKyAgICAgIHRpY2s9JFskVEFSR0VUIC0gJGJhdHRlcnldCisgICAgICBlY2hvICJiYXR0ZXJ5IGNoYXJnZSBsZXZlbCBpcyAkYmF0dGVyeSwgc2xlZXBpbmcgZm9yICR0aWNrIHNlY29uZHMiCisgICAgICBzbGVlcCAkWyRUQVJHRVQgLSAkYmF0dGVyeSAqIDEwXQorICAgIGRvbmUKKyAgICBsb2dfcHJpbnQgInJlc3VtaW5nIHRlc3QgcnVuIHdpdGggYmF0dGVyeSBsZXZlbCBhdCAkYmF0dGVyeSUiCisgIGVsc2UKKyAgICBsb2dfcHJpbnQgInJlc3VtaW5nIHRlc3QgcnVuIHdpdGggYmF0dGVyeSBsZXZlbCBhdCAkYmF0dGVyeSUiCisgIGZpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCbG9ja3MgdW50aWwgZGV2aWNlIGlzIGluIGZhc3Rib290IG1vZGUgb3IKKyMgdGltZSBvdXQgaXMgcmVhY2hlZAorIyBHbG9iYWxzOgorIyAgIGxvb3AKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Zhc3Rib290X3dhaXRfZm9yX2RldmljZSgpCit7CisgIGxvY2FsIGZkZXZpY2U9IiIKKyAgbG9jYWwgbj0wCisgIHdoaWxlIFsgIiRkZXZpY2UiICE9ICIkZmRldmljZSIgLWEgJG4gLWxlIDMwIF07IGRvCisgICAgc2xlZXAgNgorICAgIGZkZXZpY2U9YCRGQVNUQk9PVCBkZXZpY2VzIHwgc2VkIC1uICJzL1woJGRldmljZVwpLiovXDEvIHAiYAorICAgIGxldCBuKz0xCisgIGRvbmUKKyAgaWYgWyAkbiAtZ3QgMzAgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZGV2aWNlIHRpbWUgb3V0IGFmdGVyICRsb29wIGl0ZXJhdGlvbnMiCisgICAgZXhpdAorICBlbHNlCisgICAgbG9nX3ByaW50ICJkZXZpY2UgcmV0dXJuZWQgYW5kIGF2YWlsYWJsZSIKKyAgZmkKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJlYm9vdHMgZGV2aWNlIGludG8gZmFzdGJvb3QgbW9kZSBvcgorIyB0aW1lIG91dCBpcyByZWFjaGVkCisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgQURCCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCityZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2FkYigpCit7CisgIGxvZ19wcmludCAicmVib290aW5nIGludG8gYm9vdGxvYWRlciBhbmQgd2FpdGluZyBmb3IgYXZhaWxhYmlsaXR5IHZpYSBmYXN0Ym9vdCIKKyAgJEFEQiAtcyAkZGV2aWNlIHJlYm9vdCBib290bG9hZGVyCisgIGZhc3Rib290X3dhaXRfZm9yX2RldmljZQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcmVib290cyBkZXZpY2UgaW50byBmYXN0Ym9vdCBtb2RlIG9yCisjIHRpbWVzIG91dAorIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEZBU1RCT09UCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCityZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290KCkKK3sKKyAgbG9nX3ByaW50ICJyZWJvb3RpbmcgaW50byBib290bG9hZGVyIGFuZCB3YWl0aW5nIGZvciBhdmFpbGFiaWxpdHkgdmlhIGZhc3Rib290IgorICAkRkFTVEJPT1QgLXMgJGRldmljZSByZWJvb3QtYm9vdGxvYWRlcgorICBmYXN0Ym9vdF93YWl0X2Zvcl9kZXZpY2UKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJlYm9vdHMgZGV2aWNlIGZyb20gZmFzdGJvb3QgdG8gYWRiIG9yCisjIHRpbWVzIG91dAorIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEZBU1RCT09UCisjICAgQURCCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCityZWJvb3RfaW50b19hZGJfZnJvbV9mYXN0Ym9vdCgpCit7CisgIGxvZ19wcmludCAicmVib290aW5nIGFuZCB3YWl0aW5nIGZvciBhdmFpbGFiaWxpdHkgdmlhIGFkYiIKKyAgJEZBU1RCT09UIC1zICRkZXZpY2UgcmVib290CisgICRBREIgLXMgJGRldmljZSB3YWl0LWZvci1kZXZpY2UKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJlYm9vdHMgZGV2aWNlIGZyb20gZmFzdGJvb3QgdG8gYWRiIG9yCisjIHRpbWVzIG91dAorIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEFEQgorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIword2FpdF9mb3JfYm9vdF9jb21wbGV0ZSgpCit7CisgIGxvZ19wcmludCAid2FpdGluZyBmb3IgZGV2aWNlIHRvIGZpbmlzaCBib290aW5nIgorICBsb2NhbCByZXN1bHQ9JCgkQURCIC1zICRkZXZpY2Ugc2hlbGwgZ2V0cHJvcCBkZXYuYm9vdGNvbXBsZXRlKQorICBsb2NhbCByZXN1bHRfdGVzdD0ke3Jlc3VsdDoxOjF9CisgIGVjaG8gLW4gIi4iCisgIHdoaWxlIFsgLXogJHJlc3VsdF90ZXN0IF07IGRvCisgICAgc2xlZXAgMQorICAgIGVjaG8gLW4gIi4iCisgICAgcmVzdWx0PSQoJEFEQiAtcyAkZGV2aWNlIHNoZWxsIGdldHByb3AgZGV2LmJvb3Rjb21wbGV0ZSkKKyAgICByZXN1bHRfdGVzdD0ke3Jlc3VsdDowOjF9CisgIGRvbmUKKyAgbG9nX3ByaW50ICJmaW5pc2hlZCBib290aW5nIgorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmFzdGJvb3QgZmxhc2hlcyBwYXJ0aXRpb24KKyMKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBGQVNUQk9PVAorIyBBcmd1bWVudHM6CisjICAgY29tbWFuZF9uYW1lCisjICAgY29tbWFuZF9wYXJhbWV0ZXJzCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmYXN0Ym9vdF9jb21tYW5kKCkKK3sKKyAgJEZBU1RCT09UIC1zICRkZXZpY2UgJDEgJDIgJDMKKyAgc2xlZXAgNQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmFzdGJvb3QgY29tbWFuZCB3cmFwcGVyCisjCisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgRkFTVEJPT1QKKyMgQXJndW1lbnRzOgorIyAgIHBhcnRpdGlvbl9uYW1lCisjICAgZmlsZV9uYW1lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9wYXJ0aXRpb24oKQoreworICAkRkFTVEJPT1QgLXMgJGRldmljZSBmbGFzaCAkMSAkMgorICBzbGVlcCA1Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBhZGIgY29tbWFuZCB3cmFwcGVyCisjCisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgQURCCisjIEFyZ3VtZW50czoKKyMgICBjb21tYW5kX25hbWUKKyMgICBjb21tYW5kX3BhcmFtZXRlcnMKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2FkYl9jb21tYW5kKCkKK3sKKyAgJEFEQiAtcyAkZGV2aWNlICQxICQyICQzICQ0ICQ1CisgIHNsZWVwIDUKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNldHMgdGhlIG5hbWUgb2YgdGhlIGJvb3QgcGFydGl0aW9uIGFuZAorIyBib290ZmlsZSwgdGhlbiBmbGFzaGVzIGRldmljZQorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgYm9vdGxvYWRlcmZpbGUKKyMgICBib290cGFydAorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfYm9vdGxvYWRlcl9pbWFnZSgpCit7CisgIGlmIFsgIiRib290cGFydCIgPT0gJycgXTsgdGhlbgorICAgIGxvZ19wcmludCAiYm9vdHBhcnQgbm90IGRlZmluZWQiCisgICAgZXhpdAorICBmaQorICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImdldHRpbmcgYm9vdGxvYWRlciBmaWxlIGZvciAkcHJvZHVjdCIKKyAgICBib290bG9hZGVyZmlsZT1gbHMgLTEgJFJPT1QvJHByb2R1Y3QgfCBzZWQgLW4gJ3MvXCguKmJvb3RbMC05Ll9dXCtpbWdcKS9cMS8gcCdgCisgICAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJvb3Rsb2FkZXIgZmlsZSBlbXB0eTogJGJvb3Rsb2FkZXJmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIG5vdCBmb3VuZDogLi8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBsb2dfcHJpbnQgInVzaW5nICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSBhcyB0aGUgYm9vdGxvYWRlciBpbWFnZSBmaWxlIgorICBmaQorICBsb2dfcHJpbnQgImRvd25sb2FkaW5nIGJvb3Rsb2FkZXIgaW1hZ2UgdG8gJGRldmljZSIKKyAgZmxhc2hfcGFydGl0aW9uICRib290cGFydCAkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUKKyAgcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9mYXN0Ym9vdAorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgcmFkaW8gcGFydGl0aW9uIGFuZAorIyByYWRpb2ZpbGUgYW5kIGZsYXNoZXMgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICByYWRpb2ZpbGUKKyMgICByYWRpb3BhcnQKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX3JhZGlvX2ltYWdlKCkKK3sKKyAgaWYgWyAiJHJhZGlvcGFydCIgPT0gJycgXTsgdGhlbgorICAgIGxvZ19wcmludCAic2V0dGluZyByYWRpbyBwYXJ0aW9uIHRvICdyYWRpbyciCisgICAgcmFkaW9wYXJ0PSdyYWRpbycKKyAgZmkKKyAgaWYgWyAiJHJhZGlvZmlsZSIgPT0gIiIgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyByYWRpbyBmaWxlIGZvciAkcHJvZHVjdCIKKyAgICByYWRpb2ZpbGU9YGxzIC0xICRST09ULyRwcm9kdWN0IHwgc2VkIC1uICdzL1wocmFkaW9bMC05Ll9BLVphLXpdXCtpbWdcKS9cMS8gcCdgCisgICAgaWYgWyAiJHJhZGlvZmlsZSIgPT0gIiIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJyYWRpbyBmaWxlIGVtcHR5OiAkcmFkaW9maWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdC8kcmFkaW9maWxlIiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgInJhZGlvIGZpbGUgbm90IGZvdW5kOiAuLyRwcm9kdWN0LyRyYWRpb2ZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBsb2dfcHJpbnQgInVzaW5nICRST09ULyRwcm9kdWN0LyRyYWRpb2ZpbGUgYXMgdGhlIHJhZGlvIGltYWdlIGZpbGUiCisgIGZpCisgIGxvZ19wcmludCAiZG93bmxvYWRpbmcgcmFkaW8gaW1hZ2UgdG8gJGRldmljZSIKKyAgZmxhc2hfcGFydGl0aW9uICRyYWRpb3BhcnQgICRST09ULyRwcm9kdWN0LyRyYWRpb2ZpbGUKKyAgcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9mYXN0Ym9vdAorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgYm9vdCBwYXJ0aXRpb24gYW5kCisjIGJvb3RmaWxlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBidWlsZGZpbGUKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX3N5c3RlbV9pbWFnZSgpCit7CisgIGlmIFsgIiRidWlsZGZpbGUiID09ICIiIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImdldHRpbmcgYnVpbGQgZmlsZSBmb3IgJHByb2R1Y3QiCisgICAgYnVpbGRmaWxlPWBcbHMgLTEgJFJPT1QvJHByb2R1Y3QgMj4mMSB8IHNlZCAtbiAncy9cKFthLXpdXCstaW1nLVswLTldXCsuemlwXCkvXDEvIHAnYAorICAgIGlmIFsgIiRidWlsZGZpbGUiID09ICIiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYnVpbGQgZmlsZSBlbXB0eTogJGJ1aWxkZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGlmIFsgISAtZSAiJFJPT1QvJHByb2R1Y3QvJGJ1aWxkZmlsZSIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJidWlsZCBmaWxlIG5vdCBmb3VuZDogLi8kcHJvZHVjdC8kYnVpbGRmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgbG9nX3ByaW50ICJ1c2luZyAkUk9PVC8kcHJvZHVjdC8kYnVpbGRmaWxlIGFzIHRoZSBzeXN0ZW0gaW1hZ2UgZmlsZSIKKyAgZmkKKyAgbG9nX3ByaW50ICJkb3dubG9hZGluZyBzeXN0ZW0gaW1hZ2UgdG8gJGRldmljZSIKKyAgZmFzdGJvb3RfY29tbWFuZCB1cGRhdGUgJFJPT1QvJHByb2R1Y3QvJGJ1aWxkZmlsZQorCit9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmxhc2hlcyB0aGUgdXNlcmRhdGEgcGFydGl0aW9uCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX3VzZXJkYXRhX2ltYWdlKCkKK3sKKyAgbG9nX3ByaW50ICJmbGFzaGluZyB1c2VyZGF0YS4uLiIKKyAgaWYgWyAtZSAkUk9PVC8kcHJvZHVjdC91c2VyZGF0YS5pbWcgXTt0aGVuCisgICAgZmxhc2hfcGFydGl0aW9uIHVzZXJkYXRhICRST09ULyRwcm9kdWN0L3VzZXJkYXRhLmltZworICBlbHNlCisgICAgbG9nX3ByaW50ICJ1c2VyZGF0YS5pbWcgZmlsZSBub3QgZm91bmQ6ICRST09ULyRwcm9kdWN0L3VzZXJkYXRhLmltZyIKKyAgICBleGl0CisgIGZpCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZsYXNoZXMgdGhlIGRldmljZQorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgRkFTVEJPT1QKKyMgICBib290ZmlsZQorIyAgIGJvb3RwYXJ0CisjICAgcmFkaW9maWxlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9kZXZpY2UoKQoreworICBsb2dfcHJpbnQgImVyYXNpbmcgY2FjaGUuLi4iCisgIGZhc3Rib290X2NvbW1hbmQgZXJhc2UgY2FjaGUKKyAgZmxhc2hfdXNlcmRhdGFfaW1hZ2UKKyAgZmxhc2hfYm9vdGxvYWRlcl9pbWFnZQorICBmbGFzaF9yYWRpb19pbWFnZQorICBmbGFzaF9zeXN0ZW1faW1hZ2UKKyAgI2RldmljZSBoYXMgYmVlbiByZWJvb3RlZAorICBhZGJfY29tbWFuZCB3YWl0LWZvci1kZXZpY2UKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGdldHMgdGhlIGRldmljZSBwcm9kdWN0IHR5cGUgYW5kIHNldHMgcHJvZHVjdAorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgRkFTVEJPT1QKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3NldF9wcm9kdWN0X3R5cGUoKQoreworICBpZiBbICIkcHJvZHVjdCIgPT0gIiIgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyBkZXZpY2UgcHJvZHVjdCB0eXBlIgorICAgIHByb2R1Y3Q9YCRGQVNUQk9PVCAtcyAkZGV2aWNlIGdldHZhciBwcm9kdWN0IDI+JjEgfCBzZWQgLW4gJ3MvcHJvZHVjdDogXChbYS16XSpcKVxuKi9cMS8gcCdgCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdCIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJkZXZpY2UgcHJvZHVjdCBpZCBub3Qgc3VwcG9ydGVkOiAkcHJvZHVjdCIKKyAgICAgIGV4aXQKKyAgICBmaQorICBmaQorICBsb2dfcHJpbnQgInVzaW5nICRwcm9kdWN0IGFzIGRldmljZSBwcm9kdWN0IGlkIgorfQorCisKKworI3N0YXJ0IG9mIHNjcmlwdAorI3Rlc3QgZm9yIGRlcGVuZGVuY2llcworaWYgWyAhIC1lICRBREIgXTsgdGhlbgorICBlY2hvICJFcnJvcjogYWRiIG5vdCBpbiBwYXRoISBQbGVhc2UgY29ycmVjdCB0aGlzLiIKKyAgZXhpdAorZmkKK2lmIFsgISAtZSAkRkFTVEJPT1QgXTsgdGhlbgorICBlY2hvICJFcnJvcjogZmFzdGJvb3Qgbm90IGluIHBhdGghIFBsZWFzZSBjb3JyZWN0IHRoaXMuIgorICBleGl0CitmaQorI2NoZWNrcyB0byBzZWUgaWYgdGhlIGNhbGxlZCBkZXZpY2UgaXMgYXZhaWxhYmxlCitpZiBbICIkZGV2aWNlIiAhPSAiIiBdOyB0aGVuCisgIHRtcGRldmljZT1gJEFEQiBkZXZpY2VzIHwgc2VkIC1uICJzL1woJGRldmljZVwpLiovXDEvIHAiYAorICBpZiBbICIkZGV2aWNlIiAhPSAiJHRtcGRldmljZSIgXTsgdGhlbgorICAgICAgdG1wZGV2aWNlPWAkRkFTVEJPT1QgZGV2aWNlcyB8IHNlZCAtbiAicy9cKCRkZXZpY2VcKS4qL1wxLyBwImAKKyAgICBpZiBbICIkZGV2aWNlIiAhPSAiJHRtcGRldmljZSIgXTsgdGhlbgorICAgICAgZWNobyAiV2FybmluZzogZGV2aWNlIG5vdCBmb3VuZC4uLiAkZGV2aWNlIgorICAgICAgZXhpdAorICAgIGVsc2UKKyAgICAgIGVjaG8gIidEZXZpY2UgJyRkZXZpY2UnIGZvdW5kISciCisgICAgICByZWJvb3RfaW50b19hZGJfZnJvbV9mYXN0Ym9vdAorICAgICAgd2FpdF9mb3JfYm9vdF9jb21wbGV0ZQorICAgIGZpCisgIGZpCitlbHNlCisgIGRldmljZT1gJEFEQiBkZXZpY2VzIHwgc2VkIC1uICdzLy4qXCheWzAtOUEtWl1cezJcfVswLTlBLVpdKlwpLiovXDEvIHAnYAorICBpZiBbIGBlY2hvICRkZXZpY2UgfCB3YyAtd2AgLW5lIDEgXTsgdGhlbgorICAgIGVjaG8gJ1RoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZGV2aWNlIGZvdW5kLCcKKyAgICBlY2hvICdwbGVhc2UgcGFzcyB0aGUgY29ycmVjdCBkZXZpY2UgSUQgaW4gYXMgYSBwYXJhbWV0ZXIuJworICAgIGV4aXQKKyAgZmkKK2ZpCitpZiBbICIkZGV2aWNlIiA9PSAiIiBdOyB0aGVuCisgIGVjaG8gJ0RldmljZSBub3QgZm91bmQgdmlhIGFkYicKKyAgZGV2aWNlPWAkRkFTVEJPT1QgZGV2aWNlcyB8IHNlZCAtbiAncy8uKlwoXlswLTlBLVpdXHsyXH1bMC05QS1aXSpcKS4qL1wxLyBwJ2AKKyAgaWYgWyBgZWNobyAkZGV2aWNlIHwgd2MgLXdgIC1uZSAxIF07IHRoZW4KKyAgICBlY2hvICJUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGRldmljZSBhdmFpbGFibGUsIgorICAgIGVjaG8gInBsZWFzZSBwYXNzIHRoZSBjb3JyZWN0IGRldmljZSBJRCBpbiBhcyBhIHBhcmFtZXRlci4iCisgICAgZXhpdAorICBmaQorICBpZiBbICIkZGV2aWNlIiA9PSAiIiBdOyB0aGVuCisgICAgZWNobyAnRGV2aWNlIG5vdCBmb3VuZCB2aWEgZmFzdGJvb3QsIHBsZWFzZSBpbnZlc3RpZ2F0ZScKKyAgICBleGl0CisgIGVsc2UKKyAgICBlY2hvICdEZXZpY2UgJyRkZXZpY2UnIGZvdW5kIScKKyAgICByZWJvb3RfaW50b19hZGJfZnJvbV9mYXN0Ym9vdAorICAgIHdhaXRfZm9yX2Jvb3RfY29tcGxldGUKKyAgICBlY2hvICdIYW1tZXJpbmcgb24gJyRkZXZpY2UKKyAgZmkKK2Vsc2UKKyAgZWNobyAnSGFtbWVyaW5nIG9uICckZGV2aWNlCitmaQorcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9hZGIKK3NldF9wcm9kdWN0X3R5cGUKK3JlYm9vdF9pbnRvX2FkYl9mcm9tX2Zhc3Rib290Cit3YWl0X2Zvcl9ib290X2NvbXBsZXRlCisKKyNjaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIGEgY3VzdG9tIGZsYXNoIGluZm8gZmlsZSBhbmQgcmV0cmVpdmUgaXQKK2lmIFsgLWUgIiRST09ULyRwcm9kdWN0L2N1c3RvbV9mbGFzaC5zaCIgXTsgdGhlbgorICAuICRST09ULyRwcm9kdWN0L2N1c3RvbV9mbGFzaC5zaAorZmkKK2VjaG8gJCdcblxuJworCisjc3RhcnQgb2YgbG9vcGluZworZm9yICgobG9vcD0xIDsgbG9vcCA8PSAkQ09VTlQgOyBsb29wKysgKSkgOyBkbworICBlY2hvICIiCisgIGVjaG8gIiIKKyAgZWNobyBfX19fX19fX19fX19fX19fICQoZGF0ZSArJyVEICVUJykgLSAkbG9vcCAtICRkZXZpY2UgX19fX19fX19fX19fX19fX19fX19fXworCisgIGxvZ19wcmludCAic2V0dGluZyBhZGIgcm9vdCBhbmQgc2xlZXBpbmcgZm9yIDcgc2Vjb25kcyIKKyAgYWRiX2NvbW1hbmQgcm9vdAorICB3YWl0X2Zvcl9iYXR0ZXJ5CisgIGxvZ19wcmludCAicmVib290aW5nIGludG8gYm9vdGxvYWRlciBhbmQgd2FpdGluZyBmb3IgYXZhaWxhYmlsaXR5IHZpYSBmYXN0Ym9vdCIKKyAgcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9hZGIKKyAgIyBub3QgbmVjZXNzYXJ5LCBidXQgdXNlZnVsIGluIHRlc3RpbmcKKyAgbG9nX3ByaW50ICJ1c2luZyBmYXN0Ym9vdCB0byByZWJvb3QgdG8gYm9vdGxvYWRlciBmb3IgdGVzdCBwdXJwb3NlcyIKKyAgcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9mYXN0Ym9vdAorCisgICNmbGFzaGluZyB0aGUgZGV2aWNlCisgIGZsYXNoX2RldmljZQorCisgICNwcmVwaW5nIGRldmljZSBmb3IgbW9ua2V5IHJ1bgorICBsb2dfcHJpbnQgInNldHRpbmcgYWRiIHJvb3QiCisgIGFkYl9jb21tYW5kIHJvb3QKKyAgbG9nX3ByaW50ICJzZXR0aW5nIHJvLm1vbmtleSBwcm9wZXJ0eSIKKyAgYWRiX2NvbW1hbmQgc2hlbGwgc2V0cHJvcCByby5tb25rZXkgMQorCisgIGxvZ19wcmludCAid2FpdGluZyBmb3IgZGV2aWNlIHRvIGZpbmlzaCBib290aW5nIgorICByZXN1bHQ9JCgkQURCIC1zICRkZXZpY2Ugc2hlbGwgZ2V0cHJvcCBkZXYuYm9vdGNvbXBsZXRlKQorICByZXN1bHRfdGVzdD0ke3Jlc3VsdDoxOjF9CisgIGVjaG8gLW4gIi4iCisgIHdoaWxlIFsgLXogJHJlc3VsdF90ZXN0IF07IGRvCisgICAgc2xlZXAgMQorICAgIGVjaG8gLW4gIi4iCisgICAgcmVzdWx0PSQoJEFEQiAtcyAkZGV2aWNlIHNoZWxsIGdldHByb3AgZGV2LmJvb3Rjb21wbGV0ZSkKKyAgICByZXN1bHRfdGVzdD0ke3Jlc3VsdDowOjF9CisgIGRvbmUKKworICBsb2dfcHJpbnQgImZpbmlzaGVkIGJvb3RpbmciCisgIGxvZ19wcmludCAid2FpdGluZyBmb3IgdGhlIFBhY2thZ2UgTWFuYWdlciIKKyAgcmVzdWx0PSQoJEFEQiAtcyAkZGV2aWNlIHNoZWxsIHBtIHBhdGggYW5kcm9pZCkKKyAgcmVzdWx0X3Rlc3Q9JHtyZXN1bHQ6MDo3fQorICBlY2hvIC1uICIuIgorICB3aGlsZSBbICRyZXN1bHRfdGVzdCAhPSAicGFja2FnZSIgXTsgZG8KKyAgICBzbGVlcCAxCisgICAgZWNobyAtbiAiLiIKKyAgICByZXN1bHQ9JCgkQURCIC1zICRkZXZpY2Ugc2hlbGwgcG0gcGF0aCBhbmRyb2lkKQorICAgIHJlc3VsdF90ZXN0PSR7cmVzdWx0OjA6N30KKyAgZG9uZQorICBlY2hvICJQYWNrYWdlIE1hbmFnZXIgYXZhaWxhYmxlIgorCisgICNsZXRzIHlvdSBzZWUgd2hhdCdzIGdvaW5nIG9uCisgIGxvZ19wcmludCAic2V0dGluZyBzaGVsbCBzdmMgcG93ZXIgc3RheW9uIHRydWUiCisgIGFkYl9jb21tYW5kIHNoZWxsIHN2YyBwb3dlciBzdGF5b24gdHJ1ZQorCisgICNjYWxscyB0aGUgbW9ua2V5IHJ1biBpZiBub3Qgc2tpcHBlZAorICBpZiBbICROT01PTktFWSA9PSAwIF07IHRoZW4KKyAgICBzZWVkPSQoKCQoZGF0ZSArJXMpICUgOTkpKQorICAgIGxvZ19wcmludCAicnVubmluZyBzaG9ydCBtb25rZXkgcnVuLi4uIgorICAgICRBREIgLXMgJGRldmljZSBzaGVsbCBtb25rZXkgLXAgY29tLmFuZHJvaWQuYWxhcm1jbG9jayAtcCBjb20uYW5kcm9pZC5icm93c2VyIC1wIGNvbS5hbmRyb2lkLmNhbGN1bGF0b3IyIC1wIGNvbS5hbmRyb2lkLmNhbGVuZGFyIC1wIGNvbS5hbmRyb2lkLmNhbWVyYSAtcCBjb20uYW5kcm9pZC5jb250YWN0cyAtcCBjb20uZ29vZ2xlLmFuZHJvaWQuZ20gLXAgY29tLmFuZHJvaWQuaW0gLXAgY29tLmFuZHJvaWQubGF1bmNoZXIgLXAgY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMubWFwcyAtcCBjb20uYW5kcm9pZC5tbXMgLXAgY29tLmFuZHJvaWQubXVzaWMgLXAgY29tLmFuZHJvaWQucGhvbmUgLXAgY29tLmFuZHJvaWQuc2V0dGluZ3MgLXAgY29tLmdvb2dsZS5hbmRyb2lkLnN0cmVldCAtcCBjb20uYW5kcm9pZC52ZW5kaW5nIC1wIGNvbS5nb29nbGUuYW5kcm9pZC55b3V0dWJlIC1wIGNvbS5hbmRyb2lkLmVtYWlsIC1wIGNvbS5nb29nbGUuYW5kcm9pZC52b2ljZXNlYXJjaCAgLWMgYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIgIC0taWdub3JlLXNlY3VyaXR5LWV4Y2VwdGlvbnMgIC1zICRzZWVkICRNRVZFTlRTCisgICAgbG9nX3ByaW50ICJmaW5pc2hlZCBydW5uaW5nIG1vbmtleSwgcmluc2UsIHJlcGVhdC4uLiIKKyAgZWxzZQorICAgIGxvZ19wcmludCAiLXggcGFyYW1ldGVyIHVzZWQsIHNraXBwaW5nIHRoZSBtb25rZXkgcnVuIgorICBmaQorCisgIGlmIFsgJGxvb3AgLWVxICRDT1VOVCBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJkZXZpY2UgJGRldmljZSBoYXMgcmV0dXJuZWQsIHRlc3RpbmcgY29tcGxldGVkLCBjb3VudCA9ICRsb29wIgorICAgIGVjaG8gYGVjaG8gIkRldmljZSAkZGV2aWNlIGhhcyByZXR1cm5lZCwgdGVzdGluZyBjb21wbGV0ZWQsIGNvdW50ID0gJGxvb3AuIiA+ICRST09ULyRkZXZpY2UubG9nYAorICBlbHNlCisgICAgbG9nX3ByaW50ICJkZXZpY2UgJGRldmljZSBoYXMgcmV0dXJuZWQsIHJpbnNlIGFuZCByZXBlYXQgY291bnQgPSAkbG9vcCIKKyAgICBlY2hvIGBlY2hvICJEZXZpY2UgJGRldmljZSBoYXMgcmV0dXJuZWQsIHJpbnNlIGFuZCByZXBlYXQgY291bnQgPSAkbG9vcC4iID4gJFJPT1QvJGRldmljZS5sb2dgCisgIGZpCitkb25lCmRpZmYgLS1naXQgYS90b29scy9sYWJwcmV0ZXN0L25leHVzb25lL2N1c3RvbV9mbGFzaC5zaCBiL3Rvb2xzL2xhYnByZXRlc3QvbmV4dXNvbmUvY3VzdG9tX2ZsYXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWQ2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYWJwcmV0ZXN0L25leHVzb25lL2N1c3RvbV9mbGFzaC5zaApAQCAtMCwwICsxLDggQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEF1dGhvcjogYmdheUBnb29nbGUuY29tIChCcnVjZSBHYXkpCisjCisjIHVzZWQgZm9yIGZsYXNoaW5nIGJvb3QgaW1hZ2Ugb24gbmV4dXNvbmUKKworYm9vdHBhcnQ9J2hib290JwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGFicHJldGVzdC9zaG9sZXMvY3VzdG9tX2ZsYXNoLnNoIGIvdG9vbHMvbGFicHJldGVzdC9zaG9sZXMvY3VzdG9tX2ZsYXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDgyMjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYWJwcmV0ZXN0L3Nob2xlcy9jdXN0b21fZmxhc2guc2gKQEAgLTAsMCArMSw1MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQXV0aG9yOiBiZ2F5QGdvb2dsZS5jb20gKEJydWNlIEdheSkKKyMKKyMgdXNlZCBmb3IgZmxhc2hpbmcgYm9vdGxvYWRlciBpbWFnZSBvbiBzaG9sZXMKKworQk9PVFBBUlQ9J21vdG9ib290JworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgYm9vdCBwYXJ0aXRpb24gYW5kCisjIGJvb3RmaWxlLCB0aGVuIGZsYXNoZXMgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBCT09UUEFSVAorIyAgIGJvb3Rsb2FkZXJmaWxlCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9ib290bG9hZGVyX2ltYWdlKCkKK3sKKyAgaWYgWyAkcHJvZHVjdCAhPSAic2hvbGVzIiBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJXcm9uZyBkZXZpY2UgdHlwZSwgZXhwZWN0ZWQgc2hvbGVzISIKKyAgICBleGl0CisgIGZpCisgIGlmIFsgIiRib290bG9hZGVyZmlsZSIgPT0gJycgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyBib290bG9hZGVyIGZpbGUgZm9yICRwcm9kdWN0IgorICAgIHNlY3VyZT1gJGZhc3Rib290IC1zICRkZXZpY2UgZ2V0dmFyIHNlY3VyZSAyPiYxIHwgc2VkIC1uICdzL3NlY3VyZTogXChbYS16XSpcKVxuKi9cMS8gcCdgCisgICAgaWYgWyAiJHNlY3VyZSIgPSAibm8iIF07IHRoZW4KKyAgICAgIGJvb3Rsb2FkZXJmaWxlPWBscyAtMSBzaG9sZXMvIHwgc2VkIC1uICdzL15cKG1vdG9ib290X3Vuc2VjdXJlLlswLTlBLVpdKi5pbWdcKVxuKi9cMS8gcCdgCisgICAgZWxzZQorICAgICAgYm9vdGxvYWRlcmZpbGU9YGxzIC0xIHNob2xlcy8gfCBzZWQgLW4gJ3MvXlwobW90b2Jvb3Rfc2VjdXJlLlswLTlBLVpdKi5pbWdcKVxuKi9cMS8gcCdgCisgICAgZmkKKyAgICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIGVtcHR5OiAkYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJib290bG9hZGVyIGZpbGUgbm90IGZvdW5kOiAuLyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGxvZ19wcmludCAidXNpbmcgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIGFzIHRoZSBib290bG9hZGVyIGltYWdlIGZpbGUiCisgIGZpCisgIGxvZ19wcmludCAiZG93bmxvYWRpbmcgYm9vdGxvYWRlciBpbWFnZSB0byAkZGV2aWNlIgorICBmbGFzaF9wYXJ0aXRpb24gJEJPT1RQQVJUICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZQorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290Cit9CmRpZmYgLS1naXQgYS90b29scy9sYWJwcmV0ZXN0L3N0aW5ncmF5L2N1c3RvbV9mbGFzaC5zaCBiL3Rvb2xzL2xhYnByZXRlc3Qvc3RpbmdyYXkvY3VzdG9tX2ZsYXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2FmMjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYWJwcmV0ZXN0L3N0aW5ncmF5L2N1c3RvbV9mbGFzaC5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBBdXRob3I6IGJnYXlAZ29vZ2xlLmNvbSAoQnJ1Y2UgR2F5KQorIworIyB1c2VkIGZvciBmbGFzaGluZyBib290bG9hZGVyIGltYWdlIG9uIHNob2xlcworCitCT09UUEFSVD0nbW90b2Jvb3QnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSBib290IHBhcnRpdGlvbiBhbmQKKyMgYm9vdGZpbGUsIHRoZW4gZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIEJPT1RQQVJUCisjICAgYm9vdGxvYWRlcmZpbGUKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX2Jvb3Rsb2FkZXJfaW1hZ2UoKQoreworICBpZiBbICRwcm9kdWN0ICE9ICJzdGluZ3JheSIgXTsgdGhlbgorICAgIGxvZ19wcmludCAiV3JvbmcgZGV2aWNlIHR5cGUsIGV4cGVjdGVkIHN0aW5ncmF5ISIKKyAgICBleGl0CisgIGZpCisgIGlmIFsgIiRib290bG9hZGVyZmlsZSIgPT0gJycgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyBib290bG9hZGVyIGZpbGUgZm9yICRwcm9kdWN0IgorICAgIGJvb3Rsb2FkZXJmaWxlPWBscyAtMSAkcHJvZHVjdC8gfCBzZWQgLW4gJ3MvXlwobW90b2Jvb3QuWzAtOUEtWl0qLmltZ1wpXG4qL1wxLyBwJ2AKKyAgICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIGVtcHR5OiAkYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJib290bG9hZGVyIGZpbGUgbm90IGZvdW5kOiAuLyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGxvZ19wcmludCAidXNpbmcgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIGFzIHRoZSBib290bG9hZGVyIGltYWdlIGZpbGUiCisgIGZpCisgIGxvZ19wcmludCAiZG93bmxvYWRpbmcgYm9vdGxvYWRlciBpbWFnZSB0byAkZGV2aWNlIgorICBmbGFzaF9wYXJ0aXRpb24gJEJPT1RQQVJUICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZQorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmbGFzaGVzIHRoZSB1c2VyZGF0YSBwYXJ0aXRpb24KKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfdXNlcmRhdGFfaW1hZ2UoKQoreworICAjY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgc28gZXhpdGluZyBlYXJseS4uLiIKKyAgbG9nX3ByaW50ICJza2lwcGluZyB1cGRhdGUgb2YgdXNlcmRhdGEuaW1nLCBub3Qgc3VwcG9ydGVkIHlldC4iCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSByYWRpbyBwYXJ0aXRpb24gYW5kCisjIHJhZGlvZmlsZSBhbmQgZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIHJhZGlvZmlsZQorIyAgIHJhZGlvcGFydAorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfcmFkaW9faW1hZ2UoKQoreworICAjY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgc28gZXhpdGluZyBlYXJseS4uLiIKKyAgbG9nX3ByaW50ICJza2lwcGluZyB1cGRhdGUgb2YgcmFkaW8gcGFydGl0aW9uLCBub3Qgc3VwcG9ydGVkIHlldC4iCit9CmRpZmYgLS1naXQgYS90b29scy9tYWtlZGljdC9zcmMvY29tL2FuZHJvaWQvdG9vbHMvZGljdC9CaWdyYW1EaWN0aW9uYXJ5LmphdmEgYi90b29scy9tYWtlZGljdC9zcmMvY29tL2FuZHJvaWQvdG9vbHMvZGljdC9CaWdyYW1EaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxMTViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ha2VkaWN0L3NyYy9jb20vYW5kcm9pZC90b29scy9kaWN0L0JpZ3JhbURpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMuZGljdDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCisvKioKKyAqIEhlbHBlciBmb3IgTWFrZUJpbmFyeURpY3Rpb25hcnkKKyAqIERlYWxzIHdpdGggYWxsIHRoZSBiaWdyYW0gZGF0YQorICovCitwdWJsaWMgY2xhc3MgQmlncmFtRGljdGlvbmFyeSB7CisKKyAgICAvKgorICAgICAqIE11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiB0aGUgY2xpZW50IHNpZGUgd2hpY2ggaXMgbG9jYXRlZCBpbiBkaWN0aW9uYXJ5LmNwcCAmIGRpY3Rpb25hcnkuaAorICAgICAqIENoYW5naW5nIHRoZXNlIHZhbHVlcyB3aWxsIGdlbmVyYXRlIHRvdGFsbHkgZGlmZmVyZW50IHN0cnVjdHVyZSB3aGljaCBtdXN0IGJlIGFsc28gcmVmbGVjdGVkCisgICAgICogb24gdGhlIGNsaWVudCBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQklHUkFNX1JFQUQgPSAweDgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQklHUkFNX0NISUxERVhJU1QgPSAweDQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQklHUkFNX0NPTlRJTlVFRCA9IDB4ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CSUdSQU1fRlJFUSA9IDB4N0Y7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JfUkVWRVJTRV9MT09LVVBBTEwgPSAtOTk7CisKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gbUJpZ3JhbVRvRmlsbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW50ZWdlcj4gbUJpZ3JhbVRvRmlsbEFkZHJlc3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKyAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIEJpZ3JhbT4gbUJpOworCisgICAgcHVibGljIGJvb2xlYW4gbUhhc0JpZ3JhbTsKKworICAgIHB1YmxpYyBCaWdyYW1EaWN0aW9uYXJ5KFN0cmluZyBiaWdyYW1TcmNGaWxlbmFtZSwgYm9vbGVhbiBoYXNCaWdyYW0pIHsKKyAgICAgICAgbUhhc0JpZ3JhbSA9IGhhc0JpZ3JhbTsKKyAgICAgICAgbG9hZEJpZ3JhbShiaWdyYW1TcmNGaWxlbmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRCaWdyYW0oU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIG1CaSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmlncmFtPigpOworICAgICAgICBpZiAoIW1IYXNCaWdyYW0pIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIGJpZ3JhbXMgPSAiICsgQmlncmFtLnNCaWdyYW1OdW0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBGaWxlKGZpbGVuYW1lKSwgbmV3IERlZmF1bHRIYW5kbGVyKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB3MSA9IG51bGw7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpbldvcmQxID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpbldvcmQyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW50IGZyZXEgPSAwLCBjb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICBCaWdyYW0gdGVtcEJpZ3JhbSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMoImJpIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluV29yZDEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdzEgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gSW50ZWdlci5wYXJzZUludChhdHRyaWJ1dGVzLmdldFZhbHVlKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCaWdyYW0gPSBuZXcgQmlncmFtKGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHFOYW1lLmVxdWFscygidyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbldvcmQyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3b3JkMiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcSA9IEludGVnZXIucGFyc2VJbnQoYXR0cmlidXRlcy5nZXRWYWx1ZSgxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQmlncmFtLnNldFdvcmQyKGNvdW50ZXIsIHdvcmQyLCBmcmVxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpZ3JhbS5zQmlncmFtTnVtKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluV29yZDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluV29yZDIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbldvcmQxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbldvcmQxID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBtQmkucHV0KHcxLCB0ZW1wQmlncmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGJpZ3JhbVxuIiArIGlvZSk7CisgICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgYmlncmFtcyA9ICIgKyBCaWdyYW0uc0JpZ3JhbU51bSk7CisgICAgfQorCisgICAgYnl0ZVtdIHdyaXRlQmlncmFtcyhieXRlW10gZGljdCwgTWFwPFN0cmluZywgSW50ZWdlcj4gbURpY3Rpb25hcnkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQmlncmFtVG9GaWxsLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgdzEgPSBtQmlncmFtVG9GaWxsLmdldChpKTsKKyAgICAgICAgICAgIGludCBhZGRyZXNzID0gbUJpZ3JhbVRvRmlsbEFkZHJlc3MuZ2V0KGkpOworCisgICAgICAgICAgICBCaWdyYW0gdGVtcCA9IG1CaS5nZXQodzEpOworICAgICAgICAgICAgaW50IHdvcmQyQ291bnQgPSB0ZW1wLmNvdW50OworICAgICAgICAgICAgaW50IGo0OworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3b3JkMkNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1EaWN0aW9uYXJ5LmNvbnRhaW5zS2V5KHRlbXAud29yZDJbal0pKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGluIGRpY3Rpb25hcnk6ICIgKyB0ZW1wLndvcmQyW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgajQgPSAoaiAqIDQpOworICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcmVzc09mV29yZDIgPSBtRGljdGlvbmFyeS5nZXQodGVtcC53b3JkMltqXSk7CisgICAgICAgICAgICAgICAgICAgIGRpY3RbYWRkcmVzcyArIGo0ICsgMF0gPSAoYnl0ZSkgKCgoYWRkcmVzc09mV29yZDIgJiAweDNGMDAwMCkgPj4gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFHX0JJR1JBTV9SRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgZGljdFthZGRyZXNzICsgajQgKyAxXSA9IChieXRlKSAoKGFkZHJlc3NPZldvcmQyICYgMHgwMEZGMDApID4+IDgpOworICAgICAgICAgICAgICAgICAgICBkaWN0W2FkZHJlc3MgKyBqNCArIDJdID0gKGJ5dGUpICgoYWRkcmVzc09mV29yZDIgJiAweDAwMDBGRikpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChqID09ICh3b3JkMkNvdW50IC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RbYWRkcmVzcyArIGo0ICsgM10gPSAoYnl0ZSkgKHRlbXAuZnJlcVtqXSAmIEZMQUdfQklHUkFNX0ZSRVEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGljdFthZGRyZXNzICsgajQgKyAzXSA9IChieXRlKSAoKHRlbXAuZnJlcVtqXSAmIEZMQUdfQklHUkFNX0ZSRVEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19CSUdSQU1fQ09OVElOVUVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkaWN0OworICAgIH0KKworICAgIHZvaWQgcmV2ZXJzZUxvb2t1cEFsbChNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtRGljdGlvbmFyeSwgYnl0ZVtdIGRpY3QpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gc3QgPSBtRGljdGlvbmFyeS5rZXlTZXQoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IHN0KSB7CisgICAgICAgICAgICBzZWFyY2hGb3JUZXJtaW5hbE5vZGUobURpY3Rpb25hcnkuZ2V0KHMpLCBGT1JfUkVWRVJTRV9MT09LVVBBTEwsIGRpY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZWFyY2hGb3JUZXJtaW5hbE5vZGUoaW50IGJpZ3JhbUFkZHJlc3MsIGludCBmcmVxdWVuY3ksIGJ5dGVbXSBkaWN0KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcig0OCk7CisgICAgICAgIGludCBwb3M7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaW50IGZvbGxvd0Rvd25CcmFuY2hBZGRyZXNzID0gMjsKKyAgICAgICAgY2hhciBmb2xsb3dpbmdDaGFyID0gJyAnOworICAgICAgICBpbnQgZGVwdGggPSAwOworICAgICAgICBpbnQgdG90YWxMb29wQ291bnQgPSAwOworCisgICAgICAgIHdoaWxlICghZm91bmQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZm9sbG93RG93bkFkZHJlc3NTZWFyY2hTdG9wID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0QWRkcmVzcyA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGhhdmVUb1NlYXJjaEFsbCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZm9sbG93aW5nQ2hhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgPSBmb2xsb3dEb3duQnJhbmNoQWRkcmVzczsgLy8gcG9zIHN0YXJ0IGF0IGNvdW50CisgICAgICAgICAgICBpbnQgY291bnQgPSBkaWN0W3Bvc10gJiAweEZGOworICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b3RhbExvb3BDb3VudCsrOworICAgICAgICAgICAgICAgIC8vIHBvcyBhdCBkYXRhCisgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgLy8gcG9zIG5vdyBhdCBmbGFnCisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQmluYXJ5RGljdGlvbmFyeS5nZXRGaXJzdEJpdE9mQnl0ZShwb3MsIGRpY3QpKSB7IC8vIG5vbi10ZXJtaW5hbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGxvd0Rvd25BZGRyZXNzU2VhcmNoU3RvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHIgPSBNYWtlQmluYXJ5RGljdGlvbmFyeS5nZXQyMkJpdEFkZHJlc3MocG9zLCBkaWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyID4gYmlncmFtQWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd0Rvd25BZGRyZXNzU2VhcmNoU3RvcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0QWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFkZHJlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVRvU2VhcmNoQWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXZlVG9TZWFyY2hBbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dEb3duQnJhbmNoQWRkcmVzcyA9IGFkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nQ2hhciA9IChjaGFyKSAoMHhGRiAmIGRpY3RbcG9zLTFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmaXJzdEFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RBZGRyZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVUb1NlYXJjaEFsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1ha2VCaW5hcnlEaWN0aW9uYXJ5LmdldEZpcnN0Qml0T2ZCeXRlKHBvcywgZGljdCkpIHsgLy8gdGVybWluYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgISEKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpZ3JhbUFkZHJlc3MgPT0gKHBvcy0xKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSAoMHhGRiAmIGRpY3RbcG9zLTFdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGFkZHJlc3MgKyBmcmVxICg0IGJ5dGUpCisgICAgICAgICAgICAgICAgICAgIGlmIChNYWtlQmluYXJ5RGljdGlvbmFyeS5nZXRTZWNvbmRCaXRPZkJ5dGUocG9zLCBkaWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xsb3dEb3duQWRkcmVzc1NlYXJjaFN0b3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkciA9IE1ha2VCaW5hcnlEaWN0aW9uYXJ5LmdldDIyQml0QWRkcmVzcyhwb3MsIGRpY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyID4gYmlncmFtQWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dEb3duQWRkcmVzc1NlYXJjaFN0b3AgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFkZHJlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVUb1NlYXJjaEFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhdmVUb1NlYXJjaEFsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dEb3duQnJhbmNoQWRkcmVzcyA9IGFkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZ0NoYXIgPSAoY2hhcikgKDB4RkYgJiBkaWN0W3Bvcy0xXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpcnN0QWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RBZGRyZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlVG9TZWFyY2hBbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGZyZXEgb25seSAoMiBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgYmlncmFtCisgICAgICAgICAgICAgICAgICAgIGludCBiaWdyYW1FeGlzdCA9IChkaWN0W3Bvc10gJiBGTEFHX0JJR1JBTV9SRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpZ3JhbUV4aXN0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRCaWdyYW1FeGlzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dEJpZ3JhbUV4aXN0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCaWdyYW1FeGlzdCA9IChkaWN0W3BvcysrXSAmIEZMQUdfQklHUkFNX0NPTlRJTlVFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICBpZiAoZm9sbG93RG93bkJyYW5jaEFkZHJlc3MgPT0gMikgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVJST1IhISEgQ2Fubm90IGZpbmQgYmlncmFtISEiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmVxdWVuY3kgPT0gRk9SX1JFVkVSU0VfTE9PS1VQQUxMKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJldmVyc2U6ICIgKyBzYi50b1N0cmluZygpICsgIiAoIiArIGJpZ3JhbUFkZHJlc3MgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgKyAiICAgTG9vcDogIiArIHRvdGFsTG9vcENvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgYmlncmFtOiAiICsgc2IudG9TdHJpbmcoKSArICIgKCIgKyBiaWdyYW1BZGRyZXNzICsgIikgZnJlcTogIgorICAgICAgICAgICAgICAgICAgICArIGZyZXF1ZW5jeSArICIgICBMb29wOiAiICsgdG90YWxMb29wQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpZ3JhbSB7CisgICAgICAgIFN0cmluZ1tdIHdvcmQyOworICAgICAgICBpbnRbXSBmcmVxOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIHN0YXRpYyBpbnQgc0JpZ3JhbU51bSA9IDA7CisKKyAgICAgICAgU3RyaW5nIGdldFNlY29uZFdvcmQoaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JkMltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRGcmVxdWVuY3koaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiAoZnJlcVtpXSA9PSAwKSA/IDEgOiBmcmVxW2ldOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRXb3JkMihpbnQgaW5kZXgsIFN0cmluZyB3b3JkMiwgaW50IGZyZXEpIHsKKyAgICAgICAgICAgIHRoaXMud29yZDJbaW5kZXhdID0gd29yZDI7CisgICAgICAgICAgICB0aGlzLmZyZXFbaW5kZXhdID0gZnJlcTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCaWdyYW0oaW50IHdvcmQyQ291bnQpIHsKKyAgICAgICAgICAgIGNvdW50ID0gd29yZDJDb3VudDsKKyAgICAgICAgICAgIHdvcmQyID0gbmV3IFN0cmluZ1t3b3JkMkNvdW50XTsKKyAgICAgICAgICAgIGZyZXEgPSBuZXcgaW50W3dvcmQyQ291bnRdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZWRpY3Qvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2RpY3QvTWFrZUJpbmFyeURpY3Rpb25hcnkuamF2YSBiL3Rvb2xzL21ha2VkaWN0L3NyYy9jb20vYW5kcm9pZC90b29scy9kaWN0L01ha2VCaW5hcnlEaWN0aW9uYXJ5LmphdmEKaW5kZXggNzdhNjQwMS4uY2E2ZGU1NiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFrZWRpY3Qvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2RpY3QvTWFrZUJpbmFyeURpY3Rpb25hcnkuamF2YQorKysgYi90b29scy9tYWtlZGljdC9zcmMvY29tL2FuZHJvaWQvdG9vbHMvZGljdC9NYWtlQmluYXJ5RGljdGlvbmFyeS5qYXZhCkBAIC0xOSwxNSArMTksMTEgQEAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwogaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzYsMTAgKzMyLDE4IEBACiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKIAogLyoqCi0gKiBDb21wcmVzc2VzIGEgbGlzdCBvZiB3b3JkcyBhbmQgZnJlcXVlbmNpZXMgaW50byBhIHRyZWUgc3RydWN0dXJlZCBiaW5hcnkgZGljdGlvbmFyeS4KKyAqIENvbXByZXNzZXMgYSBsaXN0IG9mIHdvcmRzLCBmcmVxdWVuY2llcywgYW5kIGJpZ3JhbSBkYXRhCisgKiBpbnRvIGEgdHJlZSBzdHJ1Y3R1cmVkIGJpbmFyeSBkaWN0aW9uYXJ5LgorICogRGljdGlvbmFyeSBWZXJzaW9uOiAyMDAgKG1heSBjb250YWluIGJpZ3JhbXMpCisgKiAgVmVyc2lvbiBudW1iZXIgc3RhcnRlZCBmcm9tIDIwMCByYXRoZXIgdGhhbiAxIGJlY2F1c2Ugd2Ugd2FudGVkIHRvIHByZXZlbnQgbnVtYmVyIG9mIHJvb3RzIGluCisgKiAgYW55IG9sZCBkaWN0aW9uYXJpZXMgYmVpbmcgbWlzdGFrZW4gYXMgdGhlIHZlcnNpb24gbnVtYmVyLiBUaGVyZSBpcyBub3QgYSBjaGFuY2UgdGhhdCB0aGVyZQorICogIHdpbGwgYmUgbW9yZSB0aGFuIDIwMCByb290cy4gVmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGluY3JlYXNlZCB3aGVuIHRoZXJlIGlzIHN0cnVjdHVyYWwgY2hhbmdlCisgKiAgaW4gdGhlIGRhdGEuIFRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UgdGhlIHZlcnNpb24gd2hlbiBvbmx5IHRoZSB3b3JkcyBpbiB0aGUgZGF0YSBjaGFuZ2VzLgogICovCiBwdWJsaWMgY2xhc3MgTWFrZUJpbmFyeURpY3Rpb25hcnkgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTlVNID0gMjAwOworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfU0laRSA9IDI1NjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19XT1JEID0gInciOwpAQCAtNDgsMTMgKzUyLDIzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQUREUkVTU19NQVNLICA9IDB4NDAwMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1RFUk1JTkFMX01BU0sgPSAweDgwMDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREUkVTU19NQVNLID0gMHgzRkZGRkY7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBVbml0IGZvciB0aGlzIHZhcmlhYmxlIGlzIGluIGJ5dGVzCisgICAgICogSWYgZGVzdGluYXRpb24gZmlsZSBuYW1lIGlzIG1haW4uZGljdCBhbmQgZmlsZSBsaW1pdCBjYXVzZXMgZGljdGlvbmFyeSB0byBiZSBzZXBhcmF0ZWQgaW50bworICAgICAqIG11bHRpcGxlIGZpbGUsIGl0IHdpbGwgZ2VuZXJhdGUgbWFpbjAuZGljdCwgbWFpbjEuZGljdCwgYW5kIHNvIGZvcnRoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzT3V0cHV0RmlsZVNpemU7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzU3BsaXRPdXRwdXQ7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJOb2RlIEVNUFRZX05PREUgPSBuZXcgQ2hhck5vZGUoKTsKIAogICAgIExpc3Q8Q2hhck5vZGU+IHJvb3RzOwogICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IG1EaWN0aW9uYXJ5OwogICAgIGludCBtV29yZENvdW50OwotICAgIAorCisgICAgQmlncmFtRGljdGlvbmFyeSBiaWdyYW1EaWN0OworCiAgICAgc3RhdGljIGNsYXNzIENoYXJOb2RlIHsKICAgICAgICAgY2hhciBkYXRhOwogICAgICAgICBpbnQgZnJlcTsKQEAgLTY4LDI5ICs4Miw1OSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogbWFrZWRpY3QgPHNyYy54bWw+IDxkZXN0LmRpY3Q+Iik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IG1ha2VkaWN0IC1zIDxzcmNfZGljdC54bWw+IFstYiA8c3JjX2JpZ3JhbS54bWw+XSAiCisgICAgICAgICAgICAgICAgKyAiLWQgPGRlc3QuZGljdD4gWy0tc2l6ZSBmaWxlc2l6ZV0iKTsKICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIGludCBjaGVja1NvdXJjZSA9IC0xOworICAgICAgICBpbnQgY2hlY2tCaWdyYW0gPSAtMTsKKyAgICAgICAgaW50IGNoZWNrRGVzdCA9IC0xOworICAgICAgICBpbnQgY2hlY2tGaWxlU2l6ZSA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKz0yKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1zIikpIGNoZWNrU291cmNlID0gKGkgKyAxKTsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWIiKSkgY2hlY2tCaWdyYW0gPSAoaSArIDEpOworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZCIpKSBjaGVja0Rlc3QgPSAoaSArIDEpOworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXNpemUiKSkgY2hlY2tGaWxlU2l6ZSA9IChpICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWNrRmlsZVNpemUgPj0gMCkgeworICAgICAgICAgICAgc1NwbGl0T3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHNPdXRwdXRGaWxlU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tjaGVja0ZpbGVTaXplXSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXcgTWFrZUJpbmFyeURpY3Rpb25hcnkoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBzU3BsaXRPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2tEZXN0ID49IDAgJiYgIWFyZ3NbY2hlY2tEZXN0XS5lbmRzV2l0aCgiLmRpY3QiKSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogRGljdGlvbmFyeSBvdXRwdXQgZmlsZSBleHRlbnNpb24gc2hvdWxkIGJlIFwiLmRpY3RcIiIpOworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGVja1NvdXJjZSA+PSAwICYmIGNoZWNrQmlncmFtID49IDAgJiYgY2hlY2tEZXN0ID49IDAgJiYKKyAgICAgICAgICAgICAgICAoKCFzU3BsaXRPdXRwdXQgJiYgYXJncy5sZW5ndGggPT0gNikgfHwgKHNTcGxpdE91dHB1dCAmJiBhcmdzLmxlbmd0aCA9PSA4KSkpIHsKKyAgICAgICAgICAgIG5ldyBNYWtlQmluYXJ5RGljdGlvbmFyeShhcmdzW2NoZWNrU291cmNlXSwgYXJnc1tjaGVja0JpZ3JhbV0sIGFyZ3NbY2hlY2tEZXN0XSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tTb3VyY2UgPj0gMCAmJiBjaGVja0Rlc3QgPj0gMCAmJgorICAgICAgICAgICAgICAgICgoIXNTcGxpdE91dHB1dCAmJiBhcmdzLmxlbmd0aCA9PSA0KSB8fCAoc1NwbGl0T3V0cHV0ICYmIGFyZ3MubGVuZ3RoID09IDYpKSkgeworICAgICAgICAgICAgbmV3IE1ha2VCaW5hcnlEaWN0aW9uYXJ5KGFyZ3NbY2hlY2tTb3VyY2VdLCBudWxsLCBhcmdzW2NoZWNrRGVzdF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNhZ2UoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBNYWtlQmluYXJ5RGljdGlvbmFyeShTdHJpbmcgc3JjRmlsZW5hbWUsIFN0cmluZyBkZXN0RmlsZW5hbWUpIHsKKyAgICBwdWJsaWMgTWFrZUJpbmFyeURpY3Rpb25hcnkoU3RyaW5nIHNyY0ZpbGVuYW1lLCBTdHJpbmcgYmlncmFtU3JjRmlsZW5hbWUsIFN0cmluZyBkZXN0RmlsZW5hbWUpeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmcgZGljdGlvbmFyeSB2ZXJzaW9uICIgKyBWRVJTSU9OX05VTSk7CisgICAgICAgIGJpZ3JhbURpY3QgPSBuZXcgQmlncmFtRGljdGlvbmFyeShiaWdyYW1TcmNGaWxlbmFtZSwgKGJpZ3JhbVNyY0ZpbGVuYW1lICE9IG51bGwpKTsKICAgICAgICAgcG9wdWxhdGVEaWN0aW9uYXJ5KHNyY0ZpbGVuYW1lKTsKICAgICAgICAgd3JpdGVUb0RpY3QoZGVzdEZpbGVuYW1lKTsKLSAgICAgICAgLy8gRW5hYmxlIHRoZSBjb2RlIGJlbG93IHRvIHZlcmlmeSB0aGF0IHRoZSBnZW5lcmF0ZWQgdHJlZSBpcyB0cmF2ZXJzYWJsZS4KKworICAgICAgICAvLyBFbmFibGUgdGhlIGNvZGUgYmVsb3cgdG8gdmVyaWZ5IHRoYXQgdGhlIGdlbmVyYXRlZCB0cmVlIGlzIHRyYXZlcnNhYmxlCisgICAgICAgIC8vIGFuZCBiaWdyYW0gZGF0YSBpcyBzdG9yZWQgY29ycmVjdGx5LgogICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIHRyYXZlcnNlRGljdCgwLCBuZXcgY2hhclszMl0sIDApOworICAgICAgICAgICAgYmlncmFtRGljdC5yZXZlcnNlTG9va3VwQWxsKG1EaWN0aW9uYXJ5LCBkaWN0KTsKKyAgICAgICAgICAgIHRyYXZlcnNlRGljdCgyLCBuZXcgY2hhclszMl0sIDApOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGljdGlvbmFyeShTdHJpbmcgZmlsZW5hbWUpIHsKICAgICAgICAgcm9vdHMgPSBuZXcgQXJyYXlMaXN0PENoYXJOb2RlPigpOworICAgICAgICBtRGljdGlvbmFyeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7CiAgICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IEZpbGUoZmlsZW5hbWUpLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7CkBAIC0yMDUsOCArMjQ5LDExIEBACiAgICAgcHJpdmF0ZSB2b2lkIGFkZENvdW50KGludCBjb3VudCkgewogICAgICAgICBkaWN0W2RpY3RTaXplKytdID0gKGJ5dGUpICgweEZGICYgY291bnQpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkTm9kZShDaGFyTm9kZSBub2RlKSB7CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTm9kZShDaGFyTm9kZSBub2RlLCBTdHJpbmcgd29yZDEpIHsKKyAgICAgICAgaWYgKG5vZGUudGVybWluYWwpIHsgLy8gc3RvcmUgYWRkcmVzcyBvZiBlYWNoIHdvcmQxCisgICAgICAgICAgICBtRGljdGlvbmFyeS5wdXQod29yZDEsIGRpY3RTaXplKTsKKyAgICAgICAgfQogICAgICAgICBpbnQgY2hhckRhdGEgPSAweEZGRkYgJiBub2RlLmRhdGE7CiAgICAgICAgIGlmIChjaGFyRGF0YSA+IDI1NCkgewogICAgICAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IChieXRlKSAyNTU7CkBAIC0yMjYsNiArMjczLDE1IEBACiAgICAgICAgIGlmIChub2RlLnRlcm1pbmFsKSB7CiAgICAgICAgICAgICBieXRlIGZyZXEgPSAoYnl0ZSkgKDB4RkYgJiBub2RlLmZyZXEpOwogICAgICAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IGZyZXE7CisgICAgICAgICAgICAvLyBiaWdyYW0KKyAgICAgICAgICAgIGlmIChiaWdyYW1EaWN0Lm1CaS5jb250YWluc0tleSh3b3JkMSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBiaWdyYW1EaWN0Lm1CaS5nZXQod29yZDEpLmNvdW50OworICAgICAgICAgICAgICAgIGJpZ3JhbURpY3QubUJpZ3JhbVRvRmlsbC5hZGQod29yZDEpOworICAgICAgICAgICAgICAgIGJpZ3JhbURpY3QubUJpZ3JhbVRvRmlsbEFkZHJlc3MuYWRkKGRpY3RTaXplKTsKKyAgICAgICAgICAgICAgICBkaWN0U2l6ZSArPSAoNCAqIGNvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IChieXRlKSAoMHgwMCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1NSwyNCArMzExLDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHdyaXRlV29yZHNSZWMoTGlzdDxDaGFyTm9kZT4gY2hpbGRyZW4pIHsKKyAgICB2b2lkIHdyaXRlV29yZHNSZWMoTGlzdDxDaGFyTm9kZT4gY2hpbGRyZW4sIFN0cmluZ0J1aWxkZXIgd29yZCkgewogICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gY2hpbGRyZW4uc2l6ZSgpOwogICAgICAgICBhZGRDb3VudChjaGlsZENvdW50KTsKLSAgICAgICAgLy9pbnQgY2hpbGRyZW5TdGFydCA9IGRpY3RTaXplOwogICAgICAgICBpbnRbXSBjaGlsZHJlbkFkZHJlc3NlcyA9IG5ldyBpbnRbY2hpbGRDb3VudF07CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRDb3VudDsgaisrKSB7CiAgICAgICAgICAgICBDaGFyTm9kZSBub2RlID0gY2hpbGRyZW4uZ2V0KGopOwogICAgICAgICAgICAgY2hpbGRyZW5BZGRyZXNzZXNbal0gPSBkaWN0U2l6ZTsKLSAgICAgICAgICAgIGFkZE5vZGUobm9kZSk7CisgICAgICAgICAgICB3b3JkLmFwcGVuZChjaGlsZHJlbi5nZXQoaikuZGF0YSk7CisgICAgICAgICAgICBhZGROb2RlKG5vZGUsIHdvcmQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3b3JkLmRlbGV0ZUNoYXJBdCh3b3JkLmxlbmd0aCgpLTEpOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRDb3VudDsgaisrKSB7CiAgICAgICAgICAgICBDaGFyTm9kZSBub2RlID0gY2hpbGRyZW4uZ2V0KGopOwogICAgICAgICAgICAgaW50IG5vZGVBZGRyZXNzID0gY2hpbGRyZW5BZGRyZXNzZXNbal07CiAgICAgICAgICAgICBpbnQgY2FjaGVEaWN0U2l6ZSA9IGRpY3RTaXplOwotICAgICAgICAgICAgd3JpdGVXb3Jkc1JlYyhub2RlLmNoaWxkcmVuKTsKKyAgICAgICAgICAgIHdvcmQuYXBwZW5kKGNoaWxkcmVuLmdldChqKS5kYXRhKTsKKyAgICAgICAgICAgIHdyaXRlV29yZHNSZWMobm9kZS5jaGlsZHJlbiwgd29yZCk7CisgICAgICAgICAgICB3b3JkLmRlbGV0ZUNoYXJBdCh3b3JkLmxlbmd0aCgpLTEpOwogICAgICAgICAgICAgdXBkYXRlTm9kZUFkZHJlc3Mobm9kZUFkZHJlc3MsIG5vZGUsIG5vZGUuY2hpbGRyZW4gIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICA/IGNhY2hlRGljdFNpemUgOiAwKTsKICAgICAgICAgfQpAQCAtMjg0LDEyICszNDMsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwgMU1CIGluIG1vc3QgY2FzZXMsIGFzIHRoZXJlIGlzIGEgbGltaXQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvdXJjZSBzaXplIGluIGFwa3MuCiAgICAgICAgIGRpY3RTaXplID0gMDsKLSAgICAgICAgd3JpdGVXb3Jkc1JlYyhyb290cyk7CisKKyAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IChieXRlKSAoMHhGRiAmIFZFUlNJT05fTlVNKTsgLy8gdmVyc2lvbiBpbmZvCisgICAgICAgIGRpY3RbZGljdFNpemUrK10gPSAoYnl0ZSkgKDB4RkYgJiAoYmlncmFtRGljdC5tSGFzQmlncmFtID8gMSA6IDApKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHdvcmQgPSBuZXcgU3RyaW5nQnVpbGRlcig0OCk7CisgICAgICAgIHdyaXRlV29yZHNSZWMocm9vdHMsIHdvcmQpOworICAgICAgICBkaWN0ID0gYmlncmFtRGljdC53cml0ZUJpZ3JhbXMoZGljdCwgbURpY3Rpb25hcnkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRpY3QgU2l6ZSA9ICIgKyBkaWN0U2l6ZSk7CisgICAgICAgIGlmICghc1NwbGl0T3V0cHV0KSB7CisgICAgICAgICAgICBzT3V0cHV0RmlsZVNpemUgPSBkaWN0U2l6ZTsKKyAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkaWN0RmlsZW5hbWUpOwotICAgICAgICAgICAgZm9zLndyaXRlKGRpY3QsIDAsIGRpY3RTaXplKTsKLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgaW50IGN1cnJlbnRMb2MgPSAwOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgaW50IGV4dGVuc2lvbiA9IGRpY3RGaWxlbmFtZS5pbmRleE9mKCIuZGljdCIpOworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZGljdEZpbGVuYW1lLnN1YnN0cmluZygwLCBleHRlbnNpb24pOworICAgICAgICAgICAgd2hpbGUgKGRpY3RTaXplID4gMCkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zOworICAgICAgICAgICAgICAgIGlmIChzU3BsaXRPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUgKyBpICsgIi5kaWN0Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUgKyAiLmRpY3QiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRpY3RTaXplID4gc091dHB1dEZpbGVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShkaWN0LCBjdXJyZW50TG9jLCBzT3V0cHV0RmlsZVNpemUpOworICAgICAgICAgICAgICAgICAgICBkaWN0U2l6ZSAtPSBzT3V0cHV0RmlsZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2MgKz0gc091dHB1dEZpbGVTaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShkaWN0LCBjdXJyZW50TG9jLCBkaWN0U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGRpY3RTaXplID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3Igd3JpdGluZyBkaWN0IGZpbGU6IiArIGlvZSk7CiAgICAgICAgIH0KQEAgLTI5OSwyNCArMzg2LDM2IEBACiAgICAgICAgIGludCBjb3VudCA9IGRpY3RbcG9zKytdICYgMHhGRjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgKGRpY3RbcG9zKytdICYgMHhGRik7Ci0gICAgICAgICAgICBpZiAoYyA9PSAweEZGKSB7CisgICAgICAgICAgICBpZiAoYyA9PSAweEZGKSB7IC8vIHR3byBieXRlIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgIGMgPSAoY2hhcikgKCgoZGljdFtwb3NdICYgMHhGRikgPDwgOCkgfCAoZGljdFtwb3MrMV0gJiAweEZGKSk7CiAgICAgICAgICAgICAgICAgcG9zICs9IDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB3b3JkW2RlcHRoXSA9IGM7Ci0gICAgICAgICAgICBib29sZWFuIHRlcm1pbmFsID0gKGRpY3RbcG9zXSAmIDB4ODApID4gMDsKKyAgICAgICAgICAgIGJvb2xlYW4gdGVybWluYWwgPSBnZXRGaXJzdEJpdE9mQnl0ZShwb3MsIGRpY3QpOwogICAgICAgICAgICAgaW50IGFkZHJlc3MgPSAwOwotICAgICAgICAgICAgaWYgKChkaWN0W3Bvc10gJiAoRkxBR19BRERSRVNTX01BU0sgPj4gMTYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gCi0gICAgICAgICAgICAgICAgICAgICgoZGljdFtwb3MgKyAwXSAmIChGTEFHX0FERFJFU1NfTUFTSyA+PiAxNikpIDw8IDE2KQotICAgICAgICAgICAgICAgICAgICB8ICgoZGljdFtwb3MgKyAxXSAmIDB4RkYpIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgIHwgKChkaWN0W3BvcyArIDJdICYgMHhGRikpOwotICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgaWYgKChkaWN0W3Bvc10gJiAoRkxBR19BRERSRVNTX01BU0sgPj4gMTYpKSA+IDApIHsgLy8gYWRkcmVzcyBjaGVjaworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBnZXQyMkJpdEFkZHJlc3MocG9zLCBkaWN0KTsKKyAgICAgICAgICAgICAgICBwb3MgKz0gMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcG9zICs9IDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgIGlmICh0ZXJtaW5hbCkgewogICAgICAgICAgICAgICAgIHNob3dXb3JkKHdvcmQsIGRlcHRoICsgMSwgZGljdFtwb3NdICYgMHhGRik7CiAgICAgICAgICAgICAgICAgcG9zKys7CisKKyAgICAgICAgICAgICAgICBpbnQgYmlncmFtRXhpc3QgPSAoZGljdFtwb3NdICYgYmlncmFtRGljdC5GTEFHX0JJR1JBTV9SRUFEKTsKKyAgICAgICAgICAgICAgICBpZiAoYmlncmFtRXhpc3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0QmlncmFtRXhpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dEJpZ3JhbUV4aXN0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZ3JhbUFkZHJlc3MgPSBnZXQyMkJpdEFkZHJlc3MocG9zLCBkaWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyZXF1ZW5jeSA9IChiaWdyYW1EaWN0LkZMQUdfQklHUkFNX0ZSRVEgJiBkaWN0W3Bvc10pOworICAgICAgICAgICAgICAgICAgICAgICAgYmlncmFtRGljdC5zZWFyY2hGb3JUZXJtaW5hbE5vZGUoYmlncmFtQWRkcmVzcywgZnJlcXVlbmN5LCBkaWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCaWdyYW1FeGlzdCA9IChkaWN0W3BvcysrXSAmIGJpZ3JhbURpY3QuRkxBR19CSUdSQU1fQ09OVElOVUVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9IDApIHsKICAgICAgICAgICAgICAgICB0cmF2ZXJzZURpY3QoYWRkcmVzcywgd29yZCwgZGVwdGggKyAxKTsKQEAgLTMyNyw0ICs0MjYsMTggQEAKICAgICB2b2lkIHNob3dXb3JkKGNoYXJbXSB3b3JkLCBpbnQgc2l6ZSwgaW50IGZyZXEpIHsKICAgICAgICAgU3lzdGVtLm91dC5wcmludChuZXcgU3RyaW5nKHdvcmQsIDAsIHNpemUpICsgIiAiICsgZnJlcSArICJcbiIpOwogICAgIH0KKworICAgIHN0YXRpYyBpbnQgZ2V0MjJCaXRBZGRyZXNzKGludCBwb3MsIGJ5dGVbXSBkaWN0KSB7CisgICAgICAgIHJldHVybiAoKGRpY3RbcG9zICsgMF0gJiAweDNGKSA8PCAxNikKKyAgICAgICAgICAgICAgICB8ICgoZGljdFtwb3MgKyAxXSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgICAgICAgfCAoKGRpY3RbcG9zICsgMl0gJiAweEZGKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gZ2V0Rmlyc3RCaXRPZkJ5dGUoaW50IHBvcywgYnl0ZVtdIGRpY3QpIHsKKyAgICAgICAgcmV0dXJuIChkaWN0W3Bvc10gJiAweDgwKSA+IDA7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gZ2V0U2Vjb25kQml0T2ZCeXRlKGludCBwb3MsIGJ5dGVbXSBkaWN0KSB7CisgICAgICAgIHJldHVybiAoZGljdFtwb3NdICYgMHg0MCkgPiAwOworICAgIH0KIH0K