ZGlmZiAtLWdpdCBhL2RpY3Rpb25hcmllcy9lbl9HQl93b3JkbGlzdC5jb21iaW5lZC5neiBiL2RpY3Rpb25hcmllcy9lbl9HQl93b3JkbGlzdC5jb21iaW5lZC5negppbmRleCBiM2U1Y2ZjLi45M2M1ZjNkIDEwMDY0NAotLS0gYS9kaWN0aW9uYXJpZXMvZW5fR0Jfd29yZGxpc3QuY29tYmluZWQuZ3oKKysrIGIvZGljdGlvbmFyaWVzL2VuX0dCX3dvcmRsaXN0LmNvbWJpbmVkLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RpY3Rpb25hcmllcy9lbl9VU193b3JkbGlzdC5jb21iaW5lZC5neiBiL2RpY3Rpb25hcmllcy9lbl9VU193b3JkbGlzdC5jb21iaW5lZC5negppbmRleCA2NzMyOGQ4Li5jMjQyMWRjIDEwMDY0NAotLS0gYS9kaWN0aW9uYXJpZXMvZW5fVVNfd29yZGxpc3QuY29tYmluZWQuZ3oKKysrIGIvZGljdGlvbmFyaWVzL2VuX1VTX3dvcmRsaXN0LmNvbWJpbmVkLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RpY3Rpb25hcmllcy9lbl93b3JkbGlzdC5jb21iaW5lZC5neiBiL2RpY3Rpb25hcmllcy9lbl93b3JkbGlzdC5jb21iaW5lZC5negppbmRleCA3ZmM2Y2ZmLi4zNzMyOTkzIDEwMDY0NAotLS0gYS9kaWN0aW9uYXJpZXMvZW5fd29yZGxpc3QuY29tYmluZWQuZ3oKKysrIGIvZGljdGlvbmFyaWVzL2VuX3dvcmRsaXN0LmNvbWJpbmVkLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RpY3Rpb25hcmllcy9mcl93b3JkbGlzdC5jb21iaW5lZC5neiBiL2RpY3Rpb25hcmllcy9mcl93b3JkbGlzdC5jb21iaW5lZC5negppbmRleCBjN2M2OTc3Li43ZGU0NjI1IDEwMDY0NAotLS0gYS9kaWN0aW9uYXJpZXMvZnJfd29yZGxpc3QuY29tYmluZWQuZ3oKKysrIGIvZGljdGlvbmFyaWVzL2ZyX3dvcmRsaXN0LmNvbWJpbmVkLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RpY3Rpb25hcmllcy9ydV93b3JkbGlzdC5jb21iaW5lZC5neiBiL2RpY3Rpb25hcmllcy9ydV93b3JkbGlzdC5jb21iaW5lZC5negppbmRleCA0ZjkyODA1Li4xY2ZhYjRlIDEwMDY0NAotLS0gYS9kaWN0aW9uYXJpZXMvcnVfd29yZGxpc3QuY29tYmluZWQuZ3oKKysrIGIvZGljdGlvbmFyaWVzL3J1X3dvcmRsaXN0LmNvbWJpbmVkLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxN2QxMWMwLi5mYjk3M2YzIDEwMDY0NAotLS0gYS9qYXZhL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCwyMiArMjAsMjQgQEAKIAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjE0IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjE3IiAvPgogCi0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5WSUJSQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1VTRVJfRElDVElPTkFSWSIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1VTRVJfRElDVElPTkFSWSIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUNFSVZFX0JPT1RfQ09NUExFVEVEIiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRPV05MT0FEX1dJVEhPVVRfTk9USUZJQ0FUSU9OIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uR0VUX0FDQ09VTlRTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DT05UQUNUUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUFJPRklMRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfVVNFUl9ESUNUSU9OQVJZIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9CT09UX0NPTVBMRVRFRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlZJQlJBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfVVNFUl9ESUNUSU9OQVJZIiAvPgogCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYW9zcF9hbmRyb2lkX2tleWJvYXJkX2ltZV9uYW1lIgotICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2ltZV9zZXR0aW5ncyIKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9lbmdsaXNoX2ltZV9uYW1lIgorICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2xhdW5jaGVyX2tleWJvYXJkIgogICAgICAgICAgICAgYW5kcm9pZDpraWxsQWZ0ZXJSZXN0b3JlPSJmYWxzZSIKICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNSdGw9InRydWUiPgogCiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iTGF0aW5JTUUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hb3NwX2FuZHJvaWRfa2V5Ym9hcmRfaW1lX25hbWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9lbmdsaXNoX2ltZV9uYW1lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfSU5QVVRfTUVUSE9EIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnZpZXcuSW5wdXRNZXRob2QiIC8+CkBAIC00NCw3ICs0Niw3IEBACiAgICAgICAgIDwvc2VydmljZT4KIAogICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5zcGVsbGNoZWNrLkFuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlIgotICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Fvc3Bfc3BlbGxfY2hlY2tlcl9zZXJ2aWNlX25hbWUiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvc3BlbGxfY2hlY2tlcl9zZXJ2aWNlX25hbWUiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfVEVYVF9TRVJWSUNFIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZpY2UudGV4dHNlcnZpY2UuU3BlbGxDaGVja2VyU2VydmljZSIgLz4KQEAgLTUzLDE0ICs1NSwyNCBAQAogICAgICAgICA8L3NlcnZpY2U+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnNldHVwLlNldHVwQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hb3NwX2FuZHJvaWRfa2V5Ym9hcmRfaW1lX25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dXBfd2l6YXJkIj4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2VuZ2xpc2hfaW1lX25hbWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2xhdW5jaGVyX2tleWJvYXJkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5vSGlzdG9yeT0idHJ1ZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnNldHVwLlNldHVwV2l6YXJkQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9lbmdsaXNoX2ltZV9uYW1lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xlYXJUYXNrT25MYXVuY2g9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5zZXR1cC5MYXVuY2hlckljb25WaXNpYmlsaXR5TWFuYWdlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1ZX1BBQ0tBR0VfUkVQTEFDRUQiIC8+CkBAIC02OSw3ICs4MSw3IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcmVjZWl2ZXI+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU2V0dGluZ3NBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hb3NwX2FuZHJvaWRfa2V5Ym9hcmRfaW1lX3NldHRpbmdzIgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTZXR0aW5nc0FjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2VuZ2xpc2hfaW1lX3NldHRpbmdzIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp1aU9wdGlvbnM9InNwbGl0QWN0aW9uQmFyV2hlbk5hcnJvdyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC03Nyw3ICs4OSw3IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc3BlbGxjaGVjay5TcGVsbENoZWNrZXJTZXR0aW5nc0FjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hb3NwX2FuZHJvaWRfc3BlbGxfY2hlY2tlcl9zZXJ2aWNlX3NldHRpbmdzIj4KKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYW5kcm9pZF9zcGVsbF9jaGVja2VyX3NldHRpbmdzIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KQEAgLTEyMyw3ICsxMzUsNiBAQAogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2ltZV9zZXR0aW5ncyIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8iCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnVpT3B0aW9ucz0ic3BsaXRBY3Rpb25CYXJXaGVuTmFycm93Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMTMzLDcgKzE0NCw2IEBACiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZyIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQG1pcG1hcC9pY19pbWVfc2V0dGluZ3MiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvY29sb3Ivc2V0dXBfc3RlcF9hY3Rpb25fYmFja2dyb3VuZC54bWwgYi9qYXZhL3Jlcy9jb2xvci9zZXR1cF9zdGVwX2FjdGlvbl9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTEyMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvY29sb3Ivc2V0dXBfc3RlcF9hY3Rpb25fYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNvbG9yPSJAY29sb3Ivc2V0dXBfdGV4dF9hY3Rpb24iIC8+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNvbG9yPSJAY29sb3Ivc2V0dXBfdGV4dF9hY3Rpb24iIC8+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL3NldHVwX3N0ZXBfYmFja2dyb3VuZCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9jb2xvci9zZXR1cF9zdGVwX2FjdGlvbl9jb2xvci54bWwgYi9qYXZhL3Jlcy9jb2xvci9zZXR1cF9zdGVwX2FjdGlvbl9jb2xvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZTAyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2NvbG9yL3NldHVwX3N0ZXBfYWN0aW9uX2NvbG9yLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9zZXR1cF9zdGVwX2JhY2tncm91bmQiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNvbG9yPSJAY29sb3Ivc2V0dXBfc3RlcF9iYWNrZ3JvdW5kIiAvPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9zZXR1cF90ZXh0X2FjdGlvbiIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWRkLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZGQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjhmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWRkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3NldHVwX3dpemFyZC5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3NldHVwX3dpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmNhNmQuLjAwMDAwMDAKLS0tIGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS9pY19zZXR1cF93aXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfY2hlY2tfMDEucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfY2hlY2tfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyY2NlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL3VuYnVuZGxlZF9jaGVja18wMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfY2hlY2tfMDIucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfY2hlY2tfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDEyMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL3VuYnVuZGxlZF9jaGVja18wMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfZWFydGhfMDEucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfZWFydGhfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGYwODcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL3VuYnVuZGxlZF9lYXJ0aF8wMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfZWFydGhfMDIucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfZWFydGhfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmQ0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1oZHBpL3VuYnVuZGxlZF9lYXJ0aF8wMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfa2V5XzAxLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX2tleV8wMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjOWUyYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX2tleV8wMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfa2V5XzAyLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX2tleV8wMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0NzM4NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX2tleV8wMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfc2VsZWN0XzAxLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX3NlbGVjdF8wMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzZGUyZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX3NlbGVjdF8wMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtaGRwaS91bmJ1bmRsZWRfc2VsZWN0XzAyLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX3NlbGVjdF8wMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ZmRhYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvdW5idW5kbGVkX3NlbGVjdF8wMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FkZC5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWRkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZmYWRkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR1cF93aXphcmQucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR1cF93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmU2MmI4Li4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dXBfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2NoZWNrXzAxLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2NoZWNrXzAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQwMmEzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS91bmJ1bmRsZWRfY2hlY2tfMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2NoZWNrXzAyLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2NoZWNrXzAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRmYTIyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS91bmJ1bmRsZWRfY2hlY2tfMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2VhcnRoXzAxLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2VhcnRoXzAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYwMTgxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS91bmJ1bmRsZWRfZWFydGhfMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2VhcnRoXzAyLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2VhcnRoXzAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzUyNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS91bmJ1bmRsZWRfZWFydGhfMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2tleV8wMS5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9rZXlfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZDcyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9rZXlfMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX2tleV8wMi5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9rZXlfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjZlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9rZXlfMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX3NlbGVjdF8wMS5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9zZWxlY3RfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjAwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9zZWxlY3RfMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvdW5idW5kbGVkX3NlbGVjdF8wMi5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9zZWxlY3RfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjgwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS1tZHBpL3VuYnVuZGxlZF9zZWxlY3RfMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lbnVfYWRkLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lbnVfYWRkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA1MTBlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVudV9hZGQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3NldHVwX3dpemFyZC5wbmcgYi9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19zZXR1cF93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Y3MGE2Li4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3NldHVwX3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfY2hlY2tfMDEucG5nIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2NoZWNrXzAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAwYTdmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2NoZWNrXzAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfY2hlY2tfMDIucG5nIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2NoZWNrXzAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTUxODg2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2NoZWNrXzAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfZWFydGhfMDEucG5nIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2VhcnRoXzAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI2NjM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2VhcnRoXzAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfZWFydGhfMDIucG5nIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2VhcnRoXzAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFhMDMxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvdW5idW5kbGVkX2VhcnRoXzAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfa2V5XzAxLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL3VuYnVuZGxlZF9rZXlfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjExN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfa2V5XzAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfa2V5XzAyLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL3VuYnVuZGxlZF9rZXlfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMmRhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfa2V5XzAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfc2VsZWN0XzAxLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL3VuYnVuZGxlZF9zZWxlY3RfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjFlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfc2VsZWN0XzAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfc2VsZWN0XzAyLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL3VuYnVuZGxlZF9zZWxlY3RfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTA1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS14aGRwaS91bmJ1bmRsZWRfc2VsZWN0XzAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfc2V0dXBfd2l6YXJkLnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19zZXR1cF93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDE0YjRmLi4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19zZXR1cF93aXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUvaWNfc2V0dXBfZmluaXNoLnhtbCBiL2phdmEvcmVzL2RyYXdhYmxlL2ljX3NldHVwX2ZpbmlzaC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjOGE4NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlL2ljX3NldHVwX2ZpbmlzaC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdW5idW5kbGVkX2NoZWNrXzAxIiAvPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3VuYnVuZGxlZF9jaGVja18wMSIgLz4KKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdW5idW5kbGVkX2NoZWNrXzAyIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlL2ljX3NldHVwX3N0ZXAxLnhtbCBiL2phdmEvcmVzL2RyYXdhYmxlL2ljX3NldHVwX3N0ZXAxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjZhZmIzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUvaWNfc2V0dXBfc3RlcDEueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3VuYnVuZGxlZF9rZXlfMDEiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdW5idW5kbGVkX2tleV8wMSIgLz4KKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdW5idW5kbGVkX2tleV8wMiIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9kcmF3YWJsZS9pY19zZXR1cF9zdGVwMi54bWwgYi9qYXZhL3Jlcy9kcmF3YWJsZS9pY19zZXR1cF9zdGVwMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkYjI5MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlL2ljX3NldHVwX3N0ZXAyLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS91bmJ1bmRsZWRfc2VsZWN0XzAxIiAvPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3VuYnVuZGxlZF9zZWxlY3RfMDEiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3VuYnVuZGxlZF9zZWxlY3RfMDIiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvZHJhd2FibGUvaWNfc2V0dXBfc3RlcDMueG1sIGIvamF2YS9yZXMvZHJhd2FibGUvaWNfc2V0dXBfc3RlcDMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjlmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9kcmF3YWJsZS9pY19zZXR1cF9zdGVwMy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdW5idW5kbGVkX2VhcnRoXzAxIiAvPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3VuYnVuZGxlZF9lYXJ0aF8wMSIgLz4KKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdW5idW5kbGVkX2VhcnRoXzAyIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlL3NldHVwX3N0ZXBfYWN0aW9uX2JhY2tncm91bmQueG1sIGIvamF2YS9yZXMvZHJhd2FibGUvc2V0dXBfc3RlcF9hY3Rpb25fYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MzhlMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlL3NldHVwX3N0ZXBfYWN0aW9uX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3NldHVwX3RleHRfYWN0aW9uIiAvPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3NldHVwX3RleHRfYWN0aW9uIiAvPgorICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci9zZXR1cF9zdGVwX2JhY2tncm91bmQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0LWxhbmQvc2V0dXBfc3RlcHNfc2NyZWVuLnhtbCBiL2phdmEvcmVzL2xheW91dC1sYW5kL3NldHVwX3N0ZXBzX3NjcmVlbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4YzQyNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC1sYW5kL3NldHVwX3N0ZXBzX3NjcmVlbi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJmYWxzZSI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9zZXR1cF90aXRsZV93ZWlnaHRfaW5fc2NyZWVuIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luRW5kPSJAZGltZW4vc2V0dXBfdGl0bGVfZW5kX21hcmdpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9zZXR1cF90aXRsZV9lbmRfbWFyZ2luIj4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3N0ZXBzX3RpdGxlIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iQGludGVnZXIvc2V0dXBfYm9keV93ZWlnaHRfaW5fc2NyZWVuIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9zZXR1cF9zdGVwc19jYXJkcyIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0LWxhbmQvc2V0dXBfd2VsY29tZV9zY3JlZW4ueG1sIGIvamF2YS9yZXMvbGF5b3V0LWxhbmQvc2V0dXBfd2VsY29tZV9zY3JlZW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWVhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQtbGFuZC9zZXR1cF93ZWxjb21lX3NjcmVlbi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJmYWxzZSI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9zZXR1cF90aXRsZV93ZWlnaHRfaW5fc2NyZWVuIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luRW5kPSJAZGltZW4vc2V0dXBfdGl0bGVfZW5kX21hcmdpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9zZXR1cF90aXRsZV9lbmRfbWFyZ2luIj4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3dlbGNvbWVfdGl0bGUiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9zZXR1cF9ib2R5X3dlaWdodF9pbl9zY3JlZW4iCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3dlbGNvbWVfdmlkZW8iIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2xheW91dC9kaWN0aW9uYXJ5X2xpbmUueG1sIGIvamF2YS9yZXMvbGF5b3V0L2RpY3Rpb25hcnlfbGluZS54bWwKaW5kZXggYThkMTVhYi4uNzI2OGNkNCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvbGF5b3V0L2RpY3Rpb25hcnlfbGluZS54bWwKKysrIGIvamF2YS9yZXMvbGF5b3V0L2RpY3Rpb25hcnlfbGluZS54bWwKQEAgLTUyLDMzICs1Miw2MCBAQAogICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIiAvPgogCi0gICAgPFRleHRWaWV3Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iNWRpcCIKKyAgICA8RnJhbWVMYXlvdXQKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5IgotICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIiAvPgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iNWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNWRpcCI+CiAKLSAgICA8IS0tIDxQcm9ncmVzc0JhciAtLT4KLSAgICA8IS0tICAgICBhbmRyb2lkOmlkPSJAK2lkL2RpY3Rpb25hcnlfbGluZV9wcm9ncmVzc19iYXIiIC0tPgotICAgIDwhLS0gICAgIHN0eWxlPSJAYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIiAtLT4KLSAgICA8IS0tICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAtLT4KLSAgICA8IS0tICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLS0+Ci0gICAgPCEtLSAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiIC8+IC0tPgorICAgICAgPFRleHRWaWV3CisgICAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5IgorICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiIC8+CiAKKyAgICAgIDxjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjay5EaWN0aW9uYXJ5RG93bmxvYWRQcm9ncmVzc0JhcgorICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGljdGlvbmFyeV9saW5lX3Byb2dyZXNzX2JhciIKKyAgICAgICAgICBzdHlsZT0iQGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuSG9yaXpvbnRhbCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiAvPgorCisgICAgPC9GcmFtZUxheW91dD4KICAgPC9MaW5lYXJMYXlvdXQ+CiAKLSAgPEJ1dHRvbgotICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3dvcmRsaXN0X2J1dHRvbiIKKyAgPGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkJ1dHRvblN3aXRjaGVyCisgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvd29yZGxpc3RfYnV0dG9uX3N3aXRjaGVyIgogICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjEzZGlwIgorICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTNkaXAiCiAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCi0gICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luc3RhbGxfZGljdCIgLz4KLQorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL2RpY3RfaW5zdGFsbF9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luc3RhbGxfZGljdCIgLz4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9kaWN0X2NhbmNlbF9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NhbmNlbF9kb3dubG9hZF9kaWN0IiAvPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL2RpY3RfZGVsZXRlX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGVsZXRlX2RpY3QiIC8+CisgIDwvY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suQnV0dG9uU3dpdGNoZXI+CiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGFydF9pbmRpY2F0b3JfbGFiZWwueG1sIGIvamF2YS9yZXMvbGF5b3V0L3NldHVwX3N0YXJ0X2luZGljYXRvcl9sYWJlbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4NTRiYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGFydF9pbmRpY2F0b3JfbGFiZWwueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxtZXJnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5zZXR1cC5TZXR1cFN0YXJ0SW5kaWNhdG9yVmlldyRMYWJlbFZpZXciCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfc3RhcnRfbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXR1cF9zdGFydF9hY3Rpb24iCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kfGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvc2V0dXBTdGVwQWN0aW9uTGFiZWxTdHlsZUNvbW1vbiIgLz4KKyAgICA8dmlldyBjbGFzcz0iY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc2V0dXAuU2V0dXBTdGFydEluZGljYXRvclZpZXckSW5kaWNhdG9yVmlldyIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGFydF9pbmRpY2F0b3IiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvc2V0dXBTdGVwU3RhcnRJbmRpY2F0b3JTdHlsZSIgLz4KKzwvbWVyZ2U+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfc3RlcC54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfc3RlcC54bWwKaW5kZXggMjZkN2ZlNy4uZmE4NDkwMiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvbGF5b3V0L3NldHVwX3N0ZXAueG1sCisrKyBiL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGVwLnhtbApAQCAtMjUsMzQgKzI1LDE0IEBACiAgICAgPFRleHRWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfc3RlcF90aXRsZSIKICAgICAgICAgc3R5bGU9IkBzdHlsZS9zZXR1cFN0ZXBUaXRsZVN0eWxlIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIiAvPgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9zZXR1cF9zdGVwX3ZlcnRpY2FsX3BhZGRpbmciCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQGRpbWVuL3NldHVwX3N0ZXBfdmVydGljYWxfcGFkZGluZyIgLz4KICAgICA8VGV4dFZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwX2luc3RydWN0aW9uIgogICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwU3RlcEluc3RydWN0aW9uU3R5bGUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIiAvPgotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMmRwIiAvPgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IkBkaW1lbi9zZXR1cF9zdGVwX3ZlcnRpY2FsX3BhZGRpbmciIC8+CiAgICAgPFRleHRWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfc3RlcF9hY3Rpb25fbGFiZWwiCiAgICAgICAgIHN0eWxlPSJAc3R5bGUvc2V0dXBTdGVwQWN0aW9uTGFiZWxTdHlsZSIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIxMmRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nU3RhcnQ9IjEyZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdFbmQ9IjI0ZHAiIC8+CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iQGRpbWVuL3NldHVwX3N0ZXBfaG9yaXpvbnRhbF9saW5lX2hlaWdodCIgLz4KIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L3NldHVwX3N0ZXBzX2NhcmRzLnhtbCBiL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGVwc19jYXJkcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwM2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGVwc19jYXJkcy54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHVwX3N0ZXBfYnVsbGV0cyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL3NldHVwX3N0ZXBfdmVydGljYWxfcGFkZGluZyIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwMV9idWxsZXQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwU3RlcEJ1bGxldFN0eWxlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NldHVwX3N0ZXAxX2J1bGxldCIgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHVwX3N0ZXAyX2J1bGxldCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvc2V0dXBTdGVwQnVsbGV0U3R5bGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0dXBfc3RlcDJfYnVsbGV0IiAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfc3RlcDNfYnVsbGV0IgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9zZXR1cFN0ZXBCdWxsZXRTdHlsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXR1cF9zdGVwM19idWxsZXQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnNldHVwLlNldHVwU3RlcEluZGljYXRvclZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwX2luZGljYXRvciIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9zZXR1cFN0ZXBJbmRpY2F0b3JTdHlsZSIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwc19wYW5lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHVwX3N0ZXAxIgorICAgICAgICAgICAgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3N0ZXAiIC8+CisgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHVwX3N0ZXAyIgorICAgICAgICAgICAgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3N0ZXAiIC8+CisgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHVwX3N0ZXAzIgorICAgICAgICAgICAgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3N0ZXAiIC8+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9uZXh0IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0dXBfbmV4dF9hY3Rpb24iCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kfGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9zZXR1cFN0ZXBBY3Rpb25MYWJlbFN0eWxlQ29tbW9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IkBkaW1lbi9zZXR1cF9zdGVwX2hvcml6b250YWxfbGluZV9oZWlnaHQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfZmluaXNoIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0dXBfZmluaXNoX2FjdGlvbiIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9zZXR1cFN0ZXBBY3Rpb25MYWJlbFN0eWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IkBkaW1lbi9zZXR1cF9zdGVwX2hvcml6b250YWxfbGluZV9oZWlnaHQiIC8+Cis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L3NldHVwX3N0ZXBzX3NjcmVlbi54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfc3RlcHNfc2NyZWVuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU5YzBhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvbGF5b3V0L3NldHVwX3N0ZXBzX3NjcmVlbi54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3N0ZXBzX3RpdGxlIiAvPgorICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9zZXR1cF9zdGVwc19jYXJkcyIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L3NldHVwX3N0ZXBzX3RpdGxlLnhtbCBiL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGVwc190aXRsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2OTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9zZXR1cF9zdGVwc190aXRsZS54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfdGl0bGUiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvc2V0dXBUaXRsZVN0eWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIiAvPgorPC9tZXJnZT4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2xheW91dC9zZXR1cF93ZWxjb21lX3NjcmVlbi54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2VsY29tZV9zY3JlZW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTk4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2VsY29tZV9zY3JlZW4ueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9zZXR1cF93ZWxjb21lX3RpdGxlIiAvPgorICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9zZXR1cF93ZWxjb21lX3ZpZGVvIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2VsY29tZV90aXRsZS54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2VsY29tZV90aXRsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3MDUzYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9zZXR1cF93ZWxjb21lX3RpdGxlLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWVyZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF93ZWxjb21lX3RpdGxlIgorICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwVGl0bGVTdHlsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0dXBfd2VsY29tZV9hZGRpdGlvbmFsX2Rlc2NyaXB0aW9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IkBkaW1lbi9zZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RvcF9tYXJnaW4iCisgICAgICAgIHN0eWxlPSJAc3R5bGUvc2V0dXBXZWxjb21lRGVzY3JpdHBpb25TdHlsZSIgLz4KKzwvbWVyZ2U+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2VsY29tZV92aWRlby54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2VsY29tZV92aWRlby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxNzczMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9zZXR1cF93ZWxjb21lX3ZpZGVvLnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWVyZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9zZXR1cF93ZWxjb21lX3ZpZGVvX3RvcF9wYWRkaW5nIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IkBkaW1lbi9zZXR1cF93ZWxjb21lX3ZpZGVvX2JvdHRvbV9wYWRkaW5nIj4KKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9zZXR1cF93ZWxjb21lX3ZpZGVvX3dlaWdodF9pbl9zY3JlZW4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxZHAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9zZXR1cF93ZWxjb21lX3ZpZGVvX21hcmdpbl9jb2xvciIgPgorICAgICAgICAgICAgPFZpZGVvVmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfd2VsY29tZV92aWRlbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL3NldHVwX2JhY2tncm91bmQiIC8+CisgICAgICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF93ZWxjb21lX2ltYWdlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDphZGp1c3RWaWV3Qm91bmRzPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IkBpbnRlZ2VyL3NldHVwX3dlbGNvbWVfdmlkZW9fZW5kX3BhZGRpbmdfd2VpZ2h0X2luX3NjcmVlbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8Y29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc2V0dXAuU2V0dXBTdGFydEluZGljYXRvclZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+Cis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L3NldHVwX3dpemFyZC54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2l6YXJkLnhtbAppbmRleCBhY2JiZTMwLi44N2RiNGQwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2l6YXJkLnhtbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvc2V0dXBfd2l6YXJkLnhtbApAQCAtMTgsNjEgKzE4LDE5IEBACiAqLwogLS0+CiAKLTxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF93aXphcmQiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmZpbGxWaWV3cG9ydD0idHJ1ZSI+Ci0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9zZXR1cF9iYWNrZ3JvdW5kIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vc2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL3NldHVwX2hvcml6b250YWxfcGFkZGluZyIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfdGl0bGUiCi0gICAgICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwVGl0bGVTdHlsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIgLz4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwX2J1bGxldHMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3NldHVwX3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwU3RlcEJ1bGxldFN0eWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXR1cF9zdGVwMV9idWxsZXQiIC8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwU3RlcEJ1bGxldFN0eWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXR1cF9zdGVwMl9idWxsZXQiIC8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL3NldHVwU3RlcEJ1bGxldFN0eWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXR1cF9zdGVwM19idWxsZXQiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8Y29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc2V0dXAuU2V0dXBTdGVwSW5kaWNhdG9yVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwX2luZGljYXRvciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3NldHVwX3N0ZXBfYnVsbGV0cyIgLz4KLSAgICAgICAgPEZyYW1lTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3NldHVwX3N0ZXBfaW5kaWNhdG9yIj4KLSAgICAgICAgICAgIDxpbmNsdWRlCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwMSIKLSAgICAgICAgICAgICAgICBsYXlvdXQ9IkBsYXlvdXQvc2V0dXBfc3RlcCIgLz4KLSAgICAgICAgICAgIDxpbmNsdWRlCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwMiIKLSAgICAgICAgICAgICAgICBsYXlvdXQ9IkBsYXlvdXQvc2V0dXBfc3RlcCIgLz4KLSAgICAgICAgICAgIDxpbmNsdWRlCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR1cF9zdGVwMyIKLSAgICAgICAgICAgICAgICBsYXlvdXQ9IkBsYXlvdXQvc2V0dXBfc3RlcCIgLz4KLSAgICAgICAgPC9GcmFtZUxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9TY3JvbGxWaWV3PgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL3NldHVwX2JhY2tncm91bmQiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iQGRpbWVuL3NldHVwX2hvcml6b250YWxfcGFkZGluZyIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL3NldHVwX2hvcml6b250YWxfcGFkZGluZyIKKyAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9zZXR1cF92ZXJ0aWNhbF9wYWRkaW5nIgorICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQGRpbWVuL3NldHVwX3ZlcnRpY2FsX3BhZGRpbmciPgorICAgIDxpbmNsdWRlCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dXBfd2VsY29tZV9zY3JlZW4iCisgICAgICAgIGxheW91dD0iQGxheW91dC9zZXR1cF93ZWxjb21lX3NjcmVlbiIgLz4KKyAgICA8aW5jbHVkZQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHVwX3N0ZXBzX3NjcmVlbiIKKyAgICAgICAgbGF5b3V0PSJAbGF5b3V0L3NldHVwX3N0ZXBzX3NjcmVlbiIgLz4KKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9sYXlvdXQvdXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkLnhtbCBiL2phdmEvcmVzL2xheW91dC91c2VyX2RpY3Rpb25hcnlfYWRkX3dvcmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjliMWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvdXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkLnhtbApAQCAtMCwwICsxLDk5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC91c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ190b3AiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKworICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpYWxvZ1RpdGxlCisgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZVN0eWxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5FbmQ9IjE2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjE2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfHN0YXJ0IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX3RpdGxlIiAvPgorCisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9ob2xvX2JsdWVfbGlnaHQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VyX2RpY3Rpb25hcnlfYWRkX3dvcmRfdGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfd29yZF9oaW50IgorICAgICAgICBhbmRyb2lkOmltZU9wdGlvbnM9ImZsYWdOb0Z1bGxzY3JlZW4iCisgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0Tm9TdWdnZXN0aW9ucyIKKyAgICAgICAgYW5kcm9pZDptYXhMZW5ndGg9IkBpbnRlZ2VyL3VzZXJfZGljdGlvbmFyeV9tYXhfd29yZF9sZW5ndGgiID4KKworICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9FZGl0VGV4dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6ZGl2aWRlcj0iP2FuZHJvaWQ6YXR0ci9kaXZpZGVySG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpkaXZpZGVyUGFkZGluZz0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6c2hvd0RpdmlkZXJzPSJiZWdpbm5pbmciID4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJTdHlsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJCdXR0b25TdHlsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJzdGFydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQ2xpY2tDYW5jZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NhbmNlbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNHNwIiAvPgorCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyQnV0dG9uU3R5bGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ib25DbGlja0NvbmZpcm0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX2NvbmZpcm0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2xheW91dC91c2VyX2RpY3Rpb25hcnlfYWRkX3dvcmRfZnVsbHNjcmVlbi54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvdXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkX2Z1bGxzY3JlZW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTQ4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvdXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkX2Z1bGxzY3JlZW4ueG1sCkBAIC0wLDAgKzEsODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX3RvcCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VyX2RpY3Rpb25hcnlfYWRkX3dvcmRfdGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfd29yZF9oaW50IgorICAgICAgICBhbmRyb2lkOmltZU9wdGlvbnM9ImZsYWdOb0Z1bGxzY3JlZW4iCisgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0Tm9TdWdnZXN0aW9ucyIKKyAgICAgICAgYW5kcm9pZDptYXhMZW5ndGg9IkBpbnRlZ2VyL3VzZXJfZGljdGlvbmFyeV9tYXhfd29yZF9sZW5ndGgiID4KKworICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9FZGl0VGV4dD4KKworICAgIDxHcmlkTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkX2dyaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5FbmQ9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmNvbHVtbkNvdW50PSIyIiA+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3VzZXJfZGljdGlvbmFyeV9hZGRfc2hvcnRjdXRfbGFiZWwiCisgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ic3RhcnR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfb3B0aW9uX25hbWUiIC8+CisKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3VzZXJfZGljdGlvbmFyeV9hZGRfc2hvcnRjdXQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3VzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfaGludCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iZmxhZ05vRnVsbHNjcmVlbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0Tm9TdWdnZXN0aW9ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGVuZ3RoPSJAaW50ZWdlci91c2VyX2RpY3Rpb25hcnlfbWF4X3dvcmRfbGVuZ3RoIiAvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VyX2RpY3Rpb25hcnlfYWRkX2xvY2FsZV9sYWJlbCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJzdGFydHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9sb2NhbGVfb3B0aW9uX25hbWUiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisKKyAgICAgICAgPFNwaW5uZXIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdXNlcl9kaWN0aW9uYXJ5X2FkZF9sb2NhbGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgIDwvR3JpZExheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L3VzZXJfZGljdGlvbmFyeV9pdGVtLnhtbCBiL2phdmEvcmVzL2xheW91dC91c2VyX2RpY3Rpb25hcnlfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiYWQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC91c2VyX2RpY3Rpb25hcnlfaXRlbS54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOnBhZGRpbmdFbmQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSIgPgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RleHQxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIiAvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RleHQyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25TdGFydD0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L3VzZXJfZGljdGlvbmFyeV9wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnQueG1sIGIvamF2YS9yZXMvbGF5b3V0L3VzZXJfZGljdGlvbmFyeV9wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTU2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvdXNlcl9kaWN0aW9uYXJ5X3ByZWZlcmVuY2VfbGlzdF9mcmFnbWVudC54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKworICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbWlwbWFwLWhkcGkvaWNfaW1lX3NldHRpbmdzLnBuZyBiL2phdmEvcmVzL21pcG1hcC1oZHBpL2ljX2ltZV9zZXR0aW5ncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NmM3MGQuLjAwMDAwMDAKLS0tIGEvamF2YS9yZXMvbWlwbWFwLWhkcGkvaWNfaW1lX3NldHRpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL21pcG1hcC1oZHBpL2ljX2xhdW5jaGVyX2tleWJvYXJkLnBuZyBiL2phdmEvcmVzL21pcG1hcC1oZHBpL2ljX2xhdW5jaGVyX2tleWJvYXJkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIxY2NhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvbWlwbWFwLWhkcGkvaWNfbGF1bmNoZXJfa2V5Ym9hcmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL21pcG1hcC1tZHBpL2ljX2ltZV9zZXR0aW5ncy5wbmcgYi9qYXZhL3Jlcy9taXBtYXAtbWRwaS9pY19pbWVfc2V0dGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY0YWZiLi4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL21pcG1hcC1tZHBpL2ljX2ltZV9zZXR0aW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9taXBtYXAtbWRwaS9pY19sYXVuY2hlcl9rZXlib2FyZC5wbmcgYi9qYXZhL3Jlcy9taXBtYXAtbWRwaS9pY19sYXVuY2hlcl9rZXlib2FyZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZjE4OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL21pcG1hcC1tZHBpL2ljX2xhdW5jaGVyX2tleWJvYXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9taXBtYXAteGhkcGkvaWNfaW1lX3NldHRpbmdzLnBuZyBiL2phdmEvcmVzL21pcG1hcC14aGRwaS9pY19pbWVfc2V0dGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmYxOTE5Li4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL21pcG1hcC14aGRwaS9pY19pbWVfc2V0dGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbWlwbWFwLXhoZHBpL2ljX2xhdW5jaGVyX2tleWJvYXJkLnBuZyBiL2phdmEvcmVzL21pcG1hcC14aGRwaS9pY19sYXVuY2hlcl9rZXlib2FyZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzMjA4MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL21pcG1hcC14aGRwaS9pY19sYXVuY2hlcl9rZXlib2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbWlwbWFwLXh4aGRwaS9pY19pbWVfc2V0dGluZ3MucG5nIGIvamF2YS9yZXMvbWlwbWFwLXh4aGRwaS9pY19pbWVfc2V0dGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZjNjkzLi4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL21pcG1hcC14eGhkcGkvaWNfaW1lX3NldHRpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL21pcG1hcC14eGhkcGkvaWNfbGF1bmNoZXJfa2V5Ym9hcmQucG5nIGIvamF2YS9yZXMvbWlwbWFwLXh4aGRwaS9pY19sYXVuY2hlcl9rZXlib2FyZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjNDI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL21pcG1hcC14eGhkcGkvaWNfbGF1bmNoZXJfa2V5Ym9hcmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL3Jhdy9lbXB0eS5kaWN0IGIvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QKaW5kZXggZGExYmY5Ni4uODBjZTA2NiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QKKysrIGIvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QKQEAgLTEgKzEgQEAKLXixClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorm8E6/gpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvcmVzL3Jhdy9tYWluX2VuLmRpY3QgYi9qYXZhL3Jlcy9yYXcvbWFpbl9lbi5kaWN0CmluZGV4IDUyNjc2MWMuLjA4Njg3NGQgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3Jhdy9tYWluX2VuLmRpY3QKKysrIGIvamF2YS9yZXMvcmF3L21haW5fZW4uZGljdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9yYXcvbWFpbl9mci5kaWN0IGIvamF2YS9yZXMvcmF3L21haW5fZnIuZGljdAppbmRleCA3NTIwODk4Li45MDQ0YzdlIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy9yYXcvbWFpbl9mci5kaWN0CisrKyBiL2phdmEvcmVzL3Jhdy9tYWluX2ZyLmRpY3QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvcmF3L21haW5fcnUuZGljdCBiL2phdmEvcmVzL3Jhdy9tYWluX3J1LmRpY3QKaW5kZXggMjE2ZmYwOS4uNzA3NDQxNiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvcmF3L21haW5fcnUuZGljdAorKysgYi9qYXZhL3Jlcy9yYXcvbWFpbl9ydS5kaWN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL3Jhdy9zZXR1cF93ZWxjb21lX2ltYWdlLnBuZyBiL2phdmEvcmVzL3Jhdy9zZXR1cF93ZWxjb21lX2ltYWdlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQ1OTE1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvcmF3L3NldHVwX3dlbGNvbWVfaW1hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL3Jhdy9zZXR1cF93ZWxjb21lX3ZpZGVvLm1wNCBiL2phdmEvcmVzL3Jhdy9zZXR1cF93ZWxjb21lX3ZpZGVvLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjA4NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvcmF3L3NldHVwX3dlbGNvbWVfdmlkZW8ubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1hZi9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFmL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1hZi9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1hbS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFtL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1hbS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1hci9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFyL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1hci9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1iZS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWJlL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1iZS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1iZy9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWJnL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1iZy9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1jYS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWNhL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1jYS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1jcy9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWNzL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1jcy9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1kYS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWRhL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1kYS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1kZS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWRlL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1kZS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1lbC9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWVsL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1lbC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1lbi1yR0IvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1lbi1yR0IvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWVuLXJHQi9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1lcy1yVVMvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1lcy1yVVMvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWVzLXJVUy9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1lcy9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWVzL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1lcy9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1ldC9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWV0L2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1ldC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1mYS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWZhL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1mYS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1maS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWZpL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1maS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1mci9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLWZyL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1mci9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1oMTIwMGRwLXBvcnQvc2V0dXAtZGltZW5zLWxhcmdlLXRhYmxldC1wb3J0LnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1oMTIwMGRwLXBvcnQvc2V0dXAtZGltZW5zLWxhcmdlLXRhYmxldC1wb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc5MjhkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWgxMjAwZHAtcG9ydC9zZXR1cC1kaW1lbnMtbGFyZ2UtdGFibGV0LXBvcnQueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8IS0tIFNldHVwIHdpemFyZCBkaW1lbnNpb25zIGZvciBsYXJnZS10YWJsZXQvcG9ydHJhaXQuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF90aXRsZV90ZXh0X3NpemUiPjcyc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RleHRfc2l6ZSI+MzhzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYnVsbGV0X3RleHRfc2l6ZSI+MjRzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdHJpYW5nbGVfaW5kaWNhdG9yX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaW5kaWNhdG9yX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdGl0bGVfdGV4dF9zaXplIj4yNHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbnN0cnVjdGlvbl90ZXh0X3NpemUiPjE4c3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2FjdGlvbl90ZXh0X3NpemUiPjIwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF92ZXJ0aWNhbF9wYWRkaW5nIj45NmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIj4xNDRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYWN0aW9uX2hlaWdodCI+NDhkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaG9yaXpvbnRhbF9wYWRkaW5nIj4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmdfaGFsZiI+MTJkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdmVydGljYWxfcGFkZGluZyI+MTZkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaG9yaXpvbnRhbF9saW5lX2hlaWdodCI+MmRwPC9kaW1lbj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF90aXRsZV93ZWlnaHRfaW5fc2NyZWVuIj40MDwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF9ib2R5X3dlaWdodF9pbl9zY3JlZW4iPjYwPC9pbnRlZ2VyPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF90aXRsZV9lbmRfbWFyZ2luIj4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfd2VsY29tZV9kZXNjcmlwdGlvbl90b3BfbWFyZ2luIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb190b3BfcGFkZGluZyI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fYm90dG9tX3BhZGRpbmciPjI0ZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fd2VpZ2h0X2luX3NjcmVlbiI+NzA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb19lbmRfcGFkZGluZ193ZWlnaHRfaW5fc2NyZWVuIj4zMDwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWgzMzBkcC1sYW5kL3NldHVwLWRpbWVucy1sYXJnZS1waG9uZS1sYW5kLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1oMzMwZHAtbGFuZC9zZXR1cC1kaW1lbnMtbGFyZ2UtcGhvbmUtbGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViZjZkMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1oMzMwZHAtbGFuZC9zZXR1cC1kaW1lbnMtbGFyZ2UtcGhvbmUtbGFuZC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDwhLS0gU2V0dXAgd2l6YXJkIGRpbWVuc2lvbnMgZm9yIGxhcmdlLXBob25lL2xhbmRzY2FwZS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX3RleHRfc2l6ZSI+NDBzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfZGVzY3JpcHRpb25fdGV4dF9zaXplIj4yMnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9idWxsZXRfdGV4dF9zaXplIj4yMnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90cmlhbmdsZV9pbmRpY2F0b3JfaGVpZ2h0Ij4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbmRpY2F0b3JfaGVpZ2h0Ij4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90aXRsZV90ZXh0X3NpemUiPjIwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2luc3RydWN0aW9uX3RleHRfc2l6ZSI+MTZzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYWN0aW9uX3RleHRfc2l6ZSI+MThzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3ZlcnRpY2FsX3BhZGRpbmciPjE2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9ob3Jpem9udGFsX3BhZGRpbmciPjE2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2FjdGlvbl9oZWlnaHQiPjQ4ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZyI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaG9yaXpvbnRhbF9wYWRkaW5nX2hhbGYiPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX3ZlcnRpY2FsX3BhZGRpbmciPjE2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfbGluZV9oZWlnaHQiPjJkcDwvZGltZW4+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfdGl0bGVfd2VpZ2h0X2luX3NjcmVlbiI+NDA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfYm9keV93ZWlnaHRfaW5fc2NyZWVuIj42MDwvaW50ZWdlcj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfdGl0bGVfZW5kX21hcmdpbiI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfZGVzY3JpcHRpb25fdG9wX21hcmdpbiI+MTBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fdG9wX3BhZGRpbmciPjBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fYm90dG9tX3BhZGRpbmciPjEyZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fd2VpZ2h0X2luX3NjcmVlbiI+NzA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb19lbmRfcGFkZGluZ193ZWlnaHRfaW5fc2NyZWVuIj4zMDwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWg1MjBkcC1sYW5kL3NldHVwLWRpbWVucy1zbWFsbC10YWJsZXQtbGFuZC54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaDUyMGRwLWxhbmQvc2V0dXAtZGltZW5zLXNtYWxsLXRhYmxldC1sYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWRmNzlmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWg1MjBkcC1sYW5kL3NldHVwLWRpbWVucy1zbWFsbC10YWJsZXQtbGFuZC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDwhLS0gU2V0dXAgd2l6YXJkIGRpbWVuc2lvbnMgZm9yIHNtYWxsLXRhYmxldC9sYW5kc2NhcGUuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF90aXRsZV90ZXh0X3NpemUiPjYwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RleHRfc2l6ZSI+MzJzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYnVsbGV0X3RleHRfc2l6ZSI+MjRzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdHJpYW5nbGVfaW5kaWNhdG9yX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaW5kaWNhdG9yX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdGl0bGVfdGV4dF9zaXplIj4yNHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbnN0cnVjdGlvbl90ZXh0X3NpemUiPjE4c3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2FjdGlvbl90ZXh0X3NpemUiPjIwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF92ZXJ0aWNhbF9wYWRkaW5nIj4zMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIj45NmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9hY3Rpb25faGVpZ2h0Ij40OGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmciPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZ19oYWxmIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF92ZXJ0aWNhbF9wYWRkaW5nIj4xNmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX2xpbmVfaGVpZ2h0Ij4yZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3RpdGxlX3dlaWdodF9pbl9zY3JlZW4iPjUwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX2JvZHlfd2VpZ2h0X2luX3NjcmVlbiI+NTA8L2ludGVnZXI+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX2VuZF9tYXJnaW4iPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RvcF9tYXJnaW4iPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3RvcF9wYWRkaW5nIj4wZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX2JvdHRvbV9wYWRkaW5nIj4yNGRwPC9kaW1lbj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3dlaWdodF9pbl9zY3JlZW4iPjgwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fZW5kX3BhZGRpbmdfd2VpZ2h0X2luX3NjcmVlbiI+MjA8L2ludGVnZXI+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1oNTQwZHAtcG9ydC9zZXR1cC1kaW1lbnMtbGFyZ2UtcGhvbmUtcG9ydC54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaDU0MGRwLXBvcnQvc2V0dXAtZGltZW5zLWxhcmdlLXBob25lLXBvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjZmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaDU0MGRwLXBvcnQvc2V0dXAtZGltZW5zLWxhcmdlLXBob25lLXBvcnQueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8IS0tIFNldHVwIHdpemFyZCBkaW1lbnNpb25zIGZvciBsYXJnZS1waG9uZS9wb3J0cmFpdC4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX3RleHRfc2l6ZSI+NDhzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfZGVzY3JpcHRpb25fdGV4dF9zaXplIj4yNnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9idWxsZXRfdGV4dF9zaXplIj4yMnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90cmlhbmdsZV9pbmRpY2F0b3JfaGVpZ2h0Ij4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbmRpY2F0b3JfaGVpZ2h0Ij4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90aXRsZV90ZXh0X3NpemUiPjIwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2luc3RydWN0aW9uX3RleHRfc2l6ZSI+MTZzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYWN0aW9uX3RleHRfc2l6ZSI+MThzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3ZlcnRpY2FsX3BhZGRpbmciPjhkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX2hvcml6b250YWxfcGFkZGluZyI+MTZkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYWN0aW9uX2hlaWdodCI+NDhkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaG9yaXpvbnRhbF9wYWRkaW5nIj4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmdfaGFsZiI+MTJkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdmVydGljYWxfcGFkZGluZyI+MTZkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaG9yaXpvbnRhbF9saW5lX2hlaWdodCI+MmRwPC9kaW1lbj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF90aXRsZV93ZWlnaHRfaW5fc2NyZWVuIj40MDwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF9ib2R5X3dlaWdodF9pbl9zY3JlZW4iPjYwPC9pbnRlZ2VyPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF90aXRsZV9lbmRfbWFyZ2luIj4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfd2VsY29tZV9kZXNjcmlwdGlvbl90b3BfbWFyZ2luIj42ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3RvcF9wYWRkaW5nIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb19ib3R0b21fcGFkZGluZyI+MTJkcDwvZGltZW4+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb193ZWlnaHRfaW5fc2NyZWVuIj43MDwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX2VuZF9wYWRkaW5nX3dlaWdodF9pbl9zY3JlZW4iPjMwPC9pbnRlZ2VyPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaDcyMGRwLWxhbmQvc2V0dXAtZGltZW5zLWxhcmdlLXRhYmxldC1sYW5kLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1oNzIwZHAtbGFuZC9zZXR1cC1kaW1lbnMtbGFyZ2UtdGFibGV0LWxhbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmI3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaDcyMGRwLWxhbmQvc2V0dXAtZGltZW5zLWxhcmdlLXRhYmxldC1sYW5kLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPCEtLSBTZXR1cCB3aXphcmQgZGltZW5zaW9ucyBmb3IgbGFyZ2UtdGFibGV0L2xhbmRzY2FwZS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX3RleHRfc2l6ZSI+NzJzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfZGVzY3JpcHRpb25fdGV4dF9zaXplIj4zOHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9idWxsZXRfdGV4dF9zaXplIj4yNHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90cmlhbmdsZV9pbmRpY2F0b3JfaGVpZ2h0Ij4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbmRpY2F0b3JfaGVpZ2h0Ij4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90aXRsZV90ZXh0X3NpemUiPjI0c3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2luc3RydWN0aW9uX3RleHRfc2l6ZSI+MThzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYWN0aW9uX3RleHRfc2l6ZSI+MjBzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3ZlcnRpY2FsX3BhZGRpbmciPjk2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9ob3Jpem9udGFsX3BhZGRpbmciPjE2MGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9hY3Rpb25faGVpZ2h0Ij40OGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmciPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZ19oYWxmIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF92ZXJ0aWNhbF9wYWRkaW5nIj4xNmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX2xpbmVfaGVpZ2h0Ij4yZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3RpdGxlX3dlaWdodF9pbl9zY3JlZW4iPjUwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX2JvZHlfd2VpZ2h0X2luX3NjcmVlbiI+NTA8L2ludGVnZXI+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX2VuZF9tYXJnaW4iPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RvcF9tYXJnaW4iPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3RvcF9wYWRkaW5nIj4wZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX2JvdHRvbV9wYWRkaW5nIj4yNGRwPC9kaW1lbj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3dlaWdodF9pbl9zY3JlZW4iPjgwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fZW5kX3BhZGRpbmdfd2VpZ2h0X2luX3NjcmVlbiI+MjA8L2ludGVnZXI+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1oODAwZHAtcG9ydC9zZXR1cC1kaW1lbnMtc21hbGwtdGFibGV0LXBvcnQueG1sIGIvamF2YS9yZXMvdmFsdWVzLWg4MDBkcC1wb3J0L3NldHVwLWRpbWVucy1zbWFsbC10YWJsZXQtcG9ydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjZjNhMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1oODAwZHAtcG9ydC9zZXR1cC1kaW1lbnMtc21hbGwtdGFibGV0LXBvcnQueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8IS0tIFNldHVwIHdpemFyZCBkaW1lbnNpb25zIGZvciBzbWFsbC10YWJsZXQvcG9ydHJhaXQuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF90aXRsZV90ZXh0X3NpemUiPjcyc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RleHRfc2l6ZSI+MzZzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYnVsbGV0X3RleHRfc2l6ZSI+MjRzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdHJpYW5nbGVfaW5kaWNhdG9yX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaW5kaWNhdG9yX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfdGl0bGVfdGV4dF9zaXplIj4yNHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbnN0cnVjdGlvbl90ZXh0X3NpemUiPjE4c3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2FjdGlvbl90ZXh0X3NpemUiPjIwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF92ZXJ0aWNhbF9wYWRkaW5nIj4zMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIj42NGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9hY3Rpb25faGVpZ2h0Ij40OGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmciPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZ19oYWxmIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF92ZXJ0aWNhbF9wYWRkaW5nIj4xNmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX2xpbmVfaGVpZ2h0Ij4yZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3RpdGxlX3dlaWdodF9pbl9zY3JlZW4iPjQwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX2JvZHlfd2VpZ2h0X2luX3NjcmVlbiI+NjA8L2ludGVnZXI+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX2VuZF9tYXJnaW4iPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RvcF9tYXJnaW4iPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3RvcF9wYWRkaW5nIj4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb19ib3R0b21fcGFkZGluZyI+MjRkcDwvZGltZW4+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb193ZWlnaHRfaW5fc2NyZWVuIj43MDwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX2VuZF9wYWRkaW5nX3dlaWdodF9pbl9zY3JlZW4iPjMwPC9pbnRlZ2VyPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaGkvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1oaS9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaGkvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaHIvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1oci9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaHIvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaHUvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1odS9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaHUvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaW4vZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1pbi9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaW4vZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaXMvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1pcy9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaXMvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwMGZiMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQ1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZW5nbGlzaF9pbWVfaW5wdXRfb3B0aW9ucyAoMzkwOTk0NTYxMjkzOTY2ODU1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlbmdsaXNoX2ltZV9yZXNlYXJjaF9sb2cgKDg0OTI2MDIyOTU2OTY1Nzc4NTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2Zvcl9zcGVsbGNoZWNraW5nX29wdGlvbl90aXRsZSAoNTM3NDEyMDk5ODEyNTM1Mzg5OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfY29udGFjdHNfZm9yX3NwZWxsY2hlY2tpbmdfb3B0aW9uX3N1bW1hcnkgKDg3NTQ0MTMzODI1NDMzMDc3MTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdmlicmF0ZV9vbl9rZXlwcmVzcyAoNTI1ODA3OTQ5NDI3Njk1NTQ2MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzb3VuZF9vbl9rZXlwcmVzcyAoNjA5MzU5MjI5NzE5ODI0MzY0NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb3B1cF9vbl9rZXlwcmVzcyAoMTIzODk0ODE1NzIzNTEyOTQ0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGdlbmVyYWxfY2F0ZWdvcnkgKDE4NTkwODg0NjcwMTc1NzMxOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29ycmVjdGlvbl9jYXRlZ29yeSAoMjIzNjc1MDkxNTA1NjYwNzYxMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX3R5cGluZ19jYXRlZ29yeSAoNDk3MjYzNjEyMTMwNTMyNjMwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1pc2NfY2F0ZWdvcnkgKDY4OTQxOTI4MTQ4NjgyMzM0NTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWR2YW5jZWRfc2V0dGluZ3MgKDM2Mjg5NTE0NDQ5NTU5MTQ2MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZHZhbmNlZF9zZXR0aW5nc19zdW1tYXJ5ICg0NDg3OTgwNDU2MTUyODMwMjcxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGluY2x1ZGVfb3RoZXJfaW1lc19pbl9sYW5ndWFnZV9zd2l0Y2hfbGlzdCAoNDUzMzY4OTk2MDMwODU2NTUxOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbmNsdWRlX290aGVyX2ltZXNfaW5fbGFuZ3VhZ2Vfc3dpdGNoX2xpc3Rfc3VtbWFyeSAoODQwNjM3MTI5MTAzMzE3NjM1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3dfbGFuZ3VhZ2Vfc3dpdGNoX2tleSAoNTkxNTQ3ODgyODMxODc3NDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG93X2xhbmd1YWdlX3N3aXRjaF9rZXlfc3VtbWFyeSAoNzM0MzQwMzY0NzQ3NDI2NTcxMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzbGlkaW5nX2tleV9pbnB1dF9wcmV2aWV3ICg2NjA0MjYyMzU5NTEwMDY4MzcwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNsaWRpbmdfa2V5X2lucHV0X3ByZXZpZXdfc3VtbWFyeSAoNjM0MDUyNDM0NTcyOTA5Mzg4NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlfcHJldmlld19wb3B1cF9kaXNtaXNzX2RlbGF5ICg2MjEzMTY0ODk3NDQzMDY4MjQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleV9wcmV2aWV3X3BvcHVwX2Rpc21pc3Nfbm9fZGVsYXkgKDIwOTYxMjMxNTE1NzE0NTgwNjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5X3ByZXZpZXdfcG9wdXBfZGlzbWlzc19kZWZhdWx0X2RlbGF5ICgyMTY2OTY0MzMzOTAzOTA2NzM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFiYnJldmlhdGlvbl91bml0X21pbGxpc2Vjb25kcyAoODcwMDI4NjA5NDAyODMyMzM2MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfY29udGFjdHNfZGljdCAoNDQzNTMxNzk3NzgwNDE4MDgxNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfY29udGFjdHNfZGljdF9zdW1tYXJ5ICg2NTk5OTgzMzM0NTA3ODc5OTU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZV9kb3VibGVfc3BhY2VfcGVyaW9kICg4NzgxNTI5OTY5NDI1MDgyODYwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZV9kb3VibGVfc3BhY2VfcGVyaW9kX3N1bW1hcnkgKDY1MzI4OTIxODcyNDc5NTI3OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jYXAgKDE3MTk3NDY2NzQ4NTQ2MjgyNTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jYXBfc3VtbWFyeSAoNzkzNDQ1Mjc2MTAyMjk0Njg3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0X3BlcnNvbmFsX2RpY3Rpb25hcnkgKDM5OTY5MTAwMzg5NTI5NDA0MjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29uZmlndXJlX2RpY3Rpb25hcmllc190aXRsZSAoNDIzODY1MjMzODU1NjkwMjA0OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYWluX2RpY3Rpb25hcnkgKDQ3OTg3NjM3ODE4MTgzNjExNjgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc2hvd19zdWdnZXN0aW9ucyAoODAyNjc5OTY2MzQ0NTUzMTYzNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19zaG93X3N1Z2dlc3Rpb25zX3N1bW1hcnkgKDE1ODMxMzIyNzk0OTg1MDI4MjUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc3VnZ2VzdGlvbl92aXNpYmlsaXR5X3Nob3dfbmFtZSAoMzIxOTkxNjU5NDA2NzU1MTMwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19zdWdnZXN0aW9uX3Zpc2liaWxpdHlfc2hvd19vbmx5X3BvcnRyYWl0X25hbWUgKDM4NTk3ODM3Njc0MzUyMzkxMTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc3VnZ2VzdGlvbl92aXNpYmlsaXR5X2hpZGVfbmFtZSAoNjMwOTE0MzkyNjQyMjIzNDY3MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19ibG9ja19wb3RlbnRpYWxseV9vZmZlbnNpdmVfdGl0bGUgKDUwNzg0ODAwNzEwNTc0MDg5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlX3N1bW1hcnkgKDIzNzE4MzU0Nzk3MzQ5OTEzNjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uICg3NjMwNzIwODg1MTk0OTk2OTUwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl9zdW1tYXJ5ICg1NjI1NzUxNTUxMTM0NjU4MDA2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl90aHJlc2hvbGRfbW9kZV9vZmYgKDg0NzA4ODI2NjU0MTc5NDQwMjYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZF9tb2RlX21vZGVzdCAoODc4ODM2NjY5MDYyMDc5OTA5NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvX2NvcnJlY3Rpb25fdGhyZXNob2xkX21vZGVfYWdnZXJlc3NpdmUgKDM1MjQwMjkxMDM3MzQ5MjM4MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZF9tb2RlX3ZlcnlfYWdnZXJlc3NpdmUgKDMzODY3ODIyMzU1NDA1NDc2NzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYmlncmFtX3ByZWRpY3Rpb24gKDEwODQ0NDkxODc3MjM5NDg1NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYmlncmFtX3ByZWRpY3Rpb25fc3VtbWFyeSAoMzg5NjM2MjY4Mjc1MTEwOTY3NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX2lucHV0ICg4MjY5NTExNTIyNTQ1NjM4MjcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9pbnB1dF9zdW1tYXJ5ICg5MTgwMzUwNjM5MzA1NzMxMjMxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGdlc3R1cmVfcHJldmlld190cmFpbCAoMzgwMjMzMzM2OTMzNTcyMjIyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdGV4dCAoNDQ0MzI0MDMzNDczOTM4MTA1MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdGV4dF9zdW1tYXJ5ICg0NDcyNjk2MjEzOTk2MjAzNTMzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFkZGVkX3dvcmQgKDg5OTM4ODMzNTQ2MjI0ODQzNzIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsYWJlbF9nb19rZXkiIG1zZ2lkPSIxNjM1MTQ4MDgyMTM3MjE5MTQ4Ij4iw4FmcmFtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfbmV4dF9rZXkiIG1zZ2lkPSIzNjI5NzI4NDQ1MjU2NzI1NjgiPiJOw6ZzdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYWJlbF9wcmV2aW91c19rZXkiIG1zZ2lkPSIxMjExODY4MTE4MDcxMzg2Nzg3Ij4iRnlycmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYWJlbF9kb25lX2tleSIgbXNnaWQ9IjI0NDE1Nzg3NDg3NzI1MjkyODgiPiJMb2tpw7AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYWJlbF9zZW5kX2tleSIgbXNnaWQ9IjI4MTUwNTY1MzQ0MzM3MTc0NDQiPiJTZW5kYSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYWJlbF9wYXVzZV9rZXkgKDE4MTA5ODMwODQyODAzNTM0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYWJlbF93YWl0X2tleSAoNjQwMjE1MjYwMDg3ODA5MzEzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fdXNlX2hlYWRwaG9uZXMgKDg5Njk2MTc4MTI4NzI4MzQ5MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fY3VycmVudF90ZXh0X2lzICgyNDg1NzIzMDExMjcyNTgzODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9ub190ZXh0X2VudGVyZWQgKDc0Nzk2ODUyMjU1OTczNDQ0OTYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3Vua25vd24gKDMxOTc0MzQwMTA0MDIxNzkxNTcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0ICgyNDQxOTc4ODMyOTI1NDkzMDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0X3NoaWZ0ZWQgKDE2ODE4NzczMjMzNDQxOTUwMzUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2NhcHNfbG9jayAoMzI3NjQ3ODI2OTUyNjMwNDQzMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fZGVsZXRlICg4NzQwMzc2OTQ0Mjc2MTk5ODAxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl90b19zeW1ib2wgKDU0ODYzNDAxMDc1MDA0NDg5NjkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3RvX2FscGhhICgyMzEyOTMzODgxOTc3MTgwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdG9fbnVtZXJpYyAoNTkxNzUyMDkyNjg1MTYxNzMyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zZXR0aW5ncyAoNDYyNzQ2MjY4OTYwMzgzODA5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdGFiICgyNjY3NzE2MDAyNjYzNDgyMjQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zcGFjZSAoMjU4MjUyMTA1MDA0OTg2MDg1OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbWljICg2MTU1MzY3NDg4ODI2MTE5NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NtaWxleSAoMjI1NjMwOTgyNjIwMDExMzkxOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fcmV0dXJuICg4MTc4MDgzMTc3MjM4MzE1NjQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zZWFyY2ggKDEyNDcyMzYxNjM3NTU5MjA4MDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2RvdCAoNDA3MTEwODI0MzUyMzE2NzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2xhbmd1YWdlX3N3aXRjaCAoNTUwNzA5MTMyODIyMjMzMTMxNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fYWN0aW9uX25leHQgKDg2MzYwNzgyNzY2NjQxNTAzMjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2FjdGlvbl9wcmV2aW91cyAoODAwODcyNDE1MDA5MzM2MjA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zaGlmdG1vZGVfb24gKDU3MDA0NDA3OTg2MDk1NzQ1ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0bW9kZV9sb2NrZWQgKDU5MzE3NTgwMzE4MTcwMTgzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc2hpZnRtb2RlX29mZiAoNjU3MjE5OTk4NDQ5MTc0ODA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9tb2RlX3N5bWJvbCAoNzE4MzM0Mzg3OTkwOTc0NzY0MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9hbHBoYSAoMzUyODMwNzY3NDM5MDE1Njk1NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9waG9uZSAoNjUyMDIwNzk0MzEzMjAyNjI2NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9waG9uZV9zaGlmdCAoNTQ5OTYyOTc1Mzk2MjY0MTIyNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhbm5vdW5jZV9rZXlib2FyZF9oaWRkZW4gKDg3MTg5Mjc4MzU1MzE0Mjk4MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYW5ub3VuY2Vfa2V5Ym9hcmRfbW9kZSAoNDcyOTA4MTA1NTQzODUwODMyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2RhdGUgKDMxMzc1MjAxNjY4MTcxMjgxMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9kYXRlX3RpbWUgKDMzOTU5MzM1ODQ4ODg1MTA3MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2VtYWlsICg2MjE2MjQ4MDc4MTI4Mjk0MjYyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfaW0gKDExMzc0MDUwODk3NjY1NTcwNDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9udW1iZXIgKDc5OTE2MjM0NDA2OTk5NTcwNjkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9waG9uZSAoNjg1MTYyNzUyNzQwMTQzMzIyOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX3RleHQgKDY0Nzk0MzY2ODc4OTk3MDE2MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV90aW1lICg0MzgxODU2ODg1NTgyMTQzMjc3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfdXJsICgxNTE5ODE5ODM1NTE0OTExMjE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0ICgzNTgzMjU4NTgzNTIxMzk3NTQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX21haW5fa2V5Ym9hcmQgKDMzNjA2NjAzNDExMjEwODMxNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3ltYm9sc19rZXlib2FyZCAoNzIwMzIxMzI0MDc4NjA4NDA2NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19vZmYgKDM3NDU2OTk3NDgyMTgwODIwMTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3VtbWFyeV9tYWluX2tleWJvYXJkICg2NTg2NTQ0MjkyOTAwMzE0MzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX3N1bW1hcnlfc3ltYm9sc19rZXlib2FyZCAoNTIzMzcyNTkyNzI4MTkzMjM5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19zdW1tYXJ5X29mZiAoNjM4NzU2MDk1OTE4OTc2MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29uZmlndXJlX2lucHV0X21ldGhvZCAoMzczMzU2MjcwMjkwNzQyNDU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhbmd1YWdlX3NlbGVjdGlvbl90aXRsZSAoMTY1MTI5OTU5ODU1NTMyNjc1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZW5kX2ZlZWRiYWNrICgxNzgwNDMxODg0MTA5MzkyMDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdF9sYW5ndWFnZSAoMzY5MzgxNTU4ODc3NzkyNjg0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBoaW50X2FkZF90b19kaWN0aW9uYXJ5ICg1NzM2Nzg2NTY5NDYwODUzODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaGFzX2RpY3Rpb25hcnkgKDYwNzE4NDc5NzM0NjY2MjUwMDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfZW5hYmxlX2xvZyAoNjYyMDQyNDUwNTA3Mjk2MzU1NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19kZXNjcmlwdGlvbl9sb2cgKDc1MjUyMjU1ODQ1NTU0MjkyMTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbGF5b3V0ICg4NDUxMTY0NzgzNTEwNDg3NTAxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfZW5fR0IgKDg4MTcwNjAxOTQyMzExMzU1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfZW5fVVMgKDYxNjA0NTIzMzY2MzQ1MzQyMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9lc19VUyAoNTU4MzE0NTE5MTQzMDE4MDIwMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX3dpdGhfbGF5b3V0X2VuX0dCICgyMTc5MDk3NzQ4NzI0NzI1OTA2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfd2l0aF9sYXlvdXRfZW5fVVMgKDEzNjI1ODEzNDc1NzY3MTQ1NzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV93aXRoX2xheW91dF9lc19VUyAoNjI2MTc5MTA1NzAwNzg5MDE4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlICgxNDE0MjA4NTc4MDg4MDE3NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9xd2VydHkgKDI5NTYxMjE0NTE2MTY2MzMxMzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9xd2VydHogKDExNzc4NDgxNzIzOTcyMDI4OTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9hemVydHkgKDg3MjE0NjA5NjgxNDExODczOTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9kdm9yYWsgKDMxMjI5NzY3Mzc2Njk4MjM5MzUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9jb2xlbWFrICg0MjA1OTkyOTk0OTA2MDk3MjQ0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbm9fbGFuZ3VhZ2VfcGNxd2VydHkgKDg4NDA5MjgzNzQzOTQxODAxODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY3VzdG9tX2lucHV0X3N0eWxlc190aXRsZSAoODQyOTk1MjQ0MTgyMTI1MTUxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZGRfc3R5bGUgKDYxNjMxMjY2MTQ1MTQ0ODk5NTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWRkICg4Mjk5Njk5ODA1Njg4MDE3Nzk4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlbW92ZSAoNDQ4NjA4MTY1ODc1Mjk0NDYwNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzYXZlICg3NjQ2NzM4NTk3MTk2NzY3MjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbG9jYWxlICg4NTc2NDQzNDQwNzM4MTQzNzY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX2xheW91dF9zZXQgKDQzMDkyMzM2OTgxOTQ1NjU2MDkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY3VzdG9tX2lucHV0X3N0eWxlX25vdGVfbWVzc2FnZSAoODgyNjczMTMyMDg0NjM2MzQyMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlbmFibGUgKDUwMzEyOTQ0NDQ2MzA1MjMyNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm90X25vdyAoNjE3MjQ2Mjg4ODIwMjc5MDQ4MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjdXN0b21faW5wdXRfc3R5bGVfYWxyZWFkeV9leGlzdHMgKDgwMDg3Mjg5NTIyMTU0NDk3MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfdXNhYmlsaXR5X3N0dWR5X21vZGUgKDEyNjExMzA1NTUxMzQ1OTUyNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfa2V5X2xvbmdwcmVzc190aW1lb3V0X3NldHRpbmdzICg2MTAyMjQwMjk4OTMyODk3ODczKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2tleXByZXNzX3ZpYnJhdGlvbl9kdXJhdGlvbl9zZXR0aW5ncyAoNzkxODM0MTQ1OTk0NzQzOTIyNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19rZXlwcmVzc19zb3VuZF92b2x1bWVfc2V0dGluZ3MgKDYwMjcwMDczMzcwMzY4OTE2MjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfcmVhZF9leHRlcm5hbF9kaWN0aW9uYXJ5ICgyNTg4OTMxNDE4NTc1MDEzMDY3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9ub19maWxlc19tZXNzYWdlICg0OTQ3NDIwOTQyMjI0NjIzNzkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9tdWx0aXBsZV9maWxlc190aXRsZSAoNzYzNzc0OTA0NDI2NTgwODYyOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciByZWFkX2V4dGVybmFsX2RpY3Rpb25hcnlfY29uZmlybV9pbnN0YWxsX21lc3NhZ2UgKDY4OTg2MTAxNjM3Njg5ODA4NzApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXJyb3IgKDg5NDA3NjM2MjQ2Njg1MTM2NDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYnV0dG9uX2RlZmF1bHQgKDM5ODgwMTc4NDA0MzE4ODE0OTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfd2VsY29tZV90aXRsZSAoNjExMjgyMTcwOTgzMjAzMTcxNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF93ZWxjb21lX2FkZGl0aW9uYWxfZGVzY3JpcHRpb24gKDgxNTAyNTIwMDg1NDU3Njg5NTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RhcnRfYWN0aW9uICg4OTM2MDM2NDYwODk3MzQ3NzA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX25leHRfYWN0aW9uICgzNzE4MjE0Mzc5MTUxNDQ2MDMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcHNfdGl0bGUgKDY0MDAzNzMwMzQ4NzE4MTYxODIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfdGl0bGUgKDMxNDc5Njc2MzAyNTM0NjIzMTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfaW5zdHJ1Y3Rpb24gKDI1Nzg2MzE5MzY2MjQ2MzcyNDEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfZmluaXNoZWRfaW5zdHJ1Y3Rpb24gKDEwNzYxNDgyMDA0OTU3OTk0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3N0ZXAxX2FjdGlvbiAoNDM2NjUxMzUzNDk5OTkwMTcyOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl90aXRsZSAoNjg2MDcyNTQ0NzkwNjY5MDU5NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl9pbnN0cnVjdGlvbiAoOTE0MTQ4MTk2NDg3MDAyMzMzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl9hY3Rpb24gKDE2NjAzMzAzMDcxNTk4MjQzMzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfdGl0bGUgKDMxNTQ3NTcxODM2MzE0OTAyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfaW5zdHJ1Y3Rpb24gKDgwMjU5ODE4Mjk2MDU0MjYwMDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfYWN0aW9uICg2MDA4Nzk3OTcyNTY5NDIyNTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfZmluaXNoX2FjdGlvbiAoMjc2NTU5MjQzNDA5NDY1Mzg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3dfc2V0dXBfd2l6YXJkX2ljb24gKDUwMDgwMjg1OTA1OTM3MTA4MzApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvd19zZXR1cF93aXphcmRfaWNvbl9zdW1tYXJ5ICg0MTE5OTk4MzIyNTM2ODgwMjEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFwcF9uYW1lICg2MzIwMTAyNjM3NDkxMjM0NzkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSAoMzAyNzMxNTA0NTM5NzM2MzA3OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSAoNjIzNzQ3MjM1MDY5MzUxMTQ0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9kZXNjcmlwdGlvbiAoNjAxNDgzNTI4MzExOTE5ODU5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlICg4MDkxNDE3Njc2MDQ1NjkzMzEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQgKDM1ODc1MTc4NzAwMDYzMzI5ODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5ICg1MzA1Njk0OTg3Nzk5ODI0MzQ5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdGlvbmFyaWVzICgzNTgyMzMyMDU1ODkyMjUyODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSAoMTYyNTA1NTcyMDQ4OTI4MDUzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X2F2YWlsYWJsZSAoNDcyODk3NTM0NTgxNTIxNDIxOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nICgyOTgyNjUwNTI0NjIyNjIwOTgzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfaW5zdGFsbGVkICg4MDgxNTU4MzQzNTU5MzQyOTYyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfZGlzYWJsZWQgKDg5NTAzODMyMTk1NjQ2MjE3NjIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlICg5MjE2OTMzNjk1NzY1NzMyMzk4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUgKDgwMzk5MjA3MTY1NjYxMzI2MTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2hlY2tfZm9yX3VwZGF0ZXNfbm93ICg4MDg3Njg4NDQwOTE2Mzg4NTgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhc3RfdXBkYXRlICg3MzA0Njc1NDk5MTM1ODg3ODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWVzc2FnZV91cGRhdGluZyAoNDQ1Nzc2MTM5MzkzMjM3NTIxOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtZXNzYWdlX2xvYWRpbmcgKDg2ODkwOTY2MzY4NzQ3NTg4MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWFpbl9kaWN0X2Rlc2NyaXB0aW9uICgzMDcyODIxMzUyNzkzNDkyMTQzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNhbmNlbCAoNjgzMDk4MDM5OTg2NTY4MzMyNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbnN0YWxsX2RpY3QgKDE4MDg1Mjc3MjU2MjE4OTM2NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjYW5jZWxfZG93bmxvYWRfZGljdCAoNzg0MzM0MDI3ODUwNzAxOTMwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkZWxldGVfZGljdCAoNzU2ODUzMjY4MDg4MzMwMDU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICgyODc4NjI5NTk4NjY3NjU4ODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoMTY0MzA2NTg1MTE1OTQwOTU0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICgyMTc2MjA5NTc5MzEzOTQxNTgzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSAoNjUxNDI4ODU5MTk1OTExNzI4OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24gKDEwNzUxOTQxNjk0NDMxNjM0ODcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdG9hc3RfZG93bmxvYWRpbmdfc3VnZ2VzdGlvbnMgKDEzMTMwMjczNTM1ODg1NjY2NjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdmVyc2lvbl90ZXh0ICgyNzE1MzU0MjE1NTY4NDY5Mzg1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfbWVudV90aXRsZSAoMTI1NDE5NTM2NTY4OTM4NzA3NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ190aXRsZSAoNDA5NjcwMDM5MDIxMTc0ODE2OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3NjcmVlbl90aXRsZSAoNTgxODkxNDMzMTYyOTI3ODc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ19tb3JlX29wdGlvbnMgKDU2NzE2ODIwMDQ4ODcwOTMxMTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9kaWFsb2dfbGVzc19vcHRpb25zICgyNzE2NTg2NTY3MjQxNzI0MTI2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX2NvbmZpcm0gKDQ3MDMxMjk1MDczODgzMzI5NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF93b3JkX29wdGlvbl9uYW1lICg2NjY1NTU4MDUzNDA4OTYyODY1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfb3B0aW9uX25hbWUgKDMwOTQ3MzE1OTA2NTU1MjM3NzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9sb2NhbGVfb3B0aW9uX25hbWUgKDQ3Mzg2NDM0NDA5ODcyNzc3MDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF93b3JkX2hpbnQgKDQ5MDI0MzQxNDg5ODU5MDY3MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9zaG9ydGN1dF9oaW50ICgyMjY1NDUzMDEyNTU1MDYwMTc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19lZGl0X2RpYWxvZ190aXRsZSAoMzc2NTc3NDYzMzg2OTU5MDM1MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfY29udGV4dF9tZW51X2VkaXRfdGl0bGUgKDY4MTIyNTU5MDM0NzI0NTYzMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2NvbnRleHRfbWVudV9kZWxldGVfdGl0bGUgKDgxNDI5MzI0NDc2ODk0NjExODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2VtcHR5X3RleHQgKDU1ODQ5OTU4NzUzMjY2ODIwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWxsX2xhbmd1YWdlcyAoODI3NjEyNjU4MzIxNjI5ODg4NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfbW9yZV9sYW5ndWFnZXMgKDcxMzEyNjg0OTk2ODUxODA0NjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2RlbGV0ZSAoMTEwNDEzMzM1MTg3MTkzODU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9mYXN0X3Njcm9sbF9hbHBoYWJldCAoNTQzMTkxOTQwMTU1ODI4NTQ3MykgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWl0L2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaXQvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWl0L2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWl3L2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaXcvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWl3L2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWphL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtamEvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWphL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWthL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMta2EvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWthL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTgzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0NTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVuZ2xpc2hfaW1lX2lucHV0X29wdGlvbnMgKDM5MDk5NDU2MTI5Mzk2Njg1NTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZW5nbGlzaF9pbWVfcmVzZWFyY2hfbG9nICg4NDkyNjAyMjk1Njk2NTc3ODUxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZV9jb250YWN0c19mb3Jfc3BlbGxjaGVja2luZ19vcHRpb25fdGl0bGUgKDUzNzQxMjA5OTgxMjUzNTM4OTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2Zvcl9zcGVsbGNoZWNraW5nX29wdGlvbl9zdW1tYXJ5ICg4NzU0NDEzMzgyNTQzMzA3NzEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZpYnJhdGVfb25fa2V5cHJlc3MgKDUyNTgwNzk0OTQyNzY5NTU0NjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc291bmRfb25fa2V5cHJlc3MgKDYwOTM1OTIyOTcxOTgyNDM2NDQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9wdXBfb25fa2V5cHJlc3MgKDEyMzg5NDgxNTcyMzUxMjk0NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZW5lcmFsX2NhdGVnb3J5ICgxODU5MDg4NDY3MDE3NTczMTk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNvcnJlY3Rpb25fY2F0ZWdvcnkgKDIyMzY3NTA5MTUwNTY2MDc2MTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV90eXBpbmdfY2F0ZWdvcnkgKDQ5NzI2MzYxMjEzMDUzMjYzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtaXNjX2NhdGVnb3J5ICg2ODk0MTkyODE0ODY4MjMzNDUzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFkdmFuY2VkX3NldHRpbmdzICgzNjI4OTUxNDQ0OTU1OTE0NjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWR2YW5jZWRfc2V0dGluZ3Nfc3VtbWFyeSAoNDQ4Nzk4MDQ1NjE1MjgzMDI3MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbmNsdWRlX290aGVyX2ltZXNfaW5fbGFuZ3VhZ2Vfc3dpdGNoX2xpc3QgKDQ1MzM2ODk5NjAzMDg1NjU1MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaW5jbHVkZV9vdGhlcl9pbWVzX2luX2xhbmd1YWdlX3N3aXRjaF9saXN0X3N1bW1hcnkgKDg0MDYzNzEyOTEwMzMxNzYzNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG93X2xhbmd1YWdlX3N3aXRjaF9rZXkgKDU5MTU0Nzg4MjgzMTg3NzQzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvd19sYW5ndWFnZV9zd2l0Y2hfa2V5X3N1bW1hcnkgKDczNDM0MDM2NDc0NzQyNjU3MTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2xpZGluZ19rZXlfaW5wdXRfcHJldmlldyAoNjYwNDI2MjM1OTUxMDA2ODM3MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzbGlkaW5nX2tleV9pbnB1dF9wcmV2aWV3X3N1bW1hcnkgKDYzNDA1MjQzNDU3MjkwOTM4ODYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5X3ByZXZpZXdfcG9wdXBfZGlzbWlzc19kZWxheSAoNjIxMzE2NDg5NzQ0MzA2ODI0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlfcHJldmlld19wb3B1cF9kaXNtaXNzX25vX2RlbGF5ICgyMDk2MTIzMTUxNTcxNDU4MDY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleV9wcmV2aWV3X3BvcHVwX2Rpc21pc3NfZGVmYXVsdF9kZWxheSAoMjE2Njk2NDMzMzkwMzkwNjczNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhYmJyZXZpYXRpb25fdW5pdF9taWxsaXNlY29uZHMgKDg3MDAyODYwOTQwMjgzMjMzNjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2RpY3QgKDQ0MzUzMTc5Nzc4MDQxODA4MTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2RpY3Rfc3VtbWFyeSAoNjU5OTk4MzMzNDUwNzg3OTk1OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfZG91YmxlX3NwYWNlX3BlcmlvZCAoODc4MTUyOTk2OTQyNTA4Mjg2MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfZG91YmxlX3NwYWNlX3BlcmlvZF9zdW1tYXJ5ICg2NTMyODkyMTg3MjQ3OTUyNzk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY2FwICgxNzE5NzQ2Njc0ODU0NjI4MjUyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY2FwX3N1bW1hcnkgKDc5MzQ0NTI3NjEwMjI5NDY4NzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdF9wZXJzb25hbF9kaWN0aW9uYXJ5ICgzOTk2OTEwMDM4OTUyOTQwNDIwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNvbmZpZ3VyZV9kaWN0aW9uYXJpZXNfdGl0bGUgKDQyMzg2NTIzMzg1NTY5MDIwNDkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWFpbl9kaWN0aW9uYXJ5ICg0Nzk4NzYzNzgxODE4MzYxMTY4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX3Nob3dfc3VnZ2VzdGlvbnMgKDgwMjY3OTk2NjM0NDU1MzE2MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc2hvd19zdWdnZXN0aW9uc19zdW1tYXJ5ICgxNTgzMTMyMjc5NDk4NTAyODI1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX3N1Z2dlc3Rpb25fdmlzaWJpbGl0eV9zaG93X25hbWUgKDMyMTk5MTY1OTQwNjc1NTEzMDMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc3VnZ2VzdGlvbl92aXNpYmlsaXR5X3Nob3dfb25seV9wb3J0cmFpdF9uYW1lICgzODU5NzgzNzY3NDM1MjM5MTE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX3N1Z2dlc3Rpb25fdmlzaWJpbGl0eV9oaWRlX25hbWUgKDYzMDkxNDM5MjY0MjIyMzQ2NzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlX3RpdGxlICg1MDc4NDgwMDcxMDU3NDA4OTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2Jsb2NrX3BvdGVudGlhbGx5X29mZmVuc2l2ZV9zdW1tYXJ5ICgyMzcxODM1NDc5NzM0OTkxMzY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbiAoNzYzMDcyMDg4NTE5NDk5Njk1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvX2NvcnJlY3Rpb25fc3VtbWFyeSAoNTYyNTc1MTU1MTEzNDY1ODAwNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvX2NvcnJlY3Rpb25fdGhyZXNob2xkX21vZGVfb2ZmICg4NDcwODgyNjY1NDE3OTQ0MDI2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl90aHJlc2hvbGRfbW9kZV9tb2Rlc3QgKDg3ODgzNjY2OTA2MjA3OTkwOTcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZF9tb2RlX2FnZ2VyZXNzaXZlICgzNTI0MDI5MTAzNzM0OTIzODE5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl90aHJlc2hvbGRfbW9kZV92ZXJ5X2FnZ2VyZXNzaXZlICgzMzg2NzgyMjM1NTQwNTQ3Njc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGJpZ3JhbV9wcmVkaWN0aW9uICgxMDg0NDQ5MTg3NzIzOTQ4NTUwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGJpZ3JhbV9wcmVkaWN0aW9uX3N1bW1hcnkgKDM4OTYzNjI2ODI3NTExMDk2NzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9pbnB1dCAoODI2OTUxMTUyMjU0NTYzODI3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGdlc3R1cmVfaW5wdXRfc3VtbWFyeSAoOTE4MDM1MDYzOTMwNTczMTIzMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX3ByZXZpZXdfdHJhaWwgKDM4MDIzMzMzNjkzMzU3MjIyMjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3RleHQgKDQ0NDMyNDAzMzQ3MzkzODEwNTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3RleHRfc3VtbWFyeSAoNDQ3MjY5NjIxMzk5NjIwMzUzMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZGRlZF93b3JkICg4OTkzODgzMzU0NjIyNDg0MzcyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfZ29fa2V5IiBtc2dpZD0iMTYzNTE0ODA4MjEzNzIxOTE0OCI+IuGDkuGDkOGDk+GDkOGDoeGDleGDmuGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX25leHRfa2V5IiBtc2dpZD0iMzYyOTcyODQ0NTI1NjcyNTY4Ij4i4YOo4YOU4YOb4YOT4YOU4YOS4YOYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfcHJldmlvdXNfa2V5IiBtc2dpZD0iMTIxMTg2ODExODA3MTM4Njc4NyI+IuGDrOGDmOGDnOGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX2RvbmVfa2V5IiBtc2dpZD0iMjQ0MTU3ODc0ODc3MjUyOTI4OCI+IuGDqOGDlOGDoeGDoOGDo+GDmuGDlOGDkeGDo+GDmuGDmOGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX3NlbmRfa2V5IiBtc2dpZD0iMjgxNTA1NjUzNDQzMzcxNzQ0NCI+IuGDkuGDkOGDkuGDluGDkOGDleGDnOGDkCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYWJlbF9wYXVzZV9rZXkgKDE4MTA5ODMwODQyODAzNTM0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYWJlbF93YWl0X2tleSAoNjQwMjE1MjYwMDg3ODA5MzEzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fdXNlX2hlYWRwaG9uZXMgKDg5Njk2MTc4MTI4NzI4MzQ5MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fY3VycmVudF90ZXh0X2lzICgyNDg1NzIzMDExMjcyNTgzODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9ub190ZXh0X2VudGVyZWQgKDc0Nzk2ODUyMjU1OTczNDQ0OTYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3Vua25vd24gKDMxOTc0MzQwMTA0MDIxNzkxNTcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0ICgyNDQxOTc4ODMyOTI1NDkzMDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0X3NoaWZ0ZWQgKDE2ODE4NzczMjMzNDQxOTUwMzUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2NhcHNfbG9jayAoMzI3NjQ3ODI2OTUyNjMwNDQzMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fZGVsZXRlICg4NzQwMzc2OTQ0Mjc2MTk5ODAxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl90b19zeW1ib2wgKDU0ODYzNDAxMDc1MDA0NDg5NjkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3RvX2FscGhhICgyMzEyOTMzODgxOTc3MTgwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdG9fbnVtZXJpYyAoNTkxNzUyMDkyNjg1MTYxNzMyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zZXR0aW5ncyAoNDYyNzQ2MjY4OTYwMzgzODA5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdGFiICgyNjY3NzE2MDAyNjYzNDgyMjQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zcGFjZSAoMjU4MjUyMTA1MDA0OTg2MDg1OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbWljICg2MTU1MzY3NDg4ODI2MTE5NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NtaWxleSAoMjI1NjMwOTgyNjIwMDExMzkxOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fcmV0dXJuICg4MTc4MDgzMTc3MjM4MzE1NjQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zZWFyY2ggKDEyNDcyMzYxNjM3NTU5MjA4MDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2RvdCAoNDA3MTEwODI0MzUyMzE2NzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2xhbmd1YWdlX3N3aXRjaCAoNTUwNzA5MTMyODIyMjMzMTMxNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fYWN0aW9uX25leHQgKDg2MzYwNzgyNzY2NjQxNTAzMjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2FjdGlvbl9wcmV2aW91cyAoODAwODcyNDE1MDA5MzM2MjA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zaGlmdG1vZGVfb24gKDU3MDA0NDA3OTg2MDk1NzQ1ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0bW9kZV9sb2NrZWQgKDU5MzE3NTgwMzE4MTcwMTgzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc2hpZnRtb2RlX29mZiAoNjU3MjE5OTk4NDQ5MTc0ODA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9tb2RlX3N5bWJvbCAoNzE4MzM0Mzg3OTkwOTc0NzY0MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9hbHBoYSAoMzUyODMwNzY3NDM5MDE1Njk1NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9waG9uZSAoNjUyMDIwNzk0MzEzMjAyNjI2NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9waG9uZV9zaGlmdCAoNTQ5OTYyOTc1Mzk2MjY0MTIyNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhbm5vdW5jZV9rZXlib2FyZF9oaWRkZW4gKDg3MTg5Mjc4MzU1MzE0Mjk4MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYW5ub3VuY2Vfa2V5Ym9hcmRfbW9kZSAoNDcyOTA4MTA1NTQzODUwODMyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2RhdGUgKDMxMzc1MjAxNjY4MTcxMjgxMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9kYXRlX3RpbWUgKDMzOTU5MzM1ODQ4ODg1MTA3MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2VtYWlsICg2MjE2MjQ4MDc4MTI4Mjk0MjYyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfaW0gKDExMzc0MDUwODk3NjY1NTcwNDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9udW1iZXIgKDc5OTE2MjM0NDA2OTk5NTcwNjkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9waG9uZSAoNjg1MTYyNzUyNzQwMTQzMzIyOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX3RleHQgKDY0Nzk0MzY2ODc4OTk3MDE2MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV90aW1lICg0MzgxODU2ODg1NTgyMTQzMjc3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfdXJsICgxNTE5ODE5ODM1NTE0OTExMjE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0ICgzNTgzMjU4NTgzNTIxMzk3NTQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX21haW5fa2V5Ym9hcmQgKDMzNjA2NjAzNDExMjEwODMxNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3ltYm9sc19rZXlib2FyZCAoNzIwMzIxMzI0MDc4NjA4NDA2NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19vZmYgKDM3NDU2OTk3NDgyMTgwODIwMTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3VtbWFyeV9tYWluX2tleWJvYXJkICg2NTg2NTQ0MjkyOTAwMzE0MzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX3N1bW1hcnlfc3ltYm9sc19rZXlib2FyZCAoNTIzMzcyNTkyNzI4MTkzMjM5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19zdW1tYXJ5X29mZiAoNjM4NzU2MDk1OTE4OTc2MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29uZmlndXJlX2lucHV0X21ldGhvZCAoMzczMzU2MjcwMjkwNzQyNDU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhbmd1YWdlX3NlbGVjdGlvbl90aXRsZSAoMTY1MTI5OTU5ODU1NTMyNjc1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZW5kX2ZlZWRiYWNrICgxNzgwNDMxODg0MTA5MzkyMDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdF9sYW5ndWFnZSAoMzY5MzgxNTU4ODc3NzkyNjg0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBoaW50X2FkZF90b19kaWN0aW9uYXJ5ICg1NzM2Nzg2NTY5NDYwODUzODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaGFzX2RpY3Rpb25hcnkgKDYwNzE4NDc5NzM0NjY2MjUwMDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfZW5hYmxlX2xvZyAoNjYyMDQyNDUwNTA3Mjk2MzU1NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19kZXNjcmlwdGlvbl9sb2cgKDc1MjUyMjU1ODQ1NTU0MjkyMTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbGF5b3V0ICg4NDUxMTY0NzgzNTEwNDg3NTAxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfZW5fR0IgKDg4MTcwNjAxOTQyMzExMzU1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfZW5fVVMgKDYxNjA0NTIzMzY2MzQ1MzQyMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9lc19VUyAoNTU4MzE0NTE5MTQzMDE4MDIwMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX3dpdGhfbGF5b3V0X2VuX0dCICgyMTc5MDk3NzQ4NzI0NzI1OTA2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfd2l0aF9sYXlvdXRfZW5fVVMgKDEzNjI1ODEzNDc1NzY3MTQ1NzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV93aXRoX2xheW91dF9lc19VUyAoNjI2MTc5MTA1NzAwNzg5MDE4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlICgxNDE0MjA4NTc4MDg4MDE3NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9xd2VydHkgKDI5NTYxMjE0NTE2MTY2MzMxMzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9xd2VydHogKDExNzc4NDgxNzIzOTcyMDI4OTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9hemVydHkgKDg3MjE0NjA5NjgxNDExODczOTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9kdm9yYWsgKDMxMjI5NzY3Mzc2Njk4MjM5MzUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9jb2xlbWFrICg0MjA1OTkyOTk0OTA2MDk3MjQ0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbm9fbGFuZ3VhZ2VfcGNxd2VydHkgKDg4NDA5MjgzNzQzOTQxODAxODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY3VzdG9tX2lucHV0X3N0eWxlc190aXRsZSAoODQyOTk1MjQ0MTgyMTI1MTUxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZGRfc3R5bGUgKDYxNjMxMjY2MTQ1MTQ0ODk5NTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWRkICg4Mjk5Njk5ODA1Njg4MDE3Nzk4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlbW92ZSAoNDQ4NjA4MTY1ODc1Mjk0NDYwNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzYXZlICg3NjQ2NzM4NTk3MTk2NzY3MjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbG9jYWxlICg4NTc2NDQzNDQwNzM4MTQzNzY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX2xheW91dF9zZXQgKDQzMDkyMzM2OTgxOTQ1NjU2MDkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY3VzdG9tX2lucHV0X3N0eWxlX25vdGVfbWVzc2FnZSAoODgyNjczMTMyMDg0NjM2MzQyMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlbmFibGUgKDUwMzEyOTQ0NDQ2MzA1MjMyNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm90X25vdyAoNjE3MjQ2Mjg4ODIwMjc5MDQ4MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjdXN0b21faW5wdXRfc3R5bGVfYWxyZWFkeV9leGlzdHMgKDgwMDg3Mjg5NTIyMTU0NDk3MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfdXNhYmlsaXR5X3N0dWR5X21vZGUgKDEyNjExMzA1NTUxMzQ1OTUyNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfa2V5X2xvbmdwcmVzc190aW1lb3V0X3NldHRpbmdzICg2MTAyMjQwMjk4OTMyODk3ODczKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2tleXByZXNzX3ZpYnJhdGlvbl9kdXJhdGlvbl9zZXR0aW5ncyAoNzkxODM0MTQ1OTk0NzQzOTIyNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19rZXlwcmVzc19zb3VuZF92b2x1bWVfc2V0dGluZ3MgKDYwMjcwMDczMzcwMzY4OTE2MjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfcmVhZF9leHRlcm5hbF9kaWN0aW9uYXJ5ICgyNTg4OTMxNDE4NTc1MDEzMDY3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9ub19maWxlc19tZXNzYWdlICg0OTQ3NDIwOTQyMjI0NjIzNzkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9tdWx0aXBsZV9maWxlc190aXRsZSAoNzYzNzc0OTA0NDI2NTgwODYyOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciByZWFkX2V4dGVybmFsX2RpY3Rpb25hcnlfY29uZmlybV9pbnN0YWxsX21lc3NhZ2UgKDY4OTg2MTAxNjM3Njg5ODA4NzApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXJyb3IgKDg5NDA3NjM2MjQ2Njg1MTM2NDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYnV0dG9uX2RlZmF1bHQgKDM5ODgwMTc4NDA0MzE4ODE0OTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfd2VsY29tZV90aXRsZSAoNjExMjgyMTcwOTgzMjAzMTcxNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF93ZWxjb21lX2FkZGl0aW9uYWxfZGVzY3JpcHRpb24gKDgxNTAyNTIwMDg1NDU3Njg5NTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RhcnRfYWN0aW9uICg4OTM2MDM2NDYwODk3MzQ3NzA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX25leHRfYWN0aW9uICgzNzE4MjE0Mzc5MTUxNDQ2MDMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcHNfdGl0bGUgKDY0MDAzNzMwMzQ4NzE4MTYxODIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfdGl0bGUgKDMxNDc5Njc2MzAyNTM0NjIzMTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfaW5zdHJ1Y3Rpb24gKDI1Nzg2MzE5MzY2MjQ2MzcyNDEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfZmluaXNoZWRfaW5zdHJ1Y3Rpb24gKDEwNzYxNDgyMDA0OTU3OTk0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3N0ZXAxX2FjdGlvbiAoNDM2NjUxMzUzNDk5OTkwMTcyOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl90aXRsZSAoNjg2MDcyNTQ0NzkwNjY5MDU5NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl9pbnN0cnVjdGlvbiAoOTE0MTQ4MTk2NDg3MDAyMzMzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl9hY3Rpb24gKDE2NjAzMzAzMDcxNTk4MjQzMzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfdGl0bGUgKDMxNTQ3NTcxODM2MzE0OTAyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfaW5zdHJ1Y3Rpb24gKDgwMjU5ODE4Mjk2MDU0MjYwMDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfYWN0aW9uICg2MDA4Nzk3OTcyNTY5NDIyNTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfZmluaXNoX2FjdGlvbiAoMjc2NTU5MjQzNDA5NDY1Mzg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3dfc2V0dXBfd2l6YXJkX2ljb24gKDUwMDgwMjg1OTA1OTM3MTA4MzApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvd19zZXR1cF93aXphcmRfaWNvbl9zdW1tYXJ5ICg0MTE5OTk4MzIyNTM2ODgwMjEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFwcF9uYW1lICg2MzIwMTAyNjM3NDkxMjM0NzkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSAoMzAyNzMxNTA0NTM5NzM2MzA3OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSAoNjIzNzQ3MjM1MDY5MzUxMTQ0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9kZXNjcmlwdGlvbiAoNjAxNDgzNTI4MzExOTE5ODU5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlICg4MDkxNDE3Njc2MDQ1NjkzMzEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQgKDM1ODc1MTc4NzAwMDYzMzI5ODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5ICg1MzA1Njk0OTg3Nzk5ODI0MzQ5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdGlvbmFyaWVzICgzNTgyMzMyMDU1ODkyMjUyODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSAoMTYyNTA1NTcyMDQ4OTI4MDUzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X2F2YWlsYWJsZSAoNDcyODk3NTM0NTgxNTIxNDIxOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nICgyOTgyNjUwNTI0NjIyNjIwOTgzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfaW5zdGFsbGVkICg4MDgxNTU4MzQzNTU5MzQyOTYyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfZGlzYWJsZWQgKDg5NTAzODMyMTk1NjQ2MjE3NjIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlICg5MjE2OTMzNjk1NzY1NzMyMzk4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUgKDgwMzk5MjA3MTY1NjYxMzI2MTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2hlY2tfZm9yX3VwZGF0ZXNfbm93ICg4MDg3Njg4NDQwOTE2Mzg4NTgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhc3RfdXBkYXRlICg3MzA0Njc1NDk5MTM1ODg3ODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWVzc2FnZV91cGRhdGluZyAoNDQ1Nzc2MTM5MzkzMjM3NTIxOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtZXNzYWdlX2xvYWRpbmcgKDg2ODkwOTY2MzY4NzQ3NTg4MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWFpbl9kaWN0X2Rlc2NyaXB0aW9uICgzMDcyODIxMzUyNzkzNDkyMTQzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNhbmNlbCAoNjgzMDk4MDM5OTg2NTY4MzMyNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbnN0YWxsX2RpY3QgKDE4MDg1Mjc3MjU2MjE4OTM2NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjYW5jZWxfZG93bmxvYWRfZGljdCAoNzg0MzM0MDI3ODUwNzAxOTMwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkZWxldGVfZGljdCAoNzU2ODUzMjY4MDg4MzMwMDU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICgyODc4NjI5NTk4NjY3NjU4ODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoMTY0MzA2NTg1MTE1OTQwOTU0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICgyMTc2MjA5NTc5MzEzOTQxNTgzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSAoNjUxNDI4ODU5MTk1OTExNzI4OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24gKDEwNzUxOTQxNjk0NDMxNjM0ODcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdG9hc3RfZG93bmxvYWRpbmdfc3VnZ2VzdGlvbnMgKDEzMTMwMjczNTM1ODg1NjY2NjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdmVyc2lvbl90ZXh0ICgyNzE1MzU0MjE1NTY4NDY5Mzg1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfbWVudV90aXRsZSAoMTI1NDE5NTM2NTY4OTM4NzA3NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ190aXRsZSAoNDA5NjcwMDM5MDIxMTc0ODE2OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3NjcmVlbl90aXRsZSAoNTgxODkxNDMzMTYyOTI3ODc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ19tb3JlX29wdGlvbnMgKDU2NzE2ODIwMDQ4ODcwOTMxMTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9kaWFsb2dfbGVzc19vcHRpb25zICgyNzE2NTg2NTY3MjQxNzI0MTI2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX2NvbmZpcm0gKDQ3MDMxMjk1MDczODgzMzI5NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF93b3JkX29wdGlvbl9uYW1lICg2NjY1NTU4MDUzNDA4OTYyODY1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfb3B0aW9uX25hbWUgKDMwOTQ3MzE1OTA2NTU1MjM3NzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9sb2NhbGVfb3B0aW9uX25hbWUgKDQ3Mzg2NDM0NDA5ODcyNzc3MDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF93b3JkX2hpbnQgKDQ5MDI0MzQxNDg5ODU5MDY3MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9zaG9ydGN1dF9oaW50ICgyMjY1NDUzMDEyNTU1MDYwMTc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19lZGl0X2RpYWxvZ190aXRsZSAoMzc2NTc3NDYzMzg2OTU5MDM1MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfY29udGV4dF9tZW51X2VkaXRfdGl0bGUgKDY4MTIyNTU5MDM0NzI0NTYzMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2NvbnRleHRfbWVudV9kZWxldGVfdGl0bGUgKDgxNDI5MzI0NDc2ODk0NjExODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2VtcHR5X3RleHQgKDU1ODQ5OTU4NzUzMjY2ODIwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWxsX2xhbmd1YWdlcyAoODI3NjEyNjU4MzIxNjI5ODg4NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfbW9yZV9sYW5ndWFnZXMgKDcxMzEyNjg0OTk2ODUxODA0NjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2RlbGV0ZSAoMTEwNDEzMzM1MTg3MTkzODU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9mYXN0X3Njcm9sbF9hbHBoYWJldCAoNTQzMTkxOTQwMTU1ODI4NTQ3MykgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWtvL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMta28vZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWtvL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWxhbmQva2V5Ym9hcmQtaGVpZ2h0cy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbGFuZC9rZXlib2FyZC1oZWlnaHRzLnhtbAppbmRleCA0ZWJlZGE1Li42NzBiZTMzIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtbGFuZC9rZXlib2FyZC1oZWlnaHRzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbGFuZC9rZXlib2FyZC1oZWlnaHRzLnhtbApAQCAtMTksMTkgKzE5LDIxIEBACiAtLT4KIAogPHJlc291cmNlcz4KLSAgICA8IS0tIEJ1aWxkLkhBUkRXQVJFLGtleWJvYXJkX2hlaWdodF9pbl9kcCAtLT4KKyAgICA8IS0tIEJ1aWxkIGNvbmRpdGlvbixrZXlib2FyZF9oZWlnaHRfaW5fZHAgLS0+CiAgICAgPHN0cmluZy1hcnJheSBuYW1lPSJrZXlib2FyZF9oZWlnaHRzIiB0cmFuc2xhdGFibGU9ImZhbHNlIj4KICAgICA8IS0tIFByZWZlcmFibGUga2V5Ym9hcmQgaGVpZ2h0IGluIGFic29sdXRlIHNjYWxlOiAxLjEwMGluIC0tPgogICAgICAgICA8IS0tIERyb2lkIC0tPgotICAgICAgICA8aXRlbT5zaG9sZXMsMTk0LjMzMzM8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPXNob2xlcywxOTQuMzMzMzwvaXRlbT4KICAgICAgICAgPCEtLSBOZXh1cyBPbmUgLS0+Ci0gICAgICAgIDxpdGVtPm1haGltYWhpLDE4Ni4yNjY3PC9pdGVtPgorICAgICAgICA8aXRlbT5IQVJEV0FSRT1tYWhpbWFoaSwxODYuMjY2NzwvaXRlbT4KICAgICAgICAgPCEtLSBOZXh1cyBTIC0tPgotICAgICAgICA8aXRlbT5oZXJyaW5nLDE3MS45Mzg1PC9pdGVtPgorICAgICAgICA8aXRlbT5IQVJEV0FSRT1oZXJyaW5nLDE3MS45Mzg1PC9pdGVtPgogICAgICAgICA8IS0tIEdhbGF4eSBOZXh1cyAtLT4KLSAgICAgICAgPGl0ZW0+dHVuYSwxNzMuNDIwNzwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SEFSRFdBUkU9dHVuYSwxNzMuNDIwNzwvaXRlbT4KICAgICA8IS0tIFByZWZlcmFibGUga2V5Ym9hcmQgaGVpZ2h0IGluIGFic29sdXRlIHNjYWxlOiA0NS4wbW0gLS0+CiAgICAgICAgIDwhLS0gWG9vbSAtLT4KLSAgICAgICAgPGl0ZW0+c3RpbmdyYXksMjY1LjQzNzg8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPXN0aW5ncmF5LDI2NS40Mzc4PC9pdGVtPgorICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgdW5rbm93biBkZXZpY2U6IGVtcHR5IHN0cmluZyAtLT4KKyAgICAgICAgPGl0ZW0+LDwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWxhbmQvc2V0dXAtZGltZW5zLXNtYWxsLXBob25lLWxhbmQueG1sIGIvamF2YS9yZXMvdmFsdWVzLWxhbmQvc2V0dXAtZGltZW5zLXNtYWxsLXBob25lLWxhbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OGU2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbGFuZC9zZXR1cC1kaW1lbnMtc21hbGwtcGhvbmUtbGFuZC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDwhLS0gU2V0dXAgd2l6YXJkIGRpbWVuc2lvbnMgZm9yIHNtYWxsLXBob25lL2xhbmRzY2FwZS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX3RleHRfc2l6ZSI+MzJzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfZGVzY3JpcHRpb25fdGV4dF9zaXplIj4xOHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9idWxsZXRfdGV4dF9zaXplIj4xOHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90cmlhbmdsZV9pbmRpY2F0b3JfaGVpZ2h0Ij4xOGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9pbmRpY2F0b3JfaGVpZ2h0Ij4xOGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF90aXRsZV90ZXh0X3NpemUiPjE4c3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2luc3RydWN0aW9uX3RleHRfc2l6ZSI+MTRzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfYWN0aW9uX3RleHRfc2l6ZSI+MTZzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3ZlcnRpY2FsX3BhZGRpbmciPjE2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9ob3Jpem9udGFsX3BhZGRpbmciPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2FjdGlvbl9oZWlnaHQiPjQyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZyI+MjBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaG9yaXpvbnRhbF9wYWRkaW5nX2hhbGYiPjEwZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX3ZlcnRpY2FsX3BhZGRpbmciPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfbGluZV9oZWlnaHQiPjJkcDwvZGltZW4+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfdGl0bGVfd2VpZ2h0X2luX3NjcmVlbiI+NDA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfYm9keV93ZWlnaHRfaW5fc2NyZWVuIj42MDwvaW50ZWdlcj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfdGl0bGVfZW5kX21hcmdpbiI+MTJkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfZGVzY3JpcHRpb25fdG9wX21hcmdpbiI+MTJkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fdG9wX3BhZGRpbmciPjBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fYm90dG9tX3BhZGRpbmciPjEyZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fd2VpZ2h0X2luX3NjcmVlbiI+NzA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0ic2V0dXBfd2VsY29tZV92aWRlb19lbmRfcGFkZGluZ193ZWlnaHRfaW5fc2NyZWVuIj4zMDwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWx0L2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbHQvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWx0L2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWx2L2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbHYvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWx2L2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW1rL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbWsvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLW1rL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTJmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0NTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVuZ2xpc2hfaW1lX2lucHV0X29wdGlvbnMgKDM5MDk5NDU2MTI5Mzk2Njg1NTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZW5nbGlzaF9pbWVfcmVzZWFyY2hfbG9nICg4NDkyNjAyMjk1Njk2NTc3ODUxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZV9jb250YWN0c19mb3Jfc3BlbGxjaGVja2luZ19vcHRpb25fdGl0bGUgKDUzNzQxMjA5OTgxMjUzNTM4OTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2Zvcl9zcGVsbGNoZWNraW5nX29wdGlvbl9zdW1tYXJ5ICg4NzU0NDEzMzgyNTQzMzA3NzEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZpYnJhdGVfb25fa2V5cHJlc3MgKDUyNTgwNzk0OTQyNzY5NTU0NjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc291bmRfb25fa2V5cHJlc3MgKDYwOTM1OTIyOTcxOTgyNDM2NDQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9wdXBfb25fa2V5cHJlc3MgKDEyMzg5NDgxNTcyMzUxMjk0NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZW5lcmFsX2NhdGVnb3J5ICgxODU5MDg4NDY3MDE3NTczMTk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNvcnJlY3Rpb25fY2F0ZWdvcnkgKDIyMzY3NTA5MTUwNTY2MDc2MTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV90eXBpbmdfY2F0ZWdvcnkgKDQ5NzI2MzYxMjEzMDUzMjYzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtaXNjX2NhdGVnb3J5ICg2ODk0MTkyODE0ODY4MjMzNDUzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFkdmFuY2VkX3NldHRpbmdzICgzNjI4OTUxNDQ0OTU1OTE0NjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWR2YW5jZWRfc2V0dGluZ3Nfc3VtbWFyeSAoNDQ4Nzk4MDQ1NjE1MjgzMDI3MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbmNsdWRlX290aGVyX2ltZXNfaW5fbGFuZ3VhZ2Vfc3dpdGNoX2xpc3QgKDQ1MzM2ODk5NjAzMDg1NjU1MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaW5jbHVkZV9vdGhlcl9pbWVzX2luX2xhbmd1YWdlX3N3aXRjaF9saXN0X3N1bW1hcnkgKDg0MDYzNzEyOTEwMzMxNzYzNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG93X2xhbmd1YWdlX3N3aXRjaF9rZXkgKDU5MTU0Nzg4MjgzMTg3NzQzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvd19sYW5ndWFnZV9zd2l0Y2hfa2V5X3N1bW1hcnkgKDczNDM0MDM2NDc0NzQyNjU3MTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2xpZGluZ19rZXlfaW5wdXRfcHJldmlldyAoNjYwNDI2MjM1OTUxMDA2ODM3MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzbGlkaW5nX2tleV9pbnB1dF9wcmV2aWV3X3N1bW1hcnkgKDYzNDA1MjQzNDU3MjkwOTM4ODYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5X3ByZXZpZXdfcG9wdXBfZGlzbWlzc19kZWxheSAoNjIxMzE2NDg5NzQ0MzA2ODI0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlfcHJldmlld19wb3B1cF9kaXNtaXNzX25vX2RlbGF5ICgyMDk2MTIzMTUxNTcxNDU4MDY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleV9wcmV2aWV3X3BvcHVwX2Rpc21pc3NfZGVmYXVsdF9kZWxheSAoMjE2Njk2NDMzMzkwMzkwNjczNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhYmJyZXZpYXRpb25fdW5pdF9taWxsaXNlY29uZHMgKDg3MDAyODYwOTQwMjgzMjMzNjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2RpY3QgKDQ0MzUzMTc5Nzc4MDQxODA4MTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2RpY3Rfc3VtbWFyeSAoNjU5OTk4MzMzNDUwNzg3OTk1OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfZG91YmxlX3NwYWNlX3BlcmlvZCAoODc4MTUyOTk2OTQyNTA4Mjg2MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfZG91YmxlX3NwYWNlX3BlcmlvZF9zdW1tYXJ5ICg2NTMyODkyMTg3MjQ3OTUyNzk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY2FwICgxNzE5NzQ2Njc0ODU0NjI4MjUyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY2FwX3N1bW1hcnkgKDc5MzQ0NTI3NjEwMjI5NDY4NzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdF9wZXJzb25hbF9kaWN0aW9uYXJ5ICgzOTk2OTEwMDM4OTUyOTQwNDIwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNvbmZpZ3VyZV9kaWN0aW9uYXJpZXNfdGl0bGUgKDQyMzg2NTIzMzg1NTY5MDIwNDkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWFpbl9kaWN0aW9uYXJ5ICg0Nzk4NzYzNzgxODE4MzYxMTY4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX3Nob3dfc3VnZ2VzdGlvbnMgKDgwMjY3OTk2NjM0NDU1MzE2MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc2hvd19zdWdnZXN0aW9uc19zdW1tYXJ5ICgxNTgzMTMyMjc5NDk4NTAyODI1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX3N1Z2dlc3Rpb25fdmlzaWJpbGl0eV9zaG93X25hbWUgKDMyMTk5MTY1OTQwNjc1NTEzMDMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc3VnZ2VzdGlvbl92aXNpYmlsaXR5X3Nob3dfb25seV9wb3J0cmFpdF9uYW1lICgzODU5NzgzNzY3NDM1MjM5MTE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX3N1Z2dlc3Rpb25fdmlzaWJpbGl0eV9oaWRlX25hbWUgKDYzMDkxNDM5MjY0MjIyMzQ2NzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlX3RpdGxlICg1MDc4NDgwMDcxMDU3NDA4OTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2Jsb2NrX3BvdGVudGlhbGx5X29mZmVuc2l2ZV9zdW1tYXJ5ICgyMzcxODM1NDc5NzM0OTkxMzY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbiAoNzYzMDcyMDg4NTE5NDk5Njk1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvX2NvcnJlY3Rpb25fc3VtbWFyeSAoNTYyNTc1MTU1MTEzNDY1ODAwNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvX2NvcnJlY3Rpb25fdGhyZXNob2xkX21vZGVfb2ZmICg4NDcwODgyNjY1NDE3OTQ0MDI2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl90aHJlc2hvbGRfbW9kZV9tb2Rlc3QgKDg3ODgzNjY2OTA2MjA3OTkwOTcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZF9tb2RlX2FnZ2VyZXNzaXZlICgzNTI0MDI5MTAzNzM0OTIzODE5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl90aHJlc2hvbGRfbW9kZV92ZXJ5X2FnZ2VyZXNzaXZlICgzMzg2NzgyMjM1NTQwNTQ3Njc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGJpZ3JhbV9wcmVkaWN0aW9uICgxMDg0NDQ5MTg3NzIzOTQ4NTUwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGJpZ3JhbV9wcmVkaWN0aW9uX3N1bW1hcnkgKDM4OTYzNjI2ODI3NTExMDk2NzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9pbnB1dCAoODI2OTUxMTUyMjU0NTYzODI3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGdlc3R1cmVfaW5wdXRfc3VtbWFyeSAoOTE4MDM1MDYzOTMwNTczMTIzMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX3ByZXZpZXdfdHJhaWwgKDM4MDIzMzMzNjkzMzU3MjIyMjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3RleHQgKDQ0NDMyNDAzMzQ3MzkzODEwNTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3RleHRfc3VtbWFyeSAoNDQ3MjY5NjIxMzk5NjIwMzUzMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZGRlZF93b3JkICg4OTkzODgzMzU0NjIyNDg0MzcyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfZ29fa2V5IiBtc2dpZD0iMTYzNTE0ODA4MjEzNzIxOTE0OCI+ItCe0LTQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX25leHRfa2V5IiBtc2dpZD0iMzYyOTcyODQ0NTI1NjcyNTY4Ij4i0KHQu9C10LTQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfcHJldmlvdXNfa2V5IiBtc2dpZD0iMTIxMTg2ODExODA3MTM4Njc4NyI+ItCf0YDQtdGC0YXQvtC00L3QviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX2RvbmVfa2V5IiBtc2dpZD0iMjQ0MTU3ODc0ODc3MjUyOTI4OCI+ItCT0L7RgtC+0LLQviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX3NlbmRfa2V5IiBtc2dpZD0iMjgxNTA1NjUzNDQzMzcxNzQ0NCI+ItCY0YHQv9GA0LDRgtC4Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhYmVsX3BhdXNlX2tleSAoMTgxMDk4MzA4NDI4MDM1MzQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhYmVsX3dhaXRfa2V5ICg2NDAyMTUyNjAwODc4MDkzMTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl91c2VfaGVhZHBob25lcyAoODk2OTYxNzgxMjg3MjgzNDkzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9jdXJyZW50X3RleHRfaXMgKDI0ODU3MjMwMTEyNzI1ODM4NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX25vX3RleHRfZW50ZXJlZCAoNzQ3OTY4NTIyNTU5NzM0NDQ5NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdW5rbm93biAoMzE5NzQzNDAxMDQwMjE3OTE1NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc2hpZnQgKDI0NDE5Nzg4MzI5MjU0OTMwOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc2hpZnRfc2hpZnRlZCAoMTY4MTg3NzMyMzM0NDE5NTAzNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fY2Fwc19sb2NrICgzMjc2NDc4MjY5NTI2MzA0NDMyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9kZWxldGUgKDg3NDAzNzY5NDQyNzYxOTk4MDEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3RvX3N5bWJvbCAoNTQ4NjM0MDEwNzUwMDQ0ODk2OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdG9fYWxwaGEgKDIzMTI5MzM4ODE5NzcxODA3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl90b19udW1lcmljICg1OTE3NTIwOTI2ODUxNjE3MzIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NldHRpbmdzICg0NjI3NDYyNjg5NjAzODM4MDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl90YWIgKDI2Njc3MTYwMDI2NjM0ODIyNDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NwYWNlICgyNTgyNTIxMDUwMDQ5ODYwODU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9taWMgKDYxNTUzNjc0ODg4MjYxMTk1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc21pbGV5ICgyMjU2MzA5ODI2MjAwMTEzOTE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9yZXR1cm4gKDgxNzgwODMxNzcyMzgzMTU2NDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NlYXJjaCAoMTI0NzIzNjE2Mzc1NTkyMDgwOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fZG90ICg0MDcxMTA4MjQzNTIzMTY3MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbGFuZ3VhZ2Vfc3dpdGNoICg1NTA3MDkxMzI4MjIyMzMxMzE2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9hY3Rpb25fbmV4dCAoODYzNjA3ODI3NjY2NDE1MDMyNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fYWN0aW9uX3ByZXZpb3VzICg4MDA4NzI0MTUwMDkzMzYyMDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0bW9kZV9vbiAoNTcwMDQ0MDc5ODYwOTU3NDU4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc2hpZnRtb2RlX2xvY2tlZCAoNTkzMTc1ODAzMTgxNzAxODMwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zaGlmdG1vZGVfb2ZmICg2NTcyMTk5OTg0NDkxNzQ4MDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX21vZGVfc3ltYm9sICg3MTgzMzQzODc5OTA5NzQ3NjQyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9tb2RlX2FscGhhICgzNTI4MzA3Njc0MzkwMTU2OTU2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9tb2RlX3Bob25lICg2NTIwMjA3OTQzMTMyMDI2MjY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9tb2RlX3Bob25lX3NoaWZ0ICg1NDk5NjI5NzUzOTYyNjQxMjI3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFubm91bmNlX2tleWJvYXJkX2hpZGRlbiAoODcxODkyNzgzNTUzMTQyOTgwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhbm5vdW5jZV9rZXlib2FyZF9tb2RlICg0NzI5MDgxMDU1NDM4NTA4MzIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfZGF0ZSAoMzEzNzUyMDE2NjgxNzEyODEwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2RhdGVfdGltZSAoMzM5NTkzMzU4NDg4ODUxMDcyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfZW1haWwgKDYyMTYyNDgwNzgxMjgyOTQyNjIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9pbSAoMTEzNzQwNTA4OTc2NjU1NzA0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX251bWJlciAoNzk5MTYyMzQ0MDY5OTk1NzA2OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX3Bob25lICg2ODUxNjI3NTI3NDAxNDMzMjI5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfdGV4dCAoNjQ3OTQzNjY4Nzg5OTcwMTYxOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX3RpbWUgKDQzODE4NTY4ODU1ODIxNDMyNzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV91cmwgKDE1MTk4MTk4MzU1MTQ5MTEyMTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXQgKDM1ODMyNTg1ODM1MjEzOTc1NDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfbWFpbl9rZXlib2FyZCAoMzM2MDY2MDM0MTEyMTA4MzE3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19zeW1ib2xzX2tleWJvYXJkICg3MjAzMjEzMjQwNzg2MDg0MDY3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX29mZiAoMzc0NTY5OTc0ODIxODA4MjAxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19zdW1tYXJ5X21haW5fa2V5Ym9hcmQgKDY1ODY1NDQyOTI5MDAzMTQzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3VtbWFyeV9zeW1ib2xzX2tleWJvYXJkICg1MjMzNzI1OTI3MjgxOTMyMzkxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX3N1bW1hcnlfb2ZmICg2Mzg3NTYwOTU5MTg5NzYwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjb25maWd1cmVfaW5wdXRfbWV0aG9kICgzNzMzNTYyNzAyOTA3NDI0NTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGFuZ3VhZ2Vfc2VsZWN0aW9uX3RpdGxlICgxNjUxMjk5NTk4NTU1MzI2NzUwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbmRfZmVlZGJhY2sgKDE3ODA0MzE4ODQxMDkzOTIwNDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0X2xhbmd1YWdlICgzNjkzODE1NTg4Nzc3OTI2ODQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhpbnRfYWRkX3RvX2RpY3Rpb25hcnkgKDU3MzY3ODY1Njk0NjA4NTM4MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBoYXNfZGljdGlvbmFyeSAoNjA3MTg0Nzk3MzQ2NjYyNTAwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19lbmFibGVfbG9nICg2NjIwNDI0NTA1MDcyOTYzNTU3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2Rlc2NyaXB0aW9uX2xvZyAoNzUyNTIyNTU4NDU1NTQyOTIxMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9sYXlvdXQgKDg0NTExNjQ3ODM1MTA0ODc1MDEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9lbl9HQiAoODgxNzA2MDE5NDIzMTEzNTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9lbl9VUyAoNjE2MDQ1MjMzNjYzNDUzNDIzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX2VzX1VTICg1NTgzMTQ1MTkxNDMwMTgwMjAwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfd2l0aF9sYXlvdXRfZW5fR0IgKDIxNzkwOTc3NDg3MjQ3MjU5MDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV93aXRoX2xheW91dF9lbl9VUyAoMTM2MjU4MTM0NzU3NjcxNDU3OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX3dpdGhfbGF5b3V0X2VzX1VTICg2MjYxNzkxMDU3MDA3ODkwMTg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbm9fbGFuZ3VhZ2UgKDE0MTQyMDg1NzgwODgwMTc0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlX3F3ZXJ0eSAoMjk1NjEyMTQ1MTYxNjYzMzEzMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlX3F3ZXJ0eiAoMTE3Nzg0ODE3MjM5NzIwMjg5MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlX2F6ZXJ0eSAoODcyMTQ2MDk2ODE0MTE4NzM5NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlX2R2b3JhayAoMzEyMjk3NjczNzY2OTgyMzkzNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlX2NvbGVtYWsgKDQyMDU5OTI5OTQ5MDYwOTcyNDQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9wY3F3ZXJ0eSAoODg0MDkyODM3NDM5NDE4MDE4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjdXN0b21faW5wdXRfc3R5bGVzX3RpdGxlICg4NDI5OTUyNDQxODIxMjUxNTEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFkZF9zdHlsZSAoNjE2MzEyNjYxNDUxNDQ4OTk1MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZGQgKDgyOTk2OTk4MDU2ODgwMTc3OTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcmVtb3ZlICg0NDg2MDgxNjU4NzUyOTQ0NjA2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNhdmUgKDc2NDY3Mzg1OTcxOTY3NjcyMTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9sb2NhbGUgKDg1NzY0NDM0NDA3MzgxNDM3NjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbGF5b3V0X3NldCAoNDMwOTIzMzY5ODE5NDU2NTYwOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjdXN0b21faW5wdXRfc3R5bGVfbm90ZV9tZXNzYWdlICg4ODI2NzMxMzIwODQ2MzYzNDIzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVuYWJsZSAoNTAzMTI5NDQ0NDYzMDUyMzI0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub3Rfbm93ICg2MTcyNDYyODg4MjAyNzkwNDgyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGN1c3RvbV9pbnB1dF9zdHlsZV9hbHJlYWR5X2V4aXN0cyAoODAwODcyODk1MjIxNTQ0OTcwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc191c2FiaWxpdHlfc3R1ZHlfbW9kZSAoMTI2MTEzMDU1NTEzNDU5NTI1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19rZXlfbG9uZ3ByZXNzX3RpbWVvdXRfc2V0dGluZ3MgKDYxMDIyNDAyOTg5MzI4OTc4NzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfa2V5cHJlc3NfdmlicmF0aW9uX2R1cmF0aW9uX3NldHRpbmdzICg3OTE4MzQxNDU5OTQ3NDM5MjI2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2tleXByZXNzX3NvdW5kX3ZvbHVtZV9zZXR0aW5ncyAoNjAyNzAwNzMzNzAzNjg5MTYyMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19yZWFkX2V4dGVybmFsX2RpY3Rpb25hcnkgKDI1ODg5MzE0MTg1NzUwMTMwNjcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcmVhZF9leHRlcm5hbF9kaWN0aW9uYXJ5X25vX2ZpbGVzX21lc3NhZ2UgKDQ5NDc0MjA5NDIyMjQ2MjM3OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcmVhZF9leHRlcm5hbF9kaWN0aW9uYXJ5X211bHRpcGxlX2ZpbGVzX3RpdGxlICg3NjM3NzQ5MDQ0MjY1ODA4NjI4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9jb25maXJtX2luc3RhbGxfbWVzc2FnZSAoNjg5ODYxMDE2Mzc2ODk4MDg3MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlcnJvciAoODk0MDc2MzYyNDY2ODUxMzY0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBidXR0b25fZGVmYXVsdCAoMzk4ODAxNzg0MDQzMTg4MTQ5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF93ZWxjb21lX3RpdGxlICg2MTEyODIxNzA5ODMyMDMxNzE1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3dlbGNvbWVfYWRkaXRpb25hbF9kZXNjcmlwdGlvbiAoODE1MDI1MjAwODU0NTc2ODk1MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGFydF9hY3Rpb24gKDg5MzYwMzY0NjA4OTczNDc3MDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfbmV4dF9hY3Rpb24gKDM3MTgyMTQzNzkxNTE0NDYwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwc190aXRsZSAoNjQwMDM3MzAzNDg3MTgxNjE4MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMV90aXRsZSAoMzE0Nzk2NzYzMDI1MzQ2MjMxNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMV9pbnN0cnVjdGlvbiAoMjU3ODYzMTkzNjYyNDYzNzI0MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMV9maW5pc2hlZF9pbnN0cnVjdGlvbiAoMTA3NjE0ODIwMDQ5NTc5OTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfYWN0aW9uICg0MzY2NTEzNTM0OTk5OTAxNzI4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3N0ZXAyX3RpdGxlICg2ODYwNzI1NDQ3OTA2NjkwNTk0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3N0ZXAyX2luc3RydWN0aW9uICg5MTQxNDgxOTY0ODcwMDIzMzM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3N0ZXAyX2FjdGlvbiAoMTY2MDMzMDMwNzE1OTgyNDMzNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwM190aXRsZSAoMzE1NDc1NzE4MzYzMTQ5MDI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwM19pbnN0cnVjdGlvbiAoODAyNTk4MTgyOTYwNTQyNjAwMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwM19hY3Rpb24gKDYwMDg3OTc5NzI1Njk0MjI1OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9maW5pc2hfYWN0aW9uICgyNzY1NTkyNDM0MDk0NjUzODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvd19zZXR1cF93aXphcmRfaWNvbiAoNTAwODAyODU5MDU5MzcxMDgzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG93X3NldHVwX3dpemFyZF9pY29uX3N1bW1hcnkgKDQxMTk5OTgzMjI1MzY4ODAyMTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXBwX25hbWUgKDYzMjAxMDI2Mzc0OTEyMzQ3OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lICgzMDI3MzE1MDQ1Mzk3MzYzMDc5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfc2VydmljZV9uYW1lICg2MjM3NDcyMzUwNjkzNTExNDQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX2Rlc2NyaXB0aW9uICg2MDE0ODM1MjgzMTE5MTk4NTkxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUgKDgwOTE0MTc2NzYwNDU2OTMzMTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCAoMzU4NzUxNzg3MDAwNjMzMjk4MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkgKDUzMDU2OTQ5ODc3OTk4MjQzNDkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0aW9uYXJpZXMgKDM1ODIzMzIwNTU4OTIyNTI4NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lICgxNjI1MDU1NzIwNDg5MjgwNTMwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfYXZhaWxhYmxlICg0NzI4OTc1MzQ1ODE1MjE0MjE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfZG93bmxvYWRpbmcgKDI5ODI2NTA1MjQ2MjI2MjA5ODMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9pbnN0YWxsZWQgKDgwODE1NTgzNDM1NTkzNDI5NjIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9kaXNhYmxlZCAoODk1MDM4MzIxOTU2NDYyMTc2MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UgKDkyMTY5MzM2OTU3NjU3MzIzOTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSAoODAzOTkyMDcxNjU2NjEzMjYxMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjaGVja19mb3JfdXBkYXRlc19ub3cgKDgwODc2ODg0NDA5MTYzODg1ODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGFzdF91cGRhdGUgKDczMDQ2NzU0OTkxMzU4ODc4MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtZXNzYWdlX3VwZGF0aW5nICg0NDU3NzYxMzkzOTMyMzc1MjE5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1lc3NhZ2VfbG9hZGluZyAoODY4OTA5NjYzNjg3NDc1ODgxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYWluX2RpY3RfZGVzY3JpcHRpb24gKDMwNzI4MjEzNTI3OTM0OTIxNDMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2FuY2VsICg2ODMwOTgwMzk5ODY1NjgzMzI0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGluc3RhbGxfZGljdCAoMTgwODUyNzcyNTYyMTg5MzY1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNhbmNlbF9kb3dubG9hZF9kaWN0ICg3ODQzMzQwMjc4NTA3MDE5MzAzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRlbGV0ZV9kaWN0ICg3NTY4NTMyNjgwODgzMzAwNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDI4Nzg2Mjk1OTg2Njc2NTg4NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICgxNjQzMDY1ODUxMTU5NDA5NTQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDIxNzYyMDk1NzkzMTM5NDE1ODMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlICg2NTE0Mjg4NTkxOTU5MTE3Mjg4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiAoMTA3NTE5NDE2OTQ0MzE2MzQ4NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0b2FzdF9kb3dubG9hZGluZ19zdWdnZXN0aW9ucyAoMTMxMzAyNzM1MzU4ODU2NjY2MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2ZXJzaW9uX3RleHQgKDI3MTUzNTQyMTU1Njg0NjkzODUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9tZW51X3RpdGxlICgxMjU0MTk1MzY1Njg5Mzg3MDc2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX3RpdGxlICg0MDk2NzAwMzkwMjExNzQ4MTY4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfc2NyZWVuX3RpdGxlICg1ODE4OTE0MzMxNjI5Mjc4NzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX21vcmVfb3B0aW9ucyAoNTY3MTY4MjAwNDg4NzA5MzExMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ19sZXNzX29wdGlvbnMgKDI3MTY1ODY1NjcyNDE3MjQxMjYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9kaWFsb2dfY29uZmlybSAoNDcwMzEyOTUwNzM4ODMzMjk1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3dvcmRfb3B0aW9uX25hbWUgKDY2NjU1NTgwNTM0MDg5NjI4NjUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9zaG9ydGN1dF9vcHRpb25fbmFtZSAoMzA5NDczMTU5MDY1NTUyMzc3NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2xvY2FsZV9vcHRpb25fbmFtZSAoNDczODY0MzQ0MDk4NzI3NzcwNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3dvcmRfaGludCAoNDkwMjQzNDE0ODk4NTkwNjcwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3Nob3J0Y3V0X2hpbnQgKDIyNjU0NTMwMTI1NTUwNjAxNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2VkaXRfZGlhbG9nX3RpdGxlICgzNzY1Nzc0NjMzODY5NTkwMzUyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19jb250ZXh0X21lbnVfZWRpdF90aXRsZSAoNjgxMjI1NTkwMzQ3MjQ1NjMwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfY29udGV4dF9tZW51X2RlbGV0ZV90aXRsZSAoODE0MjkzMjQ0NzY4OTQ2MTE4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfZW1wdHlfdGV4dCAoNTU4NDk5NTg3NTMyNjY4MjAzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hbGxfbGFuZ3VhZ2VzICg4Mjc2MTI2NTgzMjE2Mjk4ODg2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19tb3JlX2xhbmd1YWdlcyAoNzEzMTI2ODQ5OTY4NTE4MDQ2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfZGVsZXRlICgxMTA0MTMzMzUxODcxOTM4NTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X2Zhc3Rfc2Nyb2xsX2FscGhhYmV0ICg1NDMxOTE5NDAxNTU4Mjg1NDczKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtbW4vZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1tbi9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbW4vZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmOWM1NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQ1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZW5nbGlzaF9pbWVfaW5wdXRfb3B0aW9ucyAoMzkwOTk0NTYxMjkzOTY2ODU1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlbmdsaXNoX2ltZV9yZXNlYXJjaF9sb2cgKDg0OTI2MDIyOTU2OTY1Nzc4NTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlX2NvbnRhY3RzX2Zvcl9zcGVsbGNoZWNraW5nX29wdGlvbl90aXRsZSAoNTM3NDEyMDk5ODEyNTM1Mzg5OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfY29udGFjdHNfZm9yX3NwZWxsY2hlY2tpbmdfb3B0aW9uX3N1bW1hcnkgKDg3NTQ0MTMzODI1NDMzMDc3MTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdmlicmF0ZV9vbl9rZXlwcmVzcyAoNTI1ODA3OTQ5NDI3Njk1NTQ2MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzb3VuZF9vbl9rZXlwcmVzcyAoNjA5MzU5MjI5NzE5ODI0MzY0NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb3B1cF9vbl9rZXlwcmVzcyAoMTIzODk0ODE1NzIzNTEyOTQ0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGdlbmVyYWxfY2F0ZWdvcnkgKDE4NTkwODg0NjcwMTc1NzMxOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29ycmVjdGlvbl9jYXRlZ29yeSAoMjIzNjc1MDkxNTA1NjYwNzYxMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX3R5cGluZ19jYXRlZ29yeSAoNDk3MjYzNjEyMTMwNTMyNjMwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1pc2NfY2F0ZWdvcnkgKDY4OTQxOTI4MTQ4NjgyMzM0NTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWR2YW5jZWRfc2V0dGluZ3MgKDM2Mjg5NTE0NDQ5NTU5MTQ2MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZHZhbmNlZF9zZXR0aW5nc19zdW1tYXJ5ICg0NDg3OTgwNDU2MTUyODMwMjcxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGluY2x1ZGVfb3RoZXJfaW1lc19pbl9sYW5ndWFnZV9zd2l0Y2hfbGlzdCAoNDUzMzY4OTk2MDMwODU2NTUxOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbmNsdWRlX290aGVyX2ltZXNfaW5fbGFuZ3VhZ2Vfc3dpdGNoX2xpc3Rfc3VtbWFyeSAoODQwNjM3MTI5MTAzMzE3NjM1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3dfbGFuZ3VhZ2Vfc3dpdGNoX2tleSAoNTkxNTQ3ODgyODMxODc3NDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG93X2xhbmd1YWdlX3N3aXRjaF9rZXlfc3VtbWFyeSAoNzM0MzQwMzY0NzQ3NDI2NTcxMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzbGlkaW5nX2tleV9pbnB1dF9wcmV2aWV3ICg2NjA0MjYyMzU5NTEwMDY4MzcwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNsaWRpbmdfa2V5X2lucHV0X3ByZXZpZXdfc3VtbWFyeSAoNjM0MDUyNDM0NTcyOTA5Mzg4NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlfcHJldmlld19wb3B1cF9kaXNtaXNzX2RlbGF5ICg2MjEzMTY0ODk3NDQzMDY4MjQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleV9wcmV2aWV3X3BvcHVwX2Rpc21pc3Nfbm9fZGVsYXkgKDIwOTYxMjMxNTE1NzE0NTgwNjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5X3ByZXZpZXdfcG9wdXBfZGlzbWlzc19kZWZhdWx0X2RlbGF5ICgyMTY2OTY0MzMzOTAzOTA2NzM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFiYnJldmlhdGlvbl91bml0X21pbGxpc2Vjb25kcyAoODcwMDI4NjA5NDAyODMyMzM2MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfY29udGFjdHNfZGljdCAoNDQzNTMxNzk3NzgwNDE4MDgxNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VfY29udGFjdHNfZGljdF9zdW1tYXJ5ICg2NTk5OTgzMzM0NTA3ODc5OTU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZV9kb3VibGVfc3BhY2VfcGVyaW9kICg4NzgxNTI5OTY5NDI1MDgyODYwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZV9kb3VibGVfc3BhY2VfcGVyaW9kX3N1bW1hcnkgKDY1MzI4OTIxODcyNDc5NTI3OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jYXAgKDE3MTk3NDY2NzQ4NTQ2MjgyNTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jYXBfc3VtbWFyeSAoNzkzNDQ1Mjc2MTAyMjk0Njg3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0X3BlcnNvbmFsX2RpY3Rpb25hcnkgKDM5OTY5MTAwMzg5NTI5NDA0MjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29uZmlndXJlX2RpY3Rpb25hcmllc190aXRsZSAoNDIzODY1MjMzODU1NjkwMjA0OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYWluX2RpY3Rpb25hcnkgKDQ3OTg3NjM3ODE4MTgzNjExNjgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc2hvd19zdWdnZXN0aW9ucyAoODAyNjc5OTY2MzQ0NTUzMTYzNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19zaG93X3N1Z2dlc3Rpb25zX3N1bW1hcnkgKDE1ODMxMzIyNzk0OTg1MDI4MjUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc3VnZ2VzdGlvbl92aXNpYmlsaXR5X3Nob3dfbmFtZSAoMzIxOTkxNjU5NDA2NzU1MTMwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19zdWdnZXN0aW9uX3Zpc2liaWxpdHlfc2hvd19vbmx5X3BvcnRyYWl0X25hbWUgKDM4NTk3ODM3Njc0MzUyMzkxMTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfc3VnZ2VzdGlvbl92aXNpYmlsaXR5X2hpZGVfbmFtZSAoNjMwOTE0MzkyNjQyMjIzNDY3MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19ibG9ja19wb3RlbnRpYWxseV9vZmZlbnNpdmVfdGl0bGUgKDUwNzg0ODAwNzEwNTc0MDg5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlX3N1bW1hcnkgKDIzNzE4MzU0Nzk3MzQ5OTEzNjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uICg3NjMwNzIwODg1MTk0OTk2OTUwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl9zdW1tYXJ5ICg1NjI1NzUxNTUxMTM0NjU4MDA2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9fY29ycmVjdGlvbl90aHJlc2hvbGRfbW9kZV9vZmYgKDg0NzA4ODI2NjU0MTc5NDQwMjYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZF9tb2RlX21vZGVzdCAoODc4ODM2NjY5MDYyMDc5OTA5NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvX2NvcnJlY3Rpb25fdGhyZXNob2xkX21vZGVfYWdnZXJlc3NpdmUgKDM1MjQwMjkxMDM3MzQ5MjM4MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZF9tb2RlX3ZlcnlfYWdnZXJlc3NpdmUgKDMzODY3ODIyMzU1NDA1NDc2NzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYmlncmFtX3ByZWRpY3Rpb24gKDEwODQ0NDkxODc3MjM5NDg1NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYmlncmFtX3ByZWRpY3Rpb25fc3VtbWFyeSAoMzg5NjM2MjY4Mjc1MTEwOTY3NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX2lucHV0ICg4MjY5NTExNTIyNTQ1NjM4MjcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZ2VzdHVyZV9pbnB1dF9zdW1tYXJ5ICg5MTgwMzUwNjM5MzA1NzMxMjMxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGdlc3R1cmVfcHJldmlld190cmFpbCAoMzgwMjMzMzM2OTMzNTcyMjIyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdGV4dCAoNDQ0MzI0MDMzNDczOTM4MTA1MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBnZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdGV4dF9zdW1tYXJ5ICg0NDcyNjk2MjEzOTk2MjAzNTMzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFkZGVkX3dvcmQgKDg5OTM4ODMzNTQ2MjI0ODQzNzIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsYWJlbF9nb19rZXkiIG1zZ2lkPSIxNjM1MTQ4MDgyMTM3MjE5MTQ4Ij4i0J7Rh9C40YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYWJlbF9uZXh0X2tleSIgbXNnaWQ9IjM2Mjk3Mjg0NDUyNTY3MjU2OCI+ItCU0LDRgNCw0LDQs9C40LnQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX3ByZXZpb3VzX2tleSIgbXNnaWQ9IjEyMTE4NjgxMTgwNzEzODY3ODciPiLTqNC80L3TqdGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfZG9uZV9rZXkiIG1zZ2lkPSIyNDQxNTc4NzQ4NzcyNTI5Mjg4Ij4i0KXQuNC50LPQtNC70Y3RjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX3NlbmRfa2V5IiBtc2dpZD0iMjgxNTA1NjUzNDQzMzcxNzQ0NCI+ItCY0LvQs9GN0Y3RhSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYWJlbF9wYXVzZV9rZXkgKDE4MTA5ODMwODQyODAzNTM0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYWJlbF93YWl0X2tleSAoNjQwMjE1MjYwMDg3ODA5MzEzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fdXNlX2hlYWRwaG9uZXMgKDg5Njk2MTc4MTI4NzI4MzQ5MykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fY3VycmVudF90ZXh0X2lzICgyNDg1NzIzMDExMjcyNTgzODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9ub190ZXh0X2VudGVyZWQgKDc0Nzk2ODUyMjU1OTczNDQ0OTYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3Vua25vd24gKDMxOTc0MzQwMTA0MDIxNzkxNTcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0ICgyNDQxOTc4ODMyOTI1NDkzMDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0X3NoaWZ0ZWQgKDE2ODE4NzczMjMzNDQxOTUwMzUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2NhcHNfbG9jayAoMzI3NjQ3ODI2OTUyNjMwNDQzMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fZGVsZXRlICg4NzQwMzc2OTQ0Mjc2MTk5ODAxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl90b19zeW1ib2wgKDU0ODYzNDAxMDc1MDA0NDg5NjkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3RvX2FscGhhICgyMzEyOTMzODgxOTc3MTgwNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdG9fbnVtZXJpYyAoNTkxNzUyMDkyNjg1MTYxNzMyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zZXR0aW5ncyAoNDYyNzQ2MjY4OTYwMzgzODA5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fdGFiICgyNjY3NzE2MDAyNjYzNDgyMjQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zcGFjZSAoMjU4MjUyMTA1MDA0OTg2MDg1OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbWljICg2MTU1MzY3NDg4ODI2MTE5NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NtaWxleSAoMjI1NjMwOTgyNjIwMDExMzkxOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fcmV0dXJuICg4MTc4MDgzMTc3MjM4MzE1NjQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zZWFyY2ggKDEyNDcyMzYxNjM3NTU5MjA4MDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2RvdCAoNDA3MTEwODI0MzUyMzE2NzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2xhbmd1YWdlX3N3aXRjaCAoNTUwNzA5MTMyODIyMjMzMTMxNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fYWN0aW9uX25leHQgKDg2MzYwNzgyNzY2NjQxNTAzMjQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX2FjdGlvbl9wcmV2aW91cyAoODAwODcyNDE1MDA5MzM2MjA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9zaGlmdG1vZGVfb24gKDU3MDA0NDA3OTg2MDk1NzQ1ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3Bva2VuX2Rlc2NyaXB0aW9uX3NoaWZ0bW9kZV9sb2NrZWQgKDU5MzE3NTgwMzE4MTcwMTgzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fc2hpZnRtb2RlX29mZiAoNjU3MjE5OTk4NDQ5MTc0ODA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNwb2tlbl9kZXNjcmlwdGlvbl9tb2RlX3N5bWJvbCAoNzE4MzM0Mzg3OTkwOTc0NzY0MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9hbHBoYSAoMzUyODMwNzY3NDM5MDE1Njk1NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9waG9uZSAoNjUyMDIwNzk0MzEzMjAyNjI2NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzcG9rZW5fZGVzY3JpcHRpb25fbW9kZV9waG9uZV9zaGlmdCAoNTQ5OTYyOTc1Mzk2MjY0MTIyNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhbm5vdW5jZV9rZXlib2FyZF9oaWRkZW4gKDg3MTg5Mjc4MzU1MzE0Mjk4MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYW5ub3VuY2Vfa2V5Ym9hcmRfbW9kZSAoNDcyOTA4MTA1NTQzODUwODMyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2RhdGUgKDMxMzc1MjAxNjY4MTcxMjgxMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9kYXRlX3RpbWUgKDMzOTU5MzM1ODQ4ODg1MTA3MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX2VtYWlsICg2MjE2MjQ4MDc4MTI4Mjk0MjYyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfaW0gKDExMzc0MDUwODk3NjY1NTcwNDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9udW1iZXIgKDc5OTE2MjM0NDA2OTk5NTcwNjkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV9waG9uZSAoNjg1MTYyNzUyNzQwMTQzMzIyOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBrZXlib2FyZF9tb2RlX3RleHQgKDY0Nzk0MzY2ODc4OTk3MDE2MTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbW9kZV90aW1lICg0MzgxODU2ODg1NTgyMTQzMjc3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX21vZGVfdXJsICgxNTE5ODE5ODM1NTE0OTExMjE4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0ICgzNTgzMjU4NTgzNTIxMzk3NTQ4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX21haW5fa2V5Ym9hcmQgKDMzNjA2NjAzNDExMjEwODMxNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3ltYm9sc19rZXlib2FyZCAoNzIwMzIxMzI0MDc4NjA4NDA2NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19vZmYgKDM3NDU2OTk3NDgyMTgwODIwMTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igdm9pY2VfaW5wdXRfbW9kZXNfc3VtbWFyeV9tYWluX2tleWJvYXJkICg2NTg2NTQ0MjkyOTAwMzE0MzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHZvaWNlX2lucHV0X21vZGVzX3N1bW1hcnlfc3ltYm9sc19rZXlib2FyZCAoNTIzMzcyNTkyNzI4MTkzMjM5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB2b2ljZV9pbnB1dF9tb2Rlc19zdW1tYXJ5X29mZiAoNjM4NzU2MDk1OTE4OTc2MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY29uZmlndXJlX2lucHV0X21ldGhvZCAoMzczMzU2MjcwMjkwNzQyNDU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhbmd1YWdlX3NlbGVjdGlvbl90aXRsZSAoMTY1MTI5OTU5ODU1NTMyNjc1MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZW5kX2ZlZWRiYWNrICgxNzgwNDMxODg0MTA5MzkyMDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdF9sYW5ndWFnZSAoMzY5MzgxNTU4ODc3NzkyNjg0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBoaW50X2FkZF90b19kaWN0aW9uYXJ5ICg1NzM2Nzg2NTY5NDYwODUzODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaGFzX2RpY3Rpb25hcnkgKDYwNzE4NDc5NzM0NjY2MjUwMDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfZW5hYmxlX2xvZyAoNjYyMDQyNDUwNTA3Mjk2MzU1NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19kZXNjcmlwdGlvbl9sb2cgKDc1MjUyMjU1ODQ1NTU0MjkyMTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Iga2V5Ym9hcmRfbGF5b3V0ICg4NDUxMTY0NzgzNTEwNDg3NTAxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfZW5fR0IgKDg4MTcwNjAxOTQyMzExMzU1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfZW5fVVMgKDYxNjA0NTIzMzY2MzQ1MzQyMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9lc19VUyAoNTU4MzE0NTE5MTQzMDE4MDIwMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX3dpdGhfbGF5b3V0X2VuX0dCICgyMTc5MDk3NzQ4NzI0NzI1OTA2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfd2l0aF9sYXlvdXRfZW5fVVMgKDEzNjI1ODEzNDc1NzY3MTQ1NzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV93aXRoX2xheW91dF9lc19VUyAoNjI2MTc5MTA1NzAwNzg5MDE4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdWJ0eXBlX25vX2xhbmd1YWdlICgxNDE0MjA4NTc4MDg4MDE3NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9xd2VydHkgKDI5NTYxMjE0NTE2MTY2MzMxMzMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9xd2VydHogKDExNzc4NDgxNzIzOTcyMDI4OTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9hemVydHkgKDg3MjE0NjA5NjgxNDExODczOTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9kdm9yYWsgKDMxMjI5NzY3Mzc2Njk4MjM5MzUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3VidHlwZV9ub19sYW5ndWFnZV9jb2xlbWFrICg0MjA1OTkyOTk0OTA2MDk3MjQ0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbm9fbGFuZ3VhZ2VfcGNxd2VydHkgKDg4NDA5MjgzNzQzOTQxODAxODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY3VzdG9tX2lucHV0X3N0eWxlc190aXRsZSAoODQyOTk1MjQ0MTgyMTI1MTUxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhZGRfc3R5bGUgKDYxNjMxMjY2MTQ1MTQ0ODk5NTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYWRkICg4Mjk5Njk5ODA1Njg4MDE3Nzk4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlbW92ZSAoNDQ4NjA4MTY1ODc1Mjk0NDYwNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzYXZlICg3NjQ2NzM4NTk3MTk2NzY3MjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN1YnR5cGVfbG9jYWxlICg4NTc2NDQzNDQwNzM4MTQzNzY0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGtleWJvYXJkX2xheW91dF9zZXQgKDQzMDkyMzM2OTgxOTQ1NjU2MDkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY3VzdG9tX2lucHV0X3N0eWxlX25vdGVfbWVzc2FnZSAoODgyNjczMTMyMDg0NjM2MzQyMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlbmFibGUgKDUwMzEyOTQ0NDQ2MzA1MjMyNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm90X25vdyAoNjE3MjQ2Mjg4ODIwMjc5MDQ4MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjdXN0b21faW5wdXRfc3R5bGVfYWxyZWFkeV9leGlzdHMgKDgwMDg3Mjg5NTIyMTU0NDk3MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfdXNhYmlsaXR5X3N0dWR5X21vZGUgKDEyNjExMzA1NTUxMzQ1OTUyNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfa2V5X2xvbmdwcmVzc190aW1lb3V0X3NldHRpbmdzICg2MTAyMjQwMjk4OTMyODk3ODczKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHByZWZzX2tleXByZXNzX3ZpYnJhdGlvbl9kdXJhdGlvbl9zZXR0aW5ncyAoNzkxODM0MTQ1OTk0NzQzOTIyNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwcmVmc19rZXlwcmVzc19zb3VuZF92b2x1bWVfc2V0dGluZ3MgKDYwMjcwMDczMzcwMzY4OTE2MjMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcHJlZnNfcmVhZF9leHRlcm5hbF9kaWN0aW9uYXJ5ICgyNTg4OTMxNDE4NTc1MDEzMDY3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9ub19maWxlc19tZXNzYWdlICg0OTQ3NDIwOTQyMjI0NjIzNzkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHJlYWRfZXh0ZXJuYWxfZGljdGlvbmFyeV9tdWx0aXBsZV9maWxlc190aXRsZSAoNzYzNzc0OTA0NDI2NTgwODYyOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciByZWFkX2V4dGVybmFsX2RpY3Rpb25hcnlfY29uZmlybV9pbnN0YWxsX21lc3NhZ2UgKDY4OTg2MTAxNjM3Njg5ODA4NzApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXJyb3IgKDg5NDA3NjM2MjQ2Njg1MTM2NDgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYnV0dG9uX2RlZmF1bHQgKDM5ODgwMTc4NDA0MzE4ODE0OTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfd2VsY29tZV90aXRsZSAoNjExMjgyMTcwOTgzMjAzMTcxNSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF93ZWxjb21lX2FkZGl0aW9uYWxfZGVzY3JpcHRpb24gKDgxNTAyNTIwMDg1NDU3Njg5NTMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RhcnRfYWN0aW9uICg4OTM2MDM2NDYwODk3MzQ3NzA4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX25leHRfYWN0aW9uICgzNzE4MjE0Mzc5MTUxNDQ2MDMpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcHNfdGl0bGUgKDY0MDAzNzMwMzQ4NzE4MTYxODIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfdGl0bGUgKDMxNDc5Njc2MzAyNTM0NjIzMTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfaW5zdHJ1Y3Rpb24gKDI1Nzg2MzE5MzY2MjQ2MzcyNDEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDFfZmluaXNoZWRfaW5zdHJ1Y3Rpb24gKDEwNzYxNDgyMDA0OTU3OTk0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNldHVwX3N0ZXAxX2FjdGlvbiAoNDM2NjUxMzUzNDk5OTkwMTcyOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl90aXRsZSAoNjg2MDcyNTQ0NzkwNjY5MDU5NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl9pbnN0cnVjdGlvbiAoOTE0MTQ4MTk2NDg3MDAyMzMzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZXR1cF9zdGVwMl9hY3Rpb24gKDE2NjAzMzAzMDcxNTk4MjQzMzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfdGl0bGUgKDMxNTQ3NTcxODM2MzE0OTAyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfaW5zdHJ1Y3Rpb24gKDgwMjU5ODE4Mjk2MDU0MjYwMDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfc3RlcDNfYWN0aW9uICg2MDA4Nzk3OTcyNTY5NDIyNTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2V0dXBfZmluaXNoX2FjdGlvbiAoMjc2NTU5MjQzNDA5NDY1Mzg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3dfc2V0dXBfd2l6YXJkX2ljb24gKDUwMDgwMjg1OTA1OTM3MTA4MzApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvd19zZXR1cF93aXphcmRfaWNvbl9zdW1tYXJ5ICg0MTE5OTk4MzIyNTM2ODgwMjEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGFwcF9uYW1lICg2MzIwMTAyNjM3NDkxMjM0NzkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSAoMzAyNzMxNTA0NTM5NzM2MzA3OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSAoNjIzNzQ3MjM1MDY5MzUxMTQ0OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9kZXNjcmlwdGlvbiAoNjAxNDgzNTI4MzExOTE5ODU5MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlICg4MDkxNDE3Njc2MDQ1NjkzMzEzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQgKDM1ODc1MTc4NzAwMDYzMzI5ODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5ICg1MzA1Njk0OTg3Nzk5ODI0MzQ5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdGlvbmFyaWVzICgzNTgyMzMyMDU1ODkyMjUyODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSAoMTYyNTA1NTcyMDQ4OTI4MDUzMCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X2F2YWlsYWJsZSAoNDcyODk3NTM0NTgxNTIxNDIxOCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nICgyOTgyNjUwNTI0NjIyNjIwOTgzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfaW5zdGFsbGVkICg4MDgxNTU4MzQzNTU5MzQyOTYyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfZGlzYWJsZWQgKDg5NTAzODMyMTk1NjQ2MjE3NjIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlICg5MjE2OTMzNjk1NzY1NzMyMzk4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUgKDgwMzk5MjA3MTY1NjYxMzI2MTEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgY2hlY2tfZm9yX3VwZGF0ZXNfbm93ICg4MDg3Njg4NDQwOTE2Mzg4NTgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhc3RfdXBkYXRlICg3MzA0Njc1NDk5MTM1ODg3ODApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWVzc2FnZV91cGRhdGluZyAoNDQ1Nzc2MTM5MzkzMjM3NTIxOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtZXNzYWdlX2xvYWRpbmcgKDg2ODkwOTY2MzY4NzQ3NTg4MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWFpbl9kaWN0X2Rlc2NyaXB0aW9uICgzMDcyODIxMzUyNzkzNDkyMTQzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGNhbmNlbCAoNjgzMDk4MDM5OTg2NTY4MzMyNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBpbnN0YWxsX2RpY3QgKDE4MDg1Mjc3MjU2MjE4OTM2NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBjYW5jZWxfZG93bmxvYWRfZGljdCAoNzg0MzM0MDI3ODUwNzAxOTMwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkZWxldGVfZGljdCAoNzU2ODUzMjY4MDg4MzMwMDU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICgyODc4NjI5NTk4NjY3NjU4ODQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoMTY0MzA2NTg1MTE1OTQwOTU0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICgyMTc2MjA5NTc5MzEzOTQxNTgzKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSAoNjUxNDI4ODU5MTk1OTExNzI4OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24gKDEwNzUxOTQxNjk0NDMxNjM0ODcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdG9hc3RfZG93bmxvYWRpbmdfc3VnZ2VzdGlvbnMgKDEzMTMwMjczNTM1ODg1NjY2NjApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdmVyc2lvbl90ZXh0ICgyNzE1MzU0MjE1NTY4NDY5Mzg1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfbWVudV90aXRsZSAoMTI1NDE5NTM2NTY4OTM4NzA3NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ190aXRsZSAoNDA5NjcwMDM5MDIxMTc0ODE2OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3NjcmVlbl90aXRsZSAoNTgxODkxNDMzMTYyOTI3ODc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ19tb3JlX29wdGlvbnMgKDU2NzE2ODIwMDQ4ODcwOTMxMTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9kaWFsb2dfbGVzc19vcHRpb25zICgyNzE2NTg2NTY3MjQxNzI0MTI2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX2NvbmZpcm0gKDQ3MDMxMjk1MDczODgzMzI5NTApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF93b3JkX29wdGlvbl9uYW1lICg2NjY1NTU4MDUzNDA4OTYyODY1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfb3B0aW9uX25hbWUgKDMwOTQ3MzE1OTA2NTU1MjM3NzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9sb2NhbGVfb3B0aW9uX25hbWUgKDQ3Mzg2NDM0NDA5ODcyNzc3MDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF93b3JkX2hpbnQgKDQ5MDI0MzQxNDg5ODU5MDY3MDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2FkZF9zaG9ydGN1dF9oaW50ICgyMjY1NDUzMDEyNTU1MDYwMTc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9zZXR0aW5nc19lZGl0X2RpYWxvZ190aXRsZSAoMzc2NTc3NDYzMzg2OTU5MDM1MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfY29udGV4dF9tZW51X2VkaXRfdGl0bGUgKDY4MTIyNTU5MDM0NzI0NTYzMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2NvbnRleHRfbWVudV9kZWxldGVfdGl0bGUgKDgxNDI5MzI0NDc2ODk0NjExODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2VtcHR5X3RleHQgKDU1ODQ5OTU4NzUzMjY2ODIwMykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfYWxsX2xhbmd1YWdlcyAoODI3NjEyNjU4MzIxNjI5ODg4NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB1c2VyX2RpY3Rfc2V0dGluZ3NfbW9yZV9sYW5ndWFnZXMgKDcxMzEyNjg0OTk2ODUxODA0NjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdXNlcl9kaWN0X3NldHRpbmdzX2RlbGV0ZSAoMTEwNDEzMzM1MTg3MTkzODU5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHVzZXJfZGljdF9mYXN0X3Njcm9sbF9hbHBoYWJldCAoNTQzMTkxOTQwMTU1ODI4NTQ3MykgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW1zL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbXMvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLW1zL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW5iL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbmIvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLW5iL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW5sL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbmwvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLW5sL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXBsL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtcGwvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXBsL2RpY3Rpb25hcnktcGFjay54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZGljdGlvbmFyeV9wYWNrX3NldHRpbmdzX2FjdGl2aXR5ICg2NjQ2OTE1NDUxNDc4OTgyNzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0aG9yaXR5ICg4NzczMTY2NDk1MTUzMDE2NDg5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiIG1zZ2lkPSI2ODg5NTk2MzQ5ODQ3MDE1MTUzIj48L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2NhbF9tZXRhZGF0YV9maWxlbmFtZSAoNDYzNDM1NjkxMzY4OTI3MTMzMSkgLS0+CisgICAgPHNraXAgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXBvcnQvc2V0dXAtZGltZW5zLXNtYWxsLXBob25lLXBvcnQueG1sIGIvamF2YS9yZXMvdmFsdWVzLXBvcnQvc2V0dXAtZGltZW5zLXNtYWxsLXBob25lLXBvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzcyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtcG9ydC9zZXR1cC1kaW1lbnMtc21hbGwtcGhvbmUtcG9ydC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDwhLS0gU2V0dXAgd2l6YXJkIGRpbWVuc2lvbnMgZm9yIHNtYWxsLXBob25lL3BvcnRyYWl0LiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfdGl0bGVfdGV4dF9zaXplIj40MHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfd2VsY29tZV9kZXNjcmlwdGlvbl90ZXh0X3NpemUiPjIwc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2J1bGxldF90ZXh0X3NpemUiPjE4c3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX3RyaWFuZ2xlX2luZGljYXRvcl9oZWlnaHQiPjE4ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2luZGljYXRvcl9oZWlnaHQiPjE4ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX3RpdGxlX3RleHRfc2l6ZSI+MThzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3N0ZXBfaW5zdHJ1Y3Rpb25fdGV4dF9zaXplIj4xNHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9hY3Rpb25fdGV4dF9zaXplIj4xNnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfdmVydGljYWxfcGFkZGluZyI+MmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9hY3Rpb25faGVpZ2h0Ij40MmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmciPjIwZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZ19oYWxmIj4xMGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF92ZXJ0aWNhbF9wYWRkaW5nIj4xMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic2V0dXBfc3RlcF9ob3Jpem9udGFsX2xpbmVfaGVpZ2h0Ij4yZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3RpdGxlX3dlaWdodF9pbl9zY3JlZW4iPjQwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX2JvZHlfd2VpZ2h0X2luX3NjcmVlbiI+NjA8L2ludGVnZXI+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX2VuZF9tYXJnaW4iPjE2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX2Rlc2NyaXB0aW9uX3RvcF9tYXJnaW4iPjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fdG9wX3BhZGRpbmciPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX2JvdHRvbV9wYWRkaW5nIj4xMmRwPC9kaW1lbj4KKyAgICA8aW50ZWdlciBuYW1lPSJzZXR1cF93ZWxjb21lX3ZpZGVvX3dlaWdodF9pbl9zY3JlZW4iPjcwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fZW5kX3BhZGRpbmdfd2VpZ2h0X2luX3NjcmVlbiI+MzA8L2ludGVnZXI+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1wdC1yUFQvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1wdC1yUFQvZGljdGlvbmFyeS1wYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXB0LXJQVC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1wdC9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXB0L2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1wdC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1ybS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXJtL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1ybS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1yby9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXJvL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1yby9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1ydS9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXJ1L2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1ydS9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zay9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXNrL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zay9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zbC9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXNsL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zbC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zci9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXNyL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zci9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdi9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXN2L2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zdi9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdy9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXN3L2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zdy9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdzYwMGRwLWxhbmQvc2V0dXAtZGltZW5zLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1zdzYwMGRwLWxhbmQvc2V0dXAtZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlYTIxNC4uMDAwMDAwMAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtc3c2MDBkcC1sYW5kL3NldHVwLWRpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGRpbWVuIG5hbWU9InNldHVwX3RpdGxlX3RleHRfc2l6ZSI+NjRzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9InNldHVwX2hvcml6b250YWxfcGFkZGluZyI+OTZkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbmZpZy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtc3c2MDBkcC9jb25maWcueG1sCmluZGV4IDk1MjdmZDYuLjgyNjU2NTEgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbmZpZy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXN3NjAwZHAvY29uZmlnLnhtbApAQCAtMTksOCArMTksNiBAQAogLS0+CiAKIDxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEZXZpY2UgZm9ybSBmYWN0b3IuIFRoaXMgdmFsdWUgbXVzdCBiZSBhbGlnbmVkIHdpdGgge0BsaW5rIEtleWJvYXJkSWQuRk9STV9GQUNUT1JfVEFCTEVUN30gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2RldmljZV9mb3JtX2ZhY3RvciI+MTwvaW50ZWdlcj4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlX3Nob3dfdm9pY2Vfa2V5X29wdGlvbiI+ZmFsc2U8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZV9zaG93X29wdGlvbl9vZl9rZXlfcHJldmlld19wb3B1cCI+ZmFsc2U8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZV9iaWdyYW1fc3VnZ2VzdGlvbnNfb3B0aW9uIj5mYWxzZTwvYm9vbD4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCmluZGV4IDU4NmZiZTYuLjc1YjQ3NmMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApAQCAtODUsOCArODUsOCBAQAogICAgIDxkaW1lbiBuYW1lPSJzdWdnZXN0aW9uX3RleHRfc2l6ZSI+MjJkcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9Im1vcmVfc3VnZ2VzdGlvbnNfaGludF90ZXh0X3NpemUiPjMzZHA8L2RpbWVuPgogCi0gICAgPCEtLSBHZXN0dXJlIHByZXZpZXcgdHJhaWwgcGFyYW1ldGVycyAtLT4KLSAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV9wcmV2aWV3X3RyYWlsX3dpZHRoIj4yLjVkcDwvZGltZW4+CisgICAgPCEtLSBHZXN0dXJlIHRyYWlsIHBhcmFtZXRlcnMgLS0+CisgICAgPGRpbWVuIG5hbWU9Imdlc3R1cmVfdHJhaWxfd2lkdGgiPjIuNWRwPC9kaW1lbj4KICAgICA8IS0tIEdlc3R1cmUgZmxvYXRpbmcgcHJldmlldyB0ZXh0IHBhcmFtZXRlcnMgLS0+CiAgICAgPGRpbWVuIG5hbWU9Imdlc3R1cmVfZmxvYXRpbmdfcHJldmlld190ZXh0X3NpemUiPjI4ZHA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJnZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdGV4dF9vZmZzZXQiPjg3ZHA8L2RpbWVuPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXN3NzY4ZHAtbGFuZC9zZXR1cC1kaW1lbnMueG1sIGIvamF2YS9yZXMvdmFsdWVzLXN3NzY4ZHAtbGFuZC9zZXR1cC1kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDJhZjE3Li4wMDAwMDAwCi0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zdzc2OGRwLWxhbmQvc2V0dXAtZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8ZGltZW4gbmFtZT0ic2V0dXBfdGl0bGVfdGV4dF9zaXplIj42NHNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ic2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIj4xOTJkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdzc2OGRwL2NvbmZpZy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtc3c3NjhkcC9jb25maWcueG1sCmluZGV4IDNjMmMxOTguLjk3ZjExY2IgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zdzc2OGRwL2NvbmZpZy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXN3NzY4ZHAvY29uZmlnLnhtbApAQCAtMTksOCArMTksNiBAQAogLS0+CiAKIDxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEZXZpY2UgZm9ybSBmYWN0b3IuIFRoaXMgdmFsdWUgbXVzdCBiZSBhbGlnbmVkIHdpdGgge0BsaW5rIEtleWJvYXJkSWQuRk9STV9GQUNUT1JfVEFCTEVUMTB9IC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19kZXZpY2VfZm9ybV9mYWN0b3IiPjI8L2ludGVnZXI+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZV9zaG93X3ZvaWNlX2tleV9vcHRpb24iPmZhbHNlPC9ib29sPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVfc2hvd19vcHRpb25fb2Zfa2V5X3ByZXZpZXdfcG9wdXAiPmZhbHNlPC9ib29sPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVfYmlncmFtX3N1Z2dlc3Rpb25zX29wdGlvbiI+ZmFsc2U8L2Jvb2w+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtc3c3NjhkcC9kaW1lbnMueG1sIGIvamF2YS9yZXMvdmFsdWVzLXN3NzY4ZHAvZGltZW5zLnhtbAppbmRleCAyZmQ3MzIyLi45MTI1MWY1IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtc3c3NjhkcC9kaW1lbnMueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zdzc2OGRwL2RpbWVucy54bWwKQEAgLTg2LDggKzg2LDggQEAKICAgICA8ZGltZW4gbmFtZT0ic3VnZ2VzdGlvbl90ZXh0X3NpemUiPjIyZHA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJtb3JlX3N1Z2dlc3Rpb25zX2hpbnRfdGV4dF9zaXplIj4zM2RwPC9kaW1lbj4KIAotICAgIDwhLS0gR2VzdHVyZSBwcmV2aWV3IHRyYWlsIHBhcmFtZXRlcnMgLS0+Ci0gICAgPGRpbWVuIG5hbWU9Imdlc3R1cmVfcHJldmlld190cmFpbF93aWR0aCI+Mi41ZHA8L2RpbWVuPgorICAgIDwhLS0gR2VzdHVyZSB0cmFpbCBwYXJhbWV0ZXJzIC0tPgorICAgIDxkaW1lbiBuYW1lPSJnZXN0dXJlX3RyYWlsX3dpZHRoIj4yLjVkcDwvZGltZW4+CiAgICAgPCEtLSBHZXN0dXJlIGZsb2F0aW5nIHByZXZpZXcgdGV4dCBwYXJhbWV0ZXJzIC0tPgogICAgIDxkaW1lbiBuYW1lPSJnZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdGV4dF9zaXplIj4yNmRwPC9kaW1lbj4KICAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3RleHRfb2Zmc2V0Ij44NmRwPC9kaW1lbj4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy10aC9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXRoL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy10aC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy10bC9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXRsL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy10bC9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy10ci9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXRyL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy10ci9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy11ay9kaWN0aW9uYXJ5LXBhY2sueG1sIGIvamF2YS9yZXMvdmFsdWVzLXVrL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy11ay9kaWN0aW9uYXJ5LXBhY2sueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSAoNjY0NjkxNTQ1MTQ3ODk4Mjc0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dGhvcml0eSAoODc3MzE2NjQ5NTE1MzAxNjQ4OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfbWV0YWRhdGFfdXJpIiBtc2dpZD0iNjg4OTU5NjM0OTg0NzAxNTE1MyI+PC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUgKDQ2MzQzNTY5MTM2ODkyNzEzMzEpIC0tPgorICAgIDxza2lwIC8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy9zZXR1cC1kaW1lbnMueG1sIGIvamF2YS9yZXMvdmFsdWVzLXYxNy9zZXR1cC1zdHlsZXMueG1sCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIGphdmEvcmVzL3ZhbHVlcy9zZXR1cC1kaW1lbnMueG1sCnJlbmFtZSB0byBqYXZhL3Jlcy92YWx1ZXMtdjE3L3NldHVwLXN0eWxlcy54bWwKaW5kZXggMDA3OTA2ZC4uOGE5ZDY2NCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzL3NldHVwLWRpbWVucy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXYxNy9zZXR1cC1zdHlsZXMueG1sCkBAIC0xNSw2ICsxNSwxMSBAQAogLS0+CiAKIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8ZGltZW4gbmFtZT0ic2V0dXBfdGl0bGVfdGV4dF9zaXplIj40NnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ic2V0dXBfaG9yaXpvbnRhbF9wYWRkaW5nIj4xNmRwPC9kaW1lbj4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBUaXRsZVN0eWxlIiBwYXJlbnQ9InNldHVwVGl0bGVTdHlsZUNvbW1vbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwQWN0aW9uTGFiZWxTdHlsZSIgcGFyZW50PSJzZXR1cFN0ZXBBY3Rpb25MYWJlbFN0eWxlQ29tbW9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjEyZHA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+MjRkcDwvaXRlbT4KKyAgICA8L3N0eWxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtdmkvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy12aS9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtdmkvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtemgtckNOL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtemgtckNOL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy16aC1yQ04vZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtemgtclRXL2RpY3Rpb25hcnktcGFjay54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtemgtclRXL2RpY3Rpb25hcnktcGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL3ZhbHVlcy16aC1yVFcvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtenUvZGljdGlvbmFyeS1wYWNrLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy16dS9kaWN0aW9uYXJ5LXBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtenUvZGljdGlvbmFyeS1wYWNrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkgKDY2NDY5MTU0NTE0Nzg5ODI3NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRob3JpdHkgKDg3NzMxNjY0OTUxNTMwMTY0ODkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X21ldGFkYXRhX3VyaSIgbXNnaWQ9IjY4ODk1OTYzNDk4NDcwMTUxNTMiPjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2FsX21ldGFkYXRhX2ZpbGVuYW1lICg0NjM0MzU2OTEzNjg5MjcxMzMxKSAtLT4KKyAgICA8c2tpcCAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvamF2YS9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCBhNzFlN2NjLi40NzhhNWMwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTEwOCwxNyArMTA4LDI1IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1BbHBoYSIgZm9ybWF0PSJpbnRlZ2VyIiAvPgogICAgICAgICA8IS0tIE1vcmUga2V5cyBrZXlib2FyZCB3aWxsIHNob3duIGF0IHRvdWNoZWQgcG9pbnQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzaG93TW9yZUtleXNLZXlib2FyZEF0VG91Y2hlZFBvaW50IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gTWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGdlc3R1cmUgdHJhaWwgc2FtcGxpbmcgcG9pbnRzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVRyYWlsTWluU2FtcGxpbmdEaXN0YW5jZSIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgICAgIDwhLS0gTWF4aW11bSBhbmd1bGFyIHRocmVzaG9sZCBiZXR3ZWVuIGdlc3R1cmUgdHJhaWwgaW50ZXJwb2xhdGlvbiBzZWdtZW50cyBpbiBkZWdyZWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlVHJhaWxNYXhJbnRlcnBvbGF0aW9uQW5ndWxhclRocmVzaG9sZCIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIE1heGltdW0gZGlzdGFuY2UgdGhyZXNob2xkIGJldHdlZW4gZ2VzdHVyZSB0cmFpbCBpbnRlcnBvbGF0aW9uIHNlZ21lbnRzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVRyYWlsTWF4SW50ZXJwb2xhdGlvbkRpc3RhbmNlVGhyZXNob2xkIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICAgICAgPCEtLSBNYXhpbXVtIG51bWJlciBvZiBnZXN0dXJlIHRyYWlsIGludGVycG9sYXRpb24gc2VnbWVudHMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlVHJhaWxNYXhJbnRlcnBvbGF0aW9uU2VnbWVudHMiIGZvcm1hdD0iaW50ZWdlciIgLz4KICAgICAgICAgPCEtLSBEZWxheSBhZnRlciBnZXN0dXJlIHRyYWlsIHN0YXJ0cyBmYWRpbmcgb3V0IGluIG1pbGxpc2Vjb25kLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbEZhZGVvdXRTdGFydERlbGF5IiBmb3JtYXQ9ImludGVnZXIiIC8+Ci0gICAgICAgIDwhLS0gRHVyYXRpb24gd2hpbGUgZ2VzdHVyZSBwcmV2aWV3IHRyYWlsIGlzIGZhZGluZyBvdXQgaW4gbWlsbGlzZWNvbmQuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlUHJldmlld1RyYWlsRmFkZW91dER1cmF0aW9uIiBmb3JtYXQ9ImludGVnZXIiIC8+Ci0gICAgICAgIDwhLS0gSW50ZXJ2YWwgb2YgdXBkYXRpbmcgZ2VzdHVyZSBwcmV2aWV3IHRyYWlsIGluIG1pbGxpc2Vjb25kLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbFVwZGF0ZUludGVydmFsIiBmb3JtYXQ9ImludGVnZXIiIC8+Ci0gICAgICAgIDxhdHRyIG5hbWU9Imdlc3R1cmVQcmV2aWV3VHJhaWxDb2xvciIgZm9ybWF0PSJjb2xvciIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbFN0YXJ0V2lkdGgiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlUHJldmlld1RyYWlsRW5kV2lkdGgiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlUHJldmlld1RyYWlsQm9keVJhdGlvIiBmb3JtYXQ9ImludGVnZXIiIC8+Ci0gICAgICAgIDxhdHRyIG5hbWU9Imdlc3R1cmVQcmV2aWV3VHJhaWxTaGFkb3dSYXRpbyIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlVHJhaWxGYWRlb3V0U3RhcnREZWxheSIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIER1cmF0aW9uIHdoaWxlIGdlc3R1cmUgdHJhaWwgaXMgZmFkaW5nIG91dCBpbiBtaWxsaXNlY29uZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imdlc3R1cmVUcmFpbEZhZGVvdXREdXJhdGlvbiIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIEludGVydmFsIG9mIHVwZGF0aW5nIGdlc3R1cmUgdHJhaWwgaW4gbWlsbGlzZWNvbmQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlVHJhaWxVcGRhdGVJbnRlcnZhbCIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJnZXN0dXJlVHJhaWxDb2xvciIgZm9ybWF0PSJjb2xvciIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVRyYWlsU3RhcnRXaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9Imdlc3R1cmVUcmFpbEVuZFdpZHRoIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZVRyYWlsQm9keVJhdGlvIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9Imdlc3R1cmVUcmFpbFNoYWRvd1JhdGlvIiBmb3JtYXQ9ImludGVnZXIiIC8+CiAgICAgICAgIDwhLS0gRGVsYXkgYWZ0ZXIgZ2VzdHVyZSBpbnB1dCBhbmQgZ2VzdHVyZSBmbG9hdGluZyBwcmV2aWV3IHRleHQgZGlzbWlzc2luZyBpbiBtaWxsaXNlY29uZCAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZ2VzdHVyZUZsb2F0aW5nUHJldmlld1RleHRMaW5nZXJUaW1lb3V0IiBmb3JtYXQ9ImludGVnZXIiIC8+CiAgICAgICAgIDwhLS0gQXR0cmlidXRlcyBmb3IgR2VzdHVyZUZsb2F0aW5nUHJldmlld1RleHQgLS0+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCmluZGV4IDhhODA0OWYuLmRhYTE2N2MgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCkBAIC01OCw0ICs1OCw1IEBACiAgICAgPGNvbG9yIG5hbWU9InNldHVwX3RleHRfZGFyayI+I0ZGNzA3MDcwPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0ic2V0dXBfdGV4dF9hY3Rpb24iPkBhbmRyb2lkOmNvbG9yL2hvbG9fYmx1ZV9saWdodDwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9InNldHVwX3N0ZXBfYmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9saWdodDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9InNldHVwX3dlbGNvbWVfdmlkZW9fbWFyZ2luX2NvbG9yIj4jRkZDQ0NDQ0M8L2NvbG9yPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDRlMjkzNmMuLmQzYTIxZjIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0xOSw4ICsxOSw2IEBACiAtLT4KIAogPHJlc291cmNlcz4KLSAgICA8IS0tIERldmljZSBmb3JtIGZhY3Rvci4gVGhpcyB2YWx1ZSBtdXN0IGJlIGFsaWduZWQgd2l0aCB7QGxpbmsgS2V5Ym9hcmRJZC5GT1JNX0ZBQ1RPUl9QSE9ORX0gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2RldmljZV9mb3JtX2ZhY3RvciI+MDwvaW50ZWdlcj4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfdXNlX2Z1bGxzY3JlZW5fbW9kZSI+ZmFsc2U8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZV9zaG93X3ZvaWNlX2tleV9vcHRpb24iPnRydWU8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZV9zaG93X29wdGlvbl9vZl9rZXlfcHJldmlld19wb3B1cCI+dHJ1ZTwvYm9vbD4KQEAgLTMzLDcgKzMxLDcgQEAKICAgICA8Ym9vbCBuYW1lPSJjb25maWdfZGVmYXVsdF9uZXh0X3dvcmRfcHJlZGljdGlvbiI+dHJ1ZTwvYm9vbD4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfZGVmYXVsdF9zb3VuZF9lbmFibGVkIj5mYWxzZTwvYm9vbD4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfZGVmYXVsdF92aWJyYXRpb25fZW5hYmxlZCI+dHJ1ZTwvYm9vbD4KLSAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbWF4X3ZpYnJhdGlvbl9kdXJhdGlvbiI+MjUwPC9pbnRlZ2VyPiA8IS0tIG1pbGxpc2Vjb25kcyAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbWF4X3ZpYnJhdGlvbl9kdXJhdGlvbiI+MTAwPC9pbnRlZ2VyPiA8IS0tIG1pbGxpc2Vjb25kcyAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZGVsYXlfdXBkYXRlX3N1Z2dlc3Rpb25zIj4xMDA8L2ludGVnZXI+CiAgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2RlbGF5X3VwZGF0ZV9vbGRfc3VnZ2VzdGlvbnMiPjMwMDwvaW50ZWdlcj4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZGVsYXlfdXBkYXRlX3NoaWZ0X3N0YXRlIj4xMDA8L2ludGVnZXI+CkBAIC03NSwxMCArNzMsMTEgQEAKICAgICA8IS0tIFNob3dpbmcgbW9yZSBrZXlzIGtleWJvYXJkLCBqdXN0IGFib3ZlIHRoZSB0b3VjaGVkIHBvaW50IGlmIHRydWUsIGFsaWduZWQgdG8gdGhlIGtleSBpZgogICAgICAgICAgZmFsc2UgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX3Nob3dfbW9yZV9rZXlzX2tleWJvYXJkX2F0X3RvdWNoZWRfcG9pbnQiPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19ibG9ja19wb3RlbnRpYWxseV9vZmZlbnNpdmUiPnRydWU8L2Jvb2w+CiAgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2dlc3R1cmVfZmxvYXRpbmdfcHJldmlld190ZXh0X2xpbmdlcl90aW1lb3V0Ij4yMDA8L2ludGVnZXI+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2dlc3R1cmVfcHJldmlld190cmFpbF9mYWRlb3V0X3N0YXJ0X2RlbGF5Ij4xMDA8L2ludGVnZXI+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2dlc3R1cmVfcHJldmlld190cmFpbF9mYWRlb3V0X2R1cmF0aW9uIj44MDA8L2ludGVnZXI+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2dlc3R1cmVfcHJldmlld190cmFpbF91cGRhdGVfaW50ZXJ2YWwiPjIwPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19nZXN0dXJlX3RyYWlsX2ZhZGVvdXRfc3RhcnRfZGVsYXkiPjEwMDwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZ2VzdHVyZV90cmFpbF9mYWRlb3V0X2R1cmF0aW9uIj44MDA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2dlc3R1cmVfdHJhaWxfdXBkYXRlX2ludGVydmFsIj4yMDwvaW50ZWdlcj4KICAgICA8IS0tIFN0YXRpYyB0aHJlc2hvbGQgZm9yIGdlc3R1cmUgYWZ0ZXIgZmFzdCB0eXBpbmcgKG1zZWMpIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19nZXN0dXJlX3N0YXRpY190aW1lX3RocmVzaG9sZF9hZnRlcl9mYXN0X3R5cGluZyI+NTAwPC9pbnRlZ2VyPgogICAgIDwhLS0gU3RhdGljIHRocmVzaG9sZCBmb3Igc3RhcnRpbmcgZ2VzdHVyZSBkZXRlY3Rpb24gKGtleVdpZHRoJS9zZWMpIC0tPgpAQCAtMTExLDE1ICsxMTAsMTMgQEAKICAgICAgICAgPCEtLSBBZ2dyZXNzaXZlIC0tPgogICAgICAgICA8aXRlbT4wLjA2NzwvaXRlbT4KICAgICAgICAgPCEtLSBWZXJ5IEFnZ3Jlc3NpdmUgOiBTdWdnZXN0aW9uIHdob3NlIG5vcm1hbGl6ZWQgc2NvcmUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKLSAgICAgICAgICAgICB3aWxsIGJlIHN1YmplY3QgdG8gYXV0by1jb3JyZWN0aW9uLiAtLT4KLSAgICAgICAgPGl0ZW0+MDwvaXRlbT4KKyAgICAgICAgICAgICB3aWxsIGJlIHN1YmplY3QgdG8gYXV0by1jb3JyZWN0aW9uLiAiZmxvYXROZWdhdGl2ZUluZmluaXR5IiBpcyBhIHNwZWNpYWwgbWFya2VyCisgICAgICAgICAgICAgc3RyaW5nIGZvciBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSAtLT4KKyAgICAgICAgPGl0ZW0+ZmxvYXROZWdhdGl2ZUluZmluaXR5PC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogICAgIDwhLS0gVGhyZXNob2xkIG9mIHRoZSBub3JtYWxpemVkIHNjb3JlIG9mIHRoZSBiZXN0IHN1Z2dlc3Rpb24gZm9yIHRoZSBzcGVsbCBjaGVja2VyIHRvIGRlY2xhcmUKICAgICAgICAgIGEgd29yZCB0byBiZSAicmVjb21tZW5kZWQiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic3BlbGxjaGVja2VyX3JlY29tbWVuZGVkX3RocmVzaG9sZF92YWx1ZSIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+MC4xMTwvc3RyaW5nPgotICAgIDwhLS0gVGhyZXNob2xkIG9mIHRoZSBub3JtYWxpemVkIHNjb3JlIG9mIGFueSBkaWN0aW9uYXJ5IGxvb2t1cCB0byBiZSBvZmZlcmVkIGFzIGEgc3VnZ2VzdGlvbgotICAgICAgICAgYnkgdGhlIHNwZWxsIGNoZWNrZXIgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzcGVsbGNoZWNrZXJfc3VnZ2VzdGlvbl90aHJlc2hvbGRfdmFsdWUiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjAuMDM8L3N0cmluZz4KICAgICA8IS0tICBTY3JlZW4gbWV0cmljcyBmb3IgbG9nZ2luZy4KICAgICAgICAgICAgIDAgPSAibWRwaSBwaG9uZSBzY3JlZW4iCiAgICAgICAgICAgICAxID0gImhkcGkgcGhvbmUgc2NyZWVuIgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAppbmRleCBlOWIzNGFhLi45OGFlNzZjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMTAwLDE0ICsxMDAsMjIgQEAKICAgICA8aW50ZWdlciBuYW1lPSJzdWdnZXN0aW9uc19jb3VudF9pbl9zdHJpcCI+MzwvaW50ZWdlcj4KICAgICA8ZnJhY3Rpb24gbmFtZT0iY2VudGVyX3N1Z2dlc3Rpb25fcGVyY2VudGlsZSI+MzYlPC9mcmFjdGlvbj4KIAotICAgIDwhLS0gR2VzdHVyZSBwcmV2aWV3IHRyYWlsIHBhcmFtZXRlcnMgLS0+Ci0gICAgPGRpbWVuIG5hbWU9Imdlc3R1cmVfcHJldmlld190cmFpbF9zdGFydF93aWR0aCI+MTAuMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV9wcmV2aWV3X3RyYWlsX2VuZF93aWR0aCI+Mi41ZHA8L2RpbWVuPgorICAgIDwhLS0gR2VzdHVyZSB0cmFpbCBwYXJhbWV0ZXJzIC0tPgorICAgIDwhLS0gTWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGdlc3R1cmUgdHJhaWwgc2FtcGxpbmcgcG9pbnRzLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV90cmFpbF9taW5fc2FtcGxpbmdfZGlzdGFuY2UiPjkuNmRwPC9kaW1lbj4KKyAgICA8IS0tIE1heGltdW0gYW5ndWxhciB0aHJlc2hvbGQgYmV0d2VlbiBnZXN0dXJlIHRyYWlscyBpbnRlcnBvbGF0aW9uIHNlZ21lbnRzIGluIGRlZ3JlZS4gLS0+CisgICAgPGludGVnZXIgbmFtZT0iZ2VzdHVyZV90cmFpbF9tYXhfaW50ZXJwb2xhdGlvbl9hbmd1bGFyX3RocmVzaG9sZCI+MTU8L2ludGVnZXI+CisgICAgPCEtLSBNYXhpbXVtIGRpc3RhbmNlIHRocmVzaG9sZCBiZXR3ZWVuIGdlc3R1cmUgdHJhaWxzIGludGVycG9sYXRpb24gc2VnbWVudHMuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJnZXN0dXJlX3RyYWlsX21heF9pbnRlcnBvbGF0aW9uX2Rpc3RhbmNlX3RocmVzaG9sZCI+MTYuMGRwPC9kaW1lbj4KKyAgICA8IS0tIE1heGltdW0gbnVtYmVyIG9mIGdlc3R1cmUgdHJhaWwgaW50ZXJwb2xhdGlvbiBzZWdtZW50cy4gLS0+CisgICAgPGludGVnZXIgbmFtZT0iZ2VzdHVyZV90cmFpbF9tYXhfaW50ZXJwb2xhdGlvbl9zZWdtZW50cyI+NjwvaW50ZWdlcj4KKyAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV90cmFpbF9zdGFydF93aWR0aCI+MTAuMGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV90cmFpbF9lbmRfd2lkdGgiPjIuNWRwPC9kaW1lbj4KICAgICA8IS0tIFBlcmNlbnRhZ2VzIG9mIGdlc3R1cmUgcHJldmlldyB0YXJpbCBib2R5IGFuZCBzaGFkb3csIGluIHByb3BvcnRpb24gdG8gdGhlIHRyYWlsIHdpZHRoLgogICAgICAgICAgQSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGUgc2hhZG93IHJhdGlvIGRpc2FibGVzIGRyYXdpbmcgc2hhZG93LiAtLT4KICAgICA8IS0tIFRPRE86IE1heSB1c2UgdGhlIHNoYWRvdyB0byBhbGxldmlhdGUgcnVnZ2VkIHRyYWlsIGRyYXdpbmcuIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Imdlc3R1cmVfcHJldmlld190cmFpbF9ib2R5X3JhdGlvIj4xMDA8L2ludGVnZXI+Ci0gICAgPGludGVnZXIgbmFtZT0iZ2VzdHVyZV9wcmV2aWV3X3RyYWlsX3NoYWRvd19yYXRpbyI+LTE8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0iZ2VzdHVyZV90cmFpbF9ib2R5X3JhdGlvIj4xMDA8L2ludGVnZXI+CisgICAgPGludGVnZXIgbmFtZT0iZ2VzdHVyZV90cmFpbF9zaGFkb3dfcmF0aW8iPi0xPC9pbnRlZ2VyPgogICAgIDwhLS0gR2VzdHVyZSBmbG9hdGluZyBwcmV2aWV3IHRleHQgcGFyYW1ldGVycyAtLT4KICAgICA8ZGltZW4gbmFtZT0iZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3RleHRfc2l6ZSI+MjRkcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9Imdlc3R1cmVfZmxvYXRpbmdfcHJldmlld190ZXh0X29mZnNldCI+NzNkcDwvZGltZW4+CkBAIC0xMTcsNCArMTI1LDYgQEAKIAogICAgIDwhLS0gSW5zZXQgdXNlZCBpbiBBY2Nlc3NpYmlsaXR5IG1vZGUgdG8gYXZvaWQgYWNjaWRlbnRhbCBrZXkgcHJlc3NlcyB3aGVuIGEgZmluZ2VyIHNsaWRlcyBvZmYgdGhlIHNjcmVlbi4gLS0+CiAgICAgPGRpbWVuIG5hbWU9ImFjY2Vzc2liaWxpdHlfZWRnZV9zbG9wIj44ZHA8L2RpbWVuPgorCisgICAgPGludGVnZXIgbmFtZT0idXNlcl9kaWN0aW9uYXJ5X21heF93b3JkX2xlbmd0aCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+NDg8L2ludGVnZXI+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy9rZXlib2FyZC1oZWlnaHRzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy9rZXlib2FyZC1oZWlnaHRzLnhtbAppbmRleCA0MThkM2U1Li5jNjUxYTg5IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMva2V5Ym9hcmQtaGVpZ2h0cy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzL2tleWJvYXJkLWhlaWdodHMueG1sCkBAIC0xOSwyMSArMTksMjEgQEAKIC0tPgogCiA8cmVzb3VyY2VzPgotICAgIDwhLS0gQnVpbGQuSEFSRFdBUkUsa2V5Ym9hcmRfaGVpZ2h0X2luX2RwIC0tPgorICAgIDwhLS0gQnVpbGQgY29uZGl0aW9uLGtleWJvYXJkX2hlaWdodF9pbl9kcCAtLT4KICAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImtleWJvYXJkX2hlaWdodHMiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPgogICAgIDwhLS0gUHJlZmVyYWJsZSBrZXlib2FyZCBoZWlnaHQgaW4gYWJzb2x1dGUgc2NhbGU6IDEuMjg1aW4gLS0+CiAgICAgICAgIDwhLS0gRHJvaWQgLS0+Ci0gICAgICAgIDxpdGVtPnNob2xlcywyMjcuMDE2NzwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SEFSRFdBUkU9c2hvbGVzLDIyNy4wMTY3PC9pdGVtPgogICAgICAgICA8IS0tIE5leHVzIE9uZSAtLT4KLSAgICAgICAgPGl0ZW0+bWFoaW1haGksMjE3LjU5MzI8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPW1haGltYWhpLDIxNy41OTMyPC9pdGVtPgogICAgICAgICA8IS0tIE5leHVzIFMgLS0+Ci0gICAgICAgIDxpdGVtPmhlcnJpbmcsMjAwLjg1NTQ8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPWhlcnJpbmcsMjAwLjg1NTQ8L2l0ZW0+CiAgICAgICAgIDwhLS0gR2FsYXh5IE5leHVzIC0tPgotICAgICAgICA8aXRlbT50dW5hLDIwMi41ODY5PC9pdGVtPgorICAgICAgICA8aXRlbT5IQVJEV0FSRT10dW5hLDIwMi41ODY5PC9pdGVtPgogICAgIDwhLS0gUHJlZmVyYWJsZSBrZXlib2FyZCBoZWlnaHQgaW4gYWJzb2x1dGUgc2NhbGU6IDQ4LjBtbSAtLT4KICAgICAgICAgPCEtLSBYb29tIC0tPgotICAgICAgICA8aXRlbT5zdGluZ3JheSwyODMuMTMzNzwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SEFSRFdBUkU9c3RpbmdyYXksMjgzLjEzMzc8L2l0ZW0+CiAgICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciB1bmtub3duIGRldmljZTogZW1wdHkgc3RyaW5nIC0tPgotICAgICAgICA8aXRlbT5ERUZBVUxULDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+LDwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL2tleXByZXNzLXZpYnJhdGlvbi1kdXJhdGlvbnMueG1sIGIvamF2YS9yZXMvdmFsdWVzL2tleXByZXNzLXZpYnJhdGlvbi1kdXJhdGlvbnMueG1sCmluZGV4IDEwNDAwYmUuLjljZTUwNTEgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9rZXlwcmVzcy12aWJyYXRpb24tZHVyYXRpb25zLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMva2V5cHJlc3MtdmlicmF0aW9uLWR1cmF0aW9ucy54bWwKQEAgLTE4LDE3ICsxOCwzNiBAQAogKi8KIC0tPgogPHJlc291cmNlcz4KLSAgICA8IS0tIEJ1aWxkLkhBUkRXQVJFLGR1cmF0aW9uX2luX21pbGxpc2Vjb25kcyAtLT4KKyAgICA8IS0tIEJ1aWxkIGNvbmRpdGlvbixkdXJhdGlvbl9pbl9taWxsaXNlY29uZHMgLS0+CiAgICAgPHN0cmluZy1hcnJheSBuYW1lPSJrZXlwcmVzc192aWJyYXRpb25fZHVyYXRpb25zIiB0cmFuc2xhdGFibGU9ImZhbHNlIj4KICAgICAgICAgPCEtLSBOZXh1cyBTIC0tPgotICAgICAgICA8aXRlbT5oZXJyaW5nLDU8L2l0ZW0+CisgICAgICAgIDxpdGVtPk1PREVMPU5leHVzIFM6QlJBTkQ9Z29vZ2xlLDU8L2l0ZW0+CiAgICAgICAgIDwhLS0gR2FsYXh5IE5leHVzIC0tPgotICAgICAgICA8aXRlbT50dW5hLDU8L2l0ZW0+CisgICAgICAgIDxpdGVtPk1PREVMPUdhbGF4eSBOZXh1czpCUkFORD1nb29nbGUsNTwvaXRlbT4KICAgICAgICAgPCEtLSBOZXh1cyA0IC0tPgotICAgICAgICA8aXRlbT5tYWtvLDU8L2l0ZW0+CisgICAgICAgIDxpdGVtPk1PREVMPU5leHVzIDQ6QlJBTkQ9Z29vZ2xlLDg8L2l0ZW0+CiAgICAgICAgIDwhLS0gTmV4dXMgMTAgLS0+Ci0gICAgICAgIDxpdGVtPm1hbnRhLDE2PC9pdGVtPgorICAgICAgICA8aXRlbT5NT0RFTD1OZXh1cyAxMDpCUkFORD1nb29nbGUsMTY8L2l0ZW0+CisgICAgICAgIDwhLS0gU2Ftc3VuZyBHYWxheHkgU0lJIC0tPgorICAgICAgICA8aXRlbT5NT0RFTD1HVC1JKDkxMDBbR01QVF0/fDkxMDh8OTIxMFQ/KTpNQU5VRkFDVFVSRVI9c2Ftc3VuZyw4PC9pdGVtPgorICAgICAgICA8aXRlbT5NT0RFTD1TR0gtKEk5WzI3XTdSP3xJOTI3fFQ5ODlEPyk6TUFOVUZBQ1RVUkVSPXNhbXN1bmcsODwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TU9ERUw9U0hXLU0yNTBbS0xTXT98U1BILUQ3MTB8U0NILVI3NjA6TUFOVUZBQ1RVUkVSPXNhbXN1bmcsODwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TU9ERUw9SVNXMTFTQ3xTQy0wMkM6TUFOVUZBQ1RVUkVSPXNhbXN1bmcsODwvaXRlbT4KKyAgICAgICAgPCEtLSBTYW1zdW5nIEdhbGF4eSBTSUlJIC0tPgorICAgICAgICA8aXRlbT5NT0RFTD0oU0FNU1VORy0pP0dULUkoOTMwWzA1XVtOVF0/fDkzMDgpOk1BTlVGQUNUVVJFUj1zYW1zdW5nLDg8L2l0ZW0+CisgICAgICAgIDxpdGVtPk1PREVMPShTQU1TVU5HLSk/U0dILShUOTk5W1ZdP3xJNzQ3W01dP3xOMDY0fE4wMzUpOk1BTlVGQUNUVVJFUj1zYW1zdW5nLDg8L2l0ZW0+CisgICAgICAgIDxpdGVtPk1PREVMPShTQU1TVU5HLSk/U0NILShKMDIxfFI1MzB8STUzNXxJOTM5KTpNQU5VRkFDVFVSRVI9c2Ftc3VuZyw4PC9pdGVtPgorICAgICAgICA8aXRlbT5NT0RFTD0oU0FNU1VORy0pPyhTQ0wyMXxTQy0wNkR8U0MtMDNFXSk6TUFOVUZBQ1RVUkVSPXNhbXN1bmcsODwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TU9ERUw9KFNBTVNVTkctKT8oU0hWLTIxMFtLTFNdP3xTUEgtTDcxMCk6TUFOVUZBQ1RVUkVSPXNhbXN1bmcsODwvaXRlbT4KKyAgICAgICAgPCEtLSBMRyBPcHRpbXVzIEcgLS0+CisgICAgICAgIDxpdGVtPk1PREVMPUxHLUU5N1swMTNdfExTOTcwfEwtMDFFOk1BTlVGQUNUVVJFUj1MR0UsMTU8L2l0ZW0+CisgICAgICAgIDwhLS0gSFRDIE9uZSBYIC0tPgorICAgICAgICA8aXRlbT5NT0RFTD1IVEMgT25lIFg6TUFOVUZBQ1RVUkVSPUhUQywyMDwvaXRlbT4KKyAgICAgICAgPCEtLSBNb3Rvcm9sYSBSYXpvciBNIC0tPgorICAgICAgICA8aXRlbT5NT0RFTD1YVDkwNzpNQU5VRkFDVFVSRVI9bW90b3JvbGEsMzA8L2l0ZW0+CisgICAgICAgIDwhLS0gU29ueSBYcGVyaWEgWiAtLT4KKyAgICAgICAgPGl0ZW0+TU9ERUw9QzY2MDM6TUFOVUZBQ1RVUkVSPVNvbnksMzU8L2l0ZW0+CiAgICAgICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgdW5rbm93biBkZXZpY2UgLS0+Ci0gICAgICAgIDxpdGVtPkRFRkFVTFQsMjA8L2l0ZW0+CisgICAgICAgIDxpdGVtPiwyMDwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL2tleXByZXNzLXZvbHVtZXMueG1sIGIvamF2YS9yZXMvdmFsdWVzL2tleXByZXNzLXZvbHVtZXMueG1sCmluZGV4IDA0N2ZlMGMuLmEwOTZjMzQgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9rZXlwcmVzcy12b2x1bWVzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMva2V5cHJlc3Mtdm9sdW1lcy54bWwKQEAgLTE4LDE1ICsxOCwxNSBAQAogKi8KIC0tPgogPHJlc291cmNlcz4KKyAgICA8IS0tIEJ1aWxkIGNvbmRpdGlvbix2b2x1bWUgLS0+CiAgICAgPHN0cmluZy1hcnJheSBuYW1lPSJrZXlwcmVzc192b2x1bWVzIiB0cmFuc2xhdGFibGU9ImZhbHNlIj4KLSAgICAgICAgPCEtLSBCdWlsZC5IQVJEV0FSRSx2b2x1bWUgLS0+Ci0gICAgICAgIDxpdGVtPmhlcnJpbmcsMC41ZjwvaXRlbT4KLSAgICAgICAgPGl0ZW0+dHVuYSwwLjVmPC9pdGVtPgotICAgICAgICA8aXRlbT5zdGluZ3JheSwwLjRmPC9pdGVtPgotICAgICAgICA8aXRlbT5ncm91cGVyLDAuM2Y8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPm1ha28sMC4zZjwvaXRlbT4KLSAgICAgICAgPGl0ZW0+bWFudGEsMC4yZjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SEFSRFdBUkU9aGVycmluZywwLjVmPC9pdGVtPgorICAgICAgICA8aXRlbT5IQVJEV0FSRT10dW5hLDAuNWY8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPXN0aW5ncmF5LDAuNGY8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPWdyb3VwZXIsMC4zZjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SEFSRFdBUkU9bWFrbywwLjNmPC9pdGVtPgorICAgICAgICA8aXRlbT5IQVJEV0FSRT1tYW50YSwwLjJmPC9pdGVtPgogICAgICAgICA8IS0tIERlZmF1bHQgdmFsdWUgZm9yIHVua25vd24gZGV2aWNlIC0tPgotICAgICAgICA8aXRlbT5ERUZBVUxULDAuMmY8L2l0ZW0+CisgICAgICAgIDxpdGVtPiwwLjJmPC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvcGhhbnRvbS1zdWRkZW4tbW92ZS1ldmVudC1kZXZpY2UtbGlzdC54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvcGhhbnRvbS1zdWRkZW4tbW92ZS1ldmVudC1kZXZpY2UtbGlzdC54bWwKaW5kZXggMjJmNTEwMi4uNTMwMDJiMyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzL3BoYW50b20tc3VkZGVuLW1vdmUtZXZlbnQtZGV2aWNlLWxpc3QueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9waGFudG9tLXN1ZGRlbi1tb3ZlLWV2ZW50LWRldmljZS1saXN0LnhtbApAQCAtMTksMTEgKzE5LDExIEBACiAtLT4KIDxyZXNvdXJjZXM+CiAgICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaGFudG9tX3N1ZGRlbl9tb3ZlX2V2ZW50X2RldmljZV9saXN0IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4KLSAgICAgICAgPCEtLSAiQnVpbGQuSEFSRFdBUkUsdHJ1ZSIgdGhhdCBuZWVkcyAicGhhbnRvbSBzdWRkZW4gbW92ZSBldmVudCIgaGFjay4KKyAgICAgICAgPCEtLSAiQnVpbGQgY29uZGl0aW9uLHRydWUiIHRoYXQgbmVlZHMgInBoYW50b20gc3VkZGVuIG1vdmUgZXZlbnQiIGhhY2suCiAgICAgICAgICAgICAgU2VlIHtAbGluayBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5Qb2ludGVyVHJhY2tlcn0uIC0tPgogICAgICAgICA8IS0tIFhvb20gLS0+Ci0gICAgICAgIDxpdGVtPnN0aW5ncmF5LHRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtPkhBUkRXQVJFPXN0aW5ncmF5LHRydWU8L2l0ZW0+CiAgICAgICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgdW5rbm93biBkZXZpY2UgLS0+Ci0gICAgICAgIDxpdGVtPkRFRkFVTFQsZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtPixmYWxzZTwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL3NldHVwLXN0eWxlcy1jb21tb24ueG1sIGIvamF2YS9yZXMvdmFsdWVzL3NldHVwLXN0eWxlcy1jb21tb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NmRlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMvc2V0dXAtc3R5bGVzLWNvbW1vbi54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxzdHlsZSBuYW1lPSJzZXR1cFRpdGxlU3R5bGVDb21tb24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3NldHVwX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+QGRpbWVuL3NldHVwX3RpdGxlX3RleHRfc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBXZWxjb21lRGVzY3JpdHBpb25TdHlsZSIgcGFyZW50PSJzZXR1cFRpdGxlU3R5bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj5AZGltZW4vc2V0dXBfd2VsY29tZV9kZXNjcmlwdGlvbl90ZXh0X3NpemU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwSW5kaWNhdG9yU3R5bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9zZXR1cF9zdGVwX3RyaWFuZ2xlX2luZGljYXRvcl9oZWlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwQnVsbGV0U3R5bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3NldHVwX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+QGRpbWVuL3NldHVwX3N0ZXBfYnVsbGV0X3RleHRfc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjBkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4xLjA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl9ob3Jpem9udGFsPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9InNldHVwU3RlcEJhc2VTdHlsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivc2V0dXBfdGV4dF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBjb2xvci9zZXR1cF9zdGVwX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij5AZGltZW4vc2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij5AZGltZW4vc2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmc8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwVGl0bGVTdHlsZSIgcGFyZW50PSJzZXR1cFN0ZXBCYXNlU3R5bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj5AZGltZW4vc2V0dXBfc3RlcF90aXRsZV90ZXh0X3NpemU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwSW5zdHJ1Y3Rpb25TdHlsZSIgcGFyZW50PSJzZXR1cFN0ZXBCYXNlU3R5bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj5AZGltZW4vc2V0dXBfc3RlcF9pbnN0cnVjdGlvbl90ZXh0X3NpemU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwU3RhcnRJbmRpY2F0b3JTdHlsZSI+CisgICAgICAgIDwhLS0gVGhlIHRyaWFuZ2xlIGluZGljYXRvciBoZXJlIGlzIHBsYWNlZCBzaWRld2F5cy4gLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vc2V0dXBfc3RlcF90cmlhbmdsZV9pbmRpY2F0b3JfaGVpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9zZXR1cF9zdGVwX2FjdGlvbl9oZWlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwQWN0aW9uTGFiZWxTdHlsZUNvbW1vbiIgcGFyZW50PSJzZXR1cFN0ZXBCYXNlU3R5bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3NldHVwX3N0ZXBfYWN0aW9uX2NvbG9yPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBkcmF3YWJsZS9zZXR1cF9zdGVwX2FjdGlvbl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9zZXR1cF9zdGVwX2FjdGlvbl9oZWlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPkBkaW1lbi9zZXR1cF9zdGVwX2hvcml6b250YWxfcGFkZGluZ19oYWxmPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj5AZGltZW4vc2V0dXBfc3RlcF9hY3Rpb25fdGV4dF9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyYXdhYmxlUGFkZGluZyI+QGRpbWVuL3NldHVwX3N0ZXBfaG9yaXpvbnRhbF9wYWRkaW5nX2hhbGY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX3ZlcnRpY2FsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGUiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0ic2V0dXBTdGVwU3RhcnRBY3Rpb25MYWJlbFN0eWxlQ29tbW9uIiBwYXJlbnQ9InNldHVwU3RlcEFjdGlvbkxhYmVsU3R5bGVDb21tb24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij5AZGltZW4vc2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij5AZGltZW4vc2V0dXBfc3RlcF9ob3Jpem9udGFsX3BhZGRpbmc8L2l0ZW0+CisgICAgPC9zdHlsZT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL3NldHVwLXN0eWxlcy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvc2V0dXAtc3R5bGVzLnhtbAppbmRleCBjZmM2ODlhLi4xZmZlOGNhIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMvc2V0dXAtc3R5bGVzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMvc2V0dXAtc3R5bGVzLnhtbApAQCAtMTUsMzEgKzE1LDYgQEAKIC0tPgogCiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPHN0eWxlIG5hbWU9InNldHVwVGl0bGVTdHlsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivc2V0dXBfdGV4dF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj5AZGltZW4vc2V0dXBfdGl0bGVfdGV4dF9zaXplPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0gICAgPHN0eWxlIG5hbWU9InNldHVwU3RlcEJ1bGxldFN0eWxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci9zZXR1cF90ZXh0X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjIyc3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4wZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MS4wPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotICAgIDxzdHlsZSBuYW1lPSJzZXR1cFN0ZXBUaXRsZVN0eWxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AY29sb3Ivc2V0dXBfc3RlcF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3NldHVwX3RleHRfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotICAgIDxzdHlsZSBuYW1lPSJzZXR1cFN0ZXBJbnN0cnVjdGlvblN0eWxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AY29sb3Ivc2V0dXBfc3RlcF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3NldHVwX3RleHRfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotICAgIDxzdHlsZSBuYW1lPSJzZXR1cFN0ZXBBY3Rpb25MYWJlbFN0eWxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AY29sb3Ivc2V0dXBfc3RlcF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3NldHVwX3RleHRfYWN0aW9uPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgotICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9InNldHVwVGl0bGVTdHlsZSIgcGFyZW50PSJzZXR1cFRpdGxlU3R5bGVDb21tb24iIC8+CisgICAgPHN0eWxlIG5hbWU9InNldHVwU3RlcEFjdGlvbkxhYmVsU3R5bGUiIHBhcmVudD0ic2V0dXBTdGVwQWN0aW9uTGFiZWxTdHlsZUNvbW1vbiIgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MtYXBwbmFtZS54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy1hcHBuYW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ4YzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MtYXBwbmFtZS54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIEFwcGxpY2F0aW9uIG5hbWUgZm9yIG9wZW5zb3VyY2UgQW5kcm9pZCBrZXlib2FyZC4gQU9TUChBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QpIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4KKyAgICAgICAgIFRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlIGNvcGllZCBmcm9tIG1zZ2lkPSI4MjUwOTkyNjEzNjE2NzkyMzIxIiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImVuZ2xpc2hfaW1lX25hbWUiPkFuZHJvaWQgS2V5Ym9hcmQgKEFPU1ApPC9zdHJpbmc+CisKKyAgICA8IS0tIE5hbWUgb2YgQW5kcm9pZCBzcGVsbCBjaGVja2VyIHNlcnZpY2UuIEFPU1AoQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0KSBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuCisgICAgICAgICBUaGlzIHJlc291cmNlIHNob3VsZCBiZSBjb3BpZWQgZnJvbSBtc2dpZD0iNTExOTUwNDc3MTk5OTQ4MDQ4IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNwZWxsX2NoZWNrZXJfc2VydmljZV9uYW1lIj5BbmRyb2lkIFNwZWxsIENoZWNrZXIgKEFPU1ApPC9zdHJpbmc+CisKKyAgICA8IS0tIFRpdGxlIGZvciBBbmRyb2lkIEtleWJvYXJkIHNldHRpbmdzIHNjcmVlbi4gQU9TUChBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QpIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4KKyAgICAgICAgIFRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlIGNvcGllZCBmcm9tIG1zZ2lkPSI0MjM2MTU4NzcxNzQ4NTAyNjciIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZW5nbGlzaF9pbWVfc2V0dGluZ3MiPkFuZHJvaWQgS2V5Ym9hcmQgU2V0dGluZ3MgKEFPU1ApPC9zdHJpbmc+CisKKyAgICA8IS0tIFRpdGxlIGZvciB0aGUgc3BlbGwgY2hlY2tpbmcgc2VydmljZSBzZXR0aW5ncyBzY3JlZW4uIEFPU1AoQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0KSBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuCisgICAgICAgICBUaGlzIHJlc291cmNlIHNob3VsZCBiZSBjb3BpZWQgZnJvbSBtc2dpZD0iMjk3MDUzNTg5NDMyNzI4ODQyMSIgLS0+CisgICAgPHN0cmluZyBuYW1lPSJhbmRyb2lkX3NwZWxsX2NoZWNrZXJfc2V0dGluZ3MiPkFuZHJvaWQgU3BlbGwgQ2hlY2tlciBTZXR0aW5ncyAoQU9TUCk8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IGY1ZTI0NDEuLjhiMzExODEgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE4LDE4ICsxOCw2IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8IS0tIEFwcGxpY2F0aW9uIG5hbWUgZm9yIG9wZW5zb3VyY2UgQW5kcm9pZCBrZXlib2FyZC4gQU9TUChBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QpIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJhb3NwX2FuZHJvaWRfa2V5Ym9hcmRfaW1lX25hbWUiPkFuZHJvaWQgS2V5Ym9hcmQgKEFPU1ApPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRpdGxlIGZvciBBbmRyb2lkIEtleWJvYXJkIHNldHRpbmdzIHNjcmVlbi4gQU9TUChBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QpIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJhb3NwX2FuZHJvaWRfa2V5Ym9hcmRfaW1lX3NldHRpbmdzIj5BbmRyb2lkIEtleWJvYXJkIFNldHRpbmdzIChBT1NQKTwvc3RyaW5nPgotCi0gICAgPCEtLSBOYW1lIG9mIEFuZHJvaWQgc3BlbGwgY2hlY2tlciBzZXJ2aWNlLiBBT1NQKEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCkgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImFvc3Bfc3BlbGxfY2hlY2tlcl9zZXJ2aWNlX25hbWUiPkFuZHJvaWQgU3BlbGwgQ2hlY2tlciAoQU9TUCk8L3N0cmluZz4KLQotICAgIDwhLS0gVGl0bGUgZm9yIHRoZSBzcGVsbCBjaGVja2luZyBzZXJ2aWNlIHNldHRpbmdzIHNjcmVlbi4gQU9TUChBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QpIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJhb3NwX2FuZHJvaWRfc3BlbGxfY2hlY2tlcl9zZXJ2aWNlX3NldHRpbmdzIj5BbmRyb2lkIFNwZWxsIENoZWNrZXIgU2V0dGluZ3MgKEFPU1ApPC9zdHJpbmc+Ci0KICAgICA8IS0tIFRpdGxlIGZvciBMYXRpbiBrZXlib2FyZCBpbnB1dCBvcHRpb25zIGRpYWxvZyBbQ0hBUiBMSU1JVD0yNV0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJlbmdsaXNoX2ltZV9pbnB1dF9vcHRpb25zIj5JbnB1dCBvcHRpb25zPC9zdHJpbmc+CiAKQEAgLTEwNyw2ICs5NSw5IEBACiAgICAgPCEtLSBEZXNjcmlwdGlvbiBmb3Igb3B0aW9uIHRvIGVuYWJsZSBhdXRvIGNhcGl0YWxpemF0aW9uIG9mIHNlbnRlbmNlcyAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9fY2FwX3N1bW1hcnkiPkNhcGl0YWxpemUgdGhlIGZpcnN0IHdvcmQgb2YgZWFjaCBzZW50ZW5jZTwvc3RyaW5nPgogCisgICAgPCEtLSBPcHRpb24gdG8gZWRpdCBwZXJzb25hbCBkaWN0aW9uYXJ5LiBbQ0hBUl9MSU1JVD0zMF0tLT4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRfcGVyc29uYWxfZGljdGlvbmFyeSI+UGVyc29uYWwgZGljdGlvbmFyeTwvc3RyaW5nPgorCiAgICAgPCEtLSBPcHRpb24gdG8gY29uZmlndXJlIGRpY3Rpb25hcmllcyAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ3VyZV9kaWN0aW9uYXJpZXNfdGl0bGUiPkFkZC1vbiBkaWN0aW9uYXJpZXM8L3N0cmluZz4KICAgICA8IS0tIE5hbWUgb2YgdGhlIG1haW4gZGljdGlvbmFyeSwgYXMgb3Bwb3NlZCB0byBhdXhpbGlhcnkgZGljdGlvbmFyaWVzIChtZWRpY2FsL2VudGVydGFpbm1lbnQvc3BvcnRzLi4uKSAtLT4KQEAgLTEyMCw2ICsxMTEsMTEgQEAKICAgICA8c3RyaW5nIG5hbWU9InByZWZzX3N1Z2dlc3Rpb25fdmlzaWJpbGl0eV9zaG93X29ubHlfcG9ydHJhaXRfbmFtZSI+U2hvdyBpbiBwb3J0cmFpdCBtb2RlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwcmVmc19zdWdnZXN0aW9uX3Zpc2liaWxpdHlfaGlkZV9uYW1lIj5BbHdheXMgaGlkZTwvc3RyaW5nPgogCisgICAgPCEtLSBPcHRpb24gdG8gYmxvY2sgcG90ZW50aWFsbHkgb2ZmZW5zaXZlIHdvcmRzIHRvIGJlIHNob3duIFtDSEFSX0xJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InByZWZzX2Jsb2NrX3BvdGVudGlhbGx5X29mZmVuc2l2ZV90aXRsZSI+QmxvY2sgb2ZmZW5zaXZlIHdvcmRzPC9zdHJpbmc+CisgICAgPCEtLSBTdW1tYXJ5IGZvciBvcHRpb24gdG8gYmxvY2sgcG90ZW50aWFsbHkgb2ZmZW5zaXZlIHdvcmRzIHRvIGJlIHNob3duIFtDSEFSX0xJTUlUPTgwICh0d28gbGluZXMpIG9yIDQwIChmaXRzIG9uIG9uZSBsaW5lLCBwcmVmZXJhYmxlKV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwcmVmc19ibG9ja19wb3RlbnRpYWxseV9vZmZlbnNpdmVfc3VtbWFyeSI+RG8gbm90IHN1Z2dlc3QgcG90ZW50aWFsbHkgb2ZmZW5zaXZlIHdvcmRzPC9zdHJpbmc+CisKICAgICA8IS0tIE9wdGlvbiB0byBkZWNpZGUgdGhlIGF1dG8gY29ycmVjdGlvbiB0aHJlc2hvbGQgc2NvcmUgLS0+CiAgICAgPCEtLSBPcHRpb24gdG8gZW5hYmxlIGF1dG8gY29ycmVjdGlvbiBbQ0hBUiBMSU1JVD0yMF0tLT4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9fY29ycmVjdGlvbiI+QXV0by1jb3JyZWN0aW9uPC9zdHJpbmc+CkBAIC00NDIsMzMgKzQzOCw0OCBAQAogICAgIDwhLS0gVGl0bGUgb2YgdGhlIGJ1dHRvbiB0byByZXZlcnQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGRldmljZSBpbiB0aGUgc2V0dGluZ3MgZGlhbG9nIFtDSEFSIExJTUlUPTE1XSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0Ij5EZWZhdWx0PC9zdHJpbmc+CiAKLSAgICA8IS0tIFRPRE86IFJlbW92ZSB0cmFuc2xhdGFibGU9ImZhbHNlIiBvbmNlIHdvcmRpbmdzIGFyZSBmaW5hbGl6ZWQuIC0tPgorICAgIDwhLS0gVGl0bGUgb2YgdGhlIHNldHVwIHdpemFyZCB3ZWxjb21lIHNjcmVlbi4gW0NIQVIgTElNVD00MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF93ZWxjb21lX3RpdGxlIj4iV2VsY29tZSB0byA8eGxpZmY6ZyBpZD0iYXBwbGljYXRpb25fbmFtZSI+JXM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gQWRkaXRpb25hbCB0aXRsZSBvZiB0aGUgc2V0dXAgd2l6YXJkIHdlbGNvbWUgc2NyZWVuLCBqdXN0IGJlbG93IHRoZSBzZXR1cF93ZWxjb21lX3RpdGxlLiBbQ0hBUl9MSU1JVD02NF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF93ZWxjb21lX2FkZGl0aW9uYWxfZGVzY3JpcHRpb24iPndpdGggR2VzdHVyZSBUeXBpbmc8L3N0cmluZz4KKyAgICA8IS0tIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHRoYXQgc3RhcnRzIHRoZSBzZXR1cCB3aXphcmQuIFtDSEFSX0xJTUlUPTY0XSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0YXJ0X2FjdGlvbiI+R2V0IHN0YXJ0ZWQ8L3N0cmluZz4KKyAgICA8IS0tIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHRoYXQgbmF2aWdhdGVzIHRoZSB1c2VyIHRvIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIHNldHVwIHdpemFyZC4gW0NIQVJfTElNSVQ9NjRdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfbmV4dF9hY3Rpb24iPk5leHQgc3RlcDwvc3RyaW5nPgogICAgIDwhLS0gVGl0bGUgb2YgdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNVD00MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzZXR1cF90aXRsZSIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Ikluc3RhbGxpbmcgPHhsaWZmOmcgaWQ9ImFwcGxpY2F0aW9uX25hbWUiPiVzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0ZXBzX3RpdGxlIj4iU2V0dGluZyB1cCA8eGxpZmY6ZyBpZD0iYXBwbGljYXRpb25fbmFtZSI+JXM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDwhLS0gT3JkaW5hbCBudW1iZXIgb2YgdGhlIDFzdCBzdGVwIGluIHRoZSBzZXR1cCB3aXphcmQuIFtDSEFSIExJTUlUPTVdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfc3RlcDFfYnVsbGV0IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4xPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiB0aGUgMXN0IHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9NjRdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfc3RlcDFfdGl0bGUiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPiJFbmFibGUgPHhsaWZmOmcgaWQ9ImFwcGxpY2F0aW9uX25hbWUiPiVzPC94bGlmZjpnPiBpbiBzZXR0aW5ncy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBEZXRhaWxlZCBpbnN0cnVjdGlvbiBvZiB0aGUgMXN0IHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9ODBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfc3RlcDFfaW5zdHJ1Y3Rpb24iIHRyYW5zbGF0YWJsZT0iZmFsc2UiPiJGb3Igc2VjdXJpdHksIHBsZWFzZSBjaGVjayBcIjx4bGlmZjpnIGlkPSJhcHBsaWNhdGlvbl9uYW1lIj4lczwveGxpZmY6Zz5cIiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0ZXAxX3RpdGxlIj4iRW5hYmxlIDx4bGlmZjpnIGlkPSJhcHBsaWNhdGlvbl9uYW1lIj4lczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBEZXRhaWxlZCBpbnN0cnVjdGlvbiBvZiB0aGUgMXN0IHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9MTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0ZXAxX2luc3RydWN0aW9uIj4iUGxlYXNlIGNoZWNrIFwiPHhsaWZmOmcgaWQ9ImFwcGxpY2F0aW9uX25hbWUiPiVzPC94bGlmZjpnPlwiIGluIHlvdXIgTGFuZ3VhZ2UgJmFtcDsgaW5wdXQgc2V0dGluZ3MuIFRoaXMgd2lsbCBhdXRob3JpemUgaXQgdG8gcnVuIG9uIHlvdXIgZGV2aWNlLiI8L3N0cmluZz4KKyAgICA8IS0tIERldGFpbGVkIGluc3RydWN0aW9uIG9mIHRoZSBhbHJlYWR5IGZpbmlzaGVkIDFzdCBzdGVwIGluIHRoZSBzZXR1cCB3aXphcmQuIFtDSEFSIExJTUlUPTEyMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwMV9maW5pc2hlZF9pbnN0cnVjdGlvbiI+Ijx4bGlmZjpnIGlkPSJhcHBsaWNhdGlvbl9uYW1lIj4lczwveGxpZmY6Zz4gaXMgYWxyZWFkeSBlbmFibGVkIGluIHlvdXIgTGFuZ3VhZ2UgJmFtcDsgaW5wdXQgc2V0dGluZ3MsIHNvIHRoaXMgc3RlcCBpcyBkb25lLiBPbiB0byB0aGUgbmV4dCBvbmUhIjwvc3RyaW5nPgorICAgIDwhLS0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gdGhhdCB0cmlnZ2VycyB0aGUgTGFuZ3VhZ2UgJiBpbnB1dCBzZXR0aW5ncyBpbiBvcmRlciB0byBlbmFibGUgdGhlIGtleWJvYXJkLiBbQ0hBUl9MSU1JVD02NF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwMV9hY3Rpb24iPkVuYWJsZSBpbiBTZXR0aW5nczwvc3RyaW5nPgogICAgIDwhLS0gT3JkaW5hbCBudW1iZXIgb2YgdGhlIDJuZCBzdGVwIGluIHRoZSBzZXR1cCB3aXphcmQuIFtDSEFSIExJTUlUPTVdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfc3RlcDJfYnVsbGV0IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4yPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiB0aGUgMm5kIHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9NjRdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfc3RlcDJfdGl0bGUiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPiJTd2l0Y2ggdG8gPHhsaWZmOmcgaWQ9ImFwcGxpY2F0aW9uX25hbWUiPiVzPC94bGlmZjpnPi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBEZXRhaWxlZCBpbnN0cnVjdGlvbiBvZiB0aGUgMm5kIHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9ODBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfc3RlcDJfaW5zdHJ1Y3Rpb24iIHRyYW5zbGF0YWJsZT0iZmFsc2UiPiJOb3cgdGhhdCB5b3UndmUgZW5hYmxlZCA8eGxpZmY6ZyBpZD0iYXBwbGljYXRpb25fbmFtZSI+JXM8L3hsaWZmOmc+LCB5b3UgY2FuIHN3aXRjaCB0byBpdC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwMl90aXRsZSI+IlN3aXRjaCB0byA8eGxpZmY6ZyBpZD0iYXBwbGljYXRpb25fbmFtZSI+JXM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gRGV0YWlsZWQgaW5zdHJ1Y3Rpb24gb2YgdGhlIDJuZCBzdGVwIGluIHRoZSBzZXR1cCB3aXphcmQuIFtDSEFSIExJTUlUPTEyMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwMl9pbnN0cnVjdGlvbiI+Ik5leHQsIHNlbGVjdCBcIjx4bGlmZjpnIGlkPSJhcHBsaWNhdGlvbl9uYW1lIj4lczwveGxpZmY6Zz5cIiBhcyB5b3VyIGFjdGl2ZSB0ZXh0LWlucHV0IG1ldGhvZC4iPC9zdHJpbmc+CisgICAgPCEtLSBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiB0aGF0IHRyaWdnZXJzIHRoZSBjaG9vc2UgaW5wdXQgbWV0aG9kIGRpYWxvZyBpbiBvcmRlciB0byBzZWxlY3QgdGhlIGtleWJvYXJkLiBbQ0hBUl9MSU1JVD02NF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwMl9hY3Rpb24iPlN3aXRjaCBpbnB1dCBtZXRob2RzPC9zdHJpbmc+CiAgICAgPCEtLSBPcmRpbmFsIG51bWJlciBvZiB0aGUgM3JkIHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9NV0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwM19idWxsZXQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjM8L3N0cmluZz4KICAgICA8IS0tIFRpdGxlIG9mIHRoZSAzcmQgc3RlcCBpbiB0aGUgc2V0dXAgd2l6YXJkLiBbQ0hBUiBMSU1JVD02NF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwM190aXRsZSIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+IkNvbmdyYXR1bGF0aW9ucywgeW91J3JlIGFsbCBzZXQhIjwvc3RyaW5nPgotICAgIDwhLS0gRGV0YWlsZWQgaW5zdHJ1Y3Rpb24gb2YgdGhlIDNyZCBzdGVwIGluIHRoZSBzZXR1cCB3aXphcmQuIFtDSEFSIExJTUlUPTgwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0ZXAzX2luc3RydWN0aW9uIiB0cmFuc2xhdGFibGU9ImZhbHNlIj5Db25maWd1cmUgYWRkaXRpb25hbCBsYW5ndWFnZXM8L3N0cmluZz4KLSAgICA8IS0tIFRpdGxlIG9mIHRoZSBMYW5ndWFnZSAmIGlucHV0IHNldHRpbmdzLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIHdpdGggbXNnaWQ9IjUyOTI3MTY3NDcyNjQ0NDIzNTkiIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiPkxhbmd1YWdlICZhbXA7IGlucHV0PC9zdHJpbmc+Ci0gICAgPCEtLSBUaXRsZSBvZiB0aGUgSW5wdXQgbWV0aG9kIHBpY2tlci4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIG1zZ2lkPSI0NjUzMzg3MzM2NzkxMjIyOTc4IiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiPkNob29zZSBpbnB1dCBtZXRob2Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0ZXAzX3RpdGxlIj4iQ29uZ3JhdHVsYXRpb25zLCB5b3UncmUgYWxsIHNldCEiPC9zdHJpbmc+CisgICAgPCEtLSBEZXRhaWxlZCBpbnN0cnVjdGlvbiBvZiB0aGUgM3JkIHN0ZXAgaW4gdGhlIHNldHVwIHdpemFyZC4gW0NIQVIgTElNSVQ9MTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNldHVwX3N0ZXAzX2luc3RydWN0aW9uIj5Ob3cgeW91IGNhbiB0eXBlIGluIGFsbCB5b3VyIGZhdm9yaXRlIGFwcHMgd2l0aCA8eGxpZmY6ZyBpZD0iYXBwbGljYXRpb25fbmFtZSI+JXM8L3hsaWZmOmc+Ljwvc3RyaW5nPgorICAgIDwhLS0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gdGhhdCB0cmlnZ2VycyB0aGUgc2NyZWVuIGZvciBjb25maWd1YXJpbmcgYWRkaXRpb25hbCBsYW5ndWFnZXMgb2YgdGhlIGtleWJvYXJkLiBbQ0hBUl9MSU1JVD02NF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9zdGVwM19hY3Rpb24iPkNvbmZpZ3VyZSBhZGRpdGlvbmFsIGxhbmd1YWdlczwvc3RyaW5nPgorICAgIDwhLS0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gdGhhdCBmaW5pc2hlcyB0aGUgc2V0dXAgd2l6YXJkLiBbQ0hBUl9MSU1JVD02NF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9maW5pc2hfYWN0aW9uIj5GaW5pc2hlZDwvc3RyaW5nPgogICAgIDwhLS0gT3B0aW9uIHRvIHNob3cgc2V0dXAgd2l6YXJkIGljb24uIFtDSEFSIExJTUlUPTMwXS0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2hvd19zZXR1cF93aXphcmRfaWNvbiIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+U2hvdyBzZXR1cCB3aXphcmQgaWNvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvd19zZXR1cF93aXphcmRfaWNvbiI+U2hvdyBhcHAgaWNvbjwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gZm9yIHRoZSBvcHRpb24gdG8gc2hvdyBzZXR1cCB3aXphcmQgYXBwbGljYXRpb24gaWNvbiBvZiB0aGlzIElNRSBpbiB0aGUgbGF1Y2hlci4gW0NIQVJfTElNSVQ9NjVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvd19zZXR1cF93aXphcmRfaWNvbl9zdW1tYXJ5Ij5EaXNwbGF5IGFwcGxpY2F0aW9uIGljb24gaW4gdGhlIGxhdW5jaGVyPC9zdHJpbmc+CiAKICAgICA8IS0tIFRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyIGFwcGxpY2F0aW9uIG5hbWUuIFZpc2libGUgaW4gU2V0dGluZ3MvQXBwbGljYXRpb25zL01hbmFnZSBhcHBsaWNhdGlvbnMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPkRpY3Rpb25hcnkgUHJvdmlkZXI8L3N0cmluZz4KQEAgLTQ5OCw5ICs1MDksOSBAQAogICAgIDwhLS0gTWVzc2FnZSBhYm91dCBzb21lIGRpY3Rpb25hcnkgaW5kaWNhdGluZyB0aGUgZmlsZSBpcyBpbnN0YWxsZWQsIGJ1dCB0aGUgZGljdGlvbmFyeSBpcyBkaXNhYmxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiPkluc3RhbGxlZCwgZGlzYWJsZWQ8L3N0cmluZz4KIAotICAgIDwhLS0gTWVzc2FnZSB0byBkaXNwbGF5IGluIHRoZSBkaWN0aW9uYXJpZXMgc2V0dGluZyBzY3JlZW4gd2hlbiBzb21lIGVycm9yIHByZXZlbnRlZCB1cyB0byBsaXN0IGluc3RhbGxlZCBkaWN0aW9uYXJpZXMgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDwhLS0gTWVzc2FnZSB0byBkaXNwbGF5IGluIHRoZSBkaWN0aW9uYXJpZXMgc2V0dGluZyBzY3JlZW4gd2hlbiBzb21lIGVycm9yIHByZXZlbnRlZCB1cyB0byBsaXN0IGluc3RhbGxlZCBkaWN0aW9uYXJpZXMgW0NIQVIgTElNSVQ9NTBdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIj5Qcm9ibGVtIGNvbm5lY3RpbmcgdG8gZGljdGlvbmFyeSBzZXJ2aWNlPC9zdHJpbmc+Ci0gICAgPCEtLSBNZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIGRpY3Rpb25hcmllcyBzZXR0aW5nIHNjcmVlbiB3aGVuIHdlIGZvdW5kIHRoYXQgbm8gZGljdGlvbmFyaWVzIGFyZSBhdmFpbGFibGUgW0NIQVIgTElNSVQ9MjBdLS0+CisgICAgPCEtLSBNZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIGRpY3Rpb25hcmllcyBzZXR0aW5nIHNjcmVlbiB3aGVuIHdlIGZvdW5kIHRoYXQgbm8gZGljdGlvbmFyaWVzIGFyZSBhdmFpbGFibGUgW0NIQVIgTElNSVQ9NTBdLS0+CiAgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIj5ObyBkaWN0aW9uYXJpZXMgYXZhaWxhYmxlPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIHRoZSBvcHRpb25zIHRvIHByZXNzIHRvIHJlZnJlc2ggdGhlIGxpc3QgKGFzIGluLCBjaGVjayBmb3IgdXBkYXRlcyBub3cpIFtDSEFSX0xJTUlUPTUwXSAtLT4KQEAgLTU0Myw0ICs1NTQsNzAgQEAKIAogICAgIDwhLS0gVGhlIHRleHQgb2YgdGhlIHRvYXN0IHdhcm5pbmcgYSBkb3dubG9hZCBpcyBzdGFydGluZyBhdXRvbWF0aWNhbGx5IHRvIGVuYWJsZSBzdWdnZXN0aW9ucyBmb3IgdGhlIHNlbGVjdGVkIGxhbmd1YWdlIFtDSEFSIExJTUlUPTEwMF0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJ0b2FzdF9kb3dubG9hZGluZ19zdWdnZXN0aW9ucyI+RG93bmxvYWRpbmc6IHN1Z2dlc3Rpb25zIGZvciA8eGxpZmY6ZyBpZD0ibGFuZ3VhZ2UiIGV4YW1wbGU9IkVuZ2xpc2giPiUxJHM8L3hsaWZmOmc+IHdpbGwgYmUgcmVhZHkgc29vbi48L3N0cmluZz4KKworICAgIDwhLS0gVmVyc2lvbiB0ZXh0IFtDSEFSIExJTUlUPTMwXS0tPgorICAgIDxzdHJpbmcgbmFtZT0idmVyc2lvbl90ZXh0Ij5WZXJzaW9uIDx4bGlmZjpnIGlkPSJ2ZXJzaW9uX251bWJlciIgZXhhbXBsZT0iMS4wLjE4NjQuNjQzNTIxIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgorCisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MgLS0+CisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MuICBUaGUgc3VtbWFyeSBvZiB0aGUgbGlzdGVtIGl0ZW0gdG8gZ28gaW50byB0aGUgVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzIHNjcmVlbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rfc2V0dGluZ3Nfc3VtbWFyeSIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+IiI8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gVGhlIHRpdGxlIG9mIHRoZSBtZW51IGl0ZW0gdG8gYWRkIGEgbmV3IHdvcmQgdG8gdGhlIHVzZXIgZGljdGlvbmFyeS4gLS0+CisgICAgPCEtLSBUaGlzIHJlc291cmNlIGlzIGNvcnJlc3BvbmRpbmcgdG8gIG1zZ2lkPSI0MDU2NzYyNzU3MTQ5OTIzNTUxIiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hZGRfbWVudV90aXRsZSI+QWRkPC9zdHJpbmc+CisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MuIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHRvIGFkZCBhIG5ldyB3b3JkIHRvIHRoZSB1c2VyIGRpY3Rpb25hcnkuIFtDSEFSIExJTUlUPTI1XSAtLT4KKyAgICA8IS0tIFRoaXMgcmVzb3VyY2UgaXMgY29ycmVzcG9uZGluZyB0byBtc2dpZD0iNDcwMjYxMzk5MDE3NDEyNjQ4MiIgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ190aXRsZSI+QWRkIHRvIGRpY3Rpb25hcnk8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gVGhlIHRpdGxlIG9mIHRoZSBzY3JlZW4gdG8gYWRkL2VkaXQgYSBuZXcgd29yZCB0byB0aGUgdXNlciBkaWN0aW9uYXJ5OyBpdCBkZXNjcmliZXMgdGhlIHBocmFzZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHVzZXIgZGljdGlvbmFyeS4gW0NIQVIgTElNSVQ9MjVdIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI3NDI1ODA3MjAxMjQzNDQyOTEiIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0X3NldHRpbmdzX2FkZF9zY3JlZW5fdGl0bGUiPlBocmFzZTwvc3RyaW5nPgorICAgIDwhLS0gVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzLiBUZXh0IG9uIHRoZSBkaWFsb2cgYnV0dG9uIHRvIHBvcCBtb3JlIG9wdGlvbnMgZm9yIGFkZGluZyBhIHdvcmQuIFtDSEFSIExJTUlUPTE2XSAtLT4KKyAgICA8IS0tIFRoaXMgcmVzb3VyY2UgaXMgY29ycmVzcG9uZGluZyB0byBtc2dpZD0iODg0ODc5ODM3MDc0NjAxOTgyNSIgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ19tb3JlX29wdGlvbnMiPk1vcmUgb3B0aW9uczwvc3RyaW5nPgorICAgIDwhLS0gVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzLiBUZXh0IG9uIHRoZSBkaWFsb2cgYnV0dG9uIG1hc2sgYWR2YW5jZWQgb3B0aW9ucy4gW0NIQVIgTElNSVQ9MTVdIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSIyNDQxNzg1MjY4NzI2MDM2MTAxIiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hZGRfZGlhbG9nX2xlc3Nfb3B0aW9ucyI+TGVzcyBvcHRpb25zPC9zdHJpbmc+CisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MuIFRleHQgb24gdGhlIGRpYWxvZyBidXR0b24gdG8gY29uZmlybSBhZGRpbmcgYSB3b3JkLiBbQ0hBUiBMSU1JVD0xNV0gLS0+CisgICAgPCEtLSBUaGlzIHJlc291cmNlIGlzIGNvcnJlc3BvbmRpbmcgdG8gbXNnaWQ9IjYyMjU4MjM2MjUzMzI0MTYxNDQiIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0X3NldHRpbmdzX2FkZF9kaWFsb2dfY29uZmlybSI+T0s8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gTGFiZWwgdG8gcHV0IGJlZm9yZSB0aGUgd29yZCBmaWVsZCAodGhhdCdzIHRoZSB3b3JkIHRoYXQgd2lsbCBhY3R1YWxseSBiZSBhZGRlZCB0byB0aGUgdXNlciBkaWN0aW9uYXJ5IHdoZW4gT0sgaXMgcHJlc3NlZCkuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8IS0tIFRoaXMgcmVzb3VyY2UgaXMgY29ycmVzcG9uZGluZyB0byBtc2dpZD0iNzg2ODg3OTE3NDkwNTk2MzEzNSIgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX3dvcmRfb3B0aW9uX25hbWUiPldvcmQ6PC9zdHJpbmc+CisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MuIExhYmVsIHRvIHB1dCBiZWZvcmUgdGhlIHNob3J0Y3V0IGZpZWxkIChvbmNlIGEgc2hvcnRjdXQgaXMgcmVnaXN0ZXJlZCwgdGhlIHVzZXIgY2FuIHR5cGUgdGhlIHNob3J0Y3V0IGFuZCBnZXQgdGhlIHdvcmQgaXQgcG9pbnRzIHRvIGluIHRoZSBzdWdnZXN0aW9ucykuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8IS0tIFRoaXMgcmVzb3VyY2UgaXMgY29ycmVzcG9uZGluZyB0byBtc2dpZD0iNjYwMDg5MjU4ODY2MDYzOTI1IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfb3B0aW9uX25hbWUiPlNob3J0Y3V0Ojwvc3RyaW5nPgorICAgIDwhLS0gVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzLiBMYWJlbCB0byBwdXQgYmVmb3JlIHRoZSBsYW5ndWFnZSBmaWVsZC4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI1Njk2MzU4MzE3MDYxMzE4NTMyIiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hZGRfbG9jYWxlX29wdGlvbl9uYW1lIj5MYW5ndWFnZTo8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gSGludCBmb3IgdGhlIHRleHQgZmllbGQgdG8gdHlwZSB0aGUgd29yZCB0byBhZGQgdG8gdGhlIHVzZXIgZGljdGlvbmFyeS4gW0NIQVIgTElNSVQ9MzVdIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI1NzI1MjU0MDc2NTU2ODIxMjQ3IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hZGRfd29yZF9oaW50Ij5UeXBlIGEgd29yZDwvc3RyaW5nPgorICAgIDwhLS0gVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzLiBIaW50IGZvciB0aGUgdGV4dCBmaWVsZCB0byB0eXBlIHRoZSBvcHRpb25hbCBzaG9ydGN1dCB0byBhZGQgdG8gdGhlIHVzZXIgZGljdGlvbmFyeS4gW0NIQVIgTElNSVQ9MzVdIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI3MzMzNzYzNDU2NTYxODczNDQ1IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hZGRfc2hvcnRjdXRfaGludCI+T3B0aW9uYWwgc2hvcnRjdXQ8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgdG8gZWRpdCBhbiBleGlzdGluZyB3b3JkIGluIHRoZSB1c2VyIGRpY3Rpb25hcnkuIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI4OTY3NDc2NDQ0ODQwNTQ4Njc0IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19lZGl0X2RpYWxvZ190aXRsZSI+RWRpdCB3b3JkPC9zdHJpbmc+CisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MuIFRoZSB0aXRsZSBvZiB0aGUgY29udGV4dCBtZW51IGl0ZW0gdG8gZWRpdCB0aGUgY3VycmVudCB3b3JkIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSIyMjEwNTY0ODc5MzIwMDA0ODM3IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19jb250ZXh0X21lbnVfZWRpdF90aXRsZSI+RWRpdDwvc3RyaW5nPgorICAgIDwhLS0gVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzLiBUaGUgdGl0bGUgb2YgdGhlIGNvbnRleHQgbWVudSBpdGVtIHRvIGRlbGV0ZSB0aGUgY3VycmVudCB3b3JkIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI5MTQwNzAzOTEzNzc2NTQ5MDU0IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19jb250ZXh0X21lbnVfZGVsZXRlX3RpdGxlIj5EZWxldGU8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gVGhlIHRleHQgdG8gc2hvdyB3aGVuIHRoZXJlIGFyZSBubyB1c2VyLWRlZmluZWQgd29yZHMgaW4gdGhlIGRpY3Rpb25hcnkgIFtDSEFSIExJTUlUPTIwMF0gLS0+CisgICAgPCEtLSBUaGlzIHJlc291cmNlIGlzIGNvcnJlc3BvbmRpbmcgdG8gbXNnaWQ9IjgxNjUyNzMzNzk5NDIxMDUyNzEiIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0X3NldHRpbmdzX2VtcHR5X3RleHQiPllvdSBkb25cJ3QgaGF2ZSBhbnkgd29yZHMgaW4gdGhlIHVzZXIgZGljdGlvbmFyeS4gQWRkIGEgd29yZCBieSB0b3VjaGluZyB0aGUgQWRkICgrKSBidXR0b24uPC9zdHJpbmc+CisgICAgPCEtLSBVc2VyIGRpY3Rpb25hcnkgc2V0dGluZ3MuIFRoZSBsaXN0IGl0ZW0gdG8gY2hvb3NlIHRvIGluc2VydCBhIHdvcmQgaW50byB0aGUgdXNlciBkaWN0aW9uYXJ5IGZvciBhbGwgbGFuZ3VhZ2VzIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI2NzQyMDAwMDQwOTc1OTU5MjQ3IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19hbGxfbGFuZ3VhZ2VzIj5Gb3IgYWxsIGxhbmd1YWdlczwvc3RyaW5nPgorICAgIDwhLS0gVXNlciBkaWN0aW9uYXJ5IHNldHRpbmdzLiBUaGUgdGV4dCB0byBzaG93IGZvciB0aGUgb3B0aW9uIHRoYXQgc2hvd3MgdGhlIGVudGlyZSBsaXN0IG9mIHN1cHBvcnRlZCBsb2NhbGVzIHRvIGNob29zZSBvbmUgW0NIQVIgTElNSVQ9MzBdIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI3MzE2Mzc1OTQ0Njg0OTc3OTEwIiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9zZXR0aW5nc19tb3JlX2xhbmd1YWdlcyI+TW9yZSBsYW5ndWFnZXPigKY8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gTGFiZWwgdG8gZGVsZXRlIGFuIGVudHJ5IGluIHRoZSB1c2VyIGRpY3Rpb25hcnkgW0NIQVIgTElNSVQ9MzBdCisgICAgICAgICBUaGlzIHJlc291cmNlIGlzIGNvcGllZCBmcm9tIHBhY2thZ2VzL2FwcHMvU2V0dGluZ3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCAtLT4KKyAgICA8IS0tIFRoaXMgcmVzb3VyY2UgaXMgY29ycmVzcG9uZGluZyB0byBtc2dpZD0iNDIxOTI0MzQxMjMyNTE2MzAwMyIgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rfc2V0dGluZ3NfZGVsZXRlIj5EZWxldGU8L3N0cmluZz4KKyAgICA8IS0tIFVzZXIgZGljdGlvbmFyeSBzZXR0aW5ncy4gSW5kZXggb2YgdGhlIHVzZXIgZGljdGlvbmFyeSBbQ0hBUiBMSU1JVD0zMF0KKyAgICAgICAgIFRoaXMgcmVzb3VyY2UgaXMgY29waWVkIGZyb20gcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIC0tPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyBjb3JyZXNwb25kaW5nIHRvIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5IiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdF9mYXN0X3Njcm9sbF9hbHBoYWJldCI+XHUwMDIwQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAppbmRleCA0MzZlMDgwLi44YjZjMjllIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtNjQsMTQgKzY0LDE4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVGbG9hdGluZ1ByZXZpZXdIb3Jpem9udGFsUGFkZGluZyI+QGRpbWVuL2dlc3R1cmVfZmxvYXRpbmdfcHJldmlld19ob3Jpem9udGFsX3BhZGRpbmc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVGbG9hdGluZ1ByZXZpZXdWZXJ0aWNhbFBhZGRpbmciPkBkaW1lbi9nZXN0dXJlX2Zsb2F0aW5nX3ByZXZpZXdfdmVydGljYWxfcGFkZGluZzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZUZsb2F0aW5nUHJldmlld1JvdW5kUmFkaXVzIj5AZGltZW4vZ2VzdHVyZV9mbG9hdGluZ19wcmV2aWV3X3JvdW5kX3JhZGl1czwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbEZhZGVvdXRTdGFydERlbGF5Ij5AaW50ZWdlci9jb25maWdfZ2VzdHVyZV9wcmV2aWV3X3RyYWlsX2ZhZGVvdXRfc3RhcnRfZGVsYXk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVQcmV2aWV3VHJhaWxGYWRlb3V0RHVyYXRpb24iPkBpbnRlZ2VyL2NvbmZpZ19nZXN0dXJlX3ByZXZpZXdfdHJhaWxfZmFkZW91dF9kdXJhdGlvbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbFVwZGF0ZUludGVydmFsIj5AaW50ZWdlci9jb25maWdfZ2VzdHVyZV9wcmV2aWV3X3RyYWlsX3VwZGF0ZV9pbnRlcnZhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbENvbG9yIj5AY29sb3IvaGlnaGxpZ2h0X2NvbG9yX2RlZmF1bHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVQcmV2aWV3VHJhaWxTdGFydFdpZHRoIj5AZGltZW4vZ2VzdHVyZV9wcmV2aWV3X3RyYWlsX3N0YXJ0X3dpZHRoPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlUHJldmlld1RyYWlsRW5kV2lkdGgiPkBkaW1lbi9nZXN0dXJlX3ByZXZpZXdfdHJhaWxfZW5kX3dpZHRoPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlUHJldmlld1RyYWlsQm9keVJhdGlvIj5AaW50ZWdlci9nZXN0dXJlX3ByZXZpZXdfdHJhaWxfYm9keV9yYXRpbzwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVByZXZpZXdUcmFpbFNoYWRvd1JhdGlvIj5AaW50ZWdlci9nZXN0dXJlX3ByZXZpZXdfdHJhaWxfc2hhZG93X3JhdGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlVHJhaWxNaW5TYW1wbGluZ0Rpc3RhbmNlIj5AZGltZW4vZ2VzdHVyZV90cmFpbF9taW5fc2FtcGxpbmdfZGlzdGFuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVUcmFpbE1heEludGVycG9sYXRpb25Bbmd1bGFyVGhyZXNob2xkIj5AaW50ZWdlci9nZXN0dXJlX3RyYWlsX21heF9pbnRlcnBvbGF0aW9uX2FuZ3VsYXJfdGhyZXNob2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlVHJhaWxNYXhJbnRlcnBvbGF0aW9uRGlzdGFuY2VUaHJlc2hvbGQiPkBkaW1lbi9nZXN0dXJlX3RyYWlsX21heF9pbnRlcnBvbGF0aW9uX2Rpc3RhbmNlX3RocmVzaG9sZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVRyYWlsTWF4SW50ZXJwb2xhdGlvblNlZ21lbnRzIj5AaW50ZWdlci9nZXN0dXJlX3RyYWlsX21heF9pbnRlcnBvbGF0aW9uX3NlZ21lbnRzPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlVHJhaWxGYWRlb3V0U3RhcnREZWxheSI+QGludGVnZXIvY29uZmlnX2dlc3R1cmVfdHJhaWxfZmFkZW91dF9zdGFydF9kZWxheTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVRyYWlsRmFkZW91dER1cmF0aW9uIj5AaW50ZWdlci9jb25maWdfZ2VzdHVyZV90cmFpbF9mYWRlb3V0X2R1cmF0aW9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlVHJhaWxVcGRhdGVJbnRlcnZhbCI+QGludGVnZXIvY29uZmlnX2dlc3R1cmVfdHJhaWxfdXBkYXRlX2ludGVydmFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlVHJhaWxDb2xvciI+QGNvbG9yL2hpZ2hsaWdodF9jb2xvcl9kZWZhdWx0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlVHJhaWxTdGFydFdpZHRoIj5AZGltZW4vZ2VzdHVyZV90cmFpbF9zdGFydF93aWR0aDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVRyYWlsRW5kV2lkdGgiPkBkaW1lbi9nZXN0dXJlX3RyYWlsX2VuZF93aWR0aDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZVRyYWlsQm9keVJhdGlvIj5AaW50ZWdlci9nZXN0dXJlX3RyYWlsX2JvZHlfcmF0aW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVUcmFpbFNoYWRvd1JhdGlvIj5AaW50ZWdlci9nZXN0dXJlX3RyYWlsX3NoYWRvd19yYXRpbzwvaXRlbT4KICAgICAgICAgPCEtLSBDb21tb24gYXR0cmlidXRlcyBvZiBNYWluS2V5Ym9hcmRWaWV3IC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJrZXlIeXN0ZXJlc2lzRGlzdGFuY2UiPkBkaW1lbi9jb25maWdfa2V5X2h5c3RlcmVzaXNfZGlzdGFuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImtleUh5c3RlcmVzaXNEaXN0YW5jZUZvclNsaWRpbmdNb2RpZmllciI+QGRpbWVuL2NvbmZpZ19rZXlfaHlzdGVyZXNpc19kaXN0YW5jZV9mb3Jfc2xpZGluZ19tb2RpZmllcjwvaXRlbT4KQEAgLTk0LDggKzk4LDEwIEBACiAgICAgICAgIDxpdGVtIG5hbWU9InNob3dNb3JlS2V5c0tleWJvYXJkQXRUb3VjaGVkUG9pbnQiPkBib29sL2NvbmZpZ19zaG93X21vcmVfa2V5c19rZXlib2FyZF9hdF90b3VjaGVkX3BvaW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsYW5ndWFnZU9uU3BhY2ViYXJGaW5hbEFscGhhIj5AaW50ZWdlci9jb25maWdfbGFuZ3VhZ2Vfb25fc3BhY2ViYXJfZmluYWxfYWxwaGE8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxhbmd1YWdlT25TcGFjZWJhckZhZGVvdXRBbmltYXRvciI+QGFuaW0vbGFuZ3VhZ2Vfb25fc3BhY2ViYXJfZmFkZW91dDwvaXRlbT4KKyAgICAgICAgPCEtLSBSZW1vdmUgYW5pbWF0aW9ucyBmb3Igbm93IGJlY2F1c2UgaXQgY291bGQgZHJhaW4gYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgYmF0dGVyeSB3aGlsZSB0eXBpbmcuCiAgICAgICAgIDxpdGVtIG5hbWU9ImFsdENvZGVLZXlXaGlsZVR5cGluZ0ZhZGVvdXRBbmltYXRvciI+QGFuaW0vYWx0X2NvZGVfa2V5X3doaWxlX3R5cGluZ19mYWRlb3V0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbHRDb2RlS2V5V2hpbGVUeXBpbmdGYWRlaW5BbmltYXRvciI+QGFuaW0vYWx0X2NvZGVfa2V5X3doaWxlX3R5cGluZ19mYWRlaW48L2l0ZW0+CisgICAgICAgIC0tPgogICAgICAgICA8IS0tIENvbW1vbiBhdHRyaWJ1dGVzIG9mIE1haW5LZXlib2FyZFZpZXcgZm9yIGdlc3R1cmUgdHlwaW5nIGRldGVjdGlvbiBhbmQgcmVjb2duaXRpb24gLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVGbG9hdGluZ1ByZXZpZXdUZXh0TGluZ2VyVGltZW91dCI+QGludGVnZXIvY29uZmlnX2dlc3R1cmVfZmxvYXRpbmdfcHJldmlld190ZXh0X2xpbmdlcl90aW1lb3V0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlU3RhdGljVGltZVRocmVzaG9sZEFmdGVyRmFzdFR5cGluZyI+QGludGVnZXIvY29uZmlnX2dlc3R1cmVfc3RhdGljX3RpbWVfdGhyZXNob2xkX2FmdGVyX2Zhc3RfdHlwaW5nPC9pdGVtPgpAQCAtMzQyLDcgKzM0OCw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImtleVRleHRTaGFkb3dSYWRpdXMiPjAuMDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2xpZGluZ0tleUlucHV0UHJldmlld0NvbG9yIj5AY29sb3IvaGlnaGxpZ2h0X3RyYW5zbHVjZW50X2NvbG9yX2ljczwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZ2VzdHVyZUZsb2F0aW5nUHJldmlld1RleHRDb2xvciI+QGNvbG9yL2hpZ2hsaWdodF9jb2xvcl9pY3M8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVQcmV2aWV3VHJhaWxDb2xvciI+QGNvbG9yL2hpZ2hsaWdodF9jb2xvcl9pY3M8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVUcmFpbENvbG9yIj5AY29sb3IvaGlnaGxpZ2h0X2NvbG9yX2ljczwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZQogICAgICAgICBuYW1lPSJNYWluS2V5Ym9hcmRWaWV3LkljZUNyZWFtU2FuZHdpY2giCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvc3VkZGVuLWp1bXBpbmctdG91Y2gtZXZlbnQtZGV2aWNlLWxpc3QueG1sIGIvamF2YS9yZXMvdmFsdWVzL3N1ZGRlbi1qdW1waW5nLXRvdWNoLWV2ZW50LWRldmljZS1saXN0LnhtbAppbmRleCAzZmRjMGM3Li4zYTljMzc5IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMvc3VkZGVuLWp1bXBpbmctdG91Y2gtZXZlbnQtZGV2aWNlLWxpc3QueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9zdWRkZW4tanVtcGluZy10b3VjaC1ldmVudC1kZXZpY2UtbGlzdC54bWwKQEAgLTE5LDEzICsxOSwxMyBAQAogLS0+CiA8cmVzb3VyY2VzPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0ic3VkZGVuX2p1bXBpbmdfdG91Y2hfZXZlbnRfZGV2aWNlX2xpc3QiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPgotICAgICAgICA8IS0tICJCdWlsZC5IQVJEV0FSRSx0cnVlIiB0aGF0IG5lZWRzICJzdWRkZW4ganVtcCB0b3VjaCBldmVudCIgaGFjay4KKyAgICAgICAgPCEtLSAiQnVpbGQgY29uZGl0aW9uLHRydWUiIHRoYXQgbmVlZHMgInN1ZGRlbiBqdW1wIHRvdWNoIGV2ZW50IiBoYWNrLgogICAgICAgICAgICAgIFNlZSB7QGxpbmsgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuU3VkZGVuSnVtcGluZ1RvdWNoRXZlbnRIYW5kbGVyfS4gLS0+CiAgICAgICAgIDwhLS0gTmV4dXMgT25lIC0tPgotICAgICAgICA8aXRlbT5tYWhpbWFoaSx0cnVlPC9pdGVtPgorICAgICAgICA8aXRlbT5IQVJEV0FSRT1tYWhpbWFoaSx0cnVlPC9pdGVtPgogICAgICAgICA8IS0tIERyb2lkIC0tPgotICAgICAgICA8aXRlbT5zaG9sZXMsdHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SEFSRFdBUkU9c2hvbGVzLHRydWU8L2l0ZW0+CiAgICAgICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSBmb3IgdW5rbm93biBkZXZpY2UgLS0+Ci0gICAgICAgIDxpdGVtPkRFRkFVTFQsZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtPixmYWxzZTwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMveG1sL3ByZWZzLnhtbCBiL2phdmEvcmVzL3htbC9wcmVmcy54bWwKaW5kZXggMTU4MWU1Zi4uNTFlMzQyMCAxMDA2NDQKLS0tIGEvamF2YS9yZXMveG1sL3ByZWZzLnhtbAorKysgYi9qYXZhL3Jlcy94bWwvcHJlZnMueG1sCkBAIC01NCw2ICs1NCwxMSBAQAogICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2NvcnJlY3Rpb25fY2F0ZWdvcnkiCiAgICAgICAgIGFuZHJvaWQ6a2V5PSJjb3JyZWN0aW9uX3NldHRpbmdzIj4KICAgICAgICAgPFByZWZlcmVuY2VTY3JlZW4KKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJlZGl0X3BlcnNvbmFsX2RpY3Rpb25hcnkiCisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2VkaXRfcGVyc29uYWxfZGljdGlvbmFyeSI+CisgICAgICAgICAgICA8aW50ZW50IGFuZHJvaWQ6YWN0aW9uPSJhbmRyb2lkLnNldHRpbmdzLlVTRVJfRElDVElPTkFSWV9TRVRUSU5HUyIgLz4KKyAgICAgICAgPC9QcmVmZXJlbmNlU2NyZWVuPgorICAgICAgICA8UHJlZmVyZW5jZVNjcmVlbgogICAgICAgICAgICAgYW5kcm9pZDprZXk9ImNvbmZpZ3VyZV9kaWN0aW9uYXJpZXNfa2V5IgogICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9jb25maWd1cmVfZGljdGlvbmFyaWVzX3RpdGxlIj4KICAgICAgICAgICAgPGludGVudApAQCAtNjQsNiArNjksMTIgQEAKICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy9kaWN0aW9uYXJ5X3BhY2tfY2xpZW50X2lkIiAvPgogICAgICAgICAgICA8L2ludGVudD4KICAgICAgICAgPC9QcmVmZXJlbmNlU2NyZWVuPgorICAgICAgICA8Q2hlY2tCb3hQcmVmZXJlbmNlCisgICAgICAgICAgICBhbmRyb2lkOmtleT0icHJlZl9rZXlfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlIgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wcmVmc19ibG9ja19wb3RlbnRpYWxseV9vZmZlbnNpdmVfdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvcHJlZnNfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlX3N1bW1hcnkiCisgICAgICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRlZmF1bHRWYWx1ZT0iQGJvb2wvY29uZmlnX2Jsb2NrX3BvdGVudGlhbGx5X29mZmVuc2l2ZSIgLz4KICAgICAgICAgPExpc3RQcmVmZXJlbmNlCiAgICAgICAgICAgICBhbmRyb2lkOmtleT0iYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZCIKICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvYXV0b19jb3JyZWN0aW9uIgpAQCAtMTcyLDE2ICsxODMsMTkgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0icHJlZl9rZXlwcmVzc19zb3VuZF92b2x1bWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wcmVmc19rZXlwcmVzc19zb3VuZF92b2x1bWVfc2V0dGluZ3MiCiAgICAgICAgICAgICAgICAgbGF0aW46bWF4VmFsdWU9IjEwMCIgLz4gPCEtLSBwZXJjZW50IC0tPgotICAgICAgICAgICAgPCEtLSBUaGUgc2hvdyBzZXR1cCB3aXphcmQgaWNvbiBzZXR0aW5ncyBzaG91bGRuJ3QgYmUgcGVyc2lzdGVudCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgaXMgYWRkZWQgcHJvZ3JhbW1hdGljYWxseS4gLS0+CisgICAgICAgICAgICA8IS0tIFRoZSBzZXR0aWdzIGZvciBzaG93aW5nIHNldHVwIHdpemFyZCBhcHBsaWNhdGlvbiBpY29uIHNob3VsZG4ndCBiZSBwZXJzaXN0ZW50IGFuZAorICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhZGRlZCBwcm9ncmFtbWF0aWNhbGx5LiAtLT4KICAgICAgICAgICAgIDxDaGVja0JveFByZWZlcmVuY2UKICAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0icHJlZl9zaG93X3NldHVwX3dpemFyZF9pY29uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2hvd19zZXR1cF93aXphcmRfaWNvbiIgLz4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3Nob3dfc2V0dXBfd2l6YXJkX2ljb24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3Nob3dfc2V0dXBfd2l6YXJkX2ljb25fc3VtbWFyeSIgLz4KICAgICAgICAgPC9QcmVmZXJlbmNlU2NyZWVuPgogICAgICAgICA8UHJlZmVyZW5jZVNjcmVlbgogICAgICAgICAgICAgYW5kcm9pZDprZXk9InNlbmRfZmVlZGJhY2siCiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NlbmRfZmVlZGJhY2siIC8+CiAgICAgICAgIDxQcmVmZXJlbmNlU2NyZWVuCisgICAgICAgICAgICBhbmRyb2lkOmtleT0iYWJvdXRfa2V5Ym9hcmQiIC8+CisgICAgICAgIDxQcmVmZXJlbmNlU2NyZWVuCiAgICAgICAgICAgICBhbmRyb2lkOmtleT0iZGVidWdfc2V0dGluZ3MiCiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJEZWJ1ZyBzZXR0aW5ncyIKICAgICAgICAgICAgIGFuZHJvaWQ6cGVyc2lzdGVudD0idHJ1ZSIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL3htbC9zcGVsbGNoZWNrZXIueG1sIGIvamF2YS9yZXMveG1sL3NwZWxsY2hlY2tlci54bWwKaW5kZXggODEzMzE5Yy4uMTNlNjEzMiAxMDA2NDQKLS0tIGEvamF2YS9yZXMveG1sL3NwZWxsY2hlY2tlci54bWwKKysrIGIvamF2YS9yZXMveG1sL3NwZWxsY2hlY2tlci54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICAgZm9yIHRoZSBzcGVsbCBjaGVja2VyIC0tPgogCiA8c3BlbGwtY2hlY2tlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYW9zcF9zcGVsbF9jaGVja2VyX3NlcnZpY2VfbmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9zcGVsbF9jaGVja2VyX3NlcnZpY2VfbmFtZSIKICAgICAgICAgYW5kcm9pZDpzZXR0aW5nc0FjdGl2aXR5PSJjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5zcGVsbGNoZWNrLlNwZWxsQ2hlY2tlclNldHRpbmdzQWN0aXZpdHkiPgogICAgIDxzdWJ0eXBlCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3N1YnR5cGVfZ2VuZXJpYyIKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2NvbXBhdC9UZXh0Vmlld0NvbXBhdFV0aWxzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvVGV4dFZpZXdDb21wYXRVdGlscy5qYXZhCmluZGV4IGQ0ZjFlYTguLmY4ZTE5MDIgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2NvbXBhdC9UZXh0Vmlld0NvbXBhdFV0aWxzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L1RleHRWaWV3Q29tcGF0VXRpbHMuamF2YQpAQCAtMjIsMjMgKzIyLDIzIEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgVGV4dFZpZXdDb21wYXRVdGlscyB7Ci0gICAgLy8gTm90ZSB0aGF0IFRleHRWaWV3LnNldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmUoRHJhd2FibGUsRHJhd2FibGUsRHJhd2FibGUsRHJhd2FibGUpIGhhcwotICAgIC8vIGJlZW4gaW50cm9kdWNlZCBpbiBBUEkgbGV2ZWwgMTcgKEJ1aWxkLlZFUlNJT05fQ09ERS5KRUxMWV9CRUFOX01SMSkuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIE1FVEhPRF9zZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlID0gQ29tcGF0VXRpbHMuZ2V0TWV0aG9kKAotICAgICAgICAgICAgVGV4dFZpZXcuY2xhc3MsICJzZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlIiwKKyAgICAvLyBOb3RlIHRoYXQgVGV4dFZpZXcuc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMoRHJhd2FibGUsRHJhd2FibGUsCisgICAgLy8gRHJhd2FibGUsRHJhd2FibGUpIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gQVBJIGxldmVsIDE3IChCdWlsZC5WRVJTSU9OX0NPREUuSkVMTFlfQkVBTl9NUjEpLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBNRVRIT0Rfc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMgPQorICAgICAgICAgICAgQ29tcGF0VXRpbHMuZ2V0TWV0aG9kKFRleHRWaWV3LmNsYXNzLCAic2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMiLAogICAgICAgICAgICAgRHJhd2FibGUuY2xhc3MsIERyYXdhYmxlLmNsYXNzLCBEcmF3YWJsZS5jbGFzcywgRHJhd2FibGUuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBUZXh0Vmlld0NvbXBhdFV0aWxzKCkgewogICAgICAgICAvLyBUaGlzIHV0aWxpdHkgY2xhc3MgaXMgbm90IHB1YmxpY2x5IGluc3RhbnRpYWJsZS4KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZShmaW5hbCBUZXh0VmlldyB0ZXh0VmlldywgZmluYWwgRHJhd2FibGUgc3RhcnQsCi0gICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSB0b3AsIGZpbmFsIERyYXdhYmxlIGVuZCwgZmluYWwgRHJhd2FibGUgYm90dG9tKSB7Ci0gICAgICAgIGlmIChNRVRIT0Rfc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRDb21wb3VuZERyYXdhYmxlcyhzdGFydCwgdG9wLCBlbmQsIGJvdHRvbSk7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmVXaXRoSW50cmluc2ljQm91bmRzKGZpbmFsIFRleHRWaWV3IHRleHRWaWV3LAorICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgc3RhcnQsIGZpbmFsIERyYXdhYmxlIHRvcCwgZmluYWwgRHJhd2FibGUgZW5kLCBmaW5hbCBEcmF3YWJsZSBib3R0b20pIHsKKyAgICAgICAgaWYgKE1FVEhPRF9zZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlV2l0aEludHJpbnNpY0JvdW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZXh0Vmlldy5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoc3RhcnQsIHRvcCwgZW5kLCBib3R0b20pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIENvbXBhdFV0aWxzLmludm9rZSh0ZXh0VmlldywgbnVsbCwgTUVUSE9EX3NldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmUsCisgICAgICAgIENvbXBhdFV0aWxzLmludm9rZSh0ZXh0VmlldywgbnVsbCwgTUVUSE9EX3NldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmVXaXRoSW50cmluc2ljQm91bmRzLAogICAgICAgICAgICAgICAgIHN0YXJ0LCB0b3AsIGVuZCwgYm90dG9tKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvVXNlckRpY3Rpb25hcnlDb21wYXRVdGlscy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L1VzZXJEaWN0aW9uYXJ5Q29tcGF0VXRpbHMuamF2YQppbmRleCBmZjY1NjFjLi5hMGQ3NjQxIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvVXNlckRpY3Rpb25hcnlDb21wYXRVdGlscy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2NvbXBhdC9Vc2VyRGljdGlvbmFyeUNvbXBhdFV0aWxzLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgTUVUSE9EX2FkZFdvcmQgPSBDb21wYXRVdGlscy5nZXRNZXRob2QoV29yZHMuY2xhc3MsICJhZGRXb3JkIiwKICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIFN0cmluZy5jbGFzcywgSW50ZWdlci5UWVBFLCBTdHJpbmcuY2xhc3MsIExvY2FsZS5jbGFzcyk7CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXb3JkKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIHdvcmQsIGZpbmFsIGludCBmcmVxLAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNob3J0Y3V0LCBmaW5hbCBMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGlmIChoYXNOZXdlckFkZFdvcmQoKSkgewpAQCAtMzksMTMgKzQwLDE4IEBACiAgICAgICAgICAgICBpZiAobnVsbCA9PSBsb2NhbGUpIHsKICAgICAgICAgICAgICAgICBsb2NhbGVUeXBlID0gV29yZHMuTE9DQUxFX1RZUEVfQUxMOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2NhbGVUeXBlID0gV29yZHMuTE9DQUxFX1RZUEVfQ1VSUkVOVDsKKyAgICAgICAgICAgICAgICBmaW5hbCBMb2NhbGUgY3VycmVudExvY2FsZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmxvY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxlLmVxdWFscyhjdXJyZW50TG9jYWxlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbGVUeXBlID0gV29yZHMuTE9DQUxFX1RZUEVfQ1VSUkVOVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2NhbGVUeXBlID0gV29yZHMuTE9DQUxFX1RZUEVfQUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFdvcmRzLmFkZFdvcmQoY29udGV4dCwgd29yZCwgZnJlcSwgbG9jYWxlVHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc05ld2VyQWRkV29yZCgpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzTmV3ZXJBZGRXb3JkKCkgewogICAgICAgICByZXR1cm4gbnVsbCAhPSBNRVRIT0RfYWRkV29yZDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9BY3Rpb25CYXRjaC5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQWN0aW9uQmF0Y2guamF2YQppbmRleCBkZjRhNTJmLi5iZjIyMzA1IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9BY3Rpb25CYXRjaC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0FjdGlvbkJhdGNoLmphdmEKQEAgLTEzOCw3ICsxMzgsMTIgQEAKICAgICAgICAgICAgIGlmIChudWxsID09IG1hbmFnZXIpIHJldHVybjsKIAogICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiB1cGdyYWRlZCB3b3JkIGxpc3Q6IHdlIHNob3VsZCBkb3dubG9hZCBpdC4KLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBVcmkucGFyc2UobVdvcmRMaXN0Lm1SZW1vdGVGaWxlbmFtZSk7CisgICAgICAgICAgICAvLyBBZGRpbmcgYSBkaXNhbWJpZ3VhdG9yIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4gb2xkZXIgdmVyc2lvbnMgb2YgRG93bmxvYWRNYW5hZ2VyLgorICAgICAgICAgICAgLy8gRG93bmxvYWRNYW5hZ2VyIGFsc28gc3R1cGlkbHkgY3V0cyB0aGUgZXh0ZW5zaW9uIHRvIHJlcGxhY2Ugd2l0aCBpdHMgb3duIHRoYXQgaXQKKyAgICAgICAgICAgIC8vIGdldHMgZnJvbSB0aGUgY29udGVudC10eXBlLiBXZSBuZWVkIHRvIGNpcmN1bXZlbnQgdGhpcy4KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkaXNhbWJpZ3VhdG9yID0gIiMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgICAgICAgICAgKyBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5VdGlscy5nZXRWZXJzaW9uTmFtZShjb250ZXh0KSArICIuZGljdCI7CisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKG1Xb3JkTGlzdC5tUmVtb3RlRmlsZW5hbWUgKyBkaXNhbWJpZ3VhdG9yKTsKICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVyaSk7CiAKICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwpAQCAtMTc0LDcgKzE3OSw3IEBACiAgICAgICAgICAgICBmaW5hbCBsb25nIGRvd25sb2FkSWQgPSBVcGRhdGVIYW5kbGVyLnJlZ2lzdGVyRG93bmxvYWRSZXF1ZXN0KG1hbmFnZXIsIHJlcXVlc3QsIGRiLAogICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOwogICAgICAgICAgICAgVXRpbHMubCgiU3RhcnRpbmcgZG93bmxvYWQgb2YiLCB1cmksICJ3aXRoIGlkIiwgZG93bmxvYWRJZCk7Ci0gICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiU3RhcnRpbmcgZG93bmxvYWQgb2YgIiArIHVyaSArICIsIGlkIDogIiArIGRvd25sb2FkSWQsIGNvbnRleHQpOworICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlN0YXJ0aW5nIGRvd25sb2FkIG9mICIgKyB1cmkgKyAiLCBpZCA6ICIgKyBkb3dubG9hZElkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMzLDcgKzMzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tUmVtb3RlRmlsZW5hbWUsIG1Xb3JkTGlzdC5tTGFzdFVwZGF0ZSwgbVdvcmRMaXN0Lm1DaGVja3N1bSwKICAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1GaWxlU2l6ZSwgbVdvcmRMaXN0Lm1WZXJzaW9uLCBtV29yZExpc3QubUZvcm1hdFZlcnNpb24pOwogICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkluc2VydCAnYXZhaWxhYmxlJyByZWNvcmQgZm9yICIgKyBtV29yZExpc3QubURlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbmQgbG9jYWxlICIgKyBtV29yZExpc3QubUxvY2FsZSwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgbG9jYWxlICIgKyBtV29yZExpc3QubUxvY2FsZSk7CiAgICAgICAgICAgICBkYi5pbnNlcnQoTWV0YWRhdGFEYkhlbHBlci5NRVRBREFUQV9UQUJMRV9OQU1FLCBudWxsLCB2YWx1ZXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzgzLDcgKzM4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tQ2hlY2tzdW0sIG1Xb3JkTGlzdC5tRmlsZVNpemUsIG1Xb3JkTGlzdC5tVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uKTsKICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJJbnNlcnQgJ3ByZWluc3RhbGxlZCcgcmVjb3JkIGZvciAiICsgbVdvcmRMaXN0Lm1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgYW5kIGxvY2FsZSAiICsgbVdvcmRMaXN0Lm1Mb2NhbGUsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICArICIgYW5kIGxvY2FsZSAiICsgbVdvcmRMaXN0Lm1Mb2NhbGUpOwogICAgICAgICAgICAgZGIuaW5zZXJ0KE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwgbnVsbCwgdmFsdWVzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQyNCw3ICs0MjksNyBAQAogICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubVJlbW90ZUZpbGVuYW1lLCBtV29yZExpc3QubUxhc3RVcGRhdGUsIG1Xb3JkTGlzdC5tQ2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tRmlsZVNpemUsIG1Xb3JkTGlzdC5tVmVyc2lvbiwgbVdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uKTsKICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJVcGRhdGluZyByZWNvcmQgZm9yICIgKyBtV29yZExpc3QubURlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbmQgbG9jYWxlICIgKyBtV29yZExpc3QubUxvY2FsZSwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgbG9jYWxlICIgKyBtV29yZExpc3QubUxvY2FsZSk7CiAgICAgICAgICAgICBkYi51cGRhdGUoTWV0YWRhdGFEYkhlbHBlci5NRVRBREFUQV9UQUJMRV9OQU1FLCB2YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKQEAgLTQ3OCwxMyArNDgzLDE0IEBACiAgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVEID09IHN0YXR1cwogICAgICAgICAgICAgICAgICAgICB8fCBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRCA9PSBzdGF0dXMKICAgICAgICAgICAgICAgICAgICAgfHwgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgPT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW5zdGFsbGVkIG9yIGRpc2FibGVkLCB0aGVuIHdlIGNhbm5vdCByZW1vdmUgdGhlIGVudHJ5IGxlc3QgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAvLyBsb3NlIHRoZSBhYmlsaXR5IHRvIGRlbGV0ZSB0aGUgZmlsZSBvciBvdGhlcndpc2UgYWRtaW5pc3RyYXRlIGl0LiBXZSB3aWxsIHRodXMKLSAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpdCBhcyBpcywgYnV0IHJlbW92ZSB0aGUgVVJJIGZyb20gdGhlIGRhdGFiYXNlIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3NlZCB0bwotICAgICAgICAgICAgICAgIC8vIGJlIGFjY2Vzc2libGUgYW55IG1vcmUuCisgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW5zdGFsbGVkIG9yIGRpc2FibGVkLCB3ZSBuZWVkIHRvIG1hcmsgaXQgYXMgZGVsZXRlZCBzbyB0aGF0IExhdGluSU1FCisgICAgICAgICAgICAgICAgLy8gd2lsbCByZW1vdmUgaXQgbmV4dCB0aW1lIGl0IGVucXVpcmVzIGZvciBkaWN0aW9uYXJpZXMuCiAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgZGVsZXRpbmcgYW5kIHdlIGRvbid0IGhhdmUgYSBuZXcgdmVyc2lvbiwgdGhlbiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwKLSAgICAgICAgICAgICAgICAvLyBBbmRyb2lkIEtleWJvYXJkIGFjdHVhbGx5IGhhcyBkZWxldGVkIGl0IGJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGl0cyBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBMYXRpbklNRSBhY3R1YWxseSBoYXMgZGVsZXRlZCBpdCBiZWZvcmUgd2UgY2FuIHJlbW92ZSBpdHMgbWV0YWRhdGEuCisgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgcmVtb3ZlIHRoZSBVUkkgZnJvbSB0aGUgZGF0YWJhc2Ugc2luY2UgaXQgaXMgbm90IHN1cHBvc2VkIHRvCisgICAgICAgICAgICAgICAgLy8gYmUgYWNjZXNzaWJsZSBhbnkgbW9yZS4KICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1ldGFkYXRhRGJIZWxwZXIuUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiwgIiIpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OLCBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORyk7CiAgICAgICAgICAgICAgICAgZGIudXBkYXRlKE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwgdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTiArICIgPSA/IEFORCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0J1dHRvblN3aXRjaGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9CdXR0b25Td2l0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjk0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9CdXR0b25Td2l0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1Byb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworLyoqCisgKiBBIHZpZXcgdGhhdCBoYW5kbGVzIGJ1dHRvbnMgaW5zaWRlIGl0IGFjY29yZGluZyB0byBhIHN0YXR1cy4KKyAqLworcHVibGljIGNsYXNzIEJ1dHRvblN3aXRjaGVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9JTklUSUFMSVpFRCA9IC0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT19CVVRUT04gPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTlNUQUxMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ0FOQ0VMID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfREVMRVRFID0gMzsKKyAgICAvLyBPbmUgb2YgdGhlIGFib3ZlCisgICAgcHJpdmF0ZSBpbnQgbVN0YXR1cyA9IE5PVF9JTklUSUFMSVpFRDsKKyAgICBwcml2YXRlIGludCBtQW5pbWF0ZVRvU3RhdHVzID0gTk9UX0lOSVRJQUxJWkVEOworCisgICAgLy8gQW5pbWF0aW9uIGRpcmVjdGlvbnMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fSU4gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOSU1BVElPTl9PVVQgPSAyOworCisgICAgcHJpdmF0ZSBCdXR0b24gbUluc3RhbGxCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbUNhbmNlbEJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtRGVsZXRlQnV0dG9uOworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1PbkNsaWNrTGlzdGVuZXI7CisKKyAgICBwdWJsaWMgQnV0dG9uU3dpdGNoZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgIH0KKworICAgIHB1YmxpYyBCdXR0b25Td2l0Y2hlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoZmluYWwgYm9vbGVhbiBjaGFuZ2VkLCBmaW5hbCBpbnQgbGVmdCwgZmluYWwgaW50IHRvcCwgZmluYWwgaW50IHJpZ2h0LAorICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSkgeworICAgICAgICBzdXBlci5vbkxheW91dChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICBtSW5zdGFsbEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuZGljdF9pbnN0YWxsX2J1dHRvbik7CisgICAgICAgIG1DYW5jZWxCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmRpY3RfY2FuY2VsX2J1dHRvbik7CisgICAgICAgIG1EZWxldGVCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmRpY3RfZGVsZXRlX2J1dHRvbik7CisgICAgICAgIG1JbnN0YWxsQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgbUNhbmNlbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1EZWxldGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBzZXRCdXR0b25Qb3NpdGlvbldpdGhvdXRBbmltYXRpb24obVN0YXR1cyk7CisgICAgICAgIGlmIChtQW5pbWF0ZVRvU3RhdHVzICE9IE5PVF9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBiZWVuIGFza2VkIHRvIGFuaW1hdGUgYmVmb3JlIHdlIHdlcmUgcmVhZHksIHNvIHdlIHRvb2sgYSBub3RlIG9mIGl0LgorICAgICAgICAgICAgLy8gV2UgYXJlIG5vdyByZWFkeTogbGF1bmNoIHRoZSBhbmltYXRpb24uCisgICAgICAgICAgICBhbmltYXRlQnV0dG9uUG9zaXRpb24obVN0YXR1cywgbUFuaW1hdGVUb1N0YXR1cyk7CisgICAgICAgICAgICBtU3RhdHVzID0gbUFuaW1hdGVUb1N0YXR1czsKKyAgICAgICAgICAgIG1BbmltYXRlVG9TdGF0dXMgPSBOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEJ1dHRvbiBnZXRCdXR0b24oZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgU1RBVFVTX0lOU1RBTEw6CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbGxCdXR0b247CisgICAgICAgIGNhc2UgU1RBVFVTX0NBTkNFTDoKKyAgICAgICAgICAgIHJldHVybiBtQ2FuY2VsQnV0dG9uOworICAgICAgICBjYXNlIFNUQVRVU19ERUxFVEU6CisgICAgICAgICAgICByZXR1cm4gbURlbGV0ZUJ1dHRvbjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQW5kVXBkYXRlVmlzdWFscyhmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIGlmIChtU3RhdHVzID09IE5PVF9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgc2V0QnV0dG9uUG9zaXRpb25XaXRob3V0QW5pbWF0aW9uKHN0YXR1cyk7CisgICAgICAgICAgICBtU3RhdHVzID0gc3RhdHVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbUluc3RhbGxCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBtYXkgY29tZSBoZXJlIGJlZm9yZSB3ZSBoYXZlIGJlZW4gbGF5b3V0LiBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qga25vdyBvdXIKKyAgICAgICAgICAgICAgICAvLyBzaXplIHlldCBzbyB3ZSBjYW4ndCBzdGFydCBhbmltYXRpb25zIHNvIHdlIG5lZWQgdG8gcmVtZW1iZXIgd2hhdCBhbmltYXRpb24gdG8KKyAgICAgICAgICAgICAgICAvLyBzdGFydCBvbmNlIGxheW91dCBoYXMgZ29uZSB0aHJvdWdoLgorICAgICAgICAgICAgICAgIG1BbmltYXRlVG9TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuaW1hdGVCdXR0b25Qb3NpdGlvbihtU3RhdHVzLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QnV0dG9uUG9zaXRpb25XaXRob3V0QW5pbWF0aW9uKGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgLy8gVGhpcyBtYXkgYmUgY2FsbGVkIGJ5IHNldFN0YXR1cygpIGJlZm9yZSB0aGUgbGF5b3V0IGhhcyBjb21lIHlldC4KKyAgICAgICAgaWYgKG51bGwgPT0gbUluc3RhbGxCdXR0b24pIHJldHVybjsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKKyAgICAgICAgLy8gU2V0IHRvIG91dCBvZiB0aGUgc2NyZWVuIGlmIHRoYXQncyBub3QgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgc3RhdHVzCisgICAgICAgIG1JbnN0YWxsQnV0dG9uLnNldFRyYW5zbGF0aW9uWChTVEFUVVNfSU5TVEFMTCA9PSBzdGF0dXMgPyAwIDogd2lkdGgpOworICAgICAgICBtQ2FuY2VsQnV0dG9uLnNldFRyYW5zbGF0aW9uWChTVEFUVVNfQ0FOQ0VMID09IHN0YXR1cyA/IDAgOiB3aWR0aCk7CisgICAgICAgIG1EZWxldGVCdXR0b24uc2V0VHJhbnNsYXRpb25YKFNUQVRVU19ERUxFVEUgPT0gc3RhdHVzID8gMCA6IHdpZHRoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUJ1dHRvblBvc2l0aW9uKGZpbmFsIGludCBvbGRTdGF0dXMsIGZpbmFsIGludCBuZXdTdGF0dXMpIHsKKyAgICAgICAgZmluYWwgVmlldyBvbGRCdXR0b24gPSBnZXRCdXR0b24ob2xkU3RhdHVzKTsKKyAgICAgICAgZmluYWwgVmlldyBuZXdCdXR0b24gPSBnZXRCdXR0b24obmV3U3RhdHVzKTsKKyAgICAgICAgaWYgKG51bGwgIT0gb2xkQnV0dG9uICYmIG51bGwgIT0gbmV3QnV0dG9uKSB7CisgICAgICAgICAgICAvLyBUcmFuc2l0aW9uIGJldHdlZW4gdHdvIGJ1dHRvbnMgOiBhbmltYXRlIG91dCwgdGhlbiBpbgorICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihvbGRCdXR0b24sIEFOSU1BVElPTl9PVVQpLnNldExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKGZpbmFsIEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgIT0gbVN0YXR1cykgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVCdXR0b24obmV3QnV0dG9uLCBBTklNQVRJT05fSU4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIGlmIChudWxsICE9IG9sZEJ1dHRvbikgeworICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihvbGRCdXR0b24sIEFOSU1BVElPTl9PVVQpOworICAgICAgICB9IGVsc2UgaWYgKG51bGwgIT0gbmV3QnV0dG9uKSB7CisgICAgICAgICAgICBhbmltYXRlQnV0dG9uKG5ld0J1dHRvbiwgQU5JTUFUSU9OX0lOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludGVybmFsT25DbGlja0xpc3RlbmVyKGZpbmFsIE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25DbGlja0xpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3UHJvcGVydHlBbmltYXRvciBhbmltYXRlQnV0dG9uKGZpbmFsIFZpZXcgYnV0dG9uLCBmaW5hbCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IG91dGVyWCA9IGdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IGlubmVyWCA9IGJ1dHRvbi5nZXRYKCkgLSBidXR0b24uZ2V0VHJhbnNsYXRpb25YKCk7CisgICAgICAgIGlmIChBTklNQVRJT05fSU4gPT0gZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBidXR0b24uc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbi5hbmltYXRlKCkudHJhbnNsYXRpb25YKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnV0dG9uLnNldENsaWNrYWJsZShmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gYnV0dG9uLmFuaW1hdGUoKS50cmFuc2xhdGlvblgob3V0ZXJYIC0gaW5uZXJYKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlEb3dubG9hZFByb2dyZXNzQmFyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5RG93bmxvYWRQcm9ncmVzc0Jhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjUwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5RG93bmxvYWRQcm9ncmVzc0Jhci5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlci5RdWVyeTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOworCitwdWJsaWMgY2xhc3MgRGljdGlvbmFyeURvd25sb2FkUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBQcm9ncmVzc0JhciB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERpY3Rpb25hcnlEb3dubG9hZFByb2dyZXNzQmFyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FfRE9XTkxPQURNQU5BR0VSX1BFTkRJTkdfSUQgPSAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUNsaWVudElkOworICAgIHByaXZhdGUgU3RyaW5nIG1Xb3JkbGlzdElkOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDdXJyZW50bHlBdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBUaHJlYWQgbVJlcG9ydGVyVGhyZWFkID0gbnVsbDsKKworICAgIHB1YmxpYyBEaWN0aW9uYXJ5RG93bmxvYWRQcm9ncmVzc0JhcihmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIERpY3Rpb25hcnlEb3dubG9hZFByb2dyZXNzQmFyKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZHMoZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCkgeworICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgbVdvcmRsaXN0SWQgPSB3b3JkbGlzdElkOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGludCBnZXREb3dubG9hZE1hbmFnZXJQZW5kaW5nSWRGcm9tV29yZGxpc3RJZChmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkKSB7CisgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgd29yZGxpc3RWYWx1ZXMgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc09mTGF0ZXN0QXZhaWxhYmxlV29yZGxpc3RCeUlkKGRiLCB3b3JkbGlzdElkKTsKKyAgICAgICAgaWYgKG51bGwgPT0gd29yZGxpc3RWYWx1ZXMpIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgYSB3b3JkIGxpc3Qgd2l0aCB0aGlzIGlkLiBCdWc/IFRoaXMgc2hvdWxkIG5ldmVyCisgICAgICAgICAgICAvLyBoYXBwZW4sIGJ1dCBzdGlsbCByZXR1cm4gdG8gcHJldmVudCBhIGNyYXNoLgorICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCB3b3JkIGxpc3QgSUQ6ICIgKyB3b3JkbGlzdElkKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfQV9ET1dOTE9BRE1BTkFHRVJfUEVORElOR19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd29yZGxpc3RWYWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuUEVORElOR0lEX0NPTFVNTik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgYW55IHJ1bm5pbmcgdXBkYXRlciB0aHJlYWQgZm9yIHRoaXMgcHJvZ3Jlc3MgYmFyIGFuZCBjcmVhdGUgYW5kIHJ1bgorICAgICAqIGEgbmV3IG9uZSBvbmx5IGlmIHRoZSBwcm9ncmVzcyBiYXIgaXMgdmlzaWJsZS4KKyAgICAgKiBIZW5jZSwgYXMgYSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIHByb2dyZXNzIGJhciB3aWxsIGhhdmUgYW4gdXBkYXRlciB0aHJlYWQKKyAgICAgKiBydW5uaW5nIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm9ncmVzcyBiYXIgaXMgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUmVwb3J0ZXJUaHJlYWRSdW5uaW5nU3RhdHVzQWNjb3JkaW5nVG9WaXNpYmlsaXR5KCkgeworICAgICAgICBpZiAobnVsbCAhPSBtUmVwb3J0ZXJUaHJlYWQpIG1SZXBvcnRlclRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgaWYgKG1Jc0N1cnJlbnRseUF0dGFjaGVkVG9XaW5kb3cgJiYgVmlldy5WSVNJQkxFID09IGdldFZpc2liaWxpdHkoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IGRvd25sb2FkTWFuYWdlclBlbmRpbmdJZCA9CisgICAgICAgICAgICAgICAgICAgIGdldERvd25sb2FkTWFuYWdlclBlbmRpbmdJZEZyb21Xb3JkbGlzdElkKGdldENvbnRleHQoKSwgbUNsaWVudElkLCBtV29yZGxpc3RJZCk7CisgICAgICAgICAgICBpZiAoTk9UX0FfRE9XTkxPQURNQU5BR0VSX1BFTkRJTkdfSUQgPT0gZG93bmxvYWRNYW5hZ2VyUGVuZGluZ0lkKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IHRoZSBJRC4gVGhpcyBpcyBuZXZlciBzdXBwb3NlZCB0byBoYXBwZW4sIGJ1dCBzdGlsbCBjbGVhciB0aGUgdXBkYXRlcgorICAgICAgICAgICAgICAgIC8vIHRocmVhZCBhbmQgcmV0dXJuIHRvIGF2b2lkIGEgY3Jhc2guCisgICAgICAgICAgICAgICAgbVJlcG9ydGVyVGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBVcGRhdGVyVGhyZWFkIHVwZGF0ZXJUaHJlYWQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVXBkYXRlclRocmVhZChnZXRDb250ZXh0KCksIGRvd25sb2FkTWFuYWdlclBlbmRpbmdJZCk7CisgICAgICAgICAgICB1cGRhdGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICBtUmVwb3J0ZXJUaHJlYWQgPSB1cGRhdGVyVGhyZWFkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHJlc3RhcnQgdGhlIHRocmVhZCBhbnl3YXksIHNvIHdlIG1heSBhcyB3ZWxsIGdhcmJhZ2UgY29sbGVjdCBpdC4KKyAgICAgICAgICAgIG1SZXBvcnRlclRocmVhZCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIG1Jc0N1cnJlbnRseUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOworICAgICAgICB1cGRhdGVSZXBvcnRlclRocmVhZFJ1bm5pbmdTdGF0dXNBY2NvcmRpbmdUb1Zpc2liaWxpdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgbUlzQ3VycmVudGx5QXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOworICAgICAgICB1cGRhdGVSZXBvcnRlclRocmVhZFJ1bm5pbmdTdGF0dXNBY2NvcmRpbmdUb1Zpc2liaWxpdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFVwZGF0ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVQT1JUX1BFUklPRCA9IDE1MDsgLy8gaG93IG9mdGVuIHRvIHJlcG9ydCBwcm9ncmVzcywgaW4gbXMKKyAgICAgICAgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1Eb3dubG9hZE1hbmFnZXI7CisgICAgICAgIGZpbmFsIGludCBtSWQ7CisgICAgICAgIHB1YmxpYyBVcGRhdGVyVGhyZWFkKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgaW50IGlkKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgbURvd25sb2FkTWFuYWdlciA9IChEb3dubG9hZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gSXQncyBhbG1vc3QgaW1wb3NzaWJsZSB0aGF0IG1Eb3dubG9hZE1hbmFnZXIgaXMgbnVsbCAoaXQgd291bGQgbWVhbiBpdCBoYXMgYmVlbgorICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkIGJldHdlZW4gcHJlc3NpbmcgdGhlICdpbnN0YWxsJyBidXR0b24gYW5kIGRpc3BsYXlpbmcgdGhlIHByb2dyZXNzCisgICAgICAgICAgICAgICAgLy8gYmFyKSwgYnV0IGp1c3QgaW4gY2FzZS4KKyAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBtRG93bmxvYWRNYW5hZ2VyKSByZXR1cm47CisgICAgICAgICAgICAgICAgZmluYWwgVXBkYXRlSGVscGVyIHVwZGF0ZUhlbHBlciA9IG5ldyBVcGRhdGVIZWxwZXIoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSgpLnNldEZpbHRlckJ5SWQobUlkKTsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFByb2dyZXNzID0gMDsKKyAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKHRydWUpOworICAgICAgICAgICAgICAgIHdoaWxlICghaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBtRG93bmxvYWRNYW5hZ2VyLnF1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW4ndCBjb250YWN0IERvd25sb2FkTWFuYWdlcjogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5CeXRlc0Rvd25sb2FkZWRTb0ZhciA9IGN1cnNvci5nZXRDb2x1bW5JbmRleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkTWFuYWdlci5DT0xVTU5fQllURVNfRE9XTkxPQURFRF9TT19GQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBieXRlc0Rvd25sb2FkZWRTb0ZhciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IuZ2V0SW50KGNvbHVtbkJ5dGVzRG93bmxvYWRlZFNvRmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIZWxwZXIuc2V0UHJvZ3Jlc3NGcm9tQW5vdGhlclRocmVhZChieXRlc0Rvd25sb2FkZWRTb0Zhcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvd25sb2FkIGhhcyBmaW5pc2hlZCBhbmQgRG93bmxvYWRNYW5hZ2VyIGhhcyBhbHJlYWR5IGJlZW4gYXNrZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCB0aGUgZGIgZW50cnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSGVscGVyLnNldFByb2dyZXNzRnJvbUFub3RoZXJUaHJlYWQoZ2V0TWF4KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChSRVBPUlRfUEVSSU9EKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyBhbmQgdGVybWluYXRlIG5vcm1hbGx5LgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBVcGRhdGVIZWxwZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgICAgICBwcml2YXRlIGludCBtUHJvZ3Jlc3M7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcyhtUHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NGcm9tQW5vdGhlclRocmVhZChmaW5hbCBpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAobVByb2dyZXNzICE9IHByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmVzcyA9IHByb2dyZXNzOworICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiwgc2V0UHJvZ3Jlc3MganVzdCBkb2VzIG5vdCB3b3JrIGZyb20gYSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQsIGFsdGhvdWdoIHRoZSBjb2RlIGluIFByb2dyZXNzQmFyIGxvb2tzIGxpa2UgaXQgc2hvdWxkLiBUaHVzLCB3ZQorICAgICAgICAgICAgICAgICAgICAvLyByZXNvcnQgdG8gYSBydW5uYWJsZSBwb3N0ZWQgdG8gdGhlIGhhbmRsZXIgb2YgdGhlIHZpZXcuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0byBjb21lIGhlcmUgYmVmb3JlIHRoaXMgdmlldyBoYXMgYmVlbiBsYWlkIG91dC4gSWYgc28sCisgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBjYWxsIC0gaXQgd2lsbCBiZSB1cGRhdGVkIGFnYWluIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBoYW5kbGVyKSByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIucG9zdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5TGlzdEludGVyZmFjZVN0YXRlLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5TGlzdEludGVyZmFjZVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzNzExYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uQ29sbGVjdGlvblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIG1haW50YWluIHRoZSBpbnRlcmZhY2Ugc3RhdGUgb2Ygd29yZCBsaXN0IHByZWZlcmVuY2VzLgorICoKKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHZpZXdzIGFyZSBjcmVhdGVkIG9uLWRlbWFuZCBieSBjYWxsaW5nIGNvZGUuIFRoZXJlIGFyZSBtYW55CisgKiBzaXR1YXRpb25zIHdoZXJlIHZpZXdzIGFyZSByZW5ld2VkIHdpdGggbGl0dGxlIHJlbGF0aW9uIHdpdGggdXNlciBpbnRlcmFjdGlvbi4gRm9yIGV4YW1wbGUsCisgKiB3aGVuIHNjcm9sbGluZywgdGhlIHZpZXcgaXMgcmV1c2VkIHNvIGl0IGRvZXNuJ3Qga2VlcCBpdHMgc3RhdGUsIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8ga2VlcAorICogaXQgc2VwYXJhdGVseS4gQWxzbyB3aGVuZXZlciB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5IGxpc3QgdW5kZXJnb2VzIGEgY2hhbmdlIChmb3IgZXhhbXBsZSwKKyAqIHVwZGF0ZSB0aGUgbWV0YWRhdGEsIG9yIGZpbmlzaCBkb3dubG9hZGluZykgdGhlIHdob2xlIGxpc3QgaGFzIHRvIGJlIHRocm93biBvdXQgYW5kIHJlY3JlYXRlZAorICogaW4gY2FzZSBzb21lIGRpY3Rpb25hcmllcyBhcHBlYXJlZCwgZGlzYXBwZWFyZWQsIGNoYW5nZWQgc3RhdGVzIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIERpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbU9wZW4gPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGludCBtU3RhdHVzID0gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfVU5LTk9XTjsKKyAgICB9CisKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdGF0ZT4gbVdvcmRsaXN0VG9TdGF0ZSA9IENvbGxlY3Rpb25VdGlscy5uZXdIYXNoTWFwKCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQpIHsKKyAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBtV29yZGxpc3RUb1N0YXRlLmdldCh3b3JkbGlzdElkKTsKKyAgICAgICAgaWYgKG51bGwgPT0gc3RhdGUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN0YXRlLm1PcGVuOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKGZpbmFsIFN0cmluZyB3b3JkbGlzdElkKSB7CisgICAgICAgIGZpbmFsIFN0YXRlIHN0YXRlID0gbVdvcmRsaXN0VG9TdGF0ZS5nZXQod29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHN0YXRlKSByZXR1cm4gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfVU5LTk9XTjsKKyAgICAgICAgcmV0dXJuIHN0YXRlLm1TdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BlbihmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBmaW5hbCBTdGF0ZSBuZXdTdGF0ZTsKKyAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBtV29yZGxpc3RUb1N0YXRlLmdldCh3b3JkbGlzdElkKTsKKyAgICAgICAgbmV3U3RhdGUgPSBudWxsID09IHN0YXRlID8gbmV3IFN0YXRlKCkgOiBzdGF0ZTsKKyAgICAgICAgbmV3U3RhdGUubU9wZW4gPSB0cnVlOworICAgICAgICBuZXdTdGF0ZS5tU3RhdHVzID0gc3RhdHVzOworICAgICAgICBtV29yZGxpc3RUb1N0YXRlLnB1dCh3b3JkbGlzdElkLCBuZXdTdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoKSB7CisgICAgICAgIGZvciAoZmluYWwgU3RhdGUgc3RhdGUgOiBtV29yZGxpc3RUb1N0YXRlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBzdGF0ZS5tT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVByb3ZpZGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UHJvdmlkZXIuamF2YQppbmRleCBmOGQxYzRmLi40ZmJlMTYyIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UHJvdmlkZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UHJvdmlkZXIuamF2YQpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKGZpbmFsIFVyaSB1cmkpIHsKLSAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkFza2VkIGZvciB0eXBlIG9mIDogIiArIHVyaSwgdGhpcyk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJBc2tlZCBmb3IgdHlwZSBvZiA6ICIgKyB1cmkpOwogICAgICAgICBmaW5hbCBpbnQgbWF0Y2ggPSBtYXRjaFVyaSh1cmkpOwogICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7CiAgICAgICAgICAgICBjYXNlIE5PX01BVENIOiByZXR1cm4gbnVsbDsKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nW10gcHJvamVjdGlvbiwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKICAgICAgICAgVXRpbHMubCgiVXJpID0iLCB1cmkpOwotICAgICAgICBQcml2YXRlTG9nLmxvZygiUXVlcnkgOiAiICsgdXJpLCB0aGlzKTsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlF1ZXJ5IDogIiArIHVyaSk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCA9IGdldENsaWVudElkKHVyaSk7CiAgICAgICAgIGZpbmFsIGludCBtYXRjaCA9IG1hdGNoVXJpKHVyaSk7CiAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKQEAgLTIyOCw3ICsyMjgsNyBAQAogICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX1dIT0xFX0xJU1Q6CiAgICAgICAgICAgICAgICAgZmluYWwgQ3Vyc29yIGMgPSBNZXRhZGF0YURiSGVscGVyLnF1ZXJ5RGljdGlvbmFyaWVzKGdldENvbnRleHQoKSwgY2xpZW50SWQpOwogICAgICAgICAgICAgICAgIFV0aWxzLmwoIkxpc3Qgb2YgZGljdGlvbmFyaWVzIHdpdGggY291bnQiLCBjLmdldENvdW50KCkpOwotICAgICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJSZXR1cm5lZCBhIGxpc3Qgb2YgIiArIGMuZ2V0Q291bnQoKSArICIgaXRlbXMiLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiUmV0dXJuZWQgYSBsaXN0IG9mICIgKyBjLmdldENvdW50KCkgKyAiIGl0ZW1zIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfRElDVF9JTkZPOgogICAgICAgICAgICAgICAgIC8vIEluIHByb3RvY29sIHZlcnNpb24gMiwgd2UgcmV0dXJuIG51bGwgaWYgdGhlIGNsaWVudCBpcyB1bmtub3duLiBPdGhlcndpc2UKQEAgLTI0OCwxMCArMjQ4LDEwIEBACiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBjbGllbnRJZCB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgRGljdGlvbmFyeVNlcnZpY2UudXBkYXRlTm93SWZOb3RVcGRhdGVkSW5BVmVyeUxvbmdUaW1lKGdldENvbnRleHQoKSk7CiAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZGljdEZpbGVzICYmIGRpY3RGaWxlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJSZXR1cm5lZCAiICsgZGljdEZpbGVzLnNpemUoKSArICIgZmlsZXMiLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlJldHVybmVkICIgKyBkaWN0RmlsZXMuc2l6ZSgpICsgIiBmaWxlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUGF0aEN1cnNvcihkaWN0RmlsZXMpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJObyBkaWN0aW9uYXJ5IGZpbGVzIGZvciB0aGlzIFVSTCIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiTm8gZGljdGlvbmFyeSBmaWxlcyBmb3IgdGhpcyBVUkwiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVBhdGhDdXJzb3IoQ29sbGVjdGlvbnMuPFdvcmRMaXN0SW5mbz5lbXB0eUxpc3QoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVjJfTUVUQURBVEEgYW5kIFYyX0RBVEFGSUxFIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBxdWVyeSgpCkBAIC00ODgsNyArNDg4LDcgQEAKICAgICBwdWJsaWMgVXJpIGluc2VydChmaW5hbCBVcmkgdXJpLCBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcykKICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChudWxsID09IHVyaSB8fCBudWxsID09IHZhbHVlcykgcmV0dXJuIG51bGw7IC8vIFNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGxldCdzIGJlIHNhZmUKLSAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkluc2VydCwgdXJpID0gIiArIHVyaS50b1N0cmluZygpLCB0aGlzKTsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkluc2VydCwgdXJpID0gIiArIHVyaS50b1N0cmluZygpKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gZ2V0Q2xpZW50SWQodXJpKTsKICAgICAgICAgc3dpdGNoIChtYXRjaFVyaSh1cmkpKSB7CiAgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfTUVUQURBVEE6CkBAIC01MTcsNyArNTE3LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRElDVElPTkFSWV9WMV9XSE9MRV9MSVNUOgogICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YxX0RJQ1RfSU5GTzoKLSAgICAgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiQXR0ZW1wdCB0byBpbnNlcnQgOiAiICsgdXJpLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiQXR0ZW1wdCB0byBpbnNlcnQgOiAiICsgdXJpKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW5zZXJ0aW9uIGluIHRoZSBkaWN0aW9uYXJ5IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7CiAgICAgICAgIH0KQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgdXBkYXRlKGZpbmFsIFVyaSB1cmksIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLAogICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkF0dGVtcHQgdG8gdXBkYXRlIDogIiArIHVyaSwgdGhpcyk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJBdHRlbXB0IHRvIHVwZGF0ZSA6ICIgKyB1cmkpOwogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVwZGF0aW5nIGRpY3Rpb25hcnkgd29yZHMgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXJ2aWNlLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2VydmljZS5qYXZhCmluZGV4IDU4MTdlYjQuLjQ2YmI1NTQgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXJ2aWNlLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNlcnZpY2UuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0xOTAsNyArMTg5LDcgQEAKICAgICAgICAgLy8gaXMgc3RpbGwgbW9yZSByZWNlbnQgdGhhbiBVUERBVEVfRlJFUVVFTkNZLCBkbyBub3RoaW5nLgogICAgICAgICBpZiAoIWlzTGFzdFVwZGF0ZUF0TGVhc3RUaGlzT2xkKGNvbnRleHQsIFVQREFURV9GUkVRVUVOQ1kpKSByZXR1cm47CiAKLSAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkRhdGUgY2hhbmdlZCAtIHJlZ2lzdGVyaW5nIGFsYXJtIiwgY29udGV4dCk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJEYXRlIGNoYW5nZWQgLSByZWdpc3RlcmluZyBhbGFybSIpOwogICAgICAgICBBbGFybU1hbmFnZXIgYWxhcm1NYW5hZ2VyID0gKEFsYXJtTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKIAogICAgICAgICAvLyBCZXN0IGVmZm9ydCB0byB3YWtlIGJldHdlZW4gbWlkbmlnaHQgYW5kIE1BWF9BTEFSTV9ERUxBWSBpbiB0aGUgbW9ybmluZy4KQEAgLTIxNSw3ICsyMTQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYXN0VXBkYXRlQXRMZWFzdFRoaXNPbGQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBsb25nIHRpbWUpIHsKICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgbG9uZyBsYXN0VXBkYXRlID0gTWV0YWRhdGFEYkhlbHBlci5nZXRPbGRlc3RVcGRhdGVUaW1lKGNvbnRleHQpOwotICAgICAgICBQcml2YXRlTG9nLmxvZygiTGFzdCB1cGRhdGUgd2FzICIgKyBsYXN0VXBkYXRlLCBjb250ZXh0KTsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkxhc3QgdXBkYXRlIHdhcyAiICsgbGFzdFVwZGF0ZSk7CiAgICAgICAgIHJldHVybiBsYXN0VXBkYXRlICsgdGltZSA8IG5vdzsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudC5qYXZhCmluZGV4IDllMjdjMWYuLjYxODMyMjMgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNldHRpbmdzRnJhZ21lbnQuamF2YQpAQCAtNjQsNiArNjQsMTAgQEAKICAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBNZW51SXRlbSBtVXBkYXRlTm93TWVudTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUNoYW5nZWRTZXR0aW5nczsKKyAgICBwcml2YXRlIERpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUgbURpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUgPQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUoKTsKKyAgICBwcml2YXRlIFRyZWVNYXA8U3RyaW5nLCBXb3JkTGlzdFByZWZlcmVuY2U+IG1DdXJyZW50UHJlZmVyZW5jZU1hcCA9CisgICAgICAgICAgICBuZXcgVHJlZU1hcDxTdHJpbmcsIFdvcmRMaXN0UHJlZmVyZW5jZT4oKTsgLy8gbmV2ZXIgbnVsbAogCiAgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtQ29ubmVjdGl2aXR5Q2hhbmdlZFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0yNzYsMTMgKzI4MCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzeXN0ZW1Mb2NhbGVTdHJpbmcgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBmaW5hbCBUcmVlTWFwPFN0cmluZywgV29yZExpc3RQcmVmZXJlbmNlPiBwcmVmTGlzdCA9CisgICAgICAgICAgICBmaW5hbCBUcmVlTWFwPFN0cmluZywgV29yZExpc3RQcmVmZXJlbmNlPiBwcmVmTWFwID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVNYXA8U3RyaW5nLCBXb3JkTGlzdFByZWZlcmVuY2U+KCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgaWRJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OKTsKICAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTik7CiAgICAgICAgICAgICBmaW5hbCBpbnQgbG9jYWxlSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKICAgICAgICAgICAgIGZpbmFsIGludCBkZXNjcmlwdGlvbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuREVTQ1JJUFRJT05fQ09MVU1OKTsKICAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXNJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IGZpbGVzaXplSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5GSUxFU0laRV9DT0xVTU4pOwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkID0gY3Vyc29yLmdldFN0cmluZyhpZEluZGV4KTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiA9IGN1cnNvci5nZXRJbnQodmVyc2lvbkluZGV4KTsKQEAgLTI5MiwxOCArMjk3LDM1IEBACiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IGN1cnNvci5nZXRJbnQoc3RhdHVzSW5kZXgpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXRjaExldmVsID0gTG9jYWxlVXRpbHMuZ2V0TWF0Y2hMZXZlbChzeXN0ZW1Mb2NhbGVTdHJpbmcsIGxvY2FsZVN0cmluZyk7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hdGNoTGV2ZWxTdHJpbmcgPSBMb2NhbGVVdGlscy5nZXRNYXRjaExldmVsU29ydGVkU3RyaW5nKG1hdGNoTGV2ZWwpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaWxlc2l6ZSA9IGN1cnNvci5nZXRJbnQoZmlsZXNpemVJbmRleCk7CiAgICAgICAgICAgICAgICAgLy8gVGhlIGtleSBpcyBzb3J0ZWQgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlciwgYWNjb3JkaW5nIHRvIHRoZSBtYXRjaCBsZXZlbCwgdGhlbgogICAgICAgICAgICAgICAgIC8vIHRoZSBkZXNjcmlwdGlvbi4KICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gbWF0Y2hMZXZlbFN0cmluZyArICIuIiArIGRlc2NyaXB0aW9uICsgIi4iICsgd29yZGxpc3RJZDsKLSAgICAgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdFByZWZlcmVuY2UgZXhpc3RpbmdQcmVmID0gcHJlZkxpc3QuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RQcmVmZXJlbmNlIGV4aXN0aW5nUHJlZiA9IHByZWZNYXAuZ2V0KGtleSk7CiAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZXhpc3RpbmdQcmVmIHx8IGhhc1ByaW9yaXR5KHN0YXR1cywgZXhpc3RpbmdQcmVmLm1TdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFdvcmRMaXN0UHJlZmVyZW5jZSBwcmVmID0gbmV3IFdvcmRMaXN0UHJlZmVyZW5jZShhY3Rpdml0eSwgbUNsaWVudElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRsaXN0SWQsIHZlcnNpb24sIGxvY2FsZSwgZGVzY3JpcHRpb24sIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZMaXN0LnB1dChrZXksIHByZWYpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdFByZWZlcmVuY2Ugb2xkUHJlZmVyZW5jZSA9IG1DdXJyZW50UHJlZmVyZW5jZU1hcC5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RQcmVmZXJlbmNlIHByZWY7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG9sZFByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBvbGRQcmVmZXJlbmNlLm1WZXJzaW9uID09IHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBvbGRQcmVmZXJlbmNlLm1Mb2NhbGUuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvbGQgcHJlZmVyZW5jZSBoYXMgYWxsIHRoZSBuZXcgYXR0cmlidXRlcywgcmV1c2UgaXQuIFdlIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB2ZXJzaW9uIGFuZCBsb2NhbGUgYmVjYXVzZSBhbHRob3VnaCBhdHRyaWJ1dGVzIG90aGVyIHRoYW4gc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHRoZSBzYW1lLCBvdGhlcnMgaGF2ZSBiZWVuIHRlc3RlZCB0aHJvdWdoIHRoZSBrZXkgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAuIEFsc28sIHN0YXR1cyBtYXkgZGlmZmVyIHNvIHdlIGRvbid0IHdhbnQgdG8gdXNlICNlcXVhbHMoKSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZiA9IG9sZFByZWZlcmVuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmLm1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRpc2NhcmQgaXQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWYgPSBuZXcgV29yZExpc3RQcmVmZXJlbmNlKGFjdGl2aXR5LCBtRGljdGlvbmFyeUxpc3RJbnRlcmZhY2VTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudElkLCB3b3JkbGlzdElkLCB2ZXJzaW9uLCBsb2NhbGUsIGRlc2NyaXB0aW9uLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmVmTWFwLnB1dChrZXksIHByZWYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpOwogICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZkxpc3QudmFsdWVzKCk7CisgICAgICAgICAgICBtQ3VycmVudFByZWZlcmVuY2VNYXAgPSBwcmVmTWFwOworICAgICAgICAgICAgcmV0dXJuIHByZWZNYXAudmFsdWVzKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0xvZ1Byb2JsZW1SZXBvcnRlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9nUHJvYmxlbVJlcG9ydGVyLmphdmEKaW5kZXggYzEyN2FkNS4uYzllMTI4ZCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9nUHJvYmxlbVJlcG9ydGVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTG9nUHJvYmxlbVJlcG9ydGVyLmphdmEKQEAgLTI4LDcgKzI4LDggQEAKICAgICAgICAgVEFHID0gdGFnOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlcG9ydChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICBMb2cuZShUQUcsICJSZXBvcnRpbmcgcHJvYmxlbSA6ICIgKyBlKTsKKyAgICAgICAgTG9nLmUoVEFHLCAiUmVwb3J0aW5nIHByb2JsZW0iLCBlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YURiSGVscGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YURiSGVscGVyLmphdmEKaW5kZXggNTVmNTQ1YS4uMDNlZDI2NyAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFEYkhlbHBlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhRGJIZWxwZXIuamF2YQpAQCAtMTYsMTMgKzE2LDExIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTQ3LDE2ICs0NSwxNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9EQVRBQkFTRV9JTklUSUFMX1ZFUlNJT04gPSAzOwogICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGRhdGFiYXNlIHRoYXQgaW1wbGVtZW50cyBDTElFTlRJRC4gSXQgaXMKICAgICAvLyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB2ZXJzaW9ucyBmb3IgdXBncmFkZXMuIFRoaXMgc2hvdWxkIG5ldmVyIGNoYW5nZSBnb2luZyBmb3J3YXJkLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9EQVRBQkFTRV9WRVJTSU9OX1dJVEhfQ0xJRU5USUQgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9EQVRBQkFTRV9WRVJTSU9OX1dJVEhfQ0xJRU5USUQgPSA2OwogICAgIC8vIFRoaXMgaXMgdGhlIGN1cnJlbnQgZGF0YWJhc2UgdmVyc2lvbi4gSXQgc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbiB0aGUgZGF0YWJhc2Ugc2NoZW1hCiAgICAgLy8gZ2V0cyB1cGRhdGVkLiBJdCBpcyBwYXNzZWQgdG8gdGhlIGZyYW1ld29yayBjb25zdHJ1Y3RvciBvZiBTUUxpdGVPcGVuSGVscGVyLCBzbwogICAgIC8vIHRoYXQncyB3aGF0IHRoZSBmcmFtZXdvcmsgdXNlcyB0byB0cmFjayBvdXIgZGF0YWJhc2UgdmVyc2lvbi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfREFUQUJBU0VfVkVSU0lPTiA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0RBVEFCQVNFX1ZFUlNJT04gPSA2OwogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBOT1RfQV9ET1dOTE9BRF9JRCA9IC0xOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfVEFCTEVfTkFNRSA9ICJwZW5kaW5nVXBkYXRlcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9UQUJMRV9OQU1FID0gImNsaWVudHMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1RBQkxFX05BTUUgPSAiY2xpZW50cyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVORElOR0lEX0NPTFVNTiA9ICJwZW5kaW5naWQiOyAvLyBEb3dubG9hZCBNYW5hZ2VyIElECiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DT0xVTU4gPSAidHlwZSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX0NPTFVNTiA9ICJzdGF0dXMiOwpAQCAtNzUsNiArNzMsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9DTElFTlRfSURfQ09MVU1OID0gImNsaWVudGlkIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gPSAidXJpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX01FVEFEQVRBX0FERElUSU9OQUxfSURfQ09MVU1OID0gImFkZGl0aW9uYWxpZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9MQVNUX1VQREFURV9EQVRFX0NPTFVNTiA9ICJsYXN0dXBkYXRlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1BFTkRJTkdJRF9DT0xVTU4gPSAicGVuZGluZ2lkIjsgLy8gRG93bmxvYWQgTWFuYWdlciBJRAogCkBAIC0xMzAsNiArMTI5LDcgQEAKICAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiICsgQ0xJRU5UX1RBQkxFX05BTUUgKyAiICgiCiAgICAgICAgICAgICArIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiBURVhULCAiCiAgICAgICAgICAgICArIENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OICsgIiBURVhULCAiCisgICAgICAgICAgICArIENMSUVOVF9NRVRBREFUQV9BRERJVElPTkFMX0lEX0NPTFVNTiArICIgVEVYVCwgIgogICAgICAgICAgICAgKyBDTElFTlRfTEFTVF9VUERBVEVfREFURV9DT0xVTU4gKyAiIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCiAgICAgICAgICAgICArIENMSUVOVF9QRU5ESU5HSURfQ09MVU1OICsgIiBJTlRFR0VSLCAiCiAgICAgICAgICAgICArIEZMQUdTX0NPTFVNTiArICIgSU5URUdFUiwgIgpAQCAtMjg0LDE0ICsyODQsMTUgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSSQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFkYXRhVXJpQXNTdHJpbmcoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkZWZhdWx0RGIucXVlcnkoQ0xJRU5UX1RBQkxFX05BTUUsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gfSwKLSAgICAgICAgICAgICAgICBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgY2xpZW50SWQgfSwKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBudWxsKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRlZmF1bHREYi5xdWVyeShNZXRhZGF0YURiSGVscGVyLkNMSUVOVF9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE1ldGFkYXRhRGJIZWxwZXIuQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4sCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLkNMSUVOVF9NRVRBREFUQV9BRERJVElPTkFMX0lEX0NPTFVNTiB9LAorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gKyAiID0gPyIsIG5ldyBTdHJpbmdbXSB7IGNsaWVudElkIH0sCiAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKDApOyAvLyBPbmx5IG9uZSBjb2x1bW4sIHJldHVybiBpdAorICAgICAgICAgICAgcmV0dXJuIE1ldGFkYXRhVXJpR2V0dGVyLmdldFVyaShjb250ZXh0LCBjdXJzb3IuZ2V0U3RyaW5nKDApLCBjdXJzb3IuZ2V0U3RyaW5nKDEpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CkBAIC0zMDAsNyArMzAxLDggQEAKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIGxhc3QgbWV0YWRhdGEgdXBkYXRlIHRpbWUgZm9yIGFsbCBjbGllbnRzIHVzaW5nIGEgcGFydGljdWxhciBVUkkuCiAgICAgICoKLSAgICAgKiBBbGwgY2xpZW50cyB1c2luZyB0aGlzIG1ldGFkYXRhIFVSSSB3aWxsIGJlIGluZGljYXRlZCBhcyBoYXZpbmcgYmVlbiB1cGRhdGVkIG5vdy4KKyAgICAgKiBUaGlzIG1ldGhvZCBzZWFyY2hlcyBmb3IgYWxsIGNsaWVudHMgdXNpbmcgYSBwYXJ0aWN1bGFyIFVSSSBhbmQgdXBkYXRlcyB0aGUgbGFzdAorICAgICAqIHVwZGF0ZSB0aW1lIGZvciB0aGlzIGNsaWVudC4KICAgICAgKiBUaGUgY3VycmVudCB0aW1lIGlzIHVzZWQgYXMgdGhlIGxhdGVzdCB1cGRhdGUgdGltZS4gVGhpcyBzYXZlZCBkYXRlIHdpbGwgYmUgd2hhdAogICAgICAqIGlzIHJldHVybmVkIGhlbmNlZm9ydGggYnkge0BsaW5rICNnZXRMYXN0VXBkYXRlRGF0ZUZvckNsaWVudChDb250ZXh0LCBTdHJpbmcpfSwKICAgICAgKiB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4uCkBAIC0zMDksMTMgKzMxMSwyNiBAQAogICAgICAqIEBwYXJhbSB1cmkgdGhlIG1ldGFkYXRhIFVSSSB3ZSBqdXN0IGRvd25sb2FkZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUxhc3RVcGRhdGVUaW1lT2ZVcmkoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIFByaXZhdGVMb2cubG9nKCJTYXZlIGxhc3QgdXBkYXRlIHRpbWUgb2YgVVJJIDogIiArIHVyaSArICIgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiU2F2ZSBsYXN0IHVwZGF0ZSB0aW1lIG9mIFVSSSA6ICIgKyB1cmkgKyAiICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgdmFsdWVzLnB1dChDTElFTlRfTEFTVF9VUERBVEVfREFURV9DT0xVTU4sIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIGRlZmF1bHREYi51cGRhdGUoQ0xJRU5UX1RBQkxFX05BTUUsIHZhbHVlcywKLSAgICAgICAgICAgICAgICBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgdXJpIH0pOworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gTWV0YWRhdGFEYkhlbHBlci5xdWVyeUNsaWVudElkcyhjb250ZXh0KTsKKyAgICAgICAgaWYgKG51bGwgPT0gY3Vyc29yKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0YWRhdGFVcmkgPQorICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFVcmkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERiLnVwZGF0ZShDTElFTlRfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyBjbGllbnRJZCB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsMTEgKzc0NSwxMyBAQAogICAgIC8qKgogICAgICAqIFVwZGF0ZXMgaW5mb3JtYXRpb24gcmVsYXRpdmUgdG8gYSBzcGVjaWZpYyBjbGllbnQuCiAgICAgICoKLSAgICAgKiBVcGRhdGFibGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgb25seSB0aGUgbWV0YWRhdGEgVVJJLCBidXQgbWF5IGJlIGV4cGFuZGVkIGluIHRoZSBmdXR1cmUuCisgICAgICogVXBkYXRhYmxlIGluZm9ybWF0aW9uIGluY2x1ZGVzIHRoZSBtZXRhZGF0YSBVUkkgYW5kIHRoZSBhZGRpdGlvbmFsIElEIGNvbHVtbi4gSXQgbWF5IGJlCisgICAgICogZXhwYW5kZWQgaW4gdGhlIGZ1dHVyZS4KICAgICAgKiBUaGUgcGFzc2VkIHZhbHVlcyBtdXN0IGluY2x1ZGUgYSBjbGllbnQgSUQgaW4gdGhlIGtleSBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiwgYW5kIGl0IG11c3QKLSAgICAgKiBiZSBlcXVhbCB0byB0aGUgc3RyaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBmb3IgY2xpZW50SWQuCi0gICAgICogVGhlIHBhc3NlZCB2YWx1ZXMgbXVzdCBhbHNvIGluY2x1ZGUgYSBub24tZW1wdHkgbWV0YWRhdGEgVVJJIGluIHRoZQotICAgICAqIENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OIGNvbHVtbi4KKyAgICAgKiBiZSBlcXVhbCB0byB0aGUgc3RyaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBmb3IgY2xpZW50SWQuIEl0IG1heSBub3QgYmUgZW1wdHkuCisgICAgICogVGhlIHBhc3NlZCB2YWx1ZXMgbXVzdCBhbHNvIGluY2x1ZGUgYSBub24tbnVsbCBtZXRhZGF0YSBVUkkgaW4gdGhlCisgICAgICogQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gY29sdW1uLCBhcyB3ZWxsIGFzIGEgbm9uLW51bGwgYWRkaXRpb25hbCBJRCBpbiB0aGUKKyAgICAgKiBDTElFTlRfTUVUQURBVEFfQURESVRJT05BTF9JRF9DT0xVTU4uIEJvdGggdGhlc2Ugc3RyaW5ncyBtYXkgYmUgZW1wdHkuCiAgICAgICogSWYgYW55IG9mIHRoZSBhYm92ZSBpcyBub3QgY29tcGxpZWQgd2l0aCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHdpdGhvdXQgdXBkYXRpbmcgZGF0YS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0LCB0byBvcGVuIHRoZSBkYXRhYmFzZQpAQCAtNzQ2LDEwICs3NjMsMTYgQEAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBjb250ZW50IHZhbHVlcwogICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVzQ2xpZW50SWQgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4pOwogICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVzTWV0YWRhdGFVcmkgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4pOwotICAgICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBjbGllbnQgSUQsIGJ1dCBleHRlcm5hbCBhcHBzIG1heSBub3QgY29uZmlndXJlIGl0LgotICAgICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBtZXRhZGF0YSBVUkkgaWYgdGhlIGNsaWVudCBkb2VzIG5vdCB3YW50IHVwZGF0ZXMuCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZXNDbGllbnRJZCkgfHwgbnVsbCA9PSB2YWx1ZXNNZXRhZGF0YVVyaSkgewotICAgICAgICAgICAgLy8gV2UgbmVlZCBib3RoIHRoZXNlIGNvbHVtbnMgdG8gYmUgZmlsbGVkIGluCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZXNNZXRhZGF0YUFkZGl0aW9uYWxJZCA9CisgICAgICAgICAgICAgICAgdmFsdWVzLmdldEFzU3RyaW5nKENMSUVOVF9NRVRBREFUQV9BRERJVElPTkFMX0lEX0NPTFVNTik7CisgICAgICAgIC8vIEVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIGNsaWVudCBJRCwgYnV0IGV4dGVybmFsIGFwcHMgbWF5IG5vdCBjb25maWd1cmUgaXQsIHNvIGRpc2FsbG93CisgICAgICAgIC8vIGJvdGggbnVsbCBhbmQgZW1wdHkgc3RyaW5nLgorICAgICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBtZXRhZGF0YSBVUkkgaWYgdGhlIGNsaWVudCBkb2VzIG5vdCB3YW50IHVwZGF0ZXMsIHNvIGFsbG93CisgICAgICAgIC8vIGVtcHR5IHN0cmluZyBidXQgZGlzYWxsb3cgbnVsbC4KKyAgICAgICAgLy8gRW1wdHkgc3RyaW5nIGlzIGEgdmFsaWQgYWRkaXRpb25hbCBJRCBzbyBhbGxvdyBlbXB0eSBzdHJpbmcgYnV0IGRpc2FsbG93IG51bGwuCisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZXNDbGllbnRJZCkgfHwgbnVsbCA9PSB2YWx1ZXNNZXRhZGF0YVVyaQorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gdmFsdWVzTWV0YWRhdGFBZGRpdGlvbmFsSWQpIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgYWxsIHRoZXNlIGNvbHVtbnMgdG8gYmUgZmlsbGVkIGluCiAgICAgICAgICAgICBVdGlscy5sKCJNaXNzaW5nIHBhcmFtZXRlciBmb3IgdXBkYXRlQ2xpZW50SW5mbyIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC03ODAsOCArODAzLDkgQEAKICAgICAgKiBSZWdpc3RlciBhIGRvd25sb2FkIElEIGZvciBhIHNwZWNpZmljIG1ldGFkYXRhIFVSSS4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGRvd25sb2FkIGZvciBhIG1ldGFkYXRhIFVSSSBpcyBzdGFydGluZy4gSXQgd2lsbAotICAgICAqIHJlZ2lzdGVyIHRoZSBkb3dubG9hZCBJRCBmb3IgYWxsIGNsaWVudHMgdXNpbmcgdGhpcyBtZXRhZGF0YSBVUkkgaW50byB0aGUgZGF0YWJhc2UKLSAgICAgKiBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHtAbGluayAjZ2V0RG93bmxvYWRSZWNvcmRzRm9yRG93bmxvYWRJZChDb250ZXh0LCBsb25nKX0uCisgICAgICogc2VhcmNoIGZvciBhbGwgY2xpZW50cyB1c2luZyB0aGlzIG1ldGFkYXRhIFVSSSBhbmQgd2lsbCByZWdpc3RlciBmb3IgZWFjaCBvZiB0aGVtCisgICAgICogdGhlIGRvd25sb2FkIElEIGludG8gdGhlIGRhdGFiYXNlIGZvciBsYXRlciByZXRyaWV2YWwgYnkKKyAgICAgKiB7QGxpbmsgI2dldERvd25sb2FkUmVjb3Jkc0ZvckRvd25sb2FkSWQoQ29udGV4dCwgbG9uZyl9LgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0IGZvciBvcGVuaW5nIGRhdGFiYXNlcwogICAgICAqIEBwYXJhbSB1cmkgdGhlIG1ldGFkYXRhIFVSSQpAQCAtNzkyLDggKzgxNiwyMiBAQAogICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CiAgICAgICAgIHZhbHVlcy5wdXQoQ0xJRU5UX1BFTkRJTkdJRF9DT0xVTU4sIGRvd25sb2FkSWQpOwogICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCAiIik7Ci0gICAgICAgIGRlZmF1bHREYi51cGRhdGUoQ0xJRU5UX1RBQkxFX05BTUUsIHZhbHVlcywKLSAgICAgICAgICAgICAgICBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgdXJpIH0pOworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gTWV0YWRhdGFEYkhlbHBlci5xdWVyeUNsaWVudElkcyhjb250ZXh0KTsKKyAgICAgICAgaWYgKG51bGwgPT0gY3Vyc29yKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0YWRhdGFVcmkgPQorICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFVcmkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERiLnVwZGF0ZShDTElFTlRfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyBjbGllbnRJZCB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YVVyaUdldHRlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFVcmlHZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgxNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFVcmlHZXR0ZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKKworLyoqCisgKiBIZWxwZXIgdG8gZ2V0IHRoZSBtZXRhZGF0YSBVUkkgZnJvbSBpdHMgYmFzZSBVUkkgYW5kIHRoZSBhZGRpdGlvbmFsIElELCBpZiBhbnkuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YVVyaUdldHRlciB7CisgICAgcHJpdmF0ZSBNZXRhZGF0YVVyaUdldHRlcigpIHsKKyAgICAgICAgLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgbm90IGluc3RhbnRpYWJsZS4KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVcmkoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgYmFzZVVyaSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhZGRpdGlvbmFsSWQpIHsKKyAgICAgICAgcmV0dXJuIGJhc2VVcmk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svUHJpdmF0ZUxvZy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svUHJpdmF0ZUxvZy5qYXZhCmluZGV4IDg1OTNjMWMuLjY3ZGQ3YjkgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1ByaXZhdGVMb2cuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Qcml2YXRlTG9nLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CkBAIC0yNCw2ICsyMyw3IEBACiAKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKICAqIENsYXNzIHRvIGtlZXAgbG9uZy10ZXJtIGxvZy4gVGhpcyBpcyBpbmFjdGl2ZSBpbiBwcm9kdWN0aW9uLCBhbmQgaXMgb25seSBmb3IgZGVidWcgcHVycG9zZXMuCkBAIC00NCwxMCArNDQsMTAgQEAKICAgICAgICAgICAgICsgQ09MVU1OX0VWRU5UICsgIiBURVhUKTsiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzRGF0ZUZvcm1hdCA9Ci0gICAgICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbTpzcyIpOworICAgICAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQgSEg6bW06c3MiLCBMb2NhbGUuVVMpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgUHJpdmF0ZUxvZyBzSW5zdGFuY2UgPSBuZXcgUHJpdmF0ZUxvZygpOwotICAgIHByaXZhdGUgc3RhdGljIERlYnVnSGVscGVyIG1EZWJ1Z0hlbHBlciA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgRGVidWdIZWxwZXIgc0RlYnVnSGVscGVyID0gbnVsbDsKIAogICAgIHByaXZhdGUgUHJpdmF0ZUxvZygpIHsKICAgICB9CkBAIC01NSw4ICs1NSw4IEBACiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJpdmF0ZUxvZyBnZXRJbnN0YW5jZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKCFERUJVRykgcmV0dXJuIHNJbnN0YW5jZTsKICAgICAgICAgc3luY2hyb25pemVkKFByaXZhdGVMb2cuY2xhc3MpIHsKLSAgICAgICAgICAgIGlmIChzSW5zdGFuY2UubURlYnVnSGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UubURlYnVnSGVscGVyID0gbmV3IERlYnVnSGVscGVyKGNvbnRleHQpOworICAgICAgICAgICAgaWYgKHNEZWJ1Z0hlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0RlYnVnSGVscGVyID0gbmV3IERlYnVnSGVscGVyKGNvbnRleHQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICAgICAgfQpAQCAtOTQsMTYgKzk0LDkgQEAKIAogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIGV2ZW50LCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBldmVudCkgewogICAgICAgICBpZiAoIURFQlVHKSByZXR1cm47Ci0gICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGwgPSBnZXRJbnN0YW5jZShjb250ZXh0KS5tRGVidWdIZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwotICAgICAgICBtRGVidWdIZWxwZXIuaW5zZXJ0KGwsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBldmVudCwgQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIGlmICghREVCVUcpIHJldHVybjsKLSAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgbCA9Ci0gICAgICAgICAgICAgICAgZ2V0SW5zdGFuY2UocHJvdmlkZXIuZ2V0Q29udGV4dCgpKS5tRGVidWdIZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwotICAgICAgICBtRGVidWdIZWxwZXIuaW5zZXJ0KGwsIGV2ZW50KTsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgbCA9IHNEZWJ1Z0hlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIERlYnVnSGVscGVyLmluc2VydChsLCBldmVudCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svVXBkYXRlSGFuZGxlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svVXBkYXRlSGFuZGxlci5qYXZhCmluZGV4IDMxNzNlOTEuLjNmOTE3ZjEgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1VwZGF0ZUhhbmRsZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VcGRhdGVIYW5kbGVyLmphdmEKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGFkYXRhVXJpID0KICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0TWV0YWRhdGFVcmlBc1N0cmluZyhjb250ZXh0LCBjbGllbnRJZCk7Ci0gICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlVwZGF0ZSBmb3IgY2xpZW50SWQgIiArIFV0aWxzLnMoY2xpZW50SWQpLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiVXBkYXRlIGZvciBjbGllbnRJZCAiICsgVXRpbHMucyhjbGllbnRJZCkpOwogICAgICAgICAgICAgICAgIFV0aWxzLmwoIlVwZGF0ZSBmb3IgY2xpZW50SWQiLCBjbGllbnRJZCwgIiB3aGljaCB1c2VzIFVSSSAiLCBtZXRhZGF0YVVyaSk7CiAgICAgICAgICAgICAgICAgdXJpcy5hZGQobWV0YWRhdGFVcmkpOwogICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CkBAIC0yMTEsOCArMjExLDEzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVDbGllbnRzV2l0aE1ldGFkYXRhVXJpKGZpbmFsIENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXBkYXRlTm93LCBmaW5hbCBTdHJpbmcgbWV0YWRhdGFVcmkpIHsKLSAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlVwZGF0ZSBmb3IgbWV0YWRhdGEgVVJJICIgKyBVdGlscy5zKG1ldGFkYXRhVXJpKSwgY29udGV4dCk7Ci0gICAgICAgIGZpbmFsIFJlcXVlc3QgbWV0YWRhdGFSZXF1ZXN0ID0gbmV3IFJlcXVlc3QoVXJpLnBhcnNlKG1ldGFkYXRhVXJpKSk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJVcGRhdGUgZm9yIG1ldGFkYXRhIFVSSSAiICsgVXRpbHMucyhtZXRhZGF0YVVyaSkpOworICAgICAgICAvLyBBZGRpbmcgYSBkaXNhbWJpZ3VhdG9yIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4gb2xkZXIgdmVyc2lvbnMgb2YgRG93bmxvYWRNYW5hZ2VyLgorICAgICAgICAvLyBEb3dubG9hZE1hbmFnZXIgYWxzbyBzdHVwaWRseSBjdXRzIHRoZSBleHRlbnNpb24gdG8gcmVwbGFjZSB3aXRoIGl0cyBvd24gdGhhdCBpdAorICAgICAgICAvLyBnZXRzIGZyb20gdGhlIGNvbnRlbnQtdHlwZS4gV2UgbmVlZCB0byBjaXJjdW12ZW50IHRoaXMuCisgICAgICAgIGZpbmFsIFN0cmluZyBkaXNhbWJpZ3VhdG9yID0gIiMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgICAgICArIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlV0aWxzLmdldFZlcnNpb25OYW1lKGNvbnRleHQpICsgIi5qc29uIjsKKyAgICAgICAgZmluYWwgUmVxdWVzdCBtZXRhZGF0YVJlcXVlc3QgPSBuZXcgUmVxdWVzdChVcmkucGFyc2UobWV0YWRhdGFVcmkgKyBkaXNhbWJpZ3VhdG9yKSk7CiAgICAgICAgIFV0aWxzLmwoIlJlcXVlc3QgPSIsIG1ldGFkYXRhUmVxdWVzdCk7CiAKICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CkBAIC0yNTcsNyArMjYyLDcgQEAKICAgICAgICAgICAgIC8vIG1ldGhvZCB3aWxsIGlnbm9yZSBpdC4KICAgICAgICAgICAgIHdyaXRlTWV0YWRhdGFEb3dubG9hZElkKGNvbnRleHQsIG1ldGFkYXRhVXJpLCBkb3dubG9hZElkKTsKICAgICAgICAgfQotICAgICAgICBQcml2YXRlTG9nLmxvZygiUmVxdWVzdGVkIGRvd25sb2FkIHdpdGggaWQgIiArIGRvd25sb2FkSWQsIGNvbnRleHQpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiUmVxdWVzdGVkIGRvd25sb2FkIHdpdGggaWQgIiArIGRvd25sb2FkSWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzUxLDcgKzM1NiwxMyBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5VcmkgPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoRG93bmxvYWRNYW5hZ2VyLkNPTFVNTl9VUkkpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBlcnJvciA9IGN1cnNvci5nZXRJbnQoY29sdW1uRXJyb3IpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IGN1cnNvci5nZXRJbnQoY29sdW1uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cmkgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtblVyaSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaVdpdGhBbmNob3IgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtblVyaSk7CisgICAgICAgICAgICAgICAgaW50IGFuY2hvckluZGV4ID0gdXJpV2l0aEFuY2hvci5pbmRleE9mKCcjJyk7CisgICAgICAgICAgICAgICAgaWYgKGFuY2hvckluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHVyaSA9IHVyaVdpdGhBbmNob3Iuc3Vic3RyaW5nKDAsIGFuY2hvckluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1cmkgPSB1cmlXaXRoQW5jaG9yOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoRG93bmxvYWRNYW5hZ2VyLlNUQVRVU19TVUNDRVNTRlVMICE9IHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJQZXJtYW5lbnQgZmFpbHVyZSBvZiBkb3dubG9hZCAiICsgZG93bmxvYWRJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGVycm9yIGNvZGU6ICIgKyBlcnJvcik7CkBAIC00MDQsNyArNDE1LDcgQEAKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyB2b2lkIGRvd25sb2FkRmluaXNoZWQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIC8vIEdldCBhbmQgY2hlY2sgdGhlIElEIG9mIHRoZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQKICAgICAgICAgZmluYWwgbG9uZyBmaWxlSWQgPSBpbnRlbnQuZ2V0TG9uZ0V4dHJhKERvd25sb2FkTWFuYWdlci5FWFRSQV9ET1dOTE9BRF9JRCwgTk9UX0FOX0lEKTsKLSAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkRvd25sb2FkIGZpbmlzaGVkIHdpdGggaWQgIiArIGZpbGVJZCwgY29udGV4dCk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJEb3dubG9hZCBmaW5pc2hlZCB3aXRoIGlkICIgKyBmaWxlSWQpOwogICAgICAgICBVdGlscy5sKCJEb3dubG9hZEZpbmlzaGVkIHdpdGggaWQiLCBmaWxlSWQpOwogICAgICAgICBpZiAoTk9UX0FOX0lEID09IGZpbGVJZCkgcmV0dXJuOyAvLyBTcHVyaW91cyB3YWtlLXVwOiBpZ25vcmUKIApAQCAtNDkxLDcgKzUwMiw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1Ymxpc2hVcGRhdGVDeWNsZUNvbXBsZXRlZEV2ZW50KGZpbmFsIENvbnRleHQgY29udGV4dCkgewogICAgICAgICAvLyBFdmVuIGlmIHRoaXMgaXMgbm90IHN1Y2Nlc3NmdWwsIHdlIGhhdmUgdG8gcHVibGlzaCB0aGUgbmV3IHN0YXRlLgotICAgICAgICBQcml2YXRlTG9nLmxvZygiUHVibGlzaGluZyB1cGRhdGUgY3ljbGUgY29tcGxldGVkIGV2ZW50IiwgY29udGV4dCk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJQdWJsaXNoaW5nIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZWQgZXZlbnQiKTsKICAgICAgICAgVXRpbHMubCgiUHVibGlzaGluZyB1cGRhdGUgY3ljbGUgY29tcGxldGVkIGV2ZW50Iik7CiAgICAgICAgIGZvciAoVXBkYXRlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpbmtlZENvcHlPZkxpc3Qoc1VwZGF0ZUV2ZW50TGlzdGVuZXJzKSkgewogICAgICAgICAgICAgbGlzdGVuZXIudXBkYXRlQ3ljbGVDb21wbGV0ZWQoKTsKQEAgLTU4Miw3ICs1OTMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgVXRpbHMubCgiRG93bmxvYWRlZCBtZXRhZGF0YSA6IiwgbmV3TWV0YWRhdGEpOwotICAgICAgICBQcml2YXRlTG9nLmxvZygiRG93bmxvYWRlZCBtZXRhZGF0YVxuIiArIG5ld01ldGFkYXRhLCBjb250ZXh0KTsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkRvd25sb2FkZWQgbWV0YWRhdGFcbiIgKyBuZXdNZXRhZGF0YSk7CiAKICAgICAgICAgZmluYWwgQWN0aW9uQmF0Y2ggYWN0aW9ucyA9IGNvbXB1dGVVcGdyYWRlVG8oY29udGV4dCwgY2xpZW50SWQsIG5ld01ldGFkYXRhKTsKICAgICAgICAgLy8gVE9ETzogQ2hlY2sgd2l0aCBVWCBob3cgd2Ugc2hvdWxkIHJlcG9ydCB0byB0aGUgdXNlcgpAQCAtNjEwLDcgKzYyMSw3IEBACiAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5ERVNDUklQVElPTl9DT0xVTU4pLCAiZm9yIiwgZG93bmxvYWRSZWNvcmQubUNsaWVudElkKTsKICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkRvd25sb2FkZWQgYSBuZXcgd29yZCBsaXN0IHdpdGggZGVzY3JpcHRpb24gOiAiCiAgICAgICAgICAgICAgICAgKyBkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkRFU0NSSVBUSU9OX0NPTFVNTikKLSAgICAgICAgICAgICAgICArICIgZm9yICIgKyBkb3dubG9hZFJlY29yZC5tQ2xpZW50SWQsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICsgIiBmb3IgIiArIGRvd25sb2FkUmVjb3JkLm1DbGllbnRJZCk7CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZSA9CiAgICAgICAgICAgICAgICAgZG93bmxvYWRSZWNvcmQubUF0dHJpYnV0ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1dvcmRMaXN0UHJlZmVyZW5jZS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEKaW5kZXggMGQ5MjNhZS4uNDUxYTBmYiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKIApAQCAtMzYsNyArMzcsNyBAQAogICogcGFjay4gVXBvbiBiZWluZyBwcmVzc2VkLCBpdCBkaXNwbGF5cyBhIG1lbnUgdG8gYWxsb3cgdGhlIHVzZXIgdG8gaW5zdGFsbCwgZGlzYWJsZSwKICAqIGVuYWJsZSBvciBkZWxldGUgaXQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QuCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXb3JkTGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBEaWFsb2dQcmVmZXJlbmNlIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JkTGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBQcmVmZXJlbmNlIHsKICAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgVEFHID0gV29yZExpc3RQcmVmZXJlbmNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKIAogICAgIC8vIFdoYXQgdG8gZGlzcGxheSBpbiB0aGUgInN0YXR1cyIgZmllbGQgd2hlbiB3ZSByZWNlaXZlIHVua25vd24gZGF0YSBhcyBhIHN0YXR1cyBmcm9tCkBAIC01NywyNiArNTgsMzIgQEAKICAgICAvLyBUaGUgbWV0YWRhdGEgd29yZCBsaXN0IGlkIGFuZCB2ZXJzaW9uIG9mIHRoaXMgd29yZCBsaXN0LgogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVdvcmRsaXN0SWQ7CiAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKKyAgICBwdWJsaWMgZmluYWwgTG9jYWxlIG1Mb2NhbGU7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRpb247CiAgICAgLy8gVGhlIHN0YXR1cwogICAgIHB1YmxpYyBpbnQgbVN0YXR1czsKKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgZGljdGlvbmFyeSBmaWxlCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZpbGVzaXplOwogCi0gICAgLy8gQW5pbWF0aW9uIGRpcmVjdGlvbnMKLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgQU5JTUFUSU9OX0lOID0gMTsKLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgQU5JTUFUSU9OX09VVCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCdXR0b24gc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIERpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUgbUludGVyZmFjZVN0YXRlOwogICAgIHByaXZhdGUgZmluYWwgT25Xb3JkTGlzdFByZWZlcmVuY2VDbGljayBtUHJlZmVyZW5jZUNsaWNrSGFuZGxlciA9CiAgICAgICAgICAgICBuZXcgT25Xb3JkTGlzdFByZWZlcmVuY2VDbGljaygpOwogICAgIHByaXZhdGUgZmluYWwgT25BY3Rpb25CdXR0b25DbGljayBtQWN0aW9uQnV0dG9uQ2xpY2tIYW5kbGVyID0KICAgICAgICAgICAgIG5ldyBPbkFjdGlvbkJ1dHRvbkNsaWNrKCk7CiAKLSAgICBwdWJsaWMgV29yZExpc3RQcmVmZXJlbmNlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLCBmaW5hbCBMb2NhbGUgbG9jYWxlLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICBwdWJsaWMgV29yZExpc3RQcmVmZXJlbmNlKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIERpY3Rpb25hcnlMaXN0SW50ZXJmYWNlU3RhdGUgZGljdGlvbmFyeUxpc3RJbnRlcmZhY2VTdGF0ZSwgZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQsIGZpbmFsIGludCB2ZXJzaW9uLCBmaW5hbCBMb2NhbGUgbG9jYWxlLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBpbnQgZmlsZXNpemUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUludGVyZmFjZVN0YXRlID0gZGljdGlvbmFyeUxpc3RJbnRlcmZhY2VTdGF0ZTsKICAgICAgICAgbUNsaWVudElkID0gY2xpZW50SWQ7CiAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKICAgICAgICAgbVdvcmRsaXN0SWQgPSB3b3JkbGlzdElkOworICAgICAgICBtRmlsZXNpemUgPSBmaWxlc2l6ZTsKKyAgICAgICAgbUxvY2FsZSA9IGxvY2FsZTsKKyAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CiAKICAgICAgICAgc2V0TGF5b3V0UmVzb3VyY2UoUi5sYXlvdXQuZGljdGlvbmFyeV9saW5lKTsKIApAQCAtODksMTIgKzk2LDYgQEAKICAgICAgICAgaWYgKHN0YXR1cyA9PSBtU3RhdHVzKSByZXR1cm47CiAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgIHNldFN1bW1hcnkoZ2V0U3VtbWFyeShzdGF0dXMpKTsKLSAgICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBkaWFsb2csIHdlIHNob3VsZCB1cGRhdGUgaXQsIG9yIGF0IGxlYXN0Ci0gICAgICAgIC8vIGRpc21pc3MgaXQuCi0gICAgICAgIGZpbmFsIERpYWxvZyBkaWFsb2cgPSBnZXREaWFsb2coKTsKLSAgICAgICAgaWYgKG51bGwgIT0gZGlhbG9nKSB7Ci0gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3VtbWFyeShmaW5hbCBpbnQgc3RhdHVzKSB7CkBAIC0xMTcsMjkgKzExOCwzMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gVGhlIHRhYmxlIGJlbG93IG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTXyogc2luY2UgaXQgdXNlcworICAgIC8vIHRoZSB2YWx1ZXMgYXMgaW5kaWNlcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc1N0YXR1c0FjdGlvbkxpc3RbXVtdID0gewogICAgICAgICAvLyBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19VTktOT1dOCiAgICAgICAgIHt9LAogICAgICAgICAvLyBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUKLSAgICAgICAgeyBSLnN0cmluZy5pbnN0YWxsX2RpY3QsIEFDVElPTl9FTkFCTEVfRElDVCB9LAorICAgICAgICB7IEJ1dHRvblN3aXRjaGVyLlNUQVRVU19JTlNUQUxMLCBBQ1RJT05fRU5BQkxFX0RJQ1QgfSwKICAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRE9XTkxPQURJTkcKLSAgICAgICAgeyBSLnN0cmluZy5jYW5jZWxfZG93bmxvYWRfZGljdCwgQUNUSU9OX0RJU0FCTEVfRElDVCB9LAorICAgICAgICB7IEJ1dHRvblN3aXRjaGVyLlNUQVRVU19DQU5DRUwsIEFDVElPTl9ESVNBQkxFX0RJQ1QgfSwKICAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVECi0gICAgICAgIHsgUi5zdHJpbmcuZGVsZXRlX2RpY3QsIEFDVElPTl9ERUxFVEVfRElDVCB9LAorICAgICAgICB7IEJ1dHRvblN3aXRjaGVyLlNUQVRVU19ERUxFVEUsIEFDVElPTl9ERUxFVEVfRElDVCB9LAogICAgICAgICAvLyBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRAotICAgICAgICB7IFIuc3RyaW5nLmRlbGV0ZV9kaWN0LCBBQ1RJT05fREVMRVRFX0RJQ1QgfSwKKyAgICAgICAgeyBCdXR0b25Td2l0Y2hlci5TVEFUVVNfREVMRVRFLCBBQ1RJT05fREVMRVRFX0RJQ1QgfSwKICAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcKICAgICAgICAgLy8gV2Ugc2hvdyAnaW5zdGFsbCcgYmVjYXVzZSB0aGUgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSBkZWxldGVkLgogICAgICAgICAvLyBUaGUgdXNlciBtYXkgcmVpbnN0YWxsIGl0LgotICAgICAgICB7IFIuc3RyaW5nLmluc3RhbGxfZGljdCwgQUNUSU9OX0VOQUJMRV9ESUNUIH0KKyAgICAgICAgeyBCdXR0b25Td2l0Y2hlci5TVEFUVVNfSU5TVEFMTCwgQUNUSU9OX0VOQUJMRV9ESUNUIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0QnV0dG9uTGFiZWwoZmluYWwgaW50IHN0YXR1cykgeworICAgIHByaXZhdGUgaW50IGdldEJ1dHRvblN3aXRjaGVyU3RhdHVzKGZpbmFsIGludCBzdGF0dXMpIHsKICAgICAgICAgaWYgKHN0YXR1cyA+PSBzU3RhdHVzQWN0aW9uTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gc3RhdHVzICIgKyBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgcmV0dXJuIEJ1dHRvblN3aXRjaGVyLlNUQVRVU19OT19CVVRUT047CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFN0cmluZyhzU3RhdHVzQWN0aW9uTGlzdFtzdGF0dXNdWzBdKTsKKyAgICAgICAgcmV0dXJuIHNTdGF0dXNBY3Rpb25MaXN0W3N0YXR1c11bMF07CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFjdGlvbklkRnJvbVN0YXR1c0FuZE1lbnVFbnRyeShmaW5hbCBpbnQgc3RhdHVzKSB7CkBAIC0xOTQsMzYgKzE5Nyw3MCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZFZpZXcoZmluYWwgVmlldyB2aWV3KSB7CiAgICAgICAgIHN1cGVyLm9uQmluZFZpZXcodmlldyk7CiAgICAgICAgICgoVmlld0dyb3VwKXZpZXcpLnNldExheW91dFRyYW5zaXRpb24obnVsbCk7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKXZpZXcuZmluZFZpZXdCeUlkKFIuaWQud29yZGxpc3RfYnV0dG9uKTsKLSAgICAgICAgYnV0dG9uLnNldFRleHQoZ2V0QnV0dG9uTGFiZWwobVN0YXR1cykpOwotICAgICAgICBidXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUFjdGlvbkJ1dHRvbkNsaWNrSGFuZGxlcik7CisKKyAgICAgICAgZmluYWwgRGljdGlvbmFyeURvd25sb2FkUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIgPQorICAgICAgICAgICAgICAgIChEaWN0aW9uYXJ5RG93bmxvYWRQcm9ncmVzc0Jhcil2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmRpY3Rpb25hcnlfbGluZV9wcm9ncmVzc19iYXIpOworICAgICAgICBmaW5hbCBUZXh0VmlldyBzdGF0dXMgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLnN1bW1hcnkpOworICAgICAgICBwcm9ncmVzc0Jhci5zZXRJZHMobUNsaWVudElkLCBtV29yZGxpc3RJZCk7CisgICAgICAgIHByb2dyZXNzQmFyLnNldE1heChtRmlsZXNpemUpOworICAgICAgICBmaW5hbCBib29sZWFuIHNob3dQcm9ncmVzc0JhciA9IChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ET1dOTE9BRElORyA9PSBtU3RhdHVzKTsKKyAgICAgICAgc3RhdHVzLnNldFZpc2liaWxpdHkoc2hvd1Byb2dyZXNzQmFyID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICBwcm9ncmVzc0Jhci5zZXRWaXNpYmlsaXR5KHNob3dQcm9ncmVzc0JhciA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFKTsKKworICAgICAgICBmaW5hbCBCdXR0b25Td2l0Y2hlciBidXR0b25Td2l0Y2hlciA9CisgICAgICAgICAgICAgICAgKEJ1dHRvblN3aXRjaGVyKXZpZXcuZmluZFZpZXdCeUlkKFIuaWQud29yZGxpc3RfYnV0dG9uX3N3aXRjaGVyKTsKKyAgICAgICAgaWYgKG1JbnRlcmZhY2VTdGF0ZS5pc09wZW4obVdvcmRsaXN0SWQpKSB7CisgICAgICAgICAgICAvLyBUaGUgYnV0dG9uIGlzIG9wZW4uCisgICAgICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNTdGF0dXMgPSBtSW50ZXJmYWNlU3RhdGUuZ2V0U3RhdHVzKG1Xb3JkbGlzdElkKTsKKyAgICAgICAgICAgIGJ1dHRvblN3aXRjaGVyLnNldFN0YXR1c0FuZFVwZGF0ZVZpc3VhbHMoZ2V0QnV0dG9uU3dpdGNoZXJTdGF0dXMocHJldmlvdXNTdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXR1cyAhPSBtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgY29tZSBoZXJlIGlmIHRoZSBzdGF0dXMgaGFzIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lLiBXZSBuZWVkIHRvIGFuaW1hdGUKKyAgICAgICAgICAgICAgICAvLyB0aGUgdHJhbnNpdGlvbi4KKyAgICAgICAgICAgICAgICBidXR0b25Td2l0Y2hlci5zZXRTdGF0dXNBbmRVcGRhdGVWaXN1YWxzKGdldEJ1dHRvblN3aXRjaGVyU3RhdHVzKG1TdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtSW50ZXJmYWNlU3RhdGUuc2V0T3BlbihtV29yZGxpc3RJZCwgbVN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgYnV0dG9uIGlzIGNsb3NlZC4KKyAgICAgICAgICAgIGJ1dHRvblN3aXRjaGVyLnNldFN0YXR1c0FuZFVwZGF0ZVZpc3VhbHMoQnV0dG9uU3dpdGNoZXIuU1RBVFVTX05PX0JVVFRPTik7CisgICAgICAgIH0KKyAgICAgICAgYnV0dG9uU3dpdGNoZXIuc2V0SW50ZXJuYWxPbkNsaWNrTGlzdGVuZXIobUFjdGlvbkJ1dHRvbkNsaWNrSGFuZGxlcik7CiAgICAgICAgIHZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1QcmVmZXJlbmNlQ2xpY2tIYW5kbGVyKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2sgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIFZpZXcgdikgewotICAgICAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC53b3JkbGlzdF9idXR0b24pOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihzTGFzdENsaWNrZWRBY3Rpb25CdXR0b24sIEFOSU1BVElPTl9PVVQpOworICAgICAgICAgICAgLy8gTm90ZSA6IHYgaXMgdGhlIHByZWZlcmVuY2UgdmlldworICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwYXJlbnQgPSB2LmdldFBhcmVudCgpOworICAgICAgICAgICAgLy8gSnVzdCBpbiBjYXNlIHNvbWV0aGluZyBjaGFuZ2VkIGluIHRoZSBmcmFtZXdvcmssIHRlc3QgZm9yIHRoZSBjb25jcmV0ZSBjbGFzcworICAgICAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgTGlzdFZpZXcpKSByZXR1cm47CisgICAgICAgICAgICBmaW5hbCBMaXN0VmlldyBsaXN0VmlldyA9IChMaXN0VmlldylwYXJlbnQ7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXhUb09wZW47CisgICAgICAgICAgICAvLyBDbG9zZSBhbGwgZmlyc3QsIHdlJ2xsIG9wZW4gYmFjayBhbnkgaXRlbSB0aGF0IG5lZWRzIHRvIGJlIG9wZW4uCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHdhc09wZW4gPSBtSW50ZXJmYWNlU3RhdGUuaXNPcGVuKG1Xb3JkbGlzdElkKTsKKyAgICAgICAgICAgIG1JbnRlcmZhY2VTdGF0ZS5jbG9zZUFsbCgpOworICAgICAgICAgICAgaWYgKHdhc09wZW4pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGJ1dHRvbiBiZWluZyBzaG93bi4gVGFrZSBub3RlIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBvcGVuIGFueSBidXR0b24gaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gbG9vcCBiZWxvdy4KKyAgICAgICAgICAgICAgICBpbmRleFRvT3BlbiA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGJ1dHRvbiB3YXMgbm90IGJlaW5nIHNob3duLiBPcGVuIGl0LCBhbmQgcmVtZW1iZXIgdGhlIGluZGV4IG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBjaGlsZCBhcyB0aGUgb25lIHRvIG9wZW4gaW4gdGhlIGZvbGxvd2luZyBsb29wLgorICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VTdGF0ZS5zZXRPcGVuKG1Xb3JkbGlzdElkLCBtU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpbmRleFRvT3BlbiA9IGxpc3RWaWV3LmluZGV4T2ZDaGlsZCh2KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFuaW1hdGVCdXR0b24oYnV0dG9uLCBBTklNQVRJT05fSU4pOwotICAgICAgICAgICAgc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uID0gYnV0dG9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVCdXR0b24oZmluYWwgQnV0dG9uIGJ1dHRvbiwgZmluYWwgaW50IGRpcmVjdGlvbikgewotICAgICAgICBmaW5hbCBmbG9hdCBvdXRlclggPSAoKFZpZXcpYnV0dG9uLmdldFBhcmVudCgpKS5nZXRXaWR0aCgpOwotICAgICAgICBmaW5hbCBmbG9hdCBpbm5lclggPSBidXR0b24uZ2V0WCgpIC0gYnV0dG9uLmdldFRyYW5zbGF0aW9uWCgpOwotICAgICAgICBpZiAoVmlldy5JTlZJU0lCTEUgPT0gYnV0dG9uLmdldFZpc2liaWxpdHkoKSkgewotICAgICAgICAgICAgYnV0dG9uLnNldFRyYW5zbGF0aW9uWChvdXRlclggLSBpbm5lclgpOwotICAgICAgICAgICAgYnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQU5JTUFUSU9OX0lOID09IGRpcmVjdGlvbikgewotICAgICAgICAgICAgYnV0dG9uLmFuaW1hdGUoKS50cmFuc2xhdGlvblgoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidXR0b24uYW5pbWF0ZSgpLnRyYW5zbGF0aW9uWChvdXRlclggLSBpbm5lclgpOworICAgICAgICAgICAgZmluYWwgaW50IGxhc3REaXNwbGF5ZWRJbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxpc3RWaWV3LmdldExhc3RWaXNpYmxlUG9zaXRpb24oKSAtIGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgICAgICAvLyBUaGUgImxhc3REaXNwbGF5ZWRJbmRleCIgaXMgYWN0dWFsbHkgZGlzcGxheWVkLCBoZW5jZSB0aGUgPD0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3REaXNwbGF5ZWRJbmRleDsgKytpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQnV0dG9uU3dpdGNoZXIgYnV0dG9uU3dpdGNoZXIgPSAoQnV0dG9uU3dpdGNoZXIpbGlzdFZpZXcuZ2V0Q2hpbGRBdChpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRWaWV3QnlJZChSLmlkLndvcmRsaXN0X2J1dHRvbl9zd2l0Y2hlcik7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gaW5kZXhUb09wZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3dpdGNoZXIuc2V0U3RhdHVzQW5kVXBkYXRlVmlzdWFscyhnZXRCdXR0b25Td2l0Y2hlclN0YXR1cyhtU3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3dpdGNoZXIuc2V0U3RhdHVzQW5kVXBkYXRlVmlzdWFscyhCdXR0b25Td2l0Y2hlci5TVEFUVVNfTk9fQlVUVE9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5LmphdmEKaW5kZXggZDE2MDAzOC4uMTU1MGU3NyAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5LmphdmEKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIC8qKiBIaXQgYm91bmRpbmcgYm94IG9mIHRoZSBrZXkgKi8KICAgICBwdWJsaWMgZmluYWwgUmVjdCBtSGl0Qm94ID0gbmV3IFJlY3QoKTsKIAotICAgIC8qKiBNb3JlIGtleXMgKi8KKyAgICAvKiogTW9yZSBrZXlzLiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhpcyBpcyBudWxsIG9yIGFuIGFycmF5IG9mIG9uZSBvciBtb3JlIGVsZW1lbnRzICovCiAgICAgcHVibGljIGZpbmFsIE1vcmVLZXlTcGVjW10gbU1vcmVLZXlzOwogICAgIC8qKiBNb3JlIGtleXMgY29sdW1uIG51bWJlciBhbmQgZmxhZ3MgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCBtTW9yZUtleXNDb2x1bW5BbmRGbGFnczsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkQWN0aW9uTGlzdGVuZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkQWN0aW9uTGlzdGVuZXIuamF2YQppbmRleCBjNzZhY2QxLi45ZWVlZTViIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9LZXlib2FyZEFjdGlvbkxpc3RlbmVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0yNyw4ICsyNyw5IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJpbWFyeUNvZGUgdGhlIHVuaWNvZGUgb2YgdGhlIGtleSBiZWluZyBwcmVzc2VkLiBJZiB0aGUgdG91Y2ggaXMgbm90IG9uIGEgdmFsaWQga2V5LAogICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHdpbGwgYmUgemVyby4KKyAgICAgKiBAcGFyYW0gaXNTaW5nbGVQb2ludGVyIHRydWUgaWYgcHJlc3NpbmcgaGFzIG9jY3VycmVkIHdoaWxlIG5vIG90aGVyIGtleSBpcyBiZWluZyBwcmVzc2VkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uUHJlc3NLZXkoaW50IHByaW1hcnlDb2RlKTsKKyAgICBwdWJsaWMgdm9pZCBvblByZXNzS2V5KGludCBwcmltYXJ5Q29kZSwgYm9vbGVhbiBpc1NpbmdsZVBvaW50ZXIpOwogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgYSBrZXkuIFRoaXMgaXMgc2VudCBhZnRlciB0aGUge0BsaW5rICNvbkNvZGVJbnB1dH0gaXMgY2FsbGVkLgpAQCAtODgsMTQgKzg5LDIxIEBACiAgICAgcHVibGljIHZvaWQgb25DYW5jZWxJbnB1dCgpOwogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdXNlciBmaW5pc2hlZCBzbGlkaW5nIGtleSBpbnB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaFNsaWRpbmdJbnB1dCgpOworCisgICAgLyoqCiAgICAgICogU2VuZCBhIG5vbi0iY29kZSBpbnB1dCIgY3VzdG9tIHJlcXVlc3QgdG8gdGhlIGxpc3RlbmVyLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb25zdW1lZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uQ3VzdG9tUmVxdWVzdChpbnQgcmVxdWVzdENvZGUpOwogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyIGltcGxlbWVudHMgS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWRhcHRlciBFTVBUWV9MSVNURU5FUiA9IG5ldyBBZGFwdGVyKCk7CisKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlc3NLZXkoaW50IHByaW1hcnlDb2RlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXNzS2V5KGludCBwcmltYXJ5Q29kZSwgYm9vbGVhbiBpc1NpbmdsZVBvaW50ZXIpIHt9CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2VLZXkoaW50IHByaW1hcnlDb2RlLCBib29sZWFuIHdpdGhTbGlkaW5nKSB7fQogICAgICAgICBAT3ZlcnJpZGUKQEAgLTExMyw2ICsxMjEsOCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWxJbnB1dCgpIHt9CiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaFNsaWRpbmdJbnB1dCgpIHt9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkN1c3RvbVJlcXVlc3QoaW50IHJlcXVlc3RDb2RlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkSWQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkSWQuamF2YQppbmRleCBlZThlZTlhLi5hYTI3MDY3IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9LZXlib2FyZElkLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5Ym9hcmRJZC5qYXZhCkBAIC01NiwxMyArNTYsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfUEhPTkVfU1lNQk9MUyA9IDg7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9OVU1CRVIgPSA5OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STV9GQUNUT1JfUEhPTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1fRkFDVE9SX1RBQkxFVDcgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1fRkFDVE9SX1RBQkxFVDEwID0gMjsKLQogICAgIHB1YmxpYyBmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgbVN1YnR5cGU7CiAgICAgcHVibGljIGZpbmFsIExvY2FsZSBtTG9jYWxlOwotICAgIHB1YmxpYyBmaW5hbCBpbnQgbURldmljZUZvcm1GYWN0b3I7CiAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgbWVtYmVyLiBJdCBpcyB1c2VkIG9ubHkgZm9yIGxvZ2dpbmcgcHVycG9zZS4KICAgICBwdWJsaWMgZmluYWwgaW50IG1PcmllbnRhdGlvbjsKICAgICBwdWJsaWMgZmluYWwgaW50IG1XaWR0aDsKQEAgLTgyLDcgKzc3LDYgQEAKICAgICBwdWJsaWMgS2V5Ym9hcmRJZChmaW5hbCBpbnQgZWxlbWVudElkLCBmaW5hbCBLZXlib2FyZExheW91dFNldC5QYXJhbXMgcGFyYW1zKSB7CiAgICAgICAgIG1TdWJ0eXBlID0gcGFyYW1zLm1TdWJ0eXBlOwogICAgICAgICBtTG9jYWxlID0gU3VidHlwZUxvY2FsZS5nZXRTdWJ0eXBlTG9jYWxlKG1TdWJ0eXBlKTsKLSAgICAgICAgbURldmljZUZvcm1GYWN0b3IgPSBwYXJhbXMubURldmljZUZvcm1GYWN0b3I7CiAgICAgICAgIG1PcmllbnRhdGlvbiA9IHBhcmFtcy5tT3JpZW50YXRpb247CiAgICAgICAgIG1XaWR0aCA9IHBhcmFtcy5tS2V5Ym9hcmRXaWR0aDsKICAgICAgICAgbUhlaWdodCA9IHBhcmFtcy5tS2V5Ym9hcmRIZWlnaHQ7CkBAIC0xMDcsNyArMTAxLDYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wdXRlSGFzaENvZGUoZmluYWwgS2V5Ym9hcmRJZCBpZCkgewogICAgICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgaWQubURldmljZUZvcm1GYWN0b3IsCiAgICAgICAgICAgICAgICAgaWQubU9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGlkLm1FbGVtZW50SWQsCiAgICAgICAgICAgICAgICAgaWQubU1vZGUsCkBAIC0xMzAsOCArMTIzLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gZXF1YWxzKGZpbmFsIEtleWJvYXJkSWQgb3RoZXIpIHsKICAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG90aGVyLm1EZXZpY2VGb3JtRmFjdG9yID09IG1EZXZpY2VGb3JtRmFjdG9yCi0gICAgICAgICAgICAgICAgJiYgb3RoZXIubU9yaWVudGF0aW9uID09IG1PcmllbnRhdGlvbgorICAgICAgICByZXR1cm4gb3RoZXIubU9yaWVudGF0aW9uID09IG1PcmllbnRhdGlvbgogICAgICAgICAgICAgICAgICYmIG90aGVyLm1FbGVtZW50SWQgPT0gbUVsZW1lbnRJZAogICAgICAgICAgICAgICAgICYmIG90aGVyLm1Nb2RlID09IG1Nb2RlCiAgICAgICAgICAgICAgICAgJiYgb3RoZXIubVdpZHRoID09IG1XaWR0aApAQCAtMTk1LDExICsxODcsMTEgQEAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZW50YXRpb24gPSAobU9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fUE9SVFJBSVQpCiAgICAgICAgICAgICAgICAgPyAicG9ydCIgOiAibGFuZCI7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJXMgJXM6JXMgJXMtJXM6JWR4JWQgJXMgJXMgJXMlcyVzJXMlcyVzJXMlcyVzXSIsCisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJXMgJXM6JXMgJXM6JWR4JWQgJXMgJXMgJXMlcyVzJXMlcyVzJXMlcyVzXSIsCiAgICAgICAgICAgICAgICAgZWxlbWVudElkVG9OYW1lKG1FbGVtZW50SWQpLAogICAgICAgICAgICAgICAgIG1Mb2NhbGUsCiAgICAgICAgICAgICAgICAgbVN1YnR5cGUuZ2V0RXh0cmFWYWx1ZU9mKEtFWUJPQVJEX0xBWU9VVF9TRVQpLAotICAgICAgICAgICAgICAgIGRldmljZUZvcm1GYWN0b3IobURldmljZUZvcm1GYWN0b3IpLCBvcmllbnRhdGlvbiwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBtV2lkdGgsIG1IZWlnaHQsCiAgICAgICAgICAgICAgICAgbW9kZU5hbWUobU1vZGUpLAogICAgICAgICAgICAgICAgIGltZUFjdGlvbigpLAogICAgICAgICAgICAgICAgIChuYXZpZ2F0ZU5leHQoKSA/ICJuYXZpZ2F0ZU5leHQiIDogIiIpLApAQCAtMjM4LDE1ICsyMzAsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGV2aWNlRm9ybUZhY3RvcihmaW5hbCBpbnQgZGV2aWNlRm9ybUZhY3RvcikgewotICAgICAgICBzd2l0Y2ggKGRldmljZUZvcm1GYWN0b3IpIHsKLSAgICAgICAgY2FzZSBGT1JNX0ZBQ1RPUl9QSE9ORTogcmV0dXJuICJwaG9uZSI7Ci0gICAgICAgIGNhc2UgRk9STV9GQUNUT1JfVEFCTEVUNzogcmV0dXJuICJ0YWJsZXQ3IjsKLSAgICAgICAgY2FzZSBGT1JNX0ZBQ1RPUl9UQUJMRVQxMDogcmV0dXJuICJ0YWJsZXQxMCI7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kZU5hbWUoZmluYWwgaW50IG1vZGUpIHsKICAgICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgIGNhc2UgTU9ERV9URVhUOiByZXR1cm4gInRleHQiOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5Ym9hcmRMYXlvdXRTZXQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkTGF5b3V0U2V0LmphdmEKaW5kZXggNWU2OGM3MC4uMWZlMjNhMyAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5Ym9hcmRMYXlvdXRTZXQuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9LZXlib2FyZExheW91dFNldC5qYXZhCkBAIC0yOSwxNyArMjksMTggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuYW5ub3RhdGlvbnMuVXNlZEZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LkVkaXRvckluZm9Db21wYXRVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5pbnRlcm5hbC5LZXlib2FyZEJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuaW50ZXJuYWwuS2V5Ym9hcmRQYXJhbXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuaW50ZXJuYWwuS2V5c0NhY2hlOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkFkZGl0aW9uYWxTdWJ0eXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkNvbGxlY3Rpb25VdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5JbnB1dEF0dHJpYnV0ZXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uSW5wdXRUeXBlVXRpbHM7CkBAIC03Miw2ICs3Myw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FTEVNRU5UID0gIkVsZW1lbnQiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWUJPQVJEX0xBWU9VVF9TRVRfUkVTT1VSQ0VfUFJFRklYID0gImtleWJvYXJkX2xheW91dF9zZXRfIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BFTExDSEVDS0VSX0RVTU1ZX0tFWUJPQVJEX1dJRFRIID0gNDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEVMTENIRUNLRVJfRFVNTVlfS0VZQk9BUkRfSEVJR0hUID0gODAwOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgZmluYWwgUGFyYW1zIG1QYXJhbXM7CkBAIC0xMDYsNyArMTA5LDYgQEAKICAgICAgICAgYm9vbGVhbiBtTm9TZXR0aW5nc0tleTsKICAgICAgICAgYm9vbGVhbiBtTGFuZ3VhZ2VTd2l0Y2hLZXlFbmFibGVkOwogICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUgbVN1YnR5cGU7Ci0gICAgICAgIGludCBtRGV2aWNlRm9ybUZhY3RvcjsKICAgICAgICAgaW50IG1PcmllbnRhdGlvbjsKICAgICAgICAgaW50IG1LZXlib2FyZFdpZHRoOwogICAgICAgICBpbnQgbUtleWJvYXJkSGVpZ2h0OwpAQCAtMjE3LDEwICsyMTksOCBAQAogICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUsIE5PX1NFVFRJTkdTX0tFWSwgbUVkaXRvckluZm8pOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2NyZWVuR2VvbWV0cnkoZmluYWwgaW50IGRldmljZUZvcm1GYWN0b3IsIGZpbmFsIGludCB3aWR0aFBpeGVscywKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0UGl4ZWxzKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNjcmVlbkdlb21ldHJ5KGZpbmFsIGludCB3aWR0aFBpeGVscywgZmluYWwgaW50IGhlaWdodFBpeGVscykgewogICAgICAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtcyA9IG1QYXJhbXM7Ci0gICAgICAgICAgICBwYXJhbXMubURldmljZUZvcm1GYWN0b3IgPSBkZXZpY2VGb3JtRmFjdG9yOwogICAgICAgICAgICAgcGFyYW1zLm1PcmllbnRhdGlvbiA9IChoZWlnaHRQaXhlbHMgPiB3aWR0aFBpeGVscykKICAgICAgICAgICAgICAgICAgICAgPyBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX1BPUlRSQUlUIDogQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEU7CiAgICAgICAgICAgICBzZXREZWZhdWx0S2V5Ym9hcmRTaXplKHdpZHRoUGl4ZWxzLCBoZWlnaHRQaXhlbHMpOwpAQCAtMjg1LDggKzI4NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIEBVc2VkRm9yVGVzdGluZwotICAgICAgICBwdWJsaWMgdm9pZCBkaXNhYmxlVG91Y2hQb3NpdGlvbkNvcnJlY3Rpb25EYXRhRm9yVGVzdCgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzYWJsZVRvdWNoUG9zaXRpb25Db3JyZWN0aW9uRGF0YSgpIHsKICAgICAgICAgICAgIG1QYXJhbXMubURpc2FibGVUb3VjaFBvc2l0aW9uQ29ycmVjdGlvbkRhdGFGb3JUZXN0ID0gdHJ1ZTsKICAgICAgICAgfQogCkBAIC00MTYsNCArNDE1LDQ3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEtleWJvYXJkTGF5b3V0U2V0IGNyZWF0ZUtleWJvYXJkU2V0Rm9yU3BlbGxDaGVja2VyKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbGUsIGZpbmFsIFN0cmluZyBsYXlvdXQpIHsKKyAgICAgICAgZmluYWwgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPQorICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxTdWJ0eXBlLmNyZWF0ZUFkZGl0aW9uYWxTdWJ0eXBlKGxvY2FsZSwgbGF5b3V0LCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUtleWJvYXJkU2V0KGNvbnRleHQsIHN1YnR5cGUsIFNQRUxMQ0hFQ0tFUl9EVU1NWV9LRVlCT0FSRF9XSURUSCwKKyAgICAgICAgICAgICAgICBTUEVMTENIRUNLRVJfRFVNTVlfS0VZQk9BUkRfSEVJR0hULCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBLZXlib2FyZExheW91dFNldCBjcmVhdGVLZXlib2FyZFNldEZvclRlc3QoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUsIGZpbmFsIGludCBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdGVzdENhc2VzSGF2ZVRvdWNoQ29vcmRpbmF0ZXMpIHsKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgZG0gPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIGZpbmFsIGludCB3aWR0aDsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodDsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KGRtLndpZHRoUGl4ZWxzLCBkbS5oZWlnaHRQaXhlbHMpOworICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oZG0ud2lkdGhQaXhlbHMsIGRtLmhlaWdodFBpeGVscyk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9QT1JUUkFJVCkgeworICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1pbihkbS53aWR0aFBpeGVscywgZG0uaGVpZ2h0UGl4ZWxzKTsKKyAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGRtLndpZHRoUGl4ZWxzLCBkbS5oZWlnaHRQaXhlbHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk9yaWVudGF0aW9uIHNob3VsZCBiZSBPUklFTlRBVElPTl9MQU5EU0NBUEUgb3IgIgorICAgICAgICAgICAgICAgICAgICArICJPUklFTlRBVElPTl9QT1JUUkFJVDogb3JpZW50YXRpb249IiArIG9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlS2V5Ym9hcmRTZXQoY29udGV4dCwgc3VidHlwZSwgd2lkdGgsIGhlaWdodCwgdGVzdENhc2VzSGF2ZVRvdWNoQ29vcmRpbmF0ZXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEtleWJvYXJkTGF5b3V0U2V0IGNyZWF0ZUtleWJvYXJkU2V0KGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlLCBmaW5hbCBpbnQgd2lkdGgsIGZpbmFsIGludCBoZWlnaHQsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRlc3RDYXNlc0hhdmVUb3VjaENvb3JkaW5hdGVzKSB7CisgICAgICAgIGZpbmFsIEVkaXRvckluZm8gZWRpdG9ySW5mbyA9IG5ldyBFZGl0b3JJbmZvKCk7CisgICAgICAgIGVkaXRvckluZm8uaW5wdXRUeXBlID0gSW5wdXRUeXBlLlRZUEVfQ0xBU1NfVEVYVDsKKyAgICAgICAgZmluYWwgS2V5Ym9hcmRMYXlvdXRTZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IEtleWJvYXJkTGF5b3V0U2V0LkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgY29udGV4dCwgZWRpdG9ySW5mbyk7CisgICAgICAgIGJ1aWxkZXIuc2V0U2NyZWVuR2VvbWV0cnkod2lkdGgsIGhlaWdodCk7CisgICAgICAgIGJ1aWxkZXIuc2V0U3VidHlwZShzdWJ0eXBlKTsKKyAgICAgICAgaWYgKCF0ZXN0Q2FzZXNIYXZlVG91Y2hDb29yZGluYXRlcykgeworICAgICAgICAgICAgLy8gRm9yIHNwZWxsIGNoZWNrZXIgYW5kIHRlc3RzCisgICAgICAgICAgICBidWlsZGVyLmRpc2FibGVUb3VjaFBvc2l0aW9uQ29ycmVjdGlvbkRhdGEoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkU3dpdGNoZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkU3dpdGNoZXIuamF2YQppbmRleCA0ZTQxYjc3Li5hZDA4ZDY0IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9LZXlib2FyZFN3aXRjaGVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvS2V5Ym9hcmRTd2l0Y2hlci5qYXZhCkBAIC0xNDIsOCArMTQyLDcgQEAKICAgICAgICAgICAgICAgICBtVGhlbWVDb250ZXh0LCBlZGl0b3JJbmZvKTsKICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IG1UaGVtZUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIGRtID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0U2NyZWVuR2VvbWV0cnkocmVzLmdldEludGVnZXIoUi5pbnRlZ2VyLmNvbmZpZ19kZXZpY2VfZm9ybV9mYWN0b3IpLAotICAgICAgICAgICAgICAgIGRtLndpZHRoUGl4ZWxzLCBkbS5oZWlnaHRQaXhlbHMpOworICAgICAgICBidWlsZGVyLnNldFNjcmVlbkdlb21ldHJ5KGRtLndpZHRoUGl4ZWxzLCBkbS5oZWlnaHRQaXhlbHMpOwogICAgICAgICBidWlsZGVyLnNldFN1YnR5cGUobVN1YnR5cGVTd2l0Y2hlci5nZXRDdXJyZW50U3VidHlwZSgpKTsKICAgICAgICAgYnVpbGRlci5zZXRPcHRpb25zKAogICAgICAgICAgICAgICAgIHNldHRpbmdzVmFsdWVzLmlzVm9pY2VLZXlFbmFibGVkKGVkaXRvckluZm8pLApAQCAtMjE3LDE5ICsyMTYsMTkgQEAKICAgICAgICAgbVN0YXRlLm9uUmVzZXRLZXlib2FyZFN0YXRlVG9BbHBoYWJldCgpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uUHJlc3NLZXkoZmluYWwgaW50IGNvZGUpIHsKKyAgICBwdWJsaWMgdm9pZCBvblByZXNzS2V5KGZpbmFsIGludCBjb2RlLCBmaW5hbCBib29sZWFuIGlzU2luZ2xlUG9pbnRlcikgewogICAgICAgICBpZiAoaXNWaWJyYXRlQW5kU291bmRGZWVkYmFja1JlcXVpcmVkKCkpIHsKICAgICAgICAgICAgIG1GZWVkYmFja01hbmFnZXIuaGFwdGljQW5kQXVkaW9GZWVkYmFjayhjb2RlLCBtS2V5Ym9hcmRWaWV3KTsKICAgICAgICAgfQotICAgICAgICBtU3RhdGUub25QcmVzc0tleShjb2RlLCBpc1NpbmdsZVBvaW50ZXIoKSwgbUxhdGluSU1FLmdldEN1cnJlbnRBdXRvQ2Fwc1N0YXRlKCkpOworICAgICAgICBtU3RhdGUub25QcmVzc0tleShjb2RlLCBpc1NpbmdsZVBvaW50ZXIsIG1MYXRpbklNRS5nZXRDdXJyZW50QXV0b0NhcHNTdGF0ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2VLZXkoZmluYWwgaW50IGNvZGUsIGZpbmFsIGJvb2xlYW4gd2l0aFNsaWRpbmcpIHsKICAgICAgICAgbVN0YXRlLm9uUmVsZWFzZUtleShjb2RlLCB3aXRoU2xpZGluZyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25DYW5jZWxJbnB1dCgpIHsKLSAgICAgICAgbVN0YXRlLm9uQ2FuY2VsSW5wdXQoaXNTaW5nbGVQb2ludGVyKCkpOworICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoU2xpZGluZ0lucHV0KCkgeworICAgICAgICBtU3RhdGUub25GaW5pc2hTbGlkaW5nSW5wdXQoKTsKICAgICB9CiAKICAgICAvLyBJbXBsZW1lbnRzIHtAbGluayBLZXlib2FyZFN0YXRlLlN3aXRjaEFjdGlvbnN9LgpAQCAtMzQ3LDE1ICszNDYsMTEgQEAKICAgICAgICAgcmV0dXJuIG1LZXlib2FyZFZpZXcgIT0gbnVsbCAmJiAhbUtleWJvYXJkVmlldy5pc0luU2xpZGluZ0tleUlucHV0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlUG9pbnRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlib2FyZFZpZXcgIT0gbnVsbCAmJiBtS2V5Ym9hcmRWaWV3LmdldFBvaW50ZXJDb3VudCgpID09IDE7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogVXBkYXRlcyBzdGF0ZSBtYWNoaW5lIHRvIGZpZ3VyZSBvdXQgd2hlbiB0byBhdXRvbWF0aWNhbGx5IHN3aXRjaCBiYWNrIHRvIHRoZSBwcmV2aW91cyBtb2RlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQ29kZUlucHV0KGZpbmFsIGludCBjb2RlKSB7Ci0gICAgICAgIG1TdGF0ZS5vbkNvZGVJbnB1dChjb2RlLCBpc1NpbmdsZVBvaW50ZXIoKSwgbUxhdGluSU1FLmdldEN1cnJlbnRBdXRvQ2Fwc1N0YXRlKCkpOworICAgICAgICBtU3RhdGUub25Db2RlSW5wdXQoY29kZSwgbUxhdGluSU1FLmdldEN1cnJlbnRBdXRvQ2Fwc1N0YXRlKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBNYWluS2V5Ym9hcmRWaWV3IGdldE1haW5LZXlib2FyZFZpZXcoKSB7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9LZXlib2FyZFZpZXcuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkVmlldy5qYXZhCmluZGV4IGU0ZTc1YzMuLjc5NDFmY2IgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkVmlldy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL0tleWJvYXJkVmlldy5qYXZhCkBAIC00OTcsNyArNDk3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChrZXkuaGFzUG9wdXBIaW50KCkgJiYga2V5Lm1Nb3JlS2V5cyAhPSBudWxsICYmIGtleS5tTW9yZUtleXMubGVuZ3RoID4gMCkgeworICAgICAgICBpZiAoa2V5Lmhhc1BvcHVwSGludCgpICYmIGtleS5tTW9yZUtleXMgIT0gbnVsbCkgewogICAgICAgICAgICAgZHJhd0tleVBvcHVwSGludChrZXksIGNhbnZhcywgcGFpbnQsIHBhcmFtcyk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9NYWluS2V5Ym9hcmRWaWV3LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9NYWluS2V5Ym9hcmRWaWV3LmphdmEKaW5kZXggYmE3OGQwMS4uNmM2ZmM2MSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvTWFpbktleWJvYXJkVmlldy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01haW5LZXlib2FyZFZpZXcuamF2YQpAQCAtMzMzLDYgKzMzMywxMCBAQAogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FuY2VsQW5kU3RhcnRBbmltYXRvcnMoZmluYWwgT2JqZWN0QW5pbWF0b3IgYW5pbWF0b3JUb0NhbmNlbCwKICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RBbmltYXRvciBhbmltYXRvclRvU3RhcnQpIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRvclRvQ2FuY2VsID09IG51bGwgfHwgYW5pbWF0b3JUb1N0YXJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdG9wIHVzaW5nIG51bGwgYXMgYSBuby1vcGVyYXRpb24gYW5pbWF0b3IuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZmxvYXQgc3RhcnRGcmFjdGlvbiA9IDAuMGY7CiAgICAgICAgICAgICBpZiAoYW5pbWF0b3JUb0NhbmNlbC5pc1N0YXJ0ZWQoKSkgewogICAgICAgICAgICAgICAgIGFuaW1hdG9yVG9DYW5jZWwuY2FuY2VsKCk7CkBAIC0zNjYsNyArMzcwLDkgQEAKICAgICAgICAgICAgIC8vIFdoZW4gdXNlciBoaXRzIHRoZSBzcGFjZSBvciB0aGUgZW50ZXIga2V5LCBqdXN0IGNhbmNlbCB0aGUgd2hpbGUtdHlwaW5nIHRpbWVyLgogICAgICAgICAgICAgZmluYWwgaW50IHR5cGVkQ29kZSA9IHR5cGVkS2V5Lm1Db2RlOwogICAgICAgICAgICAgaWYgKHR5cGVkQ29kZSA9PSBDb25zdGFudHMuQ09ERV9TUEFDRSB8fCB0eXBlZENvZGUgPT0gQ29uc3RhbnRzLkNPREVfRU5URVIpIHsKLSAgICAgICAgICAgICAgICBzdGFydFdoaWxlVHlwaW5nRmFkZWluQW5pbWF0aW9uKGtleWJvYXJkVmlldyk7CisgICAgICAgICAgICAgICAgaWYgKGlzVHlwaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0V2hpbGVUeXBpbmdGYWRlaW5BbmltYXRpb24oa2V5Ym9hcmRWaWV3KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC01ODEsNiArNTg3LDcgQEAKIAogICAgIHByaXZhdGUgT2JqZWN0QW5pbWF0b3IgbG9hZE9iamVjdEFuaW1hdG9yKGZpbmFsIGludCByZXNJZCwgZmluYWwgT2JqZWN0IHRhcmdldCkgewogICAgICAgICBpZiAocmVzSWQgPT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogU3RvcCByZXR1cm5pbmcgbnVsbC4KICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIE9iamVjdEFuaW1hdG9yIGFuaW1hdG9yID0gKE9iamVjdEFuaW1hdG9yKUFuaW1hdG9ySW5mbGF0ZXIubG9hZEFuaW1hdG9yKApAQCAtNjA5LDggKzYxNiwxOCBAQAogCiAgICAgQEV4dGVybmFsbHlSZWZlcmVuY2VkCiAgICAgcHVibGljIHZvaWQgc2V0QWx0Q29kZUtleVdoaWxlVHlwaW5nQW5pbUFscGhhKGZpbmFsIGludCBhbHBoYSkgeworICAgICAgICBpZiAobUFsdENvZGVLZXlXaGlsZVR5cGluZ0FuaW1BbHBoYSA9PSBhbHBoYSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdmlzdWFsIG9mIGFsdC1jb2RlLWtleS13aGlsZS10eXBpbmcuCiAgICAgICAgIG1BbHRDb2RlS2V5V2hpbGVUeXBpbmdBbmltQWxwaGEgPSBhbHBoYTsKLSAgICAgICAgdXBkYXRlQWx0Q29kZUtleVdoaWxlVHlwaW5nKCk7CisgICAgICAgIGZpbmFsIEtleWJvYXJkIGtleWJvYXJkID0gZ2V0S2V5Ym9hcmQoKTsKKyAgICAgICAgaWYgKGtleWJvYXJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIEtleSBrZXkgOiBrZXlib2FyZC5tQWx0Q29kZUtleXNXaGlsZVR5cGluZykgeworICAgICAgICAgICAgaW52YWxpZGF0ZUtleShrZXkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0S2V5Ym9hcmRBY3Rpb25MaXN0ZW5lcihmaW5hbCBLZXlib2FyZEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CkBAIC04OTMsMTAgKzkxMCwxMCBAQAogICAgICAgICBtU2xpZGluZ0tleUlucHV0UHJldmlldy5kaXNtaXNzU2xpZGluZ0tleUlucHV0UHJldmlldygpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldEdlc3R1cmVQcmV2aWV3TW9kZShmaW5hbCBib29sZWFuIGRyYXdzR2VzdHVyZVByZXZpZXdUcmFpbCwKKyAgICBwdWJsaWMgdm9pZCBzZXRHZXN0dXJlUHJldmlld01vZGUoZmluYWwgYm9vbGVhbiBkcmF3c0dlc3R1cmVUcmFpbCwKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJhd3NHZXN0dXJlRmxvYXRpbmdQcmV2aWV3VGV4dCkgewogICAgICAgICBtR2VzdHVyZUZsb2F0aW5nUHJldmlld1RleHQuc2V0UHJldmlld0VuYWJsZWQoZHJhd3NHZXN0dXJlRmxvYXRpbmdQcmV2aWV3VGV4dCk7Ci0gICAgICAgIG1HZXN0dXJlVHJhaWxzUHJldmlldy5zZXRQcmV2aWV3RW5hYmxlZChkcmF3c0dlc3R1cmVQcmV2aWV3VHJhaWwpOworICAgICAgICBtR2VzdHVyZVRyYWlsc1ByZXZpZXcuc2V0UHJldmlld0VuYWJsZWQoZHJhd3NHZXN0dXJlVHJhaWwpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNob3dHZXN0dXJlRmxvYXRpbmdQcmV2aWV3VGV4dChmaW5hbCBTdWdnZXN0ZWRXb3JkcyBzdWdnZXN0ZWRXb3JkcykgewpAQCAtOTEwLDcgKzkyNyw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2hvd0dlc3R1cmVQcmV2aWV3VHJhaWwoZmluYWwgUG9pbnRlclRyYWNrZXIgdHJhY2tlcikgeworICAgIHB1YmxpYyB2b2lkIHNob3dHZXN0dXJlVHJhaWwoZmluYWwgUG9pbnRlclRyYWNrZXIgdHJhY2tlcikgewogICAgICAgICBsb2NhdGVQcmV2aWV3UGxhY2VyVmlldygpOwogICAgICAgICBtR2VzdHVyZUZsb2F0aW5nUHJldmlld1RleHQuc2V0UHJldmlld1Bvc2l0aW9uKHRyYWNrZXIpOwogICAgICAgICBtR2VzdHVyZVRyYWlsc1ByZXZpZXcuc2V0UHJldmlld1Bvc2l0aW9uKHRyYWNrZXIpOwpAQCAtMTA1NCw2ICsxMDcxLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU2hvd01vcmVLZXlzUGFuZWwoZmluYWwgTW9yZUtleXNQYW5lbCBwYW5lbCkgeworICAgICAgICBsb2NhdGVQcmV2aWV3UGxhY2VyVmlldygpOwogICAgICAgICBpZiAoaXNTaG93aW5nTW9yZUtleXNQYW5lbCgpKSB7CiAgICAgICAgICAgICBvbkRpc21pc3NNb3JlS2V5c1BhbmVsKCk7CiAgICAgICAgIH0KQEAgLTEwODIsMTAgKzExMDAsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXRQb2ludGVyQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtT2xkUG9pbnRlckNvdW50OwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewogICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eVV0aWxzLmdldEluc3RhbmNlKCkuaXNUb3VjaEV4cGxvcmF0aW9uRW5hYmxlZCgpKSB7CkBAIC0xMTg5LDEwICsxMjAzLDEyIEBACiAgICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9VU0FCSUxJVFlfU1RVRFlfTE9HKSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlVXNhYmlsaXR5U3R1ZHlMb2cobWUsIGFjdGlvbiwgZXZlbnRUaW1lLCBpLCBwb2ludGVySWQsIHB4LCBweSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChQcm9kdWN0aW9uRmxhZy5VU0VTX0RFVkVMT1BNRU5UX09OTFlfRElBR05PU1RJQ1MpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzZWFyY2hMb2dnZXIubWFpbktleWJvYXJkVmlld19wcm9jZXNzTW90aW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIGFjdGlvbiwgZXZlbnRUaW1lLCBpLCBwb2ludGVySWQsIHB4LCBweSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeSwgYW5kIGNvbmZ1c2luZyBiZWNhdXNlIGl0IGxlYWRzIHRvCisgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIE1vdGlvbkV2ZW50cyBiZWluZyByZWNvcmRlZC4KKyAgICAgICAgICAgICAgICAvLyBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CisgICAgICAgICAgICAgICAgLy8gICAgIFJlc2VhcmNoTG9nZ2VyLm1haW5LZXlib2FyZFZpZXdfcHJvY2Vzc01vdGlvbkV2ZW50KAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1lLCBhY3Rpb24sIGV2ZW50VGltZSwgaSwgcG9pbnRlcklkLCBweCwgcHkpOworICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXJUcmFja2VyIHRyYWNrZXIgPSBQb2ludGVyVHJhY2tlci5nZXRQb2ludGVyVHJhY2tlcihpZCwgdGhpcyk7CkBAIC0xMjc0LDE2ICsxMjkwLDYgQEAKICAgICAgICAgaW52YWxpZGF0ZUtleShzaG9ydGN1dEtleSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsdENvZGVLZXlXaGlsZVR5cGluZygpIHsKLSAgICAgICAgZmluYWwgS2V5Ym9hcmQga2V5Ym9hcmQgPSBnZXRLZXlib2FyZCgpOwotICAgICAgICBpZiAoa2V5Ym9hcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgS2V5IGtleSA6IGtleWJvYXJkLm1BbHRDb2RlS2V5c1doaWxlVHlwaW5nKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlS2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBzdGFydERpc3BsYXlMYW5ndWFnZU9uU3BhY2ViYXIoZmluYWwgYm9vbGVhbiBzdWJ0eXBlQ2hhbmdlZCwKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNUb0Rpc3BsYXlMYW5ndWFnZSwgZmluYWwgYm9vbGVhbiBoYXNNdWx0aXBsZUVuYWJsZWRJTUVzT3JTdWJ0eXBlcykgewogICAgICAgICBtTmVlZHNUb0Rpc3BsYXlMYW5ndWFnZSA9IG5lZWRzVG9EaXNwbGF5TGFuZ3VhZ2U7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9Qb2ludGVyVHJhY2tlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvUG9pbnRlclRyYWNrZXIuamF2YQppbmRleCA5MWM0MzE5Li4xNzQyMzkzIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9Qb2ludGVyVHJhY2tlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL1BvaW50ZXJUcmFja2VyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5pbnRlcm5hbC5HZXN0dXJlU3Ryb2tlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLmludGVybmFsLkdlc3R1cmVTdHJva2UuR2VzdHVyZVN0cm9rZVBhcmFtczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5pbnRlcm5hbC5HZXN0dXJlU3Ryb2tlV2l0aFByZXZpZXdQb2ludHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuaW50ZXJuYWwuR2VzdHVyZVN0cm9rZVdpdGhQcmV2aWV3UG9pbnRzLkdlc3R1cmVTdHJva2VQcmV2aWV3UGFyYW1zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLmludGVybmFsLlBvaW50ZXJUcmFja2VyUXVldWU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uQ29sbGVjdGlvblV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkNvbnN0YW50czsKQEAgLTgzLDcgKzg0LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzc0tleVByZXZpZXcoUG9pbnRlclRyYWNrZXIgdHJhY2tlcik7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNob3dTbGlkaW5nS2V5SW5wdXRQcmV2aWV3KFBvaW50ZXJUcmFja2VyIHRyYWNrZXIpOwogICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzU2xpZGluZ0tleUlucHV0UHJldmlldygpOwotICAgICAgICBwdWJsaWMgdm9pZCBzaG93R2VzdHVyZVByZXZpZXdUcmFpbChQb2ludGVyVHJhY2tlciB0cmFja2VyKTsKKyAgICAgICAgcHVibGljIHZvaWQgc2hvd0dlc3R1cmVUcmFpbChQb2ludGVyVHJhY2tlciB0cmFja2VyKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50ZXJmYWNlIFRpbWVyUHJveHkgewpAQCAtMTYxLDYgKzE2Miw3IEBACiAgICAgLy8gUGFyYW1ldGVycyBmb3IgcG9pbnRlciBoYW5kbGluZy4KICAgICBwcml2YXRlIHN0YXRpYyBQb2ludGVyVHJhY2tlclBhcmFtcyBzUGFyYW1zOwogICAgIHByaXZhdGUgc3RhdGljIEdlc3R1cmVTdHJva2VQYXJhbXMgc0dlc3R1cmVTdHJva2VQYXJhbXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMgc0dlc3R1cmVQcmV2aWV3UGFyYW1zOwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc05lZWRzUGhhbnRvbVN1ZGRlbk1vdmVFdmVudEhhY2s7CiAgICAgLy8gTW92ZSB0aGlzIHRocmVzaG9sZCB0byByZXNvdXJjZS4KICAgICAvLyBUT0RPOiBEZXZpY2Ugc3BlY2lmaWMgcGFyYW1ldGVyIHdvdWxkIGJlIGJldHRlciBmb3IgZGV2aWNlIHNwZWNpZmljIGhhY2s/CkBAIC0xNzYsNyArMTc4LDcgQEAKICAgICBwcml2YXRlIERyYXdpbmdQcm94eSBtRHJhd2luZ1Byb3h5OwogICAgIHByaXZhdGUgVGltZXJQcm94eSBtVGltZXJQcm94eTsKICAgICBwcml2YXRlIEtleURldGVjdG9yIG1LZXlEZXRlY3RvcjsKLSAgICBwcml2YXRlIEtleWJvYXJkQWN0aW9uTGlzdGVuZXIgbUxpc3RlbmVyID0gRU1QVFlfTElTVEVORVI7CisgICAgcHJpdmF0ZSBLZXlib2FyZEFjdGlvbkxpc3RlbmVyIG1MaXN0ZW5lciA9IEtleWJvYXJkQWN0aW9uTGlzdGVuZXIuQWRhcHRlci5FTVBUWV9MSVNURU5FUjsKIAogICAgIHByaXZhdGUgS2V5Ym9hcmQgbUtleWJvYXJkOwogICAgIHByaXZhdGUgaW50IG1QaGFudG9uU3VkZGVuTW92ZVRocmVzaG9sZDsKQEAgLTMxOCw4ICszMjAsOCBAQAogICAgIC8vIHRydWUgaWYga2V5Ym9hcmQgbGF5b3V0IGhhcyBiZWVuIGNoYW5nZWQuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1LZXlib2FyZExheW91dEhhc0JlZW5DaGFuZ2VkOwogCi0gICAgLy8gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIHRyYWNraW5nIHRvdWNoIGV2ZW50LgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUcmFja2luZ0NhbmNlbGVkOworICAgIC8vIHRydWUgaWYgdGhpcyBwb2ludGVyIGlzIG5vIGxvbmdlciB0cmlnZ2VyaW5nIGFueSBhY3Rpb24gYmVjYXVzZSBpdCBoYXMgYmVlbiBjYW5jZWxlZC4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzVHJhY2tpbmdGb3JBY3Rpb25EaXNhYmxlZDsKIAogICAgIC8vIHRoZSBtb3JlIGtleXMgcGFuZWwgY3VycmVudGx5IGJlaW5nIHNob3duLiBlcXVhbHMgbnVsbCBpZiBubyBwYW5lbCBpcyBhY3RpdmUuCiAgICAgcHJpdmF0ZSBNb3JlS2V5c1BhbmVsIG1Nb3JlS2V5c1BhbmVsOwpAQCAtMzMzLDIyICszMzUsMjAgQEAKICAgICAvLyB0cnVlIGlmIGEgc2xpZGluZyBrZXkgaW5wdXQgaXMgYWxsb3dlZC4KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxsb3dlZFNsaWRpbmdLZXlJbnB1dDsKIAotICAgIC8vIEVtcHR5IHtAbGluayBLZXlib2FyZEFjdGlvbkxpc3RlbmVyfQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEtleWJvYXJkQWN0aW9uTGlzdGVuZXIgRU1QVFlfTElTVEVORVIgPQotICAgICAgICAgICAgbmV3IEtleWJvYXJkQWN0aW9uTGlzdGVuZXIuQWRhcHRlcigpOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBHZXN0dXJlU3Ryb2tlV2l0aFByZXZpZXdQb2ludHMgbUdlc3R1cmVTdHJva2VXaXRoUHJldmlld1BvaW50czsKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGZpbmFsIGJvb2xlYW4gbmVlZHNQaGFudG9tU3VkZGVuTW92ZUV2ZW50SGFjaykgewogICAgICAgICBzTmVlZHNQaGFudG9tU3VkZGVuTW92ZUV2ZW50SGFjayA9IG5lZWRzUGhhbnRvbVN1ZGRlbk1vdmVFdmVudEhhY2s7CiAgICAgICAgIHNQYXJhbXMgPSBQb2ludGVyVHJhY2tlclBhcmFtcy5ERUZBVUxUOwogICAgICAgICBzR2VzdHVyZVN0cm9rZVBhcmFtcyA9IEdlc3R1cmVTdHJva2VQYXJhbXMuREVGQVVMVDsKKyAgICAgICAgc0dlc3R1cmVQcmV2aWV3UGFyYW1zID0gR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMuREVGQVVMVDsKICAgICAgICAgc1RpbWVSZWNvcmRlciA9IG5ldyBUaW1lUmVjb3JkZXIoc1BhcmFtcywgc0dlc3R1cmVTdHJva2VQYXJhbXMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYXJhbWV0ZXJzKGZpbmFsIFR5cGVkQXJyYXkgbWFpbktleWJvYXJkVmlld0F0dHIpIHsKICAgICAgICAgc1BhcmFtcyA9IG5ldyBQb2ludGVyVHJhY2tlclBhcmFtcyhtYWluS2V5Ym9hcmRWaWV3QXR0cik7CiAgICAgICAgIHNHZXN0dXJlU3Ryb2tlUGFyYW1zID0gbmV3IEdlc3R1cmVTdHJva2VQYXJhbXMobWFpbktleWJvYXJkVmlld0F0dHIpOworICAgICAgICBzR2VzdHVyZVByZXZpZXdQYXJhbXMgPSBuZXcgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMobWFpbktleWJvYXJkVmlld0F0dHIpOwogICAgICAgICBzVGltZVJlY29yZGVyID0gbmV3IFRpbWVSZWNvcmRlcihzUGFyYW1zLCBzR2VzdHVyZVN0cm9rZVBhcmFtcyk7CiAgICAgfQogCkBAIC00MzIsNyArNDMyLDcgQEAKICAgICAgICAgfQogICAgICAgICBtUG9pbnRlcklkID0gaWQ7CiAgICAgICAgIG1HZXN0dXJlU3Ryb2tlV2l0aFByZXZpZXdQb2ludHMgPSBuZXcgR2VzdHVyZVN0cm9rZVdpdGhQcmV2aWV3UG9pbnRzKAotICAgICAgICAgICAgICAgIGlkLCBzR2VzdHVyZVN0cm9rZVBhcmFtcyk7CisgICAgICAgICAgICAgICAgaWQsIHNHZXN0dXJlU3Ryb2tlUGFyYW1zLCBzR2VzdHVyZVByZXZpZXdQYXJhbXMpOwogICAgICAgICBzZXRLZXlEZXRlY3RvcklubmVyKGhhbmRsZXIuZ2V0S2V5RGV0ZWN0b3IoKSk7CiAgICAgICAgIG1MaXN0ZW5lciA9IGhhbmRsZXIuZ2V0S2V5Ym9hcmRBY3Rpb25MaXN0ZW5lcigpOwogICAgICAgICBtRHJhd2luZ1Byb3h5ID0gaGFuZGxlci5nZXREcmF3aW5nUHJveHkoKTsKQEAgLTQ0MSw3ICs0NDEsMTEgQEAKIAogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBrZXlib2FyZCBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoaXMgY2FsbGJhY2suCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbGxMaXN0ZW5lck9uUHJlc3NBbmRDaGVja0tleWJvYXJkTGF5b3V0Q2hhbmdlKGZpbmFsIEtleSBrZXkpIHsKLSAgICAgICAgaWYgKHNJbkdlc3R1cmUgfHwgbUlzRGV0ZWN0aW5nR2VzdHVyZSkgeworICAgICAgICAvLyBXaGlsZSBnZXN0dXJlIGlucHV0IGlzIGdvaW5nIG9uLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYSBuby1vcGVyYXRpb24uIEJ1dCB3aGVuIGdlc3R1cmUKKyAgICAgICAgLy8gaW5wdXQgaGFzIGJlZW4gY2FuY2VsZWQsIDxjb2RlPnNJbkdlc3R1cmU8L2NvZGU+IGFuZCA8Y29kZT5tSXNEZXRlY3RpbmdHZXN0dXJlPC9jb2RlPgorICAgICAgICAvLyBhcmUgc2V0IHRvIGZhbHNlLiBUbyBrZWVwIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3BlcmF0aW9uLAorICAgICAgICAvLyA8Y29kZT5tSXNUcmFja2luZ0ZvckFjdGlvbkRpc2FibGVkPC9jb2RlPiBzaG91bGQgYWxzbyBiZSB0YWtlbiBhY2NvdW50IG9mLgorICAgICAgICBpZiAoc0luR2VzdHVyZSB8fCBtSXNEZXRlY3RpbmdHZXN0dXJlIHx8IG1Jc1RyYWNraW5nRm9yQWN0aW9uRGlzYWJsZWQpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBib29sZWFuIGlnbm9yZU1vZGlmaWVyS2V5ID0gbUlzSW5TbGlkaW5nS2V5SW5wdXQgJiYga2V5LmlzTW9kaWZpZXIoKTsKQEAgLTQ1NSw3ICs0NTksNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChrZXkuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblByZXNzS2V5KGtleS5tQ29kZSk7CisgICAgICAgICAgICBtTGlzdGVuZXIub25QcmVzc0tleShrZXkubUNvZGUsIGdldEFjdGl2ZVBvaW50ZXJUcmFja2VyQ291bnQoKSA9PSAxKTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4ga2V5Ym9hcmRMYXlvdXRIYXNCZWVuQ2hhbmdlZCA9IG1LZXlib2FyZExheW91dEhhc0JlZW5DaGFuZ2VkOwogICAgICAgICAgICAgbUtleWJvYXJkTGF5b3V0SGFzQmVlbkNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1UaW1lclByb3h5LnN0YXJ0VHlwaW5nU3RhdGVUaW1lcihrZXkpOwpAQCAtNTAwLDcgKzUwNCw4IEBACiAgICAgLy8gcHJpbWFyeUNvZGUgaXMgZGlmZmVyZW50IGZyb20ge0BsaW5rIEtleSNtQ29kZX0uCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGxMaXN0ZW5lck9uUmVsZWFzZShmaW5hbCBLZXkga2V5LCBmaW5hbCBpbnQgcHJpbWFyeUNvZGUsCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHdpdGhTbGlkaW5nKSB7Ci0gICAgICAgIGlmIChzSW5HZXN0dXJlIHx8IG1Jc0RldGVjdGluZ0dlc3R1cmUpIHsKKyAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50IGF0IHtAbGluayAjY2FsbExpc3RlbmVyT25QcmVzc0FuZENoZWNrS2V5Ym9hcmRMYXlvdXRDaGFuZ2UoS2V5fX0uCisgICAgICAgIGlmIChzSW5HZXN0dXJlIHx8IG1Jc0RldGVjdGluZ0dlc3R1cmUgfHwgbUlzVHJhY2tpbmdGb3JBY3Rpb25EaXNhYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlTW9kaWZpZXJLZXkgPSBtSXNJblNsaWRpbmdLZXlJbnB1dCAmJiBrZXkuaXNNb2RpZmllcigpOwpAQCAtNTIyLDYgKzUyNywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNhbGxMaXN0ZW5lck9uRmluaXNoU2xpZGluZ0lucHV0KCkgeworICAgICAgICBpZiAoREVCVUdfTElTVEVORVIpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgU3RyaW5nLmZvcm1hdCgiWyVkXSBvbkZpbmlzaFNsaWRpbmdJbnB1dCIsIG1Qb2ludGVySWQpKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIub25GaW5pc2hTbGlkaW5nSW5wdXQoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY2FsbExpc3RlbmVyT25DYW5jZWxJbnB1dCgpIHsKICAgICAgICAgaWYgKERFQlVHX0xJU1RFTkVSKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsIFN0cmluZy5mb3JtYXQoIlslZF0gb25DYW5jZWxJbnB1dCIsIG1Qb2ludGVySWQpKTsKQEAgLTczMiw3ICs3NDQsNyBAQAogICAgICAgICAgICAgZGlzbWlzc0FsbE1vcmVLZXlzUGFuZWxzKCk7CiAgICAgICAgIH0KICAgICAgICAgbVRpbWVyUHJveHkuY2FuY2VsTG9uZ1ByZXNzVGltZXIoKTsKLSAgICAgICAgbURyYXdpbmdQcm94eS5zaG93R2VzdHVyZVByZXZpZXdUcmFpbCh0aGlzKTsKKyAgICAgICAgbURyYXdpbmdQcm94eS5zaG93R2VzdHVyZVRyYWlsKHRoaXMpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJhdGNoSW5wdXRCeVRpbWVyKGZpbmFsIGxvbmcgZXZlbnRUaW1lKSB7CkBAIC03NDUsMTAgKzc1NywxMCBAQAogICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKICAgICAgICAgICAgIHVwZGF0ZUJhdGNoSW5wdXQoZXZlbnRUaW1lKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUlzVHJhY2tpbmdDYW5jZWxlZCkgeworICAgICAgICBpZiAobUlzVHJhY2tpbmdGb3JBY3Rpb25EaXNhYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1EcmF3aW5nUHJveHkuc2hvd0dlc3R1cmVQcmV2aWV3VHJhaWwodGhpcyk7CisgICAgICAgIG1EcmF3aW5nUHJveHkuc2hvd0dlc3R1cmVUcmFpbCh0aGlzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlQmF0Y2hJbnB1dChmaW5hbCBsb25nIGV2ZW50VGltZSkgewpAQCAtNzc3LDcgKzc4OSw3IEBACiAgICAgICAgICAgICAgICAgc0luR2VzdHVyZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHNUaW1lUmVjb3JkZXIub25FbmRCYXRjaElucHV0KGV2ZW50VGltZSk7CiAgICAgICAgICAgICAgICAgbVRpbWVyUHJveHkuY2FuY2VsQWxsVXBkYXRlQmF0Y2hJbnB1dFRpbWVycygpOwotICAgICAgICAgICAgICAgIGlmICghbUlzVHJhY2tpbmdDYW5jZWxlZCkgeworICAgICAgICAgICAgICAgIGlmICghbUlzVHJhY2tpbmdGb3JBY3Rpb25EaXNhYmxlZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTElTVEVORVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgU3RyaW5nLmZvcm1hdCgiWyVkXSBvbkVuZEJhdGNoSW5wdXQgICA6IGJhdGNoUG9pbnRzPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZCwgc0FnZ3JlZ3JhdGVkUG9pbnRlcnMuZ2V0UG9pbnRlclNpemUoKSkpOwpAQCAtNzg2LDEwICs3OTgsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc1RyYWNraW5nQ2FuY2VsZWQpIHsKKyAgICAgICAgaWYgKG1Jc1RyYWNraW5nRm9yQWN0aW9uRGlzYWJsZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtRHJhd2luZ1Byb3h5LnNob3dHZXN0dXJlUHJldmlld1RyYWlsKHRoaXMpOworICAgICAgICBtRHJhd2luZ1Byb3h5LnNob3dHZXN0dXJlVHJhaWwodGhpcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEJhdGNoSW5wdXQoKSB7CkBAIC04NDYsNyArODU4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CiAgICAgICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnBvaW50ZXJUcmFja2VyX29uRG93bkV2ZW50KGRlbHRhVCwgZGlzdGFuY2UgKiBkaXN0YW5jZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbmNlbFRyYWNraW5nKCk7CisgICAgICAgICAgICAgICAgY2FuY2VsVHJhY2tpbmdGb3JBY3Rpb24oKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg4Nyw3ICs4OTksNyBAQAogICAgICAgICAgICAgICAgIHx8IChrZXkgIT0gbnVsbCAmJiBrZXkuaXNNb2RpZmllcigpKQogICAgICAgICAgICAgICAgIHx8IG1LZXlEZXRlY3Rvci5hbHdheXNBbGxvd3NTbGlkaW5nSW5wdXQoKTsKICAgICAgICAgbUtleWJvYXJkTGF5b3V0SGFzQmVlbkNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgbUlzVHJhY2tpbmdDYW5jZWxlZCA9IGZhbHNlOworICAgICAgICBtSXNUcmFja2luZ0ZvckFjdGlvbkRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgIHJlc2V0U2xpZGluZ0tleUlucHV0KCk7CiAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVGhpcyBvblByZXNzIGNhbGwgbWF5IGhhdmUgY2hhbmdlZCBrZXlib2FyZCBsYXlvdXQuIFRob3NlIGNhc2VzIGFyZSBkZXRlY3RlZCBhdApAQCAtOTQ3LDcgKzk1OSw3IEBACiAgICAgICAgIGlmIChERUJVR19NT1ZFX0VWRU5UKSB7CiAgICAgICAgICAgICBwcmludFRvdWNoRXZlbnQoIm9uTW92ZUV2ZW50OiIsIHgsIHksIGV2ZW50VGltZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc1RyYWNraW5nQ2FuY2VsZWQpIHsKKyAgICAgICAgaWYgKG1Jc1RyYWNraW5nRm9yQWN0aW9uRGlzYWJsZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05ODUsNiArOTk3LDkgQEAKICAgICAgICAgICAgIGtleSA9IG9uTW92ZUtleSh4LCB5KTsKICAgICAgICAgfQogICAgICAgICBvbk1vdmVUb05ld0tleShrZXksIHgsIHkpOworICAgICAgICBpZiAobUlzVHJhY2tpbmdGb3JBY3Rpb25EaXNhYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHN0YXJ0TG9uZ1ByZXNzVGltZXIoa2V5KTsKICAgICAgICAgc2V0UHJlc3NlZEtleUdyYXBoaWNzKGtleSwgZXZlbnRUaW1lKTsKICAgICB9CkBAIC0xMDI4LDcgKzEwNDMsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaWxkZU91dEZyb21PbGRLZXkoZmluYWwgS2V5IG9sZEtleSkgewogICAgICAgICBzZXRSZWxlYXNlZEtleUdyYXBoaWNzKG9sZEtleSk7Ci0gICAgICAgIGNhbGxMaXN0ZW5lck9uUmVsZWFzZShvbGRLZXksIG9sZEtleS5tQ29kZSwgdHJ1ZSk7CisgICAgICAgIGNhbGxMaXN0ZW5lck9uUmVsZWFzZShvbGRLZXksIG9sZEtleS5tQ29kZSwgdHJ1ZSAvKiB3aXRoU2xpZGluZyAqLyk7CiAgICAgICAgIHN0YXJ0U2xpZGluZ0tleUlucHV0KG9sZEtleSk7CiAgICAgICAgIG1UaW1lclByb3h5LmNhbmNlbEtleVRpbWVycygpOwogICAgIH0KQEAgLTEwNjksMTEgKzEwODQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkZXRlY3RlZCBzbGlkaW5nIGZpbmdlciB3aGlsZSBtdWx0aSB0b3VjaGluZyIsIG1Qb2ludGVySWQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9uVXBFdmVudCh4LCB5LCBldmVudFRpbWUpOwotICAgICAgICAgICAgY2FuY2VsVHJhY2tpbmcoKTsKKyAgICAgICAgICAgIGNhbmNlbFRyYWNraW5nRm9yQWN0aW9uKCk7CiAgICAgICAgICAgICBzZXRSZWxlYXNlZEtleUdyYXBoaWNzKG9sZEtleSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoIW1Jc0RldGVjdGluZ0dlc3R1cmUpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxUcmFja2luZygpOworICAgICAgICAgICAgICAgIGNhbmNlbFRyYWNraW5nRm9yQWN0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRSZWxlYXNlZEtleUdyYXBoaWNzKG9sZEtleSk7CiAgICAgICAgIH0KQEAgLTEwODcsNyArMTEwMiw3IEBACiAgICAgICAgICAgICBvbk1vdmVUb05ld0tleShudWxsLCB4LCB5KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICghbUlzRGV0ZWN0aW5nR2VzdHVyZSkgewotICAgICAgICAgICAgICAgIGNhbmNlbFRyYWNraW5nKCk7CisgICAgICAgICAgICAgICAgY2FuY2VsVHJhY2tpbmdGb3JBY3Rpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTExNTUsMTEgKzExNzAsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBvblVwRXZlbnRJbnRlcm5hbChtTGFzdFgsIG1MYXN0WSwgZXZlbnRUaW1lKTsKLSAgICAgICAgY2FuY2VsVHJhY2tpbmcoKTsKKyAgICAgICAgY2FuY2VsVHJhY2tpbmdGb3JBY3Rpb24oKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb25VcEV2ZW50SW50ZXJuYWwoZmluYWwgaW50IHgsIGZpbmFsIGludCB5LCBmaW5hbCBsb25nIGV2ZW50VGltZSkgewogICAgICAgICBtVGltZXJQcm94eS5jYW5jZWxLZXlUaW1lcnMoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0luU2xpZGluZ0tleUlucHV0ID0gbUlzSW5TbGlkaW5nS2V5SW5wdXQ7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJblNsaWRpbmdLZXlJbnB1dEZyb21Nb2RpZmllciA9IG1Jc0luU2xpZGluZ0tleUlucHV0RnJvbU1vZGlmaWVyOwogICAgICAgICByZXNldFNsaWRpbmdLZXlJbnB1dCgpOwogICAgICAgICBtSXNEZXRlY3RpbmdHZXN0dXJlID0gZmFsc2U7CiAgICAgICAgIGZpbmFsIEtleSBjdXJyZW50S2V5ID0gbUN1cnJlbnRLZXk7CkBAIC0xMTY4LDcgKzExODUsNyBAQAogICAgICAgICBzZXRSZWxlYXNlZEtleUdyYXBoaWNzKGN1cnJlbnRLZXkpOwogCiAgICAgICAgIGlmIChpc1Nob3dpbmdNb3JlS2V5c1BhbmVsKCkpIHsKLSAgICAgICAgICAgIGlmICghbUlzVHJhY2tpbmdDYW5jZWxlZCkgeworICAgICAgICAgICAgaWYgKCFtSXNUcmFja2luZ0ZvckFjdGlvbkRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRyYW5zbGF0ZWRYID0gbU1vcmVLZXlzUGFuZWwudHJhbnNsYXRlWCh4KTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHJhbnNsYXRlZFkgPSBtTW9yZUtleXNQYW5lbC50cmFuc2xhdGVZKHkpOwogICAgICAgICAgICAgICAgIG1Nb3JlS2V5c1BhbmVsLm9uVXBFdmVudCh0cmFuc2xhdGVkWCwgdHJhbnNsYXRlZFksIG1Qb2ludGVySWQsIGV2ZW50VGltZSk7CkBAIC0xMTgwLDE3ICsxMTk3LDIyIEBACiAKICAgICAgICAgaWYgKHNJbkdlc3R1cmUpIHsKICAgICAgICAgICAgIGlmIChjdXJyZW50S2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsTGlzdGVuZXJPblJlbGVhc2UoY3VycmVudEtleSwgY3VycmVudEtleS5tQ29kZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY2FsbExpc3RlbmVyT25SZWxlYXNlKGN1cnJlbnRLZXksIGN1cnJlbnRLZXkubUNvZGUsIHRydWUgLyogd2l0aFNsaWRpbmcgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbWF5RW5kQmF0Y2hJbnB1dChldmVudFRpbWUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Jc1RyYWNraW5nQ2FuY2VsZWQpIHsKKyAgICAgICAgaWYgKG1Jc1RyYWNraW5nRm9yQWN0aW9uRGlzYWJsZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudEtleSAhPSBudWxsICYmICFjdXJyZW50S2V5LmlzUmVwZWF0YWJsZSgpKSB7Ci0gICAgICAgICAgICBkZXRlY3RBbmRTZW5kS2V5KGN1cnJlbnRLZXksIG1LZXlYLCBtS2V5WSwgZXZlbnRUaW1lKTsKKyAgICAgICAgaWYgKGN1cnJlbnRLZXkgIT0gbnVsbCAmJiBjdXJyZW50S2V5LmlzUmVwZWF0YWJsZSgpICYmICFpc0luU2xpZGluZ0tleUlucHV0KSB7CisgICAgICAgICAgICAvLyBSZXBlYXRhYmxlIGtleSBoYXMgYmVlbiByZWdpc3RlcmVkIGluIHtAbGluayAjb25Eb3duRXZlbnRJbnRlcm5hbChpbnQsaW50LGxvbmcpfS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkZXRlY3RBbmRTZW5kS2V5KGN1cnJlbnRLZXksIG1LZXlYLCBtS2V5WSwgZXZlbnRUaW1lKTsKKyAgICAgICAgaWYgKGlzSW5TbGlkaW5nS2V5SW5wdXRGcm9tTW9kaWZpZXIpIHsKKyAgICAgICAgICAgIGNhbGxMaXN0ZW5lck9uRmluaXNoU2xpZGluZ0lucHV0KCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMDMsMTYgKzEyMjUsMTYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxUcmFja2luZygpIHsKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxUcmFja2luZ0ZvckFjdGlvbigpIHsKICAgICAgICAgaWYgKGlzU2hvd2luZ01vcmVLZXlzUGFuZWwoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1Jc1RyYWNraW5nQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICBtSXNUcmFja2luZ0ZvckFjdGlvbkRpc2FibGVkID0gdHJ1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkxvbmdQcmVzc2VkKCkgewogICAgICAgICByZXNldFNsaWRpbmdLZXlJbnB1dCgpOwotICAgICAgICBjYW5jZWxUcmFja2luZygpOworICAgICAgICBjYW5jZWxUcmFja2luZ0ZvckFjdGlvbigpOwogICAgICAgICBzZXRSZWxlYXNlZEtleUdyYXBoaWNzKG1DdXJyZW50S2V5KTsKICAgICAgICAgc1BvaW50ZXJUcmFja2VyUXVldWUucmVtb3ZlKHRoaXMpOwogICAgIH0KQEAgLTEyMzksMTAgKzEyNjEsMTMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRSZXBlYXRLZXkoZmluYWwgS2V5IGtleSkgewotICAgICAgICBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmlzUmVwZWF0YWJsZSgpICYmICFzSW5HZXN0dXJlKSB7Ci0gICAgICAgICAgICBvblJlZ2lzdGVyS2V5KGtleSk7Ci0gICAgICAgICAgICBtVGltZXJQcm94eS5zdGFydEtleVJlcGVhdFRpbWVyKHRoaXMpOwotICAgICAgICB9CisgICAgICAgIGlmIChzSW5HZXN0dXJlKSByZXR1cm47CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBpZiAoIWtleS5pc1JlcGVhdGFibGUoKSkgcmV0dXJuOworICAgICAgICAvLyBEb24ndCBzdGFydCBrZXkgcmVwZWF0IHdoZW4gd2UgYXJlIGluIHNsaWRpbmcgaW5wdXQgbW9kZS4KKyAgICAgICAgaWYgKG1Jc0luU2xpZGluZ0tleUlucHV0KSByZXR1cm47CisgICAgICAgIG9uUmVnaXN0ZXJLZXkoa2V5KTsKKyAgICAgICAgbVRpbWVyUHJveHkuc3RhcnRLZXlSZXBlYXRUaW1lcih0aGlzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblJlZ2lzdGVyS2V5KGZpbmFsIEtleSBrZXkpIHsKQEAgLTEyOTUsOSArMTMyMCwxNSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdGFydExvbmdQcmVzc1RpbWVyKGZpbmFsIEtleSBrZXkpIHsKLSAgICAgICAgaWYgKGtleSAhPSBudWxsICYmIGtleS5pc0xvbmdQcmVzc0VuYWJsZWQoKSAmJiAhc0luR2VzdHVyZSkgewotICAgICAgICAgICAgbVRpbWVyUHJveHkuc3RhcnRMb25nUHJlc3NUaW1lcih0aGlzKTsKLSAgICAgICAgfQorICAgICAgICBpZiAoc0luR2VzdHVyZSkgcmV0dXJuOworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybjsKKyAgICAgICAgaWYgKCFrZXkuaXNMb25nUHJlc3NFbmFibGVkKCkpIHJldHVybjsKKyAgICAgICAgLy8gQ2F2ZWF0OiBQbGVhc2Ugbm90ZSB0aGF0IGlzTG9uZ1ByZXNzRW5hYmxlZCgpIGNhbiBiZSB0cnVlIGV2ZW4gaWYgdGhlIGN1cnJlbnQga2V5CisgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSBpdHMgbW9yZSBrZXlzLiAoZS5nLiBzcGFjZWJhciwgZ2xvYmUga2V5KQorICAgICAgICAvLyBXZSBhbHdheXMgbmVlZCB0byBzdGFydCB0aGUgbG9uZyBwcmVzcyB0aW1lciBpZiB0aGUga2V5IGhhcyBpdHMgbW9yZSBrZXlzIHJlZ2FyZGxlc3Mgb2YKKyAgICAgICAgLy8gd2hldGhlciBvciBub3Qgd2UgYXJlIGluIHRoZSBzbGlkaW5nIGlucHV0IG1vZGUuCisgICAgICAgIGlmIChtSXNJblNsaWRpbmdLZXlJbnB1dCAmJiBrZXkubU1vcmVLZXlzID09IG51bGwpIHJldHVybjsKKyAgICAgICAgbVRpbWVyUHJveHkuc3RhcnRMb25nUHJlc3NUaW1lcih0aGlzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZGV0ZWN0QW5kU2VuZEtleShmaW5hbCBLZXkga2V5LCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGxvbmcgZXZlbnRUaW1lKSB7CkBAIC0xMzA4LDcgKzEzMzksNyBAQAogCiAgICAgICAgIGZpbmFsIGludCBjb2RlID0ga2V5Lm1Db2RlOwogICAgICAgICBjYWxsTGlzdGVuZXJPbkNvZGVJbnB1dChrZXksIGNvZGUsIHgsIHksIGV2ZW50VGltZSk7Ci0gICAgICAgIGNhbGxMaXN0ZW5lck9uUmVsZWFzZShrZXksIGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY2FsbExpc3RlbmVyT25SZWxlYXNlKGtleSwgY29kZSwgZmFsc2UgLyogd2l0aFNsaWRpbmcgKi8pOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwcmludFRvdWNoRXZlbnQoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksCkBAIC0xMzE2LDYgKzEzNDcsNiBAQAogICAgICAgICBmaW5hbCBLZXkga2V5ID0gbUtleURldGVjdG9yLmRldGVjdEhpdEtleSh4LCB5KTsKICAgICAgICAgZmluYWwgU3RyaW5nIGNvZGUgPSBLZXlEZXRlY3Rvci5wcmludGFibGVDb2RlKGtleSk7CiAgICAgICAgIExvZy5kKFRBRywgU3RyaW5nLmZvcm1hdCgiWyVkXSVzJXMgJTRkICU0ZCAlNWQgJXMiLCBtUG9pbnRlcklkLAotICAgICAgICAgICAgICAgIChtSXNUcmFja2luZ0NhbmNlbGVkID8gIi0iIDogIiAiKSwgdGl0bGUsIHgsIHksIGV2ZW50VGltZSwgY29kZSkpOworICAgICAgICAgICAgICAgIChtSXNUcmFja2luZ0ZvckFjdGlvbkRpc2FibGVkID8gIi0iIDogIiAiKSwgdGl0bGUsIHgsIHksIGV2ZW50VGltZSwgY29kZSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL1Byb3hpbWl0eUluZm8uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL1Byb3hpbWl0eUluZm8uamF2YQppbmRleCBiNzdlMzc4Li41N2QzZmVkIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9Qcm94aW1pdHlJbmZvLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvUHJveGltaXR5SW5mby5qYXZhCkBAIC03OSwyMyArNzksNiBAQAogICAgICAgICBtTmF0aXZlUHJveGltaXR5SW5mbyA9IGNyZWF0ZU5hdGl2ZVByb3hpbWl0eUluZm8odG91Y2hQb3NpdGlvbkNvcnJlY3Rpb24pOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBzdWJjbGFzc2VzIHN1Y2ggYXMKLSAgICAgKiB7QGxpbmsgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc3BlbGxjaGVjay5TcGVsbENoZWNrZXJQcm94aW1pdHlJbmZvfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJveGltaXR5SW5mbyhmaW5hbCBpbnRbXSBwcm94aW1pdHlDaGFyc0FycmF5LCBmaW5hbCBpbnQgZ3JpZFdpZHRoLAotICAgICAgICAgICAgZmluYWwgaW50IGdyaWRIZWlnaHQpIHsKLSAgICAgICAgdGhpcygiIiwgMSwgMSwgMSwgMSwgMSwgMSwgRU1QVFlfS0VZX0FSUkFZLCBudWxsKTsKLSAgICAgICAgbU5hdGl2ZVByb3hpbWl0eUluZm8gPSBzZXRQcm94aW1pdHlJbmZvTmF0aXZlKCIiIC8qIGxvY2FsZSAqLywKLSAgICAgICAgICAgICAgICBncmlkV2lkdGggLyogZGlzcGxheVdpZHRoICovLCBncmlkSGVpZ2h0IC8qIGRpc3BsYXlIZWlnaHQgKi8sCi0gICAgICAgICAgICAgICAgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCAxIC8qIG1vc3RDb21tb25LZXlXaWR0aCAqLywKLSAgICAgICAgICAgICAgICAxIC8qIG1vc3RDb21tb25LZXlIZWlnaHQgKi8sIHByb3hpbWl0eUNoYXJzQXJyYXksIDAgLyoga2V5Q291bnQgKi8sCi0gICAgICAgICAgICAgICAgbnVsbCAvKmtleVhDb29yZGluYXRlcyAqLywgbnVsbCAvKiBrZXlZQ29vcmRpbmF0ZXMgKi8sCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBrZXlXaWR0aHMgKi8sIG51bGwgLyoga2V5SGVpZ2h0cyAqLywgbnVsbCAvKiBrZXlDaGFyQ29kZXMgKi8sCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBzd2VldFNwb3RDZW50ZXJYcyAqLywgbnVsbCAvKiBzd2VldFNwb3RDZW50ZXJZcyAqLywKLSAgICAgICAgICAgICAgICBudWxsIC8qIHN3ZWV0U3BvdFJhZGlpICovKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIGxvbmcgbU5hdGl2ZVByb3hpbWl0eUluZm87CiAgICAgc3RhdGljIHsKICAgICAgICAgSm5pVXRpbHMubG9hZE5hdGl2ZUxpYnJhcnkoKTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVTdHJva2UuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVTdHJva2UuamF2YQppbmRleCA1M2RhNDdjLi43MDM2M2U2IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9HZXN0dXJlU3Ryb2tlLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVN0cm9rZS5qYXZhCkBAIC04Myw5ICs4Myw4IEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVJlY29nbml0aW9uTWluaW11bVRpbWU7IC8vIG1zZWMKICAgICAgICAgcHVibGljIGZpbmFsIGZsb2F0IG1SZWNvZ25pdGlvblNwZWVkVGhyZXNob2xkOyAvLyBrZXlXaWR0aC9zZWMKIAotICAgICAgICAvLyBEZWZhdWx0IEdlc3R1cmVTdHJva2UgcGFyYW1ldGVycyBmb3IgdGVzdC4KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHZXN0dXJlU3Ryb2tlUGFyYW1zIEZPUl9URVNUID0gbmV3IEdlc3R1cmVTdHJva2VQYXJhbXMoKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHZXN0dXJlU3Ryb2tlUGFyYW1zIERFRkFVTFQgPSBGT1JfVEVTVDsKKyAgICAgICAgLy8gRGVmYXVsdCBHZXN0dXJlU3Ryb2tlIHBhcmFtZXRlcnMuCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR2VzdHVyZVN0cm9rZVBhcmFtcyBERUZBVUxUID0gbmV3IEdlc3R1cmVTdHJva2VQYXJhbXMoKTsKIAogICAgICAgICBwcml2YXRlIEdlc3R1cmVTdHJva2VQYXJhbXMoKSB7CiAgICAgICAgICAgICAvLyBUaGVzZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBkZWZhdWx0IGFuZCBpbnRlbmRlZCBmb3IgdGVzdGluZy4KQEAgLTE0Niw3ICsxNDUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldEtleWJvYXJkR2VvbWV0cnkoZmluYWwgaW50IGtleVdpZHRoLCBmaW5hbCBpbnQga2V5Ym9hcmRIZWlnaHQpIHsKICAgICAgICAgbUtleVdpZHRoID0ga2V5V2lkdGg7CiAgICAgICAgIG1NaW5ZQ29vcmRpbmF0ZSA9IC0oaW50KShrZXlib2FyZEhlaWdodCAqIEVYVFJBX0dFU1RVUkVfVFJBSUxfQVJFQV9BQk9WRV9LRVlCT0FSRF9SQVRJTyk7Ci0gICAgICAgIG1NYXhZQ29vcmRpbmF0ZSA9IGtleWJvYXJkSGVpZ2h0IC0gMTsKKyAgICAgICAgbU1heFlDb29yZGluYXRlID0ga2V5Ym9hcmRIZWlnaHQ7CiAgICAgICAgIC8vIFRPRE86IEZpbmQgYW4gYXBwcm9wcmlhdGUgYmFzZSBtZXRyaWMgZm9yIHRoZXNlIGxlbmd0aC4gTWF5YmUgZGlhZ29uYWwgbGVuZ3RoIG9mIHRoZSBrZXk/CiAgICAgICAgIG1EZXRlY3RGYXN0TW92ZVNwZWVkVGhyZXNob2xkID0gKGludCkoa2V5V2lkdGggKiBtUGFyYW1zLm1EZXRlY3RGYXN0TW92ZVNwZWVkVGhyZXNob2xkKTsKICAgICAgICAgbUdlc3R1cmVEeW5hbWljRGlzdGFuY2VUaHJlc2hvbGRGcm9tID0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVTdHJva2VXaXRoUHJldmlld1BvaW50cy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVN0cm9rZVdpdGhQcmV2aWV3UG9pbnRzLmphdmEKaW5kZXggMzMxNTk1NC4uYjMxZjAwYiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVN0cm9rZVdpdGhQcmV2aWV3UG9pbnRzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVN0cm9rZVdpdGhQcmV2aWV3UG9pbnRzLmphdmEKQEAgLTE2LDQwICsxNiw3NCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLmludGVybmFsOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SZXNpemFibGVJbnRBcnJheTsKIAogcHVibGljIGZpbmFsIGNsYXNzIEdlc3R1cmVTdHJva2VXaXRoUHJldmlld1BvaW50cyBleHRlbmRzIEdlc3R1cmVTdHJva2UgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVZJRVdfQ0FQQUNJVFkgPSAyNTY7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRV9JTlRFUlBPTEFUSU9OID0gdHJ1ZTsKLQogICAgIHByaXZhdGUgZmluYWwgUmVzaXphYmxlSW50QXJyYXkgbVByZXZpZXdFdmVudFRpbWVzID0gbmV3IFJlc2l6YWJsZUludEFycmF5KFBSRVZJRVdfQ0FQQUNJVFkpOwogICAgIHByaXZhdGUgZmluYWwgUmVzaXphYmxlSW50QXJyYXkgbVByZXZpZXdYQ29vcmRpbmF0ZXMgPSBuZXcgUmVzaXphYmxlSW50QXJyYXkoUFJFVklFV19DQVBBQ0lUWSk7CiAgICAgcHJpdmF0ZSBmaW5hbCBSZXNpemFibGVJbnRBcnJheSBtUHJldmlld1lDb29yZGluYXRlcyA9IG5ldyBSZXNpemFibGVJbnRBcnJheShQUkVWSUVXX0NBUEFDSVRZKTsKIAorICAgIHByaXZhdGUgZmluYWwgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMgbVByZXZpZXdQYXJhbXM7CisKICAgICBwcml2YXRlIGludCBtU3Ryb2tlSWQ7CiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RQcmV2aWV3U2l6ZTsKICAgICBwcml2YXRlIGZpbmFsIEhlcm1pdGVJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvciA9IG5ldyBIZXJtaXRlSW50ZXJwb2xhdG9yKCk7CiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RJbnRlcnBvbGF0ZWRQcmV2aWV3SW5kZXg7CiAKLSAgICBwcml2YXRlIGludCBtTWluUHJldmlld1NhbXBsaW5nRGlzdGFuY2VTcXVhcmVkOwogICAgIHByaXZhdGUgaW50IG1MYXN0WDsKICAgICBwcml2YXRlIGludCBtTGFzdFk7Ci0gICAgcHJpdmF0ZSBkb3VibGUgbU1pblByZXZpZXdTYW1wbGluZ0Rpc3RhbmNlOwogICAgIHByaXZhdGUgZG91YmxlIG1EaXN0YW5jZUZyb21MYXN0U2FtcGxlOwogCi0gICAgLy8gVE9ETzogTW92ZSB0aGVzZSBjb25zdGFudHMgdG8gcmVzb3VyY2UuCi0gICAgLy8gVGhlIG1pbmltdW0gbGluZWFyIGRpc3RhbmNlIGJldHdlZW4gc2FtcGxlIHBvaW50cyBmb3IgcHJldmlldyBpbiBrZXlXaWR0aCB1bml0LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9QUkVWSUVXX1NBTVBMSU5HX1JBVElPX1RPX0tFWV9XSURUSCA9IDAuMWY7Ci0gICAgLy8gVGhlIG1pbmltdW0gdHJhaWwgZGlzdGFuY2UgYmV0d2VlbiBzYW1wbGUgcG9pbnRzIGZvciBwcmV2aWV3IGluIGtleVdpZHRoIHVuaXQgd2hlbiB1c2luZwotICAgIC8vIGludGVycG9sYXRpb24uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX1BSRVZJRVdfU0FNUExJTkdfUkFUSU9fVE9fS0VZX1dJRFRIX1dJVEhfSU5URVJQT0xBVElPTiA9IDAuMmY7Ci0gICAgLy8gVGhlIGFuZ3VsYXIgdGhyZXNob2xkIHRvIHVzZSBpbnRlcnBvbGF0aW9uIGluIHJhZGlhbi4gUEkvMTIgaXMgMTUgZGVncmVlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBJTlRFUlBPTEFUSU9OX0FOR1VMQVJfVEhSRVNIT0xEID0gTWF0aC5QSSAvIDEyLjBkOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSU5URVJQT0xBVElPTl9QQVJUSVRJT04gPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMgeworICAgICAgICBwdWJsaWMgZmluYWwgZG91YmxlIG1NaW5TYW1wbGluZ0Rpc3RhbmNlOyAvLyBpbiBwaXhlbAorICAgICAgICBwdWJsaWMgZmluYWwgZG91YmxlIG1NYXhJbnRlcnBvbGF0aW9uQW5ndWxhclRocmVzaG9sZDsgLy8gaW4gcmFkaWFuCisgICAgICAgIHB1YmxpYyBmaW5hbCBkb3VibGUgbU1heEludGVycG9sYXRpb25EaXN0YW5jZVRocmVzaG9sZDsgLy8gaW4gcGl4ZWwKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtTWF4SW50ZXJwb2xhdGlvblNlZ21lbnRzOwogCi0gICAgcHVibGljIEdlc3R1cmVTdHJva2VXaXRoUHJldmlld1BvaW50cyhmaW5hbCBpbnQgcG9pbnRlcklkLCBmaW5hbCBHZXN0dXJlU3Ryb2tlUGFyYW1zIHBhcmFtcykgewotICAgICAgICBzdXBlcihwb2ludGVySWQsIHBhcmFtcyk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMgREVGQVVMVCA9IG5ldyBHZXN0dXJlU3Ryb2tlUHJldmlld1BhcmFtcygpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9JTlRFUlBPTEFUSU9OX0FOR1VMQVJfVEhSRVNIT0xEID0gMTU7IC8vIGluIGRlZ3JlZQorCisgICAgICAgIHByaXZhdGUgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMoKSB7CisgICAgICAgICAgICBtTWluU2FtcGxpbmdEaXN0YW5jZSA9IDAuMGQ7CisgICAgICAgICAgICBtTWF4SW50ZXJwb2xhdGlvbkFuZ3VsYXJUaHJlc2hvbGQgPQorICAgICAgICAgICAgICAgICAgICBkZWdyZWVUb1JhZGlhbihERUZBVUxUX01BWF9JTlRFUlBPTEFUSU9OX0FOR1VMQVJfVEhSRVNIT0xEKTsKKyAgICAgICAgICAgIG1NYXhJbnRlcnBvbGF0aW9uRGlzdGFuY2VUaHJlc2hvbGQgPSBtTWluU2FtcGxpbmdEaXN0YW5jZTsKKyAgICAgICAgICAgIG1NYXhJbnRlcnBvbGF0aW9uU2VnbWVudHMgPSA0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGRlZ3JlZVRvUmFkaWFuKGZpbmFsIGludCBkZWdyZWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoZG91YmxlKWRlZ3JlZSAvIDE4MC4wZCAqIE1hdGguUEk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMoZmluYWwgVHlwZWRBcnJheSBtYWluS2V5Ym9hcmRWaWV3QXR0cikgeworICAgICAgICAgICAgbU1pblNhbXBsaW5nRGlzdGFuY2UgPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXREaW1lbnNpb24oCisgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVRyYWlsTWluU2FtcGxpbmdEaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KURFRkFVTFQubU1pblNhbXBsaW5nRGlzdGFuY2UpOworICAgICAgICAgICAgZmluYWwgaW50IGludGVycG9sYXRpb25Bbmd1bGFyRGVncmVlID0gbWFpbktleWJvYXJkVmlld0F0dHIuZ2V0SW50ZWdlcihSLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAuTWFpbktleWJvYXJkVmlld19nZXN0dXJlVHJhaWxNYXhJbnRlcnBvbGF0aW9uQW5ndWxhclRocmVzaG9sZCwgMCk7CisgICAgICAgICAgICBtTWF4SW50ZXJwb2xhdGlvbkFuZ3VsYXJUaHJlc2hvbGQgPSAoaW50ZXJwb2xhdGlvbkFuZ3VsYXJEZWdyZWUgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBERUZBVUxULm1NYXhJbnRlcnBvbGF0aW9uQW5ndWxhclRocmVzaG9sZAorICAgICAgICAgICAgICAgICAgICA6IGRlZ3JlZVRvUmFkaWFuKGludGVycG9sYXRpb25Bbmd1bGFyRGVncmVlKTsKKyAgICAgICAgICAgIG1NYXhJbnRlcnBvbGF0aW9uRGlzdGFuY2VUaHJlc2hvbGQgPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUKKyAgICAgICAgICAgICAgICAgICAgLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVRyYWlsTWF4SW50ZXJwb2xhdGlvbkRpc3RhbmNlVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpREVGQVVMVC5tTWF4SW50ZXJwb2xhdGlvbkRpc3RhbmNlVGhyZXNob2xkKTsKKyAgICAgICAgICAgIG1NYXhJbnRlcnBvbGF0aW9uU2VnbWVudHMgPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbE1heEludGVycG9sYXRpb25TZWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVC5tTWF4SW50ZXJwb2xhdGlvblNlZ21lbnRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBHZXN0dXJlU3Ryb2tlV2l0aFByZXZpZXdQb2ludHMoZmluYWwgaW50IHBvaW50ZXJJZCwKKyAgICAgICAgICAgIGZpbmFsIEdlc3R1cmVTdHJva2VQYXJhbXMgc3Ryb2tlUGFyYW1zLAorICAgICAgICAgICAgZmluYWwgR2VzdHVyZVN0cm9rZVByZXZpZXdQYXJhbXMgcHJldmlld1BhcmFtcykgeworICAgICAgICBzdXBlcihwb2ludGVySWQsIHN0cm9rZVBhcmFtcyk7CisgICAgICAgIG1QcmV2aWV3UGFyYW1zID0gcHJldmlld1BhcmFtczsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTY3LDM0ICsxMDEsMTMgQEAKICAgICAgICAgcmV0dXJuIG1TdHJva2VJZDsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRLZXlib2FyZEdlb21ldHJ5KGZpbmFsIGludCBrZXlXaWR0aCwgZmluYWwgaW50IGtleWJvYXJkSGVpZ2h0KSB7Ci0gICAgICAgIHN1cGVyLnNldEtleWJvYXJkR2VvbWV0cnkoa2V5V2lkdGgsIGtleWJvYXJkSGVpZ2h0KTsKLSAgICAgICAgZmluYWwgZmxvYXQgc2FtcGxpbmdSYXRpb1RvS2V5V2lkdGggPSBFTkFCTEVfSU5URVJQT0xBVElPTgotICAgICAgICAgICAgICAgID8gTUlOX1BSRVZJRVdfU0FNUExJTkdfUkFUSU9fVE9fS0VZX1dJRFRIX1dJVEhfSU5URVJQT0xBVElPTgotICAgICAgICAgICAgICAgIDogTUlOX1BSRVZJRVdfU0FNUExJTkdfUkFUSU9fVE9fS0VZX1dJRFRIOwotICAgICAgICBtTWluUHJldmlld1NhbXBsaW5nRGlzdGFuY2UgPSBrZXlXaWR0aCAqIHNhbXBsaW5nUmF0aW9Ub0tleVdpZHRoOwotICAgICAgICBtTWluUHJldmlld1NhbXBsaW5nRGlzdGFuY2VTcXVhcmVkID0gKGludCkoCi0gICAgICAgICAgICAgICAgbU1pblByZXZpZXdTYW1wbGluZ0Rpc3RhbmNlICogbU1pblByZXZpZXdTYW1wbGluZ0Rpc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZHNTYW1wbGluZyhmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGJvb2xlYW4gaXNNYWpvckV2ZW50KSB7Ci0gICAgICAgIGlmIChFTkFCTEVfSU5URVJQT0xBVElPTikgewotICAgICAgICAgICAgbURpc3RhbmNlRnJvbUxhc3RTYW1wbGUgKz0gTWF0aC5oeXBvdCh4IC0gbUxhc3RYLCB5IC0gbUxhc3RZKTsKLSAgICAgICAgICAgIG1MYXN0WCA9IHg7Ci0gICAgICAgICAgICBtTGFzdFkgPSB5OwotICAgICAgICAgICAgaWYgKG1EaXN0YW5jZUZyb21MYXN0U2FtcGxlID49IG1NaW5QcmV2aWV3U2FtcGxpbmdEaXN0YW5jZSkgewotICAgICAgICAgICAgICAgIG1EaXN0YW5jZUZyb21MYXN0U2FtcGxlID0gMC4wZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBkeCA9IHggLSBtTGFzdFg7Ci0gICAgICAgIGZpbmFsIGludCBkeSA9IHkgLSBtTGFzdFk7Ci0gICAgICAgIGlmIChpc01ham9yRXZlbnQgfHwgZHggKiBkeCArIGR5ICogZHkgPj0gbU1pblByZXZpZXdTYW1wbGluZ0Rpc3RhbmNlU3F1YXJlZCkgewotICAgICAgICAgICAgbUxhc3RYID0geDsKLSAgICAgICAgICAgIG1MYXN0WSA9IHk7CisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRzU2FtcGxpbmcoZmluYWwgaW50IHgsIGZpbmFsIGludCB5KSB7CisgICAgICAgIG1EaXN0YW5jZUZyb21MYXN0U2FtcGxlICs9IE1hdGguaHlwb3QoeCAtIG1MYXN0WCwgeSAtIG1MYXN0WSk7CisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEb3duRXZlbnQgPSAobVByZXZpZXdFdmVudFRpbWVzLmdldExlbmd0aCgpID09IDApOworICAgICAgICBpZiAobURpc3RhbmNlRnJvbUxhc3RTYW1wbGUgPj0gbVByZXZpZXdQYXJhbXMubU1pblNhbXBsaW5nRGlzdGFuY2UgfHwgaXNEb3duRXZlbnQpIHsKKyAgICAgICAgICAgIG1EaXN0YW5jZUZyb21MYXN0U2FtcGxlID0gMC4wZDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEwMyw3ICsxMTYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGFkZFBvaW50T25LZXlib2FyZChmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGludCB0aW1lLAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc01ham9yRXZlbnQpIHsKLSAgICAgICAgaWYgKG5lZWRzU2FtcGxpbmcoeCwgeSwgaXNNYWpvckV2ZW50KSkgeworICAgICAgICBpZiAobmVlZHNTYW1wbGluZyh4LCB5KSkgewogICAgICAgICAgICAgbVByZXZpZXdFdmVudFRpbWVzLmFkZCh0aW1lKTsKICAgICAgICAgICAgIG1QcmV2aWV3WENvb3JkaW5hdGVzLmFkZCh4KTsKICAgICAgICAgICAgIG1QcmV2aWV3WUNvb3JkaW5hdGVzLmFkZCh5KTsKQEAgLTEzMiwxNyArMTQ1LDE0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbGFzdEludGVycG9sYXRlZEluZGV4IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgbGFzdCBpbnRlcnBvbGF0ZWQgc2VnbWVudCBvZgogICAgICAqICAgICAgICA8Y29kZT5ldmVudFRpbWVzPC9jb2RlPiwgPGNvZGU+eENvb3JkczwvY29kZT4sIGFuZCA8Y29kZT55Q29vcmRzPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gZXZlbnRUaW1lcyB0aGUgZXZlbnQgdGltZSBhcnJheSBvZiBnZXN0dXJlIHByZXZpZXcgdHJhaWwgdG8gYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHhDb29yZHMgdGhlIHgtY29vcmRpbmF0ZXMgYXJyYXkgb2YgZ2VzdHVyZSBwcmV2aWV3IHRyYWlsIHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSB5Q29vcmRzIHRoZSB5LWNvb3JkaW5hdGVzIGFycmF5IG9mIGdlc3R1cmUgcHJldmlldyB0cmFpbCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gZXZlbnRUaW1lcyB0aGUgZXZlbnQgdGltZSBhcnJheSBvZiBnZXN0dXJlIHRyYWlsIHRvIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4Q29vcmRzIHRoZSB4LWNvb3JkaW5hdGVzIGFycmF5IG9mIGdlc3R1cmUgdHJhaWwgdG8gYmUgZHJhd24uCisgICAgICogQHBhcmFtIHlDb29yZHMgdGhlIHktY29vcmRpbmF0ZXMgYXJyYXkgb2YgZ2VzdHVyZSB0cmFpbCB0byBiZSBkcmF3bi4KICAgICAgKiBAcmV0dXJuIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgbGFzdCBpbnRlcnBvbGF0ZWQgc2VnbWVudCBvZiBpbnB1dCBhcnJheXMuCiAgICAgICovCiAgICAgcHVibGljIGludCBpbnRlcnBvbGF0ZVN0cm9rZUFuZFJldHVyblN0YXJ0SW5kZXhPZkxhc3RTZWdtZW50KGZpbmFsIGludCBsYXN0SW50ZXJwb2xhdGVkSW5kZXgsCiAgICAgICAgICAgICBmaW5hbCBSZXNpemFibGVJbnRBcnJheSBldmVudFRpbWVzLCBmaW5hbCBSZXNpemFibGVJbnRBcnJheSB4Q29vcmRzLAotICAgICAgICAgICAgZmluYWwgUmVzaXphYmxlSW50QXJyYXkgeUNvb3JkcykgewotICAgICAgICBpZiAoIUVOQUJMRV9JTlRFUlBPTEFUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdEludGVycG9sYXRlZEluZGV4OwotICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBSZXNpemFibGVJbnRBcnJheSB5Q29vcmRzLCBmaW5hbCBSZXNpemFibGVJbnRBcnJheSB0eXBlcykgewogICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG1QcmV2aWV3RXZlbnRUaW1lcy5nZXRMZW5ndGgoKTsKICAgICAgICAgZmluYWwgaW50W10gcHQgPSBtUHJldmlld0V2ZW50VGltZXMuZ2V0UHJpbWl0aXZlQXJyYXkoKTsKICAgICAgICAgZmluYWwgaW50W10gcHggPSBtUHJldmlld1hDb29yZGluYXRlcy5nZXRQcmltaXRpdmVBcnJheSgpOwpAQCAtMTYxLDIzICsxNzEsMzUgQEAKICAgICAgICAgICAgIG1JbnRlcnBvbGF0b3Iuc2V0SW50ZXJ2YWwocDAsIHAxLCBwMiwgcDMpOwogICAgICAgICAgICAgZmluYWwgZG91YmxlIG0xID0gTWF0aC5hdGFuMihtSW50ZXJwb2xhdG9yLm1TbG9wZTFZLCBtSW50ZXJwb2xhdG9yLm1TbG9wZTFYKTsKICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBtMiA9IE1hdGguYXRhbjIobUludGVycG9sYXRvci5tU2xvcGUyWSwgbUludGVycG9sYXRvci5tU2xvcGUyWCk7Ci0gICAgICAgICAgICBmaW5hbCBkb3VibGUgZG0gPSBNYXRoLmFicyhhbmd1bGFyRGlmZihtMiwgbTEpKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBwYXJ0aXRpb24gPSBNYXRoLm1pbigoaW50KU1hdGguY2VpbChkbSAvIElOVEVSUE9MQVRJT05fQU5HVUxBUl9USFJFU0hPTEQpLAotICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJQT0xBVElPTl9QQVJUSVRJT04pOworICAgICAgICAgICAgZmluYWwgZG91YmxlIGRlbHRhQW5nbGUgPSBNYXRoLmFicyhhbmd1bGFyRGlmZihtMiwgbTEpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzZWdtZW50c0J5QW5nbGUgPSAoaW50KU1hdGguY2VpbCgKKyAgICAgICAgICAgICAgICAgICAgZGVsdGFBbmdsZSAvIG1QcmV2aWV3UGFyYW1zLm1NYXhJbnRlcnBvbGF0aW9uQW5ndWxhclRocmVzaG9sZCk7CisgICAgICAgICAgICBmaW5hbCBkb3VibGUgZGVsdGFEaXN0YW5jZSA9IE1hdGguaHlwb3QobUludGVycG9sYXRvci5tUDFYIC0gbUludGVycG9sYXRvci5tUDJYLAorICAgICAgICAgICAgICAgICAgICBtSW50ZXJwb2xhdG9yLm1QMVkgLSBtSW50ZXJwb2xhdG9yLm1QMlkpOworICAgICAgICAgICAgZmluYWwgaW50IHNlZ21lbnRzQnlEaXN0YW5jZSA9IChpbnQpTWF0aC5jZWlsKGRlbHRhRGlzdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgLyBtUHJldmlld1BhcmFtcy5tTWF4SW50ZXJwb2xhdGlvbkRpc3RhbmNlVGhyZXNob2xkKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzZWdtZW50cyA9IE1hdGgubWluKG1QcmV2aWV3UGFyYW1zLm1NYXhJbnRlcnBvbGF0aW9uU2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KHNlZ21lbnRzQnlBbmdsZSwgc2VnbWVudHNCeURpc3RhbmNlKSk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgdDEgPSBldmVudFRpbWVzLmdldChkMSk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgZHQgPSBwdFtwMl0gLSBwdFtwMV07CiAgICAgICAgICAgICBkMSsrOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0aXRpb247IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHQgPSBpIC8gKGZsb2F0KXBhcnRpdGlvbjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHQgPSBpIC8gKGZsb2F0KXNlZ21lbnRzOwogICAgICAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCk7CiAgICAgICAgICAgICAgICAgZXZlbnRUaW1lcy5hZGQoZDEsIChpbnQpKGR0ICogdCkgKyB0MSk7CiAgICAgICAgICAgICAgICAgeENvb3Jkcy5hZGQoZDEsIChpbnQpbUludGVycG9sYXRvci5tSW50ZXJwb2xhdGVkWCk7CiAgICAgICAgICAgICAgICAgeUNvb3Jkcy5hZGQoZDEsIChpbnQpbUludGVycG9sYXRvci5tSW50ZXJwb2xhdGVkWSk7CisgICAgICAgICAgICAgICAgaWYgKEdlc3R1cmVUcmFpbC5EQkdfU0hPV19QT0lOVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKGQxLCBHZXN0dXJlVHJhaWwuUE9JTlRfVFlQRV9JTlRFUlBPTEFURUQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkMSsrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXZlbnRUaW1lcy5hZGQoZDEsIHB0W3AyXSk7CiAgICAgICAgICAgICB4Q29vcmRzLmFkZChkMSwgcHhbcDJdKTsKICAgICAgICAgICAgIHlDb29yZHMuYWRkKGQxLCBweVtwMl0pOworICAgICAgICAgICAgaWYgKEdlc3R1cmVUcmFpbC5EQkdfU0hPV19QT0lOVFMpIHsKKyAgICAgICAgICAgICAgICB0eXBlcy5hZGQoZDEsIEdlc3R1cmVUcmFpbC5QT0lOVF9UWVBFX1NBTVBMRUQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBsYXN0SW50ZXJwb2xhdGVkRHJhd0luZGV4OwogICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVQcmV2aWV3VHJhaWwuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVUcmFpbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIGphdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVQcmV2aWV3VHJhaWwuamF2YQpyZW5hbWUgdG8gamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVRyYWlsLmphdmEKaW5kZXggN2ZkMWJlZC4uMDNkZDFjMyAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVByZXZpZXdUcmFpbC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVUcmFpbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CkBAIC0yOCwxOSArMjksMjYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SZXNpemFibGVJbnRBcnJheTsKIAogLyoKLSAqIEBhdHRyIHJlZiBSLnN0eWxlYWJsZSNNYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVQcmV2aWV3VHJhaWxGYWRlb3V0U3RhcnREZWxheQotICogQGF0dHIgcmVmIFIuc3R5bGVhYmxlI01haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbEZhZGVvdXREdXJhdGlvbgotICogQGF0dHIgcmVmIFIuc3R5bGVhYmxlI01haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbFVwZGF0ZUludGVydmFsCi0gKiBAYXR0ciByZWYgUi5zdHlsZWFibGUjTWFpbktleWJvYXJkVmlld19nZXN0dXJlUHJldmlld1RyYWlsQ29sb3IKLSAqIEBhdHRyIHJlZiBSLnN0eWxlYWJsZSNNYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVQcmV2aWV3VHJhaWxXaWR0aAorICogQGF0dHIgcmVmIFIuc3R5bGVhYmxlI01haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVRyYWlsRmFkZW91dFN0YXJ0RGVsYXkKKyAqIEBhdHRyIHJlZiBSLnN0eWxlYWJsZSNNYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbEZhZGVvdXREdXJhdGlvbgorICogQGF0dHIgcmVmIFIuc3R5bGVhYmxlI01haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVRyYWlsVXBkYXRlSW50ZXJ2YWwKKyAqIEBhdHRyIHJlZiBSLnN0eWxlYWJsZSNNYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbENvbG9yCisgKiBAYXR0ciByZWYgUi5zdHlsZWFibGUjTWFpbktleWJvYXJkVmlld19nZXN0dXJlVHJhaWxXaWR0aAogICovCi1maW5hbCBjbGFzcyBHZXN0dXJlUHJldmlld1RyYWlsIHsKK2ZpbmFsIGNsYXNzIEdlc3R1cmVUcmFpbCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERCR19TSE9XX1BPSU5UUyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPSU5UX1RZUEVfU0FNUExFRCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9JTlRfVFlQRV9JTlRFUlBPTEFURUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPSU5UX1RZUEVfQ09NUFJPTUlTRUQgPSAyOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSBHZXN0dXJlU3Ryb2tlV2l0aFByZXZpZXdQb2ludHMuUFJFVklFV19DQVBBQ0lUWTsKIAogICAgIC8vIFRoZXNlIHRocmVlIHtAbGluayBSZXNpemFibGVJbnRBcnJheX1zIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgYnkge0BsaW5rICNtRXZlbnRUaW1lc30uCiAgICAgcHJpdmF0ZSBmaW5hbCBSZXNpemFibGVJbnRBcnJheSBtWENvb3JkaW5hdGVzID0gbmV3IFJlc2l6YWJsZUludEFycmF5KERFRkFVTFRfQ0FQQUNJVFkpOwogICAgIHByaXZhdGUgZmluYWwgUmVzaXphYmxlSW50QXJyYXkgbVlDb29yZGluYXRlcyA9IG5ldyBSZXNpemFibGVJbnRBcnJheShERUZBVUxUX0NBUEFDSVRZKTsKICAgICBwcml2YXRlIGZpbmFsIFJlc2l6YWJsZUludEFycmF5IG1FdmVudFRpbWVzID0gbmV3IFJlc2l6YWJsZUludEFycmF5KERFRkFVTFRfQ0FQQUNJVFkpOworICAgIHByaXZhdGUgZmluYWwgUmVzaXphYmxlSW50QXJyYXkgbVBvaW50VHlwZXMgPSBuZXcgUmVzaXphYmxlSW50QXJyYXkoCisgICAgICAgICAgICBEQkdfU0hPV19QT0lOVFMgPyBERUZBVUxUX0NBUEFDSVRZIDogMCk7CiAgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTdHJva2VJZCA9IC0xOwogICAgIC8vIFRoZSB3YWxsIHRpbWUgb2YgdGhlIHplcm8gdmFsdWUgaW4ge0BsaW5rICNtRXZlbnRUaW1lc30KICAgICBwcml2YXRlIGxvbmcgbUN1cnJlbnRUaW1lQmFzZTsKQEAgLTYyLDI2ICs3MCwyNiBAQAogCiAgICAgICAgIHB1YmxpYyBQYXJhbXMoZmluYWwgVHlwZWRBcnJheSBtYWluS2V5Ym9hcmRWaWV3QXR0cikgewogICAgICAgICAgICAgbVRyYWlsQ29sb3IgPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXRDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWFpbktleWJvYXJkVmlld19nZXN0dXJlUHJldmlld1RyYWlsQ29sb3IsIDApOworICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbENvbG9yLCAwKTsKICAgICAgICAgICAgIG1UcmFpbFN0YXJ0V2lkdGggPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXREaW1lbnNpb24oCi0gICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbFN0YXJ0V2lkdGgsIDAuMGYpOworICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbFN0YXJ0V2lkdGgsIDAuMGYpOwogICAgICAgICAgICAgbVRyYWlsRW5kV2lkdGggPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXREaW1lbnNpb24oCi0gICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbEVuZFdpZHRoLCAwLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWFpbktleWJvYXJkVmlld19nZXN0dXJlVHJhaWxFbmRXaWR0aCwgMC4wZik7CiAgICAgICAgICAgICBmaW5hbCBpbnQgUEVSQ0VOVEFHRV9JTlQgPSAxMDA7CiAgICAgICAgICAgICBtVHJhaWxCb2R5UmF0aW8gPSAoZmxvYXQpbWFpbktleWJvYXJkVmlld0F0dHIuZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVQcmV2aWV3VHJhaWxCb2R5UmF0aW8sIFBFUkNFTlRBR0VfSU5UKQorICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbEJvZHlSYXRpbywgUEVSQ0VOVEFHRV9JTlQpCiAgICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KVBFUkNFTlRBR0VfSU5UOwogICAgICAgICAgICAgZmluYWwgaW50IHRyYWlsU2hhZG93UmF0aW9JbnQgPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbFNoYWRvd1JhdGlvLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWFpbktleWJvYXJkVmlld19nZXN0dXJlVHJhaWxTaGFkb3dSYXRpbywgMCk7CiAgICAgICAgICAgICBtVHJhaWxTaGFkb3dFbmFibGVkID0gKHRyYWlsU2hhZG93UmF0aW9JbnQgPiAwKTsKICAgICAgICAgICAgIG1UcmFpbFNoYWRvd1JhdGlvID0gKGZsb2F0KXRyYWlsU2hhZG93UmF0aW9JbnQgLyAoZmxvYXQpUEVSQ0VOVEFHRV9JTlQ7Ci0gICAgICAgICAgICBtRmFkZW91dFN0YXJ0RGVsYXkgPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbEZhZGVvdXRTdGFydERlbGF5LCAwKTsKLSAgICAgICAgICAgIG1GYWRlb3V0RHVyYXRpb24gPSBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVByZXZpZXdUcmFpbEZhZGVvdXREdXJhdGlvbiwgMCk7CisgICAgICAgICAgICBtRmFkZW91dFN0YXJ0RGVsYXkgPSBEQkdfU0hPV19QT0lOVFMgPyAyMDAwIDogbWFpbktleWJvYXJkVmlld0F0dHIuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbEZhZGVvdXRTdGFydERlbGF5LCAwKTsKKyAgICAgICAgICAgIG1GYWRlb3V0RHVyYXRpb24gPSBEQkdfU0hPV19QT0lOVFMgPyAyMDAgOiBtYWluS2V5Ym9hcmRWaWV3QXR0ci5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1haW5LZXlib2FyZFZpZXdfZ2VzdHVyZVRyYWlsRmFkZW91dER1cmF0aW9uLCAwKTsKICAgICAgICAgICAgIG1UcmFpbExpbmdlckR1cmF0aW9uID0gbUZhZGVvdXRTdGFydERlbGF5ICsgbUZhZGVvdXREdXJhdGlvbjsKICAgICAgICAgICAgIG1VcGRhdGVJbnRlcnZhbCA9IG1haW5LZXlib2FyZFZpZXdBdHRyLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWFpbktleWJvYXJkVmlld19nZXN0dXJlUHJldmlld1RyYWlsVXBkYXRlSW50ZXJ2YWwsIDApOworICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NYWluS2V5Ym9hcmRWaWV3X2dlc3R1cmVUcmFpbFVwZGF0ZUludGVydmFsLCAwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI1LDcgKzEzMyw3IEBACiAgICAgICAgIGZpbmFsIGludCBsYXN0SW50ZXJwb2xhdGVkSW5kZXggPSAoc3Ryb2tlSWQgPT0gbUN1cnJlbnRTdHJva2VJZCkKICAgICAgICAgICAgICAgICA/IG1MYXN0SW50ZXJwb2xhdGVkRHJhd0luZGV4IDogdHJhaWxTaXplOwogICAgICAgICBtTGFzdEludGVycG9sYXRlZERyYXdJbmRleCA9IHN0cm9rZS5pbnRlcnBvbGF0ZVN0cm9rZUFuZFJldHVyblN0YXJ0SW5kZXhPZkxhc3RTZWdtZW50KAotICAgICAgICAgICAgICAgIGxhc3RJbnRlcnBvbGF0ZWRJbmRleCwgbUV2ZW50VGltZXMsIG1YQ29vcmRpbmF0ZXMsIG1ZQ29vcmRpbmF0ZXMpOworICAgICAgICAgICAgICAgIGxhc3RJbnRlcnBvbGF0ZWRJbmRleCwgbUV2ZW50VGltZXMsIG1YQ29vcmRpbmF0ZXMsIG1ZQ29vcmRpbmF0ZXMsIG1Qb2ludFR5cGVzKTsKICAgICAgICAgaWYgKHN0cm9rZUlkICE9IG1DdXJyZW50U3Ryb2tlSWQpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBlbGFwc2VkVGltZSA9IChpbnQpKGRvd25UaW1lIC0gbUN1cnJlbnRUaW1lQmFzZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gbVRyYWlsU3RhcnRJbmRleDsgaSA8IHRyYWlsU2l6ZTsgaSsrKSB7CkBAIC0xNzgsMTIgKzE4NiwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgUmVjdCBtUm91bmRlZExpbmVCb3VuZHMgPSBuZXcgUmVjdCgpOwogCiAgICAgLyoqCi0gICAgICogRHJhdyBnZXN0dXJlIHByZXZpZXcgdHJhaWwKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgdG8gZHJhdyB0aGUgZ2VzdHVyZSBwcmV2aWV3IHRyYWlsCi0gICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCBvYmplY3QgdG8gYmUgdXNlZCB0byBkcmF3IHRoZSBnZXN0dXJlIHByZXZpZXcgdHJhaWwKKyAgICAgKiBEcmF3IGdlc3R1cmUgdHJhaWwKKyAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgdG8gZHJhdyB0aGUgZ2VzdHVyZSB0cmFpbAorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgb2JqZWN0IHRvIGJlIHVzZWQgdG8gZHJhdyB0aGUgZ2VzdHVyZSB0cmFpbAogICAgICAqIEBwYXJhbSBvdXRCb3VuZHNSZWN0IHRoZSBib3VuZGluZyBib3ggb2YgdGhpcyBnZXN0dXJlIHRyYWlsIGRyYXdpbmcKLSAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBkcmF3aW5nIHBhcmFtZXRlcnMgb2YgZ2VzdHVyZSBwcmV2aWV3IHRyYWlsCi0gICAgICogQHJldHVybiB0cnVlIGlmIHNvbWUgZ2VzdHVyZSBwcmV2aWV3IHRyYWlscyByZW1haW4gdG8gYmUgZHJhd24KKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBkcmF3aW5nIHBhcmFtZXRlcnMgb2YgZ2VzdHVyZSB0cmFpbAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzb21lIGdlc3R1cmUgdHJhaWxzIHJlbWFpbiB0byBiZSBkcmF3bgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRyYXdHZXN0dXJlVHJhaWwoZmluYWwgQ2FudmFzIGNhbnZhcywgZmluYWwgUGFpbnQgcGFpbnQsCiAgICAgICAgICAgICBmaW5hbCBSZWN0IG91dEJvdW5kc1JlY3QsIGZpbmFsIFBhcmFtcyBwYXJhbXMpIHsKQEAgLTIwNCw2ICsyMTIsNyBAQAogICAgICAgICBmaW5hbCBpbnRbXSBldmVudFRpbWVzID0gbUV2ZW50VGltZXMuZ2V0UHJpbWl0aXZlQXJyYXkoKTsKICAgICAgICAgZmluYWwgaW50W10geENvb3JkcyA9IG1YQ29vcmRpbmF0ZXMuZ2V0UHJpbWl0aXZlQXJyYXkoKTsKICAgICAgICAgZmluYWwgaW50W10geUNvb3JkcyA9IG1ZQ29vcmRpbmF0ZXMuZ2V0UHJpbWl0aXZlQXJyYXkoKTsKKyAgICAgICAgZmluYWwgaW50W10gcG9pbnRUeXBlcyA9IG1Qb2ludFR5cGVzLmdldFByaW1pdGl2ZUFycmF5KCk7CiAgICAgICAgIGZpbmFsIGludCBzaW5jZURvd24gPSAoaW50KShTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1DdXJyZW50VGltZUJhc2UpOwogICAgICAgICBpbnQgc3RhcnRJbmRleDsKICAgICAgICAgZm9yIChzdGFydEluZGV4ID0gbVRyYWlsU3RhcnRJbmRleDsgc3RhcnRJbmRleCA8IHRyYWlsU2l6ZTsgc3RhcnRJbmRleCsrKSB7CkBAIC0yNDYsNiArMjU1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWxwaGEgPSBnZXRBbHBoYShlbGFwc2VkVGltZSwgcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LnNldEFscGhhKGFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChwYXRoLCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHX1NIT1dfUE9JTlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50VHlwZXNbaV0gPT0gUE9JTlRfVFlQRV9JTlRFUlBPTEFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0Q29sb3IoQ29sb3IuUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50VHlwZXNbaV0gPT0gUE9JTlRfVFlQRV9TQU1QTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LnNldENvbG9yKDB4RkZBMDAwRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LnNldENvbG9yKENvbG9yLkdSRUVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdDaXJjbGUocDF4IC0gMSwgcDF5IC0gMSwgMiwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LnNldENvbG9yKHBhcmFtcy5tVHJhaWxDb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcDF4ID0gcDJ4OwpAQCAtMjY1LDYgKzI4NSw5IEBACiAgICAgICAgICAgICBtRXZlbnRUaW1lcy5zZXRMZW5ndGgobmV3U2l6ZSk7CiAgICAgICAgICAgICBtWENvb3JkaW5hdGVzLnNldExlbmd0aChuZXdTaXplKTsKICAgICAgICAgICAgIG1ZQ29vcmRpbmF0ZXMuc2V0TGVuZ3RoKG5ld1NpemUpOworICAgICAgICAgICAgaWYgKERCR19TSE9XX1BPSU5UUykgeworICAgICAgICAgICAgICAgIG1Qb2ludFR5cGVzLnNldExlbmd0aChuZXdTaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBzdHJva2UKICAgICAgICAgICAgIC8vIHtAbGluayBtTGFzdEludGVycG9sYXRlZERyYXdJbmRleH0gc2hvdWxkIGFsc28gYmUgdXBkYXRlZCBiZWNhdXNlIGFsbCBhcnJheQogICAgICAgICAgICAgLy8gZWxlbWVudHMgaGF2ZSBqdXN0IGJlZW4gc2hpZnRlZCBmb3IgY29tcGFjdGlvbiBvciBiZWVuIHplcm9lZC4KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVUcmFpbHNQcmV2aWV3LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9HZXN0dXJlVHJhaWxzUHJldmlldy5qYXZhCmluZGV4IDg1NTU4ZjEuLjFlNGM0M2UgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0dlc3R1cmVUcmFpbHNQcmV2aWV3LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvR2VzdHVyZVRyYWlsc1ByZXZpZXcuamF2YQpAQCAtMjksNyArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuUG9pbnRlclRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuaW50ZXJuYWwuR2VzdHVyZVByZXZpZXdUcmFpbC5QYXJhbXM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuaW50ZXJuYWwuR2VzdHVyZVRyYWlsLlBhcmFtczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5Db2xsZWN0aW9uVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlcjsKIApAQCAtMzcsOSArMzcsOCBAQAogICogRHJhdyBnZXN0dXJlIHRyYWlsIHByZXZpZXcgZ3JhcGhpY3MgZHVyaW5nIGdlc3R1cmUuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHZXN0dXJlVHJhaWxzUHJldmlldyBleHRlbmRzIEFic3RyYWN0RHJhd2luZ1ByZXZpZXcgewotICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8R2VzdHVyZVByZXZpZXdUcmFpbD4gbUdlc3R1cmVQcmV2aWV3VHJhaWxzID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25VdGlscy5uZXdTcGFyc2VBcnJheSgpOwotICAgIHByaXZhdGUgZmluYWwgUGFyYW1zIG1HZXN0dXJlUHJldmlld1RyYWlsUGFyYW1zOworICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8R2VzdHVyZVRyYWlsPiBtR2VzdHVyZVRyYWlscyA9IENvbGxlY3Rpb25VdGlscy5uZXdTcGFyc2VBcnJheSgpOworICAgIHByaXZhdGUgZmluYWwgUGFyYW1zIG1HZXN0dXJlVHJhaWxQYXJhbXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtR2VzdHVyZVBhaW50OwogICAgIHByaXZhdGUgaW50IG1PZmZzY3JlZW5XaWR0aDsKICAgICBwcml2YXRlIGludCBtT2Zmc2NyZWVuSGVpZ2h0OwpAQCAtNDgsMjAgKzQ3LDIwIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDYW52YXMgbU9mZnNjcmVlbkNhbnZhcyA9IG5ldyBDYW52YXMoKTsKICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbU9mZnNjcmVlblNyY1JlY3QgPSBuZXcgUmVjdCgpOwogICAgIHByaXZhdGUgZmluYWwgUmVjdCBtRGlydHlSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3QgbUdlc3R1cmVQcmV2aWV3VHJhaWxCb3VuZHNSZWN0ID0gbmV3IFJlY3QoKTsgLy8gcGVyIHRyYWlsCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1HZXN0dXJlVHJhaWxCb3VuZHNSZWN0ID0gbmV3IFJlY3QoKTsgLy8gcGVyIHRyYWlsCiAKICAgICBwcml2YXRlIGZpbmFsIERyYXdpbmdIYW5kbGVyIG1EcmF3aW5nSGFuZGxlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERyYXdpbmdIYW5kbGVyCiAgICAgICAgICAgICBleHRlbmRzIFN0YXRpY0lubmVySGFuZGxlcldyYXBwZXI8R2VzdHVyZVRyYWlsc1ByZXZpZXc+IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfR0VTVFVSRV9QUkVWSUVXX1RSQUlMID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfR0VTVFVSRV9UUkFJTCA9IDA7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJhbXMgbUdlc3R1cmVQcmV2aWV3VHJhaWxQYXJhbXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFyYW1zIG1HZXN0dXJlVHJhaWxQYXJhbXM7CiAKICAgICAgICAgcHVibGljIERyYXdpbmdIYW5kbGVyKGZpbmFsIEdlc3R1cmVUcmFpbHNQcmV2aWV3IG91dGVySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgZmluYWwgUGFyYW1zIGdlc3R1cmVQcmV2aWV3VHJhaWxQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbXMgZ2VzdHVyZVRyYWlsUGFyYW1zKSB7CiAgICAgICAgICAgICBzdXBlcihvdXRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIG1HZXN0dXJlUHJldmlld1RyYWlsUGFyYW1zID0gZ2VzdHVyZVByZXZpZXdUcmFpbFBhcmFtczsKKyAgICAgICAgICAgIG1HZXN0dXJlVHJhaWxQYXJhbXMgPSBnZXN0dXJlVHJhaWxQYXJhbXM7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTY5LDIzICs2OCwyMyBAQAogICAgICAgICAgICAgZmluYWwgR2VzdHVyZVRyYWlsc1ByZXZpZXcgcHJldmlldyA9IGdldE91dGVySW5zdGFuY2UoKTsKICAgICAgICAgICAgIGlmIChwcmV2aWV3ID09IG51bGwpIHJldHVybjsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9HRVNUVVJFX1BSRVZJRVdfVFJBSUw6CisgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfR0VTVFVSRV9UUkFJTDoKICAgICAgICAgICAgICAgICBwcmV2aWV3LmdldERyYXdpbmdWaWV3KCkuaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgcG9zdFVwZGF0ZUdlc3R1cmVUcmFpbFByZXZpZXcoKSB7Ci0gICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX0dFU1RVUkVfUFJFVklFV19UUkFJTCk7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShNU0dfVVBEQVRFX0dFU1RVUkVfUFJFVklFV19UUkFJTCksCi0gICAgICAgICAgICAgICAgICAgIG1HZXN0dXJlUHJldmlld1RyYWlsUGFyYW1zLm1VcGRhdGVJbnRlcnZhbCk7CisgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX0dFU1RVUkVfVFJBSUwpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9HRVNUVVJFX1RSQUlMKSwKKyAgICAgICAgICAgICAgICAgICAgbUdlc3R1cmVUcmFpbFBhcmFtcy5tVXBkYXRlSW50ZXJ2YWwpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIEdlc3R1cmVUcmFpbHNQcmV2aWV3KGZpbmFsIFZpZXcgZHJhd2luZ1ZpZXcsIGZpbmFsIFR5cGVkQXJyYXkgbWFpbktleWJvYXJkVmlld0F0dHIpIHsKICAgICAgICAgc3VwZXIoZHJhd2luZ1ZpZXcpOwotICAgICAgICBtR2VzdHVyZVByZXZpZXdUcmFpbFBhcmFtcyA9IG5ldyBQYXJhbXMobWFpbktleWJvYXJkVmlld0F0dHIpOwotICAgICAgICBtRHJhd2luZ0hhbmRsZXIgPSBuZXcgRHJhd2luZ0hhbmRsZXIodGhpcywgbUdlc3R1cmVQcmV2aWV3VHJhaWxQYXJhbXMpOworICAgICAgICBtR2VzdHVyZVRyYWlsUGFyYW1zID0gbmV3IFBhcmFtcyhtYWluS2V5Ym9hcmRWaWV3QXR0cik7CisgICAgICAgIG1EcmF3aW5nSGFuZGxlciA9IG5ldyBEcmF3aW5nSGFuZGxlcih0aGlzLCBtR2VzdHVyZVRyYWlsUGFyYW1zKTsKICAgICAgICAgZmluYWwgUGFpbnQgZ2VzdHVyZVBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgIGdlc3R1cmVQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CiAgICAgICAgIGdlc3R1cmVQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkMpKTsKQEAgLTEzMywyMSArMTMyLDIwIEBACiAgICAgICAgICAgICBvZmZzY3JlZW5DYW52YXMuZHJhd1JlY3QoZGlydHlSZWN0LCBwYWludCk7CiAgICAgICAgIH0KICAgICAgICAgZGlydHlSZWN0LnNldEVtcHR5KCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNVcGRhdGluZ0dlc3R1cmVQcmV2aWV3VHJhaWwgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1VwZGF0aW5nR2VzdHVyZVRyYWlsID0gZmFsc2U7CiAgICAgICAgIC8vIERyYXcgZ2VzdHVyZSB0cmFpbHMgdG8gb2Zmc2NyZWVuIGJ1ZmZlci4KLSAgICAgICAgc3luY2hyb25pemVkIChtR2VzdHVyZVByZXZpZXdUcmFpbHMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtR2VzdHVyZVRyYWlscykgewogICAgICAgICAgICAgLy8gVHJhaWxzIGNvdW50ID09IGZpbmdlcnMgY291bnQgdGhhdCBoYXZlIGV2ZXIgYmVlbiBhY3RpdmUuCi0gICAgICAgICAgICBmaW5hbCBpbnQgdHJhaWxzQ291bnQgPSBtR2VzdHVyZVByZXZpZXdUcmFpbHMuc2l6ZSgpOworICAgICAgICAgICAgZmluYWwgaW50IHRyYWlsc0NvdW50ID0gbUdlc3R1cmVUcmFpbHMuc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWlsc0NvdW50OyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgR2VzdHVyZVByZXZpZXdUcmFpbCB0cmFpbCA9IG1HZXN0dXJlUHJldmlld1RyYWlscy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBuZWVkc1VwZGF0aW5nR2VzdHVyZVByZXZpZXdUcmFpbCB8PQotICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWwuZHJhd0dlc3R1cmVUcmFpbChvZmZzY3JlZW5DYW52YXMsIHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR2VzdHVyZVByZXZpZXdUcmFpbEJvdW5kc1JlY3QsIG1HZXN0dXJlUHJldmlld1RyYWlsUGFyYW1zKTsKLSAgICAgICAgICAgICAgICAvLyB7QGxpbmsgI21HZXN0dXJlUHJldmlld1RyYWlsQm91bmRzUmVjdH0gaGFzIGJvdW5kaW5nIGJveCBvZiB0aGUgdHJhaWwuCi0gICAgICAgICAgICAgICAgZGlydHlSZWN0LnVuaW9uKG1HZXN0dXJlUHJldmlld1RyYWlsQm91bmRzUmVjdCk7CisgICAgICAgICAgICAgICAgZmluYWwgR2VzdHVyZVRyYWlsIHRyYWlsID0gbUdlc3R1cmVUcmFpbHMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGluZ0dlc3R1cmVUcmFpbCB8PSB0cmFpbC5kcmF3R2VzdHVyZVRyYWlsKG9mZnNjcmVlbkNhbnZhcywgcGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtR2VzdHVyZVRyYWlsQm91bmRzUmVjdCwgbUdlc3R1cmVUcmFpbFBhcmFtcyk7CisgICAgICAgICAgICAgICAgLy8ge0BsaW5rICNtR2VzdHVyZVRyYWlsQm91bmRzUmVjdH0gaGFzIGJvdW5kaW5nIGJveCBvZiB0aGUgdHJhaWwuCisgICAgICAgICAgICAgICAgZGlydHlSZWN0LnVuaW9uKG1HZXN0dXJlVHJhaWxCb3VuZHNSZWN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmVlZHNVcGRhdGluZ0dlc3R1cmVQcmV2aWV3VHJhaWw7CisgICAgICAgIHJldHVybiBuZWVkc1VwZGF0aW5nR2VzdHVyZVRyYWlsOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxLDkgKzE1OSw5IEBACiAgICAgICAgIH0KICAgICAgICAgbWF5QWxsb2NhdGVPZmZzY3JlZW5CdWZmZXIoKTsKICAgICAgICAgLy8gRHJhdyBnZXN0dXJlIHRyYWlscyB0byBvZmZzY3JlZW4gYnVmZmVyLgotICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRzVXBkYXRpbmdHZXN0dXJlUHJldmlld1RyYWlsID0gZHJhd0dlc3R1cmVUcmFpbHMoCisgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNVcGRhdGluZ0dlc3R1cmVUcmFpbCA9IGRyYXdHZXN0dXJlVHJhaWxzKAogICAgICAgICAgICAgICAgIG1PZmZzY3JlZW5DYW52YXMsIG1HZXN0dXJlUGFpbnQsIG1EaXJ0eVJlY3QpOwotICAgICAgICBpZiAobmVlZHNVcGRhdGluZ0dlc3R1cmVQcmV2aWV3VHJhaWwpIHsKKyAgICAgICAgaWYgKG5lZWRzVXBkYXRpbmdHZXN0dXJlVHJhaWwpIHsKICAgICAgICAgICAgIG1EcmF3aW5nSGFuZGxlci5wb3N0VXBkYXRlR2VzdHVyZVRyYWlsUHJldmlldygpOwogICAgICAgICB9CiAgICAgICAgIC8vIFRyYW5zZmVyIG9mZnNjcmVlbiBidWZmZXIgdG8gc2NyZWVuLgpAQCAtMTg1LDEyICsxODMsMTIgQEAKICAgICAgICAgaWYgKCFpc1ByZXZpZXdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBHZXN0dXJlUHJldmlld1RyYWlsIHRyYWlsOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1HZXN0dXJlUHJldmlld1RyYWlscykgewotICAgICAgICAgICAgdHJhaWwgPSBtR2VzdHVyZVByZXZpZXdUcmFpbHMuZ2V0KHRyYWNrZXIubVBvaW50ZXJJZCk7CisgICAgICAgIEdlc3R1cmVUcmFpbCB0cmFpbDsKKyAgICAgICAgc3luY2hyb25pemVkIChtR2VzdHVyZVRyYWlscykgeworICAgICAgICAgICAgdHJhaWwgPSBtR2VzdHVyZVRyYWlscy5nZXQodHJhY2tlci5tUG9pbnRlcklkKTsKICAgICAgICAgICAgIGlmICh0cmFpbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJhaWwgPSBuZXcgR2VzdHVyZVByZXZpZXdUcmFpbCgpOwotICAgICAgICAgICAgICAgIG1HZXN0dXJlUHJldmlld1RyYWlscy5wdXQodHJhY2tlci5tUG9pbnRlcklkLCB0cmFpbCk7CisgICAgICAgICAgICAgICAgdHJhaWwgPSBuZXcgR2VzdHVyZVRyYWlsKCk7CisgICAgICAgICAgICAgICAgbUdlc3R1cmVUcmFpbHMucHV0KHRyYWNrZXIubVBvaW50ZXJJZCwgdHJhaWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHRyYWlsLmFkZFN0cm9rZSh0cmFja2VyLmdldEdlc3R1cmVTdHJva2VXaXRoUHJldmlld1BvaW50cygpLCB0cmFja2VyLmdldERvd25UaW1lKCkpOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvS2V5Ym9hcmRTdGF0ZS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvS2V5Ym9hcmRTdGF0ZS5qYXZhCmluZGV4IGIxZDQ5OTcuLjZhZjFiZDcgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0tleWJvYXJkU3RhdGUuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlib2FyZFN0YXRlLmphdmEKQEAgLTI4LDkgKzI4LDkgQEAKICAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIGtleWJvYXJkIHN0YXRlIHRyYW5zaXRpb24gbG9naWMuCiAgKgogICogVGhlIGlucHV0IGV2ZW50cyBhcmUge0BsaW5rICNvbkxvYWRLZXlib2FyZCgpfSwge0BsaW5rICNvblNhdmVLZXlib2FyZFN0YXRlKCl9LAotICoge0BsaW5rICNvblByZXNzS2V5KGludCwgYm9vbGVhbiwgaW50KX0sIHtAbGluayAjb25SZWxlYXNlS2V5KGludCwgYm9vbGVhbil9LAotICoge0BsaW5rICNvbkNvZGVJbnB1dChpbnQsIGJvb2xlYW4sIGludCl9LCB7QGxpbmsgI29uQ2FuY2VsSW5wdXQoYm9vbGVhbil9LAotICoge0BsaW5rICNvblVwZGF0ZVNoaWZ0U3RhdGUoaW50LCBpbnQpfSwge0BsaW5rICNvbkxvbmdQcmVzc1RpbWVvdXQoaW50KX0uCisgKiB7QGxpbmsgI29uUHJlc3NLZXkoaW50LGJvb2xlYW4saW50KX0sIHtAbGluayAjb25SZWxlYXNlS2V5KGludCxib29sZWFuKX0sCisgKiB7QGxpbmsgI29uQ29kZUlucHV0KGludCxpbnQpfSwge0BsaW5rICNvbkZpbmlzaFNsaWRpbmdJbnB1dCgpfSwge0BsaW5rICNvbkNhbmNlbElucHV0KCl9LAorICoge0BsaW5rICNvblVwZGF0ZVNoaWZ0U3RhdGUoaW50LGludCl9LCB7QGxpbmsgI29uTG9uZ1ByZXNzVGltZW91dChpbnQpfS4KICAqCiAgKiBUaGUgYWN0aW9ucyBhcmUge0BsaW5rIFN3aXRjaEFjdGlvbnN9J3MgbWV0aG9kcy4KICAqLwpAQCAtNzQsNiArNzQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTV0lUQ0hfU1RBVEVfU1lNQk9MID0gMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX1NUQVRFX01PTUVOVEFSWV9BTFBIQV9BTkRfU1lNQk9MID0gMzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX1NUQVRFX01PTUVOVEFSWV9TWU1CT0xfQU5EX01PUkUgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTV0lUQ0hfU1RBVEVfTU9NRU5UQVJZX0FMUEhBX1NISUZUID0gNTsKICAgICBwcml2YXRlIGludCBtU3dpdGNoU3RhdGUgPSBTV0lUQ0hfU1RBVEVfQUxQSEE7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGFiZXRNb2RlOwpAQCAtOTYsMTYgKzk3LDE2IEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIG1Jc1ZhbGlkOwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBtSXNBbHBoYWJldE1vZGU7CiAgICAgICAgIHB1YmxpYyBib29sZWFuIG1Jc0FscGhhYmV0U2hpZnRMb2NrZWQ7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG1Jc1NoaWZ0ZWQ7CisgICAgICAgIHB1YmxpYyBpbnQgbVNoaWZ0TW9kZTsKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIGlmICghbUlzVmFsaWQpIHJldHVybiAiSU5WQUxJRCI7CiAgICAgICAgICAgICBpZiAobUlzQWxwaGFiZXRNb2RlKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Jc0FscGhhYmV0U2hpZnRMb2NrZWQpIHJldHVybiAiQUxQSEFCRVRfU0hJRlRfTE9DS0VEIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlzU2hpZnRlZCA/ICJBTFBIQUJFVF9TSElGVEVEIiA6ICJBTFBIQUJFVCI7CisgICAgICAgICAgICAgICAgcmV0dXJuICJBTFBIQUJFVF8iICsgc2hpZnRNb2RlVG9TdHJpbmcobVNoaWZ0TW9kZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBtSXNTaGlmdGVkID8gIlNZTUJPTFNfU0hJRlRFRCIgOiAiU1lNQk9MUyI7CisgICAgICAgICAgICAgICAgcmV0dXJuICJTWU1CT0xTXyIgKyBzaGlmdE1vZGVUb1N0cmluZyhtU2hpZnRNb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEyOCwxNiArMTI5LDIxIEBACiAgICAgICAgIG9uUmVzdG9yZUtleWJvYXJkU3RhdGUoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5TSElGVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BTlVBTF9TSElGVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVE9NQVRJQ19TSElGVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNISUZUX0xPQ0tfU0hJRlRFRCA9IDM7CisKICAgICBwdWJsaWMgdm9pZCBvblNhdmVLZXlib2FyZFN0YXRlKCkgewogICAgICAgICBmaW5hbCBTYXZlZEtleWJvYXJkU3RhdGUgc3RhdGUgPSBtU2F2ZWRLZXlib2FyZFN0YXRlOwogICAgICAgICBzdGF0ZS5tSXNBbHBoYWJldE1vZGUgPSBtSXNBbHBoYWJldE1vZGU7CiAgICAgICAgIGlmIChtSXNBbHBoYWJldE1vZGUpIHsKICAgICAgICAgICAgIHN0YXRlLm1Jc0FscGhhYmV0U2hpZnRMb2NrZWQgPSBtQWxwaGFiZXRTaGlmdFN0YXRlLmlzU2hpZnRMb2NrZWQoKTsKLSAgICAgICAgICAgIHN0YXRlLm1Jc1NoaWZ0ZWQgPSAhc3RhdGUubUlzQWxwaGFiZXRTaGlmdExvY2tlZAotICAgICAgICAgICAgICAgICAgICAmJiBtQWxwaGFiZXRTaGlmdFN0YXRlLmlzU2hpZnRlZE9yU2hpZnRMb2NrZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLm1TaGlmdE1vZGUgPSBtQWxwaGFiZXRTaGlmdFN0YXRlLmlzQXV0b21hdGljU2hpZnRlZCgpID8gQVVUT01BVElDX1NISUZUCisgICAgICAgICAgICAgICAgICAgIDogKG1BbHBoYWJldFNoaWZ0U3RhdGUuaXNTaGlmdGVkT3JTaGlmdExvY2tlZCgpID8gTUFOVUFMX1NISUZUIDogVU5TSElGVCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGF0ZS5tSXNBbHBoYWJldFNoaWZ0TG9ja2VkID0gbVByZXZNYWluS2V5Ym9hcmRXYXNTaGlmdExvY2tlZDsKLSAgICAgICAgICAgIHN0YXRlLm1Jc1NoaWZ0ZWQgPSBtSXNTeW1ib2xTaGlmdGVkOworICAgICAgICAgICAgc3RhdGUubVNoaWZ0TW9kZSA9IG1Jc1N5bWJvbFNoaWZ0ZWQgPyBNQU5VQUxfU0hJRlQgOiBVTlNISUZUOwogICAgICAgICB9CiAgICAgICAgIHN0YXRlLm1Jc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgaWYgKERFQlVHX0VWRU5UKSB7CkBAIC0xNTMsNyArMTU5LDcgQEAKICAgICAgICAgaWYgKCFzdGF0ZS5tSXNWYWxpZCB8fCBzdGF0ZS5tSXNBbHBoYWJldE1vZGUpIHsKICAgICAgICAgICAgIHNldEFscGhhYmV0S2V5Ym9hcmQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5tSXNTaGlmdGVkKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUubVNoaWZ0TW9kZSA9PSBNQU5VQUxfU0hJRlQpIHsKICAgICAgICAgICAgICAgICBzZXRTeW1ib2xzU2hpZnRlZEtleWJvYXJkKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNldFN5bWJvbHNLZXlib2FyZCgpOwpAQCAtMTY2LDE4ICsxNzIsMTMgQEAKICAgICAgICAgaWYgKHN0YXRlLm1Jc0FscGhhYmV0TW9kZSkgewogICAgICAgICAgICAgc2V0U2hpZnRMb2NrZWQoc3RhdGUubUlzQWxwaGFiZXRTaGlmdExvY2tlZCk7CiAgICAgICAgICAgICBpZiAoIXN0YXRlLm1Jc0FscGhhYmV0U2hpZnRMb2NrZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRTaGlmdGVkKHN0YXRlLm1Jc1NoaWZ0ZWQgPyBNQU5VQUxfU0hJRlQgOiBVTlNISUZUKTsKKyAgICAgICAgICAgICAgICBzZXRTaGlmdGVkKHN0YXRlLm1TaGlmdE1vZGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVByZXZNYWluS2V5Ym9hcmRXYXNTaGlmdExvY2tlZCA9IHN0YXRlLm1Jc0FscGhhYmV0U2hpZnRMb2NrZWQ7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5TSElGVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BTlVBTF9TSElGVCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVE9NQVRJQ19TSElGVCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNISUZUX0xPQ0tfU0hJRlRFRCA9IDM7Ci0KICAgICBwcml2YXRlIHZvaWQgc2V0U2hpZnRlZChmaW5hbCBpbnQgc2hpZnRNb2RlKSB7CiAgICAgICAgIGlmIChERUJVR19BQ1RJT04pIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgInNldFNoaWZ0ZWQ6IHNoaWZ0TW9kZT0iICsgc2hpZnRNb2RlVG9TdHJpbmcoc2hpZnRNb2RlKSArICIgIiArIHRoaXMpOwpAQCAtNTI1LDYgKzUyNiw5IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BbHBoYWJldFNoaWZ0U3RhdGUuaXNTaGlmdExvY2tTaGlmdGVkKCkgJiYgd2l0aFNsaWRpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBJbiBzaGlmdCBsb2NrZWQgc3RhdGUsIHNoaWZ0IGhhcyBiZWVuIHByZXNzZWQgYW5kIHNsaWQgb3V0IHRvIG90aGVyIGtleS4KICAgICAgICAgICAgICAgICBzZXRTaGlmdExvY2tlZCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUFscGhhYmV0U2hpZnRTdGF0ZS5pc01hbnVhbFNoaWZ0ZWQoKSAmJiB3aXRoU2xpZGluZykgeworICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGhhcyBiZWVuIHByZXNzZWQgYW5kIHNsaWQgb3V0IHRvIG90aGVyIGtleS4KKyAgICAgICAgICAgICAgICBtU3dpdGNoU3RhdGUgPSBTV0lUQ0hfU1RBVEVfTU9NRU5UQVJZX0FMUEhBX1NISUZUOwogICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NoaWZ0TG9ja2VkICYmICFtQWxwaGFiZXRTaGlmdFN0YXRlLmlzU2hpZnRMb2NrU2hpZnRlZCgpCiAgICAgICAgICAgICAgICAgICAgICYmIChtU2hpZnRLZXlTdGF0ZS5pc1ByZXNzaW5nKCkgfHwgbVNoaWZ0S2V5U3RhdGUuaXNQcmVzc2luZ09uU2hpZnRlZCgpKQogICAgICAgICAgICAgICAgICAgICAmJiAhd2l0aFNsaWRpbmcpIHsKQEAgLTU1NCwxNyArNTU4LDIxIEBACiAgICAgICAgIG1TaGlmdEtleVN0YXRlLm9uUmVsZWFzZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsSW5wdXQoZmluYWwgYm9vbGVhbiBpc1NpbmdsZVBvaW50ZXIpIHsKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaFNsaWRpbmdJbnB1dCgpIHsKICAgICAgICAgaWYgKERFQlVHX0VWRU5UKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNhbmNlbElucHV0OiBzaW5nbGU9IiArIGlzU2luZ2xlUG9pbnRlciArICIgIiArIHRoaXMpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25GaW5pc2hTbGlkaW5nSW5wdXQ6ICIgKyB0aGlzKTsKICAgICAgICAgfQogICAgICAgICAvLyBTd2l0Y2ggYmFjayB0byB0aGUgcHJldmlvdXMga2V5Ym9hcmQgbW9kZSBpZiB0aGUgdXNlciBjYW5jZWxzIHNsaWRpbmcgaW5wdXQuCi0gICAgICAgIGlmIChpc1NpbmdsZVBvaW50ZXIpIHsKLSAgICAgICAgICAgIGlmIChtU3dpdGNoU3RhdGUgPT0gU1dJVENIX1NUQVRFX01PTUVOVEFSWV9BTFBIQV9BTkRfU1lNQk9MKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlQWxwaGFiZXRBbmRTeW1ib2xzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Td2l0Y2hTdGF0ZSA9PSBTV0lUQ0hfU1RBVEVfTU9NRU5UQVJZX1NZTUJPTF9BTkRfTU9SRSkgewotICAgICAgICAgICAgICAgIHRvZ2dsZVNoaWZ0SW5TeW1ib2xzKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobVN3aXRjaFN0YXRlKSB7CisgICAgICAgIGNhc2UgU1dJVENIX1NUQVRFX01PTUVOVEFSWV9BTFBIQV9BTkRfU1lNQk9MOgorICAgICAgICAgICAgdG9nZ2xlQWxwaGFiZXRBbmRTeW1ib2xzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTV0lUQ0hfU1RBVEVfTU9NRU5UQVJZX1NZTUJPTF9BTkRfTU9SRToKKyAgICAgICAgICAgIHRvZ2dsZVNoaWZ0SW5TeW1ib2xzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTV0lUQ0hfU1RBVEVfTU9NRU5UQVJZX0FMUEhBX1NISUZUOgorICAgICAgICAgICAgc2V0QWxwaGFiZXRLZXlib2FyZCgpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU3NywxMCArNTg1LDkgQEAKICAgICAgICAgcmV0dXJuIGMgPT0gQ29uc3RhbnRzLkNPREVfU1BBQ0UgfHwgYyA9PSBDb25zdGFudHMuQ09ERV9FTlRFUjsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBvbkNvZGVJbnB1dChmaW5hbCBpbnQgY29kZSwgZmluYWwgYm9vbGVhbiBpc1NpbmdsZVBvaW50ZXIsIGZpbmFsIGludCBhdXRvQ2FwcykgeworICAgIHB1YmxpYyB2b2lkIG9uQ29kZUlucHV0KGZpbmFsIGludCBjb2RlLCBmaW5hbCBpbnQgYXV0b0NhcHMpIHsKICAgICAgICAgaWYgKERFQlVHX0VWRU5UKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvZGVJbnB1dDogY29kZT0iICsgQ29uc3RhbnRzLnByaW50YWJsZUNvZGUoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNpbmdsZT0iICsgaXNTaW5nbGVQb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICsgIiBhdXRvQ2Fwcz0iICsgYXV0b0NhcHMgKyAiICIgKyB0aGlzKTsKICAgICAgICAgfQogCkBAIC01OTMsMjMgKzYwMCwxMiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1Td2l0Y2hTdGF0ZSA9IFNXSVRDSF9TVEFURV9TWU1CT0xfQkVHSU47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NpbmdsZVBvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBTd2l0Y2ggYmFjayB0byB0aGUgcHJldmlvdXMga2V5Ym9hcmQgbW9kZSBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSBtb2RlIGNoYW5nZSBrZXkKLSAgICAgICAgICAgICAgICAvLyBhbmQgc2xpZCB0byBvdGhlciBrZXksIHRoZW4gcmVsZWFzZWQgdGhlIGZpbmdlci4KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBjYW5jZWxzIHRoZSBzbGlkaW5nIGlucHV0LCBzd2l0Y2hpbmcgYmFjayB0byB0aGUgcHJldmlvdXMga2V5Ym9hcmQKLSAgICAgICAgICAgICAgICAvLyBtb2RlIGlzIGhhbmRsZWQgYnkge0BsaW5rICNvbkNhbmNlbElucHV0fS4KLSAgICAgICAgICAgICAgICB0b2dnbGVBbHBoYWJldEFuZFN5bWJvbHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNXSVRDSF9TVEFURV9NT01FTlRBUllfU1lNQk9MX0FORF9NT1JFOgogICAgICAgICAgICAgaWYgKGNvZGUgPT0gQ29uc3RhbnRzLkNPREVfU0hJRlQpIHsKICAgICAgICAgICAgICAgICAvLyBEZXRlY3RlZCBvbmx5IHRoZSBzaGlmdCBrZXkgaGFzIGJlZW4gcHJlc3NlZCBvbiBzeW1ib2wgbGF5b3V0LCBhbmQgdGhlbiByZWxlYXNlZC4KICAgICAgICAgICAgICAgICBtU3dpdGNoU3RhdGUgPSBTV0lUQ0hfU1RBVEVfU1lNQk9MX0JFR0lOOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NpbmdsZVBvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBTd2l0Y2ggYmFjayB0byB0aGUgcHJldmlvdXMga2V5Ym9hcmQgbW9kZSBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSBzaGlmdCBrZXkgb24KLSAgICAgICAgICAgICAgICAvLyBzeW1ib2wgbW9kZSBhbmQgc2xpZCB0byBvdGhlciBrZXksIHRoZW4gcmVsZWFzZWQgdGhlIGZpbmdlci4KLSAgICAgICAgICAgICAgICB0b2dnbGVTaGlmdEluU3ltYm9scygpOwotICAgICAgICAgICAgICAgIG1Td2l0Y2hTdGF0ZSA9IFNXSVRDSF9TVEFURV9TWU1CT0w7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTV0lUQ0hfU1RBVEVfU1lNQk9MX0JFR0lOOgpAQCAtNjM0LDcgKzYzMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2hpZnRNb2RlVG9TdHJpbmcoZmluYWwgaW50IHNoaWZ0TW9kZSkgeworICAgIHN0YXRpYyBTdHJpbmcgc2hpZnRNb2RlVG9TdHJpbmcoZmluYWwgaW50IHNoaWZ0TW9kZSkgewogICAgICAgICBzd2l0Y2ggKHNoaWZ0TW9kZSkgewogICAgICAgICBjYXNlIFVOU0hJRlQ6IHJldHVybiAiVU5TSElGVCI7CiAgICAgICAgIGNhc2UgTUFOVUFMX1NISUZUOiByZXR1cm4gIk1BTlVBTCI7CkBAIC02NTAsNiArNjQ2LDcgQEAKICAgICAgICAgY2FzZSBTV0lUQ0hfU1RBVEVfU1lNQk9MOiByZXR1cm4gIlNZTUJPTCI7CiAgICAgICAgIGNhc2UgU1dJVENIX1NUQVRFX01PTUVOVEFSWV9BTFBIQV9BTkRfU1lNQk9MOiByZXR1cm4gIk1PTUVOVEFSWS1BTFBIQS1TWU1CT0wiOwogICAgICAgICBjYXNlIFNXSVRDSF9TVEFURV9NT01FTlRBUllfU1lNQk9MX0FORF9NT1JFOiByZXR1cm4gIk1PTUVOVEFSWS1TWU1CT0wtTU9SRSI7CisgICAgICAgIGNhc2UgU1dJVENIX1NUQVRFX01PTUVOVEFSWV9BTFBIQV9TSElGVDogcmV0dXJuICJNT01FTlRBUlktQUxQSEFfU0hJRlQiOwogICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL1BvaW50ZXJUcmFja2VyUXVldWUuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL1BvaW50ZXJUcmFja2VyUXVldWUuamF2YQppbmRleCA2YmM2YWNjLi4zMWVmM2NkIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9Qb2ludGVyVHJhY2tlclF1ZXVlLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvUG9pbnRlclRyYWNrZXJRdWV1ZS5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9kaWZpZXIoKTsKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblNsaWRpbmdLZXlJbnB1dCgpOwogICAgICAgICBwdWJsaWMgdm9pZCBvblBoYW50b21VcEV2ZW50KGxvbmcgZXZlbnRUaW1lKTsKLSAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsVHJhY2tpbmcoKTsKKyAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsVHJhY2tpbmdGb3JBY3Rpb24oKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9DQVBBQ0lUWSA9IDEwOwpAQCAtNDgsNiArNDgsOSBAQAogCiAgICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEVsZW1lbnQgcG9pbnRlcikgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1FeHBhbmRhYmxlQXJyYXlPZkFjdGl2ZVBvaW50ZXJzKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGQ6ICIgKyBwb2ludGVyICsgIiAiICsgdGhpcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8RWxlbWVudD4gZXhwYW5kYWJsZUFycmF5ID0gbUV4cGFuZGFibGVBcnJheU9mQWN0aXZlUG9pbnRlcnM7CiAgICAgICAgICAgICBmaW5hbCBpbnQgYXJyYXlTaXplID0gbUFycmF5U2l6ZTsKICAgICAgICAgICAgIGlmIChhcnJheVNpemUgPCBleHBhbmRhYmxlQXJyYXkuc2l6ZSgpKSB7CkBAIC02MSwyNCArNjQsMjcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZShmaW5hbCBFbGVtZW50IHBvaW50ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtRXhwYW5kYWJsZUFycmF5T2ZBY3RpdmVQb2ludGVycykgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlOiAiICsgcG9pbnRlciArICIgIiArIHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEVsZW1lbnQ+IGV4cGFuZGFibGVBcnJheSA9IG1FeHBhbmRhYmxlQXJyYXlPZkFjdGl2ZVBvaW50ZXJzOwogICAgICAgICAgICAgZmluYWwgaW50IGFycmF5U2l6ZSA9IG1BcnJheVNpemU7Ci0gICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IDA7CisgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5U2l6ZTsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZWxlbWVudCA9IGV4cGFuZGFibGVBcnJheS5nZXQoaW5kZXgpOwogICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IHBvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NpemUgIT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4ICE9IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGb3VuZCBkdXBsaWNhdGVkIGVsZW1lbnQgaW4gcmVtb3ZlOiAiICsgcG9pbnRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFJlbW92ZSB0aGlzIGVsZW1lbnQgZnJvbSB0aGUgZXhwYW5kYWJsZUFycmF5LgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV3U2l6ZSAhPSBpbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChuZXdJbmRleCAhPSBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAvLyBTaGlmdCB0aGlzIGVsZW1lbnQgdG93YXJkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4cGFuZGFibGVBcnJheS4KLSAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZUFycmF5LnNldChuZXdTaXplLCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZUFycmF5LnNldChuZXdJbmRleCwgZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld1NpemUrKzsKKyAgICAgICAgICAgICAgICBuZXdJbmRleCsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUFycmF5U2l6ZSA9IG5ld1NpemU7CisgICAgICAgICAgICBtQXJyYXlTaXplID0gbmV3SW5kZXg7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk1LDggKzEwMSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8RWxlbWVudD4gZXhwYW5kYWJsZUFycmF5ID0gbUV4cGFuZGFibGVBcnJheU9mQWN0aXZlUG9pbnRlcnM7CiAgICAgICAgICAgICBmaW5hbCBpbnQgYXJyYXlTaXplID0gbUFycmF5U2l6ZTsKLSAgICAgICAgICAgIGludCBuZXdTaXplLCBpbmRleDsKLSAgICAgICAgICAgIGZvciAobmV3U2l6ZSA9IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheVNpemU7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGludCBuZXdJbmRleCwgaW5kZXg7CisgICAgICAgICAgICBmb3IgKG5ld0luZGV4ID0gaW5kZXggPSAwOyBpbmRleCA8IGFycmF5U2l6ZTsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZWxlbWVudCA9IGV4cGFuZGFibGVBcnJheS5nZXQoaW5kZXgpOwogICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IHBvaW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3AgcmVsZWFzaW5nIGVsZW1lbnRzLgpAQCAtMTA1LDI5ICsxMTEsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vblBoYW50b21VcEV2ZW50KGV2ZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBSZW1vdmUgdGhpcyBlbGVtZW50IGZyb20gdGhlIGV4cGFuZGFibGVBcnJheS4KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1NpemUgIT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3SW5kZXggIT0gaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gU2hpZnQgdGhpcyBlbGVtZW50IHRvd2FyZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleHBhbmRhYmxlQXJyYXkuCi0gICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVBcnJheS5zZXQobmV3U2l6ZSwgZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVBcnJheS5zZXQobmV3SW5kZXgsIGVsZW1lbnQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdTaXplKys7CisgICAgICAgICAgICAgICAgbmV3SW5kZXgrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFNoaWZ0IHJlc3Qgb2YgdGhlIGV4cGFuZGFibGVBcnJheS4KICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgICAgICBmb3IgKDsgaW5kZXggPCBhcnJheVNpemU7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IGVsZW1lbnQgPSBleHBhbmRhYmxlQXJyYXkuZ2V0KGluZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBwb2ludGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRm91bmQgZHVwbGljYXRlZCBlbGVtZW50IGluIHJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBvaW50ZXIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTaXplICE9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVBcnJheS5zZXQobmV3U2l6ZSwgZXhwYW5kYWJsZUFycmF5LmdldChpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICBuZXdTaXplKys7CisgICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4ICE9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNoaWZ0IHRoaXMgZWxlbWVudCB0b3dhcmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwYW5kYWJsZUFycmF5LgorICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlQXJyYXkuc2V0KG5ld0luZGV4LCBleHBhbmRhYmxlQXJyYXkuZ2V0KGluZGV4KSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld0luZGV4Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXJyYXlTaXplID0gbmV3U2l6ZTsKKyAgICAgICAgICAgIG1BcnJheVNpemUgPSBuZXdJbmRleDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ2LDI2ICsxNTMsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxFbGVtZW50PiBleHBhbmRhYmxlQXJyYXkgPSBtRXhwYW5kYWJsZUFycmF5T2ZBY3RpdmVQb2ludGVyczsKICAgICAgICAgICAgIGZpbmFsIGludCBhcnJheVNpemUgPSBtQXJyYXlTaXplOwotICAgICAgICAgICAgaW50IG5ld1NpemUgPSAwLCBjb3VudCA9IDA7CisgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSAwLCBjb3VudCA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlTaXplOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlbGVtZW50ID0gZXhwYW5kYWJsZUFycmF5LmdldChpbmRleCk7CiAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gcG9pbnRlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZvdW5kIGR1cGxpY2F0ZWQgZWxlbWVudCBpbiByZWxlYXNlQWxsUG9pbnRlcnNFeGNlcHQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwb2ludGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub25QaGFudG9tVXBFdmVudChldmVudFRpbWUpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gUmVtb3ZlIHRoaXMgZWxlbWVudCBmcm9tIHRoZSBleHBhbmRhYmxlQXJyYXkuCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTaXplICE9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4ICE9IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNoaWZ0IHRoaXMgZWxlbWVudCB0b3dhcmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwYW5kYWJsZUFycmF5LgotICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlQXJyYXkuc2V0KG5ld1NpemUsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlQXJyYXkuc2V0KG5ld0luZGV4LCBlbGVtZW50KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3U2l6ZSsrOworICAgICAgICAgICAgICAgIG5ld0luZGV4Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXJyYXlTaXplID0gbmV3U2l6ZTsKKyAgICAgICAgICAgIG1BcnJheVNpemUgPSBuZXdJbmRleDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjAyLDExICsyMDksMTQgQEAKIAogICAgIHB1YmxpYyB2b2lkIGNhbmNlbEFsbFBvaW50ZXJUcmFja2VyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1FeHBhbmRhYmxlQXJyYXlPZkFjdGl2ZVBvaW50ZXJzKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjYW5jZWxBbGxQb2ludGVyVHJhY2tlcjogIiArIHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEVsZW1lbnQ+IGV4cGFuZGFibGVBcnJheSA9IG1FeHBhbmRhYmxlQXJyYXlPZkFjdGl2ZVBvaW50ZXJzOwogICAgICAgICAgICAgZmluYWwgaW50IGFycmF5U2l6ZSA9IG1BcnJheVNpemU7CiAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlTaXplOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlbGVtZW50ID0gZXhwYW5kYWJsZUFycmF5LmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5jYW5jZWxUcmFja2luZygpOworICAgICAgICAgICAgICAgIGVsZW1lbnQuY2FuY2VsVHJhY2tpbmdGb3JBY3Rpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnkuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnkuamF2YQppbmRleCBkYmMyYjkwLi40ZmMxOTE5IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeS5qYXZhCkBAIC0xMDcsMTMgKzEwNywxNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFycmF5TGlzdDxTdWdnZXN0ZWRXb3JkSW5mbz4gZ2V0U3VnZ2VzdGlvbnMoZmluYWwgV29yZENvbXBvc2VyIGNvbXBvc2VyLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8pIHsKLSAgICAgICAgcmV0dXJuIGdldFN1Z2dlc3Rpb25zV2l0aFNlc3Npb25JZChjb21wb3NlciwgcHJldldvcmQsIHByb3hpbWl0eUluZm8sIDApOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrT2ZmZW5zaXZlV29yZHMpIHsKKyAgICAgICAgcmV0dXJuIGdldFN1Z2dlc3Rpb25zV2l0aFNlc3Npb25JZChjb21wb3NlciwgcHJldldvcmQsIHByb3hpbWl0eUluZm8sIGJsb2NrT2ZmZW5zaXZlV29yZHMsCisgICAgICAgICAgICAgICAgMCAvKiBzZXNzaW9uSWQgKi8pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IGdldFN1Z2dlc3Rpb25zV2l0aFNlc3Npb25JZChmaW5hbCBXb3JkQ29tcG9zZXIgY29tcG9zZXIsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQsIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbywgaW50IHNlc3Npb25JZCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrT2ZmZW5zaXZlV29yZHMsIGZpbmFsIGludCBzZXNzaW9uSWQpIHsKICAgICAgICAgaWYgKCFpc1ZhbGlkRGljdGlvbmFyeSgpKSByZXR1cm4gbnVsbDsKIAogICAgICAgICBBcnJheXMuZmlsbChtSW5wdXRDb2RlUG9pbnRzLCBDb25zdGFudHMuTk9UX0FfQ09ERSk7CkBAIC0xNDcsMTAgKzE1MCwyMSBAQAogICAgICAgICAgICAgICAgICsrbGVuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2NvcmUgPSBTdWdnZXN0ZWRXb3JkSW5mby5LSU5EX1dISVRFTElTVCA9PSBtT3V0cHV0VHlwZXNbal0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBtT3V0cHV0VHlwZXNbal0gJiBTdWdnZXN0ZWRXb3JkSW5mby5LSU5EX01BU0tfRkxBR1M7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrT2ZmZW5zaXZlV29yZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIDAgIT0gKGZsYWdzICYgU3VnZ2VzdGVkV29yZEluZm8uS0lORF9GTEFHX1BPU1NJQkxZX09GRkVOU0lWRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIDAgPT0gKGZsYWdzICYgU3VnZ2VzdGVkV29yZEluZm8uS0lORF9GTEFHX0VYQUNUX01BVENIKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBibG9jayBwb3RlbnRpYWxseSBvZmZlbnNpdmUgd29yZHMsIGFuZCBpZiB0aGUgd29yZCBpcyBwb3NzaWJseQorICAgICAgICAgICAgICAgICAgICAvLyBvZmZlbnNpdmUsIHRoZW4gd2UgZG9uJ3Qgb3V0cHV0IGl0IHVubGVzcyBpdCdzIGFsc28gYW4gZXhhY3QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQga2luZCA9IG1PdXRwdXRUeXBlc1tqXSAmIFN1Z2dlc3RlZFdvcmRJbmZvLktJTkRfTUFTS19LSU5EOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY29yZSA9IFN1Z2dlc3RlZFdvcmRJbmZvLktJTkRfV0hJVEVMSVNUID09IGtpbmQKICAgICAgICAgICAgICAgICAgICAgICAgID8gU3VnZ2VzdGVkV29yZEluZm8uTUFYX1NDT1JFIDogbU91dHB1dFNjb3Jlc1tqXTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCB1c2VycyBvZiB0aGUgYGtpbmQnIHBhcmFtZXRlciBhcmUgcmVhZHkgdG8gYWNjZXB0CisgICAgICAgICAgICAgICAgLy8gZmxhZ3MgdG9vIGFuZCBwYXNzIG1PdXRwdXRUeXBlc1tqXSBpbnN0ZWFkIG9mIGtpbmQKICAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5hZGQobmV3IFN1Z2dlc3RlZFdvcmRJbmZvKG5ldyBTdHJpbmcobU91dHB1dENvZGVQb2ludHMsIHN0YXJ0LCBsZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUsIG1PdXRwdXRUeXBlc1tqXSwgbURpY3RUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSwga2luZCwgbURpY3RUeXBlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25zOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeUZpbGVEdW1wZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlGaWxlRHVtcGVyLmphdmEKaW5kZXggNDJmNzEzNi4uYTliNThkZSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeUZpbGVEdW1wZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5RmlsZUR1bXBlci5qYXZhCkBAIC04MSw2ICs4MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBVEhfTUVUQURBVEEgPSAibWV0YWRhdGEiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfTUVUQURBVEFfQ0xJRU5UX0lEX0NPTFVNTiA9ICJjbGllbnRpZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NRVRBREFUQV9NRVRBREFUQV9VUklfQ09MVU1OID0gInVyaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NRVRBREFUQV9NRVRBREFUQV9BRERJVElPTkFMX0lEX0NPTFVNTiA9ICJhZGRpdGlvbmFsaWQiOwogCiAgICAgLy8gUHJldmVudHMgdGhpcyBjbGFzcyB0byBiZSBhY2NpZGVudGFsbHkgaW5zdGFudGlhdGVkLgogICAgIHByaXZhdGUgQmluYXJ5RGljdGlvbmFyeUZpbGVEdW1wZXIoKSB7CkBAIC0yMDksNyArMjEwLDcgQEAKICAgICAgKiB0byB0aGUgY2FjaGUgZmlsZSBuYW1lIGRlc2lnbmF0ZWQgYnkgaXRzIGlkIGFuZCBsb2NhbGUsIG92ZXJ3cml0aW5nIGl0IGlmIGFscmVhZHkgcHJlc2VudAogICAgICAqIGFuZCBjcmVhdGluZyBpdCAoYW5kIGl0cyBjb250YWluaW5nIGRpcmVjdG9yeSkgaWYgbmVjZXNzYXJ5LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFzc2V0RmlsZUFkZHJlc3MgY2FjaGVXb3JkTGlzdChmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgU3RyaW5nIGxvY2FsZSwKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNhY2hlV29yZExpc3QoZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQsIGZpbmFsIFN0cmluZyBsb2NhbGUsCiAgICAgICAgICAgICBmaW5hbCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXJDbGllbnQsIGZpbmFsIENvbnRleHQgY29udGV4dCkgewogICAgICAgICBmaW5hbCBpbnQgQ09NUFJFU1NFRF9DUllQVEVEX0NPTVBSRVNTRUQgPSAwOwogICAgICAgICBmaW5hbCBpbnQgQ1JZUFRFRF9DT01QUkVTU0VEID0gMTsKQEAgLTIyNyw3ICsyMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBwcm92aWRlckNsaWVudCwgUVVFUllfUEFUSF9EQVRBRklMRSwgd29yZGxpc3RJZCAvKiBleHRyYVBhdGggKi8pOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgZGljdGlvbmFyeSBwYWNrIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBTdHJpbmcgZmluYWxGaWxlTmFtZSA9CiAgICAgICAgICAgICAgICAgRGljdGlvbmFyeUluZm9VdGlscy5nZXRDYWNoZUZpbGVOYW1lKHdvcmRsaXN0SWQsIGxvY2FsZSwgY29udGV4dCk7CkBAIC0yMzYsMTEgKzIzNywxMSBAQAogICAgICAgICAgICAgdGVtcEZpbGVOYW1lID0gQmluYXJ5RGljdGlvbmFyeUdldHRlci5nZXRUZW1wRmlsZU5hbWUod29yZGxpc3RJZCwgY29udGV4dCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbid0IG9wZW4gdGhlIHRlbXBvcmFyeSBmaWxlIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IG1vZGUgPSBNT0RFX01JTjsgbW9kZSA8PSBNT0RFX01BWDsgKyttb2RlKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBvcmlnaW5hbFNvdXJjZVN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBvcmlnaW5hbFNvdXJjZVN0cmVhbTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKICAgICAgICAgICAgIElucHV0U3RyZWFtIHVuY29tcHJlc3NlZFN0cmVhbSA9IG51bGw7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBkZWNyeXB0ZWRTdHJlYW0gPSBudWxsOwpAQCAtMjUzLDcgKzI1NCw3IEBACiAgICAgICAgICAgICAgICAgLy8gT3BlbiBpbnB1dC4KICAgICAgICAgICAgICAgICBhZmQgPSBvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihwcm92aWRlckNsaWVudCwgd29yZExpc3RVcmkpOwogICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IG9wZW4gaXQgYXQgYWxsLCBkb24ndCBldmVuIHRyeSBhIG51bWJlciBvZiB0aW1lcy4KLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBhZmQpIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGlmIChudWxsID09IGFmZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgIG9yaWdpbmFsU291cmNlU3RyZWFtID0gYWZkLmNyZWF0ZUlucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgLy8gT3BlbiBvdXRwdXQuCiAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlTmFtZSk7CkBAIC0zMDQsNyArMzA1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQmluYXJ5RGljdGlvbmFyeUdldHRlci5yZW1vdmVGaWxlc1dpdGhJZEV4Y2VwdChjb250ZXh0LCB3b3JkbGlzdElkLCBmaW5hbEZpbGUpOwogICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MhIENsb3NlIGZpbGVzICh0aHJvdWdoIHRoZSBmaW5hbGx5e30gY2xhdXNlKSBhbmQgcmV0dXJuLgotICAgICAgICAgICAgICAgIHJldHVybiBBc3NldEZpbGVBZGRyZXNzLm1ha2VGcm9tRmlsZU5hbWUoZmluYWxGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FuJ3Qgb3BlbiB3b3JkIGxpc3QgaW4gbW9kZSAiICsgbW9kZSwgZSk7CkBAIC0zMTksNyArMzIwLDcgQEAKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbnMgd2hpbGUgY2xvc2luZyBmaWxlcy4KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dFN0cmVhbS5jbG9zZSgpIHdpbGwgY2xvc2UgYWZkLCB3ZSBzaG91bGQgbm90IGNhbGwgYWZkLmNsb3NlKCkuCisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGFmZCkgYWZkLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGlucHV0U3RyZWFtKSBpbnB1dFN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB1bmNvbXByZXNzZWRTdHJlYW0pIHVuY29tcHJlc3NlZFN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBkZWNyeXB0ZWRTdHJlYW0pIGRlY3J5cHRlZFN0cmVhbS5jbG9zZSgpOwpAQCAtMzQ5LDcgKzM1MCw2IEBACiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJJbiBhZGRpdGlvbiwgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyIHdhcyBjdXQiLCBlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTM1OCwzMCArMzU4LDIzIEBACiAgICAgICogVGhpcyB3aWxsIHF1ZXJ5IGEgY29udGVudCBwcm92aWRlciBmb3Igd29yZCBsaXN0IGRhdGEgZm9yIGEgZ2l2ZW4gbG9jYWxlLCBhbmQgY29weSB0aGUKICAgICAgKiBmaWxlcyBsb2NhbGx5IHNvIHRoYXQgdGhleSBjYW4gYmUgbW1hcCdlZC4gVGhpcyBtYXkgb3ZlcndyaXRlIHByZXZpb3VzbHkgY2FjaGVkIHdvcmQgbGlzdHMKICAgICAgKiB3aXRoIG5ld2VyIHZlcnNpb25zIGlmIGEgbmV3ZXIgdmVyc2lvbiBpcyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgY29udGVudCBwcm92aWRlci4KLSAgICAgKiBAcmV0dXJucyB0aGUgYWRkcmVzc2VzIG9mIHRoZSB3b3JkIGxpc3QgZmlsZXMsIG9yIG51bGwgaWYgbm8gZGF0YSBjb3VsZCBiZSBvYnRhaW5lZC4KICAgICAgKiBAdGhyb3cgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlciByZXR1cm5zIG5vbi1leGlzdGVudCBkYXRhLgogICAgICAqIEB0aHJvdyBJT0V4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZXItcmV0dXJuZWQgZGF0YSBjb3VsZCBub3QgYmUgcmVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8QXNzZXRGaWxlQWRkcmVzcz4gY2FjaGVXb3JkTGlzdHNGcm9tQ29udGVudFByb3ZpZGVyKGZpbmFsIExvY2FsZSBsb2NhbGUsCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNhY2hlV29yZExpc3RzRnJvbUNvbnRlbnRQcm92aWRlcihmaW5hbCBMb2NhbGUgbG9jYWxlLAogICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBib29sZWFuIGhhc0RlZmF1bHRXb3JkTGlzdCkgewogICAgICAgICBmaW5hbCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXJDbGllbnQgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLgogICAgICAgICAgICAgICAgIGFjcXVpcmVDb250ZW50UHJvdmlkZXJDbGllbnQoZ2V0UHJvdmlkZXJVcmlCdWlsZGVyKCIiKS5idWlsZCgpKTsKICAgICAgICAgaWYgKG51bGwgPT0gcHJvdmlkZXJDbGllbnQpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbid0IGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRpY3Rpb25hcnkgcHJvdmlkZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uVXRpbHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIExpc3Q8V29yZExpc3RJbmZvPiBpZExpc3QgPSBnZXRXb3JkTGlzdFdvcmRMaXN0SW5mb3MobG9jYWxlLCBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0V29yZExpc3QpOwotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFzc2V0RmlsZUFkZHJlc3M+IGZpbGVBZGRyZXNzTGlzdCA9IENvbGxlY3Rpb25VdGlscy5uZXdBcnJheUxpc3QoKTsKICAgICAgICAgICAgIGZvciAoV29yZExpc3RJbmZvIGlkIDogaWRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQXNzZXRGaWxlQWRkcmVzcyBhZmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVXb3JkTGlzdChpZC5tSWQsIGlkLm1Mb2NhbGUsIHByb3ZpZGVyQ2xpZW50LCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBhZmQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUFkZHJlc3NMaXN0LmFkZChhZmQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWNoZVdvcmRMaXN0KGlkLm1JZCwgaWQubUxvY2FsZSwgcHJvdmlkZXJDbGllbnQsIGNvbnRleHQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZpbGVBZGRyZXNzTGlzdDsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHByb3ZpZGVyQ2xpZW50LnJlbGVhc2UoKTsKICAgICAgICAgfQpAQCAtNDIzLDYgKzQxNiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWluaXRpYWxpemVDbGllbnRSZWNvcmRJbkRpY3Rpb25hcnlDb250ZW50UHJvdmlkZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LAogICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyQ2xpZW50IGNsaWVudCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGFkYXRhRmlsZVVyaSA9IE1ldGFkYXRhRmlsZVVyaUdldHRlci5nZXRNZXRhZGF0YVVyaShjb250ZXh0KTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1ldGFkYXRhQWRkaXRpb25hbElkID0gTWV0YWRhdGFGaWxlVXJpR2V0dGVyLmdldE1ldGFkYXRhQWRkaXRpb25hbElkKGNvbnRleHQpOwogICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobWV0YWRhdGFGaWxlVXJpKSkgcmV0dXJuOwogICAgICAgICAvLyBUZWxsIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHJlc2V0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNsaWVudCBpZAogICAgICAgICBmaW5hbCBVcmkgbWV0YWRhdGFDb250ZW50VXJpID0gZ2V0UHJvdmlkZXJVcmlCdWlsZGVyKGNsaWVudElkKQpAQCAtNDM0LDYgKzQyOCw3IEBACiAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgbWV0YWRhdGFWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICBtZXRhZGF0YVZhbHVlcy5wdXQoSU5TRVJUX01FVEFEQVRBX0NMSUVOVF9JRF9DT0xVTU4sIGNsaWVudElkKTsKICAgICAgICAgbWV0YWRhdGFWYWx1ZXMucHV0KElOU0VSVF9NRVRBREFUQV9NRVRBREFUQV9VUklfQ09MVU1OLCBtZXRhZGF0YUZpbGVVcmkpOworICAgICAgICBtZXRhZGF0YVZhbHVlcy5wdXQoSU5TRVJUX01FVEFEQVRBX01FVEFEQVRBX0FERElUSU9OQUxfSURfQ09MVU1OLCBtZXRhZGF0YUFkZGl0aW9uYWxJZCk7CiAgICAgICAgIGNsaWVudC5pbnNlcnQobWV0YWRhdGFDb250ZW50VXJpLCBtZXRhZGF0YVZhbHVlcyk7CiAKICAgICAgICAgLy8gVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IGxpc3QuCmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5R2V0dGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5R2V0dGVyLmphdmEKaW5kZXggMjk0MzEyOC4uOThlYWRjYSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeUdldHRlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlHZXR0ZXIuamF2YQpAQCAtNzIsMTAgKzcyLDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcEZpbGVOYW1lKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgQ29udGV4dCBjb250ZXh0KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIHNhZmVJZCA9IERpY3Rpb25hcnlJbmZvVXRpbHMucmVwbGFjZUZpbGVOYW1lRGFuZ2Vyb3VzQ2hhcmFjdGVycyhpZCk7CisgICAgICAgIGZpbmFsIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoRGljdGlvbmFyeUluZm9VdGlscy5nZXRXb3JkTGlzdFRlbXBEaXJlY3RvcnkoY29udGV4dCkpOworICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKCFkaXJlY3RvcnkubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aHJlZSBjaGFycywgY3JlYXRlVGVtcEZpbGUgdGhyb3dzIGEKICAgICAgICAgLy8gUnVudGltZUV4Y2VwdGlvbi4gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgd2hhdCBuYW1lIHdlIGdldCwgc28ganVzdAogICAgICAgICAvLyBwdXQgYSB0aHJlZS1jaGFycyBwcmVmaXggbWFrZXMgdXMgc2FmZS4KLSAgICAgICAgcmV0dXJuIEZpbGUuY3JlYXRlVGVtcEZpbGUoInh4eCIgKyBzYWZlSWQsIG51bGwpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICByZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgieHh4IiArIHNhZmVJZCwgbnVsbCwgZGlyZWN0b3J5KS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg5LDggKzk1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgZmFsbGJhY2tSZXNJZCk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQXNzZXRGaWxlQWRkcmVzcy5tYWtlRnJvbUZpbGVOYW1lQW5kT2Zmc2V0KAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCkuc291cmNlRGlyLCBhZmQuZ2V0U3RhcnRPZmZzZXQoKSwgYWZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBc3NldEZpbGVBZGRyZXNzLm1ha2VGcm9tRmlsZU5hbWVBbmRPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCkuc291cmNlRGlyLCBhZmQuZ2V0U3RhcnRPZmZzZXQoKSwgYWZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYWZkLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlZAorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGljdFBhY2tTZXR0aW5ncyB7CkBAIC0yNzYsOSArMjkwLDYgQEAKICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCkgewogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRGVmYXVsdFdvcmRMaXN0ID0gRGljdGlvbmFyeUZhY3RvcnkuaXNEaWN0aW9uYXJ5QXZhaWxhYmxlKGNvbnRleHQsIGxvY2FsZSk7Ci0gICAgICAgIC8vIGNhY2hlV29yZExpc3RzRnJvbUNvbnRlbnRQcm92aWRlciByZXR1cm5zIHRoZSBsaXN0IG9mIGZpbGVzIGl0IGNvcGllZCB0byBsb2NhbAotICAgICAgICAvLyBzdG9yYWdlLCBidXQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgd2hhdCB3YXMgY29waWVkIE5PVzogd2hhdCB3ZSB3YW50IGlzIHRoZQotICAgICAgICAvLyBsaXN0IG9mIGV2ZXJ5dGhpbmcgd2UgZXZlciBjYWNoZWQsIHNvIHdlIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLgogICAgICAgICAvLyBUT0RPOiBUaGUgZGV2ZWxvcG1lbnQtb25seS1kaWFnbm9zdGljIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRGljdGlvbmFyeSBQYWNrCiAgICAgICAgIC8vIFNlcnZpY2UgeWV0CiAgICAgICAgIGlmICghUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTKSB7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9Db250YWN0c0JpbmFyeURpY3Rpb25hcnkuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0NvbnRhY3RzQmluYXJ5RGljdGlvbmFyeS5qYXZhCmluZGV4IDc1YzJjZjIuLmI5ZGI5YTAgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0NvbnRhY3RzQmluYXJ5RGljdGlvbmFyeS5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0NvbnRhY3RzQmluYXJ5RGljdGlvbmFyeS5qYXZhCkBAIC0xNiwyMSArMTYsMjYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbjsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnBlcnNvbmFsaXphdGlvbi5BY2NvdW50VXRpbHM7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBwdWJsaWMgY2xhc3MgQ29udGFjdHNCaW5hcnlEaWN0aW9uYXJ5IGV4dGVuZHMgRXhwYW5kYWJsZUJpbmFyeURpY3Rpb25hcnkgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IHtCYXNlQ29sdW1ucy5fSUQsIENvbnRhY3RzLkRJU1BMQVlfTkFNRSx9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSB7QmFzZUNvbHVtbnMuX0lELCBDb250YWN0cy5ESVNQTEFZX05BTUV9OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT05fSURfT05MWSA9IHtCYXNlQ29sdW1ucy5fSUR9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IENvbnRhY3RzQmluYXJ5RGljdGlvbmFyeS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CkBAIC0xMDIsOSArMTA3LDMyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBsb2FkRGljdGlvbmFyeUFzeW5jKCkgeworICAgICAgICBjbGVhckZ1c2lvbkRpY3Rpb25hcnkoKTsKKyAgICAgICAgbG9hZERldmljZUFjY291bnRzRW1haWxBZGRyZXNzZXMoKTsKKyAgICAgICAgbG9hZERpY3Rpb25hcnlBc3luY0ZvclVyaShDb250YWN0c0NvbnRyYWN0LlByb2ZpbGUuQ09OVEVOVF9VUkkpOworICAgICAgICAvLyBUT0RPOiBTd2l0Y2ggdGhpcyBVUkwgdG8gdGhlIG5ld2VyIENvbnRhY3RzQ29udHJhY3QgdG9vCisgICAgICAgIGxvYWREaWN0aW9uYXJ5QXN5bmNGb3JVcmkoQ29udGFjdHMuQ09OVEVOVF9VUkkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkRGV2aWNlQWNjb3VudHNFbWFpbEFkZHJlc3NlcygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFjY291bnRWb2NhYnVsYXJ5ID0KKyAgICAgICAgICAgICAgICBBY2NvdW50VXRpbHMuZ2V0RGV2aWNlQWNjb3VudHNFbWFpbEFkZHJlc3NlcyhtQ29udGV4dCk7CisgICAgICAgIGlmIChhY2NvdW50Vm9jYWJ1bGFyeSA9PSBudWxsIHx8IGFjY291bnRWb2NhYnVsYXJ5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBhY2NvdW50Vm9jYWJ1bGFyeSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibG9hZEFjY291bnRWb2NhYnVsYXJ5OiAiICsgd29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5hZGRXb3JkKHdvcmQsIG51bGwgLyogc2hvcnRjdXQgKi8sIEZSRVFVRU5DWV9GT1JfQ09OVEFDVFMsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzTm90QVdvcmQgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWREaWN0aW9uYXJ5QXN5bmNGb3JVcmkoZmluYWwgVXJpIHVyaSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpCi0gICAgICAgICAgICAgICAgICAgIC5xdWVyeShDb250YWN0cy5DT05URU5UX1VSSSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIC5xdWVyeSh1cmksIFBST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CkBAIC0xMjksNyArMTU3LDYgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYWRkV29yZHMoZmluYWwgQ3Vyc29yIGN1cnNvcikgewotICAgICAgICBjbGVhckZ1c2lvbkRpY3Rpb25hcnkoKTsKICAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICAgd2hpbGUgKCFjdXJzb3IuaXNBZnRlckxhc3QoKSAmJiBjb3VudCA8IE1BWF9DT05UQUNUX0NPVU5UKSB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoSU5ERVhfTkFNRSk7CkBAIC0xNzMsNiArMjAwLDkgQEAKICAgICAgICAgICAgICAgICAvLyBjYXBpdGFsaXphdGlvbiBvZiBpLgogICAgICAgICAgICAgICAgIGZpbmFsIGludCB3b3JkTGVuID0gU3RyaW5nVXRpbHMuY29kZVBvaW50Q291bnQod29yZCk7CiAgICAgICAgICAgICAgICAgaWYgKHdvcmRMZW4gPCBNQVhfV09SRF9MRU5HVEggJiYgd29yZExlbiA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGROYW1lICIgKyBuYW1lICsgIiwgIiArIHdvcmQgKyAiLCAiICsgcHJldldvcmQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmFkZFdvcmQod29yZCwgbnVsbCAvKiBzaG9ydGN1dCAqLywgRlJFUVVFTkNZX0ZPUl9DT05UQUNUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc05vdEFXb3JkICovKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwcmV2V29yZCkpIHsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RlYnVnU2V0dGluZ3MuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RlYnVnU2V0dGluZ3MuamF2YQppbmRleCBjMmFhZGU2Li41OTY5YTYzIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EZWJ1Z1NldHRpbmdzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGVidWdTZXR0aW5ncy5qYXZhCkBAIC0xMjEsMTggKzEyMSw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBpc0RlYnVnTW9kZSA9IG1EZWJ1Z01vZGUuaXNDaGVja2VkKCk7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gIiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgIFBhY2thZ2VJbmZvIGluZm8gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0UGFja2FnZUluZm8ocGFja2FnZU5hbWUsIDApOwotICAgICAgICAgICAgdmVyc2lvbiA9ICJWZXJzaW9uICIgKyBpbmZvLnZlcnNpb25OYW1lOwotICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGZpbmQgdmVyc2lvbiBpbmZvLiIpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uID0gZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLnZlcnNpb25fdGV4dCwgVXRpbHMuZ2V0VmVyc2lvbk5hbWUoZ2V0QWN0aXZpdHkoKSkpOwogICAgICAgICBpZiAoIWlzRGVidWdNb2RlKSB7CiAgICAgICAgICAgICBtRGVidWdNb2RlLnNldFRpdGxlKHZlcnNpb24pOwogICAgICAgICAgICAgbURlYnVnTW9kZS5zZXRTdW1tYXJ5KCIiKTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnkuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnkuamF2YQppbmRleCA5NjkxZmEyLi5hY2Q3YzJhIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EaWN0aW9uYXJ5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeS5qYXZhCkBAIC01MSwxOCArNTEsMjEgQEAKICAgICAgKiBAcGFyYW0gY29tcG9zZXIgdGhlIGtleSBzZXF1ZW5jZSB0byBtYXRjaCB3aXRoIGNvb3JkaW5hdGUgaW5mbywgYXMgYSBXb3JkQ29tcG9zZXIKICAgICAgKiBAcGFyYW0gcHJldldvcmQgdGhlIHByZXZpb3VzIHdvcmQsIG9yIG51bGwgaWYgbm9uZQogICAgICAqIEBwYXJhbSBwcm94aW1pdHlJbmZvIHRoZSBvYmplY3QgZm9yIGtleSBwcm94aW1pdHkuIE1heSBiZSBpZ25vcmVkIGJ5IHNvbWUgaW1wbGVtZW50YXRpb25zLgorICAgICAqIEBwYXJhbSBibG9ja09mZmVuc2l2ZVdvcmRzIHdoZXRoZXIgdG8gYmxvY2sgcG90ZW50aWFsbHkgb2ZmZW5zaXZlIHdvcmRzCiAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucyAocG9zc2libHkgbnVsbCBpZiBub25lKQogICAgICAqLwogICAgIC8vIFRPRE86IHBhc3MgbW9yZSBjb250ZXh0IHRoYW4ganVzdCB0aGUgcHJldmlvdXMgd29yZCwgdG8gZW5hYmxlIGJldHRlciBzdWdnZXN0aW9ucyAobi1ncmFtCiAgICAgLy8gYW5kIG1vcmUpCiAgICAgYWJzdHJhY3QgcHVibGljIEFycmF5TGlzdDxTdWdnZXN0ZWRXb3JkSW5mbz4gZ2V0U3VnZ2VzdGlvbnMoZmluYWwgV29yZENvbXBvc2VyIGNvbXBvc2VyLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8pOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrT2ZmZW5zaXZlV29yZHMpOwogCiAgICAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaWdub3JlcyBzZXNzaW9uSWQuCiAgICAgLy8gU3ViY2xhc3NlcyB0aGF0IHdhbnQgdG8gdXNlIHNlc3Npb25JZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgogICAgIHB1YmxpYyBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IGdldFN1Z2dlc3Rpb25zV2l0aFNlc3Npb25JZChmaW5hbCBXb3JkQ29tcG9zZXIgY29tcG9zZXIsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQsIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbywgZmluYWwgaW50IHNlc3Npb25JZCkgewotICAgICAgICByZXR1cm4gZ2V0U3VnZ2VzdGlvbnMoY29tcG9zZXIsIHByZXZXb3JkLCBwcm94aW1pdHlJbmZvKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZCwgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBibG9ja09mZmVuc2l2ZVdvcmRzLCBmaW5hbCBpbnQgc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBnZXRTdWdnZXN0aW9ucyhjb21wb3NlciwgcHJldldvcmQsIHByb3hpbWl0eUluZm8sIGJsb2NrT2ZmZW5zaXZlV29yZHMpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeUNvbGxlY3Rpb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnlDb2xsZWN0aW9uLmphdmEKaW5kZXggMjgzMmFkNC4uZWQyYjQ0MiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeUNvbGxlY3Rpb24uamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EaWN0aW9uYXJ5Q29sbGVjdGlvbi5qYXZhCkBAIC01NiwxOCArNTYsMTkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IGdldFN1Z2dlc3Rpb25zKGZpbmFsIFdvcmRDb21wb3NlciBjb21wb3NlciwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZCwgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQsIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbywKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmxvY2tPZmZlbnNpdmVXb3JkcykgewogICAgICAgICBmaW5hbCBDb3B5T25Xcml0ZUFycmF5TGlzdDxEaWN0aW9uYXJ5PiBkaWN0aW9uYXJpZXMgPSBtRGljdGlvbmFyaWVzOwogICAgICAgICBpZiAoZGljdGlvbmFyaWVzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7CiAgICAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMsIHdlIGdldCB0aGUgbGlzdCBvdXQgb2YgdGhlIGZpcnN0CiAgICAgICAgIC8vIGRpY3Rpb25hcnkgYW5kIGFkZCB0aGUgcmVzdCB0byBpdCBpZiBub3QgbnVsbCwgaGVuY2UgdGhlIGdldCgwKQogICAgICAgICBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IHN1Z2dlc3Rpb25zID0gZGljdGlvbmFyaWVzLmdldCgwKS5nZXRTdWdnZXN0aW9ucyhjb21wb3NlciwKLSAgICAgICAgICAgICAgICBwcmV2V29yZCwgcHJveGltaXR5SW5mbyk7CisgICAgICAgICAgICAgICAgcHJldldvcmQsIHByb3hpbWl0eUluZm8sIGJsb2NrT2ZmZW5zaXZlV29yZHMpOwogICAgICAgICBpZiAobnVsbCA9PSBzdWdnZXN0aW9ucykgc3VnZ2VzdGlvbnMgPSBDb2xsZWN0aW9uVXRpbHMubmV3QXJyYXlMaXN0KCk7CiAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBkaWN0aW9uYXJpZXMuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgKysgaSkgewogICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN1Z2dlc3RlZFdvcmRJbmZvPiBzdWdnID0gZGljdGlvbmFyaWVzLmdldChpKS5nZXRTdWdnZXN0aW9ucyhjb21wb3NlciwKLSAgICAgICAgICAgICAgICAgICAgcHJldldvcmQsIHByb3hpbWl0eUluZm8pOworICAgICAgICAgICAgICAgICAgICBwcmV2V29yZCwgcHJveGltaXR5SW5mbywgYmxvY2tPZmZlbnNpdmVXb3Jkcyk7CiAgICAgICAgICAgICBpZiAobnVsbCAhPSBzdWdnKSBzdWdnZXN0aW9ucy5hZGRBbGwoc3VnZyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25zOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeUluZm9VdGlscy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeUluZm9VdGlscy5qYXZhCmluZGV4IGRjZmE0ODMuLmRmN2JhZDggMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnlJbmZvVXRpbHMuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EaWN0aW9uYXJ5SW5mb1V0aWxzLmphdmEKQEAgLTEyOSw2ICsxMjksMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgdG9wIGxldmVsIHRlbXAgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdvcmRMaXN0VGVtcERpcmVjdG9yeShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RmlsZXNEaXIoKSArIEZpbGUuc2VwYXJhdG9yICsgInRtcCI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV2ZXJzZSBlc2NhcGluZyBkb25lIGJ5IHJlcGxhY2VGaWxlTmFtZURhbmdlcm91c0NoYXJhY3RlcnMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V29yZExpc3RJZEZyb21GaWxlTmFtZShmaW5hbCBTdHJpbmcgZm5hbWUpIHsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0V4cGFuZGFibGVCaW5hcnlEaWN0aW9uYXJ5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9FeHBhbmRhYmxlQmluYXJ5RGljdGlvbmFyeS5qYXZhCmluZGV4IDRiMTk3NWEuLjg4N2Q2NTcgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0V4cGFuZGFibGVCaW5hcnlEaWN0aW9uYXJ5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRXhwYW5kYWJsZUJpbmFyeURpY3Rpb25hcnkuamF2YQpAQCAtMjAwLDEyICsyMDAsMTQgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IGdldFN1Z2dlc3Rpb25zKGZpbmFsIFdvcmRDb21wb3NlciBjb21wb3NlciwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZCwgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQsIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbywKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmxvY2tPZmZlbnNpdmVXb3JkcykgewogICAgICAgICBhc3luY1JlbG9hZERpY3Rpb25hcnlJZlJlcXVpcmVkKCk7CiAgICAgICAgIGlmIChtTG9jYWxEaWN0aW9uYXJ5Q29udHJvbGxlci50cnlMb2NrKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CaW5hcnlEaWN0aW9uYXJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1CaW5hcnlEaWN0aW9uYXJ5LmdldFN1Z2dlc3Rpb25zKGNvbXBvc2VyLCBwcmV2V29yZCwgcHJveGltaXR5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQmluYXJ5RGljdGlvbmFyeS5nZXRTdWdnZXN0aW9ucyhjb21wb3NlciwgcHJldldvcmQsIHByb3hpbWl0eUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tPZmZlbnNpdmVXb3Jkcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBtTG9jYWxEaWN0aW9uYXJ5Q29udHJvbGxlci51bmxvY2soKTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0V4cGFuZGFibGVEaWN0aW9uYXJ5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9FeHBhbmRhYmxlRGljdGlvbmFyeS5qYXZhCmluZGV4IGZkODFkMTMuLjBkYWJkYjggMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0V4cGFuZGFibGVEaWN0aW9uYXJ5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRXhwYW5kYWJsZURpY3Rpb25hcnkuamF2YQpAQCAtMjUzLDcgKzI1Myw4IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQXJyYXlMaXN0PFN1Z2dlc3RlZFdvcmRJbmZvPiBnZXRTdWdnZXN0aW9ucyhmaW5hbCBXb3JkQ29tcG9zZXIgY29tcG9zZXIsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQsIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrT2ZmZW5zaXZlV29yZHMpIHsKICAgICAgICAgaWYgKHJlbG9hZERpY3Rpb25hcnlJZlJlcXVpcmVkKCkpIHJldHVybiBudWxsOwogICAgICAgICBpZiAoY29tcG9zZXIuc2l6ZSgpID4gMSkgewogICAgICAgICAgICAgaWYgKGNvbXBvc2VyLnNpemUoKSA+PSBDb25zdGFudHMuRGljdGlvbmFyeS5NQVhfV09SRF9MRU5HVEgpIHsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0ZlZWRiYWNrVXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0ZlZWRiYWNrVXRpbHMuamF2YQppbmRleCAxZTUyNjBlLi4wNTgyNzYzIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9GZWVkYmFja1V0aWxzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRmVlZGJhY2tVdGlscy5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIAogcHVibGljIGNsYXNzIEZlZWRiYWNrVXRpbHMgewogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZlZWRiYWNrRm9ybVN1cHBvcnRlZCgpIHsKQEAgLTI1LDQgKzI2LDEyIEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hvd0ZlZWRiYWNrRm9ybShDb250ZXh0IGNvbnRleHQpIHsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRBYm91dEtleWJvYXJkVGl0bGVSZXNJZCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbnRlbnQgZ2V0QWJvdXRLZXlib2FyZEludGVudChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vSm5pVXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0puaVV0aWxzLmphdmEKaW5kZXggZjkzMDU5OS4uOGFlZGVlNSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vSm5pVXRpbHMuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9KbmlVdGlscy5qYXZhCkBAIC0yMywxNSArMjMsMTkgQEAKIHB1YmxpYyBmaW5hbCBjbGFzcyBKbmlVdGlscyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEpuaVV0aWxzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKIAotICAgIHByaXZhdGUgSm5pVXRpbHMoKSB7Ci0gICAgICAgIC8vIFRoaXMgdXRpbGl0eSBjbGFzcyBpcyBub3QgcHVibGljbHkgaW5zdGFudGlhYmxlLgotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkTmF0aXZlTGlicmFyeSgpIHsKKyAgICBzdGF0aWMgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KEpuaUxpYk5hbWUuSk5JX0xJQl9OQU1FKTsKICAgICAgICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgdWxlKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9hZCBuYXRpdmUgbGlicmFyeSAiICsgSm5pTGliTmFtZS5KTklfTElCX05BTUUsIHVsZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIEpuaVV0aWxzKCkgeworICAgICAgICAvLyBUaGlzIHV0aWxpdHkgY2xhc3MgaXMgbm90IHB1YmxpY2x5IGluc3RhbnRpYWJsZS4KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9hZE5hdGl2ZUxpYnJhcnkoKSB7CisgICAgICAgIC8vIEVuc3VyZXMgdGhlIHN0YXRpYyBpbml0aWFsaXplciBpcyBjYWxsZWQKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9MYXRpbklNRS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vTGF0aW5JTUUuamF2YQppbmRleCA1ZWYyMTIwLi4zNDdhNGM2IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9MYXRpbklNRS5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0xhdGluSU1FLmphdmEKQEAgLTkwLDcgKzkwLDcgQEAKIC8qKgogICogSW5wdXQgbWV0aG9kIGltcGxlbWVudGF0aW9uIGZvciBRd2VydHknaXNoIGtleWJvYXJkLgogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGF0aW5JTUUgZXh0ZW5kcyBJbnB1dE1ldGhvZFNlcnZpY2UgaW1wbGVtZW50cyBLZXlib2FyZEFjdGlvbkxpc3RlbmVyLAorcHVibGljIGNsYXNzIExhdGluSU1FIGV4dGVuZHMgSW5wdXRNZXRob2RTZXJ2aWNlIGltcGxlbWVudHMgS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lciwKICAgICAgICAgU3VnZ2VzdGlvblN0cmlwVmlldy5MaXN0ZW5lciwgVGFyZ2V0QXBwbGljYXRpb25HZXR0ZXIuT25UYXJnZXRBcHBsaWNhdGlvbktub3duTGlzdGVuZXIsCiAgICAgICAgIFN1Z2dlc3QuU3VnZ2VzdEluaXRpYWxpemF0aW9uTGlzdGVuZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMYXRpbklNRS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CkBAIC0xODgsNiArMTg4LDggQEAKICAgICAvLyBLZWVwcyB0cmFjayBvZiBtb3N0IHJlY2VudGx5IGluc2VydGVkIHRleHQgKG11bHRpLWNoYXJhY3RlciBrZXkpIGZvciByZXZlcnRpbmcKICAgICBwcml2YXRlIFN0cmluZyBtRW50ZXJlZFRleHQ7CiAKKyAgICAvLyBUT0RPOiBUaGlzIGJvb2xlYW4gaXMgcGVyc2lzdGVudCBzdGF0ZSBhbmQgY2F1c2VzIGxhcmdlIHNpZGUgZWZmZWN0cyBhdCB1bmV4cGVjdGVkIHRpbWVzLgorICAgIC8vIEZpbmQgYSB3YXkgdG8gcmVtb3ZlIGl0IGZvciByZWFkYWJpbGl0eS4KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQXV0b0NvcnJlY3Rpb25JbmRpY2F0b3JPbjsKIAogICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbU9wdGlvbnNEaWFsb2c7CkBAIC0yNTAsNiArMjUyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RSZXN1bWVTdWdnZXN0aW9ucygpIHsKKyAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKE1TR19SRVNVTUVfU1VHR0VTVElPTlMpOwogICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoTVNHX1JFU1VNRV9TVUdHRVNUSU9OUyksIG1EZWxheVVwZGF0ZVN1Z2dlc3Rpb25zKTsKICAgICAgICAgfQogCkBAIC03NTksNyArNzYyLDggQEAKICAgICAgICAgfQogICAgICAgICBtU3VnZ2VzdGVkV29yZHMgPSBTdWdnZXN0ZWRXb3Jkcy5FTVBUWTsKIAotICAgICAgICBtQ29ubmVjdGlvbi5yZXNldENhY2hlc1Vwb25DdXJzb3JNb3ZlKGVkaXRvckluZm8uaW5pdGlhbFNlbFN0YXJ0KTsKKyAgICAgICAgbUNvbm5lY3Rpb24ucmVzZXRDYWNoZXNVcG9uQ3Vyc29yTW92ZShlZGl0b3JJbmZvLmluaXRpYWxTZWxTdGFydCwKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBzaG91bGRGaW5pc2hDb21wb3NpdGlvbiAqLyk7CiAKICAgICAgICAgaWYgKGlzRGlmZmVyZW50VGV4dEZpZWxkKSB7CiAgICAgICAgICAgICBtYWluS2V5Ym9hcmRWaWV3LmNsb3NpbmcoKTsKQEAgLTkwMCw3ICs5MDQsMTIgQEAKICAgICAgICAgLy8gd2Uga25vdyBmb3Igc3VyZSB0aGUgY3Vyc29yIG1vdmVkIHdoaWxlIHdlIHdlcmUgY29tcG9zaW5nIGFuZCB3ZSBzaG91bGQgcmVzZXQKICAgICAgICAgLy8gdGhlIHN0YXRlLgogICAgICAgICBmaW5hbCBib29sZWFuIG5vQ29tcG9zaW5nU3BhbiA9IGNvbXBvc2luZ1NwYW5TdGFydCA9PSAtMSAmJiBjb21wb3NpbmdTcGFuRW5kID09IC0xOwotICAgICAgICBpZiAoIW1FeHBlY3RpbmdVcGRhdGVTZWxlY3Rpb24KKyAgICAgICAgLy8gSWYgdGhlIGtleWJvYXJkIGlzIG5vdCB2aXNpYmxlLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFsbCB0aGUgaG91c2VrZWVwaW5nIHdvcmssIGFzIGl0CisgICAgICAgIC8vIHdpbGwgYmUgcmVzZXQgd2hlbiB0aGUga2V5Ym9hcmQgc2hvd3MgdXAgYW55d2F5LgorICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiBMYXRpbklNRSBzdXBwb3J0cyBoYXJkd2FyZSBrZXlib2FyZHMuCisgICAgICAgIC8vIE5PVEU6IHRoZSB0ZXN0IGhhcm5lc3Mgc3ViY2xhc3NlcyBMYXRpbklNRSBhbmQgb3ZlcnJpZGVzIGlzSW5wdXRWaWV3U2hvd24oKS4KKyAgICAgICAgLy8gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gc2ltdWxhdGUgYWN0dWFsIGV4ZWN1dGlvbi4KKyAgICAgICAgaWYgKGlzSW5wdXRWaWV3U2hvd24oKSAmJiAhbUV4cGVjdGluZ1VwZGF0ZVNlbGVjdGlvbgogICAgICAgICAgICAgICAgICYmICFtQ29ubmVjdGlvbi5pc0JlbGF0ZWRFeHBlY3RlZFVwZGF0ZShvbGRTZWxTdGFydCwgbmV3U2VsU3RhcnQpKSB7CiAgICAgICAgICAgICAvLyBUQUtFIENBUkU6IHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gd2hlbiB3ZSBlbnRlciB0aGlzIHRlc3QgZXZlbiB3aGVuIHRoZSB1c2VyCiAgICAgICAgICAgICAvLyBkaWQgbm90IGV4cGxpY2l0bHkgbW92ZSB0aGUgY3Vyc29yLiBUaGlzIGhhcHBlbnMgd2hlbiB0eXBpbmcgZmFzdCwgd2hlcmUgdHdvIGtleXMKQEAgLTExNDgsMTMgKzExNTcsMTQgQEAKICAgICAvLyBUaGlzIHdpbGwgcmVzZXQgdGhlIHdob2xlIGlucHV0IHN0YXRlIHRvIHRoZSBzdGFydGluZyBzdGF0ZS4gSXQgd2lsbCBjbGVhcgogICAgIC8vIHRoZSBjb21wb3Npbmcgd29yZCwgcmVzZXQgdGhlIGxhc3QgY29tcG9zZWQgd29yZCwgdGVsbCB0aGUgaW5wdXRjb25uZWN0aW9uIGFib3V0IGl0LgogICAgIHByaXZhdGUgdm9pZCByZXNldEVudGlyZUlucHV0U3RhdGUoZmluYWwgaW50IG5ld0N1cnNvclBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkRmluaXNoQ29tcG9zaXRpb24gPSBtV29yZENvbXBvc2VyLmlzQ29tcG9zaW5nV29yZCgpOwogICAgICAgICByZXNldENvbXBvc2luZ1N0YXRlKHRydWUgLyogYWxzb1Jlc2V0TGFzdENvbXBvc2VkV29yZCAqLyk7CiAgICAgICAgIGlmIChtU2V0dGluZ3MuZ2V0Q3VycmVudCgpLm1CaWdyYW1QcmVkaWN0aW9uRW5hYmxlZCkgewogICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU3RyaXAoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNldFN1Z2dlc3RlZFdvcmRzKG1TZXR0aW5ncy5nZXRDdXJyZW50KCkubVN1Z2dlc3RQdW5jTGlzdCwgZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIG1Db25uZWN0aW9uLnJlc2V0Q2FjaGVzVXBvbkN1cnNvck1vdmUobmV3Q3Vyc29yUG9zaXRpb24pOworICAgICAgICBtQ29ubmVjdGlvbi5yZXNldENhY2hlc1Vwb25DdXJzb3JNb3ZlKG5ld0N1cnNvclBvc2l0aW9uLCBzaG91bGRGaW5pc2hDb21wb3NpdGlvbik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29tcG9zaW5nU3RhdGUoZmluYWwgYm9vbGVhbiBhbHNvUmVzZXRMYXN0Q29tcG9zZWRXb3JkKSB7CkBAIC0xNTc3LDIxICsxNTg3LDExIEBACiAgICAgICAgICAgICAgICAgY29tbWl0VHlwZWQoTGFzdENvbXBvc2VkV29yZC5OT1RfQV9TRVBBUkFUT1IpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUV4cGVjdGluZ1VwZGF0ZVNlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgdHlwZWQgc29tZXRoaW5nIGJ1dCBkaWRuJ3QKLSAgICAgICAgICAgIC8vIG1hbnVhbCBwaWNrIGl0IGFuZCBkaWRuJ3QgaW5wdXQgYW55IHNlcGFyYXRvcjogd2Ugd2FudCB0byBwdXQgYSBzcGFjZSBiZXR3ZWVuIHdoYXQKLSAgICAgICAgICAgIC8vIGhhcyBiZWVuIGVudGVyZWQgYW5kIHRoZSBjb21pbmcgZ2VzdHVyZSBpbnB1dCByZXN1bHQsIHNvIHdlIGdvIGludG8gcGhhbnRvbSBzcGFjZQotICAgICAgICAgICAgLy8gc3RhdGUsIHdoaWNoIHdpbGwgYmUgcHJvbW90ZWQgdG8gYSBzcGFjZSB3aGVuIHRoZSBnZXN0dXJlIHJlc3VsdCBpcyBjb21taXR0ZWQuIEJ1dCBpZgotICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgaW5wdXQgZW5kcyBpbiBhIHdvcmQgY29ubmVjdG9yIG9uIHRoZSBvdGhlciBoYW5kLCB0aGVuIHdlIHdhbnQgdG8gaGF2ZQotICAgICAgICAgICAgLy8gdGhlIG5leHQgaW5wdXQgc3RpY2sgdG8gdGhlIGN1cnJlbnQgaW5wdXQgc28gd2UgZG9uJ3Qgc3dpdGNoIHRvIHBoYW50b20gc3BhY2Ugc3RhdGUuCi0gICAgICAgICAgICBpZiAoIW1TZXR0aW5ncy5nZXRDdXJyZW50KCkuaXNXb3JkQ29ubmVjdG9yKGxhc3RDaGFyKSkgewotICAgICAgICAgICAgICAgIG1TcGFjZVN0YXRlID0gU1BBQ0VfU1RBVEVfUEhBTlRPTTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2RlUG9pbnRCZWZvcmVDdXJzb3IgPSBtQ29ubmVjdGlvbi5nZXRDb2RlUG9pbnRCZWZvcmVDdXJzb3IoKTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY29kZVBvaW50QmVmb3JlQ3Vyc29yKQotICAgICAgICAgICAgICAgICAgICB8fCBtU2V0dGluZ3MuZ2V0Q3VycmVudCgpLmlzVXN1YWxseUZvbGxvd2VkQnlTcGFjZShjb2RlUG9pbnRCZWZvcmVDdXJzb3IpKSB7Ci0gICAgICAgICAgICAgICAgbVNwYWNlU3RhdGUgPSBTUEFDRV9TVEFURV9QSEFOVE9NOwotICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBjb2RlUG9pbnRCZWZvcmVDdXJzb3IgPSBtQ29ubmVjdGlvbi5nZXRDb2RlUG9pbnRCZWZvcmVDdXJzb3IoKTsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY29kZVBvaW50QmVmb3JlQ3Vyc29yKQorICAgICAgICAgICAgICAgIHx8IG1TZXR0aW5ncy5nZXRDdXJyZW50KCkuaXNVc3VhbGx5Rm9sbG93ZWRCeVNwYWNlKGNvZGVQb2ludEJlZm9yZUN1cnNvcikpIHsKKyAgICAgICAgICAgIG1TcGFjZVN0YXRlID0gU1BBQ0VfU1RBVEVfUEhBTlRPTTsKICAgICAgICAgfQogICAgICAgICBtQ29ubmVjdGlvbi5lbmRCYXRjaEVkaXQoKTsKICAgICAgICAgbVdvcmRDb21wb3Nlci5zZXRDYXBpdGFsaXplZE1vZGVBdFN0YXJ0Q29tcG9zaW5nVGltZShnZXRBY3R1YWxDYXBzTW9kZSgpKTsKQEAgLTE3NTksOSArMTc1OSwxNiBAQAogCiAgICAgLy8gQ2FsbGVkIGZyb20gUG9pbnRlclRyYWNrZXIgdGhyb3VnaCB0aGUgS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lciBpbnRlcmZhY2UKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaFNsaWRpbmdJbnB1dCgpIHsKKyAgICAgICAgLy8gVXNlciBmaW5pc2hlZCBzbGlkaW5nIGlucHV0LgorICAgICAgICBtS2V5Ym9hcmRTd2l0Y2hlci5vbkZpbmlzaFNsaWRpbmdJbnB1dCgpOworICAgIH0KKworICAgIC8vIENhbGxlZCBmcm9tIFBvaW50ZXJUcmFja2VyIHRocm91Z2ggdGhlIEtleWJvYXJkQWN0aW9uTGlzdGVuZXIgaW50ZXJmYWNlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DYW5jZWxJbnB1dCgpIHsKICAgICAgICAgLy8gVXNlciByZWxlYXNlZCBhIGZpbmdlciBvdXRzaWRlIGFueSBrZXkKLSAgICAgICAgbUtleWJvYXJkU3dpdGNoZXIub25DYW5jZWxJbnB1dCgpOworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIHNvIGZhci4KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5MDUsNiArMTkxMiw4IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgeSwgZmluYWwgaW50IHNwYWNlU3RhdGUpIHsKICAgICAgICAgYm9vbGVhbiBpc0NvbXBvc2luZ1dvcmQgPSBtV29yZENvbXBvc2VyLmlzQ29tcG9zaW5nV29yZCgpOwogCisgICAgICAgIC8vIFRPRE86IHJlbW92ZSBpc1dvcmRDb25uZWN0b3IoKSBhbmQgdXNlIGlzVXN1YWxseUZvbGxvd2VkQnlTcGFjZSgpIGluc3RlYWQuCisgICAgICAgIC8vIFNlZSBvblN0YXJ0QmF0Y2hJbnB1dCgpIHRvIHNlZSBob3cgdG8gZG8gaXQuCiAgICAgICAgIGlmIChTUEFDRV9TVEFURV9QSEFOVE9NID09IHNwYWNlU3RhdGUgJiYKICAgICAgICAgICAgICAgICAhbVNldHRpbmdzLmdldEN1cnJlbnQoKS5pc1dvcmRDb25uZWN0b3IocHJpbWFyeUNvZGUpKSB7CiAgICAgICAgICAgICBpZiAoaXNDb21wb3NpbmdXb3JkKSB7CkBAIC0yMTg1LDYgKzIxOTQsNyBAQAogICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLmdldE50aFByZXZpb3VzV29yZChtU2V0dGluZ3MuZ2V0Q3VycmVudCgpLm1Xb3JkU2VwYXJhdG9ycywKICAgICAgICAgICAgICAgICBtV29yZENvbXBvc2VyLmlzQ29tcG9zaW5nV29yZCgpID8gMiA6IDEpOwogICAgICAgICByZXR1cm4gbVN1Z2dlc3QuZ2V0U3VnZ2VzdGVkV29yZHMobVdvcmRDb21wb3NlciwgcHJldldvcmQsIGtleWJvYXJkLmdldFByb3hpbWl0eUluZm8oKSwKKyAgICAgICAgICAgICAgICBtU2V0dGluZ3MuZ2V0QmxvY2tQb3RlbnRpYWxseU9mZmVuc2l2ZSgpLAogICAgICAgICAgICAgICAgIG1TZXR0aW5ncy5nZXRDdXJyZW50KCkubUNvcnJlY3Rpb25FbmFibGVkLCBzZXNzaW9uSWQpOwogICAgIH0KIApAQCAtMjQ0MywxMCArMjQ1MywxNSBAQAogICAgIHByaXZhdGUgdm9pZCByZXN0YXJ0U3VnZ2VzdGlvbnNPbldvcmRUb3VjaGVkQnlDdXJzb3IoKSB7CiAgICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgbm90IHRvdWNoaW5nIGEgd29yZCwgb3IgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24sIHJldHVybiByaWdodCBhd2F5LgogICAgICAgICBpZiAobUxhc3RTZWxlY3Rpb25TdGFydCAhPSBtTGFzdFNlbGVjdGlvbkVuZCkgcmV0dXJuOworICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRoZSBjdXJzb3IgbG9jYXRpb24sIHJldHVybi4KKyAgICAgICAgaWYgKG1MYXN0U2VsZWN0aW9uU3RhcnQgPCAwKSByZXR1cm47CiAgICAgICAgIGlmICghbUNvbm5lY3Rpb24uaXNDdXJzb3JUb3VjaGluZ1dvcmQobVNldHRpbmdzLmdldEN1cnJlbnQoKSkpIHJldHVybjsKICAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBtQ29ubmVjdGlvbi5nZXRXb3JkUmFuZ2VBdEN1cnNvcihtU2V0dGluZ3MuZ2V0V29yZFNlcGFyYXRvcnMoKSwKICAgICAgICAgICAgICAgICAwIC8qIGFkZGl0aW9uYWxQcmVjZWRpbmdXb3Jkc0NvdW50ICovKTsKICAgICAgICAgaWYgKG51bGwgPT0gcmFuZ2UpIHJldHVybjsgLy8gSGFwcGVucyBpZiB3ZSBkb24ndCBoYXZlIGFuIGlucHV0IGNvbm5lY3Rpb24gYXQgYWxsCisgICAgICAgIC8vIElmIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uIChlZGl0b3IgYnVnIG9yIHNvKSB3ZSBtZWFzdXJlIHRoZSB0ZXh0IGJlZm9yZSB0aGUgY3Vyc29yIGFzCisgICAgICAgIC8vIGxvbmdlciB0aGFuIHdoYXQgdGhlIGVudGlyZSB0ZXh0IGlzIHN1cHBvc2VkIHRvIGJlLCB0aGUgc2FmZSB0aGluZyB0byBkbyBpcyBiYWlsIG91dC4KKyAgICAgICAgaWYgKHJhbmdlLm1DaGFyc0JlZm9yZSA+IG1MYXN0U2VsZWN0aW9uU3RhcnQpIHJldHVybjsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN1Z2dlc3RlZFdvcmRJbmZvPiBzdWdnZXN0aW9ucyA9IENvbGxlY3Rpb25VdGlscy5uZXdBcnJheUxpc3QoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVkV29yZCA9IHJhbmdlLm1Xb3JkLnRvU3RyaW5nKCk7CiAgICAgICAgIGlmIChyYW5nZS5tV29yZCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgewpAQCAtMjQ5OSw3ICsyNTE0LDEwIEBACiAKICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmVyeSBpbXBvcnRhbnQgaGVyZSB0aGF0IHN1Z2dlc3RlZFdvcmRzLm1XaWxsQXV0b0NvcnJlY3QgaXMgZmFsc2UuCiAgICAgICAgIC8vIFdlIG5ldmVyIHdhbnQgdG8gYXV0by1jb3JyZWN0IG9uIGEgcmVzdW1lZCBzdWdnZXN0aW9uLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHRocmVlCi0gICAgICAgIC8vIHBsYWNlcyBhYm92ZSB3aGVyZSBzdWdnZXN0ZWRXb3JkcyBpcyBhZmZlY3RlZC4KKyAgICAgICAgLy8gcGxhY2VzIGFib3ZlIHdoZXJlIHN1Z2dlc3RlZFdvcmRzIGlzIGFmZmVjdGVkLiBXZSBhbHNvIG5lZWQgdG8gcmVzZXQKKyAgICAgICAgLy8gbUlzQXV0b0NvcnJlY3Rpb25JbmRpY2F0b3JPbiB0byBhdm9pZCBzaG93U3VnZ2VzdGlvblN0cmlwIHRvdWNoaW5nIHRoZSB0ZXh0IHRvIGFkYXB0IGl0LgorICAgICAgICAvLyBUT0RPOiByZW1vdmUgbUlzQXV0b0NvcnJlY3Rpb25JbmRpY2F0b3Igb24gKHNlZSBjb21tZW50IG9uIGRlZmluaXRpb24pCisgICAgICAgIG1Jc0F1dG9Db3JyZWN0aW9uSW5kaWNhdG9yT24gPSBmYWxzZTsKICAgICAgICAgc2hvd1N1Z2dlc3Rpb25TdHJpcChzdWdnZXN0ZWRXb3JkcywgdHlwZWRXb3JkKTsKICAgICB9CiAKQEAgLTI2MTEsOCArMjYyOSw4IEBACiAgICAgLy8gQ2FsbGJhY2sgY2FsbGVkIGJ5IFBvaW50ZXJUcmFja2VyIHRocm91Z2ggdGhlIEtleWJvYXJkQWN0aW9uTGlzdGVuZXIuIFRoaXMgaXMgY2FsbGVkIHdoZW4gYQogICAgIC8vIGtleSBpcyBkZXByZXNzZWQ7IHJlbGVhc2UgbWF0Y2hpbmcgY2FsbCBpcyBvblJlbGVhc2VLZXkgYmVsb3cuCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QcmVzc0tleShmaW5hbCBpbnQgcHJpbWFyeUNvZGUpIHsKLSAgICAgICAgbUtleWJvYXJkU3dpdGNoZXIub25QcmVzc0tleShwcmltYXJ5Q29kZSk7CisgICAgcHVibGljIHZvaWQgb25QcmVzc0tleShmaW5hbCBpbnQgcHJpbWFyeUNvZGUsIGZpbmFsIGJvb2xlYW4gaXNTaW5nbGVQb2ludGVyKSB7CisgICAgICAgIG1LZXlib2FyZFN3aXRjaGVyLm9uUHJlc3NLZXkocHJpbWFyeUNvZGUsIGlzU2luZ2xlUG9pbnRlcik7CiAgICAgfQogCiAgICAgLy8gQ2FsbGJhY2sgYnkgUG9pbnRlclRyYWNrZXIgdGhyb3VnaCB0aGUgS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lci4gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGtleQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vTWV0YWRhdGFGaWxlVXJpR2V0dGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9NZXRhZGF0YUZpbGVVcmlHZXR0ZXIuamF2YQppbmRleCBlNmRjNmRiLi5hOThlY2M3IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9NZXRhZGF0YUZpbGVVcmlHZXR0ZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9NZXRhZGF0YUZpbGVVcmlHZXR0ZXIuamF2YQpAQCAtMTksMTAgKzE5LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiAKIC8qKgotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgbWV0YWRhdGEgVVJJLgorICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgbWV0YWRhdGEgVVJJIGFuZCB0aGUgYWRkaXRpb25hbCBJRC4KICAqLwogcHVibGljIGNsYXNzIE1ldGFkYXRhRmlsZVVyaUdldHRlciB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YWRhdGFVcmkoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHJpdmF0ZSBNZXRhZGF0YUZpbGVVcmlHZXR0ZXIoKSB7CisgICAgICAgIC8vIFRoaXMgaGVscGVyIGNsYXNzIGlzIG5vdCBpbnN0YW50aWFibGUuCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YWRhdGFVcmkoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0aW9uYXJ5X3BhY2tfbWV0YWRhdGFfdXJpKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhZGF0YUFkZGl0aW9uYWxJZChmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1Jlc291cmNlVXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1Jlc291cmNlVXRpbHMuamF2YQppbmRleCBiNzRiOTc5Li5hOWZiYTUzIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SZXNvdXJjZVV0aWxzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUmVzb3VyY2VVdGlscy5qYXZhCkBAIC0xOSwxNCArMTksMTcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5hbm5vdGF0aW9ucy5Vc2VkRm9yVGVzdGluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVV0aWxzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gUmVzb3VyY2VVdGlscy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVTkRFRklORURfUkFUSU8gPSAtMS4wZjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfRElNRU5TSU9OID0gLTE7CkBAIC0zNSwxMSArMzgsMzIgQEAKICAgICAgICAgLy8gVGhpcyB1dGlsaXR5IGNsYXNzIGlzIG5vdCBwdWJsaWNseSBpbnN0YW50aWFibGUuCiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJFRklYID0gIkRFRkFVTFQsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSRFdBUkVfUFJFRklYID0gQnVpbGQuSEFSRFdBUkUgKyAiLCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc0RldmljZU92ZXJyaWRlVmFsdWVNYXAgPQogICAgICAgICAgICAgQ29sbGVjdGlvblV0aWxzLm5ld0hhc2hNYXAoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJVSUxEX0tFWVNfQU5EX1ZBTFVFUyA9IHsKKyAgICAgICAgIkhBUkRXQVJFIiwgQnVpbGQuSEFSRFdBUkUsCisgICAgICAgICJNT0RFTCIsIEJ1aWxkLk1PREVMLAorICAgICAgICAiQlJBTkQiLCBCdWlsZC5CUkFORCwKKyAgICAgICAgIk1BTlVGQUNUVVJFUiIsIEJ1aWxkLk1BTlVGQUNUVVJFUgorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc0J1aWxkS2V5VmFsdWVzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzQnVpbGRLZXlWYWx1ZXNEZWJ1Z1N0cmluZzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHNCdWlsZEtleVZhbHVlcyA9IENvbGxlY3Rpb25VdGlscy5uZXdIYXNoTWFwKCk7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGtleVZhbHVlUGFpcnMgPSBDb2xsZWN0aW9uVXRpbHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGZpbmFsIGludCBrZXlDb3VudCA9IEJVSUxEX0tFWVNfQU5EX1ZBTFVFUy5sZW5ndGggLyAyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGkgKiAyOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IEJVSUxEX0tFWVNfQU5EX1ZBTFVFU1tpbmRleF07CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBCVUlMRF9LRVlTX0FORF9WQUxVRVNbaW5kZXggKyAxXTsKKyAgICAgICAgICAgIHNCdWlsZEtleVZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLmFkZChrZXkgKyAnPScgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc0J1aWxkS2V5VmFsdWVzRGVidWdTdHJpbmcgPSAiWyIgKyBUZXh0VXRpbHMuam9pbigiICIsIGtleVZhbHVlUGFpcnMpICsgIl0iOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERldmljZU92ZXJyaWRlVmFsdWUoZmluYWwgUmVzb3VyY2VzIHJlcywgZmluYWwgaW50IG92ZXJyaWRlUmVzSWQpIHsKICAgICAgICAgZmluYWwgaW50IG9yaWVudGF0aW9uID0gcmVzLmdldENvbmZpZ3VyYXRpb24oKS5vcmllbnRhdGlvbjsKICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IG92ZXJyaWRlUmVzSWQgKyAiLSIgKyBvcmllbnRhdGlvbjsKQEAgLTQ4LDMzICs3MiwxMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG92ZXJyaWRlQXJyYXkgPSByZXMuZ2V0U3RyaW5nQXJyYXkob3ZlcnJpZGVSZXNJZCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvdmVycmlkZVZhbHVlID0gU3RyaW5nVXRpbHMuZmluZFByZWZpeGVkU3RyaW5nKEhBUkRXQVJFX1BSRUZJWCwgb3ZlcnJpZGVBcnJheSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdmVycmlkZVZhbHVlID0gZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhzQnVpbGRLZXlWYWx1ZXMsIG92ZXJyaWRlQXJyYXkpOwogICAgICAgICAvLyBUaGUgb3ZlcnJpZGVWYWx1ZSBtaWdodCBiZSBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgIGlmIChvdmVycmlkZVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpbmQgb3ZlcnJpZGUgdmFsdWU6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJlc291cmNlPSIrIHJlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShvdmVycmlkZVJlc0lkKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEJ1aWxkLkhBUkRXQVJFPSIgKyBCdWlsZC5IQVJEV0FSRSArICIgb3ZlcnJpZGU9IiArIG92ZXJyaWRlVmFsdWUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmkoVEFHLCAiRmluZCBvdmVycmlkZSB2YWx1ZToiCisgICAgICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZT0iKyByZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUob3ZlcnJpZGVSZXNJZCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJ1aWxkPSIgKyBzQnVpbGRLZXlWYWx1ZXNEZWJ1Z1N0cmluZworICAgICAgICAgICAgICAgICAgICArICIgb3ZlcnJpZGU9IiArIG92ZXJyaWRlVmFsdWUpOwogICAgICAgICAgICAgc0RldmljZU92ZXJyaWRlVmFsdWVNYXAucHV0KGtleSwgb3ZlcnJpZGVWYWx1ZSk7CiAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVWYWx1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWUgPSBTdHJpbmdVdGlscy5maW5kUHJlZml4ZWRTdHJpbmcoREVGQVVMVF9QUkVGSVgsIG92ZXJyaWRlQXJyYXkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlID0gZmluZERlZmF1bHRDb25zdGFudChvdmVycmlkZUFycmF5KTsKICAgICAgICAgLy8gVGhlIGRlZmF1bHRWYWx1ZSBtaWdodCBiZSBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGRuJ3QgZmluZCBvdmVycmlkZSB2YWx1ZSBub3IgZGVmYXVsdCB2YWx1ZToiCiAgICAgICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZT0iKyByZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUob3ZlcnJpZGVSZXNJZCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIEJ1aWxkLkhBUkRXQVJFPSIgKyBCdWlsZC5IQVJEV0FSRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkZvdW5kIGRlZmF1bHQgdmFsdWU6IgotICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZT0iKyByZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUob3ZlcnJpZGVSZXNJZCkKLSAgICAgICAgICAgICAgICArICIgQnVpbGQuSEFSRFdBUkU9IiArIEJ1aWxkLkhBUkRXQVJFICsgIiBkZWZhdWx0PSIgKyBkZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICArICIgYnVpbGQ9IiArIHNCdWlsZEtleVZhbHVlc0RlYnVnU3RyaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGRlZmF1bHQgdmFsdWU6IgorICAgICAgICAgICAgICAgICAgICArICIgcmVzb3VyY2U9IisgcmVzLmdldFJlc291cmNlRW50cnlOYW1lKG92ZXJyaWRlUmVzSWQpCisgICAgICAgICAgICAgICAgICAgICsgIiBidWlsZD0iICsgc0J1aWxkS2V5VmFsdWVzRGVidWdTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRlZmF1bHQ9IiArIGRlZmF1bHRWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgc0RldmljZU92ZXJyaWRlVmFsdWVNYXAucHV0KGtleSwgZGVmYXVsdFZhbHVlKTsKICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBjb25kaXRpb24gdGhhdCBmdWxmaWxscyBzcGVjaWZpZWQga2V5IHZhbHVlIHBhaXJzIGZyb20gYW4gYXJyYXkgb2YKKyAgICAgKiAiY29uZGl0aW9uLGNvbnN0YW50IiwgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcgY29uc3RhbnQuIEEgY29uZGl0aW9uIGlzCisgICAgICogInBhdHRlcm4xWzpwYXR0ZXJuMi4uLl0gKG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQpLiBBIHBhdHRlcm4gaXMKKyAgICAgKiAia2V5PXJlZ2V4cF92YWx1ZSIgc3RyaW5nLiBUaGUgY29uZGl0aW9uIG1hdGNoZXMgb25seSBpZiBhbGwgcGF0dGVybnMgb2YgdGhlIGNvbmRpdGlvbgorICAgICAqIGFyZSB0cnVlIGZvciB0aGUgc3BlY2lmaWVkIGtleSB2YWx1ZSBwYWlycy4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlLCAiY29uZGl0aW9uLGNvbnN0YW50IiBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQuCisgICAgICogKFNlZSB7QGxpbmsgUmVzb3VyY2VVdGlsc1Rlc3RzI3Rlc3RGaW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzUmVnZXhwKCl9KQorICAgICAqICAtIEhBUkRXQVJFPW1ha28sY29uc3RhbnRGb3JOZXh1czQKKyAgICAgKiAgLSBNT0RFTD1OZXh1cyA0Ok1BTlVGQUNUVVJFUj1MR0UsY29uc3RhbnRGb3JOZXh1czQKKyAgICAgKiAgLSAsZGVmYXVsdENvbnN0YW50CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5VmFsdWVQYWlycyBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgdG8gbG9vayBmb3IgYSBtYXRjaGVkIGNvbmRpdGlvbi4KKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uQ29uc3RhbnRBcnJheSBhbiBhcnJheSBvZiAiY29uZGl0aW9uLGNvbnN0YW50IiBlbGVtZW50cyB0byBiZSBzZWFyY2hlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdGFudCBwYXJ0IG9mIHRoZSBtYXRjaGVkICJjb25kaXRpb24sY29uc3RhbnQiIGVsZW1lbnQuIFJldHVybnMgbnVsbCBpZiBubworICAgICAqIGNvbmRpdGlvbiBtYXRjaGVzLgorICAgICAqLworICAgIEBVc2VkRm9yVGVzdGluZworICAgIHN0YXRpYyBTdHJpbmcgZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gY29uZGl0aW9uQ29uc3RhbnRBcnJheSkgeworICAgICAgICBpZiAoY29uZGl0aW9uQ29uc3RhbnRBcnJheSA9PSBudWxsIHx8IGtleVZhbHVlUGFpcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgY29uZGl0aW9uQ29uc3RhbnQgOiBjb25kaXRpb25Db25zdGFudEFycmF5KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcG9zQ29tbWEgPSBjb25kaXRpb25Db25zdGFudC5pbmRleE9mKCcsJyk7CisgICAgICAgICAgICBpZiAocG9zQ29tbWEgPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFycmF5IGVsZW1lbnQgaGFzIG5vIGNvbW1hOiAiICsgY29uZGl0aW9uQ29uc3RhbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbmRpdGlvbiA9IGNvbmRpdGlvbkNvbnN0YW50LnN1YnN0cmluZygwLCBwb3NDb21tYSk7CisgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgY29uZGl0aW9uLiBUaGUgZGVmYXVsdCBjb25kaXRpb24gc2hvdWxkIGJlIHNlYXJjaGVkIGJ5CisgICAgICAgICAgICAgICAgLy8ge0BsaW5rICNmaW5kQ29uc3RhbnRGb3JEZWZhdWx0KFN0cmluZ1tdKX0uCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnVsZmlsbHNDb25kaXRpb24oa2V5VmFsdWVQYWlycywgY29uZGl0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25Db25zdGFudC5zdWJzdHJpbmcocG9zQ29tbWEgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGZ1bGZpbGxzQ29uZGl0aW9uKGZpbmFsIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4ga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb25kaXRpb24pIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcGF0dGVybnMgPSBjb25kaXRpb24uc3BsaXQoIjoiKTsKKyAgICAgICAgLy8gQ2hlY2sgYWxsIHBhdHRlcm5zIGluIGEgY29uZGl0aW9uIGFyZSB0cnVlCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykgeworICAgICAgICAgICAgZmluYWwgaW50IHBvc0VxdWFsID0gcGF0dGVybi5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAocG9zRXF1YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBhdHRlcm4gaGFzIG5vICc9JzogIiArIGNvbmRpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgcG9zRXF1YWwpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0ga2V5VmFsdWVQYWlycy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZvdW5kIHVua25vd24ga2V5OiAiICsgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXR0ZXJuUmVnZXhwVmFsdWUgPSBwYXR0ZXJuLnN1YnN0cmluZyhwb3NFcXVhbCArIDEpOworICAgICAgICAgICAgaWYgKCF2YWx1ZS5tYXRjaGVzKHBhdHRlcm5SZWdleHBWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQFVzZWRGb3JUZXN0aW5nCisgICAgc3RhdGljIFN0cmluZyBmaW5kRGVmYXVsdENvbnN0YW50KGZpbmFsIFN0cmluZ1tdIGNvbmRpdGlvbkNvbnN0YW50QXJyYXkpIHsKKyAgICAgICAgaWYgKGNvbmRpdGlvbkNvbnN0YW50QXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgY29uZGl0aW9uIDogY29uZGl0aW9uQ29uc3RhbnRBcnJheSkgeworICAgICAgICAgICAgZmluYWwgaW50IHBvc0NvbW1hID0gY29uZGl0aW9uLmluZGV4T2YoJywnKTsKKyAgICAgICAgICAgIGlmIChwb3NDb21tYSA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXJyYXkgZWxlbWVudCBoYXMgbm8gY29tbWE6ICIgKyBjb25kaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvc0NvbW1hID09IDApIHsgLy8gY29uZGl0aW9uIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24uc3Vic3RyaW5nKHBvc0NvbW1hICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGcmFjdGlvbihmaW5hbCBmbG9hdCBmcmFjdGlvbikgewogICAgICAgICByZXR1cm4gZnJhY3Rpb24gPj0gMC4wZjsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SaWNoSW5wdXRDb25uZWN0aW9uLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SaWNoSW5wdXRDb25uZWN0aW9uLmphdmEKaW5kZXggOGVkN2FiMi4uOTgwMjE1ZCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUmljaElucHV0Q29ubmVjdGlvbi5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1JpY2hJbnB1dENvbm5lY3Rpb24uamF2YQpAQCAtMTM1LDEzICsxMzUsMTQgQEAKICAgICAgICAgaWYgKERFQlVHX1BSRVZJT1VTX1RFWFQpIGNoZWNrQ29uc2lzdGVuY3lGb3JEZWJ1ZygpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0Q2FjaGVzVXBvbkN1cnNvck1vdmUoZmluYWwgaW50IG5ld0N1cnNvclBvc2l0aW9uKSB7CisgICAgcHVibGljIHZvaWQgcmVzZXRDYWNoZXNVcG9uQ3Vyc29yTW92ZShmaW5hbCBpbnQgbmV3Q3Vyc29yUG9zaXRpb24sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEZpbmlzaENvbXBvc2l0aW9uKSB7CiAgICAgICAgIG1DdXJyZW50Q3Vyc29yUG9zaXRpb24gPSBuZXdDdXJzb3JQb3NpdGlvbjsKICAgICAgICAgbUNvbXBvc2luZ1RleHQuc2V0TGVuZ3RoKDApOwogICAgICAgICBtQ29tbWl0dGVkVGV4dEJlZm9yZUNvbXBvc2luZ1RleHQuc2V0TGVuZ3RoKDApOwogICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dEJlZm9yZUN1cnNvciA9IGdldFRleHRCZWZvcmVDdXJzb3IoREVGQVVMVF9URVhUX0NBQ0hFX1NJWkUsIDApOwogICAgICAgICBpZiAobnVsbCAhPSB0ZXh0QmVmb3JlQ3Vyc29yKSBtQ29tbWl0dGVkVGV4dEJlZm9yZUNvbXBvc2luZ1RleHQuYXBwZW5kKHRleHRCZWZvcmVDdXJzb3IpOwotICAgICAgICBpZiAobnVsbCAhPSBtSUMpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gbUlDICYmIHNob3VsZEZpbmlzaENvbXBvc2l0aW9uKSB7CiAgICAgICAgICAgICBtSUMuZmluaXNoQ29tcG9zaW5nVGV4dCgpOwogICAgICAgICAgICAgaWYgKFByb2R1Y3Rpb25GbGFnLlVTRVNfREVWRUxPUE1FTlRfT05MWV9ESUFHTk9TVElDUykgewogICAgICAgICAgICAgICAgIFJlc2VhcmNoTG9nZ2VyLnJpY2hJbnB1dENvbm5lY3Rpb25fZmluaXNoQ29tcG9zaW5nVGV4dCgpOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUmljaElucHV0TWV0aG9kTWFuYWdlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUmljaElucHV0TWV0aG9kTWFuYWdlci5qYXZhCmluZGV4IGUzOWFhZTkuLjk0NTEzZTYgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1JpY2hJbnB1dE1ldGhvZE1hbmFnZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SaWNoSW5wdXRNZXRob2RNYW5hZ2VyLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZEluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwpAQCAtNDYsNiArNDcsOCBAQAogICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyQ29tcGF0V3JhcHBlciBtSW1tV3JhcHBlcjsKICAgICBwcml2YXRlIElucHV0TWV0aG9kSW5mbyBtSW5wdXRNZXRob2RJbmZvT2ZUaGlzSW1lOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX05PVF9GT1VORCA9IC0xOworCiAgICAgcHVibGljIHN0YXRpYyBSaWNoSW5wdXRNZXRob2RNYW5hZ2VyIGdldEluc3RhbmNlKCkgewogICAgICAgICBzSW5zdGFuY2UuY2hlY2tJbml0aWFsaXplZCgpOwogICAgICAgICByZXR1cm4gc0luc3RhbmNlOwpAQCAtOTcsMTIgKzEwMCwxMDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIklucHV0IG1ldGhvZCBpZCBmb3IgIiArIHBhY2thZ2VOYW1lICsgIiBub3QgZm91bmQuIik7CiAgICAgfQogCisgICAgcHVibGljIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBnZXRNeUVuYWJsZWRJbnB1dE1ldGhvZFN1YnR5cGVMaXN0KAorICAgICAgICAgICAgYm9vbGVhbiBhbGxvd3NJbXBsaWNpdGx5U2VsZWN0ZWRTdWJ0eXBlcykgeworICAgICAgICByZXR1cm4gbUltbVdyYXBwZXIubUltbS5nZXRFbmFibGVkSW5wdXRNZXRob2RTdWJ0eXBlTGlzdCgKKyAgICAgICAgICAgICAgICBtSW5wdXRNZXRob2RJbmZvT2ZUaGlzSW1lLCBhbGxvd3NJbXBsaWNpdGx5U2VsZWN0ZWRTdWJ0eXBlcyk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gc3dpdGNoVG9OZXh0SW5wdXRNZXRob2QoZmluYWwgSUJpbmRlciB0b2tlbiwgZmluYWwgYm9vbGVhbiBvbmx5Q3VycmVudEltZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlc3VsdCA9IG1JbW1XcmFwcGVyLnN3aXRjaFRvTmV4dElucHV0TWV0aG9kKHRva2VuLCBvbmx5Q3VycmVudEltZSk7Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBtSW1tV3JhcHBlci5tSW1tLnN3aXRjaFRvTGFzdElucHV0TWV0aG9kKHRva2VuKTsKKyAgICAgICAgaWYgKG1JbW1XcmFwcGVyLnN3aXRjaFRvTmV4dElucHV0TWV0aG9kKHRva2VuLCBvbmx5Q3VycmVudEltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIFdhcyBub3QgYWJsZSB0byBjYWxsIHtAbGluayBJbnB1dE1ldGhvZE1hbmFnZXIjc3dpdGNoVG9OZXh0SW5wdXRNZXRob2RJQmluZGVyLGJvb2xlYW4pfQorICAgICAgICAvLyBiZWNhdXNlIHRoZSBjdXJyZW50IGRldmljZSBpcyBydW5uaW5nIElDUyBvciBwcmV2aW91cyBhbmQgbGFja3MgdGhlIEFQSS4KKyAgICAgICAgaWYgKHN3aXRjaFRvTmV4dElucHV0U3VidHlwZUluVGhpc0ltZSh0b2tlbiwgb25seUN1cnJlbnRJbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3dpdGNoVG9OZXh0SW5wdXRNZXRob2RBbmRTdWJ0eXBlKHRva2VuKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3dpdGNoVG9OZXh0SW5wdXRTdWJ0eXBlSW5UaGlzSW1lKGZpbmFsIElCaW5kZXIgdG9rZW4sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG9ubHlDdXJyZW50SW1lKSB7CisgICAgICAgIGZpbmFsIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBtSW1tV3JhcHBlci5tSW1tOworICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgY3VycmVudFN1YnR5cGUgPSBpbW0uZ2V0Q3VycmVudElucHV0TWV0aG9kU3VidHlwZSgpOworICAgICAgICBmaW5hbCBMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gZW5hYmxlZFN1YnR5cGVzID0gZ2V0TXlFbmFibGVkSW5wdXRNZXRob2RTdWJ0eXBlTGlzdCgKKyAgICAgICAgICAgICAgICB0cnVlIC8qIGFsbG93c0ltcGxpY2l0bHlTZWxlY3RlZFN1YnR5cGVzICovKTsKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnRJbmRleCA9IGdldFN1YnR5cGVJbmRleEluTGlzdChjdXJyZW50U3VidHlwZSwgZW5hYmxlZFN1YnR5cGVzKTsKKyAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSBJTkRFWF9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGZpbmQgY3VycmVudCBzdWJ0eXBlIGluIGVuYWJsZWQgc3VidHlwZXM6IHN1YnR5cGU9IgorICAgICAgICAgICAgICAgICAgICArIFN1YnR5cGVMb2NhbGUuZ2V0U3VidHlwZURpc3BsYXlOYW1lKGN1cnJlbnRTdWJ0eXBlKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IG5leHRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIGVuYWJsZWRTdWJ0eXBlcy5zaXplKCk7CisgICAgICAgIGlmIChuZXh0SW5kZXggPD0gY3VycmVudEluZGV4ICYmICFvbmx5Q3VycmVudEltZSkgeworICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgc3VidHlwZSBpcyB0aGUgbGFzdCBvciBvbmx5IGVuYWJsZWQgb25lIGFuZCBpdCBuZWVkcyB0byBzd2l0Y2ggdG8KKyAgICAgICAgICAgIC8vIG5leHQgSU1FLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBuZXh0U3VidHlwZSA9IGVuYWJsZWRTdWJ0eXBlcy5nZXQobmV4dEluZGV4KTsKKyAgICAgICAgc2V0SW5wdXRNZXRob2RBbmRTdWJ0eXBlKHRva2VuLCBuZXh0U3VidHlwZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzd2l0Y2hUb05leHRJbnB1dE1ldGhvZEFuZFN1YnR5cGUoZmluYWwgSUJpbmRlciB0b2tlbikgeworICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gbUltbVdyYXBwZXIubUltbTsKKyAgICAgICAgZmluYWwgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGVuYWJsZWRJbWlzID0gaW1tLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKTsKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnRJbmRleCA9IGdldEltaUluZGV4SW5MaXN0KG1JbnB1dE1ldGhvZEluZm9PZlRoaXNJbWUsIGVuYWJsZWRJbWlzKTsKKyAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSBJTkRFWF9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGZpbmQgY3VycmVudCBJTUUgaW4gZW5hYmxlZCBJTUVzOiBJTUUgcGFja2FnZT0iCisgICAgICAgICAgICAgICAgICAgICsgbUlucHV0TWV0aG9kSW5mb09mVGhpc0ltZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZEluZm8gbmV4dEltaSA9IGdldE5leHROb25BdXhpbGlhcnlJbWUoY3VycmVudEluZGV4LCBlbmFibGVkSW1pcyk7CisgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBlbmFibGVkU3VidHlwZXMgPSBpbW0uZ2V0RW5hYmxlZElucHV0TWV0aG9kU3VidHlwZUxpc3QoCisgICAgICAgICAgICAgICAgbmV4dEltaSwgdHJ1ZSAvKiBhbGxvd3NJbXBsaWNpdGx5U2VsZWN0ZWRTdWJ0eXBlcyAqLyk7CisgICAgICAgIGlmIChlbmFibGVkU3VidHlwZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBUaGUgbmV4dCBJTUUgaGFzIG5vIHN1YnR5cGUuCisgICAgICAgICAgICBpbW0uc2V0SW5wdXRNZXRob2QodG9rZW4sIG5leHRJbWkuZ2V0SWQoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgZmlyc3RTdWJ0eXBlID0gZW5hYmxlZFN1YnR5cGVzLmdldCgwKTsKKyAgICAgICAgaW1tLnNldElucHV0TWV0aG9kQW5kU3VidHlwZSh0b2tlbiwgbmV4dEltaS5nZXRJZCgpLCBmaXJzdFN1YnR5cGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW1pSW5kZXhJbkxpc3QoZmluYWwgSW5wdXRNZXRob2RJbmZvIGlucHV0TWV0aG9kSW5mbywKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBpbWlMaXN0KSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGltaUxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kSW5mbyBpbWkgPSBpbWlMaXN0LmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAoaW1pLmVxdWFscyhpbnB1dE1ldGhvZEluZm8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBJTkRFWF9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLy8gVGhpcyBtZXRob2QgbWltaWNzIHtAbGluayBJbnB1dE1ldGhvZE1hbmFnZXIjc3dpdGNoVG9OZXh0SW5wdXRNZXRob2QoSUJpbmRlcixib29sZWFuKX0uCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRNZXRob2RJbmZvIGdldE5leHROb25BdXhpbGlhcnlJbWUoZmluYWwgaW50IGN1cnJlbnRJbmRleCwKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBpbWlMaXN0KSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGltaUxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXh0SW5kZXggPSAoY3VycmVudEluZGV4ICsgaSkgJSBjb3VudDsKKyAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kSW5mbyBuZXh0SW1pID0gaW1pTGlzdC5nZXQobmV4dEluZGV4KTsKKyAgICAgICAgICAgIGlmICghaXNBdXhpbGlhcnlJbWUobmV4dEltaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEltaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW1pTGlzdC5nZXQoY3VycmVudEluZGV4KTsKKyAgICB9CisKKyAgICAvLyBDb3BpZWQgZnJvbSB7QGxpbmsgSW5wdXRNZXRob2RJbmZvfS4gU2VlIGhvdyBhdXhpbGlhcnkgb2YgSU1FIGlzIGRldGVybWluZWQuCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F1eGlsaWFyeUltZShmaW5hbCBJbnB1dE1ldGhvZEluZm8gaW1pKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGltaS5nZXRTdWJ0eXBlQ291bnQoKTsKKyAgICAgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gaW1pLmdldFN1YnR5cGVBdChpbmRleCk7CisgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaXNBdXhpbGlhcnkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTEyMiw4ICsyMjAsOCBAQAogICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUpIHsKICAgICAgICAgZmluYWwgYm9vbGVhbiBzdWJ0eXBlRW5hYmxlZCA9IGNoZWNrSWZTdWJ0eXBlQmVsb25nc1RvVGhpc0ltZUFuZEVuYWJsZWQoc3VidHlwZSk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VidHlwZUV4cGxpY2l0bHlFbmFibGVkID0gY2hlY2tJZlN1YnR5cGVCZWxvbmdzVG9MaXN0KAotICAgICAgICAgICAgICAgIHN1YnR5cGUsIG1JbW1XcmFwcGVyLm1JbW0uZ2V0RW5hYmxlZElucHV0TWV0aG9kU3VidHlwZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNZXRob2RJbmZvT2ZUaGlzSW1lLCBmYWxzZSAvKiBhbGxvd3NJbXBsaWNpdGx5U2VsZWN0ZWRTdWJ0eXBlcyAqLykpOworICAgICAgICAgICAgICAgIHN1YnR5cGUsIGdldE15RW5hYmxlZElucHV0TWV0aG9kU3VidHlwZUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd3NJbXBsaWNpdGx5U2VsZWN0ZWRTdWJ0eXBlcyAqLykpOwogICAgICAgICByZXR1cm4gc3VidHlwZUVuYWJsZWQgJiYgIXN1YnR5cGVFeHBsaWNpdGx5RW5hYmxlZDsKICAgICB9CiAKQEAgLTEzNiwyNCArMjM0LDM1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrSWZTdWJ0eXBlQmVsb25nc1RvTGlzdChmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSwKICAgICAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcykgewotICAgICAgICBmb3IgKGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBpbXMgOiBzdWJ0eXBlcykgeworICAgICAgICByZXR1cm4gZ2V0U3VidHlwZUluZGV4SW5MaXN0KHN1YnR5cGUsIHN1YnR5cGVzKSAhPSBJTkRFWF9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFN1YnR5cGVJbmRleEluTGlzdChmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSwKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcykgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBzdWJ0eXBlcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RTdWJ0eXBlIGltcyA9IHN1YnR5cGVzLmdldChpbmRleCk7CiAgICAgICAgICAgICBpZiAoaW1zLmVxdWFscyhzdWJ0eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBJTkRFWF9OT1RfRk9VTkQ7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY2hlY2tJZlN1YnR5cGVCZWxvbmdzVG9UaGlzSW1lKGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlKSB7Ci0gICAgICAgIGZpbmFsIElucHV0TWV0aG9kSW5mbyBteUltaSA9IG1JbnB1dE1ldGhvZEluZm9PZlRoaXNJbWU7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG15SW1pLmdldFN1YnR5cGVDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBpbXMgPSBteUltaS5nZXRTdWJ0eXBlQXQoaSk7CisgICAgICAgIHJldHVybiBnZXRTdWJ0eXBlSW5kZXhJbkltZShzdWJ0eXBlLCBtSW5wdXRNZXRob2RJbmZvT2ZUaGlzSW1lKSAhPSBJTkRFWF9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFN1YnR5cGVJbmRleEluSW1lKGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlLAorICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RJbmZvIGltaSkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpbWkuZ2V0U3VidHlwZUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RTdWJ0eXBlIGltcyA9IGltaS5nZXRTdWJ0eXBlQXQoaW5kZXgpOwogICAgICAgICAgICAgaWYgKGltcy5lcXVhbHMoc3VidHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gSU5ERVhfTk9UX0ZPVU5EOwogICAgIH0KIAogICAgIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGUgZ2V0Q3VycmVudElucHV0TWV0aG9kU3VidHlwZSgKQEAgLTIwOSw4ICszMTgsNyBAQAogICAgICAgICBpZiAoZmlsdGVyZWRJbWlzQ291bnQgPiAxKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gc3VidHlwZXMgPQotICAgICAgICAgICAgICAgIG1JbW1XcmFwcGVyLm1JbW0uZ2V0RW5hYmxlZElucHV0TWV0aG9kU3VidHlwZUxpc3QobnVsbCwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcyA9IGdldE15RW5hYmxlZElucHV0TWV0aG9kU3VidHlwZUxpc3QodHJ1ZSk7CiAgICAgICAgIGludCBrZXlib2FyZENvdW50ID0gMDsKICAgICAgICAgLy8gaW1tLmdldEVuYWJsZWRJbnB1dE1ldGhvZFN1YnR5cGVMaXN0KG51bGwsIHRydWUpIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IElNRSdzCiAgICAgICAgIC8vIGJvdGggZXhwbGljaXRseSBhbmQgaW1wbGljaXRseSBlbmFibGVkIGlucHV0IG1ldGhvZCBzdWJ0eXBlLgpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2Vla0JhckRpYWxvZ1ByZWZlcmVuY2UuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NlZWtCYXJEaWFsb2dQcmVmZXJlbmNlLmphdmEKaW5kZXggOTgxOWEwMi4uN2M0MTU2YyAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2Vla0JhckRpYWxvZ1ByZWZlcmVuY2UuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZWVrQmFyRGlhbG9nUHJlZmVyZW5jZS5qYXZhCkBAIC01OSw3ICs1OSw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2UoZmluYWwgVmFsdWVQcm94eSBwcm94eSkgewogICAgICAgICBtVmFsdWVQcm94eSA9IHByb3h5OwotICAgICAgICBzZXRTdW1tYXJ5KGdldFZhbHVlVGV4dChwcm94eS5yZWFkVmFsdWUoZ2V0S2V5KCkpKSk7CisgICAgICAgIHNldFN1bW1hcnkoZ2V0VmFsdWVUZXh0KGNsaXBWYWx1ZShwcm94eS5yZWFkVmFsdWUoZ2V0S2V5KCkpKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldFZhbHVlVGV4dChmaW5hbCBpbnQgdmFsdWUpIHsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5ncy5qYXZhCmluZGV4IDcyZTA4NzAuLjlmZWZiNTggMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3MuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUE9QVVBfT04gPSAicG9wdXBfb24iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVk9JQ0VfTU9ERSA9ICJ2b2ljZV9tb2RlIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NPUlJFQ1RJT05fU0VUVElOR1MgPSAiY29ycmVjdGlvbl9zZXR0aW5ncyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FRElUX1BFUlNPTkFMX0RJQ1RJT05BUlkgPSAiZWRpdF9wZXJzb25hbF9kaWN0aW9uYXJ5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NPTkZJR1VSRV9ESUNUSU9OQVJJRVNfS0VZID0gImNvbmZpZ3VyZV9kaWN0aW9uYXJpZXNfa2V5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fQ09SUkVDVElPTl9USFJFU0hPTEQgPSAiYXV0b19jb3JyZWN0aW9uX3RocmVzaG9sZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TSE9XX1NVR0dFU1RJT05TX1NFVFRJTkcgPSAic2hvd19zdWdnZXN0aW9uc19zZXR0aW5nIjsKQEAgLTQ2LDYgKzQ3LDggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0tFWV9VU0VfQ09OVEFDVFNfRElDVCA9ICJwcmVmX2tleV91c2VfY29udGFjdHNfZGljdCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9LRVlfVVNFX0RPVUJMRV9TUEFDRV9QRVJJT0QgPQogICAgICAgICAgICAgInByZWZfa2V5X3VzZV9kb3VibGVfc3BhY2VfcGVyaW9kIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0JMT0NLX1BPVEVOVElBTExZX09GRkVOU0lWRSA9CisgICAgICAgICAgICAicHJlZl9rZXlfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NIT1dfTEFOR1VBR0VfU1dJVENIX0tFWSA9CiAgICAgICAgICAgICAicHJlZl9zaG93X2xhbmd1YWdlX3N3aXRjaF9rZXkiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5DTFVERV9PVEhFUl9JTUVTX0lOX0xBTkdVQUdFX1NXSVRDSF9MSVNUID0KQEAgLTc4LDYgKzgxLDcgQEAKICAgICAgICAgICAgICJwcmVmX3N1cHByZXNzX2xhbmd1YWdlX3N3aXRjaF9rZXkiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TRU5EX0ZFRURCQUNLID0gInNlbmRfZmVlZGJhY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQUJPVVRfS0VZQk9BUkQgPSAiYWJvdXRfa2V5Ym9hcmQiOwogCiAgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKICAgICBwcml2YXRlIFNoYXJlZFByZWZlcmVuY2VzIG1QcmVmczsKQEAgLTE0Miw2ICsxNDYsMTAgQEAKICAgICAgICAgcmV0dXJuIG1DdXJyZW50TG9jYWxlOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGdldEJsb2NrUG90ZW50aWFsbHlPZmZlbnNpdmUoKSB7CisgICAgICAgIHJldHVybiBtU2V0dGluZ3NWYWx1ZXMubUJsb2NrUG90ZW50aWFsbHlPZmZlbnNpdmU7CisgICAgfQorCiAgICAgLy8gQWNjZXNzZWQgZnJvbSB0aGUgc2V0dGluZ3MgaW50ZXJmYWNlLCBoZW5jZSBwdWJsaWMKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVhZEtleXByZXNzU291bmRFbmFibGVkKGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzLAogICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcykgewpAQCAtMTYzLDYgKzE3MSwxMiBAQAogICAgICAgICByZXR1cm4gIWN1cnJlbnRBdXRvQ29ycmVjdGlvblNldHRpbmcuZXF1YWxzKGF1dG9Db3JyZWN0aW9uT2ZmKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVhZEJsb2NrUG90ZW50aWFsbHlPZmZlbnNpdmUoZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMsCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIHJldHVybiBwcmVmcy5nZXRCb29sZWFuKFNldHRpbmdzLlBSRUZfQkxPQ0tfUE9URU5USUFMTFlfT0ZGRU5TSVZFLAorICAgICAgICAgICAgICAgIHJlcy5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfYmxvY2tfcG90ZW50aWFsbHlfb2ZmZW5zaXZlKSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlYWRGcm9tQnVpbGRDb25maWdJZkdlc3R1cmVJbnB1dEVuYWJsZWQoZmluYWwgUmVzb3VyY2VzIHJlcykgewogICAgICAgICByZXR1cm4gcmVzLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19nZXN0dXJlX2lucHV0X2VuYWJsZWRfYnlfYnVpbGRfY29uZmlnKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc0ZyYWdtZW50LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc0ZyYWdtZW50LmphdmEKaW5kZXggYTk2Yzk5Ny4uODM1ZWY3YiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NGcmFnbWVudC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzRnJhZ21lbnQuamF2YQpAQCAtMTYsMTAgKzE2LDEzIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW47CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtMzEsMTMgKzM0LDE5IEBACiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW47CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZTsKIAoraW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVNldHRpbmdzQWN0aXZpdHk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGVmaW5lLlByb2R1Y3Rpb25GbGFnOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnNldHVwLkxhdW5jaGVySWNvblZpc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnVzZXJkaWN0aW9uYXJ5LlVzZXJEaWN0aW9uYXJ5TGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi51c2VyZGljdGlvbmFyeS5Vc2VyRGljdGlvbmFyeVNldHRpbmdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kY29tbW9uLklucHV0TWV0aG9kU2V0dGluZ3NGcmFnbWVudDsKIAogcHVibGljIGZpbmFsIGNsYXNzIFNldHRpbmdzRnJhZ21lbnQgZXh0ZW5kcyBJbnB1dE1ldGhvZFNldHRpbmdzRnJhZ21lbnQKICAgICAgICAgaW1wbGVtZW50cyBTaGFyZWRQcmVmZXJlbmNlcy5PblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkdfVVNFX0lOVEVSTkFMX1VTRVJfRElDVElPTkFSWV9TRVRUSU5HUyA9IGZhbHNlOworCiAgICAgcHJpdmF0ZSBMaXN0UHJlZmVyZW5jZSBtVm9pY2VQcmVmZXJlbmNlOwogICAgIHByaXZhdGUgTGlzdFByZWZlcmVuY2UgbVNob3dDb3JyZWN0aW9uU3VnZ2VzdGlvbnNQcmVmZXJlbmNlOwogICAgIHByaXZhdGUgTGlzdFByZWZlcmVuY2UgbUF1dG9Db3JyZWN0aW9uVGhyZXNob2xkUHJlZmVyZW5jZTsKQEAgLTc3LDEwICs4NiwxMyBAQAogICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGdldEFjdGl2aXR5KCk7CiAKLSAgICAgICAgLy8gV2hlbiB3ZSBhcmUgY2FsbGVkIGZyb20gdGhlIFNldHRpbmdzIGFwcGxpY2F0aW9uIGJ1dCB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZywgdGhlCi0gICAgICAgIC8vIHtAbGluayBTdWJ0eXBlTG9jYWxlfSBjbGFzcyBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZC4gSXQgaXMgc2FmZSB0byBjYWxsCi0gICAgICAgIC8vIHtAbGluayBTdWJ0eXBlTG9jYWxlI2luaXQoQ29udGV4dCl9IG11bHRpcGxlIHRpbWVzLgorICAgICAgICAvLyBXaGVuIHdlIGFyZSBjYWxsZWQgZnJvbSB0aGUgU2V0dGluZ3MgYXBwbGljYXRpb24gYnV0IHdlIGFyZSBub3QgYWxyZWFkeSBydW5uaW5nLCBzb21lCisgICAgICAgIC8vIHNpbmdsZXRvbiBhbmQgdXRpbGl0eSBjbGFzc2VzIG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkLiAgV2UgaGF2ZSB0byBjYWxsCisgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIG1ldGhvZCBvZiB0aGVzZSBjbGFzc2VzIGhlcmUuIFNlZSB7QGxpbmsgTGF0aW5JTUUjb25DcmVhdGUoKX0uCisgICAgICAgIFN1YnR5cGVTd2l0Y2hlci5pbml0KGNvbnRleHQpOwogICAgICAgICBTdWJ0eXBlTG9jYWxlLmluaXQoY29udGV4dCk7CisgICAgICAgIEF1ZGlvQW5kSGFwdGljRmVlZGJhY2tNYW5hZ2VyLmluaXQoY29udGV4dCk7CisKICAgICAgICAgbVZvaWNlUHJlZmVyZW5jZSA9IChMaXN0UHJlZmVyZW5jZSkgZmluZFByZWZlcmVuY2UoU2V0dGluZ3MuUFJFRl9WT0lDRV9NT0RFKTsKICAgICAgICAgbVNob3dDb3JyZWN0aW9uU3VnZ2VzdGlvbnNQcmVmZXJlbmNlID0KICAgICAgICAgICAgICAgICAoTGlzdFByZWZlcmVuY2UpIGZpbmRQcmVmZXJlbmNlKFNldHRpbmdzLlBSRUZfU0hPV19TVUdHRVNUSU9OU19TRVRUSU5HKTsKQEAgLTExMCw2ICsxMjIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZSBmZWVkYmFja1NldHRpbmdzID0gZmluZFByZWZlcmVuY2UoU2V0dGluZ3MuUFJFRl9TRU5EX0ZFRURCQUNLKTsKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZSBhYm91dFNldHRpbmdzID0gZmluZFByZWZlcmVuY2UoU2V0dGluZ3MuUFJFRl9BQk9VVF9LRVlCT0FSRCk7CiAgICAgICAgIGlmIChmZWVkYmFja1NldHRpbmdzICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChGZWVkYmFja1V0aWxzLmlzRmVlZGJhY2tGb3JtU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBmZWVkYmFja1NldHRpbmdzLnNldE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIobmV3IE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIoKSB7CkBAIC0xMTksOCArMTMyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGFib3V0U2V0dGluZ3Muc2V0VGl0bGUoRmVlZGJhY2tVdGlscy5nZXRBYm91dEtleWJvYXJkVGl0bGVSZXNJZCgpKTsKKyAgICAgICAgICAgICAgICBhYm91dFNldHRpbmdzLnNldEludGVudChGZWVkYmFja1V0aWxzLmdldEFib3V0S2V5Ym9hcmRJbnRlbnQoZ2V0QWN0aXZpdHkoKSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtaXNjU2V0dGluZ3MucmVtb3ZlUHJlZmVyZW5jZShmZWVkYmFja1NldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBtaXNjU2V0dGluZ3MucmVtb3ZlUHJlZmVyZW5jZShhYm91dFNldHRpbmdzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xODAsNiArMTk2LDE1IEBACiAgICAgICAgICAgICB0ZXh0Q29ycmVjdGlvbkdyb3VwLnJlbW92ZVByZWZlcmVuY2UoZGljdGlvbmFyeUxpbmspOwogICAgICAgICB9CiAKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZSBlZGl0UGVyc29uYWxEaWN0aW9uYXJ5ID0KKyAgICAgICAgICAgICAgICBmaW5kUHJlZmVyZW5jZShTZXR0aW5ncy5QUkVGX0VESVRfUEVSU09OQUxfRElDVElPTkFSWSk7CisgICAgICAgIGZpbmFsIEludGVudCBlZGl0UGVyc29uYWxEaWN0aW9uYXJ5SW50ZW50ID0gZWRpdFBlcnNvbmFsRGljdGlvbmFyeS5nZXRJbnRlbnQoKTsKKyAgICAgICAgZmluYWwgUmVzb2x2ZUluZm8gcmkgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkucmVzb2x2ZUFjdGl2aXR5KAorICAgICAgICAgICAgICAgIGVkaXRQZXJzb25hbERpY3Rpb25hcnlJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLk1BVENIX0RFRkFVTFRfT05MWSk7CisgICAgICAgIGlmIChEQkdfVVNFX0lOVEVSTkFMX1VTRVJfRElDVElPTkFSWV9TRVRUSU5HUyB8fCByaSA9PSBudWxsKSB7CisgICAgICAgICAgICB1cGRhdGVVc2VyRGljdGlvbmFyeVByZWZlcmVuY2UoZWRpdFBlcnNvbmFsRGljdGlvbmFyeSk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIVNldHRpbmdzLnJlYWRGcm9tQnVpbGRDb25maWdJZkdlc3R1cmVJbnB1dEVuYWJsZWQocmVzKSkgewogICAgICAgICAgICAgcmVtb3ZlUHJlZmVyZW5jZShTZXR0aW5ncy5QUkVGX0dFU1RVUkVfU0VUVElOR1MsIGdldFByZWZlcmVuY2VTY3JlZW4oKSk7CiAgICAgICAgIH0KQEAgLTM4Niw0ICs0MTEsMjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVVzZXJEaWN0aW9uYXJ5UHJlZmVyZW5jZShQcmVmZXJlbmNlIHVzZXJEaWN0aW9uYXJ5UHJlZmVyZW5jZSkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8U3RyaW5nPiBsb2NhbGVMaXN0ID0gVXNlckRpY3Rpb25hcnlMaXN0LmdldFVzZXJEaWN0aW9uYXJ5TG9jYWxlc1NldChhY3Rpdml0eSk7CisgICAgICAgIGlmIChudWxsID09IGxvY2FsZUxpc3QpIHsKKyAgICAgICAgICAgIC8vIFRoZSBsb2NhbGUgbGlzdCBpcyBudWxsIGlmIGFuZCBvbmx5IGlmIHRoZSB1c2VyIGRpY3Rpb25hcnkgc2VydmljZSBpcworICAgICAgICAgICAgLy8gbm90IHByZXNlbnQgb3IgZGlzYWJsZWQuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcHJlZmVyZW5jZS4KKyAgICAgICAgICAgIGdldFByZWZlcmVuY2VTY3JlZW4oKS5yZW1vdmVQcmVmZXJlbmNlKHVzZXJEaWN0aW9uYXJ5UHJlZmVyZW5jZSk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlTGlzdC5zaXplKCkgPD0gMSkgeworICAgICAgICAgICAgdXNlckRpY3Rpb25hcnlQcmVmZXJlbmNlLnNldEZyYWdtZW50KFVzZXJEaWN0aW9uYXJ5U2V0dGluZ3MuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBzaXplIG9mIGxvY2FsZUxpc3QgaXMgMCwgd2UgZG9uJ3Qgc2V0IHRoZSBsb2NhbGUgcGFyYW1ldGVyIGluIHRoZQorICAgICAgICAgICAgLy8gZXh0cmFzLiBUaGlzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIFVzZXJEaWN0aW9uYXJ5U2V0dGluZ3MgY2xhc3MgYXMKKyAgICAgICAgICAgIC8vIG1lYW5pbmcgInRoZSBjdXJyZW50IGxvY2FsZSIuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2l0aCB0aGUgY3VycmVudCBjb2RlIGZvciBVc2VyRGljdGlvbmFyeUxpc3QjZ2V0VXNlckRpY3Rpb25hcnlMb2NhbGVzU2V0KCkKKyAgICAgICAgICAgIC8vIHRoZSBsb2NhbGUgbGlzdCBhbHdheXMgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBzaW5jZSBpdCBhbHdheXMgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIC8vIGxvY2FsZSBleHBsaWNpdGx5LiBAc2VlIFVzZXJEaWN0aW9uYXJ5TGlzdC5nZXRVc2VyRGljdGlvbmFyeUxvY2FsZXNTZXQoKS4KKyAgICAgICAgICAgIGlmIChsb2NhbGVMaXN0LnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZSA9IChTdHJpbmcpbG9jYWxlTGlzdC50b0FycmF5KClbMF07CisgICAgICAgICAgICAgICAgdXNlckRpY3Rpb25hcnlQcmVmZXJlbmNlLmdldEV4dHJhcygpLnB1dFN0cmluZygibG9jYWxlIiwgbG9jYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZXJEaWN0aW9uYXJ5UHJlZmVyZW5jZS5zZXRGcmFnbWVudChVc2VyRGljdGlvbmFyeUxpc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzVmFsdWVzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc1ZhbHVlcy5qYXZhCmluZGV4IGY3N2E5MjguLjYxNWIyZGYgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzVmFsdWVzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NWYWx1ZXMuamF2YQpAQCAtMzQsNiArMzQsOSBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2V0dGluZ3NWYWx1ZXMgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBTZXR0aW5nc1ZhbHVlcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgLy8gImZsb2F0TmVnYXRpdmVJbmZpbml0eSIgaXMgYSBzcGVjaWFsIG1hcmtlciBzdHJpbmcgZm9yIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRFCisgICAgLy8gY3VycmVudGx5IHVzZWQgZm9yIGF1dG8tY29ycmVjdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9ORUdBVElWRV9JTkZJTklUWV9NQVJLRVJfU1RSSU5HID0gImZsb2F0TmVnYXRpdmVJbmZpbml0eSI7CiAKICAgICAvLyBGcm9tIHJlc291cmNlczoKICAgICBwdWJsaWMgZmluYWwgaW50IG1EZWxheVVwZGF0ZU9sZFN1Z2dlc3Rpb25zOwpAQCAtNTQsNiArNTcsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIG1TaG93c0xhbmd1YWdlU3dpdGNoS2V5OwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIG1Vc2VDb250YWN0c0RpY3Q7CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbVVzZURvdWJsZVNwYWNlUGVyaW9kOworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIG1CbG9ja1BvdGVudGlhbGx5T2ZmZW5zaXZlOwogICAgIC8vIFVzZSBiaWdyYW1zIHRvIHByZWRpY3QgdGhlIG5leHQgd29yZCB3aGVuIHRoZXJlIGlzIG5vIGlucHV0IGZvciBpdCB5ZXQKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBtQmlncmFtUHJlZGljdGlvbkVuYWJsZWQ7CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbUdlc3R1cmVJbnB1dEVuYWJsZWQ7CkBAIC0xMjMsNiArMTI3LDcgQEAKICAgICAgICAgbVNob3dzTGFuZ3VhZ2VTd2l0Y2hLZXkgPSBTZXR0aW5ncy5yZWFkU2hvd3NMYW5ndWFnZVN3aXRjaEtleShwcmVmcyk7CiAgICAgICAgIG1Vc2VDb250YWN0c0RpY3QgPSBwcmVmcy5nZXRCb29sZWFuKFNldHRpbmdzLlBSRUZfS0VZX1VTRV9DT05UQUNUU19ESUNULCB0cnVlKTsKICAgICAgICAgbVVzZURvdWJsZVNwYWNlUGVyaW9kID0gcHJlZnMuZ2V0Qm9vbGVhbihTZXR0aW5ncy5QUkVGX0tFWV9VU0VfRE9VQkxFX1NQQUNFX1BFUklPRCwgdHJ1ZSk7CisgICAgICAgIG1CbG9ja1BvdGVudGlhbGx5T2ZmZW5zaXZlID0gU2V0dGluZ3MucmVhZEJsb2NrUG90ZW50aWFsbHlPZmZlbnNpdmUocHJlZnMsIHJlcyk7CiAgICAgICAgIG1BdXRvQ29ycmVjdEVuYWJsZWQgPSBTZXR0aW5ncy5yZWFkQXV0b0NvcnJlY3RFbmFibGVkKGF1dG9Db3JyZWN0aW9uVGhyZXNob2xkUmF3VmFsdWUsIHJlcyk7CiAgICAgICAgIG1CaWdyYW1QcmVkaWN0aW9uRW5hYmxlZCA9IHJlYWRCaWdyYW1QcmVkaWN0aW9uRW5hYmxlZChwcmVmcywgcmVzKTsKIApAQCAtMjY2LDggKzI3MSwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgaW50IGFycmF5SW5kZXggPSBJbnRlZ2VyLnZhbHVlT2YoY3VycmVudEF1dG9Db3JyZWN0aW9uU2V0dGluZyk7CiAgICAgICAgICAgICBpZiAoYXJyYXlJbmRleCA+PSAwICYmIGFycmF5SW5kZXggPCBhdXRvQ29ycmVjdGlvblRocmVzaG9sZFZhbHVlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBhdXRvQ29ycmVjdGlvblRocmVzaG9sZCA9IEZsb2F0LnBhcnNlRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvQ29ycmVjdGlvblRocmVzaG9sZFZhbHVlc1thcnJheUluZGV4XSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IGF1dG9Db3JyZWN0aW9uVGhyZXNob2xkVmFsdWVzW2FycmF5SW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChGTE9BVF9ORUdBVElWRV9JTkZJTklUWV9NQVJLRVJfU1RSSU5HLmVxdWFscyh2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG9Db3JyZWN0aW9uVGhyZXNob2xkID0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0b0NvcnJlY3Rpb25UaHJlc2hvbGQgPSBGbG9hdC5wYXJzZUZsb2F0KHZhbCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gV2hlbmV2ZXIgdGhlIHRocmVzaG9sZCBzZXR0aW5ncyBhcmUgY29ycmVjdCwgbmV2ZXIgY29tZSBoZXJlLgpAQCAtMjc1LDcgKzI4NCw3IEBACiAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgbG9hZCBhdXRvIGNvcnJlY3Rpb24gdGhyZXNob2xkIHNldHRpbmcuIgogICAgICAgICAgICAgICAgICAgICArICIgY3VycmVudEF1dG9Db3JyZWN0aW9uU2V0dGluZzogIiArIGN1cnJlbnRBdXRvQ29ycmVjdGlvblNldHRpbmcKICAgICAgICAgICAgICAgICAgICAgKyAiLCBhdXRvQ29ycmVjdGlvblRocmVzaG9sZFZhbHVlczogIgotICAgICAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhhdXRvQ29ycmVjdGlvblRocmVzaG9sZFZhbHVlcykpOworICAgICAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhhdXRvQ29ycmVjdGlvblRocmVzaG9sZFZhbHVlcyksIGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhdXRvQ29ycmVjdGlvblRocmVzaG9sZDsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdHJpbmdVdGlscy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3RyaW5nVXRpbHMuamF2YQppbmRleCBkNWVlNThhLi5hYjA1MGQ3IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdHJpbmdVdGlscy5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N0cmluZ1V0aWxzLmphdmEKQEAgLTY1LDIzICs2NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZCBhIHN0cmluZyB0aGF0IHN0YXJ0IHdpdGggc3BlY2lmaWVkIHByZWZpeCBmcm9tIGFuIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeCBhIHByZWZpeCBzdHJpbmcgdG8gZmluZC4KLSAgICAgKiBAcGFyYW0gYXJyYXkgYW4gc3RyaW5nIGFycmF5IHRvIGJlIHNlYXJjaGVkLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3QgcGFydCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggdGhlIHByZWZpeC4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgaXQgY291bGRuJ3QgYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFByZWZpeGVkU3RyaW5nKGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIFN0cmluZ1tdIGFycmF5KSB7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGVsZW1lbnQgOiBhcnJheSkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBhbHdheXMga2VlcCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbGwgc3RyaW5ncyBhdCB0aGVpciBwb3NpdGlvbgpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3VidHlwZVN3aXRjaGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdWJ0eXBlU3dpdGNoZXIuamF2YQppbmRleCAyZjllMzRmLi4yODJiNTc5IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdWJ0eXBlU3dpdGNoZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdWJ0eXBlU3dpdGNoZXIuamF2YQpAQCAtODAsNiArODAsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIFN1YnR5cGVMb2NhbGUuaW5pdChjb250ZXh0KTsKKyAgICAgICAgUmljaElucHV0TWV0aG9kTWFuYWdlci5pbml0KGNvbnRleHQpOwogICAgICAgICBzSW5zdGFuY2UuaW5pdGlhbGl6ZShjb250ZXh0KTsKICAgICB9CiAKQEAgLTg3LDEwICs4OCwxMyBAQAogICAgICAgICAvLyBJbnRlbnRpb25hbCBlbXB0eSBjb25zdHJ1Y3RvciBmb3Igc2luZ2xldG9uLgogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKGZpbmFsIENvbnRleHQgc2VydmljZSkgewotICAgICAgICBtUmVzb3VyY2VzID0gc2VydmljZS5nZXRSZXNvdXJjZXMoKTsKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKG1SZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwogICAgICAgICBtUmljaEltbSA9IFJpY2hJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIgPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikgc2VydmljZS5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCiAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIG1Ob0xhbmd1YWdlU3VidHlwZSA9IG1SaWNoSW1tLmZpbmRTdWJ0eXBlQnlMb2NhbGVBbmRLZXlib2FyZExheW91dFNldCgKICAgICAgICAgICAgICAgICBTdWJ0eXBlTG9jYWxlLk5PX0xBTkdVQUdFLCBTdWJ0eXBlTG9jYWxlLlFXRVJUWSk7CkBAIC0xMTEsNyArMTE1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQYXJhbWV0ZXJzT25TdGFydElucHV0VmlldygpIHsKICAgICAgICAgZmluYWwgTGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+IGVuYWJsZWRTdWJ0eXBlc09mVGhpc0ltZSA9Ci0gICAgICAgICAgICAgICAgbVJpY2hJbW0uZ2V0SW5wdXRNZXRob2RNYW5hZ2VyKCkuZ2V0RW5hYmxlZElucHV0TWV0aG9kU3VidHlwZUxpc3QobnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVJpY2hJbW0uZ2V0TXlFbmFibGVkSW5wdXRNZXRob2RTdWJ0eXBlTGlzdCh0cnVlKTsKICAgICAgICAgbU5lZWRzVG9EaXNwbGF5TGFuZ3VhZ2UudXBkYXRlRW5hYmxlZFN1YnR5cGVDb3VudChlbmFibGVkU3VidHlwZXNPZlRoaXNJbWUuc2l6ZSgpKTsKICAgICAgICAgdXBkYXRlU2hvcnRjdXRJTUUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdWdnZXN0LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdWdnZXN0LmphdmEKaW5kZXggNTlkMDIwNy4uZGM5YmVmMiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3VnZ2VzdC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N1Z2dlc3QuamF2YQpAQCAtMTc0LDIxICsxNzQsMjIgQEAKIAogICAgIHB1YmxpYyBTdWdnZXN0ZWRXb3JkcyBnZXRTdWdnZXN0ZWRXb3JkcyhmaW5hbCBXb3JkQ29tcG9zZXIgd29yZENvbXBvc2VyLAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkRm9yQmlncmFtLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8sCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ycmVjdGlvbkVuYWJsZWQsIGZpbmFsIGludCBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmxvY2tPZmZlbnNpdmVXb3JkcywgZmluYWwgYm9vbGVhbiBpc0NvcnJlY3Rpb25FbmFibGVkLAorICAgICAgICAgICAgZmluYWwgaW50IHNlc3Npb25JZCkgewogICAgICAgICBMYXRpbkltZUxvZ2dlci5vblN0YXJ0U3VnZ2VzdGlvbihwcmV2V29yZEZvckJpZ3JhbSk7CiAgICAgICAgIGlmICh3b3JkQ29tcG9zZXIuaXNCYXRjaE1vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFN1Z2dlc3RlZFdvcmRzRm9yQmF0Y2hJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgd29yZENvbXBvc2VyLCBwcmV2V29yZEZvckJpZ3JhbSwgcHJveGltaXR5SW5mbywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgd29yZENvbXBvc2VyLCBwcmV2V29yZEZvckJpZ3JhbSwgcHJveGltaXR5SW5mbywgYmxvY2tPZmZlbnNpdmVXb3Jkcywgc2Vzc2lvbklkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBnZXRTdWdnZXN0ZWRXb3Jkc0ZvclR5cGluZ0lucHV0KHdvcmRDb21wb3NlciwgcHJldldvcmRGb3JCaWdyYW0sIHByb3hpbWl0eUluZm8sCi0gICAgICAgICAgICAgICAgICAgIGlzQ29ycmVjdGlvbkVuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBibG9ja09mZmVuc2l2ZVdvcmRzLCBpc0NvcnJlY3Rpb25FbmFibGVkKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFJldHJpZXZlcyBzdWdnZXN0aW9ucyBmb3IgdGhlIHR5cGluZyBpbnB1dC4KICAgICBwcml2YXRlIFN1Z2dlc3RlZFdvcmRzIGdldFN1Z2dlc3RlZFdvcmRzRm9yVHlwaW5nSW5wdXQoZmluYWwgV29yZENvbXBvc2VyIHdvcmRDb21wb3NlciwKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZEZvckJpZ3JhbSwgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0NvcnJlY3Rpb25FbmFibGVkKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrT2ZmZW5zaXZlV29yZHMsIGZpbmFsIGJvb2xlYW4gaXNDb3JyZWN0aW9uRW5hYmxlZCkgewogICAgICAgICBmaW5hbCBpbnQgdHJhaWxpbmdTaW5nbGVRdW90ZXNDb3VudCA9IHdvcmRDb21wb3Nlci50cmFpbGluZ1NpbmdsZVF1b3Rlc0NvdW50KCk7CiAgICAgICAgIGZpbmFsIEJvdW5kZWRUcmVlU2V0IHN1Z2dlc3Rpb25zU2V0ID0gbmV3IEJvdW5kZWRUcmVlU2V0KHNTdWdnZXN0ZWRXb3JkSW5mb0NvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgTUFYX1NVR0dFU1RJT05TKTsKQEAgLTIxMiw3ICsyMTMsNyBAQAogICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBrZXkgOiBtRGljdGlvbmFyaWVzLmtleVNldCgpKSB7CiAgICAgICAgICAgICBmaW5hbCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBtRGljdGlvbmFyaWVzLmdldChrZXkpOwogICAgICAgICAgICAgc3VnZ2VzdGlvbnNTZXQuYWRkQWxsKGRpY3Rpb25hcnkuZ2V0U3VnZ2VzdGlvbnMoCi0gICAgICAgICAgICAgICAgICAgIHdvcmRDb21wb3NlckZvckxvb2t1cCwgcHJldldvcmRGb3JCaWdyYW0sIHByb3hpbWl0eUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yZENvbXBvc2VyRm9yTG9va3VwLCBwcmV2V29yZEZvckJpZ3JhbSwgcHJveGltaXR5SW5mbywgYmxvY2tPZmZlbnNpdmVXb3JkcykpOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgU3RyaW5nIHdoaXRlbGlzdGVkV29yZDsKQEAgLTMwMSw3ICszMDIsNyBAQAogICAgIC8vIFJldHJpZXZlcyBzdWdnZXN0aW9ucyBmb3IgdGhlIGJhdGNoIGlucHV0LgogICAgIHByaXZhdGUgU3VnZ2VzdGVkV29yZHMgZ2V0U3VnZ2VzdGVkV29yZHNGb3JCYXRjaElucHV0KGZpbmFsIFdvcmRDb21wb3NlciB3b3JkQ29tcG9zZXIsCiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmRGb3JCaWdyYW0sIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbywKLSAgICAgICAgICAgIGZpbmFsIGludCBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmxvY2tPZmZlbnNpdmVXb3JkcywgZmluYWwgaW50IHNlc3Npb25JZCkgewogICAgICAgICBmaW5hbCBCb3VuZGVkVHJlZVNldCBzdWdnZXN0aW9uc1NldCA9IG5ldyBCb3VuZGVkVHJlZVNldChzU3VnZ2VzdGVkV29yZEluZm9Db21wYXJhdG9yLAogICAgICAgICAgICAgICAgIE1BWF9TVUdHRVNUSU9OUyk7CiAKQEAgLTMxNCw4ICszMTUsOCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgRGljdGlvbmFyeSBkaWN0aW9uYXJ5ID0gbURpY3Rpb25hcmllcy5nZXQoa2V5KTsKLSAgICAgICAgICAgIHN1Z2dlc3Rpb25zU2V0LmFkZEFsbChkaWN0aW9uYXJ5LmdldFN1Z2dlc3Rpb25zV2l0aFNlc3Npb25JZCgKLSAgICAgICAgICAgICAgICAgICAgd29yZENvbXBvc2VyLCBwcmV2V29yZEZvckJpZ3JhbSwgcHJveGltaXR5SW5mbywgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICBzdWdnZXN0aW9uc1NldC5hZGRBbGwoZGljdGlvbmFyeS5nZXRTdWdnZXN0aW9uc1dpdGhTZXNzaW9uSWQod29yZENvbXBvc2VyLAorICAgICAgICAgICAgICAgICAgICBwcmV2V29yZEZvckJpZ3JhbSwgcHJveGltaXR5SW5mbywgYmxvY2tPZmZlbnNpdmVXb3Jkcywgc2Vzc2lvbklkKSk7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKFN1Z2dlc3RlZFdvcmRJbmZvIHdvcmRJbmZvIDogc3VnZ2VzdGlvbnNTZXQpIHsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N1Z2dlc3RlZFdvcmRzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdWdnZXN0ZWRXb3Jkcy5qYXZhCmluZGV4IDYxNmUxOTEuLmRmZGRiMGYgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N1Z2dlc3RlZFdvcmRzLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3VnZ2VzdGVkV29yZHMuamF2YQpAQCAtMTIyLDYgKzEyMiw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN1Z2dlc3RlZFdvcmRJbmZvIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NDT1JFID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfTUFTS19LSU5EID0gMHhGRjsgLy8gTWFzayB0byBnZXQgb25seSB0aGUga2luZAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1RZUEVEID0gMDsgLy8gV2hhdCB1c2VyIHR5cGVkCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfQ09SUkVDVElPTiA9IDE7IC8vIFNpbXBsZSBjb3JyZWN0aW9uL3N1Z2dlc3Rpb24KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9DT01QTEVUSU9OID0gMjsgLy8gQ29tcGxldGlvbiAoc3VnZ2VzdGlvbiB3aXRoIGFwcGVuZGVkIGNoYXJzKQpAQCAtMTMyLDYgKzEzMywxMSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1NIT1JUQ1VUID0gNzsgLy8gQSBzaG9ydGN1dAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1BSRURJQ1RJT04gPSA4OyAvLyBBIHByZWRpY3Rpb24gKD09IGEgc3VnZ2VzdGlvbiB3aXRoIG5vIGlucHV0KQogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1JFU1VNRUQgPSA5OyAvLyBBIHJlc3VtZWQgc3VnZ2VzdGlvbiAoY29tZXMgZnJvbSBhIHNwYW4pCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9NQVNLX0ZMQUdTID0gMHhGRkZGRkYwMDsgLy8gTWFzayB0byBnZXQgdGhlIGZsYWdzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfRkxBR19QT1NTSUJMWV9PRkZFTlNJVkUgPSAweDgwMDAwMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX0ZMQUdfRVhBQ1RfTUFUQ0ggPSAweDQwMDAwMDAwOworCiAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVdvcmQ7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVNjb3JlOwogICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1LaW5kOyAvLyBvbmUgb2YgdGhlIEtJTkRfKiBjb25zdGFudHMgYWJvdmUKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N5bmNocm9ub3VzbHlMb2FkZWRDb250YWN0c0JpbmFyeURpY3Rpb25hcnkuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N5bmNocm9ub3VzbHlMb2FkZWRDb250YWN0c0JpbmFyeURpY3Rpb25hcnkuamF2YQppbmRleCBlYzRkYzE0Li45MmY5NmMwIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TeW5jaHJvbm91c2x5TG9hZGVkQ29udGFjdHNCaW5hcnlEaWN0aW9uYXJ5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3luY2hyb25vdXNseUxvYWRlZENvbnRhY3RzQmluYXJ5RGljdGlvbmFyeS5qYXZhCkBAIC0zMyw5ICszMywxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IGdldFN1Z2dlc3Rpb25zKGZpbmFsIFdvcmRDb21wb3NlciBjb2RlcywKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZEZvckJpZ3JhbXMsIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkRm9yQmlncmFtcywgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBibG9ja09mZmVuc2l2ZVdvcmRzKSB7CiAgICAgICAgIHN5bmNSZWxvYWREaWN0aW9uYXJ5SWZSZXF1aXJlZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VnZ2VzdGlvbnMoY29kZXMsIHByZXZXb3JkRm9yQmlncmFtcywgcHJveGltaXR5SW5mbyk7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRTdWdnZXN0aW9ucyhjb2RlcywgcHJldldvcmRGb3JCaWdyYW1zLCBwcm94aW1pdHlJbmZvLCBibG9ja09mZmVuc2l2ZVdvcmRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N5bmNocm9ub3VzbHlMb2FkZWRVc2VyQmluYXJ5RGljdGlvbmFyeS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3luY2hyb25vdXNseUxvYWRlZFVzZXJCaW5hcnlEaWN0aW9uYXJ5LmphdmEKaW5kZXggNGJkYWYyMC4uMzNmZTg5NiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3luY2hyb25vdXNseUxvYWRlZFVzZXJCaW5hcnlEaWN0aW9uYXJ5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3luY2hyb25vdXNseUxvYWRlZFVzZXJCaW5hcnlEaWN0aW9uYXJ5LmphdmEKQEAgLTM2LDkgKzM2LDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEFycmF5TGlzdDxTdWdnZXN0ZWRXb3JkSW5mbz4gZ2V0U3VnZ2VzdGlvbnMoZmluYWwgV29yZENvbXBvc2VyIGNvZGVzLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkRm9yQmlncmFtcywgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmRGb3JCaWdyYW1zLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8sCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrT2ZmZW5zaXZlV29yZHMpIHsKICAgICAgICAgc3luY1JlbG9hZERpY3Rpb25hcnlJZlJlcXVpcmVkKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdWdnZXN0aW9ucyhjb2RlcywgcHJldldvcmRGb3JCaWdyYW1zLCBwcm94aW1pdHlJbmZvKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1Z2dlc3Rpb25zKGNvZGVzLCBwcmV2V29yZEZvckJpZ3JhbXMsIHByb3hpbWl0eUluZm8sIGJsb2NrT2ZmZW5zaXZlV29yZHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vVXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1V0aWxzLmphdmEKaW5kZXggYWZmNWQxNy4uMGY5NmM1NCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vVXRpbHMuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9VdGlscy5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2U7CkBAIC00NzMsNCArNDc0LDE4IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbk5hbWUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgUGFja2FnZUluZm8gaW5mbyA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlSW5mbyhwYWNrYWdlTmFtZSwgMCk7CisgICAgICAgICAgICByZXR1cm4gaW5mby52ZXJzaW9uTmFtZTsKKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBmaW5kIHZlcnNpb24gaW5mby4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vV29yZENvbXBvc2VyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9Xb3JkQ29tcG9zZXIuamF2YQppbmRleCA1MWJkOTAxLi5lMDc4ZjAzIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9Xb3JkQ29tcG9zZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9Xb3JkQ29tcG9zZXIuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuYW5ub3RhdGlvbnMuVXNlZEZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuS2V5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkOwogCkBAIC0yMTEsOSArMjEwLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcmV0cmlldmUgcmVhc29uYWJsZSBwcm94aW1pdHkgaW5mbyBmb3IgYSBjaGFyYWN0ZXIuCisgICAgICogQWRkIGEgZHVtbXkga2V5IGJ5IHJldHJpZXZpbmcgcmVhc29uYWJsZSBjb29yZGluYXRlcwogICAgICAqLwotICAgIEBVc2VkRm9yVGVzdGluZwogICAgIHB1YmxpYyB2b2lkIGFkZEtleUluZm8oZmluYWwgaW50IGNvZGVQb2ludCwgZmluYWwgS2V5Ym9hcmQga2V5Ym9hcmQpIHsKICAgICAgICAgZmluYWwgaW50IHgsIHk7CiAgICAgICAgIGZpbmFsIEtleSBrZXk7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9wZXJzb25hbGl6YXRpb24vQWNjb3VudFV0aWxzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9wZXJzb25hbGl6YXRpb24vQWNjb3VudFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2ODdlMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3BlcnNvbmFsaXphdGlvbi9BY2NvdW50VXRpbHMuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5wZXJzb25hbGl6YXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGF0dGVybnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQWNjb3VudFV0aWxzIHsKKyAgICBwcml2YXRlIEFjY291bnRVdGlscygpIHsKKyAgICAgICAgLy8gVGhpcyB1dGlsaXR5IGNsYXNzIGlzIG5vdCBwdWJsaWNseSBpbnN0YW50aWFibGUuCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjb3VudFtdIGdldEFjY291bnRzKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gQWNjb3VudE1hbmFnZXIuZ2V0KGNvbnRleHQpLmdldEFjY291bnRzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0RGV2aWNlQWNjb3VudHNFbWFpbEFkZHJlc3NlcyhmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gcmV0dmFsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoZmluYWwgQWNjb3VudCBhY2NvdW50IDogZ2V0QWNjb3VudHMoY29udGV4dCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYWNjb3VudC5uYW1lOworICAgICAgICAgICAgaWYgKFBhdHRlcm5zLkVNQUlMX0FERFJFU1MubWF0Y2hlcihuYW1lKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwuYWRkKG5hbWUpOworICAgICAgICAgICAgICAgIHJldHZhbC5hZGQobmFtZS5zcGxpdCgiQCIpWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NldHVwL1NldHVwQWN0aXZpdHkuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NldHVwL1NldHVwQWN0aXZpdHkuamF2YQppbmRleCAxNWQwYmFjLi44YTJkZTg4IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cEFjdGl2aXR5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc2V0dXAvU2V0dXBBY3Rpdml0eS5qYXZhCkBAIC0xOSwxNzIgKzE5LDI1IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5jb21wYXQuVGV4dFZpZXdDb21wYXRVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5jb21wYXQuVmlld0NvbXBhdFV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkNvbGxlY3Rpb25VdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlJpY2hJbnB1dE1ldGhvZE1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU2V0dGluZ3NBY3Rpdml0eTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5TdGF0aWNJbm5lckhhbmRsZXJXcmFwcGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBTZXR1cEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHByaXZhdGUgU2V0dXBTdGVwSW5kaWNhdG9yVmlldyBtU3RlcEluZGljYXRvclZpZXc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXR1cFN0ZXBHcm91cCBtU2V0dXBTdGVwcyA9IG5ldyBTZXR1cFN0ZXBHcm91cCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TVEVQID0gInN0ZXAiOwotICAgIHByaXZhdGUgaW50IG1TdGVwTnVtYmVyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQXzEgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQXzIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQXzMgPSAzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXR0aW5nc1Bvb2xpbmdIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFNldHRpbmdzUG9vbGluZ0hhbmRsZXIodGhpcyk7Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgU2V0dGluZ3NQb29saW5nSGFuZGxlciBleHRlbmRzIFN0YXRpY0lubmVySGFuZGxlcldyYXBwZXI8U2V0dXBBY3Rpdml0eT4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BPTExJTkdfSU1FX1NFVFRJTkdTID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBJTUVfU0VUVElOR1NfUE9MTElOR19JTlRFUlZBTCA9IDIwMDsKLQotICAgICAgICBwdWJsaWMgU2V0dGluZ3NQb29saW5nSGFuZGxlcihmaW5hbCBTZXR1cEFjdGl2aXR5IG91dGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHN1cGVyKG91dGVySW5zdGFuY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoZmluYWwgTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGZpbmFsIFNldHVwQWN0aXZpdHkgc2V0dXBBY3Rpdml0eSA9IGdldE91dGVySW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXR1cEFjdGl2aXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIE1TR19QT0xMSU5HX0lNRV9TRVRUSU5HUzoKLSAgICAgICAgICAgICAgICBpZiAoU2V0dXBBY3Rpdml0eS5pc1RoaXNJbWVFbmFibGVkKHNldHVwQWN0aXZpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldHVwQWN0aXZpdHkuaW52b2tlU2V0dXBXaXphcmRPZlRoaXNJbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGFydFBvbGxpbmdJbWVTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRQb2xsaW5nSW1lU2V0dGluZ3MoKSB7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShNU0dfUE9MTElOR19JTUVfU0VUVElOR1MpLAotICAgICAgICAgICAgICAgICAgICBJTUVfU0VUVElOR1NfUE9MTElOR19JTlRFUlZBTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWxQb2xsaW5nSW1lU2V0dGluZ3MoKSB7Ci0gICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhNU0dfUE9MTElOR19JTUVfU0VUVElOR1MpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzZXRUaGVtZShhbmRyb2lkLlIuc3R5bGUuVGhlbWVfRGV2aWNlRGVmYXVsdF9MaWdodF9Ob0FjdGlvbkJhcik7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc2V0dXBfd2l6YXJkKTsKLQotICAgICAgICBSaWNoSW5wdXRNZXRob2RNYW5hZ2VyLmluaXQodGhpcyk7Ci0KLSAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtU3RlcE51bWJlciA9IGRldGVybWluZVNldHVwU3RlcE51bWJlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0ZXBOdW1iZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNUQVRFX1NURVApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TdGVwTnVtYmVyID09IFNURVBfMykgewotICAgICAgICAgICAgLy8gVGhpcyBJTUUgYWxyZWFkeSBoYXMgYmVlbiBlbmFibGVkIGFuZCBzZXQgYXMgY3VycmVudCBJTUUuCi0gICAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdHV0b3JpYWwuCi0gICAgICAgICAgICBpbnZva2VTZXR0aW5nc09mVGhpc0ltZSgpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgU2V0dXBXaXphcmRBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UT1AKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICBpZiAoIWlzRmluaXNoaW5nKCkpIHsKICAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogVXNlIHNhbnMtc2VyaWYtdGhpbiBmb250IGZhbWlseSBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSBsb2NhbGUgd2hpdGUgbGlzdCBhbmQKLSAgICAgICAgLy8gdGhlIFNESyB2ZXJzaW9uLgotICAgICAgICBmaW5hbCBUZXh0VmlldyB0aXRsZVZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfdGl0bGUpOwotICAgICAgICBmaW5hbCBpbnQgYXBwTmFtZSA9IGdldEFwcGxpY2F0aW9uSW5mbygpLmxhYmVsUmVzOwotICAgICAgICB0aXRsZVZpZXcuc2V0VGV4dChnZXRTdHJpbmcoUi5zdHJpbmcuc2V0dXBfdGl0bGUsIGdldFN0cmluZyhhcHBOYW1lKSkpOwotCi0gICAgICAgIG1TdGVwSW5kaWNhdG9yVmlldyA9IChTZXR1cFN0ZXBJbmRpY2F0b3JWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXBfaW5kaWNhdG9yKTsKLQotICAgICAgICBmaW5hbCBTZXR1cFN0ZXAgc3RlcDEgPSBuZXcgU2V0dXBTdGVwKGZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXAxKSwKLSAgICAgICAgICAgICAgICBhcHBOYW1lLCBSLnN0cmluZy5zZXR1cF9zdGVwMV90aXRsZSwgUi5zdHJpbmcuc2V0dXBfc3RlcDFfaW5zdHJ1Y3Rpb24sCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19zZXR0aW5nc19sYW5ndWFnZSwgUi5zdHJpbmcubGFuZ3VhZ2Vfc2V0dGluZ3MpOwotICAgICAgICBzdGVwMS5zZXRBY3Rpb24obmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW52b2tlTGFuZ3VhZ2VBbmRJbnB1dFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc3RhcnRQb2xsaW5nSW1lU2V0dGluZ3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1TZXR1cFN0ZXBzLmFkZFN0ZXAoU1RFUF8xLCBzdGVwMSk7Ci0KLSAgICAgICAgZmluYWwgU2V0dXBTdGVwIHN0ZXAyID0gbmV3IFNldHVwU3RlcChmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwMiksCi0gICAgICAgICAgICAgICAgYXBwTmFtZSwgUi5zdHJpbmcuc2V0dXBfc3RlcDJfdGl0bGUsIFIuc3RyaW5nLnNldHVwX3N0ZXAyX2luc3RydWN0aW9uLAotICAgICAgICAgICAgICAgIDAgLyogYWN0aW9uSWNvbiAqLywgUi5zdHJpbmcuc2VsZWN0X2lucHV0X21ldGhvZCk7Ci0gICAgICAgIHN0ZXAyLnNldEFjdGlvbihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgaW5wdXQgbWV0aG9kIHBpY2tlci4KLSAgICAgICAgICAgICAgICBSaWNoSW5wdXRNZXRob2RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXRNZXRob2RNYW5hZ2VyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93SW5wdXRNZXRob2RQaWNrZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1TZXR1cFN0ZXBzLmFkZFN0ZXAoU1RFUF8yLCBzdGVwMik7Ci0KLSAgICAgICAgZmluYWwgU2V0dXBTdGVwIHN0ZXAzID0gbmV3IFNldHVwU3RlcChmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwMyksCi0gICAgICAgICAgICAgICAgYXBwTmFtZSwgUi5zdHJpbmcuc2V0dXBfc3RlcDNfdGl0bGUsIDAgLyogaW5zdHJ1Y3Rpb24gKi8sCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5zeW1fa2V5Ym9hcmRfbGFuZ3VhZ2Vfc3dpdGNoLCBSLnN0cmluZy5zZXR1cF9zdGVwM19pbnN0cnVjdGlvbik7Ci0gICAgICAgIHN0ZXAzLnNldEFjdGlvbihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnZva2VTdWJ0eXBlRW5hYmxlck9mVGhpc0ltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbVNldHVwU3RlcHMuYWRkU3RlcChTVEVQXzMsIHN0ZXAzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlU2V0dXBXaXphcmRPZlRoaXNJbWUoKSB7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBTZXR1cEFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVECi0gICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UT1ApOwotICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZVNldHRpbmdzT2ZUaGlzSW1lKCkgewotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgU2V0dGluZ3NBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRAotICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QKTsKLSAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VMYW5ndWFnZUFuZElucHV0U2V0dGluZ3MoKSB7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRBY3Rpb24oU2V0dGluZ3MuQUNUSU9OX0lOUFVUX01FVEhPRF9TRVRUSU5HUyk7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVGQVVMVCk7Ci0gICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlU3VidHlwZUVuYWJsZXJPZlRoaXNJbWUoKSB7Ci0gICAgICAgIGZpbmFsIElucHV0TWV0aG9kSW5mbyBpbWkgPQotICAgICAgICAgICAgICAgIFJpY2hJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dE1ldGhvZEluZm9PZlRoaXNJbWUoKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgaW50ZW50LnNldEFjdGlvbihTZXR0aW5ncy5BQ1RJT05fSU5QVVRfTUVUSE9EX1NVQlRZUEVfU0VUVElOR1MpOwotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0RFRkFVTFQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2V0dGluZ3MuRVhUUkFfSU5QVVRfTUVUSE9EX0lELCBpbWkuZ2V0SWQoKSk7Ci0gICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMSwxNDEgKzc0LDQgQEAKICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOwogICAgICAgICByZXR1cm4gbXlJbWkuZ2V0SWQoKS5lcXVhbHMoY3VycmVudEltZUlkKTsKICAgICB9Ci0KLSAgICBwcml2YXRlIGludCBkZXRlcm1pbmVTZXR1cFN0ZXBOdW1iZXIoKSB7Ci0gICAgICAgIG1IYW5kbGVyLmNhbmNlbFBvbGxpbmdJbWVTZXR0aW5ncygpOwotICAgICAgICBpZiAoIWlzVGhpc0ltZUVuYWJsZWQodGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiBTVEVQXzE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc1RoaXNJbWVDdXJyZW50KHRoaXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1RFUF8yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTVEVQXzM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShmaW5hbCBCdW5kbGUgb3V0U3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7Ci0gICAgICAgIG91dFN0YXRlLnB1dEludChTVEFURV9TVEVQLCBtU3RlcE51bWJlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShmaW5hbCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbVN0ZXBOdW1iZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNUQVRFX1NURVApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAgICAgICAgbVN0ZXBOdW1iZXIgPSBkZXRlcm1pbmVTZXR1cFN0ZXBOdW1iZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdGFydCgpOwotICAgICAgICBtU3RlcE51bWJlciA9IGRldGVybWluZVNldHVwU3RlcE51bWJlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICB1cGRhdGVTZXR1cFN0ZXBWaWV3KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoZmluYWwgYm9vbGVhbiBoYXNGb2N1cykgewotICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtU3RlcE51bWJlciA9IGRldGVybWluZVNldHVwU3RlcE51bWJlcigpOwotICAgICAgICB1cGRhdGVTZXR1cFN0ZXBWaWV3KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNldHVwU3RlcFZpZXcoKSB7Ci0gICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBWaWV3Q29tcGF0VXRpbHMuZ2V0TGF5b3V0RGlyZWN0aW9uKG1TdGVwSW5kaWNhdG9yVmlldyk7Ci0gICAgICAgIG1TdGVwSW5kaWNhdG9yVmlldy5zZXRJbmRpY2F0b3JQb3NpdGlvbigKLSAgICAgICAgICAgICAgICBnZXRJbmRpY2F0b3JQb3NpdGlvbihtU3RlcE51bWJlciwgbVNldHVwU3RlcHMuZ2V0VG90YWxTdGVwKCksIGxheW91dERpcmVjdGlvbikpOwotICAgICAgICBtU2V0dXBTdGVwcy5lbmFibGVTdGVwKG1TdGVwTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBnZXRJbmRpY2F0b3JQb3NpdGlvbihmaW5hbCBpbnQgc3RlcCwgZmluYWwgaW50IHRvdGFsU3RlcCwKLSAgICAgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24pIHsKLSAgICAgICAgZmluYWwgZmxvYXQgcG9zID0gKChzdGVwIC0gU1RFUF8xKSAqIDIgKyAxKSAvIChmbG9hdCkodG90YWxTdGVwICogMik7Ci0gICAgICAgIHJldHVybiAobGF5b3V0RGlyZWN0aW9uID09IFZpZXdDb21wYXRVdGlscy5MQVlPVVRfRElSRUNUSU9OX1JUTCkgPyAxLjBmIC0gcG9zIDogcG9zOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXR1cFN0ZXAgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVmlldyBtUm9vdFZpZXc7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVGV4dFZpZXcgbUFjdGlvbkxhYmVsOwotICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIG1BY3Rpb247Ci0KLSAgICAgICAgcHVibGljIFNldHVwU3RlcChmaW5hbCBWaWV3IHJvb3RWaWV3LCBmaW5hbCBpbnQgYXBwTmFtZSwgZmluYWwgaW50IHRpdGxlLAotICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbnN0cnVjdGlvbiwgZmluYWwgaW50IGFjdGlvbkljb24sIGZpbmFsIGludCBhY3Rpb25MYWJlbCkgewotICAgICAgICAgICAgbVJvb3RWaWV3ID0gcm9vdFZpZXc7Ci0gICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gcm9vdFZpZXcuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXBwbGljYXRpb25OYW1lID0gcmVzLmdldFN0cmluZyhhcHBOYW1lKTsKLQotICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGl0bGVWaWV3ID0gKFRleHRWaWV3KXJvb3RWaWV3LmZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXBfdGl0bGUpOwotICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQocmVzLmdldFN0cmluZyh0aXRsZSwgYXBwbGljYXRpb25OYW1lKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGluc3RydWN0aW9uVmlldyA9IChUZXh0Vmlldylyb290Vmlldy5maW5kVmlld0J5SWQoCi0gICAgICAgICAgICAgICAgICAgIFIuaWQuc2V0dXBfc3RlcF9pbnN0cnVjdGlvbik7Ci0gICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gPT0gMCkgewotICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVmlldy5zZXRUZXh0KHJlcy5nZXRTdHJpbmcoaW5zdHJ1Y3Rpb24sIGFwcGxpY2F0aW9uTmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQWN0aW9uTGFiZWwgPSAoVGV4dFZpZXcpcm9vdFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfc3RlcF9hY3Rpb25fbGFiZWwpOwotICAgICAgICAgICAgbUFjdGlvbkxhYmVsLnNldFRleHQocmVzLmdldFN0cmluZyhhY3Rpb25MYWJlbCkpOwotICAgICAgICAgICAgaWYgKGFjdGlvbkljb24gPT0gMCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBwYWRkaW5nRW5kID0gVmlld0NvbXBhdFV0aWxzLmdldFBhZGRpbmdFbmQobUFjdGlvbkxhYmVsKTsKLSAgICAgICAgICAgICAgICBWaWV3Q29tcGF0VXRpbHMuc2V0UGFkZGluZ1JlbGF0aXZlKG1BY3Rpb25MYWJlbCwgcGFkZGluZ0VuZCwgMCwgcGFkZGluZ0VuZCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVycmlkZUNvbG9yID0gcmVzLmdldENvbG9yKFIuY29sb3Iuc2V0dXBfdGV4dF9hY3Rpb24pOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGljb24gPSByZXMuZ2V0RHJhd2FibGUoYWN0aW9uSWNvbik7Ci0gICAgICAgICAgICAgICAgaWNvbi5zZXRDb2xvckZpbHRlcihvdmVycmlkZUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOwotICAgICAgICAgICAgICAgIGljb24uc2V0Qm91bmRzKDAsIDAsIGljb24uZ2V0SW50cmluc2ljV2lkdGgoKSwgaWNvbi5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgVGV4dFZpZXdDb21wYXRVdGlscy5zZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkxhYmVsLCBpY29uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoZmluYWwgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtUm9vdFZpZXcuc2V0VmlzaWJpbGl0eShlbmFibGVkID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihmaW5hbCBSdW5uYWJsZSBhY3Rpb24pIHsKLSAgICAgICAgICAgIG1BY3Rpb25MYWJlbC5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBtQWN0aW9uID0gYWN0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAobUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXR1cFN0ZXBHcm91cCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJbnRlZ2VyLCBTZXR1cFN0ZXA+IG1Hcm91cCA9IENvbGxlY3Rpb25VdGlscy5uZXdIYXNoTWFwKCk7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkU3RlcChmaW5hbCBpbnQgc3RlcE5vLCBmaW5hbCBTZXR1cFN0ZXAgc3RlcCkgewotICAgICAgICAgICAgbUdyb3VwLnB1dChzdGVwTm8sIHN0ZXApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5hYmxlU3RlcChmaW5hbCBpbnQgZW5hYmxlU3RlcE5vKSB7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIEludGVnZXIgc3RlcE5vIDogbUdyb3VwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0dXBTdGVwIHN0ZXAgPSBtR3JvdXAuZ2V0KHN0ZXBObyk7Ci0gICAgICAgICAgICAgICAgc3RlcC5zZXRFbmFibGVkKHN0ZXBObyA9PSBlbmFibGVTdGVwTm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRUb3RhbFN0ZXAoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3VwLnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NldHVwL1NldHVwU3RhcnRJbmRpY2F0b3JWaWV3LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cFN0YXJ0SW5kaWNhdG9yVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGRmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cFN0YXJ0SW5kaWNhdG9yVmlldy5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5zZXR1cDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LlZpZXdDb21wYXRVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitwdWJsaWMgZmluYWwgY2xhc3MgU2V0dXBTdGFydEluZGljYXRvclZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgIHB1YmxpYyBTZXR1cFN0YXJ0SW5kaWNhdG9yVmlldyhmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIHNldE9yaWVudGF0aW9uKEhPUklaT05UQUwpOworICAgICAgICBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmluZmxhdGUoUi5sYXlvdXQuc2V0dXBfc3RhcnRfaW5kaWNhdG9yX2xhYmVsLCB0aGlzKTsKKworICAgICAgICBmaW5hbCBMYWJlbFZpZXcgbGFiZWxWaWV3ID0gKExhYmVsVmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGFydF9sYWJlbCk7CisgICAgICAgIGxhYmVsVmlldy5zZXRJbmRpY2F0b3JWaWV3KGZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0YXJ0X2luZGljYXRvcikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGFiZWxWaWV3IGV4dGVuZHMgVGV4dFZpZXcgeworICAgICAgICBwcml2YXRlIFZpZXcgbUluZGljYXRvclZpZXc7CisKKyAgICAgICAgcHVibGljIExhYmVsVmlldyhmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kaWNhdG9yVmlldyhmaW5hbCBWaWV3IGluZGljYXRvclZpZXcpIHsKKyAgICAgICAgICAgIG1JbmRpY2F0b3JWaWV3ID0gaW5kaWNhdG9yVmlldzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IE9uY2Ugd2Ugc3RvcCBzdXBwb3J0aW5nIElDUywgdW5jb21tZW50IHtAbGluayAjc2V0UHJlc3NlZChib29sZWFuKX0gbWV0aG9kIGFuZAorICAgICAgICAvLyByZW1vdmUgdGhpcyBtZXRob2QuCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIGludCBzdGF0ZSA6IGdldERyYXdhYmxlU3RhdGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9wcmVzc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUluZGljYXRvclZpZXcodHJ1ZSAvKiBwcmVzc2VkICovKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUluZGljYXRvclZpZXcoZmFsc2UgLyogcHJlc3NlZCAqLyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBPbmNlIHdlIHN0b3Agc3VwcG9ydGluZyBJQ1MsIHVuY29tbWVudCB0aGlzIG1ldGhvZCBhbmQgcmVtb3ZlCisgICAgICAgIC8vIHtAbGluayAjZHJhd2FibGVTdGF0ZUNoYW5nZWQoKX0gbWV0aG9kLgorLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXNzZWQoZmluYWwgYm9vbGVhbiBwcmVzc2VkKSB7CisvLyAgICAgICAgICAgIHN1cGVyLnNldFByZXNzZWQocHJlc3NlZCk7CisvLyAgICAgICAgICAgIHVwZGF0ZUluZGljYXRvclZpZXcocHJlc3NlZCk7CisvLyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJbmRpY2F0b3JWaWV3KGZpbmFsIGJvb2xlYW4gcHJlc3NlZCkgeworICAgICAgICAgICAgaWYgKG1JbmRpY2F0b3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSW5kaWNhdG9yVmlldy5zZXRQcmVzc2VkKHByZXNzZWQpOworICAgICAgICAgICAgICAgIG1JbmRpY2F0b3JWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW5kaWNhdG9yVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggbUluZGljYXRvclBhdGggPSBuZXcgUGF0aCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1JbmRpY2F0b3JQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yU3RhdGVMaXN0IG1JbmRpY2F0b3JDb2xvcjsKKworICAgICAgICBwdWJsaWMgSW5kaWNhdG9yVmlldyhmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICAgICAgbUluZGljYXRvckNvbG9yID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3JTdGF0ZUxpc3QoCisgICAgICAgICAgICAgICAgICAgIFIuY29sb3Iuc2V0dXBfc3RlcF9hY3Rpb25fYmFja2dyb3VuZCk7CisgICAgICAgICAgICBtSW5kaWNhdG9yUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KGZpbmFsIENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IFZpZXdDb21wYXRVdGlscy5nZXRMYXlvdXREaXJlY3Rpb24odGhpcyk7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOworICAgICAgICAgICAgZmluYWwgZmxvYXQgaGFsZkhlaWdodCA9IGhlaWdodCAvIDIuMGY7CisgICAgICAgICAgICBmaW5hbCBQYXRoIHBhdGggPSBtSW5kaWNhdG9yUGF0aDsKKyAgICAgICAgICAgIHBhdGgucmV3aW5kKCk7CisgICAgICAgICAgICBpZiAobGF5b3V0RGlyZWN0aW9uID09IFZpZXdDb21wYXRVdGlscy5MQVlPVVRfRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgICAgIC8vIExlZnQgYXJyb3cKKyAgICAgICAgICAgICAgICBwYXRoLm1vdmVUbyh3aWR0aCwgMC4wZik7CisgICAgICAgICAgICAgICAgcGF0aC5saW5lVG8oMC4wZiwgaGFsZkhlaWdodCk7CisgICAgICAgICAgICAgICAgcGF0aC5saW5lVG8od2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBMQVlPVVRfRElSRUNUSU9OX0xUUgorICAgICAgICAgICAgICAgIC8vIFJpZ2h0IGFycm93CisgICAgICAgICAgICAgICAgcGF0aC5tb3ZlVG8oMC4wZiwgMC4wZik7CisgICAgICAgICAgICAgICAgcGF0aC5saW5lVG8od2lkdGgsIGhhbGZIZWlnaHQpOworICAgICAgICAgICAgICAgIHBhdGgubGluZVRvKDAuMGYsIGhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRoLmNsb3NlKCk7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBzdGF0ZVNldCA9IGdldERyYXdhYmxlU3RhdGUoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb2xvciA9IG1JbmRpY2F0b3JDb2xvci5nZXRDb2xvckZvclN0YXRlKHN0YXRlU2V0LCAwKTsKKyAgICAgICAgICAgIG1JbmRpY2F0b3JQYWludC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgocGF0aCwgbUluZGljYXRvclBhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NldHVwL1NldHVwU3RlcEluZGljYXRvclZpZXcuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NldHVwL1NldHVwU3RlcEluZGljYXRvclZpZXcuamF2YQppbmRleCAwNzdhMjE3Li5jOTA5NTA3IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cFN0ZXBJbmRpY2F0b3JWaWV3LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc2V0dXAvU2V0dXBTdGVwSW5kaWNhdG9yVmlldy5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmNvbXBhdC5WaWV3Q29tcGF0VXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFNldHVwU3RlcEluZGljYXRvclZpZXcgZXh0ZW5kcyBWaWV3IHsKQEAgLTM2LDggKzM3LDEzIEBACiAgICAgICAgIG1JbmRpY2F0b3JQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRpY2F0b3JQb3NpdGlvbihmaW5hbCBmbG9hdCB4UmF0aW8pIHsKLSAgICAgICAgbVhSYXRpbyA9IHhSYXRpbzsKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRpY2F0b3JQb3NpdGlvbihmaW5hbCBpbnQgc3RlcFBvcywgZmluYWwgaW50IHRvdGFsU3RlcE51bSkgeworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gVmlld0NvbXBhdFV0aWxzLmdldExheW91dERpcmVjdGlvbih0aGlzKTsKKyAgICAgICAgLy8gVGhlIGluZGljYXRvciBwb3NpdGlvbiBpcyB0aGUgY2VudGVyIG9mIHRoZSBwYXJ0aXRpb24gdGhhdCBpcyBlcXVhbGx5IGRpdmlkZWQgaW50bworICAgICAgICAvLyB0aGUgdG90YWwgc3RlcCBudW1iZXIuCisgICAgICAgIGZpbmFsIGZsb2F0IHBhcnRpb25XaWR0aCA9IDEuMGYgLyB0b3RhbFN0ZXBOdW07CisgICAgICAgIGZpbmFsIGZsb2F0IHBvcyA9IHN0ZXBQb3MgKiBwYXJ0aW9uV2lkdGggKyBwYXJ0aW9uV2lkdGggLyAyLjBmOworICAgICAgICBtWFJhdGlvID0gKGxheW91dERpcmVjdGlvbiA9PSBWaWV3Q29tcGF0VXRpbHMuTEFZT1VUX0RJUkVDVElPTl9SVEwpID8gMS4wZiAtIHBvcyA6IHBvczsKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc2V0dXAvU2V0dXBXaXphcmRBY3Rpdml0eS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc2V0dXAvU2V0dXBXaXphcmRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTY0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zZXR1cC9TZXR1cFdpemFyZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnNldHVwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mbzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LlRleHRWaWV3Q29tcGF0VXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LlZpZXdDb21wYXRVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5Db2xsZWN0aW9uVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SaWNoSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlNldHRpbmdzQWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8vIFRPRE86IFVzZSBGcmFnbWVudCB0byBpbXBsZW1lbnQgd2VsY29tZSBzY3JlZW4gYW5kIHNldHVwIHN0ZXBzLgorcHVibGljIGZpbmFsIGNsYXNzIFNldHVwV2l6YXJkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFNldHVwV2l6YXJkQWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfV0VMQ09NRV9WSURFTyA9IHRydWU7CisKKyAgICBwcml2YXRlIFZpZXcgbVNldHVwV2l6YXJkOworICAgIHByaXZhdGUgVmlldyBtV2VsY29tZVNjcmVlbjsKKyAgICBwcml2YXRlIFZpZXcgbVNldHVwU2NyZWVuOworICAgIHByaXZhdGUgVXJpIG1XZWxjb21lVmlkZW9Vcmk7CisgICAgcHJpdmF0ZSBWaWRlb1ZpZXcgbVdlbGNvbWVWaWRlb1ZpZXc7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVdlbGNvbWVJbWFnZVZpZXc7CisgICAgcHJpdmF0ZSBWaWV3IG1BY3Rpb25TdGFydDsKKyAgICBwcml2YXRlIFZpZXcgbUFjdGlvbk5leHQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RlcDFCdWxsZXQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQWN0aW9uRmluaXNoOworICAgIHByaXZhdGUgU2V0dXBTdGVwR3JvdXAgbVNldHVwU3RlcEdyb3VwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TVEVQID0gInN0ZXAiOworICAgIHByaXZhdGUgaW50IG1TdGVwTnVtYmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZHNUb0FkanVzdFN0ZXBOdW1iZXJUb1N5c3RlbVN0YXRlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQX1dFTENPTUUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQXzEgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQXzIgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQXzMgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQX0xBVU5DSElOR19JTUVfU0VUVElOR1MgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEVQX0JBQ0tfRlJPTV9JTUVfU0VUVElOR1MgPSA1OworCisgICAgZmluYWwgU2V0dGluZ3NQb29saW5nSGFuZGxlciBtSGFuZGxlciA9IG5ldyBTZXR0aW5nc1Bvb2xpbmdIYW5kbGVyKHRoaXMpOworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFNldHRpbmdzUG9vbGluZ0hhbmRsZXIKKyAgICAgICAgICAgIGV4dGVuZHMgU3RhdGljSW5uZXJIYW5kbGVyV3JhcHBlcjxTZXR1cFdpemFyZEFjdGl2aXR5PiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUE9MTElOR19JTUVfU0VUVElOR1MgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIElNRV9TRVRUSU5HU19QT0xMSU5HX0lOVEVSVkFMID0gMjAwOworCisgICAgICAgIHB1YmxpYyBTZXR0aW5nc1Bvb2xpbmdIYW5kbGVyKGZpbmFsIFNldHVwV2l6YXJkQWN0aXZpdHkgb3V0ZXJJbnN0YW5jZSkgeworICAgICAgICAgICAgc3VwZXIob3V0ZXJJbnN0YW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShmaW5hbCBNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgZmluYWwgU2V0dXBXaXphcmRBY3Rpdml0eSBzZXR1cFdpemFyZEFjdGl2aXR5ID0gZ2V0T3V0ZXJJbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKHNldHVwV2l6YXJkQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgTVNHX1BPTExJTkdfSU1FX1NFVFRJTkdTOgorICAgICAgICAgICAgICAgIGlmIChTZXR1cEFjdGl2aXR5LmlzVGhpc0ltZUVuYWJsZWQoc2V0dXBXaXphcmRBY3Rpdml0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBXaXphcmRBY3Rpdml0eS5pbnZva2VTZXR1cFdpemFyZE9mVGhpc0ltZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0UG9sbGluZ0ltZVNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFBvbGxpbmdJbWVTZXR0aW5ncygpIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChvYnRhaW5NZXNzYWdlKE1TR19QT0xMSU5HX0lNRV9TRVRUSU5HUyksCisgICAgICAgICAgICAgICAgICAgIElNRV9TRVRUSU5HU19QT0xMSU5HX0lOVEVSVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbFBvbGxpbmdJbWVTZXR0aW5ncygpIHsKKyAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKE1TR19QT0xMSU5HX0lNRV9TRVRUSU5HUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShmaW5hbCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHNldFRoZW1lKGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9UcmFuc2x1Y2VudF9Ob1RpdGxlQmFyKTsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5zZXR1cF93aXphcmQpOworICAgICAgICBtU2V0dXBXaXphcmQgPSBmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF93aXphcmQpOworCisgICAgICAgIFJpY2hJbnB1dE1ldGhvZE1hbmFnZXIuaW5pdCh0aGlzKTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TdGVwTnVtYmVyID0gZGV0ZXJtaW5lU2V0dXBTdGVwTnVtYmVyRnJvbUxhdW5jaGVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RlcE51bWJlciA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoU1RBVEVfU1RFUCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgYXBwbGljYXRpb25OYW1lID0gZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKGdldEFwcGxpY2F0aW9uSW5mbygpLmxhYmVsUmVzKTsKKyAgICAgICAgbVdlbGNvbWVTY3JlZW4gPSBmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF93ZWxjb21lX3NjcmVlbik7CisgICAgICAgIGZpbmFsIFRleHRWaWV3IHdlbGNvbWVUaXRsZSA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF93ZWxjb21lX3RpdGxlKTsKKyAgICAgICAgd2VsY29tZVRpdGxlLnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLnNldHVwX3dlbGNvbWVfdGl0bGUsIGFwcGxpY2F0aW9uTmFtZSkpOworCisgICAgICAgIG1TZXR1cFNjcmVlbiA9IGZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXBzX3NjcmVlbik7CisgICAgICAgIGZpbmFsIFRleHRWaWV3IHN0ZXBzVGl0bGUgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfdGl0bGUpOworICAgICAgICBzdGVwc1RpdGxlLnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLnNldHVwX3N0ZXBzX3RpdGxlLCBhcHBsaWNhdGlvbk5hbWUpKTsKKworICAgICAgICBmaW5hbCBTZXR1cFN0ZXBJbmRpY2F0b3JWaWV3IGluZGljYXRvclZpZXcgPQorICAgICAgICAgICAgICAgIChTZXR1cFN0ZXBJbmRpY2F0b3JWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXBfaW5kaWNhdG9yKTsKKyAgICAgICAgbVNldHVwU3RlcEdyb3VwID0gbmV3IFNldHVwU3RlcEdyb3VwKGluZGljYXRvclZpZXcpOworCisgICAgICAgIG1TdGVwMUJ1bGxldCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwMV9idWxsZXQpOworICAgICAgICBtU3RlcDFCdWxsZXQuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5hbCBTZXR1cFN0ZXAgc3RlcDEgPSBuZXcgU2V0dXBTdGVwKFNURVBfMSwgYXBwbGljYXRpb25OYW1lLAorICAgICAgICAgICAgICAgIG1TdGVwMUJ1bGxldCwgZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfc3RlcDEpLAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLnNldHVwX3N0ZXAxX3RpdGxlLCBSLnN0cmluZy5zZXR1cF9zdGVwMV9pbnN0cnVjdGlvbiwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5zZXR1cF9zdGVwMV9maW5pc2hlZF9pbnN0cnVjdGlvbiwgUi5kcmF3YWJsZS5pY19zZXR1cF9zdGVwMSwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5zZXR1cF9zdGVwMV9hY3Rpb24pOworICAgICAgICBzdGVwMS5zZXRBY3Rpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW52b2tlTGFuZ3VhZ2VBbmRJbnB1dFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc3RhcnRQb2xsaW5nSW1lU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1TZXR1cFN0ZXBHcm91cC5hZGRTdGVwKHN0ZXAxKTsKKworICAgICAgICBmaW5hbCBTZXR1cFN0ZXAgc3RlcDIgPSBuZXcgU2V0dXBTdGVwKFNURVBfMiwgYXBwbGljYXRpb25OYW1lLAorICAgICAgICAgICAgICAgIChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwMl9idWxsZXQpLCBmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwMiksCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuc2V0dXBfc3RlcDJfdGl0bGUsIFIuc3RyaW5nLnNldHVwX3N0ZXAyX2luc3RydWN0aW9uLAorICAgICAgICAgICAgICAgIDAgLyogZmluaXNoZWRJbnN0cnVjdGlvbiAqLywgUi5kcmF3YWJsZS5pY19zZXR1cF9zdGVwMiwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5zZXR1cF9zdGVwMl9hY3Rpb24pOworICAgICAgICBzdGVwMi5zZXRBY3Rpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW52b2tlSW5wdXRNZXRob2RQaWNrZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1TZXR1cFN0ZXBHcm91cC5hZGRTdGVwKHN0ZXAyKTsKKworICAgICAgICBmaW5hbCBTZXR1cFN0ZXAgc3RlcDMgPSBuZXcgU2V0dXBTdGVwKFNURVBfMywgYXBwbGljYXRpb25OYW1lLAorICAgICAgICAgICAgICAgIChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwM19idWxsZXQpLCBmaW5kVmlld0J5SWQoUi5pZC5zZXR1cF9zdGVwMyksCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuc2V0dXBfc3RlcDNfdGl0bGUsIFIuc3RyaW5nLnNldHVwX3N0ZXAzX2luc3RydWN0aW9uLAorICAgICAgICAgICAgICAgIDAgLyogZmluaXNoZWRJbnN0cnVjdGlvbiAqLywgUi5kcmF3YWJsZS5pY19zZXR1cF9zdGVwMywKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5zZXR1cF9zdGVwM19hY3Rpb24pOworICAgICAgICBzdGVwMy5zZXRBY3Rpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW52b2tlU3VidHlwZUVuYWJsZXJPZlRoaXNJbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1TZXR1cFN0ZXBHcm91cC5hZGRTdGVwKHN0ZXAzKTsKKworICAgICAgICBtV2VsY29tZVZpZGVvVXJpID0gbmV3IFVyaS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2NoZW1lKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRSkKKyAgICAgICAgICAgICAgICAuYXV0aG9yaXR5KGdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgLnBhdGgoSW50ZWdlci50b1N0cmluZyhSLnJhdy5zZXR1cF93ZWxjb21lX3ZpZGVvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVmlkZW9WaWV3IHdlbGNvbWVWaWRlb1ZpZXcgPSAoVmlkZW9WaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3dlbGNvbWVfdmlkZW8pOworICAgICAgICB3ZWxjb21lVmlkZW9WaWV3LnNldE9uUHJlcGFyZWRMaXN0ZW5lcihuZXcgTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVkKGZpbmFsIE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgICAgICAgICAgLy8gTm93IFZpZGVvVmlldyBoYXMgYmVlbiBsYWlkLW91dCBhbmQgcmVhZHkgdG8gcGxheSwgcmVtb3ZlIGJhY2tncm91bmQgb2YgaXQgdG8KKyAgICAgICAgICAgICAgICAvLyByZXZlYWwgdGhlIHZpZGVvLgorICAgICAgICAgICAgICAgIHdlbGNvbWVWaWRlb1ZpZXcuc2V0QmFja2dyb3VuZFJlc291cmNlKDApOworICAgICAgICAgICAgICAgIG1wLnNldExvb3BpbmcodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB3ZWxjb21lVmlkZW9WaWV3LnNldE9uRXJyb3JMaXN0ZW5lcihuZXcgTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVycm9yKGZpbmFsIE1lZGlhUGxheWVyIG1wLCBmaW5hbCBpbnQgd2hhdCwgZmluYWwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWluZyB3ZWxjb21lIHZpZGVvIGNhdXNlcyBlcnJvcjogd2hhdD0iICsgd2hhdCArICIgZXh0cmE9IiArIGV4dHJhKTsKKyAgICAgICAgICAgICAgICBoaWRlV2VsY29tZVZpZGVvQW5kU2hvd1dlbGNvbWVJbWFnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVdlbGNvbWVWaWRlb1ZpZXcgPSB3ZWxjb21lVmlkZW9WaWV3OworICAgICAgICBtV2VsY29tZUltYWdlVmlldyA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfd2VsY29tZV9pbWFnZSk7CisKKyAgICAgICAgbUFjdGlvblN0YXJ0ID0gZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfc3RhcnRfbGFiZWwpOworICAgICAgICBtQWN0aW9uU3RhcnQuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtQWN0aW9uTmV4dCA9IGZpbmRWaWV3QnlJZChSLmlkLnNldHVwX25leHQpOworICAgICAgICBtQWN0aW9uTmV4dC5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1BY3Rpb25GaW5pc2ggPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2V0dXBfZmluaXNoKTsKKyAgICAgICAgVGV4dFZpZXdDb21wYXRVdGlscy5zZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlV2l0aEludHJpbnNpY0JvdW5kcyhtQWN0aW9uRmluaXNoLAorICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc2V0dXBfZmluaXNoKSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIG1BY3Rpb25GaW5pc2guc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgVmlldyB2KSB7CisgICAgICAgIGlmICh2ID09IG1BY3Rpb25GaW5pc2gpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBjdXJyZW50U3RlcCA9IGRldGVybWluZVNldHVwU3RlcE51bWJlcigpOworICAgICAgICBmaW5hbCBpbnQgbmV4dFN0ZXA7CisgICAgICAgIGlmICh2ID09IG1BY3Rpb25TdGFydCkgeworICAgICAgICAgICAgbmV4dFN0ZXAgPSBTVEVQXzE7CisgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtQWN0aW9uTmV4dCkgeworICAgICAgICAgICAgbmV4dFN0ZXAgPSBtU3RlcE51bWJlciArIDE7CisgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtU3RlcDFCdWxsZXQgJiYgY3VycmVudFN0ZXAgPT0gU1RFUF8yKSB7CisgICAgICAgICAgICBuZXh0U3RlcCA9IFNURVBfMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHRTdGVwID0gbVN0ZXBOdW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGVwTnVtYmVyICE9IG5leHRTdGVwKSB7CisgICAgICAgICAgICBtU3RlcE51bWJlciA9IG5leHRTdGVwOworICAgICAgICAgICAgdXBkYXRlU2V0dXBTdGVwVmlldygpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbnZva2VTZXR1cFdpemFyZE9mVGhpc0ltZSgpIHsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFNldHVwV2l6YXJkQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1AKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RPUCk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgbU5lZWRzVG9BZGp1c3RTdGVwTnVtYmVyVG9TeXN0ZW1TdGF0ZSA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGludm9rZVNldHRpbmdzT2ZUaGlzSW1lKCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgU2V0dGluZ3NBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRAorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHZvaWQgaW52b2tlTGFuZ3VhZ2VBbmRJbnB1dFNldHRpbmdzKCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKFNldHRpbmdzLkFDVElPTl9JTlBVVF9NRVRIT0RfU0VUVElOR1MpOworICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0RFRkFVTFQpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIG1OZWVkc1RvQWRqdXN0U3RlcE51bWJlclRvU3lzdGVtU3RhdGUgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgaW52b2tlSW5wdXRNZXRob2RQaWNrZXIoKSB7CisgICAgICAgIC8vIEludm9rZSBpbnB1dCBtZXRob2QgcGlja2VyLgorICAgICAgICBSaWNoSW5wdXRNZXRob2RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXRNZXRob2RNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuc2hvd0lucHV0TWV0aG9kUGlja2VyKCk7CisgICAgICAgIG1OZWVkc1RvQWRqdXN0U3RlcE51bWJlclRvU3lzdGVtU3RhdGUgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgaW52b2tlU3VidHlwZUVuYWJsZXJPZlRoaXNJbWUoKSB7CisgICAgICAgIGZpbmFsIElucHV0TWV0aG9kSW5mbyBpbWkgPQorICAgICAgICAgICAgICAgIFJpY2hJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dE1ldGhvZEluZm9PZlRoaXNJbWUoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihTZXR0aW5ncy5BQ1RJT05fSU5QVVRfTUVUSE9EX1NVQlRZUEVfU0VUVElOR1MpOworICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0RFRkFVTFQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2V0dGluZ3MuRVhUUkFfSU5QVVRfTUVUSE9EX0lELCBpbWkuZ2V0SWQoKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZXRlcm1pbmVTZXR1cFN0ZXBOdW1iZXJGcm9tTGF1bmNoZXIoKSB7CisgICAgICAgIGZpbmFsIGludCBzdGVwTnVtYmVyID0gZGV0ZXJtaW5lU2V0dXBTdGVwTnVtYmVyKCk7CisgICAgICAgIGlmIChzdGVwTnVtYmVyID09IFNURVBfMSkgeworICAgICAgICAgICAgcmV0dXJuIFNURVBfV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RlcE51bWJlciA9PSBTVEVQXzMpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEVQX0xBVU5DSElOR19JTUVfU0VUVElOR1M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ZXBOdW1iZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lU2V0dXBTdGVwTnVtYmVyKCkgeworICAgICAgICBtSGFuZGxlci5jYW5jZWxQb2xsaW5nSW1lU2V0dGluZ3MoKTsKKyAgICAgICAgaWYgKCFTZXR1cEFjdGl2aXR5LmlzVGhpc0ltZUVuYWJsZWQodGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEVQXzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFTZXR1cEFjdGl2aXR5LmlzVGhpc0ltZUN1cnJlbnQodGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEVQXzI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNURVBfMzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKGZpbmFsIEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KFNUQVRFX1NURVAsIG1TdGVwTnVtYmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKGZpbmFsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtU3RlcE51bWJlciA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoU1RBVEVfU1RFUCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luU2V0dXBTdGVwcyhmaW5hbCBpbnQgc3RlcE51bWJlcikgeworICAgICAgICByZXR1cm4gc3RlcE51bWJlciA+PSBTVEVQXzEgJiYgc3RlcE51bWJlciA8PSBTVEVQXzM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblJlc3RhcnQoKTsKKyAgICAgICAgLy8gUHJvYmFibHkgdGhlIHNldHVwIHdpemFyZCBoYXMgYmVlbiBpbnZva2VkIGZyb20gIlJlY2VudCIgbWVudS4gVGhlIHNldHVwIHN0ZXAgbnVtYmVyCisgICAgICAgIC8vIG5lZWRzIHRvIGJlIGFkanVzdGVkIHRvIHN5c3RlbSBzdGF0ZSwgYmVjYXVzZSB0aGUgc3RhdGUgKElNRSBpcyBlbmFibGVkIGFuZC9vciBjdXJyZW50KQorICAgICAgICAvLyBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQuCisgICAgICAgIGlmIChpc0luU2V0dXBTdGVwcyhtU3RlcE51bWJlcikpIHsKKyAgICAgICAgICAgIG1TdGVwTnVtYmVyID0gZGV0ZXJtaW5lU2V0dXBTdGVwTnVtYmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgaWYgKG1TdGVwTnVtYmVyID09IFNURVBfTEFVTkNISU5HX0lNRV9TRVRUSU5HUykgeworICAgICAgICAgICAgLy8gUHJldmVudCB3aGl0ZSBzY3JlZW4gZmxhc2hpbmcgd2hpbGUgbGF1bmNoaW5nIHNldHRpbmdzIGFjdGl2aXR5LgorICAgICAgICAgICAgbVNldHVwV2l6YXJkLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgaW52b2tlU2V0dGluZ3NPZlRoaXNJbWUoKTsKKyAgICAgICAgICAgIG1TdGVwTnVtYmVyID0gU1RFUF9CQUNLX0ZST01fSU1FX1NFVFRJTkdTOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RlcE51bWJlciA9PSBTVEVQX0JBQ0tfRlJPTV9JTUVfU0VUVElOR1MpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVNldHVwU3RlcFZpZXcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgeworICAgICAgICBpZiAobVN0ZXBOdW1iZXIgPT0gU1RFUF8xKSB7CisgICAgICAgICAgICBtU3RlcE51bWJlciA9IFNURVBfV0VMQ09NRTsKKyAgICAgICAgICAgIHVwZGF0ZVNldHVwU3RlcFZpZXcoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5vbkJhY2tQcmVzc2VkKCk7CisgICAgfQorCisgICAgdm9pZCBoaWRlV2VsY29tZVZpZGVvQW5kU2hvd1dlbGNvbWVJbWFnZSgpIHsKKyAgICAgICAgbVdlbGNvbWVWaWRlb1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtV2VsY29tZUltYWdlVmlldy5zZXRJbWFnZVJlc291cmNlKFIucmF3LnNldHVwX3dlbGNvbWVfaW1hZ2UpOworICAgICAgICBtV2VsY29tZUltYWdlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dBbmRTdGFydFdlbGNvbWVWaWRlbygpIHsKKyAgICAgICAgbVdlbGNvbWVWaWRlb1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBtV2VsY29tZVZpZGVvVmlldy5zZXRWaWRlb1VSSShtV2VsY29tZVZpZGVvVXJpKTsKKyAgICAgICAgbVdlbGNvbWVWaWRlb1ZpZXcuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGlkZUFuZFN0b3BXZWxjb21lVmlkZW8oKSB7CisgICAgICAgIG1XZWxjb21lVmlkZW9WaWV3LnN0b3BQbGF5YmFjaygpOworICAgICAgICBtV2VsY29tZVZpZGVvVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgaGlkZUFuZFN0b3BXZWxjb21lVmlkZW8oKTsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGZpbmFsIGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgc3VwZXIub25XaW5kb3dGb2N1c0NoYW5nZWQoaGFzRm9jdXMpOworICAgICAgICBpZiAoaGFzRm9jdXMgJiYgbU5lZWRzVG9BZGp1c3RTdGVwTnVtYmVyVG9TeXN0ZW1TdGF0ZSkgeworICAgICAgICAgICAgbU5lZWRzVG9BZGp1c3RTdGVwTnVtYmVyVG9TeXN0ZW1TdGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgbVN0ZXBOdW1iZXIgPSBkZXRlcm1pbmVTZXR1cFN0ZXBOdW1iZXIoKTsKKyAgICAgICAgICAgIHVwZGF0ZVNldHVwU3RlcFZpZXcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXR1cFN0ZXBWaWV3KCkgeworICAgICAgICBtU2V0dXBXaXphcmQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBmaW5hbCBib29sZWFuIHdlbGNvbWVTY3JlZW4gPSAobVN0ZXBOdW1iZXIgPT0gU1RFUF9XRUxDT01FKTsKKyAgICAgICAgbVdlbGNvbWVTY3JlZW4uc2V0VmlzaWJpbGl0eSh3ZWxjb21lU2NyZWVuID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgbVNldHVwU2NyZWVuLnNldFZpc2liaWxpdHkod2VsY29tZVNjcmVlbiA/IFZpZXcuR09ORSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIGlmICh3ZWxjb21lU2NyZWVuKSB7CisgICAgICAgICAgICBpZiAoRU5BQkxFX1dFTENPTUVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBzaG93QW5kU3RhcnRXZWxjb21lVmlkZW8oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGlkZVdlbGNvbWVWaWRlb0FuZFNob3dXZWxjb21lSW1hZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBoaWRlQW5kU3RvcFdlbGNvbWVWaWRlbygpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzU3RlcEFjdGlvbkFscmVhZHlEb25lID0gbVN0ZXBOdW1iZXIgPCBkZXRlcm1pbmVTZXR1cFN0ZXBOdW1iZXIoKTsKKyAgICAgICAgbVNldHVwU3RlcEdyb3VwLmVuYWJsZVN0ZXAobVN0ZXBOdW1iZXIsIGlzU3RlcEFjdGlvbkFscmVhZHlEb25lKTsKKyAgICAgICAgbUFjdGlvbk5leHQuc2V0VmlzaWJpbGl0eShpc1N0ZXBBY3Rpb25BbHJlYWR5RG9uZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIG1BY3Rpb25GaW5pc2guc2V0VmlzaWJpbGl0eSgobVN0ZXBOdW1iZXIgPT0gU1RFUF8zKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFNldHVwU3RlcCBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtU3RlcE5vOworICAgICAgICBwcml2YXRlIGZpbmFsIFZpZXcgbVN0ZXBWaWV3OworICAgICAgICBwcml2YXRlIGZpbmFsIFRleHRWaWV3IG1CdWxsZXRWaWV3OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQWN0aXZhdGVkQ29sb3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1EZWFjdGl2YXRlZENvbG9yOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSW5zdHJ1Y3Rpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GaW5pc2hlZEluc3RydWN0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFRleHRWaWV3IG1BY3Rpb25MYWJlbDsKKyAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtQWN0aW9uOworCisgICAgICAgIHB1YmxpYyBTZXR1cFN0ZXAoZmluYWwgaW50IHN0ZXBObywgZmluYWwgU3RyaW5nIGFwcGxpY2F0aW9uTmFtZSwgZmluYWwgVGV4dFZpZXcgYnVsbGV0VmlldywKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHN0ZXBWaWV3LCBmaW5hbCBpbnQgdGl0bGUsIGZpbmFsIGludCBpbnN0cnVjdGlvbiwKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmluaXNoZWRJbnN0cnVjdGlvbiwgZmluYWwgaW50IGFjdGlvbkljb24sIGZpbmFsIGludCBhY3Rpb25MYWJlbCkgeworICAgICAgICAgICAgbVN0ZXBObyA9IHN0ZXBObzsKKyAgICAgICAgICAgIG1TdGVwVmlldyA9IHN0ZXBWaWV3OworICAgICAgICAgICAgbUJ1bGxldFZpZXcgPSBidWxsZXRWaWV3OworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IHN0ZXBWaWV3LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgbUFjdGl2YXRlZENvbG9yID0gcmVzLmdldENvbG9yKFIuY29sb3Iuc2V0dXBfdGV4dF9hY3Rpb24pOworICAgICAgICAgICAgbURlYWN0aXZhdGVkQ29sb3IgPSByZXMuZ2V0Q29sb3IoUi5jb2xvci5zZXR1cF90ZXh0X2RhcmspOworCisgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0aXRsZVZpZXcgPSAoVGV4dFZpZXcpbVN0ZXBWaWV3LmZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXBfdGl0bGUpOworICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQocmVzLmdldFN0cmluZyh0aXRsZSwgYXBwbGljYXRpb25OYW1lKSk7CisgICAgICAgICAgICBtSW5zdHJ1Y3Rpb24gPSAoaW5zdHJ1Y3Rpb24gPT0gMCkgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogcmVzLmdldFN0cmluZyhpbnN0cnVjdGlvbiwgYXBwbGljYXRpb25OYW1lKTsKKyAgICAgICAgICAgIG1GaW5pc2hlZEluc3RydWN0aW9uID0gKGZpbmlzaGVkSW5zdHJ1Y3Rpb24gPT0gMCkgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogcmVzLmdldFN0cmluZyhmaW5pc2hlZEluc3RydWN0aW9uLCBhcHBsaWNhdGlvbk5hbWUpOworCisgICAgICAgICAgICBtQWN0aW9uTGFiZWwgPSAoVGV4dFZpZXcpbVN0ZXBWaWV3LmZpbmRWaWV3QnlJZChSLmlkLnNldHVwX3N0ZXBfYWN0aW9uX2xhYmVsKTsKKyAgICAgICAgICAgIG1BY3Rpb25MYWJlbC5zZXRUZXh0KHJlcy5nZXRTdHJpbmcoYWN0aW9uTGFiZWwpKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb25JY29uID09IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGFkZGluZ0VuZCA9IFZpZXdDb21wYXRVdGlscy5nZXRQYWRkaW5nRW5kKG1BY3Rpb25MYWJlbCk7CisgICAgICAgICAgICAgICAgVmlld0NvbXBhdFV0aWxzLnNldFBhZGRpbmdSZWxhdGl2ZShtQWN0aW9uTGFiZWwsIHBhZGRpbmdFbmQsIDAsIHBhZGRpbmdFbmQsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUZXh0Vmlld0NvbXBhdFV0aWxzLnNldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmVXaXRoSW50cmluc2ljQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkxhYmVsLCByZXMuZ2V0RHJhd2FibGUoYWN0aW9uSWNvbiksIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChmaW5hbCBib29sZWFuIGVuYWJsZWQsIGZpbmFsIGJvb2xlYW4gaXNTdGVwQWN0aW9uQWxyZWFkeURvbmUpIHsKKyAgICAgICAgICAgIG1TdGVwVmlldy5zZXRWaXNpYmlsaXR5KGVuYWJsZWQgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICAgICAgbUJ1bGxldFZpZXcuc2V0VGV4dENvbG9yKGVuYWJsZWQgPyBtQWN0aXZhdGVkQ29sb3IgOiBtRGVhY3RpdmF0ZWRDb2xvcik7CisgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBpbnN0cnVjdGlvblZpZXcgPSAoVGV4dFZpZXcpbVN0ZXBWaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgUi5pZC5zZXR1cF9zdGVwX2luc3RydWN0aW9uKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9uVmlldy5zZXRUZXh0KGlzU3RlcEFjdGlvbkFscmVhZHlEb25lID8gbUZpbmlzaGVkSW5zdHJ1Y3Rpb24gOiBtSW5zdHJ1Y3Rpb24pOworICAgICAgICAgICAgbUFjdGlvbkxhYmVsLnNldFZpc2liaWxpdHkoaXNTdGVwQWN0aW9uQWxyZWFkeURvbmUgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKGZpbmFsIFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICAgICAgbUFjdGlvbkxhYmVsLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1BY3Rpb24gPSBhY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBWaWV3IHYpIHsKKyAgICAgICAgICAgIGlmICh2ID09IG1BY3Rpb25MYWJlbCAmJiBtQWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uLnJ1bigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXR1cFN0ZXBHcm91cCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0dXBTdGVwSW5kaWNhdG9yVmlldyBtSW5kaWNhdG9yVmlldzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U2V0dXBTdGVwPiBtR3JvdXAgPSBDb2xsZWN0aW9uVXRpbHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgcHVibGljIFNldHVwU3RlcEdyb3VwKGZpbmFsIFNldHVwU3RlcEluZGljYXRvclZpZXcgaW5kaWNhdG9yVmlldykgeworICAgICAgICAgICAgbUluZGljYXRvclZpZXcgPSBpbmRpY2F0b3JWaWV3OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkU3RlcChmaW5hbCBTZXR1cFN0ZXAgc3RlcCkgeworICAgICAgICAgICAgbUdyb3VwLmFkZChzdGVwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuYWJsZVN0ZXAoZmluYWwgaW50IGVuYWJsZVN0ZXBObywgZmluYWwgYm9vbGVhbiBpc1N0ZXBBY3Rpb25BbHJlYWR5RG9uZSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTZXR1cFN0ZXAgc3RlcCA6IG1Hcm91cCkgeworICAgICAgICAgICAgICAgIHN0ZXAuc2V0RW5hYmxlZChzdGVwLm1TdGVwTm8gPT0gZW5hYmxlU3RlcE5vLCBpc1N0ZXBBY3Rpb25BbHJlYWR5RG9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5kaWNhdG9yVmlldy5zZXRJbmRpY2F0b3JQb3NpdGlvbihlbmFibGVTdGVwTm8gLSBTVEVQXzEsIG1Hcm91cC5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZS5qYXZhCmluZGV4IDE2NjcwNTkuLjEzZmNhZjQgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFNwZWxsQ2hlY2tlclNlcnZpY2UuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0c2VydmljZS5TdWdnZXN0aW9uc0luZm87CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5Qcm94aW1pdHlJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkTGF5b3V0U2V0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkJpbmFyeURpY3Rpb25hcnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uQ29sbGVjdGlvblV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkNvbnRhY3RzQmluYXJ5RGljdGlvbmFyeTsKQEAgLTY0LDggKzY0LDYgQEAKICAgICAgICAgICAgIENvbGxlY3Rpb25VdGlscy5uZXdTeW5jaHJvbml6ZWRUcmVlTWFwKCk7CiAgICAgcHJpdmF0ZSBDb250YWN0c0JpbmFyeURpY3Rpb25hcnkgbUNvbnRhY3RzRGljdGlvbmFyeTsKIAotICAgIC8vIFRoZSB0aHJlc2hvbGQgZm9yIGEgY2FuZGlkYXRlIHRvIGJlIG9mZmVyZWQgYXMgYSBzdWdnZXN0aW9uLgotICAgIHByaXZhdGUgZmxvYXQgbVN1Z2dlc3Rpb25UaHJlc2hvbGQ7CiAgICAgLy8gVGhlIHRocmVzaG9sZCBmb3IgYSBzdWdnZXN0aW9uIHRvIGJlIGNvbnNpZGVyZWQgInJlY29tbWVuZGVkIi4KICAgICBwcml2YXRlIGZsb2F0IG1SZWNvbW1lbmRlZFRocmVzaG9sZDsKICAgICAvLyBXaGV0aGVyIHRvIHVzZSB0aGUgY29udGFjdHMgZGljdGlvbmFyeQpAQCAtMTEyLDggKzExMCw2IEBACiAKICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7Ci0gICAgICAgIG1TdWdnZXN0aW9uVGhyZXNob2xkID0KLSAgICAgICAgICAgICAgICBGbG9hdC5wYXJzZUZsb2F0KGdldFN0cmluZyhSLnN0cmluZy5zcGVsbGNoZWNrZXJfc3VnZ2VzdGlvbl90aHJlc2hvbGRfdmFsdWUpKTsKICAgICAgICAgbVJlY29tbWVuZGVkVGhyZXNob2xkID0KICAgICAgICAgICAgICAgICBGbG9hdC5wYXJzZUZsb2F0KGdldFN0cmluZyhSLnN0cmluZy5zcGVsbGNoZWNrZXJfcmVjb21tZW5kZWRfdGhyZXNob2xkX3ZhbHVlKSk7CiAgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gUHJlZmVyZW5jZU1hbmFnZXIuZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzKHRoaXMpOwpAQCAtMTMwLDYgKzEyNiwxOSBAQAogICAgICAgICByZXR1cm4gc2NyaXB0OwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRLZXlib2FyZExheW91dE5hbWVGb3JTY3JpcHQoZmluYWwgaW50IHNjcmlwdCkgeworICAgICAgICBzd2l0Y2ggKHNjcmlwdCkgeworICAgICAgICBjYXNlIEFuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlLlNDUklQVF9MQVRJTjoKKyAgICAgICAgICAgIHJldHVybiAicXdlcnR5IjsKKyAgICAgICAgY2FzZSBBbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZS5TQ1JJUFRfQ1lSSUxMSUM6CisgICAgICAgICAgICByZXR1cm4gImVhc3Rfc2xhdmljIjsKKyAgICAgICAgY2FzZSBBbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZS5TQ1JJUFRfR1JFRUs6CisgICAgICAgICAgICByZXR1cm4gImdyZWVrIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcm9uZyBzY3JpcHQgc3VwcGxpZWQ6ICIgKyBzY3JpcHQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlZChmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcywgZmluYWwgU3RyaW5nIGtleSkgewogICAgICAgICBpZiAoIVBSRUZfVVNFX0NPTlRBQ1RTX0tFWS5lcXVhbHMoa2V5KSkgcmV0dXJuOwpAQCAtMTk4LDggKzIwNyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIFN1Z2dlc3Rpb25zR2F0aGVyZXIgbmV3U3VnZ2VzdGlvbnNHYXRoZXJlcihmaW5hbCBTdHJpbmcgdGV4dCwgaW50IG1heExlbmd0aCkgewotICAgICAgICByZXR1cm4gbmV3IFN1Z2dlc3Rpb25zR2F0aGVyZXIoCi0gICAgICAgICAgICAgICAgdGV4dCwgbVN1Z2dlc3Rpb25UaHJlc2hvbGQsIG1SZWNvbW1lbmRlZFRocmVzaG9sZCwgbWF4TGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWdnZXN0aW9uc0dhdGhlcmVyKHRleHQsIG1SZWNvbW1lbmRlZFRocmVzaG9sZCwgbWF4TGVuZ3RoKTsKICAgICB9CiAKICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBjbGFzcyBhbmQgcmVwbGFjZSBpdCBieSBzdG9yYWdlIGxvY2FsIHRvIHRoZSBzZXNzaW9uLgpAQCAtMjE3LDcgKzIyNSw2IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbVN1Z2dlc3Rpb25zOwogICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIG1TY29yZXM7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1PcmlnaW5hbFRleHQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbVN1Z2dlc3Rpb25UaHJlc2hvbGQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbVJlY29tbWVuZGVkVGhyZXNob2xkOwogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4TGVuZ3RoOwogICAgICAgICBwcml2YXRlIGludCBtTGVuZ3RoID0gMDsKQEAgLTIyNywxMCArMjM0LDkgQEAKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUJlc3RTdWdnZXN0aW9uID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUJlc3RTY29yZSA9IEludGVnZXIuTUlOX1ZBTFVFOyAvLyBBcyBzbWFsbCBhcyBwb3NzaWJsZQogCi0gICAgICAgIFN1Z2dlc3Rpb25zR2F0aGVyZXIoZmluYWwgU3RyaW5nIG9yaWdpbmFsVGV4dCwgZmluYWwgZmxvYXQgc3VnZ2VzdGlvblRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCByZWNvbW1lbmRlZFRocmVzaG9sZCwgZmluYWwgaW50IG1heExlbmd0aCkgeworICAgICAgICBTdWdnZXN0aW9uc0dhdGhlcmVyKGZpbmFsIFN0cmluZyBvcmlnaW5hbFRleHQsIGZpbmFsIGZsb2F0IHJlY29tbWVuZGVkVGhyZXNob2xkLAorICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXhMZW5ndGgpIHsKICAgICAgICAgICAgIG1PcmlnaW5hbFRleHQgPSBvcmlnaW5hbFRleHQ7Ci0gICAgICAgICAgICBtU3VnZ2VzdGlvblRocmVzaG9sZCA9IHN1Z2dlc3Rpb25UaHJlc2hvbGQ7CiAgICAgICAgICAgICBtUmVjb21tZW5kZWRUaHJlc2hvbGQgPSByZWNvbW1lbmRlZFRocmVzaG9sZDsKICAgICAgICAgICAgIG1NYXhMZW5ndGggPSBtYXhMZW5ndGg7CiAgICAgICAgICAgICBtU3VnZ2VzdGlvbnMgPSBDb2xsZWN0aW9uVXRpbHMubmV3QXJyYXlMaXN0KG1heExlbmd0aCArIDEpOwpAQCAtMzkyLDkgKzM5OCwxMyBAQAogICAgICAgICByZXR1cm4gcG9vbDsKICAgICB9CiAKLSAgICBwdWJsaWMgRGljdEFuZFByb3hpbWl0eSBjcmVhdGVEaWN0QW5kUHJveGltaXR5KGZpbmFsIExvY2FsZSBsb2NhbGUpIHsKKyAgICBwdWJsaWMgRGljdEFuZEtleWJvYXJkIGNyZWF0ZURpY3RBbmRLZXlib2FyZChmaW5hbCBMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGZpbmFsIGludCBzY3JpcHQgPSBnZXRTY3JpcHRGcm9tTG9jYWxlKGxvY2FsZSk7Ci0gICAgICAgIGZpbmFsIFByb3hpbWl0eUluZm8gcHJveGltaXR5SW5mbyA9IG5ldyBTcGVsbENoZWNrZXJQcm94aW1pdHlJbmZvKHNjcmlwdCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBrZXlib2FyZExheW91dE5hbWUgPSBnZXRLZXlib2FyZExheW91dE5hbWVGb3JTY3JpcHQoc2NyaXB0KTsKKyAgICAgICAgZmluYWwgS2V5Ym9hcmRMYXlvdXRTZXQga2V5Ym9hcmRMYXlvdXRTZXQgPQorICAgICAgICAgICAgICAgIEtleWJvYXJkTGF5b3V0U2V0LmNyZWF0ZUtleWJvYXJkU2V0Rm9yU3BlbGxDaGVja2VyKHRoaXMsIGxvY2FsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmRMYXlvdXROYW1lKTsKKwogICAgICAgICBmaW5hbCBEaWN0aW9uYXJ5Q29sbGVjdGlvbiBkaWN0aW9uYXJ5Q29sbGVjdGlvbiA9CiAgICAgICAgICAgICAgICAgRGljdGlvbmFyeUZhY3RvcnkuY3JlYXRlTWFpbkRpY3Rpb25hcnlGcm9tTWFuYWdlcih0aGlzLCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHVzZUZ1bGxFZGl0RGlzdGFuY2UgKi8pOwpAQCAtNDE5LDYgKzQyOSw2IEBACiAgICAgICAgICAgICBtRGljdGlvbmFyeUNvbGxlY3Rpb25zTGlzdC5hZGQoCiAgICAgICAgICAgICAgICAgICAgIG5ldyBXZWFrUmVmZXJlbmNlPERpY3Rpb25hcnlDb2xsZWN0aW9uPihkaWN0aW9uYXJ5Q29sbGVjdGlvbikpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRGljdEFuZFByb3hpbWl0eShkaWN0aW9uYXJ5Q29sbGVjdGlvbiwgcHJveGltaXR5SW5mbyk7CisgICAgICAgIHJldHVybiBuZXcgRGljdEFuZEtleWJvYXJkKGRpY3Rpb25hcnlDb2xsZWN0aW9uLCBrZXlib2FyZExheW91dFNldCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkV29yZExldmVsU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkV29yZExldmVsU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCmluZGV4IGRhODY1NzIuLjE2ZTlmYjcgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFdvcmRMZXZlbFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRXb3JkTGV2ZWxTcGVsbENoZWNrZXJTZXNzaW9uLmphdmEKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc2hvdWxkRmlsdGVyT3V0KGluVGV4dCwgbVNjcmlwdCkpIHsKLSAgICAgICAgICAgICAgICBEaWN0QW5kUHJveGltaXR5IGRpY3RJbmZvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBEaWN0QW5kS2V5Ym9hcmQgZGljdEluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGRpY3RJbmZvID0gbURpY3Rpb25hcnlQb29sLnBvbGxXaXRoRGVmYXVsdFRpbWVvdXQoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFEaWN0aW9uYXJ5UG9vbC5pc0FWYWxpZERpY3Rpb25hcnkoZGljdEluZm8pKSB7CkBAIC0yODMsMzIgKzI4MywyNiBAQAogICAgICAgICAgICAgLy9zdWdnZXN0aW9uc0xpbWl0KTsKICAgICAgICAgICAgIGZpbmFsIFN1Z2dlc3Rpb25zR2F0aGVyZXIgc3VnZ2VzdGlvbnNHYXRoZXJlciA9IG1TZXJ2aWNlLm5ld1N1Z2dlc3Rpb25zR2F0aGVyZXIoCiAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN1Z2dlc3Rpb25zTGltaXQpOwotICAgICAgICAgICAgZmluYWwgV29yZENvbXBvc2VyIGNvbXBvc2VyID0gbmV3IFdvcmRDb21wb3NlcigpOwotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHRleHQub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvZGVQb2ludCA9IHRleHQuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGdldFhZRm9yQ29kZVBvaW50QW5kU2NyaXB0IG1ldGhvZCByZXR1cm5zIChZIDw8IDE2KSArIFgKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeHkgPSBTcGVsbENoZWNrZXJQcm94aW1pdHlJbmZvLmdldFhZRm9yQ29kZVBvaW50QW5kU2NyaXB0KAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50LCBtU2NyaXB0KTsKLSAgICAgICAgICAgICAgICBpZiAoU3BlbGxDaGVja2VyUHJveGltaXR5SW5mby5OT1RfQV9DT09SRElOQVRFX1BBSVIgPT0geHkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zZXIuYWRkKGNvZGVQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTk9UX0FfQ09PUkRJTkFURSwgQ29uc3RhbnRzLk5PVF9BX0NPT1JESU5BVEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2VyLmFkZChjb2RlUG9pbnQsIHh5ICYgMHhGRkZGLCB4eSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBpbnQgY2FwaXRhbGl6ZVR5cGUgPSBTdHJpbmdVdGlscy5nZXRDYXBpdGFsaXphdGlvblR5cGUodGV4dCk7CiAgICAgICAgICAgICBib29sZWFuIGlzSW5EaWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIERpY3RBbmRQcm94aW1pdHkgZGljdEluZm8gPSBudWxsOworICAgICAgICAgICAgRGljdEFuZEtleWJvYXJkIGRpY3RJbmZvID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgZGljdEluZm8gPSBtRGljdGlvbmFyeVBvb2wucG9sbFdpdGhEZWZhdWx0VGltZW91dCgpOwogICAgICAgICAgICAgICAgIGlmICghRGljdGlvbmFyeVBvb2wuaXNBVmFsaWREaWN0aW9uYXJ5KGRpY3RJbmZvKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW5kcm9pZFNwZWxsQ2hlY2tlclNlcnZpY2UuZ2V0Tm90SW5EaWN0RW1wdHlTdWdnZXN0aW9ucygpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBXb3JkQ29tcG9zZXIgY29tcG9zZXIgPSBuZXcgV29yZENvbXBvc2VyKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB0ZXh0Lm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29kZVBvaW50ID0gdGV4dC5jb2RlUG9pbnRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9zZXIuYWRkS2V5SW5mbyhjb2RlUG9pbnQsIGRpY3RJbmZvLmdldEtleWJvYXJkKGNvZGVQb2ludCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIGEgc3BlbGwgY2hlY2tlciBvcHRpb24gdG8gYmxvY2sgb2ZmZW5zaXZlIHdvcmRzIG9yIG5vdAogICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdWdnZXN0ZWRXb3JkSW5mbz4gc3VnZ2VzdGlvbnMgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGljdEluZm8ubURpY3Rpb25hcnkuZ2V0U3VnZ2VzdGlvbnMoY29tcG9zZXIsIHByZXZXb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0SW5mby5tUHJveGltaXR5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RJbmZvLmdldFByb3hpbWl0eUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBibG9ja09mZmVuc2l2ZVdvcmRzICovKTsKICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN1Z2dlc3RlZFdvcmRJbmZvIHN1Z2dlc3Rpb24gOiBzdWdnZXN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3VnZ2VzdGlvblN0ciA9IHN1Z2dlc3Rpb24ubVdvcmQ7CiAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zR2F0aGVyZXIuYWRkV29yZChzdWdnZXN0aW9uU3RyLnRvQ2hhckFycmF5KCksIG51bGwsIDAsCmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0RpY3RBbmRLZXlib2FyZC5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9EaWN0QW5kS2V5Ym9hcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzdmM2UyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9EaWN0QW5kS2V5Ym9hcmQuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5zcGVsbGNoZWNrOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uRGljdGlvbmFyeTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5LZXlib2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5LZXlib2FyZElkOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkTGF5b3V0U2V0OworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLlByb3hpbWl0eUluZm87CisKKy8qKgorICogQSBjb250YWluZXIgZm9yIGEgRGljdGlvbmFyeSBhbmQgYSBLZXlib2FyZC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERpY3RBbmRLZXlib2FyZCB7CisgICAgcHVibGljIGZpbmFsIERpY3Rpb25hcnkgbURpY3Rpb25hcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBLZXlib2FyZCBtS2V5Ym9hcmQ7CisgICAgcHJpdmF0ZSBmaW5hbCBLZXlib2FyZCBtTWFudWFsU2hpZnRlZEtleWJvYXJkOworCisgICAgcHVibGljIERpY3RBbmRLZXlib2FyZCgKKyAgICAgICAgICAgIGZpbmFsIERpY3Rpb25hcnkgZGljdGlvbmFyeSwgZmluYWwgS2V5Ym9hcmRMYXlvdXRTZXQga2V5Ym9hcmRMYXlvdXRTZXQpIHsKKyAgICAgICAgbURpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5OworICAgICAgICBpZiAoa2V5Ym9hcmRMYXlvdXRTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgbUtleWJvYXJkID0gbnVsbDsKKyAgICAgICAgICAgIG1NYW51YWxTaGlmdGVkS2V5Ym9hcmQgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1LZXlib2FyZCA9IGtleWJvYXJkTGF5b3V0U2V0LmdldEtleWJvYXJkKEtleWJvYXJkSWQuRUxFTUVOVF9BTFBIQUJFVCk7CisgICAgICAgIG1NYW51YWxTaGlmdGVkS2V5Ym9hcmQgPQorICAgICAgICAgICAgICAgIGtleWJvYXJkTGF5b3V0U2V0LmdldEtleWJvYXJkKEtleWJvYXJkSWQuRUxFTUVOVF9BTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCk7CisgICAgfQorCisgICAgcHVibGljIEtleWJvYXJkIGdldEtleWJvYXJkKGZpbmFsIGludCBjb2RlUG9pbnQpIHsKKyAgICAgICAgaWYgKG1LZXlib2FyZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUtleWJvYXJkLmdldEtleShjb2RlUG9pbnQpICE9IG51bGwgPyBtS2V5Ym9hcmQgOiBtTWFudWFsU2hpZnRlZEtleWJvYXJkOworICAgIH0KKworICAgIHB1YmxpYyBQcm94aW1pdHlJbmZvIGdldFByb3hpbWl0eUluZm8oKSB7CisgICAgICAgIHJldHVybiBtS2V5Ym9hcmQgPT0gbnVsbCA/IG51bGwgOiBtS2V5Ym9hcmQuZ2V0UHJveGltaXR5SW5mbygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svRGljdEFuZFByb3hpbWl0eS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9EaWN0QW5kUHJveGltaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2E0ZjUuLjAwMDAwMDAKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9EaWN0QW5kUHJveGltaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5zcGVsbGNoZWNrOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uRGljdGlvbmFyeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5Qcm94aW1pdHlJbmZvOwotCi0vKioKLSAqIEEgc2ltcGxlIGNvbnRhaW5lciBmb3IgYm90aCBhIERpY3Rpb25hcnkgYW5kIGEgUHJveGltaXR5SW5mby4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpY3RBbmRQcm94aW1pdHkgewotICAgIHB1YmxpYyBmaW5hbCBEaWN0aW9uYXJ5IG1EaWN0aW9uYXJ5OwotICAgIHB1YmxpYyBmaW5hbCBQcm94aW1pdHlJbmZvIG1Qcm94aW1pdHlJbmZvOwotICAgIHB1YmxpYyBEaWN0QW5kUHJveGltaXR5KGZpbmFsIERpY3Rpb25hcnkgZGljdGlvbmFyeSwgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvKSB7Ci0gICAgICAgIG1EaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTsKLSAgICAgICAgbVByb3hpbWl0eUluZm8gPSBwcm94aW1pdHlJbmZvOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svRGljdGlvbmFyeVBvb2wuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svRGljdGlvbmFyeVBvb2wuamF2YQppbmRleCA4MWRkOTJkLi5hMjBlMDllIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0RpY3Rpb25hcnlQb29sLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9EaWN0aW9uYXJ5UG9vbC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAgKiB0aGUgY2xpZW50IGNvZGUsIGJ1dCBtYXkgaGVscCB3aXRoIHNsb3BweSBjbGllbnRzLgogICovCiBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5UG9vbCBleHRlbmRzIExpbmtlZEJsb2NraW5nUXVldWU8RGljdEFuZFByb3hpbWl0eT4geworcHVibGljIGZpbmFsIGNsYXNzIERpY3Rpb25hcnlQb29sIGV4dGVuZHMgTGlua2VkQmxvY2tpbmdRdWV1ZTxEaWN0QW5kS2V5Ym9hcmQ+IHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gRGljdGlvbmFyeVBvb2wuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIC8vIEhvdyBtYW55IHNlY29uZHMgd2Ugd2FpdCBmb3IgYSBkaWN0aW9uYXJ5IHRvIGJlY29tZSBhdmFpbGFibGUuIFBhc3QgdGhpcyBkZWxheSwgd2UgZ2l2ZSB1cCBpbgogICAgIC8vIGZlYXIgc29tZSBidWcgY2F1c2VkIGEgZGVhZGxvY2ssIGFuZCByZXNldCB0aGUgd2hvbGUgcG9vbC4KQEAgLTQ3LDExICs0NywxMiBAQAogICAgIHByaXZhdGUgaW50IG1TaXplOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtQ2xvc2VkOwogICAgIGZpbmFsIHN0YXRpYyBBcnJheUxpc3Q8U3VnZ2VzdGVkV29yZEluZm8+IG5vU3VnZ2VzdGlvbnMgPSBDb2xsZWN0aW9uVXRpbHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRGljdEFuZFByb3hpbWl0eSBkdW1teURpY3QgPSBuZXcgRGljdEFuZFByb3hpbWl0eSgKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBEaWN0QW5kS2V5Ym9hcmQgZHVtbXlEaWN0ID0gbmV3IERpY3RBbmRLZXlib2FyZCgKICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5KERpY3Rpb25hcnkuVFlQRV9NQUlOKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIEFycmF5TGlzdDxTdWdnZXN0ZWRXb3JkSW5mbz4gZ2V0U3VnZ2VzdGlvbnMoZmluYWwgV29yZENvbXBvc2VyIGNvbXBvc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBQcm94aW1pdHlJbmZvIHByb3hpbWl0eUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZCwgZmluYWwgUHJveGltaXR5SW5mbyBwcm94aW1pdHlJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBibG9ja09mZmVuc2l2ZVdvcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub1N1Z2dlc3Rpb25zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTYzLDcgKzY0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBudWxsKTsKIAotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0FWYWxpZERpY3Rpb25hcnkoZmluYWwgRGljdEFuZFByb3hpbWl0eSBkaWN0SW5mbykgeworICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0FWYWxpZERpY3Rpb25hcnkoZmluYWwgRGljdEFuZEtleWJvYXJkIGRpY3RJbmZvKSB7CiAgICAgICAgIHJldHVybiBudWxsICE9IGRpY3RJbmZvICYmIGR1bW15RGljdCAhPSBkaWN0SW5mbzsKICAgICB9CiAKQEAgLTc4LDMyICs3OSwzMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaWN0QW5kUHJveGltaXR5IHBvbGwoZmluYWwgbG9uZyB0aW1lb3V0LCBmaW5hbCBUaW1lVW5pdCB1bml0KQorICAgIHB1YmxpYyBEaWN0QW5kS2V5Ym9hcmQgcG9sbChmaW5hbCBsb25nIHRpbWVvdXQsIGZpbmFsIFRpbWVVbml0IHVuaXQpCiAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBEaWN0QW5kUHJveGltaXR5IGRpY3QgPSBwb2xsKCk7CisgICAgICAgIGZpbmFsIERpY3RBbmRLZXlib2FyZCBkaWN0ID0gcG9sbCgpOwogICAgICAgICBpZiAobnVsbCAhPSBkaWN0KSByZXR1cm4gZGljdDsKICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtU2l6ZSA+PSBtTWF4U2l6ZSkgewogICAgICAgICAgICAgICAgIC8vIE91ciBwb29sIGlzIGFscmVhZHkgZnVsbC4gV2FpdCB1bnRpbCBzb21lIGRpY3Rpb25hcnkgaXMgcmVhZHksIG9yIFRJTUVPVVQKICAgICAgICAgICAgICAgICAvLyBleHBpcmVzIHRvIGF2b2lkIGEgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgZmluYWwgRGljdEFuZFByb3hpbWl0eSByZXN1bHQgPSBzdXBlci5wb2xsKHRpbWVvdXQsIHVuaXQpOworICAgICAgICAgICAgICAgIGZpbmFsIERpY3RBbmRLZXlib2FyZCByZXN1bHQgPSBzdXBlci5wb2xsKHRpbWVvdXQsIHVuaXQpOwogICAgICAgICAgICAgICAgIGlmIChudWxsID09IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEZWFkbG9jayBkZXRlY3RlZCAhIFJlc2V0dGluZyBkaWN0aW9uYXJ5IHBvb2wiKTsKICAgICAgICAgICAgICAgICAgICAgY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgbVNpemUgPSAxOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY3JlYXRlRGljdEFuZFByb3hpbWl0eShtTG9jYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNyZWF0ZURpY3RBbmRLZXlib2FyZChtTG9jYWxlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKyttU2l6ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY3JlYXRlRGljdEFuZFByb3hpbWl0eShtTG9jYWxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY3JlYXRlRGljdEFuZEtleWJvYXJkKG1Mb2NhbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kCi0gICAgcHVibGljIERpY3RBbmRQcm94aW1pdHkgcG9sbFdpdGhEZWZhdWx0VGltZW91dCgpIHsKKyAgICBwdWJsaWMgRGljdEFuZEtleWJvYXJkIHBvbGxXaXRoRGVmYXVsdFRpbWVvdXQoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gcG9sbChUSU1FT1VULCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewpAQCAtMTE0LDcgKzExNSw3IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAgICAgICBtQ2xvc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoRGljdEFuZFByb3hpbWl0eSBkaWN0IDogdGhpcykgeworICAgICAgICAgICAgZm9yIChEaWN0QW5kS2V5Ym9hcmQgZGljdCA6IHRoaXMpIHsKICAgICAgICAgICAgICAgICBkaWN0Lm1EaWN0aW9uYXJ5LmNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhcigpOwpAQCAtMTIyLDcgKzEyMyw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoZmluYWwgRGljdEFuZFByb3hpbWl0eSBkaWN0KSB7CisgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoZmluYWwgRGljdEFuZEtleWJvYXJkIGRpY3QpIHsKICAgICAgICAgaWYgKG1DbG9zZWQpIHsKICAgICAgICAgICAgIGRpY3QubURpY3Rpb25hcnkuY2xvc2UoKTsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5vZmZlcihkdW1teURpY3QpOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9TcGVsbENoZWNrZXJQcm94aW1pdHlJbmZvLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL1NwZWxsQ2hlY2tlclByb3hpbWl0eUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0ODBlYS4uMDAwMDAwMAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL1NwZWxsQ2hlY2tlclByb3hpbWl0eUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5zcGVsbGNoZWNrOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuUHJveGltaXR5SW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5Db25zdGFudHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTcGVsbENoZWNrZXJQcm94aW1pdHlJbmZvIGV4dGVuZHMgUHJveGltaXR5SW5mbyB7Ci0gICAgcHVibGljIFNwZWxsQ2hlY2tlclByb3hpbWl0eUluZm8oZmluYWwgaW50IHNjcmlwdCkgewotICAgICAgICBzdXBlcihnZXRQcm94aW1pdHlGb3JTY3JpcHQoc2NyaXB0KSwgUFJPWElNSVRZX0dSSURfV0lEVEgsIFBST1hJTUlUWV9HUklEX0hFSUdIVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTCA9IENvbnN0YW50cy5OT1RfQV9DT0RFOwotCi0gICAgLy8gVGhpcyBtdXN0IGJlIHRoZSBzYW1lIGFzIE1BWF9QUk9YSU1JVFlfQ0hBUlNfU0laRSBlbHNlIGl0IHdpbGwgbm90IHdvcmsgaW5zaWRlCi0gICAgLy8gbmF0aXZlIGNvZGUgLSB0aGlzIHZhbHVlIGlzIHBhc3NlZCBhdCBjcmVhdGlvbiBvZiB0aGUgYmluYXJ5IG9iamVjdCBhbmQgcmV1c2VkCi0gICAgLy8gYXMgdGhlIHNpemUgb2YgdGhlIHBhc3NlZCBhcnJheSBhZnRlcndhcmRzIHNvIHRoZXkgY2FuJ3QgYmUgZGlmZmVyZW50LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dfU0laRSA9IFByb3hpbWl0eUluZm8uTUFYX1BST1hJTUlUWV9DSEFSU19TSVpFOwotCi0gICAgLy8gVGhlIG51bWJlciBvZiBrZXlzIGluIGEgcm93IG9mIHRoZSBncmlkIHVzZWQgYnkgdGhlIHNwZWxsIGNoZWNrZXIuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1hJTUlUWV9HUklEX1dJRFRIID0gMTE7Ci0gICAgLy8gVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBncmlkIHVzZWQgYnkgdGhlIHNwZWxsIGNoZWNrZXIuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1hJTUlUWV9HUklEX0hFSUdIVCA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FOX0lOREVYID0gLTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FfQ09PUkRJTkFURV9QQUlSID0gLTE7Ci0KLSAgICAvLyBIZWxwZXIgbWV0aG9kcwotICAgIHN0YXRpYyB2b2lkIGJ1aWxkUHJveGltaXR5SW5kaWNlcyhmaW5hbCBpbnRbXSBwcm94aW1pdHksIGZpbmFsIGludCByb3dTaXplLAotICAgICAgICAgICAgZmluYWwgU3BhcnNlSW50QXJyYXkgaW5kaWNlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3hpbWl0eS5sZW5ndGg7IGkgKz0gcm93U2l6ZSkgewotICAgICAgICAgICAgaWYgKE5VTCAhPSBwcm94aW1pdHlbaV0pIGluZGljZXMucHV0KHByb3hpbWl0eVtpXSwgaSAvIHJvd1NpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTGF0aW4gewotICAgICAgICAvLyBUaGUgcHJveGltaXR5IGhlcmUgaXMgdGhlIHVuaW9uIG9mCi0gICAgICAgIC8vIC0gdGhlIHByb3hpbWl0eSBmb3IgYSBRV0VSVFkga2V5Ym9hcmQuCi0gICAgICAgIC8vIC0gdGhlIHByb3hpbWl0eSBmb3IgYW4gQVpFUlRZIGtleWJvYXJkLgotICAgICAgICAvLyAtIHRoZSBwcm94aW1pdHkgZm9yIGEgUVdFUlRaIGtleWJvYXJkLgotICAgICAgICAvLyAuLi5wbHVzLCBhZGQgYWxsIGNoYXJhY3RlcnMgaW4gdGhlICgnYScsICdlJywgJ2knLCAnbycsICd1Jykgc2V0IHRvIGVhY2ggb3RoZXIuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgY29uc3RydWN0aW9uIGlzLCBhbG1vc3QgYW55IGFscGhhYmV0aWMgdGV4dCB3ZSBtYXkgd2FudAotICAgICAgICAvLyB0byBzcGVsbCBjaGVjayBoYXMgYmVlbiBlbnRlcmVkIHdpdGggb25lIG9mIHRoZSBrZXlib2FyZHMgYWJvdmUuIEFsc28sIHNwZWNpZmljYWxseQotICAgICAgICAvLyB0byBFbmdsaXNoLCBtYW55IHNwZWxsaW5nIGVycm9ycyBjb25zaXN0IG9mIHRoZSBsYXN0IHZvd2VsIG9mIHRoZSB3b3JkIGJlaW5nIHdyb25nCi0gICAgICAgIC8vIGJlY2F1c2UgaW4gRW5nbGlzaCB2b3dlbHMgdGVuZCB0byBtZXJnZSB3aXRoIGVhY2ggb3RoZXIgaW4gcHJvbnVuY2lhdGlvbi4KLSAgICAgICAgLyoKLSAgICAgICAgVGhlIFF3ZXJ0eSBsYXlvdXQgdGhpcyByZXByZXNlbnRzIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICAgIHEgdyBlIHIgdCB5IHUgaSBvIHAKLSAgICAgICAgICAgICBhIHMgZCBmIGcgaCBqIGsgbAotICAgICAgICAgICAgICAgeiB4IGMgdiBiIG4gbQotICAgICAgICAqLwotICAgICAgICBzdGF0aWMgZmluYWwgaW50W10gUFJPWElNSVRZID0gewotICAgICAgICAgICAgLy8gUHJveGltaXR5IGZvciByb3cgMS4gVGhpcyBtdXN0IGhhdmUgZXhhY3RseSBST1dfU0laRSBlbnRyaWVzIGZvciBlYWNoIGxldHRlciwKLSAgICAgICAgICAgIC8vIGFuZCBleGFjdGx5IFBST1hJTUlUWV9HUklEX1dJRFRIIGxldHRlcnMgZm9yIGEgcm93LiBQYWQgd2l0aCBOVUwncy4KLSAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2Ygcm93cyBtdXN0IGJlIGV4YWN0bHkgUFJPWElNSVRZX0dSSURfSEVJR0hULgotICAgICAgICAgICAgJ3EnLCAndycsICdzJywgJ2EnLCAneicsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3cnLCAncScsICdhJywgJ3MnLCAnZCcsICdlJywgJ3gnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2UnLCAndycsICdzJywgJ2QnLCAnZicsICdyJywgJ2EnLCAnaScsICdvJywgJ3UnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3InLCAnZScsICdkJywgJ2YnLCAnZycsICd0JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3QnLCAncicsICdmJywgJ2cnLCAnaCcsICd5JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3knLCAndCcsICdnJywgJ2gnLCAnaicsICd1JywgJ2EnLCAncycsICdkJywgJ3gnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3UnLCAneScsICdoJywgJ2onLCAnaycsICdpJywgJ2EnLCAnZScsICdvJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2knLCAndScsICdqJywgJ2snLCAnbCcsICdvJywgJ2EnLCAnZScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ28nLCAnaScsICdrJywgJ2wnLCAncCcsICdhJywgJ2UnLCAndScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3AnLCAnbycsICdsJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotCi0gICAgICAgICAgICAvLyBQcm94aW1pdHkgZm9yIHJvdyAyLiBTZWUgY29tbWVudCBhYm92ZSBhYm91dCBzaXplLgotICAgICAgICAgICAgJ2EnLCAneicsICd4JywgJ3MnLCAndycsICdxJywgJ2UnLCAnaScsICdvJywgJ3UnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3MnLCAncScsICdhJywgJ3onLCAneCcsICdjJywgJ2QnLCAnZScsICd3JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2QnLCAndycsICdzJywgJ3gnLCAnYycsICd2JywgJ2YnLCAncicsICdlJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2YnLCAnZScsICdkJywgJ2MnLCAndicsICdiJywgJ2cnLCAndCcsICdyJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2cnLCAncicsICdmJywgJ3YnLCAnYicsICduJywgJ2gnLCAneScsICd0JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2gnLCAndCcsICdnJywgJ2InLCAnbicsICdtJywgJ2onLCAndScsICd5JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2onLCAneScsICdoJywgJ24nLCAnbScsICdrJywgJ2knLCAndScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2snLCAndScsICdqJywgJ20nLCAnbCcsICdvJywgJ2knLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2wnLCAnaScsICdrJywgJ3AnLCAnbycsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotCi0gICAgICAgICAgICAvLyBQcm94aW1pdHkgZm9yIHJvdyAzLiBTZWUgY29tbWVudCBhYm92ZSBhYm91dCBzaXplLgotICAgICAgICAgICAgJ3onLCAnYScsICdzJywgJ2QnLCAneCcsICd0JywgJ2cnLCAnaCcsICdqJywgJ3UnLCAncScsICdlJywgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3gnLCAneicsICdhJywgJ3MnLCAnZCcsICdjJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2MnLCAneCcsICdzJywgJ2QnLCAnZicsICd2JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ3YnLCAnYycsICdkJywgJ2YnLCAnZycsICdiJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ2InLCAndicsICdmJywgJ2cnLCAnaCcsICduJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ24nLCAnYicsICdnJywgJ2gnLCAnaicsICdtJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ20nLCAnbicsICdoJywgJ2onLCAnaycsICdsJywgJ28nLCAncCcsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICB9OwotCi0gICAgICAgIC8vIFRoaXMgaXMgYSBtYXBwaW5nIGFycmF5IGZyb20gdGhlIGNvZGUgcG9pbnQgdG8gdGhlIGluZGV4IGluIHRoZSBQUk9YSU1JVFkgYXJyYXkuCi0gICAgICAgIC8vIFdoZW4gd2UgY2hlY2sgdGhlIHNwZWxsaW5nIG9mIGEgd29yZCwgd2UgbmVlZCB0byBwYXNzICh4LHkpIGNvb3JkaW5hdGVzIHRvIHRoZSBuYXRpdmUKLSAgICAgICAgLy8gY29kZSBmb3IgZWFjaCBsZXR0ZXIgb2YgdGhlIHdvcmQuIFRoZXNlIGFyZSBtb3N0IGVhc2lseSBjb21wdXRlZCBmcm9tIHRoZSBpbmRleCBpbiB0aGUKLSAgICAgICAgLy8gUFJPWElNSVRZIGFycmF5LiBTaW5jZSB3ZSdsbCBuZWVkIHRvIGRvIHRoYXQgdmVyeSBvZnRlbiwgdGhlIGluZGV4IGxvb2t1cCBmcm9tIHRoZSBjb2RlCi0gICAgICAgIC8vIHBvaW50IG5lZWRzIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUsIGFuZCBhIG1hcCBpcyBwcm9iYWJseSB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcy4KLSAgICAgICAgLy8gVG8gYXZvaWQgdW5uZWNlc3NhcnkgYm94aW5nIGNvbnZlcnNpb24gdG8gSW50ZWdlciwgaGVyZSB3ZSB1c2UgU3BhcnNlSW50QXJyYXkuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTcGFyc2VJbnRBcnJheSBJTkRJQ0VTID0gbmV3IFNwYXJzZUludEFycmF5KFBST1hJTUlUWS5sZW5ndGggLyBST1dfU0laRSk7Ci0KLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIGJ1aWxkUHJveGltaXR5SW5kaWNlcyhQUk9YSU1JVFksIFJPV19TSVpFLCBJTkRJQ0VTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEN5cmlsbGljIHsKLSAgICAgICAgLy8gVE9ETzogVGhlIGZvbGxvd2luZyB0YWJsZSBpcyBzb2xlbHkgYmFzZWQgb24gdGhlIGtleWJvYXJkIGxheW91dC4gQ29uc3VsdCB3aXRoIFJ1c3NpYW4KLSAgICAgICAgLy8gc3BlYWtlcnMgb24gY29tbW9ubHkgbWlzc3BlbGxlZCB3b3Jkcy9sZXR0ZXJzLgotICAgICAgICAvKgotICAgICAgICBUaGUgUnVzc2lhbiBsYXlvdXQgdGhpcyByZXByZXNlbnRzIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICAgINC5INGGINGDINC6INC1INC9INCzINGIINGJINC3INGFCi0gICAgICAgICAgICDRhCDRiyDQsiDQsCDQvyDRgCDQviDQuyDQtCDQtiDRjQotICAgICAgICAgICAgICDRjyDRhyDRgSDQvCDQuCDRgiDRjCDQsSDRjgotCi0gICAgICAgIFRoaXMgZ2l2ZXMgdXMgdGhlIGZvbGxvd2luZyB0YWJsZToKLSAgICAgICAgICAgICfQuScsICfRhicsICfRhCcsICfRiycsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0YYnLCAn0LknLCAn0YQnLCAn0YsnLCAn0LInLCAn0YMnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0YMnLCAn0YYnLCAn0YsnLCAn0LInLCAn0LAnLCAn0LonLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0LonLCAn0YMnLCAn0LInLCAn0LAnLCAn0L8nLCAn0LUnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0LUnLCAn0LonLCAn0LAnLCAn0L8nLCAn0YAnLCAn0L0nLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0L0nLCAn0LUnLCAn0L8nLCAn0YAnLCAn0L4nLCAn0LMnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0LMnLCAn0L0nLCAn0YAnLCAn0L4nLCAn0LsnLCAn0YgnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0YgnLCAn0LMnLCAn0L4nLCAn0LsnLCAn0LQnLCAn0YknLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0YknLCAn0YgnLCAn0LsnLCAn0LQnLCAn0LYnLCAn0LcnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0LcnLCAn0YknLCAn0LQnLCAn0LYnLCAn0Y0nLCAn0YUnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0YUnLCAn0LcnLCAn0LYnLCAn0Y0nLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotCi0gICAgICAgICAgICAn0YQnLCAn0LknLCAn0YYnLCAn0YsnLCAn0Y8nLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfRiycsICfQuScsICfRhicsICfRgycsICfRhCcsICfQsicsICfRjycsICfRhycsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9CyJywgJ9GGJywgJ9GDJywgJ9C6JywgJ9GLJywgJ9CwJywgJ9GPJywgJ9GHJywgJ9GBJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9CwJywgJ9GDJywgJ9C6JywgJ9C1JywgJ9CyJywgJ9C/JywgJ9GHJywgJ9GBJywgJ9C8JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9C/JywgJ9C6JywgJ9C1JywgJ9C9JywgJ9CwJywgJ9GAJywgJ9GBJywgJ9C8JywgJ9C4JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9GAJywgJ9C1JywgJ9C9JywgJ9CzJywgJ9C/JywgJ9C+JywgJ9C8JywgJ9C4JywgJ9GCJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9C+JywgJ9C9JywgJ9CzJywgJ9GIJywgJ9GAJywgJ9C7JywgJ9C4JywgJ9GCJywgJ9GMJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9C7JywgJ9CzJywgJ9GIJywgJ9GJJywgJ9C+JywgJ9C0JywgJ9GCJywgJ9GMJywgJ9CxJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9C0JywgJ9GIJywgJ9GJJywgJ9C3JywgJ9C7JywgJ9C2JywgJ9GMJywgJ9CxJywgJ9GOJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ9C2JywgJ9GJJywgJ9C3JywgJ9GFJywgJ9C0JywgJ9GNJywgJ9CxJywgJ9GOJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAn0Y0nLCAn0LcnLCAn0YUnLCAn0Y4nLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotCi0gICAgICAgICAgICAn0Y8nLCAn0YQnLCAn0YsnLCAn0LInLCAn0YcnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfRhycsICfRiycsICfQsicsICfQsCcsICfRjycsICfRgScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfRgScsICfQsicsICfQsCcsICfQvycsICfRhycsICfQvCcsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfQvCcsICfQsCcsICfQvycsICfRgCcsICfRgScsICfQuCcsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfQuCcsICfQvycsICfRgCcsICfQvicsICfQvCcsICfRgicsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfRgicsICfRgCcsICfQvicsICfQuycsICfQuCcsICfRjCcsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfRjCcsICfQvicsICfQuycsICfQtCcsICfRgicsICfQsScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfQsScsICfQuycsICfQtCcsICfQticsICfRjCcsICfRjicsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfRjicsICfQtCcsICfQticsICfRjScsICfQsScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotCi0gICAgICAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLSAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX1NIT1JUX0kgPSAnXHUwNDM5JzsgLy8g0LkKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX1RTRSA9ICdcdTA0NDYnOyAvLyDRhgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfVSA9ICdcdTA0NDMnOyAvLyDRgwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfS0EgPSAnXHUwNDNBJzsgLy8g0LoKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX0lFID0gJ1x1MDQzNSc7IC8vINC1Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9FTiA9ICdcdTA0M0QnOyAvLyDQvQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfR0hFID0gJ1x1MDQzMyc7IC8vINCzCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9TSEEgPSAnXHUwNDQ4JzsgLy8g0YgKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX1NIQ0hBID0gJ1x1MDQ0OSc7IC8vINGJCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9aRSA9ICdcdTA0MzcnOyAvLyDQtwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfSEEgPSAnXHUwNDQ1JzsgLy8g0YUKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX0VGID0gJ1x1MDQ0NCc7IC8vINGECi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9ZRVJVID0gJ1x1MDQ0Qic7IC8vINGLCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9WRSA9ICdcdTA0MzInOyAvLyDQsgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfQSA9ICdcdTA0MzAnOyAvLyDQsAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfUEUgPSAnXHUwNDNGJzsgLy8g0L8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX0VSID0gJ1x1MDQ0MCc7IC8vINGACi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9PID0gJ1x1MDQzRSc7IC8vINC+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9FTCA9ICdcdTA0M0InOyAvLyDQuwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfREUgPSAnXHUwNDM0JzsgLy8g0LQKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX1pIRSA9ICdcdTA0MzYnOyAvLyDQtgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfRSA9ICdcdTA0NEQnOyAvLyDRjQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfWUEgPSAnXHUwNDRGJzsgLy8g0Y8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX0NIRSA9ICdcdTA0NDcnOyAvLyDRhwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfRVMgPSAnXHUwNDQxJzsgLy8g0YEKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZX0VNID0gJ1x1MDQzQyc7IC8vINC8Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9JID0gJ1x1MDQzOCc7IC8vINC4Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9URSA9ICdcdTA0NDInOyAvLyDRggotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfU09GVF9TSUdOID0gJ1x1MDQ0Qyc7IC8vINGMCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWV9CRSA9ICdcdTA0MzEnOyAvLyDQsQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lfWVUgPSAnXHUwNDRFJzsgLy8g0Y4KLSAgICAgICAgc3RhdGljIGZpbmFsIGludFtdIFBST1hJTUlUWSA9IHsKLSAgICAgICAgICAgIC8vIFByb3hpbWl0eSBmb3Igcm93IDEuIFRoaXMgbXVzdCBoYXZlIGV4YWN0bHkgUk9XX1NJWkUgZW50cmllcyBmb3IgZWFjaCBsZXR0ZXIsCi0gICAgICAgICAgICAvLyBhbmQgZXhhY3RseSBQUk9YSU1JVFlfR1JJRF9XSURUSCBsZXR0ZXJzIGZvciBhIHJvdy4gUGFkIHdpdGggTlVMJ3MuCi0gICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHJvd3MgbXVzdCBiZSBleGFjdGx5IFBST1hJTUlUWV9HUklEX0hFSUdIVC4KLSAgICAgICAgICAgIENZX1NIT1JUX0ksIENZX1RTRSwgQ1lfRUYsIENZX1lFUlUsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9UU0UsIENZX1NIT1JUX0ksIENZX0VGLCBDWV9ZRVJVLCBDWV9WRSwgQ1lfVSwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfVSwgQ1lfVFNFLCBDWV9ZRVJVLCBDWV9WRSwgQ1lfQSwgQ1lfS0EsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX0tBLCBDWV9VLCBDWV9WRSwgQ1lfQSwgQ1lfUEUsIENZX0lFLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9JRSwgQ1lfS0EsIENZX0EsIENZX1BFLCBDWV9FUiwgQ1lfRU4sIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX0VOLCBDWV9JRSwgQ1lfUEUsIENZX0VSLCBDWV9PLCBDWV9HSEUsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX0dIRSwgQ1lfRU4sIENZX0VSLCBDWV9PLCBDWV9FTCwgQ1lfU0hBLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9TSEEsIENZX0dIRSwgQ1lfTywgQ1lfRUwsIENZX0RFLCBDWV9TSENIQSwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfU0hDSEEsIENZX1NIQSwgQ1lfRUwsIENZX0RFLCBDWV9aSEUsIENZX1pFLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9aRSwgQ1lfU0hDSEEsIENZX0RFLCBDWV9aSEUsIENZX0UsIENZX0hBLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9IQSwgQ1lfWkUsIENZX1pIRSwgQ1lfRSwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLQotICAgICAgICAgICAgLy8gUHJveGltaXR5IGZvciByb3cgMi4gU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgc2l6ZS4KLSAgICAgICAgICAgIENZX0VGLCBDWV9TSE9SVF9JLCBDWV9UU0UsIENZX1lFUlUsIENZX1lBLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX1lFUlUsIENZX1NIT1JUX0ksIENZX1RTRSwgQ1lfVSwgQ1lfRUYsIENZX1ZFLCBDWV9ZQSwgQ1lfQ0hFLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX1ZFLCBDWV9UU0UsIENZX1UsIENZX0tBLCBDWV9ZRVJVLCBDWV9BLCBDWV9ZQSwgQ1lfQ0hFLAotICAgICAgICAgICAgICAgICAgICBDWV9FUywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfQSwgQ1lfVSwgQ1lfS0EsIENZX0lFLCBDWV9WRSwgQ1lfUEUsIENZX0NIRSwgQ1lfRVMsCi0gICAgICAgICAgICAgICAgICAgIENZX0VNLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9QRSwgQ1lfS0EsIENZX0lFLCBDWV9FTiwgQ1lfQSwgQ1lfRVIsIENZX0VTLCBDWV9FTSwKLSAgICAgICAgICAgICAgICAgICAgQ1lfSSwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfRVIsIENZX0lFLCBDWV9FTiwgQ1lfR0hFLCBDWV9QRSwgQ1lfTywgQ1lfRU0sIENZX0ksCi0gICAgICAgICAgICAgICAgICAgIENZX1RFLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9PLCBDWV9FTiwgQ1lfR0hFLCBDWV9TSEEsIENZX0VSLCBDWV9FTCwgQ1lfSSwgQ1lfVEUsCi0gICAgICAgICAgICAgICAgICAgIENZX1NPRlRfU0lHTiwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfRUwsIENZX0dIRSwgQ1lfU0hBLCBDWV9TSENIQSwgQ1lfTywgQ1lfREUsIENZX1RFLCBDWV9TT0ZUX1NJR04sCi0gICAgICAgICAgICAgICAgICAgIENZX0JFLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9ERSwgQ1lfU0hBLCBDWV9TSENIQSwgQ1lfWkUsIENZX0VMLCBDWV9aSEUsIENZX1NPRlRfU0lHTiwgQ1lfQkUsCi0gICAgICAgICAgICAgICAgICAgIENZX1lVLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9aSEUsIENZX1NIQ0hBLCBDWV9aRSwgQ1lfSEEsIENZX0RFLCBDWV9FLCBDWV9CRSwgQ1lfWVUsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfRSwgQ1lfWkUsIENZX0hBLCBDWV9ZVSwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLQotICAgICAgICAgICAgLy8gUHJveGltaXR5IGZvciByb3cgMy4gU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgc2l6ZS4KLSAgICAgICAgICAgIENZX1lBLCBDWV9FRiwgQ1lfWUVSVSwgQ1lfVkUsIENZX0NIRSwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9DSEUsIENZX1lFUlUsIENZX1ZFLCBDWV9BLCBDWV9ZQSwgQ1lfRVMsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX0VTLCBDWV9WRSwgQ1lfQSwgQ1lfUEUsIENZX0NIRSwgQ1lfRU0sIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX0VNLCBDWV9BLCBDWV9QRSwgQ1lfRVIsIENZX0VTLCBDWV9JLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9JLCBDWV9QRSwgQ1lfRVIsIENZX08sIENZX0VNLCBDWV9URSwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgQ1lfVEUsIENZX0VSLCBDWV9PLCBDWV9FTCwgQ1lfSSwgQ1lfU09GVF9TSUdOLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9TT0ZUX1NJR04sIENZX08sIENZX0VMLCBDWV9ERSwgQ1lfVEUsIENZX0JFLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBDWV9CRSwgQ1lfRUwsIENZX0RFLCBDWV9aSEUsIENZX1NPRlRfU0lHTiwgQ1lfWVUsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIENZX1lVLCBDWV9ERSwgQ1lfWkhFLCBDWV9FLCBDWV9CRSwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFNwYXJzZUludEFycmF5IElORElDRVMgPSBuZXcgU3BhcnNlSW50QXJyYXkoUFJPWElNSVRZLmxlbmd0aCAvIFJPV19TSVpFKTsKLQotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgYnVpbGRQcm94aW1pdHlJbmRpY2VzKFBST1hJTUlUWSwgUk9XX1NJWkUsIElORElDRVMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgR3JlZWsgewotICAgICAgICAvLyBUT0RPOiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHNvbGVseSBiYXNlZCBvbiB0aGUga2V5Ym9hcmQgbGF5b3V0LiBDb25zdWx0IHdpdGggR3JlZWsKLSAgICAgICAgLy8gc3BlYWtlcnMgb24gY29tbW9ubHkgbWlzc3BlbGxlZCB3b3Jkcy9sZXR0ZXJzLgotICAgICAgICAvKgotICAgICAgICBUaGUgR3JlZWsgbGF5b3V0IHRoaXMgcmVwcmVzZW50cyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAgICA7IM+CIM61IM+BIM+EIM+FIM64IM65IM6/IM+ACi0gICAgICAgICAgICAgzrEgz4MgzrQgz4YgzrMgzrcgzr4gzrogzrsKLSAgICAgICAgICAgICAgIM62IM+HIM+IIM+JIM6yIM69IM68Ci0KLSAgICAgICAgVGhpcyBnaXZlcyB1cyB0aGUgZm9sbG93aW5nIHRhYmxlOgotICAgICAgICAgICAgJ8+CJywgJ861JywgJ86xJywgJ8+DJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfOtScsICfPgicsICfPgScsICfPgycsICfOtCcsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+BJywgJ861JywgJ8+EJywgJ860JywgJ8+GJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAnz4QnLCAnz4EnLCAnz4UnLCAnz4YnLCAnzrMnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfPhScsICfPhCcsICfOuCcsICfOsycsICfOtycsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ864JywgJ8+FJywgJ865JywgJ863JywgJ86+JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAnzrknLCAnzrgnLCAnzr8nLCAnzr4nLCAnzronLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfOvycsICfOuScsICfPgCcsICfOuicsICfOuycsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+AJywgJ86/JywgJ867JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotCi0gICAgICAgICAgICAnzrEnLCAnz4InLCAnz4MnLCAnzrYnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+DJywgJ8+CJywgJ861JywgJ86xJywgJ860JywgJ862JywgJ8+HJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfOtCcsICfOtScsICfPgScsICfPgycsICfPhicsICfOticsICfPhycsICfPiCcsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+GJywgJ8+BJywgJ8+EJywgJ860JywgJ86zJywgJ8+HJywgJ8+IJywgJ8+JJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAnzrMnLCAnz4QnLCAnz4UnLCAnz4YnLCAnzrcnLCAnz4gnLCAnz4knLCAnzrInLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICfOtycsICfPhScsICfOuCcsICfOsycsICfOvicsICfPiScsICfOsicsICfOvScsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ86+JywgJ864JywgJ865JywgJ863JywgJ866JywgJ86yJywgJ869JywgJ868JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAnzronLCAnzrknLCAnzr8nLCAnzr4nLCAnzrsnLCAnzr0nLCAnzrwnLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ867JywgJ86/JywgJ8+AJywgJ866JywgJ868JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0KLSAgICAgICAgICAgICfOticsICfOsScsICfPgycsICfOtCcsICfPhycsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+HJywgJ8+DJywgJ860JywgJ8+GJywgJ862JywgJ8+IJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+IJywgJ860JywgJ8+GJywgJ86zJywgJ8+HJywgJ8+JJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ8+JJywgJ8+GJywgJ86zJywgJ863JywgJ8+IJywgJ86yJywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ86yJywgJ86zJywgJ863JywgJ86+JywgJ8+JJywgJ869JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ869JywgJ863JywgJ86+JywgJ866JywgJ86yJywgJ868JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgJ868JywgJ86+JywgJ866JywgJ867JywgJ869JywgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0KLSAgICAgICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgotICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfRklOQUxfU0lHTUEgPSAnXHUwM0MyJzsgLy8gz4IKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX0VQU0lMT04gPSAnXHUwM0I1JzsgLy8gzrUKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX1JITyA9ICdcdTAzQzEnOyAvLyDPgQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfVEFVID0gJ1x1MDNDNCc7IC8vIM+ECi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9VUFNJTE9OID0gJ1x1MDNDNSc7IC8vIM+FCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9USEVUQSA9ICdcdTAzQjgnOyAvLyDOuAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfSU9UQSA9ICdcdTAzQjknOyAvLyDOuQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfT01JQ1JPTiA9ICdcdTAzQkYnOyAvLyDOvwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfUEkgPSAnXHUwM0MwJzsgLy8gz4AKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX0FMUEhBID0gJ1x1MDNCMSc7IC8vIM6xCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9TSUdNQSA9ICdcdTAzQzMnOyAvLyDPgwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfREVMVEEgPSAnXHUwM0I0JzsgLy8gzrQKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX1BISSA9ICdcdTAzQzYnOyAvLyDPhgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfR0FNTUEgPSAnXHUwM0IzJzsgLy8gzrMKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX0VUQSA9ICdcdTAzQjcnOyAvLyDOtwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfWEkgPSAnXHUwM0JFJzsgLy8gzr4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX0tBUFBBID0gJ1x1MDNCQSc7IC8vIM66Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9MQU1EQSA9ICdcdTAzQkInOyAvLyDOuwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfWkVUQSA9ICdcdTAzQjYnOyAvLyDOtgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfQ0hJID0gJ1x1MDNDNyc7IC8vIM+HCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9QU0kgPSAnXHUwM0M4JzsgLy8gz4gKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSX09NRUdBID0gJ1x1MDNDOSc7IC8vIM+JCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9CRVRBID0gJ1x1MDNCMic7IC8vIM6yCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUl9OVSA9ICdcdTAzQkQnOyAvLyDOvQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JfTVUgPSAnXHUwM0JDJzsgLy8gzrwKLSAgICAgICAgc3RhdGljIGZpbmFsIGludFtdIFBST1hJTUlUWSA9IHsKLSAgICAgICAgICAgIC8vIFByb3hpbWl0eSBmb3Igcm93IDEuIFRoaXMgbXVzdCBoYXZlIGV4YWN0bHkgUk9XX1NJWkUgZW50cmllcyBmb3IgZWFjaCBsZXR0ZXIsCi0gICAgICAgICAgICAvLyBhbmQgZXhhY3RseSBQUk9YSU1JVFlfR1JJRF9XSURUSCBsZXR0ZXJzIGZvciBhIHJvdy4gUGFkIHdpdGggTlVMJ3MuCi0gICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHJvd3MgbXVzdCBiZSBleGFjdGx5IFBST1hJTUlUWV9HUklEX0hFSUdIVC4KLSAgICAgICAgICAgIEdSX0ZJTkFMX1NJR01BLCBHUl9FUFNJTE9OLCBHUl9BTFBIQSwgR1JfU0lHTUEsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgR1JfRVBTSUxPTiwgR1JfRklOQUxfU0lHTUEsIEdSX1JITywgR1JfU0lHTUEsIEdSX0RFTFRBLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIEdSX1JITywgR1JfRVBTSUxPTiwgR1JfVEFVLCBHUl9ERUxUQSwgR1JfUEhJLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIEdSX1RBVSwgR1JfUkhPLCBHUl9VUFNJTE9OLCBHUl9QSEksIEdSX0dBTU1BLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIEdSX1VQU0lMT04sIEdSX1RBVSwgR1JfVEhFVEEsIEdSX0dBTU1BLCBHUl9FVEEsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgR1JfVEhFVEEsIEdSX1VQU0lMT04sIEdSX0lPVEEsIEdSX0VUQSwgR1JfWEksIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgR1JfSU9UQSwgR1JfVEhFVEEsIEdSX09NSUNST04sIEdSX1hJLCBHUl9LQVBQQSwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9PTUlDUk9OLCBHUl9JT1RBLCBHUl9QSSwgR1JfS0FQUEEsIEdSX0xBTURBLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9QSSwgR1JfT01JQ1JPTiwgR1JfTEFNREEsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLQotICAgICAgICAgICAgR1JfQUxQSEEsIEdSX0ZJTkFMX1NJR01BLCBHUl9TSUdNQSwgR1JfWkVUQSwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIEdSX1NJR01BLCBHUl9GSU5BTF9TSUdNQSwgR1JfRVBTSUxPTiwgR1JfQUxQSEEsIEdSX0RFTFRBLCBHUl9aRVRBLCBHUl9DSEksIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9ERUxUQSwgR1JfRVBTSUxPTiwgR1JfUkhPLCBHUl9TSUdNQSwgR1JfUEhJLCBHUl9aRVRBLCBHUl9DSEksIEdSX1BTSSwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9QSEksIEdSX1JITywgR1JfVEFVLCBHUl9ERUxUQSwgR1JfR0FNTUEsIEdSX0NISSwgR1JfUFNJLCBHUl9PTUVHQSwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9HQU1NQSwgR1JfVEFVLCBHUl9VUFNJTE9OLCBHUl9QSEksIEdSX0VUQSwgR1JfUFNJLCBHUl9PTUVHQSwgR1JfQkVUQSwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9FVEEsIEdSX1VQU0lMT04sIEdSX1RIRVRBLCBHUl9HQU1NQSwgR1JfWEksIEdSX09NRUdBLCBHUl9CRVRBLCBHUl9OVSwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9YSSwgR1JfVEhFVEEsIEdSX0lPVEEsIEdSX0VUQSwgR1JfS0FQUEEsIEdSX0JFVEEsIEdSX05VLCBHUl9NVSwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9LQVBQQSwgR1JfSU9UQSwgR1JfT01JQ1JPTiwgR1JfWEksIEdSX0xBTURBLCBHUl9OVSwgR1JfTVUsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9MQU1EQSwgR1JfT01JQ1JPTiwgR1JfUEksIEdSX0tBUFBBLCBHUl9NVSwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0KLSAgICAgICAgICAgIEdSX1pFVEEsIEdSX0FMUEhBLCBHUl9TSUdNQSwgR1JfREVMVEEsIEdSX0NISSwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsCi0gICAgICAgICAgICBHUl9DSEksIEdSX1NJR01BLCBHUl9ERUxUQSwgR1JfUEhJLCBHUl9aRVRBLCBHUl9QU0ksIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIEdSX1BTSSwgR1JfREVMVEEsIEdSX1BISSwgR1JfR0FNTUEsIEdSX0NISSwgR1JfT01FR0EsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIEdSX09NRUdBLCBHUl9QSEksIEdSX0dBTU1BLCBHUl9FVEEsIEdSX1BTSSwgR1JfQkVUQSwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgR1JfQkVUQSwgR1JfR0FNTUEsIEdSX0VUQSwgR1JfWEksIEdSX09NRUdBLCBHUl9OVSwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgR1JfTlUsIEdSX0VUQSwgR1JfWEksIEdSX0tBUFBBLCBHUl9CRVRBLCBHUl9NVSwgTlVMLCBOVUwsCi0gICAgICAgICAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgR1JfTVUsIEdSX1hJLCBHUl9LQVBQQSwgR1JfTEFNREEsIEdSX05VLCBOVUwsIE5VTCwgTlVMLAotICAgICAgICAgICAgICAgICAgICBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgICAgIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwgTlVMLCBOVUwsIE5VTCwKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgZmluYWwgU3BhcnNlSW50QXJyYXkgSU5ESUNFUyA9IG5ldyBTcGFyc2VJbnRBcnJheShQUk9YSU1JVFkubGVuZ3RoIC8gUk9XX1NJWkUpOwotCi0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBidWlsZFByb3hpbWl0eUluZGljZXMoUFJPWElNSVRZLCBST1dfU0laRSwgSU5ESUNFUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBnZXRQcm94aW1pdHlGb3JTY3JpcHQoZmluYWwgaW50IHNjcmlwdCkgewotICAgICAgICBzd2l0Y2ggKHNjcmlwdCkgewotICAgICAgICBjYXNlIEFuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlLlNDUklQVF9MQVRJTjoKLSAgICAgICAgICAgIHJldHVybiBMYXRpbi5QUk9YSU1JVFk7Ci0gICAgICAgIGNhc2UgQW5kcm9pZFNwZWxsQ2hlY2tlclNlcnZpY2UuU0NSSVBUX0NZUklMTElDOgotICAgICAgICAgICAgcmV0dXJuIEN5cmlsbGljLlBST1hJTUlUWTsKLSAgICAgICAgY2FzZSBBbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZS5TQ1JJUFRfR1JFRUs6Ci0gICAgICAgICAgICByZXR1cm4gR3JlZWsuUFJPWElNSVRZOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyb25nIHNjcmlwdCBzdXBwbGllZDogIiArIHNjcmlwdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW5kZXhPZkNvZGVGb3JTY3JpcHQoZmluYWwgaW50IGNvZGVQb2ludCwgZmluYWwgaW50IHNjcmlwdCkgewotICAgICAgICBzd2l0Y2ggKHNjcmlwdCkgewotICAgICAgICBjYXNlIEFuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlLlNDUklQVF9MQVRJTjoKLSAgICAgICAgICAgIHJldHVybiBMYXRpbi5JTkRJQ0VTLmdldChjb2RlUG9pbnQsIE5PVF9BTl9JTkRFWCk7Ci0gICAgICAgIGNhc2UgQW5kcm9pZFNwZWxsQ2hlY2tlclNlcnZpY2UuU0NSSVBUX0NZUklMTElDOgotICAgICAgICAgICAgcmV0dXJuIEN5cmlsbGljLklORElDRVMuZ2V0KGNvZGVQb2ludCwgTk9UX0FOX0lOREVYKTsKLSAgICAgICAgY2FzZSBBbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZS5TQ1JJUFRfR1JFRUs6Ci0gICAgICAgICAgICByZXR1cm4gR3JlZWsuSU5ESUNFUy5nZXQoY29kZVBvaW50LCBOT1RfQU5fSU5ERVgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyb25nIHNjcmlwdCBzdXBwbGllZDogIiArIHNjcmlwdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIChZIDw8IDE2KSArIFggdG8gYXZvaWQgY3JlYXRpbmcgYSB0ZW1wb3Jhcnkgb2JqZWN0LiBUaGlzIGlzIG9rYXkgYmVjYXVzZQotICAgIC8vIFggYW5kIFkgYXJlIGxpbWl0ZWQgdG8gUFJPWElNSVRZX0dSSURfV0lEVEggcmVzcC4gUFJPWElNSVRZX0dSSURfSEVJR0hUIHdoaWNoIGlzIHZlcnkKLSAgICAvLyBpbmZlcmlvciB0byAxIDw8IDE2Ci0gICAgLy8gQXMgYW4gZXhjZXB0aW9uLCB0aGlzIHJldHVybnMgTk9UX0FfQ09PUkRJTkFURV9QQUlSIGlmIHRoZSBrZXkgaXMgbm90IG9uIHRoZSBncmlkCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0WFlGb3JDb2RlUG9pbnRBbmRTY3JpcHQoZmluYWwgaW50IGNvZGVQb2ludCwgZmluYWwgaW50IHNjcmlwdCkgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBnZXRJbmRleE9mQ29kZUZvclNjcmlwdChjb2RlUG9pbnQsIHNjcmlwdCk7Ci0gICAgICAgIGlmIChOT1RfQU5fSU5ERVggPT0gaW5kZXgpIHJldHVybiBOT1RfQV9DT09SRElOQVRFX1BBSVI7Ci0gICAgICAgIGZpbmFsIGludCB5ID0gaW5kZXggLyBQUk9YSU1JVFlfR1JJRF9XSURUSDsKLSAgICAgICAgZmluYWwgaW50IHggPSBpbmRleCAlIFBST1hJTUlUWV9HUklEX1dJRFRIOwotICAgICAgICBpZiAoeSA+IFBST1hJTUlUWV9HUklEX0hFSUdIVCkgewotICAgICAgICAgICAgLy8gU2FmZXR5IGNoZWNrLCBzaG91bGQgYmUgZW50aXJlbHkgdXNlbGVzcwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyb25nIHkgY29vcmRpbmF0ZSBpbiBzcGVsbCBjaGVja2VyIHByb3hpbWl0eSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoeSA8PCAxNikgKyB4OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3N1Z2dlc3Rpb25zL01vcmVTdWdnZXN0aW9ucy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvTW9yZVN1Z2dlc3Rpb25zLmphdmEKaW5kZXggMzAzNzY2OS4uMDlmODFkNCAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvTW9yZVN1Z2dlc3Rpb25zLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvTW9yZVN1Z2dlc3Rpb25zLmphdmEKQEAgLTIzLDE5ICsyMywyOCBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuS2V5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkQWN0aW9uTGlzdGVuZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuVHlwZWZhY2VVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5pbnRlcm5hbC5LZXlib2FyZEJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuaW50ZXJuYWwuS2V5Ym9hcmRJY29uc1NldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5pbnRlcm5hbC5LZXlib2FyZFBhcmFtczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlN1Z2dlc3RlZFdvcmRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlN1Z2dlc3RlZFdvcmRzLlN1Z2dlc3RlZFdvcmRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlV0aWxzOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgTW9yZVN1Z2dlc3Rpb25zIGV4dGVuZHMgS2V5Ym9hcmQgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVR0dFU1RJT05fQ09ERV9CQVNFID0gMTAyNDsKIAotICAgIE1vcmVTdWdnZXN0aW9ucyhmaW5hbCBNb3JlU3VnZ2VzdGlvbnNQYXJhbSBwYXJhbXMpIHsKKyAgICBwdWJsaWMgZmluYWwgU3VnZ2VzdGVkV29yZHMgbVN1Z2dlc3RlZFdvcmRzOworCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBNb3JlU3VnZ2VzdGlvbnNMaXN0ZW5lciBleHRlbmRzIEtleWJvYXJkQWN0aW9uTGlzdGVuZXIuQWRhcHRlciB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3VnZ2VzdGlvblNlbGVjdGVkKGZpbmFsIGludCBpbmRleCwgZmluYWwgU3VnZ2VzdGVkV29yZEluZm8gaW5mbyk7CisgICAgfQorCisgICAgTW9yZVN1Z2dlc3Rpb25zKGZpbmFsIE1vcmVTdWdnZXN0aW9uc1BhcmFtIHBhcmFtcywgZmluYWwgU3VnZ2VzdGVkV29yZHMgc3VnZ2VzdGVkV29yZHMpIHsKICAgICAgICAgc3VwZXIocGFyYW1zKTsKKyAgICAgICAgbVN1Z2dlc3RlZFdvcmRzID0gc3VnZ2VzdGVkV29yZHM7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTW9yZVN1Z2dlc3Rpb25zUGFyYW0gZXh0ZW5kcyBLZXlib2FyZFBhcmFtcyB7CkBAIC01Miw4ICs2MSw5IEBACiAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGludCBsYXlvdXQoZmluYWwgU3VnZ2VzdGVkV29yZHMgc3VnZ2VzdGlvbnMsIGZpbmFsIGludCBmcm9tUG9zLCBmaW5hbCBpbnQgbWF4V2lkdGgsCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IG1pbldpZHRoLCBmaW5hbCBpbnQgbWF4Um93LCBmaW5hbCBQYWludCBwYWludCwgZmluYWwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBwdWJsaWMgaW50IGxheW91dChmaW5hbCBTdWdnZXN0ZWRXb3JkcyBzdWdnZXN0ZWRXb3JkcywgZmluYWwgaW50IGZyb21Qb3MsCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heFdpZHRoLCBmaW5hbCBpbnQgbWluV2lkdGgsIGZpbmFsIGludCBtYXhSb3csIGZpbmFsIFBhaW50IHBhaW50LAorICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMpIHsKICAgICAgICAgICAgIGNsZWFyS2V5cygpOwogICAgICAgICAgICAgbURpdmlkZXIgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tb3JlX3N1Z2dlc3Rpb25zX2RpdmlkZXIpOwogICAgICAgICAgICAgbURpdmlkZXJXaWR0aCA9IG1EaXZpZGVyLmdldEludHJpbnNpY1dpZHRoKCk7CkBAIC02MSw5ICs3MSw5IEBACiAKICAgICAgICAgICAgIGludCByb3cgPSAwOwogICAgICAgICAgICAgaW50IHBvcyA9IGZyb21Qb3MsIHJvd1N0YXJ0UG9zID0gZnJvbVBvczsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gTWF0aC5taW4oc3VnZ2VzdGlvbnMuc2l6ZSgpLCBTdWdnZXN0aW9uU3RyaXBWaWV3Lk1BWF9TVUdHRVNUSU9OUyk7CisgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IE1hdGgubWluKHN1Z2dlc3RlZFdvcmRzLnNpemUoKSwgU3VnZ2VzdGlvblN0cmlwVmlldy5NQVhfU1VHR0VTVElPTlMpOwogICAgICAgICAgICAgd2hpbGUgKHBvcyA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZCA9IHN1Z2dlc3Rpb25zLmdldFdvcmQocG9zKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZCA9IHN1Z2dlc3RlZFdvcmRzLmdldFdvcmQocG9zKTsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgdGFrZSBjYXJlIG9mIHRleHQgeC1zY2FsaW5nLgogICAgICAgICAgICAgICAgIG1XaWR0aHNbcG9zXSA9IChpbnQpKFR5cGVmYWNlVXRpbHMuZ2V0TGFiZWxXaWR0aCh3b3JkLCBwYWludCkgKyBwYWRkaW5nKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtQ29sdW1uID0gcG9zIC0gcm93U3RhcnRQb3MgKyAxOwpAQCAtMTYzLDcgKzE3Myw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBLZXlib2FyZEJ1aWxkZXI8TW9yZVN1Z2dlc3Rpb25zUGFyYW0+IHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNb3JlU3VnZ2VzdGlvbnNWaWV3IG1QYW5lVmlldzsKLSAgICAgICAgcHJpdmF0ZSBTdWdnZXN0ZWRXb3JkcyBtU3VnZ2VzdGlvbnM7CisgICAgICAgIHByaXZhdGUgU3VnZ2VzdGVkV29yZHMgbVN1Z2dlc3RlZFdvcmRzOwogICAgICAgICBwcml2YXRlIGludCBtRnJvbVBvczsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVRvUG9zOwogCkBAIC0xNzIsNyArMTgyLDcgQEAKICAgICAgICAgICAgIG1QYW5lVmlldyA9IHBhbmVWaWV3OwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgbGF5b3V0KGZpbmFsIFN1Z2dlc3RlZFdvcmRzIHN1Z2dlc3Rpb25zLCBmaW5hbCBpbnQgZnJvbVBvcywKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbGF5b3V0KGZpbmFsIFN1Z2dlc3RlZFdvcmRzIHN1Z2dlc3RlZFdvcmRzLCBmaW5hbCBpbnQgZnJvbVBvcywKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWF4V2lkdGgsIGZpbmFsIGludCBtaW5XaWR0aCwgZmluYWwgaW50IG1heFJvdywKICAgICAgICAgICAgICAgICBmaW5hbCBLZXlib2FyZCBwYXJlbnRLZXlib2FyZCkgewogICAgICAgICAgICAgZmluYWwgaW50IHhtbElkID0gUi54bWwua2JkX3N1Z2dlc3Rpb25zX3BhbmVfdGVtcGxhdGU7CkBAIC0xODAsMTEgKzE5MCwxMSBAQAogICAgICAgICAgICAgbVBhcmFtcy5tVmVydGljYWxHYXAgPSBtUGFyYW1zLm1Ub3BQYWRkaW5nID0gcGFyZW50S2V5Ym9hcmQubVZlcnRpY2FsR2FwIC8gMjsKIAogICAgICAgICAgICAgbVBhbmVWaWV3LnVwZGF0ZUtleWJvYXJkR2VvbWV0cnkobVBhcmFtcy5tRGVmYXVsdFJvd0hlaWdodCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUGFyYW1zLmxheW91dChzdWdnZXN0aW9ucywgZnJvbVBvcywgbWF4V2lkdGgsIG1pbldpZHRoLCBtYXhSb3csCisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUGFyYW1zLmxheW91dChzdWdnZXN0ZWRXb3JkcywgZnJvbVBvcywgbWF4V2lkdGgsIG1pbldpZHRoLCBtYXhSb3csCiAgICAgICAgICAgICAgICAgICAgIG1QYW5lVmlldy5uZXdMYWJlbFBhaW50KG51bGwgLyoga2V5ICovKSwgbVJlc291cmNlcyk7CiAgICAgICAgICAgICBtRnJvbVBvcyA9IGZyb21Qb3M7CiAgICAgICAgICAgICBtVG9Qb3MgPSBmcm9tUG9zICsgY291bnQ7Ci0gICAgICAgICAgICBtU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9uczsKKyAgICAgICAgICAgIG1TdWdnZXN0ZWRXb3JkcyA9IHN1Z2dlc3RlZFdvcmRzOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIApAQCAtMTk1LDggKzIwNSw4IEBACiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHggPSBwYXJhbXMuZ2V0WChwb3MpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gcGFyYW1zLmdldFkocG9zKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBwYXJhbXMuZ2V0V2lkdGgocG9zKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZCA9IG1TdWdnZXN0aW9ucy5nZXRXb3JkKHBvcykudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5mbyA9IFV0aWxzLmdldERlYnVnSW5mbyhtU3VnZ2VzdGlvbnMsIHBvcyk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdvcmQgPSBtU3VnZ2VzdGVkV29yZHMuZ2V0V29yZChwb3MpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbmZvID0gVXRpbHMuZ2V0RGVidWdJbmZvKG1TdWdnZXN0ZWRXb3JkcywgcG9zKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBwb3MgKyBTVUdHRVNUSU9OX0NPREVfQkFTRTsKICAgICAgICAgICAgICAgICBmaW5hbCBLZXkga2V5ID0gbmV3IEtleSgKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgd29yZCwgaW5mbywgS2V5Ym9hcmRJY29uc1NldC5JQ09OX1VOREVGSU5FRCwgaW5kZXgsIG51bGwsIHgsIHksCkBAIC0yMTEsNyArMjIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9uQWRkS2V5KGRpdmlkZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTW9yZVN1Z2dlc3Rpb25zKHBhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1vcmVTdWdnZXN0aW9ucyhwYXJhbXMsIG1TdWdnZXN0ZWRXb3Jkcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3N1Z2dlc3Rpb25zL01vcmVTdWdnZXN0aW9uc1ZpZXcuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3N1Z2dlc3Rpb25zL01vcmVTdWdnZXN0aW9uc1ZpZXcuamF2YQppbmRleCA2NTA5ZjM5Li5kNTg1YjVjIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zdWdnZXN0aW9ucy9Nb3JlU3VnZ2VzdGlvbnNWaWV3LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvTW9yZVN1Z2dlc3Rpb25zVmlldy5qYXZhCkBAIC0xOCwxNSArMTgsMjEgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLk1vcmVLZXlzS2V5Ym9hcmRWaWV3OwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU3VnZ2VzdGVkV29yZHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc3VnZ2VzdGlvbnMuTW9yZVN1Z2dlc3Rpb25zLk1vcmVTdWdnZXN0aW9uc0xpc3RlbmVyOwogCiAvKioKICAqIEEgdmlldyB0aGF0IHJlbmRlcnMgYSB2aXJ0dWFsIHtAbGluayBNb3JlU3VnZ2VzdGlvbnN9LiBJdCBoYW5kbGVzIHJlbmRlcmluZyBvZiBrZXlzIGFuZCBkZXRlY3RpbmcKICAqIGtleSBwcmVzc2VzIGFuZCB0b3VjaCBtb3ZlbWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNb3JlU3VnZ2VzdGlvbnNWaWV3IGV4dGVuZHMgTW9yZUtleXNLZXlib2FyZFZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBNb3JlU3VnZ2VzdGlvbnNWaWV3LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKwogICAgIHB1YmxpYyBNb3JlU3VnZ2VzdGlvbnNWaWV3KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIFIuYXR0ci5tb3JlU3VnZ2VzdGlvbnNWaWV3U3R5bGUpOwogICAgIH0KQEAgLTU0LDkgKzYwLDI0IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNvZGVJbnB1dChmaW5hbCBpbnQgY29kZSwgZmluYWwgaW50IHgsIGZpbmFsIGludCB5KSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGNvZGUgLSBNb3JlU3VnZ2VzdGlvbnMuU1VHR0VTVElPTl9DT0RFX0JBU0U7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgU3VnZ2VzdGlvblN0cmlwVmlldy5NQVhfU1VHR0VTVElPTlMpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkN1c3RvbVJlcXVlc3QoaW5kZXgpOworICAgICAgICBmaW5hbCBLZXlib2FyZCBrZXlib2FyZCA9IGdldEtleWJvYXJkKCk7CisgICAgICAgIGlmICghKGtleWJvYXJkIGluc3RhbmNlb2YgTW9yZVN1Z2dlc3Rpb25zKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhwZWN0ZWQga2V5Ym9hcmQgaXMgTW9yZVN1Z2dlc3Rpb25zLCBidXQgZm91bmQgIgorICAgICAgICAgICAgICAgICAgICArIGtleWJvYXJkLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBTdWdnZXN0ZWRXb3JkcyBzdWdnZXN0ZWRXb3JkcyA9ICgoTW9yZVN1Z2dlc3Rpb25zKWtleWJvYXJkKS5tU3VnZ2VzdGVkV29yZHM7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGNvZGUgLSBNb3JlU3VnZ2VzdGlvbnMuU1VHR0VTVElPTl9DT0RFX0JBU0U7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3VnZ2VzdGVkV29yZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJTZWxlY3RlZCBzdWdnZXN0aW9uIGhhcyBhbiBpbGxlZ2FsIGluZGV4OiAiICsgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghKG1MaXN0ZW5lciBpbnN0YW5jZW9mIE1vcmVTdWdnZXN0aW9uc0xpc3RlbmVyKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhwZWN0ZWQgbUxpc3RlbmVyIGlzIE1vcmVTdWdnZXN0aW9uc0xpc3RlbmVyLCBidXQgZm91bmQgIgorICAgICAgICAgICAgICAgICAgICArIG1MaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgKChNb3JlU3VnZ2VzdGlvbnNMaXN0ZW5lciltTGlzdGVuZXIpLm9uU3VnZ2VzdGlvblNlbGVjdGVkKAorICAgICAgICAgICAgICAgIGluZGV4LCBzdWdnZXN0ZWRXb3Jkcy5nZXRJbmZvKGluZGV4KSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvU3VnZ2VzdGlvblN0cmlwVmlldy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3VnZ2VzdGlvbnMvU3VnZ2VzdGlvblN0cmlwVmlldy5qYXZhCmluZGV4IDJhMjFlYzIuLmFkMzUwYTAgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3N1Z2dlc3Rpb25zL1N1Z2dlc3Rpb25TdHJpcFZpZXcuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zdWdnZXN0aW9ucy9TdWdnZXN0aW9uU3RyaXBWaWV3LmphdmEKQEAgLTUwLDcgKzUwLDYgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLktleWJvYXJkQWN0aW9uTGlzdGVuZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuS2V5Ym9hcmRTd2l0Y2hlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5NYWluS2V5Ym9hcmRWaWV3OwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLk1vcmVLZXlzUGFuZWw7CkBAIC02NSw2ICs2NCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU3VnZ2VzdGVkV29yZHMuU3VnZ2VzdGVkV29yZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGVmaW5lLlByb2R1Y3Rpb25GbGFnOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnN1Z2dlc3Rpb25zLk1vcmVTdWdnZXN0aW9ucy5Nb3JlU3VnZ2VzdGlvbnNMaXN0ZW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5yZXNlYXJjaC5SZXNlYXJjaExvZ2dlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC05Myw3ICs5Myw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbURpdmlkZXJzID0gQ29sbGVjdGlvblV0aWxzLm5ld0FycmF5TGlzdCgpOwogCiAgICAgTGlzdGVuZXIgbUxpc3RlbmVyOwotICAgIFN1Z2dlc3RlZFdvcmRzIG1TdWdnZXN0ZWRXb3JkcyA9IFN1Z2dlc3RlZFdvcmRzLkVNUFRZOworICAgIHByaXZhdGUgU3VnZ2VzdGVkV29yZHMgbVN1Z2dlc3RlZFdvcmRzID0gU3VnZ2VzdGVkV29yZHMuRU1QVFk7CiAKICAgICBwcml2YXRlIGZpbmFsIFN1Z2dlc3Rpb25TdHJpcFZpZXdQYXJhbXMgbVBhcmFtczsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fVEVYVF9YU0NBTEUgPSAwLjcwZjsKQEAgLTY1MiwxNSArNjUyLDExIEBACiAgICAgICAgIGRpc21pc3NNb3JlU3VnZ2VzdGlvbnMoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIEtleWJvYXJkQWN0aW9uTGlzdGVuZXIgbU1vcmVTdWdnZXN0aW9uc0xpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBLZXlib2FyZEFjdGlvbkxpc3RlbmVyLkFkYXB0ZXIoKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBNb3JlU3VnZ2VzdGlvbnNMaXN0ZW5lciBtTW9yZVN1Z2dlc3Rpb25zTGlzdGVuZXIgPSBuZXcgTW9yZVN1Z2dlc3Rpb25zTGlzdGVuZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkN1c3RvbVJlcXVlc3QoZmluYWwgaW50IHJlcXVlc3RDb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSByZXF1ZXN0Q29kZTsKLSAgICAgICAgICAgIGZpbmFsIFN1Z2dlc3RlZFdvcmRJbmZvIHdvcmRJbmZvID0gbVN1Z2dlc3RlZFdvcmRzLmdldEluZm8oaW5kZXgpOworICAgICAgICBwdWJsaWMgdm9pZCBvblN1Z2dlc3Rpb25TZWxlY3RlZChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIFN1Z2dlc3RlZFdvcmRJbmZvIHdvcmRJbmZvKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXIucGlja1N1Z2dlc3Rpb25NYW51YWxseShpbmRleCwgd29yZEluZm8pOwogICAgICAgICAgICAgZGlzbWlzc01vcmVTdWdnZXN0aW9ucygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5QWRkV29yZENvbnRlbnRzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi91c2VyZGljdGlvbmFyeS9Vc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmZkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi91c2VyZGljdGlvbmFyeS9Vc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cy5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi51c2VyZGljdGlvbmFyeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmNvbXBhdC5Vc2VyRGljdGlvbmFyeUNvbXBhdFV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkxvY2FsZVV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVXNlckRpY3Rpb25hcnk7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworLy8gQ2F2ZWF0OiBUaGlzIGNsYXNzIGlzIGJhc2ljYWxseSB0YWtlbiBmcm9tCisvLyBwYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9pbnB1dG1ldGhvZC9Vc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cy5qYXZhCisvLyBpbiBvcmRlciB0byBkZWFsIHdpdGggc29tZSBkZXZpY2VzIHRoYXQgaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdXNlciBkaWN0aW9uYXJ5IGhhbmRsaW5nCisKKy8qKgorICogQSBjb250YWluZXIgY2xhc3MgdG8gZmFjdG9yIGNvbW1vbiBjb2RlIHRvIFVzZXJEaWN0aW9uYXJ5QWRkV29yZEZyYWdtZW50CisgKiBhbmQgVXNlckRpY3Rpb25hcnlBZGRXb3JkQWN0aXZpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTU9ERSA9ICJtb2RlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9XT1JEID0gIndvcmQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1JUQ1VUID0gInNob3J0Y3V0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MT0NBTEUgPSAibG9jYWxlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9PUklHSU5BTF9XT1JEID0gIm9yaWdpbmFsV29yZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfT1JJR0lOQUxfU0hPUlRDVVQgPSAib3JpZ2luYWxTaG9ydGN1dCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0VESVQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfSU5TRVJUID0gMTsKKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBDT0RFX1dPUkRfQURERUQgPSAwOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBDT0RFX0NBTkNFTCA9IDE7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IENPREVfQUxSRUFEWV9QUkVTRU5UID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUkVRVUVOQ1lfRk9SX1VTRVJfRElDVElPTkFSWV9BRERTID0gMjUwOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1vZGU7IC8vIEVpdGhlciBNT0RFX0VESVQgb3IgTU9ERV9JTlNFUlQKKyAgICBwcml2YXRlIGZpbmFsIEVkaXRUZXh0IG1Xb3JkRWRpdFRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBFZGl0VGV4dCBtU2hvcnRjdXRFZGl0VGV4dDsKKyAgICBwcml2YXRlIFN0cmluZyBtTG9jYWxlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1PbGRXb3JkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1PbGRTaG9ydGN1dDsKKworICAgIC8qIHBhY2thZ2UgKi8gVXNlckRpY3Rpb25hcnlBZGRXb3JkQ29udGVudHMoZmluYWwgVmlldyB2aWV3LCBmaW5hbCBCdW5kbGUgYXJncykgeworICAgICAgICBtV29yZEVkaXRUZXh0ID0gKEVkaXRUZXh0KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQudXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkX3RleHQpOworICAgICAgICBtU2hvcnRjdXRFZGl0VGV4dCA9IChFZGl0VGV4dCl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnVzZXJfZGljdGlvbmFyeV9hZGRfc2hvcnRjdXQpOworICAgICAgICBpZiAoIVVzZXJEaWN0aW9uYXJ5U2V0dGluZ3MuSVNfU0hPUlRDVVRfQVBJX1NVUFBPUlRFRCkgeworICAgICAgICAgICAgbVNob3J0Y3V0RWRpdFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgdmlldy5maW5kVmlld0J5SWQoUi5pZC51c2VyX2RpY3Rpb25hcnlfYWRkX3Nob3J0Y3V0X2xhYmVsKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHdvcmQgPSBhcmdzLmdldFN0cmluZyhFWFRSQV9XT1JEKTsKKyAgICAgICAgaWYgKG51bGwgIT0gd29yZCkgeworICAgICAgICAgICAgbVdvcmRFZGl0VGV4dC5zZXRUZXh0KHdvcmQpOworICAgICAgICAgICAgbVdvcmRFZGl0VGV4dC5zZXRTZWxlY3Rpb24od29yZC5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHNob3J0Y3V0OworICAgICAgICBpZiAoVXNlckRpY3Rpb25hcnlTZXR0aW5ncy5JU19TSE9SVENVVF9BUElfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICBzaG9ydGN1dCA9IGFyZ3MuZ2V0U3RyaW5nKEVYVFJBX1NIT1JUQ1VUKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHNob3J0Y3V0ICYmIG51bGwgIT0gbVNob3J0Y3V0RWRpdFRleHQpIHsKKyAgICAgICAgICAgICAgICBtU2hvcnRjdXRFZGl0VGV4dC5zZXRUZXh0KHNob3J0Y3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PbGRTaG9ydGN1dCA9IGFyZ3MuZ2V0U3RyaW5nKEVYVFJBX1NIT1JUQ1VUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNob3J0Y3V0ID0gbnVsbDsKKyAgICAgICAgICAgIG1PbGRTaG9ydGN1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbU1vZGUgPSBhcmdzLmdldEludChFWFRSQV9NT0RFKTsgLy8gZGVmYXVsdCByZXR1cm4gdmFsdWUgZm9yICNnZXRJbnQoKSBpcyAwID0gTU9ERV9FRElUCisgICAgICAgIG1PbGRXb3JkID0gYXJncy5nZXRTdHJpbmcoRVhUUkFfV09SRCk7CisgICAgICAgIHVwZGF0ZUxvY2FsZShhcmdzLmdldFN0cmluZyhFWFRSQV9MT0NBTEUpKTsKKyAgICB9CisKKyAgICAvLyBsb2NhbGUgbWF5IGJlIG51bGwsIHRoaXMgbWVhbnMgZGVmYXVsdCBsb2NhbGUKKyAgICAvLyBJdCBtYXkgYWxzbyBiZSB0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBtZWFucyAiYWxsIGxvY2FsZXMiCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHVwZGF0ZUxvY2FsZShmaW5hbCBTdHJpbmcgbG9jYWxlKSB7CisgICAgICAgIG1Mb2NhbGUgPSBudWxsID09IGxvY2FsZSA/IExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKSA6IGxvY2FsZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2F2ZVN0YXRlSW50b0J1bmRsZShmaW5hbCBCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nKEVYVFJBX1dPUkQsIG1Xb3JkRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICBvdXRTdGF0ZS5wdXRTdHJpbmcoRVhUUkFfT1JJR0lOQUxfV09SRCwgbU9sZFdvcmQpOworICAgICAgICBpZiAobnVsbCAhPSBtU2hvcnRjdXRFZGl0VGV4dCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nKEVYVFJBX1NIT1JUQ1VULCBtU2hvcnRjdXRFZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gbU9sZFNob3J0Y3V0KSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRTdHJpbmcoRVhUUkFfT1JJR0lOQUxfU0hPUlRDVVQsIG1PbGRTaG9ydGN1dCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nKEVYVFJBX0xPQ0FMRSwgbUxvY2FsZSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGRlbGV0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKE1PREVfRURJVCA9PSBtTW9kZSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobU9sZFdvcmQpKSB7CisgICAgICAgICAgICAvLyBNb2RlIGVkaXQ6IHJlbW92ZSB0aGUgb2xkIGVudHJ5LgorICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIFVzZXJEaWN0aW9uYXJ5U2V0dGluZ3MuZGVsZXRlV29yZChtT2xkV29yZCwgbU9sZFNob3J0Y3V0LCByZXNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UgYXJlIGluIGFkZCBtb2RlLCBub3RoaW5nIHdhcyBhZGRlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgaW50IGFwcGx5KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgQnVuZGxlIG91dFBhcmFtZXRlcnMpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gb3V0UGFyYW1ldGVycykgc2F2ZVN0YXRlSW50b0J1bmRsZShvdXRQYXJhbWV0ZXJzKTsKKyAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgaWYgKE1PREVfRURJVCA9PSBtTW9kZSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobU9sZFdvcmQpKSB7CisgICAgICAgICAgICAvLyBNb2RlIGVkaXQ6IHJlbW92ZSB0aGUgb2xkIGVudHJ5LgorICAgICAgICAgICAgVXNlckRpY3Rpb25hcnlTZXR0aW5ncy5kZWxldGVXb3JkKG1PbGRXb3JkLCBtT2xkU2hvcnRjdXQsIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgbmV3V29yZCA9IG1Xb3JkRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdTaG9ydGN1dDsKKyAgICAgICAgaWYgKCFVc2VyRGljdGlvbmFyeVNldHRpbmdzLklTX1NIT1JUQ1VUX0FQSV9TVVBQT1JURUQpIHsKKyAgICAgICAgICAgIG5ld1Nob3J0Y3V0ID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmIChudWxsID09IG1TaG9ydGN1dEVkaXRUZXh0KSB7CisgICAgICAgICAgICBuZXdTaG9ydGN1dCA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wU2hvcnRjdXQgPSBtU2hvcnRjdXRFZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh0bXBTaG9ydGN1dCkpIHsKKyAgICAgICAgICAgICAgICBuZXdTaG9ydGN1dCA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5ld1Nob3J0Y3V0ID0gdG1wU2hvcnRjdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG5ld1dvcmQpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgd29yZCBpcyBzb21laG93IGVtcHR5LCBkb24ndCBpbnNlcnQgaXQuCisgICAgICAgICAgICByZXR1cm4gQ09ERV9DQU5DRUw7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2hvcnRjdXQsIGFuZCB0aGUgd29yZCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UsIHRoZW4gd2UKKyAgICAgICAgLy8gc2hvdWxkIG5vdCBpbnNlcnQsIGJlY2F1c2UgZWl0aGVyIEEuIHRoZSB3b3JkIGV4aXN0cyB3aXRoIG5vIHNob3J0Y3V0LCBpbiB3aGljaAorICAgICAgICAvLyBjYXNlIHRoZSBleGFjdCBzYW1lIHRoaW5nIHdlIHdhbnQgdG8gaW5zZXJ0IGlzIGFscmVhZHkgdGhlcmUsIG9yIEIuIHRoZSB3b3JkCisgICAgICAgIC8vIGV4aXN0cyB3aXRoIGF0IGxlYXN0IG9uZSBzaG9ydGN1dCwgaW4gd2hpY2ggY2FzZSBpdCBoYXMgcHJpb3JpdHkgb24gb3VyIHdvcmQuCisgICAgICAgIGlmIChoYXNXb3JkKG5ld1dvcmQsIGNvbnRleHQpKSByZXR1cm4gQ09ERV9BTFJFQURZX1BSRVNFTlQ7CisKKyAgICAgICAgLy8gRGlzYWxsb3cgZHVwbGljYXRlcy4gSWYgdGhlIHNhbWUgd29yZCB3aXRoIG5vIHNob3J0Y3V0IGlzIGRlZmluZWQsIHJlbW92ZSBpdDsgaWYKKyAgICAgICAgLy8gdGhlIHNhbWUgd29yZCB3aXRoIHRoZSBzYW1lIHNob3J0Y3V0IGlzIGRlZmluZWQsIHJlbW92ZSBpdDsgYnV0IHdlIGRvbid0IG1pbmQgaWYKKyAgICAgICAgLy8gdGhlcmUgaXMgdGhlIHNhbWUgd29yZCB3aXRoIGEgZGlmZmVyZW50LCBub24tZW1wdHkgc2hvcnRjdXQuCisgICAgICAgIFVzZXJEaWN0aW9uYXJ5U2V0dGluZ3MuZGVsZXRlV29yZChuZXdXb3JkLCBudWxsLCByZXNvbHZlcik7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmV3U2hvcnRjdXQpKSB7CisgICAgICAgICAgICAvLyBJZiBuZXdTaG9ydGN1dCBpcyBlbXB0eSB3ZSBqdXN0IGRlbGV0ZWQgdGhpcywgbm8gbmVlZCB0byBkbyBpdCBhZ2FpbgorICAgICAgICAgICAgVXNlckRpY3Rpb25hcnlTZXR0aW5ncy5kZWxldGVXb3JkKG5ld1dvcmQsIG5ld1Nob3J0Y3V0LCByZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbiB0aGlzIGNsYXNzIHdlIHVzZSB0aGUgZW1wdHkgc3RyaW5nIHRvIHJlcHJlc2VudCAnYWxsIGxvY2FsZXMnIGFuZCBtTG9jYWxlIGNhbm5vdAorICAgICAgICAvLyBiZSBudWxsLiBIb3dldmVyIHRoZSBhZGRXb3JkIG1ldGhvZCB0YWtlcyBudWxsIHRvIG1lYW4gJ2FsbCBsb2NhbGVzJy4KKyAgICAgICAgVXNlckRpY3Rpb25hcnlDb21wYXRVdGlscy5hZGRXb3JkKGNvbnRleHQsIG5ld1dvcmQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBGUkVRVUVOQ1lfRk9SX1VTRVJfRElDVElPTkFSWV9BRERTLCBuZXdTaG9ydGN1dCwgVGV4dFV0aWxzLmlzRW1wdHkobUxvY2FsZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA6IExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobUxvY2FsZSkpOworCisgICAgICAgIHJldHVybiBDT0RFX1dPUkRfQURERUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSEFTX1dPUkRfUFJPSkVDVElPTiA9IHsgVXNlckRpY3Rpb25hcnkuV29yZHMuV09SRCB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfV09SRF9TRUxFQ1RJT05fT05FX0xPQ0FMRSA9IFVzZXJEaWN0aW9uYXJ5LldvcmRzLldPUkQKKyAgICAgICAgICAgICsgIj0/IEFORCAiICsgVXNlckRpY3Rpb25hcnkuV29yZHMuTE9DQUxFICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX1dPUkRfU0VMRUNUSU9OX0FMTF9MT0NBTEVTID0gVXNlckRpY3Rpb25hcnkuV29yZHMuV09SRAorICAgICAgICAgICAgKyAiPT8gQU5EICIgKyBVc2VyRGljdGlvbmFyeS5Xb3Jkcy5MT0NBTEUgKyAiIGlzIG51bGwiOworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNXb3JkKGZpbmFsIFN0cmluZyB3b3JkLCBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvcjsKKyAgICAgICAgLy8gbUxvY2FsZSA9PSAiIiBpbmRpY2F0ZXMgdGhpcyBpcyBhbiBlbnRyeSBmb3IgYWxsIGxhbmd1YWdlcy4gSGVyZSwgbUxvY2FsZSBjYW4ndAorICAgICAgICAvLyBiZSBudWxsIGF0IGFsbCAoaXQncyBlbnN1cmVkIGJ5IHRoZSB1cGRhdGVMb2NhbGUgbWV0aG9kKS4KKyAgICAgICAgaWYgKCIiLmVxdWFscyhtTG9jYWxlKSkgeworICAgICAgICAgICAgY3Vyc29yID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShVc2VyRGljdGlvbmFyeS5Xb3Jkcy5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgICBIQVNfV09SRF9QUk9KRUNUSU9OLCBIQVNfV09SRF9TRUxFQ1RJT05fQUxMX0xPQ0FMRVMsCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgd29yZCB9LCBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3Vyc29yID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShVc2VyRGljdGlvbmFyeS5Xb3Jkcy5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgICBIQVNfV09SRF9QUk9KRUNUSU9OLCBIQVNfV09SRF9TRUxFQ1RJT05fT05FX0xPQ0FMRSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyB3b3JkLCBtTG9jYWxlIH0sIG51bGwgLyogc29ydCBvcmRlciAqLyk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChudWxsID09IGN1cnNvcikgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRDb3VudCgpID4gMDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGN1cnNvcikgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsZVJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUxvY2FsZVN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0aW9uOworICAgICAgICAvLyBMb2NhbGVTdHJpbmcgbWF5IE5PVCBiZSBudWxsLgorICAgICAgICBwdWJsaWMgTG9jYWxlUmVuZGVyZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nKSB7CisgICAgICAgICAgICBtTG9jYWxlU3RyaW5nID0gbG9jYWxlU3RyaW5nOworICAgICAgICAgICAgaWYgKG51bGwgPT0gbG9jYWxlU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcudXNlcl9kaWN0X3NldHRpbmdzX21vcmVfbGFuZ3VhZ2VzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIiIuZXF1YWxzKGxvY2FsZVN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy51c2VyX2RpY3Rfc2V0dGluZ3NfYWxsX2xhbmd1YWdlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobG9jYWxlU3RyaW5nKS5nZXREaXNwbGF5TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZVN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYWxlU3RyaW5nOworICAgICAgICB9CisgICAgICAgIC8vICJNb3JlIGxhbmd1YWdlcy4uLiIgaXMgbnVsbCA7ICJBbGwgbGFuZ3VhZ2VzIiBpcyB0aGUgZW1wdHkgc3RyaW5nLgorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01vcmVMYW5ndWFnZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBtTG9jYWxlU3RyaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRMb2NhbGVEaXNwbGF5TmFtZVRvTGlzdChmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TG9jYWxlUmVuZGVyZXI+IGxpc3QsIGZpbmFsIFN0cmluZyBsb2NhbGUpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gbG9jYWxlKSB7CisgICAgICAgICAgICBsaXN0LmFkZChuZXcgTG9jYWxlUmVuZGVyZXIoY29udGV4dCwgbG9jYWxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgbGlzdCBvZiBsb2NhbGVzIHRvIGRpc3BsYXkgZm9yIHRoaXMgd29yZAorICAgIHB1YmxpYyBBcnJheUxpc3Q8TG9jYWxlUmVuZGVyZXI+IGdldExvY2FsZXNMaXN0KGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8U3RyaW5nPiBsb2NhbGVzID0gVXNlckRpY3Rpb25hcnlMaXN0LmdldFVzZXJEaWN0aW9uYXJ5TG9jYWxlc1NldChhY3Rpdml0eSk7CisgICAgICAgIC8vIFJlbW92ZSBvdXIgbG9jYWxlIGlmIGl0J3MgaW4sIGJlY2F1c2Ugd2UncmUgYWx3YXlzIGdvbm5hIHB1dCBpdCBhdCB0aGUgdG9wCisgICAgICAgIGxvY2FsZXMucmVtb3ZlKG1Mb2NhbGUpOyAvLyBtTG9jYWxlIG1heSBub3QgYmUgbnVsbAorICAgICAgICBmaW5hbCBTdHJpbmcgc3lzdGVtTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpOworICAgICAgICAvLyBUaGUgc3lzdGVtIGxvY2FsZSBzaG91bGQgYmUgaW5zaWRlLiBXZSB3YW50IGl0IGF0IHRoZSAybmQgc3BvdC4KKyAgICAgICAgbG9jYWxlcy5yZW1vdmUoc3lzdGVtTG9jYWxlKTsgLy8gc3lzdGVtIGxvY2FsZSBtYXkgbm90IGJlIG51bGwKKyAgICAgICAgbG9jYWxlcy5yZW1vdmUoIiIpOyAvLyBSZW1vdmUgdGhlIGVtcHR5IHN0cmluZyBpZiBpdCdzIHRoZXJlCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxMb2NhbGVSZW5kZXJlcj4gbG9jYWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsZVJlbmRlcmVyPigpOworICAgICAgICAvLyBBZGQgdGhlIHBhc3NlZCBsb2NhbGUsIHRoZW4gdGhlIHN5c3RlbSBsb2NhbGUgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdC4gQWRkIGFuCisgICAgICAgIC8vICJhbGwgbGFuZ3VhZ2VzIiBlbnRyeSBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LgorICAgICAgICBhZGRMb2NhbGVEaXNwbGF5TmFtZVRvTGlzdChhY3Rpdml0eSwgbG9jYWxlc0xpc3QsIG1Mb2NhbGUpOworICAgICAgICBpZiAoIXN5c3RlbUxvY2FsZS5lcXVhbHMobUxvY2FsZSkpIHsKKyAgICAgICAgICAgIGFkZExvY2FsZURpc3BsYXlOYW1lVG9MaXN0KGFjdGl2aXR5LCBsb2NhbGVzTGlzdCwgc3lzdGVtTG9jYWxlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBsIDogbG9jYWxlcykgeworICAgICAgICAgICAgLy8gVE9ETzogc29ydCBpbiB1bmljb2RlIG9yZGVyCisgICAgICAgICAgICBhZGRMb2NhbGVEaXNwbGF5TmFtZVRvTGlzdChhY3Rpdml0eSwgbG9jYWxlc0xpc3QsIGwpOworICAgICAgICB9CisgICAgICAgIGlmICghIiIuZXF1YWxzKG1Mb2NhbGUpKSB7CisgICAgICAgICAgICAvLyBJZiBtTG9jYWxlIGlzICIiLCB0aGVuIHdlIGFscmVhZHkgaW5zZXJ0ZWQgdGhlICJhbGwgbGFuZ3VhZ2VzIiBpdGVtLCBzbyBkb24ndCBkbyBpdAorICAgICAgICAgICAgYWRkTG9jYWxlRGlzcGxheU5hbWVUb0xpc3QoYWN0aXZpdHksIGxvY2FsZXNMaXN0LCAiIik7IC8vIG1lYW5pbmc6IGFsbCBsYW5ndWFnZXMKKyAgICAgICAgfQorICAgICAgICBsb2NhbGVzTGlzdC5hZGQobmV3IExvY2FsZVJlbmRlcmVyKGFjdGl2aXR5LCBudWxsKSk7IC8vIG1lYW5pbmc6IHNlbGVjdCBhbm90aGVyIGxvY2FsZQorICAgICAgICByZXR1cm4gbG9jYWxlc0xpc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vdXNlcmRpY3Rpb25hcnkvVXNlckRpY3Rpb25hcnlBZGRXb3JkRnJhZ21lbnQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5QWRkV29yZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjOGYyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5QWRkV29yZEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLnVzZXJkaWN0aW9uYXJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi51c2VyZGljdGlvbmFyeS5Vc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cy5Mb2NhbGVSZW5kZXJlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi51c2VyZGljdGlvbmFyeS5Vc2VyRGljdGlvbmFyeUxvY2FsZVBpY2tlci5Mb2NhdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8vIENhdmVhdDogVGhpcyBjbGFzcyBpcyBiYXNpY2FsbHkgdGFrZW4gZnJvbQorLy8gcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvaW5wdXRtZXRob2QvVXNlckRpY3Rpb25hcnlBZGRXb3JkRnJhZ21lbnQuamF2YQorLy8gaW4gb3JkZXIgdG8gZGVhbCB3aXRoIHNvbWUgZGV2aWNlcyB0aGF0IGhhdmUgaXNzdWVzIHdpdGggdGhlIHVzZXIgZGljdGlvbmFyeSBoYW5kbGluZworCisvKioKKyAqIEZyYWdtZW50IHRvIGFkZCBhIHdvcmQvc2hvcnRjdXQgdG8gdGhlIHVzZXIgZGljdGlvbmFyeS4KKyAqCisgKiBBcyBvcHBvc2VkIHRvIHRoZSBVc2VyRGljdGlvbmFyeUFjdGl2aXR5LCB0aGlzIGlzIG9ubHkgaW52b2tlZCB3aXRoaW4gU2V0dGluZ3MKKyAqIGZyb20gdGhlIFVzZXJEaWN0aW9uYXJ5U2V0dGluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyRGljdGlvbmFyeUFkZFdvcmRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50CisgICAgICAgIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciwgTG9jYXRpb25DaGFuZ2VkTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QVElPTlNfTUVOVV9BREQgPSBNZW51LkZJUlNUOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUFRJT05TX01FTlVfREVMRVRFID0gTWVudS5GSVJTVCArIDE7CisKKyAgICBwcml2YXRlIFVzZXJEaWN0aW9uYXJ5QWRkV29yZENvbnRlbnRzIG1Db250ZW50czsKKyAgICBwcml2YXRlIFZpZXcgbVJvb3RWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEZWxldGluZyA9IGZhbHNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRIYXNPcHRpb25zTWVudSh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsIEJ1bmRsZSBzYXZlZFN0YXRlKSB7CisgICAgICAgIG1Sb290VmlldyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudXNlcl9kaWN0aW9uYXJ5X2FkZF93b3JkX2Z1bGxzY3JlZW4sIG51bGwpOworICAgICAgICBtSXNEZWxldGluZyA9IGZhbHNlOworICAgICAgICBpZiAobnVsbCA9PSBtQ29udGVudHMpIHsKKyAgICAgICAgICAgIG1Db250ZW50cyA9IG5ldyBVc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cyhtUm9vdFZpZXcsIGdldEFyZ3VtZW50cygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVJvb3RWaWV3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgZmluYWwgTWVudUl0ZW0gYWN0aW9uSXRlbUFkZCA9IG1lbnUuYWRkKDAsIE9QVElPTlNfTUVOVV9BREQsIDAsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcudXNlcl9kaWN0X3NldHRpbmdzX2FkZF9tZW51X3RpdGxlKS5zZXRJY29uKFIuZHJhd2FibGUuaWNfbWVudV9hZGQpOworICAgICAgICBhY3Rpb25JdGVtQWRkLnNldFNob3dBc0FjdGlvbigKKyAgICAgICAgICAgICAgICBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NIHwgTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fV0lUSF9URVhUKTsKKyAgICAgICAgZmluYWwgTWVudUl0ZW0gYWN0aW9uSXRlbURlbGV0ZSA9IG1lbnUuYWRkKDAsIE9QVElPTlNfTUVOVV9ERUxFVEUsIDAsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcudXNlcl9kaWN0X3NldHRpbmdzX2RlbGV0ZSkuc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfbWVudV9kZWxldGUpOworICAgICAgICBhY3Rpb25JdGVtRGVsZXRlLnNldFNob3dBc0FjdGlvbigKKyAgICAgICAgICAgICAgICBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NIHwgTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fV0lUSF9URVhUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgdGhlIGZyYW1ld29yayB3aGVuIGEgbWVudSBvcHRpb24gaXMgcHJlc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBNZW51SXRlbSB0aGUgaXRlbSB0aGF0IHdhcyBwcmVzc2VkCisgICAgICogQHJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgbWVudSBwcm9jZXNzaW5nIHRvIHByb2NlZWQsIHRydWUgdG8gY29uc3VtZSBpdCBoZXJlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gT1BUSU9OU19NRU5VX0FERCkgeworICAgICAgICAgICAgLy8gYWRkZWQgdGhlIGVudHJ5IGluICJvblBhdXNlIgorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5vbkJhY2tQcmVzc2VkKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBPUFRJT05TX01FTlVfREVMRVRFKSB7CisgICAgICAgICAgICBtQ29udGVudHMuZGVsZXRlKGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgbUlzRGVsZXRpbmcgPSB0cnVlOworICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5vbkJhY2tQcmVzc2VkKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIC8vIFdlIGFyZSBiZWluZyBzaG93bjogZGlzcGxheSB0aGUgd29yZAorICAgICAgICB1cGRhdGVTcGlubmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNwaW5uZXIoKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxMb2NhbGVSZW5kZXJlcj4gbG9jYWxlc0xpc3QgPSBtQ29udGVudHMuZ2V0TG9jYWxlc0xpc3QoZ2V0QWN0aXZpdHkoKSk7CisKKyAgICAgICAgZmluYWwgU3Bpbm5lciBsb2NhbGVTcGlubmVyID0KKyAgICAgICAgICAgICAgICAoU3Bpbm5lciltUm9vdFZpZXcuZmluZFZpZXdCeUlkKFIuaWQudXNlcl9kaWN0aW9uYXJ5X2FkZF9sb2NhbGUpOworICAgICAgICBmaW5hbCBBcnJheUFkYXB0ZXI8TG9jYWxlUmVuZGVyZXI+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPExvY2FsZVJlbmRlcmVyPihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX3NwaW5uZXJfaXRlbSwgbG9jYWxlc0xpc3QpOworICAgICAgICBhZGFwdGVyLnNldERyb3BEb3duVmlld1Jlc291cmNlKGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSk7CisgICAgICAgIGxvY2FsZVNwaW5uZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgbG9jYWxlU3Bpbm5lci5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgLy8gV2UgYXJlIGJlaW5nIGhpZGRlbjogY29tbWl0IGNoYW5nZXMgdG8gdGhlIHVzZXIgZGljdGlvbmFyeSwgdW5sZXNzIHdlIHdlcmUgZGVsZXRpbmcgaXQKKyAgICAgICAgaWYgKCFtSXNEZWxldGluZykgeworICAgICAgICAgICAgbUNvbnRlbnRzLmFwcGx5KGdldEFjdGl2aXR5KCksIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoZmluYWwgQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBmaW5hbCBWaWV3IHZpZXcsIGZpbmFsIGludCBwb3MsCisgICAgICAgICAgICBmaW5hbCBsb25nIGlkKSB7CisgICAgICAgIGZpbmFsIExvY2FsZVJlbmRlcmVyIGxvY2FsZSA9IChMb2NhbGVSZW5kZXJlcilwYXJlbnQuZ2V0SXRlbUF0UG9zaXRpb24ocG9zKTsKKyAgICAgICAgaWYgKGxvY2FsZS5pc01vcmVMYW5ndWFnZXMoKSkgeworICAgICAgICAgICAgUHJlZmVyZW5jZUFjdGl2aXR5IHByZWZlcmVuY2VBY3Rpdml0eSA9IChQcmVmZXJlbmNlQWN0aXZpdHkpZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgICAgIHByZWZlcmVuY2VBY3Rpdml0eS5zdGFydFByZWZlcmVuY2VGcmFnbWVudChuZXcgVXNlckRpY3Rpb25hcnlMb2NhbGVQaWNrZXIoKSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29udGVudHMudXBkYXRlTG9jYWxlKGxvY2FsZS5nZXRMb2NhbGVTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChmaW5hbCBBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgLy8gSSdtIG5vdCBzdXJlIHdlIGNhbiBjb21lIGhlcmUsIGJ1dCBpZiB3ZSBkbywgdGhhdCdzIHRoZSByaWdodCB0aGluZyB0byBkby4KKyAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKKyAgICAgICAgbUNvbnRlbnRzLnVwZGF0ZUxvY2FsZShhcmdzLmdldFN0cmluZyhVc2VyRGljdGlvbmFyeUFkZFdvcmRDb250ZW50cy5FWFRSQV9MT0NBTEUpKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYnkgdGhlIGxvY2FsZSBwaWNrZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZVNlbGVjdGVkKGZpbmFsIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgbUNvbnRlbnRzLnVwZGF0ZUxvY2FsZShsb2NhbGUudG9TdHJpbmcoKSk7CisgICAgICAgIGdldEFjdGl2aXR5KCkub25CYWNrUHJlc3NlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5TGlzdC5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vdXNlcmRpY3Rpb25hcnkvVXNlckRpY3Rpb25hcnlMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2NDg4MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5TGlzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi51c2VyZGljdGlvbmFyeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkxvY2FsZVV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlVzZXJEaWN0aW9uYXJ5OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCisvLyBDYXZlYXQ6IFRoaXMgY2xhc3MgaXMgYmFzaWNhbGx5IHRha2VuIGZyb20KKy8vIHBhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2lucHV0bWV0aG9kL1VzZXJEaWN0aW9uYXJ5TGlzdC5qYXZhCisvLyBpbiBvcmRlciB0byBkZWFsIHdpdGggc29tZSBkZXZpY2VzIHRoYXQgaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdXNlciBkaWN0aW9uYXJ5IGhhbmRsaW5nCisKK3B1YmxpYyBjbGFzcyBVc2VyRGljdGlvbmFyeUxpc3QgZXh0ZW5kcyBQcmVmZXJlbmNlRnJhZ21lbnQgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ESUNUSU9OQVJZX1NFVFRJTkdTX0lOVEVOVF9BQ1RJT04gPQorICAgICAgICAgICAgImFuZHJvaWQuc2V0dGluZ3MuVVNFUl9ESUNUSU9OQVJZX1NFVFRJTkdTIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4oZ2V0QWN0aXZpdHkoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVHJlZVNldDxTdHJpbmc+IGdldFVzZXJEaWN0aW9uYXJ5TG9jYWxlc1NldChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gYWN0aXZpdHkubWFuYWdlZFF1ZXJ5KFVzZXJEaWN0aW9uYXJ5LldvcmRzLkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFVzZXJEaWN0aW9uYXJ5LldvcmRzLkxPQ0FMRSB9LAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBmaW5hbCBUcmVlU2V0PFN0cmluZz4gbG9jYWxlTGlzdCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKKyAgICAgICAgYm9vbGVhbiBhZGRlZEFsbExvY2FsZSA9IGZhbHNlOworICAgICAgICBpZiAobnVsbCA9PSBjdXJzb3IpIHsKKyAgICAgICAgICAgIC8vIFRoZSB1c2VyIGRpY3Rpb25hcnkgc2VydmljZSBpcyBub3QgcHJlc2VudCBvciBkaXNhYmxlZC4gUmV0dXJuIG51bGwuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KFVzZXJEaWN0aW9uYXJ5LldvcmRzLkxPQ0FMRSk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsTG9jYWxlID0gVGV4dFV0aWxzLmlzRW1wdHkobG9jYWxlKTsKKyAgICAgICAgICAgICAgICBsb2NhbGVMaXN0LmFkZChhbGxMb2NhbGUgPyAiIiA6IGxvY2FsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFsbExvY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBhZGRlZEFsbExvY2FsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFVc2VyRGljdGlvbmFyeVNldHRpbmdzLklTX1NIT1JUQ1VUX0FQSV9TVVBQT1JURUQgJiYgIWFkZGVkQWxsTG9jYWxlKSB7CisgICAgICAgICAgICAvLyBGb3IgSUNTLCB3ZSBuZWVkIHRvIHNob3cgIkZvciBhbGwgbGFuZ3VhZ2VzIiBpbiBjYXNlIHRoYXQgdGhlIGtleWJvYXJkIGxvY2FsZQorICAgICAgICAgICAgLy8gaXMgZGlmZmVyZW50IGZyb20gdGhlIHN5c3RlbSBsb2NhbGUKKyAgICAgICAgICAgIGxvY2FsZUxpc3QuYWRkKCIiKTsKKyAgICAgICAgfQorICAgICAgICBsb2NhbGVMaXN0LmFkZChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gbG9jYWxlTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gZ28gaW50byB0aGUgdXNlciBkaWN0aW9uYXJ5IGZvciBlYWNoIGxvY2FsZS4KKyAgICAgKiBAcGFyYW0gdXNlckRpY3RHcm91cCBUaGUgZ3JvdXAgdG8gcHV0IHRoZSBzZXR0aW5ncyBpbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVc2VyRGljdFNldHRpbmdzKFByZWZlcmVuY2VHcm91cCB1c2VyRGljdEdyb3VwKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgdXNlckRpY3RHcm91cC5yZW1vdmVBbGwoKTsKKyAgICAgICAgZmluYWwgVHJlZVNldDxTdHJpbmc+IGxvY2FsZUxpc3QgPQorICAgICAgICAgICAgICAgIFVzZXJEaWN0aW9uYXJ5TGlzdC5nZXRVc2VyRGljdGlvbmFyeUxvY2FsZXNTZXQoYWN0aXZpdHkpOworCisgICAgICAgIGlmIChsb2NhbGVMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdXNlckRpY3RHcm91cC5hZGRQcmVmZXJlbmNlKGNyZWF0ZVVzZXJEaWN0aW9uYXJ5UHJlZmVyZW5jZShudWxsLCBhY3Rpdml0eSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgbG9jYWxlIDogbG9jYWxlTGlzdCkgeworICAgICAgICAgICAgICAgIHVzZXJEaWN0R3JvdXAuYWRkUHJlZmVyZW5jZShjcmVhdGVVc2VyRGljdGlvbmFyeVByZWZlcmVuY2UobG9jYWxlLCBhY3Rpdml0eSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2luZ2xlIFVzZXIgRGljdGlvbmFyeSBQcmVmZXJlbmNlIG9iamVjdCwgd2l0aCBpdHMgcGFyYW1ldGVycyBzZXQuCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIGZvciB3aGljaCB0aGlzIHVzZXIgZGljdGlvbmFyeSBpcyBmb3IuCisgICAgICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBwcmVmZXJlbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVmZXJlbmNlIGNyZWF0ZVVzZXJEaWN0aW9uYXJ5UHJlZmVyZW5jZShTdHJpbmcgbG9jYWxlLCBBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlIG5ld1ByZWYgPSBuZXcgUHJlZmVyZW5jZShnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVVNFUl9ESUNUSU9OQVJZX1NFVFRJTkdTX0lOVEVOVF9BQ1RJT04pOworICAgICAgICBpZiAobnVsbCA9PSBsb2NhbGUpIHsKKyAgICAgICAgICAgIG5ld1ByZWYuc2V0VGl0bGUoTG9jYWxlLmdldERlZmF1bHQoKS5nZXREaXNwbGF5TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgiIi5lcXVhbHMobG9jYWxlKSkKKyAgICAgICAgICAgICAgICBuZXdQcmVmLnNldFRpdGxlKGdldFN0cmluZyhSLnN0cmluZy51c2VyX2RpY3Rfc2V0dGluZ3NfYWxsX2xhbmd1YWdlcykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5ld1ByZWYuc2V0VGl0bGUoTG9jYWxlVXRpbHMuY29uc3RydWN0TG9jYWxlRnJvbVN0cmluZyhsb2NhbGUpLmdldERpc3BsYXlOYW1lKCkpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJsb2NhbGUiLCBsb2NhbGUpOworICAgICAgICAgICAgbmV3UHJlZi5nZXRFeHRyYXMoKS5wdXRTdHJpbmcoImxvY2FsZSIsIGxvY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgbmV3UHJlZi5zZXRJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgbmV3UHJlZi5zZXRGcmFnbWVudChVc2VyRGljdGlvbmFyeVNldHRpbmdzLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBuZXdQcmVmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBjcmVhdGVVc2VyRGljdFNldHRpbmdzKGdldFByZWZlcmVuY2VTY3JlZW4oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vdXNlcmRpY3Rpb25hcnkvVXNlckRpY3Rpb25hcnlMb2NhbGVQaWNrZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5TG9jYWxlUGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkM2ZiOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5TG9jYWxlUGlja2VyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4udXNlcmRpY3Rpb25hcnk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8vIENhdmVhdDogVGhpcyBjbGFzcyBpcyBiYXNpY2FsbHkgdGFrZW4gZnJvbQorLy8gcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvaW5wdXRtZXRob2QvVXNlckRpY3Rpb25hcnlMb2NhbGVQaWNrZXIuamF2YQorLy8gaW4gb3JkZXIgdG8gZGVhbCB3aXRoIHNvbWUgZGV2aWNlcyB0aGF0IGhhdmUgaXNzdWVzIHdpdGggdGhlIHVzZXIgZGljdGlvbmFyeSBoYW5kbGluZworCitwdWJsaWMgY2xhc3MgVXNlckRpY3Rpb25hcnlMb2NhbGVQaWNrZXIgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgcHVibGljIFVzZXJEaWN0aW9uYXJ5TG9jYWxlUGlja2VyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExvY2F0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2NhbGVTZWxlY3RlZChMb2NhbGUgbG9jYWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi91c2VyZGljdGlvbmFyeS9Vc2VyRGljdGlvbmFyeVNldHRpbmdzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi91c2VyZGljdGlvbmFyeS9Vc2VyRGljdGlvbmFyeVNldHRpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkZGE5NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3VzZXJkaWN0aW9uYXJ5L1VzZXJEaWN0aW9uYXJ5U2V0dGluZ3MuamF2YQpAQCAtMCwwICsxLDMzNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4udXNlcmRpY3Rpb25hcnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVXNlckRpY3Rpb25hcnk7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BbHBoYWJldEluZGV4ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VjdGlvbkluZGV4ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8vIENhdmVhdDogVGhpcyBjbGFzcyBpcyBiYXNpY2FsbHkgdGFrZW4gZnJvbQorLy8gcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvaW5wdXRtZXRob2QvVXNlckRpY3Rpb25hcnlTZXR0aW5ncy5qYXZhCisvLyBpbiBvcmRlciB0byBkZWFsIHdpdGggc29tZSBkZXZpY2VzIHRoYXQgaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdXNlciBkaWN0aW9uYXJ5IGhhbmRsaW5nCisKK3B1YmxpYyBjbGFzcyBVc2VyRGljdGlvbmFyeVNldHRpbmdzIGV4dGVuZHMgTGlzdEZyYWdtZW50IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TSE9SVENVVF9BUElfU1VQUE9SVEVEID0KKyAgICAgICAgICAgIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLkpFTExZX0JFQU47CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBRVUVSWV9QUk9KRUNUSU9OX1NIT1JUQ1VUX1VOU1VQUE9SVEVEID0KKyAgICAgICAgICAgIHsgVXNlckRpY3Rpb25hcnkuV29yZHMuX0lELCBVc2VyRGljdGlvbmFyeS5Xb3Jkcy5XT1JEfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBRVUVSWV9QUk9KRUNUSU9OX1NIT1JUQ1VUX1NVUFBPUlRFRCA9CisgICAgICAgICAgICB7IFVzZXJEaWN0aW9uYXJ5LldvcmRzLl9JRCwgVXNlckRpY3Rpb25hcnkuV29yZHMuV09SRCwgVXNlckRpY3Rpb25hcnkuV29yZHMuU0hPUlRDVVR9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFFVRVJZX1BST0pFQ1RJT04gPQorICAgICAgICAgICAgSVNfU0hPUlRDVVRfQVBJX1NVUFBPUlRFRCA/CisgICAgICAgICAgICAgICAgICAgIFFVRVJZX1BST0pFQ1RJT05fU0hPUlRDVVRfU1VQUE9SVEVEIDogUVVFUllfUFJPSkVDVElPTl9TSE9SVENVVF9VTlNVUFBPUlRFRDsKKworICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgc2hvcnRjdXQgaW4gdGhlIGFib3ZlIGFycmF5LgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9TSE9SVENVVCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBREFQVEVSX0ZST01fU0hPUlRDVVRfVU5TVVBQT1JURUQgPSB7CisgICAgICAgIFVzZXJEaWN0aW9uYXJ5LldvcmRzLldPUkQsCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFEQVBURVJfRlJPTV9TSE9SVENVVF9TVVBQT1JURUQgPSB7CisgICAgICAgIFVzZXJEaWN0aW9uYXJ5LldvcmRzLldPUkQsIFVzZXJEaWN0aW9uYXJ5LldvcmRzLlNIT1JUQ1VUCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFEQVBURVJfRlJPTSA9IElTX1NIT1JUQ1VUX0FQSV9TVVBQT1JURUQgPworICAgICAgICAgICAgQURBUFRFUl9GUk9NX1NIT1JUQ1VUX1NVUFBPUlRFRCA6IEFEQVBURVJfRlJPTV9TSE9SVENVVF9VTlNVUFBPUlRFRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEFEQVBURVJfVE9fU0hPUlRDVVRfVU5TVVBQT1JURUQgPSB7CisgICAgICAgIGFuZHJvaWQuUi5pZC50ZXh0MSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQURBUFRFUl9UT19TSE9SVENVVF9TVVBQT1JURUQgPSB7CisgICAgICAgIGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEFEQVBURVJfVE8gPSBJU19TSE9SVENVVF9BUElfU1VQUE9SVEVEID8KKyAgICAgICAgICAgIEFEQVBURVJfVE9fU0hPUlRDVVRfU1VQUE9SVEVEIDogQURBUFRFUl9UT19TSE9SVENVVF9VTlNVUFBPUlRFRDsKKworICAgIC8vIEVpdGhlciB0aGUgbG9jYWxlIGlzIGVtcHR5IChtZWFucyB0aGUgd29yZCBpcyBhcHBsaWNhYmxlIHRvIGFsbCBsb2NhbGVzKQorICAgIC8vIG9yIHRoZSB3b3JkIGVxdWFscyBvdXIgY3VycmVudCBsb2NhbGUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfU0VMRUNUSU9OID0KKyAgICAgICAgICAgIFVzZXJEaWN0aW9uYXJ5LldvcmRzLkxPQ0FMRSArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1NFTEVDVElPTl9BTExfTE9DQUxFUyA9CisgICAgICAgICAgICBVc2VyRGljdGlvbmFyeS5Xb3Jkcy5MT0NBTEUgKyAiIGlzIG51bGwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9TRUxFQ1RJT05fV0lUSF9TSE9SVENVVCA9IFVzZXJEaWN0aW9uYXJ5LldvcmRzLldPUkQKKyAgICAgICAgICAgICsgIj0/IEFORCAiICsgVXNlckRpY3Rpb25hcnkuV29yZHMuU0hPUlRDVVQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfU0VMRUNUSU9OX1dJVEhPVVRfU0hPUlRDVVQgPSBVc2VyRGljdGlvbmFyeS5Xb3Jkcy5XT1JECisgICAgICAgICAgICArICI9PyBBTkQgIiArIFVzZXJEaWN0aW9uYXJ5LldvcmRzLlNIT1JUQ1VUICsgIiBpcyBudWxsIE9SICIKKyAgICAgICAgICAgICsgVXNlckRpY3Rpb25hcnkuV29yZHMuU0hPUlRDVVQgKyAiPScnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1NFTEVDVElPTl9TSE9SVENVVF9VTlNVUFBPUlRFRCA9CisgICAgICAgICAgICBVc2VyRGljdGlvbmFyeS5Xb3Jkcy5XT1JEICsgIj0/IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUFRJT05TX01FTlVfQUREID0gTWVudS5GSVJTVDsKKworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1Mb2NhbGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldEFjdGl2aXR5KCkuZ2V0QWN0aW9uQmFyKCkuc2V0VGl0bGUoUi5zdHJpbmcuZWRpdF9wZXJzb25hbF9kaWN0aW9uYXJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoCisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBSLmxheW91dC51c2VyX2RpY3Rpb25hcnlfcHJlZmVyZW5jZV9saXN0X2ZyYWdtZW50LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGdldEFjdGl2aXR5KCkuZ2V0SW50ZW50KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbGVGcm9tSW50ZW50ID0KKyAgICAgICAgICAgICAgICBudWxsID09IGludGVudCA/IG51bGwgOiBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoImxvY2FsZSIpOworCisgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBnZXRBcmd1bWVudHMoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZUZyb21Bcmd1bWVudHMgPQorICAgICAgICAgICAgICAgIG51bGwgPT0gYXJndW1lbnRzID8gbnVsbCA6IGFyZ3VtZW50cy5nZXRTdHJpbmcoImxvY2FsZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbGU7CisgICAgICAgIGlmIChudWxsICE9IGxvY2FsZUZyb21Bcmd1bWVudHMpIHsKKyAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZUZyb21Bcmd1bWVudHM7CisgICAgICAgIH0gZWxzZSBpZiAobnVsbCAhPSBsb2NhbGVGcm9tSW50ZW50KSB7CisgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGVGcm9tSW50ZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9jYWxlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIG1Mb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIG1DdXJzb3IgPSBjcmVhdGVDdXJzb3IobG9jYWxlKTsKKyAgICAgICAgVGV4dFZpZXcgZW1wdHlWaWV3ID0gKFRleHRWaWV3KSBnZXRWaWV3KCkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5lbXB0eSk7CisgICAgICAgIGVtcHR5Vmlldy5zZXRUZXh0KFIuc3RyaW5nLnVzZXJfZGljdF9zZXR0aW5nc19lbXB0eV90ZXh0KTsKKworICAgICAgICBmaW5hbCBMaXN0VmlldyBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7CisgICAgICAgIGxpc3RWaWV3LnNldEFkYXB0ZXIoY3JlYXRlQWRhcHRlcigpKTsKKyAgICAgICAgbGlzdFZpZXcuc2V0RmFzdFNjcm9sbEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGxpc3RWaWV3LnNldEVtcHR5VmlldyhlbXB0eVZpZXcpOworCisgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworCisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIEN1cnNvciBjcmVhdGVDdXJzb3IoZmluYWwgU3RyaW5nIGxvY2FsZSkgeworICAgICAgICAvLyBMb2NhbGUgY2FuIGJlIGFueSBvZjoKKyAgICAgICAgLy8gLSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9jYWxlLCBhcyByZXR1cm5lZCBieSBMb2NhbGUjdG9TdHJpbmcoKQorICAgICAgICAvLyAtIFRoZSBlbXB0eSBzdHJpbmcuIFRoaXMgbWVhbnMgd2Ugd2FudCBhIGN1cnNvciByZXR1cm5pbmcgd29yZHMgdmFsaWQgZm9yIGFsbCBsb2NhbGVzLgorICAgICAgICAvLyAtIG51bGwuIFRoaXMgbWVhbnMgd2Ugd2FudCBhIGN1cnNvciBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLCB3aGF0ZXZlciB0aGlzIGlzLgorICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb250cmFzdHMgd2l0aCB0aGUgZGF0YSBpbnNpZGUgdGhlIGRhdGFiYXNlLCB3aGVyZSBOVUxMIG1lYW5zICJhbGwKKyAgICAgICAgLy8gbG9jYWxlcyIgYW5kIHRoZXJlIHNob3VsZCBuZXZlciBiZSBhbiBlbXB0eSBzdHJpbmcuIFRoZSBjb25mdXNpb24gaXMgY2FsbGVkIGJ5IHRoZQorICAgICAgICAvLyBoaXN0b3JpY2FsIHVzZSBvZiBudWxsIGZvciAiYWxsIGxvY2FsZXMiLgorICAgICAgICAvLyBUT0RPOiBpdCBzaG91bGQgYmUgZWFzeSB0byBtYWtlIHRoaXMgbW9yZSByZWFkYWJsZSBieSBtYWtpbmcgdGhlIHNwZWNpYWwgdmFsdWVzCisgICAgICAgIC8vIGh1bWFuLXJlYWRhYmxlLCBsaWtlICJhbGxfbG9jYWxlcyIgYW5kICJjdXJyZW50X2xvY2FsZXMiIHN0cmluZ3MsIHByb3ZpZGVkIHRoZXkKKyAgICAgICAgLy8gY2FuIGJlIGd1YXJhbnRlZWQgbm90IHRvIG1hdGNoIGxvY2FsZXMgdGhhdCBtYXkgZXhpc3QuCisgICAgICAgIGlmICgiIi5lcXVhbHMobG9jYWxlKSkgeworICAgICAgICAgICAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBzb3J0CisgICAgICAgICAgICByZXR1cm4gZ2V0QWN0aXZpdHkoKS5tYW5hZ2VkUXVlcnkoVXNlckRpY3Rpb25hcnkuV29yZHMuQ09OVEVOVF9VUkksIFFVRVJZX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgIFFVRVJZX1NFTEVDVElPTl9BTExfTE9DQUxFUywgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgIlVQUEVSKCIgKyBVc2VyRGljdGlvbmFyeS5Xb3Jkcy5XT1JEICsgIikiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeUxvY2FsZSA9IG51bGwgIT0gbG9jYWxlID8gbG9jYWxlIDogTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2aXR5KCkubWFuYWdlZFF1ZXJ5KFVzZXJEaWN0aW9uYXJ5LldvcmRzLkNPTlRFTlRfVVJJLCBRVUVSWV9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICBRVUVSWV9TRUxFQ1RJT04sIG5ldyBTdHJpbmdbXSB7IHF1ZXJ5TG9jYWxlIH0sCisgICAgICAgICAgICAgICAgICAgICJVUFBFUigiICsgVXNlckRpY3Rpb25hcnkuV29yZHMuV09SRCArICIpIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3RBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBZGFwdGVyKGdldEFjdGl2aXR5KCksIFIubGF5b3V0LnVzZXJfZGljdGlvbmFyeV9pdGVtLCBtQ3Vyc29yLAorICAgICAgICAgICAgICAgIEFEQVBURVJfRlJPTSwgQURBUFRFUl9UTywgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkID0gZ2V0V29yZChwb3NpdGlvbik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzaG9ydGN1dCA9IGdldFNob3J0Y3V0KHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKHdvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2hvd0FkZE9yRWRpdERpYWxvZyh3b3JkLCBzaG9ydGN1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgIGlmICghVXNlckRpY3Rpb25hcnlTZXR0aW5ncy5JU19TSE9SVENVVF9BUElfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICBmaW5hbCBMb2NhbGUgc3lzdGVtTG9jYWxlID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmxvY2FsZTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUxvY2FsZSkgJiYgIW1Mb2NhbGUuZXF1YWxzKHN5c3RlbUxvY2FsZS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIGFkZCBidXR0b24gZm9yIElDUyBiZWNhdXNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBzcGVjaWZ5aW5nIGEgbG9jYWxlCisgICAgICAgICAgICAgICAgLy8gZm9yIGFuIGVudHJ5LiBUaGlzIG5ldyAibG9jYWxlIi1hd2FyZSBBUEkgaGFzIGJlZW4gYWRkZWQgaW4gY29uanVuY3Rpb24KKyAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBzaG9ydGN1dCBBUEkuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1lbnVJdGVtIGFjdGlvbkl0ZW0gPQorICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIE9QVElPTlNfTUVOVV9BREQsIDAsIFIuc3RyaW5nLnVzZXJfZGljdF9zZXR0aW5nc19hZGRfbWVudV90aXRsZSkKKyAgICAgICAgICAgICAgICAuc2V0SWNvbihSLmRyYXdhYmxlLmljX21lbnVfYWRkKTsKKyAgICAgICAgYWN0aW9uSXRlbS5zZXRTaG93QXNBY3Rpb24oCisgICAgICAgICAgICAgICAgTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSB8IE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX1dJVEhfVEVYVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gT1BUSU9OU19NRU5VX0FERCkgeworICAgICAgICAgICAgc2hvd0FkZE9yRWRpdERpYWxvZyhudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgb3IgZWRpdCBhIHdvcmQuIElmIGVkaXRpbmdXb3JkIGlzIG51bGwsIGl0J3MgYW4gYWRkOyBvdGhlcndpc2UsIGl0J3MgYW4gZWRpdC4KKyAgICAgKiBAcGFyYW0gZWRpdGluZ1dvcmQgdGhlIHdvcmQgdG8gZWRpdCwgb3IgbnVsbCBpZiBpdCdzIGFuIGFkZC4KKyAgICAgKiBAcGFyYW0gZWRpdGluZ1Nob3J0Y3V0IHRoZSBzaG9ydGN1dCBmb3IgdGhpcyBlbnRyeSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaG93QWRkT3JFZGl0RGlhbG9nKGZpbmFsIFN0cmluZyBlZGl0aW5nV29yZCwgZmluYWwgU3RyaW5nIGVkaXRpbmdTaG9ydGN1dCkgeworICAgICAgICBmaW5hbCBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYXJncy5wdXRJbnQoVXNlckRpY3Rpb25hcnlBZGRXb3JkQ29udGVudHMuRVhUUkFfTU9ERSwgbnVsbCA9PSBlZGl0aW5nV29yZAorICAgICAgICAgICAgICAgID8gVXNlckRpY3Rpb25hcnlBZGRXb3JkQ29udGVudHMuTU9ERV9JTlNFUlQKKyAgICAgICAgICAgICAgICA6IFVzZXJEaWN0aW9uYXJ5QWRkV29yZENvbnRlbnRzLk1PREVfRURJVCk7CisgICAgICAgIGFyZ3MucHV0U3RyaW5nKFVzZXJEaWN0aW9uYXJ5QWRkV29yZENvbnRlbnRzLkVYVFJBX1dPUkQsIGVkaXRpbmdXb3JkKTsKKyAgICAgICAgYXJncy5wdXRTdHJpbmcoVXNlckRpY3Rpb25hcnlBZGRXb3JkQ29udGVudHMuRVhUUkFfU0hPUlRDVVQsIGVkaXRpbmdTaG9ydGN1dCk7CisgICAgICAgIGFyZ3MucHV0U3RyaW5nKFVzZXJEaWN0aW9uYXJ5QWRkV29yZENvbnRlbnRzLkVYVFJBX0xPQ0FMRSwgbUxvY2FsZSk7CisgICAgICAgIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkgcGEgPQorICAgICAgICAgICAgICAgIChhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5KWdldEFjdGl2aXR5KCk7CisgICAgICAgIHBhLnN0YXJ0UHJlZmVyZW5jZVBhbmVsKFVzZXJEaWN0aW9uYXJ5QWRkV29yZEZyYWdtZW50LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBhcmdzLCBSLnN0cmluZy51c2VyX2RpY3Rfc2V0dGluZ3NfYWRkX2RpYWxvZ190aXRsZSwgbnVsbCwgbnVsbCwgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29yZChmaW5hbCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKG51bGwgPT0gbUN1cnNvcikgcmV0dXJuIG51bGw7CisgICAgICAgIG1DdXJzb3IubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAvLyBIYW5kbGUgYSBwb3NzaWJsZSByYWNlLWNvbmRpdGlvbgorICAgICAgICBpZiAobUN1cnNvci5pc0FmdGVyTGFzdCgpKSByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgbUN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coVXNlckRpY3Rpb25hcnkuV29yZHMuV09SRCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFNob3J0Y3V0KGZpbmFsIGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAoIUlTX1NIT1JUQ1VUX0FQSV9TVVBQT1JURUQpIHJldHVybiBudWxsOworICAgICAgICBpZiAobnVsbCA9PSBtQ3Vyc29yKSByZXR1cm4gbnVsbDsKKyAgICAgICAgbUN1cnNvci5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIC8vIEhhbmRsZSBhIHBvc3NpYmxlIHJhY2UtY29uZGl0aW9uCisgICAgICAgIGlmIChtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCkpIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtQ3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhVc2VyRGljdGlvbmFyeS5Xb3Jkcy5TSE9SVENVVCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVXb3JkKGZpbmFsIFN0cmluZyB3b3JkLCBmaW5hbCBTdHJpbmcgc2hvcnRjdXQsCisgICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgaWYgKCFJU19TSE9SVENVVF9BUElfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICByZXNvbHZlci5kZWxldGUoVXNlckRpY3Rpb25hcnkuV29yZHMuQ09OVEVOVF9VUkksIERFTEVURV9TRUxFQ1RJT05fU0hPUlRDVVRfVU5TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHdvcmQgfSk7CisgICAgICAgIH0gZWxzZSBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2hvcnRjdXQpKSB7CisgICAgICAgICAgICByZXNvbHZlci5kZWxldGUoCisgICAgICAgICAgICAgICAgICAgIFVzZXJEaWN0aW9uYXJ5LldvcmRzLkNPTlRFTlRfVVJJLCBERUxFVEVfU0VMRUNUSU9OX1dJVEhPVVRfU0hPUlRDVVQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHdvcmQgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvbHZlci5kZWxldGUoCisgICAgICAgICAgICAgICAgICAgIFVzZXJEaWN0aW9uYXJ5LldvcmRzLkNPTlRFTlRfVVJJLCBERUxFVEVfU0VMRUNUSU9OX1dJVEhfU0hPUlRDVVQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHdvcmQsIHNob3J0Y3V0IH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlBZGFwdGVyIGV4dGVuZHMgU2ltcGxlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIFNlY3Rpb25JbmRleGVyIHsKKworICAgICAgICBwcml2YXRlIEFscGhhYmV0SW5kZXhlciBtSW5kZXhlcjsKKworICAgICAgICBwcml2YXRlIFZpZXdCaW5kZXIgbVZpZXdCaW5kZXIgPSBuZXcgVmlld0JpbmRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXRWaWV3VmFsdWUoVmlldyB2LCBDdXJzb3IgYywgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKCFJU19TSE9SVENVVF9BUElfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgbGV0IFNpbXBsZUN1cnNvckFkYXB0ZXIgc2V0IHRoZSB2aWV3IHZhbHVlcworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSBJTkRFWF9TSE9SVENVVCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2hvcnRjdXQgPSBjLmdldFN0cmluZyhJTkRFWF9TSE9SVENVVCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzaG9ydGN1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKChUZXh0Vmlldyl2KS5zZXRUZXh0KHNob3J0Y3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHYuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICAgICAgcHVibGljIE15QWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBsYXlvdXQsIEN1cnNvciBjLCBTdHJpbmdbXSBmcm9tLCBpbnRbXSB0bywKKyAgICAgICAgICAgICAgICBVc2VyRGljdGlvbmFyeVNldHRpbmdzIHNldHRpbmdzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBsYXlvdXQsIGMsIGZyb20sIHRvKTsKKworICAgICAgICAgICAgaWYgKG51bGwgIT0gYykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhbHBoYWJldCA9IGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnVzZXJfZGljdF9mYXN0X3Njcm9sbF9hbHBoYWJldCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHdvcmRDb2xJbmRleCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KFVzZXJEaWN0aW9uYXJ5LldvcmRzLldPUkQpOworICAgICAgICAgICAgICAgIG1JbmRleGVyID0gbmV3IEFscGhhYmV0SW5kZXhlcihjLCB3b3JkQ29sSW5kZXgsIGFscGhhYmV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFZpZXdCaW5kZXIobVZpZXdCaW5kZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9zaXRpb25Gb3JTZWN0aW9uKGludCBzZWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBtSW5kZXhlciA/IDAgOiBtSW5kZXhlci5nZXRQb3NpdGlvbkZvclNlY3Rpb24oc2VjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRTZWN0aW9uRm9yUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBtSW5kZXhlciA/IDAgOiBtSW5kZXhlci5nZXRTZWN0aW9uRm9yUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTZWN0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsID09IG1JbmRleGVyID8gbnVsbCA6IG1JbmRleGVyLmdldFNlY3Rpb25zKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9GZWVkYmFja0ZyYWdtZW50LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9GZWVkYmFja0ZyYWdtZW50LmphdmEKaW5kZXggMzlmOWM4Ny4uYTA3MzgyOSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvRmVlZGJhY2tGcmFnbWVudC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0ZlZWRiYWNrRnJhZ21lbnQuamF2YQpAQCAtNjUsMTIgKzY1LDEwIEBACiAgICAgICAgIG1DYW5jZWxCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwogCiAgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVzdG9yaW5nIGZyb20gc2F2ZWRJbnN0YW5jZVN0YXRlIik7CiAgICAgICAgICAgICByZXN0b3JlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBnZXRBY3Rpdml0eSgpLmdldEludGVudCgpLmdldEV4dHJhcygpOwogICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVzdG9yaW5nIGZyb20gZ2V0QXJndW1lbnRzKCkiKTsKICAgICAgICAgICAgICAgICByZXN0b3JlU3RhdGUoYnVuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODEsMTAgKzc5LDcgQEAKICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIFZpZXcgdmlldykgewogICAgICAgICBmaW5hbCBSZXNlYXJjaExvZ2dlciByZXNlYXJjaExvZ2dlciA9IFJlc2VhcmNoTG9nZ2VyLmdldEluc3RhbmNlKCk7CiAgICAgICAgIGlmICh2aWV3ID09IG1JbmNsdWRpbmdVc2VyUmVjb3JkaW5nQ2hlY2tCb3gpIHsKLSAgICAgICAgICAgIGlmIChoYXNVc2VyUmVjb3JkaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlY29yZGluZwotICAgICAgICAgICAgICAgIHNldEhhc1VzZXJSZWNvcmRpbmcoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtSW5jbHVkaW5nVXNlclJlY29yZGluZ0NoZWNrQm94LmlzQ2hlY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgICAgICAgICBvblNhdmVJbnN0YW5jZVN0YXRlKGJ1bmRsZSk7CiAKQEAgLTEwMyw5ICs5OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5yZXNlYXJjaF9mZWVkYmFja19lbXB0eV9mZWVkYmFja19lcnJvcl9tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0luY2x1ZGluZ0FjY291bnROYW1lID0gaXNJbmNsdWRpbmdBY2NvdW50TmFtZSgpOwotICAgICAgICAgICAgICAgIHJlc2VhcmNoTG9nZ2VyLnNlbmRGZWVkYmFjayhmZWVkYmFja0NvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNJbmNsdWRpbmdIaXN0b3J5ICovLCBpc0luY2x1ZGluZ0FjY291bnROYW1lLCBoYXNVc2VyUmVjb3JkaW5nKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJbmNsdWRpbmdBY2NvdW50TmFtZSA9IG1JbmNsdWRpbmdBY2NvdW50TmFtZUNoZWNrQm94LmlzQ2hlY2tlZCgpOworICAgICAgICAgICAgICAgIHJlc2VhcmNoTG9nZ2VyLnNlbmRGZWVkYmFjayhmZWVkYmFja0NvbnRlbnRzLCBmYWxzZSAvKiBpc0luY2x1ZGluZ0hpc3RvcnkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBpc0luY2x1ZGluZ0FjY291bnROYW1lLCBtSW5jbHVkaW5nVXNlclJlY29yZGluZ0NoZWNrQm94LmlzQ2hlY2tlZCgpKTsKICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmZpbmlzaCgpOwogICAgICAgICAgICAgICAgIHJlc2VhcmNoTG9nZ2VyLnNldEZlZWRiYWNrRGlhbG9nQnVuZGxlKG51bGwpOwogICAgICAgICAgICAgICAgIHJlc2VhcmNoTG9nZ2VyLm9uTGVhdmluZ1NlbmRGZWVkYmFja0RpYWxvZygpOwpAQCAtMTI1LDI5ICsxMjAsMTMgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIHNhdmVkRmVlZGJhY2tTdHJpbmcgPSBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CiAKICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRkVFREJBQ0tfU1RSSU5HLCBzYXZlZEZlZWRiYWNrU3RyaW5nKTsKLSAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oS0VZX0lOQ0xVREVfQUNDT1VOVF9OQU1FLCBpc0luY2x1ZGluZ0FjY291bnROYW1lKCkpOwotICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfSEFTX1VTRVJfUkVDT1JESU5HLCBoYXNVc2VyUmVjb3JkaW5nKCkpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfSU5DTFVERV9BQ0NPVU5UX05BTUUsIG1JbmNsdWRpbmdBY2NvdW50TmFtZUNoZWNrQm94LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oS0VZX0hBU19VU0VSX1JFQ09SRElORywgbUluY2x1ZGluZ1VzZXJSZWNvcmRpbmdDaGVja0JveC5pc0NoZWNrZWQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKGZpbmFsIEJ1bmRsZSBidW5kbGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVN0YXRlKGZpbmFsIEJ1bmRsZSBidW5kbGUpIHsKICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoYnVuZGxlLmdldFN0cmluZyhLRVlfRkVFREJBQ0tfU1RSSU5HKSk7Ci0gICAgICAgIHNldElzSW5jbHVkaW5nQWNjb3VudE5hbWUoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0lOQ0xVREVfQUNDT1VOVF9OQU1FKSk7Ci0gICAgICAgIHNldEhhc1VzZXJSZWNvcmRpbmcoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0hBU19VU0VSX1JFQ09SRElORykpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNVc2VyUmVjb3JkaW5nKCkgewotICAgICAgICByZXR1cm4gbUluY2x1ZGluZ1VzZXJSZWNvcmRpbmdDaGVja0JveC5pc0NoZWNrZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SGFzVXNlclJlY29yZGluZyhmaW5hbCBib29sZWFuIGhhc1JlY29yZGluZykgewotICAgICAgICBtSW5jbHVkaW5nVXNlclJlY29yZGluZ0NoZWNrQm94LnNldENoZWNrZWQoaGFzUmVjb3JkaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNsdWRpbmdBY2NvdW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbmNsdWRpbmdBY2NvdW50TmFtZUNoZWNrQm94LmlzQ2hlY2tlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJc0luY2x1ZGluZ0FjY291bnROYW1lKGZpbmFsIGJvb2xlYW4gaXNJbmNsdWRpbmdBY2NvdW50TmFtZSkgewotICAgICAgICBtSW5jbHVkaW5nQWNjb3VudE5hbWVDaGVja0JveC5zZXRDaGVja2VkKGlzSW5jbHVkaW5nQWNjb3VudE5hbWUpOworICAgICAgICBtSW5jbHVkaW5nQWNjb3VudE5hbWVDaGVja0JveC5zZXRDaGVja2VkKGJ1bmRsZS5nZXRCb29sZWFuKEtFWV9JTkNMVURFX0FDQ09VTlRfTkFNRSkpOworICAgICAgICBtSW5jbHVkaW5nVXNlclJlY29yZGluZ0NoZWNrQm94LnNldENoZWNrZWQoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0hBU19VU0VSX1JFQ09SRElORykpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0ZpeGVkTG9nQnVmZmVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9GaXhlZExvZ0J1ZmZlci5qYXZhCmluZGV4IDc4ZGM1OTUuLjhiNjRkZTggMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0ZpeGVkTG9nQnVmZmVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvRml4ZWRMb2dCdWZmZXIuamF2YQpAQCAtNTEsMzggKzUxLDM2IEBACiAgICAgICAgIG1OdW1BY3R1YWxXb3JkcyA9IDA7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGludCBnZXROdW1BY3R1YWxXb3JkcygpIHsKLSAgICAgICAgcmV0dXJuIG1OdW1BY3R1YWxXb3JkczsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBBZGRzIGEgbmV3IExvZ1VuaXQgdG8gdGhlIGZyb250IG9mIHRoZSBMSUZPIHF1ZXVlLCBldmljdGluZyBleGlzdGluZyBMb2dVbml0J3MKICAgICAgKiAob2xkZXN0IGZpcnN0KSBpZiB3b3JkIGNhcGFjaXR5IGlzIHJlYWNoZWQuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2hpZnRJbihmaW5hbCBMb2dVbml0IG5ld0xvZ1VuaXQpIHsKLSAgICAgICAgaWYgKCFuZXdMb2dVbml0Lmhhc1dvcmQoKSkgewotICAgICAgICAgICAgLy8gVGhpcyBMb2dVbml0IGlzbid0IGEgd29yZCwgc28gaXQgZG9lc24ndCBjb3VudCB0b3dhcmQgdGhlIHdvcmQtbGltaXQuCisgICAgICAgIGlmICghbmV3TG9nVW5pdC5oYXNPbmVPck1vcmVXb3JkcygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIExvZ1VuaXQgZG9lc24ndCBjb250YWluIGFueSB3b3JkLCBzbyBpdCBkb2Vzbid0IGNvdW50IHRvd2FyZCB0aGUgd29yZC1saW1pdC4KICAgICAgICAgICAgIHN1cGVyLnNoaWZ0SW4obmV3TG9nVW5pdCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IG51bVdvcmRzSW5jb21pbmcgPSBuZXdMb2dVbml0LmdldE51bVdvcmRzKCk7CiAgICAgICAgIGlmIChtTnVtQWN0dWFsV29yZHMgPj0gbVdvcmRDYXBhY2l0eSkgewogICAgICAgICAgICAgLy8gR2l2ZSBzdWJjbGFzcyBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIGJ1ZmZlciBmdWxsIGNvbmRpdGlvbiBieSBzaGlmdGluZyBvdXQgbG9nVW5pdHMuCisgICAgICAgICAgICAvLyBUT0RPOiBUZWxsIG9uQnVmZmVyRnVsbCgpIGhvdyBtdWNoIHNwYWNlIGl0IG5lZWRzIHRvIG1ha2UgdG8gYXZvaWQgZm9yY2VkIGV2aWN0aW9uLgogICAgICAgICAgICAgb25CdWZmZXJGdWxsKCk7CiAgICAgICAgICAgICAvLyBJZiBzdGlsbCBmdWxsLCBldmljdC4KICAgICAgICAgICAgIGlmIChtTnVtQWN0dWFsV29yZHMgPj0gbVdvcmRDYXBhY2l0eSkgewotICAgICAgICAgICAgICAgIHNoaWZ0T3V0V29yZHMoMSk7CisgICAgICAgICAgICAgICAgc2hpZnRPdXRXb3JkcyhudW1Xb3Jkc0luY29taW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzdXBlci5zaGlmdEluKG5ld0xvZ1VuaXQpOwotICAgICAgICBtTnVtQWN0dWFsV29yZHMrKzsgLy8gTXVzdCBiZSBhIHdvcmQsIG9yIHdlIHdvdWxkbid0IGJlIGhlcmUuCisgICAgICAgIG1OdW1BY3R1YWxXb3JkcyArPSBudW1Xb3Jkc0luY29taW5nOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMb2dVbml0IHVuc2hpZnRJbigpIHsKICAgICAgICAgZmluYWwgTG9nVW5pdCBsb2dVbml0ID0gc3VwZXIudW5zaGlmdEluKCk7Ci0gICAgICAgIGlmIChsb2dVbml0ICE9IG51bGwgJiYgbG9nVW5pdC5oYXNXb3JkKCkpIHsKLSAgICAgICAgICAgIG1OdW1BY3R1YWxXb3Jkcy0tOworICAgICAgICBpZiAobG9nVW5pdCAhPSBudWxsICYmIGxvZ1VuaXQuaGFzT25lT3JNb3JlV29yZHMoKSkgeworICAgICAgICAgICAgbU51bUFjdHVhbFdvcmRzIC09IGxvZ1VuaXQuZ2V0TnVtV29yZHMoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbG9nVW5pdDsKICAgICB9CkBAIC0xMTMsMTggKzExMSwyOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMb2dVbml0IHNoaWZ0T3V0KCkgewogICAgICAgICBmaW5hbCBMb2dVbml0IGxvZ1VuaXQgPSBzdXBlci5zaGlmdE91dCgpOwotICAgICAgICBpZiAobG9nVW5pdCAhPSBudWxsICYmIGxvZ1VuaXQuaGFzV29yZCgpKSB7Ci0gICAgICAgICAgICBtTnVtQWN0dWFsV29yZHMtLTsKKyAgICAgICAgaWYgKGxvZ1VuaXQgIT0gbnVsbCAmJiBsb2dVbml0Lmhhc09uZU9yTW9yZVdvcmRzKCkpIHsKKyAgICAgICAgICAgIG1OdW1BY3R1YWxXb3JkcyAtPSBsb2dVbml0LmdldE51bVdvcmRzKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGxvZ1VuaXQ7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hpZnRPdXRXb3JkcyhmaW5hbCBpbnQgbnVtV29yZHMpIHsKLSAgICAgICAgZmluYWwgaW50IHRhcmdldE51bVdvcmRzID0gbU51bUFjdHVhbFdvcmRzIC0gbnVtV29yZHM7Ci0gICAgICAgIGZpbmFsIExpbmtlZExpc3Q8TG9nVW5pdD4gbG9nVW5pdHMgPSBnZXRMb2dVbml0cygpOwotICAgICAgICB3aGlsZSAobU51bUFjdHVhbFdvcmRzID4gdGFyZ2V0TnVtV29yZHMgJiYgIWxvZ1VuaXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc2hpZnRPdXQoKTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIFJlbW92ZSBMb2dVbml0cyBmcm9tIHRoZSBmcm9udCBvZiB0aGUgTG9nQnVmZmVyIHVudGlsIHtAY29kZSBudW1Xb3Jkc30gaGF2ZSBiZWVuIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIHtAY29kZSBudW1Xb3Jkc30gaW4gdGhlIGJ1ZmZlciwgc2hpZnRzIG91dCBhbGwge0Bjb2RlIExvZ1VuaXR9cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1Xb3JkcyB0aGUgbWluaW11bSBudW1iZXIgb2Ygd29yZHMgaW4ge0BsaW5rIExvZ1VuaXR9cyB0byBzaGlmdCBvdXQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYWN0dWFsIHdvcmRzIExvZ1VuaXR9cyBzaGlmdGVkIG91dAorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc2hpZnRPdXRXb3JkcyhmaW5hbCBpbnQgbnVtV29yZHMpIHsKKyAgICAgICAgaW50IG51bVdvcmRzU2hpZnRlZE91dCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZpbmFsIExvZ1VuaXQgbG9nVW5pdCA9IHNoaWZ0T3V0KCk7CisgICAgICAgICAgICBpZiAobG9nVW5pdCA9PSBudWxsKSBicmVhazsKKyAgICAgICAgICAgIG51bVdvcmRzU2hpZnRlZE91dCArPSBsb2dVbml0LmdldE51bVdvcmRzKCk7CisgICAgICAgIH0gd2hpbGUgKG51bVdvcmRzU2hpZnRlZE91dCA8IG51bVdvcmRzKTsKKyAgICAgICAgcmV0dXJuIG51bVdvcmRzU2hpZnRlZE91dDsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzaGlmdE91dEFsbCgpIHsKQEAgLTEzNiwyNyArMTQ0LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIExvZ1VuaXR9cyBhdCB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciB0aGF0IGhhdmUgYXNzb2NpYXRlZCB3b3Jkcy4gIE5vCi0gICAgICogbW9yZSB0aGFuIHtAY29kZSBufSBMb2dVbml0cyB3aWxsIGhhdmUgd29yZHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBJZiB0aGVyZSBhcmUgbm90IGVub3VnaAotICAgICAqIExvZ1VuaXRzIGluIHRoZSBidWZmZXIgdG8gbWVldCB0aGUgd29yZCByZXF1aXJlbWVudCwgcmV0dXJucyB0aGUgYWxsIExvZ1VuaXRzLgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBMb2dVbml0fXMgYXQgdGhlIGZyb250IG9mIHRoZSBidWZmZXIgdGhhdCBoYXZlIHdvcmRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZW0uCisgICAgICoKKyAgICAgKiBUaGVyZSB3aWxsIGJlIG5vIG1vcmUgdGhhbiB7QGNvZGUgbn0gd29yZHMgaW4gdGhlIHJldHVybmVkIGxpc3QuICBTbyBpZiAyIHdvcmRzIGFyZQorICAgICAqIHJlcXVlc3RlZCwgYW5kIHRoZSBmaXJzdCBMb2dVbml0IGhhcyAzIHdvcmRzLCBpdCBpcyBub3QgcmV0dXJuZWQuICBJZiAyIHdvcmRzIGFyZSByZXF1ZXN0ZWQsCisgICAgICogYW5kIHRoZSBmaXJzdCBMb2dVbml0IGhhcyBvbmx5IDEgd29yZCwgYW5kIHRoZSBuZXh0IExvZ1VuaXQgMiB3b3Jkcywgb25seSB0aGUgZmlyc3QgTG9nVW5pdAorICAgICAqIGlzIHJldHVybmVkLiAgSWYgdGhlIGZpcnN0IExvZ1VuaXQgaGFzIG5vIHdvcmRzIGFzc29jaWF0ZWQgd2l0aCBpdCwgYW5kIHRoZSBzZWNvbmQgTG9nVW5pdAorICAgICAqIGhhcyB0aHJlZSB3b3JkcywgdGhlbiBvbmx5IHRoZSBmaXJzdCBMb2dVbml0ICh3aGljaCBoYXMgbm8gYXNzb2NpYXRlZCB3b3JkcykgaXMgcmV0dXJuZWQuICBJZgorICAgICAqIHRoZXJlIGFyZSBub3QgZW5vdWdoIExvZ1VuaXRzIGluIHRoZSBidWZmZXIgdG8gbWVldCB0aGUgd29yZCByZXF1aXJlbWVudCwgdGhlbiBhbGwgTG9nVW5pdHMKKyAgICAgKiB3aWxsIGJlIHJldHVybmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIG4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHtAbGluayBMb2dVbml0fXMgd2l0aCB3b3JkcyB0byByZXR1cm4uCiAgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0aGUge0BsaW5rIExvZ1VuaXR9cyBjb250YWluaW5nIHRoZSBmaXJzdCBuIHdvcmRzCiAgICAgICovCiAgICAgcHVibGljIEFycmF5TGlzdDxMb2dVbml0PiBwZWVrQXRGaXJzdE5Xb3JkcyhpbnQgbikgewogICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PExvZ1VuaXQ+IGxvZ1VuaXRzID0gZ2V0TG9nVW5pdHMoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxvZ1VuaXRzLnNpemUoKTsKICAgICAgICAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIG4qMiBsb2dVbml0cy4gIFRoZXJlIHdpbGwgYmUgYXQgbGVhc3Qgbiwgb25lIGZvciBlYWNoIHdvcmQsIGFuZAogICAgICAgICAvLyB0aGVyZSBtYXkgYmUgYWRkaXRpb25hbCBmb3IgcHVuY3R1YXRpb24sIGJldHdlZW4td29yZCBjb21tYW5kcywgZXRjLiAgVGhpcyBzaG91bGQgYmUKICAgICAgICAgLy8gZW5vdWdoIHRoYXQgcmVhbGxvY2F0aW9uIHdvbid0IGJlIG5lY2Vzc2FyeS4KLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PExvZ1VuaXQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExvZ1VuaXQ+KG4gKiAyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggJiYgbiA+IDA7IGkrKykgewotICAgICAgICAgICAgZmluYWwgTG9nVW5pdCBsb2dVbml0ID0gbG9nVW5pdHMuZ2V0KGkpOwotICAgICAgICAgICAgbGlzdC5hZGQobG9nVW5pdCk7Ci0gICAgICAgICAgICBpZiAobG9nVW5pdC5oYXNXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICBuLS07Ci0gICAgICAgICAgICB9CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxMb2dVbml0PiByZXN1bHRMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2dVbml0PihuICogMik7CisgICAgICAgIGZvciAoZmluYWwgTG9nVW5pdCBsb2dVbml0IDogbG9nVW5pdHMpIHsKKyAgICAgICAgICAgIG4gLT0gbG9nVW5pdC5nZXROdW1Xb3JkcygpOworICAgICAgICAgICAgaWYgKG4gPCAwKSBicmVhazsKKyAgICAgICAgICAgIHJlc3VsdExpc3QuYWRkKGxvZ1VuaXQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OworICAgICAgICByZXR1cm4gcmVzdWx0TGlzdDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Mb2dVbml0LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9Mb2dVbml0LmphdmEKaW5kZXggMWMwMTY3NS4uY2YxMzg4ZiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTG9nVW5pdC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL0xvZ1VuaXQuamF2YQpAQCAtMjYsOSArMjYsMTAgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kZWZpbmUuUHJvZHVjdGlvbkZsYWc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogLyoqCiAgKiBBIGdyb3VwIG9mIGxvZyBzdGF0ZW1lbnRzIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4KQEAgLTQ5LDI3ICs1MCw0NSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZQogICAgICAgICAgICAgJiYgUHJvZHVjdGlvbkZsYWcuVVNFU19ERVZFTE9QTUVOVF9PTkxZX0RJQUdOT1NUSUNTX0RFQlVHOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBXSElURVNQQUNFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxccysiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworCiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TG9nU3RhdGVtZW50PiBtTG9nU3RhdGVtZW50TGlzdDsKICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxPYmplY3RbXT4gbVZhbHVlc0xpc3Q7CiAgICAgLy8gQXNzdW1lIHRoYXQgbVRpbWVMaXN0IGlzIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyLiAgRG8gbm90IGluc2VydCBudWxsIHZhbHVlcyBpbnRvCiAgICAgLy8gbVRpbWVMaXN0LgogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExvbmc+IG1UaW1lTGlzdDsKLSAgICAvLyBXb3JkIHRoYXQgdGhpcyBMb2dVbml0IGdlbmVyYXRlcy4gIFNob3VsZCBiZSBudWxsIGlmIHRoZSBMb2dVbml0IGRvZXMgbm90IGdlbmVyYXRlIGEgZ2VudWluZQotICAgIC8vIHdvcmQgKGkuZS4gc2VwYXJhdG9ycyBhbG9uZSBkbyBub3QgY291bnQgYXMgYSB3b3JkKS4gIFNob3VsZCBuZXZlciBiZSBlbXB0eS4KLSAgICBwcml2YXRlIFN0cmluZyBtV29yZDsKKyAgICAvLyBXb3JkcyB0aGF0IHRoaXMgTG9nVW5pdCBnZW5lcmF0ZXMuICBTaG91bGQgYmUgbnVsbCBpZiB0aGUgZGF0YSBpbiB0aGUgTG9nVW5pdCBkb2VzIG5vdAorICAgIC8vIGdlbmVyYXRlIGEgZ2VudWluZSB3b3JkIChpLmUuIHNlcGFyYXRvcnMgYWxvbmUgZG8gbm90IGNvdW50IGFzIGEgd29yZCkuICBTaG91bGQgbmV2ZXIgYmUKKyAgICAvLyBlbXB0eS4gIE5vdGUgdGhhdCBpZiB0aGUgdXNlciB0eXBlcyBzcGFjZXMgZXhwbGljaXRseSwgdGhlbiBub3JtYWxseSBtV29yZHMgc2hvdWxkIGNvbnRhaW4KKyAgICAvLyBvbmx5IGEgc2luZ2xlIHdvcmQ7IGl0IHdpbGwgb25seSBjb250YWluIHNwYWNlLXNlcGFyYXRlIG11bHRpcGxlIHdvcmRzIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgLy8gZW50ZXIgYSBzcGFjZSwgYW5kIHRoZSBzeXN0ZW0gZW50ZXJzIG9uZSBhdXRvbWF0aWNhbGx5LgorICAgIHByaXZhdGUgU3RyaW5nIG1Xb3JkczsKKyAgICBwcml2YXRlIFN0cmluZ1tdIG1Xb3JkQXJyYXkgPSBFTVBUWV9TVFJJTkdfQVJSQVk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1NYXlDb250YWluRGlnaXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1BhcnRPZk1lZ2F3b3JkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtQ29udGFpbnNDb3JyZWN0aW9uOwogCi0gICAgLy8gbUNvcnJlY3Rpb25UeXBlIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3b3JkIHdhcyBjb3JyZWN0ZWQgYXQgYWxsLCBhbmQgaWYgc28sIHdoZXRoZXIgaXQgd2FzCi0gICAgLy8gdG8gYSBkaWZmZXJlbnQgd29yZCBvciBqdXN0IGEgInR5cG8iIGNvcnJlY3Rpb24uICBJdCBpcyBjb25zaWRlcmVkIGEgInR5cG8iIGlmIHRoZSBmaW5hbAotICAgIC8vIHdvcmQgd2FzIGxpc3RlZCBpbiB0aGUgc3VnZ2VzdGlvbnMgYXZhaWxhYmxlIHRoZSBmaXJzdCB0aW1lIHRoZSB3b3JkIHdhcyBnZXN0dXJlZCBvcgotICAgIC8vIHRhcHBlZC4KKyAgICAvLyBtQ29ycmVjdGlvblR5cGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdvcmQgd2FzIGNvcnJlY3RlZCBhdCBhbGwsIGFuZCBpZiBzbywgdGhlIG5hdHVyZSBvZiB0aGUKKyAgICAvLyBjb3JyZWN0aW9uLgogICAgIHByaXZhdGUgaW50IG1Db3JyZWN0aW9uVHlwZTsKKyAgICAvLyBMb2dVbml0cyBzdGFydCBpbiB0aGlzIHN0YXRlLiAgSWYgYSB3b3JkIGlzIGVudGVyZWQgd2l0aG91dCBiZWluZyBjb3JyZWN0ZWQsIGl0IHdpbGwgaGF2ZQorICAgIC8vIHRoaXMgQ29ycmVjdGlvbnRUeXBlLgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUlJFQ1RJT05UWVBFX05PX0NPUlJFQ1RJT04gPSAwOworICAgIC8vIFRoZSBMb2dVbml0IHdhcyBjb3JyZWN0ZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIgaW4gYW4gdW5zcGVjaWZpZWQgd2F5LgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUlJFQ1RJT05UWVBFX0NPUlJFQ1RJT04gPSAxOworICAgIC8vIFRoZSBMb2dVbml0IHdhcyBjb3JyZWN0ZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIgdG8gYSB3b3JkIG5vdCBpbiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucyBvZgorICAgIC8vIHRoZSBmaXJzdCB3b3JkIHR5cGVkIGhlcmUuICAoTm90ZTogdGhpcyBpcyBhIGhldXJpc3RpYyB2YWx1ZSwgaXQgbWF5IGJlIGluY29ycmVjdCwgZm9yCisgICAgLy8gZXhhbXBsZSwgaWYgdGhlIHVzZXIgcmVwb3NpdGlvbnMgdGhlIGN1cnNvcikuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09SUkVDVElPTlRZUEVfRElGRkVSRU5UX1dPUkQgPSAyOworICAgIC8vIFRoZSBMb2dVbml0IHdhcyBjb3JyZWN0ZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIgdG8gYSB3b3JkIHRoYXQgd2FzIGluIHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zCisgICAgLy8gb2YgdGhlIGZpcnN0IHdvcmQgdHlwZWQgaGVyZS4gIChBZ2FpbiwgYSBoZXVyaXN0aWMpLiAgSXQgaXMgcHJvYmFibHkgYSB0eXBvIGNvcnJlY3Rpb24uCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09SUkVDVElPTlRZUEVfVFlQTyA9IDM7CisgICAgLy8gVE9ETzogUmF0aGVyIHRoYW4ganVzdCB0cmFja2luZyB0aGUgY3VycmVudCBzdGF0ZSwga2VlcCBhIGhpc3RvcmljYWwgcmVjb3JkIG9mIHRoZSBMb2dVbml0J3MKKyAgICAvLyBzdGF0ZSBhbmQgc3RhdGlzdGljcy4gIFRoaXMgc2hvdWxkIGluY2x1ZGUgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gY29ycmVjdGVkLCB3aGV0aGVyCisgICAgLy8gb3RoZXIgTG9nVW5pdCBlZGl0cyB3ZXJlIGRvbmUgYmV0d2VlbiBlZGl0cyB0byB0aGlzIExvZ1VuaXQsIGV0Yy4gIEFsc28gdHJhY2sgd2hlbiBhIExvZ1VuaXQKKyAgICAvLyBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIHdvcmQsIGJ1dCB3YXMgY29ycmVjdGVkIHRvIGVtcHR5IChiZWNhdXNlIGl0IHdhcyBkZWxldGVkLCBhbmQgdGhlcmUgaXMKKyAgICAvLyBubyBrbm93biByZXBsYWNlbWVudCkuCiAKICAgICBwcml2YXRlIFN1Z2dlc3RlZFdvcmRzIG1TdWdnZXN0ZWRXb3JkczsKIApAQCAtMTE3LDkgKzEzNiwxMSBAQAogICAgICAqIEBwYXJhbSByZXNlYXJjaExvZyB3aGVyZSB0byBwdWJsaXNoIHRoZSBjb250ZW50cyBvZiB0aGlzIHtAY29kZSBMb2dVbml0fQogICAgICAqIEBwYXJhbSBjYW5JbmNsdWRlUHJpdmF0ZURhdGEgd2hldGhlciB0aGUgcHJpdmF0ZSBkYXRhIGluIHRoaXMge0Bjb2RlIExvZ1VuaXR9IHNob3VsZCBiZQogICAgICAqIGluY2x1ZGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHB1YmxpY2F0aW9uIHRvIHRoZSBsb2cgZmlsZSBpcyBub3QgcG9zc2libGUKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHVibGlzaFRvKGZpbmFsIFJlc2VhcmNoTG9nIHJlc2VhcmNoTG9nLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuSW5jbHVkZVByaXZhdGVEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBXcml0ZSBvdXQgYW55IGxvZ1N0YXRlbWVudCB0aGF0IHBhc3NlcyB0aGUgcHJpdmFjeSBmaWx0ZXIuCiAgICAgICAgIGZpbmFsIGludCBzaXplID0gbUxvZ1N0YXRlbWVudExpc3Quc2l6ZSgpOwogICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7CkBAIC0xNjYsNyArMTg3LDcgQEAKICAgICAgICAgZmluYWwgTG9nU3RhdGVtZW50IGxvZ1N0YXRlbWVudDsKICAgICAgICAgaWYgKGNhbkluY2x1ZGVQcml2YXRlRGF0YSkgewogICAgICAgICAgICAgTE9HU1RBVEVNRU5UX0xPR19VTklUX0JFR0lOX1dJVEhfUFJJVkFURV9EQVRBLm91dHB1dFRvTG9ja2VkKGpzb25Xcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBnZXRXb3JkKCksIGdldENvcnJlY3Rpb25UeXBlKCkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSwgZ2V0V29yZHNBc1N0cmluZygpLCBnZXRDb3JyZWN0aW9uVHlwZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPR1NUQVRFTUVOVF9MT0dfVU5JVF9CRUdJTl9XSVRIT1VUX1BSSVZBVEVfREFUQS5vdXRwdXRUb0xvY2tlZChqc29uV3JpdGVyLAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CkBAIC0xODEsMjIgKzIwMiwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1hcmsgdGhlIGN1cnJlbnQgbG9nVW5pdCBhcyBjb250YWluaW5nIGRhdGEgdG8gZ2VuZXJhdGUge0Bjb2RlIHdvcmR9LgorICAgICAqIE1hcmsgdGhlIGN1cnJlbnQgbG9nVW5pdCBhcyBjb250YWluaW5nIGRhdGEgdG8gZ2VuZXJhdGUge0Bjb2RlIG5ld1dvcmRzfS4KICAgICAgKgogICAgICAqIElmIHtAY29kZSBzZXRXb3JkKCl9IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBmb3IgdGhpcyBMb2dVbml0LCB0aGVuIHRoZSBtZXRob2Qgd2lsbCB0cnkgdG8KICAgICAgKiBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIGNvcnJlY3Rpb24gaXQgaXMsIGFuZCB1cGRhdGUgaXRzIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb3JyZWN0aW9uVHlwZQogICAgICAqIGFjY29yZGluZ2x5LgogICAgICAqCi0gICAgICogQHBhcmFtIHdvcmQgVGhlIHdvcmQgdGhpcyBMb2dVbml0IGdlbmVyYXRlcy4gIENhbGxlciBzaG91bGQgbm90IHBhc3MgbnVsbCBvciB0aGUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3V29yZHMgVGhlIHdvcmRzIHRoaXMgTG9nVW5pdCBnZW5lcmF0ZXMuICBDYWxsZXIgc2hvdWxkIG5vdCBwYXNzIG51bGwgb3IgdGhlIGVtcHR5CiAgICAgICogc3RyaW5nLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdvcmQoZmluYWwgU3RyaW5nIHdvcmQpIHsKLSAgICAgICAgaWYgKGhhc1dvcmQoKSkgeworICAgIHB1YmxpYyB2b2lkIHNldFdvcmRzKGZpbmFsIFN0cmluZyBuZXdXb3JkcykgeworICAgICAgICBpZiAoaGFzT25lT3JNb3JlV29yZHMoKSkgewogICAgICAgICAgICAgLy8gVGhlIHdvcmQgd2FzIGFscmVhZHkgc2V0IG9uY2UsIGFuZCBpdCBpcyBub3cgYmVpbmcgY2hhbmdlZC4gIFNlZSBpZiB0aGUgbmV3IHdvcmQKICAgICAgICAgICAgIC8vIGlzIGNsb3NlIHRvIHRoZSBvbGQgd29yZC4gIElmIHNvLCB0aGVuIHRoZSBjaGFuZ2UgaXMgcHJvYmFibHkgYSB0eXBvIGNvcnJlY3Rpb24uCiAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZSB1c2VyIG1heSBoYXZlIGRlY2lkZWQgdG8gZW50ZXIgYSBkaWZmZXJlbnQgd29yZCwgc28gZmxhZyBpdC4KICAgICAgICAgICAgIGlmIChtU3VnZ2VzdGVkV29yZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpc0luU3VnZ2VzdGVkV29yZHMod29yZCwgbVN1Z2dlc3RlZFdvcmRzKSkgeworICAgICAgICAgICAgICAgIGlmIChpc0luU3VnZ2VzdGVkV29yZHMobmV3V29yZHMsIG1TdWdnZXN0ZWRXb3JkcykpIHsKICAgICAgICAgICAgICAgICAgICAgbUNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVElPTlRZUEVfVFlQTzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtQ29ycmVjdGlvblR5cGUgPSBDT1JSRUNUSU9OVFlQRV9ESUZGRVJFTlRfV09SRDsKQEAgLTIwNiwzOCArMjI3LDcxIEBACiAgICAgICAgICAgICAgICAgLy8gTWFyayBpdCBhcyBhIGdlbmVyaWMgY29ycmVjdGlvbi4KICAgICAgICAgICAgICAgICBtQ29ycmVjdGlvblR5cGUgPSBDT1JSRUNUSU9OVFlQRV9DT1JSRUNUSU9OOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVElPTlRZUEVfTk9fQ09SUkVDVElPTjsKICAgICAgICAgfQotICAgICAgICBtV29yZCA9IHdvcmQ7CisgICAgICAgIG1Xb3JkcyA9IG5ld1dvcmRzOworCisgICAgICAgIC8vIFVwZGF0ZSBtV29yZEFycmF5CisgICAgICAgIG1Xb3JkQXJyYXkgPSAoVGV4dFV0aWxzLmlzRW1wdHkobVdvcmRzKSkgPyBFTVBUWV9TVFJJTkdfQVJSQVkKKyAgICAgICAgICAgICAgICA6IFdISVRFU1BBQ0VfUEFUVEVSTi5zcGxpdChtV29yZHMpOworICAgICAgICBpZiAobVdvcmRBcnJheS5sZW5ndGggPiAwICYmIFRleHRVdGlscy5pc0VtcHR5KG1Xb3JkQXJyYXlbMF0pKSB7CisgICAgICAgICAgICAvLyBFbXB0eSBzdHJpbmcgYXQgYmVnaW5uaW5nIG9mIGFycmF5LiAgTXVzdCBoYXZlIGJlZW4gd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgICAgICAgICAvLyB3b3JkLiAgUmVtb3ZlIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICAgICAgICBtV29yZEFycmF5ID0gQXJyYXlzLmNvcHlPZlJhbmdlKG1Xb3JkQXJyYXksIDEsIG1Xb3JkQXJyYXkubGVuZ3RoKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29yZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Xb3JkOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29yZHNBc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1Xb3JkczsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNXb3JkKCkgewotICAgICAgICByZXR1cm4gbVdvcmQgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobVdvcmQudHJpbSgpKTsKKyAgICAvKioKKyAgICAgKiBSZXR1bnMgdGhlIHdvcmRzIGdlbmVyYXRlZCBieSB0aGUgZGF0YSBpbiB0aGlzIExvZ1VuaXQuCisgICAgICoKKyAgICAgKiBUaGUgZmlyc3Qgd29yZCBtYXkgYmUgYW4gZW1wdHkgc3RyaW5nLCBpZiB0aGUgZGF0YSBpbiB0aGUgTG9nVW5pdCBzdGFydGVkIGJ5IGdlbmVyYXRpbmcKKyAgICAgKiB3aGl0ZXNwYWNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygd29yZHMuIGFuIGVtcHR5IGxpc3Qgb2YgdGhlcmUgYXJlIG5vIHdvcmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIExvZ1VuaXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFdvcmRzQXNTdHJpbmdBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIG1Xb3JkQXJyYXk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaGFzT25lT3JNb3JlV29yZHMoKSB7CisgICAgICAgIHJldHVybiBtV29yZEFycmF5Lmxlbmd0aCA+PSAxOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7CisgICAgICAgIHJldHVybiBtV29yZEFycmF5Lmxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBSZWZhY3RvciB0byBlbGltaW5hdGUgZ2V0dGVyL3NldHRlcnMKICAgICBwdWJsaWMgdm9pZCBzZXRNYXlDb250YWluRGlnaXQoKSB7CiAgICAgICAgIG1NYXlDb250YWluRGlnaXQgPSB0cnVlOwogICAgIH0KIAorICAgIC8vIFRPRE86IFJlZmFjdG9yIHRvIGVsaW1pbmF0ZSBnZXR0ZXIvc2V0dGVycwogICAgIHB1YmxpYyBib29sZWFuIG1heUNvbnRhaW5EaWdpdCgpIHsKICAgICAgICAgcmV0dXJuIG1NYXlDb250YWluRGlnaXQ7CiAgICAgfQogCisgICAgLy8gVE9ETzogUmVmYWN0b3IgdG8gZWxpbWluYXRlIGdldHRlci9zZXR0ZXJzCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbnNDb3JyZWN0aW9uKCkgewogICAgICAgICBtQ29udGFpbnNDb3JyZWN0aW9uID0gdHJ1ZTsKICAgICB9CiAKKyAgICAvLyBUT0RPOiBSZWZhY3RvciB0byBlbGltaW5hdGUgZ2V0dGVyL3NldHRlcnMKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvcnJlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBtQ29udGFpbnNDb3JyZWN0aW9uOwogICAgIH0KIAorICAgIC8vIFRPRE86IFJlZmFjdG9yIHRvIGVsaW1pbmF0ZSBnZXR0ZXIvc2V0dGVycwogICAgIHB1YmxpYyB2b2lkIHNldENvcnJlY3Rpb25UeXBlKGZpbmFsIGludCBjb3JyZWN0aW9uVHlwZSkgewogICAgICAgICBtQ29ycmVjdGlvblR5cGUgPSBjb3JyZWN0aW9uVHlwZTsKICAgICB9CiAKKyAgICAvLyBUT0RPOiBSZWZhY3RvciB0byBlbGltaW5hdGUgZ2V0dGVyL3NldHRlcnMKICAgICBwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewogICAgICAgICByZXR1cm4gbUNvcnJlY3Rpb25UeXBlOwogICAgIH0KQEAgLTI2Nyw3ICszMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxPYmplY3RbXT4obGF0ZXJWYWx1ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxMb25nPihsYXRlclRpbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNQYXJ0T2ZNZWdhd29yZCAqLyk7Ci0gICAgICAgICAgICAgICAgbmV3TG9nVW5pdC5tV29yZCA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV3TG9nVW5pdC5tV29yZHMgPSBudWxsOwogICAgICAgICAgICAgICAgIG5ld0xvZ1VuaXQubU1heUNvbnRhaW5EaWdpdCA9IG1NYXlDb250YWluRGlnaXQ7CiAgICAgICAgICAgICAgICAgbmV3TG9nVW5pdC5tQ29udGFpbnNDb3JyZWN0aW9uID0gbUNvbnRhaW5zQ29ycmVjdGlvbjsKIApAQCAtMjg3LDkgKzM0MSw5IEBACiAgICAgICAgIG1Mb2dTdGF0ZW1lbnRMaXN0LmFkZEFsbChsb2dVbml0Lm1Mb2dTdGF0ZW1lbnRMaXN0KTsKICAgICAgICAgbVZhbHVlc0xpc3QuYWRkQWxsKGxvZ1VuaXQubVZhbHVlc0xpc3QpOwogICAgICAgICBtVGltZUxpc3QuYWRkQWxsKGxvZ1VuaXQubVRpbWVMaXN0KTsKLSAgICAgICAgbVdvcmQgPSBudWxsOwotICAgICAgICBpZiAobG9nVW5pdC5tV29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRXb3JkKGxvZ1VuaXQubVdvcmQpOworICAgICAgICBtV29yZHMgPSBudWxsOworICAgICAgICBpZiAobG9nVW5pdC5tV29yZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0V29yZHMobG9nVW5pdC5tV29yZHMpOwogICAgICAgICB9CiAgICAgICAgIG1NYXlDb250YWluRGlnaXQgPSBtTWF5Q29udGFpbkRpZ2l0IHx8IGxvZ1VuaXQubU1heUNvbnRhaW5EaWdpdDsKICAgICAgICAgbUNvbnRhaW5zQ29ycmVjdGlvbiA9IG1Db250YWluc0NvcnJlY3Rpb24gfHwgbG9nVW5pdC5tQ29udGFpbnNDb3JyZWN0aW9uOwpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTWFpbkxvZ0J1ZmZlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvTWFpbkxvZ0J1ZmZlci5qYXZhCmluZGV4IDMzMDNkMmIuLjlhYTM0OTkgMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL01haW5Mb2dCdWZmZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9NYWluTG9nQnVmZmVyLmphdmEKQEAgLTIzLDkgKzIzLDkgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5TdWdnZXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLmRlZmluZS5Qcm9kdWN0aW9uRmxhZzsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCiAvKioKICAqIE1haW5Mb2dCdWZmZXIgaXMgYSBGaXhlZExvZ0J1ZmZlciB0aGF0IHRyYWNrcyB0aGUgc3RhdGUgb2YgTG9nVW5pdHMgdG8gbWFrZSBwcml2YWN5IGd1YXJhbnRlZXMuCkBAIC0xMDAsMTAgKzEwMCw2IEBACiAgICAgICAgIHJldHVybiBtU3VnZ2VzdC5nZXRNYWluRGljdGlvbmFyeSgpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0V29yZENvdW50ZXIoKSB7Ci0gICAgICAgIG1OdW1Xb3Jkc1VudGlsU2FmZVRvU2FtcGxlID0gbU51bVdvcmRzQmV0d2Vlbk5HcmFtczsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBzZXRJc1N0b3BwaW5nKCkgewogICAgICAgICBtSXNTdG9wcGluZyA9IHRydWU7CiAgICAgfQpAQCAtMTMxLDEwICsxMjcsNyBAQAogICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxvZ1VuaXRzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBmaW5hbCBMb2dVbml0IGxvZ1VuaXQgPSBsb2dVbml0cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdvcmQgPSBsb2dVbml0LmdldFdvcmQoKTsKLSAgICAgICAgICAgICAgICBpZiAod29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bVdvcmRzSW5Mb2dVbml0TGlzdCsrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1Xb3Jkc0luTG9nVW5pdExpc3QgKz0gbG9nVW5pdC5nZXROdW1Xb3JkcygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bVdvcmRzSW5Mb2dVbml0TGlzdCA+PSBtaW5OR3JhbVNpemU7CiAgICAgICAgIH0KQEAgLTE1OCwzMiArMTUxLDM0IEBACiAgICAgICAgIC8vIHRoZSBjb21wbGV0ZSBidWZmZXIgY29udGVudHMgaW4gZGV0YWlsLgogICAgICAgICBpbnQgbnVtV29yZHNJbkxvZ1VuaXRMaXN0ID0gMDsKICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxvZ1VuaXRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgTG9nVW5pdCBsb2dVbml0ID0gbG9nVW5pdHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKCFsb2dVbml0Lmhhc1dvcmQoKSkgeworICAgICAgICBmb3IgKGZpbmFsIExvZ1VuaXQgbG9nVW5pdCA6IGxvZ1VuaXRzKSB7CisgICAgICAgICAgICBpZiAoIWxvZ1VuaXQuaGFzT25lT3JNb3JlV29yZHMoKSkgewogICAgICAgICAgICAgICAgIC8vIERpZ2l0cyBvdXRzaWRlIHdvcmRzIGFyZSBhIHByaXZhY3kgdGhyZWF0LgogICAgICAgICAgICAgICAgIGlmIChsb2dVbml0Lm1heUNvbnRhaW5EaWdpdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG51bVdvcmRzSW5Mb2dVbml0TGlzdCsrOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkID0gbG9nVW5pdC5nZXRXb3JkKCk7Ci0gICAgICAgICAgICAgICAgLy8gV29yZHMgbm90IGluIHRoZSBkaWN0aW9uYXJ5IGFyZSBhIHByaXZhY3kgdGhyZWF0LgotICAgICAgICAgICAgICAgIGlmIChSZXNlYXJjaExvZ2dlci5oYXNMZXR0ZXJzKHdvcmQpICYmICEoZGljdGlvbmFyeS5pc1ZhbGlkV29yZCh3b3JkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOT1QgU0FGRSE6IGhhc0xldHRlcnM6ICIgKyBSZXNlYXJjaExvZ2dlci5oYXNMZXR0ZXJzKHdvcmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXNWYWxpZDogIiArIChkaWN0aW9uYXJ5LmlzVmFsaWRXb3JkKHdvcmQpKSk7CisgICAgICAgICAgICAgICAgbnVtV29yZHNJbkxvZ1VuaXRMaXN0ICs9IGxvZ1VuaXQuZ2V0TnVtV29yZHMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSB3b3JkcyA9IGxvZ1VuaXQuZ2V0V29yZHNBc1N0cmluZ0FycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgd29yZCA6IHdvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdvcmRzIG5vdCBpbiB0aGUgZGljdGlvbmFyeSBhcmUgYSBwcml2YWN5IHRocmVhdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKFJlc2VhcmNoTG9nZ2VyLmhhc0xldHRlcnMod29yZCkgJiYgIShkaWN0aW9uYXJ5LmlzVmFsaWRXb3JkKHdvcmQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiXCIiICsgd29yZCArICJcIiBOT1QgU0FGRSE6IGhhc0xldHRlcnM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUmVzZWFyY2hMb2dnZXIuaGFzTGV0dGVycyh3b3JkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpc1ZhbGlkOiAiICsgKGRpY3Rpb25hcnkuaXNWYWxpZFdvcmQod29yZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gRmluYWxseSwgb25seSByZXR1cm4gdHJ1ZSBpZiB0aGUgbWluTkdyYW1TaXplIGlzIG1ldC4KLSAgICAgICAgcmV0dXJuIG51bVdvcmRzSW5Mb2dVbml0TGlzdCA+PSBtaW5OR3JhbVNpemU7CisgICAgICAgIC8vIEZpbmFsbHksIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIG5ncmFtIGlzIHRoZSByaWdodCBzaXplLgorICAgICAgICByZXR1cm4gbnVtV29yZHNJbkxvZ1VuaXRMaXN0ID09IG1pbk5HcmFtU2l6ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzaGlmdEFuZFB1Ymxpc2hBbGwoKSB7CisgICAgcHVibGljIHZvaWQgc2hpZnRBbmRQdWJsaXNoQWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgTGlua2VkTGlzdDxMb2dVbml0PiBsb2dVbml0cyA9IGdldExvZ1VuaXRzKCk7CiAgICAgICAgIHdoaWxlICghbG9nVW5pdHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBwdWJsaXNoTG9nVW5pdHNBdEZyb250T2ZCdWZmZXIoKTsKQEAgLTE5MiwyMyArMTg3LDQwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBvbkJ1ZmZlckZ1bGwoKSB7Ci0gICAgICAgIHB1Ymxpc2hMb2dVbml0c0F0RnJvbnRPZkJ1ZmZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHVibGlzaExvZ1VuaXRzQXRGcm9udE9mQnVmZmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklPRXhjZXB0aW9uIHdoZW4gcHVibGlzaGluZyBmcm9udCBvZiBMb2dCdWZmZXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHB1Ymxpc2hMb2dVbml0c0F0RnJvbnRPZkJ1ZmZlcigpIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdWJsaXNoTG9nVW5pdHNBdEZyb250T2ZCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciB0aGlzIG1ldGhvZCB0byByZXF1aXJlIGZld2VyIHBhc3NlcyB0aHJvdWdoIHRoZSBMb2dVbml0cy4gIFNob3VsZCByZWFsbHkKKyAgICAgICAgLy8gcmVxdWlyZSBvbmx5IG9uZSBwYXNzLgogICAgICAgICBBcnJheUxpc3Q8TG9nVW5pdD4gbG9nVW5pdHMgPSBwZWVrQXRGaXJzdE5Xb3JkcyhOX0dSQU1fU0laRSk7CiAgICAgICAgIGlmIChpc1NhZmVOR3JhbShsb2dVbml0cywgTl9HUkFNX1NJWkUpKSB7CiAgICAgICAgICAgICAvLyBHb29kIG4tZ3JhbSBhdCB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlci4gIFB1Ymxpc2ggaXQsIGRpc2Nsb3NpbmcgZGV0YWlscy4KICAgICAgICAgICAgIHB1Ymxpc2gobG9nVW5pdHMsIHRydWUgLyogY2FuSW5jbHVkZVByaXZhdGVEYXRhICovKTsKICAgICAgICAgICAgIHNoaWZ0T3V0V29yZHMoTl9HUkFNX1NJWkUpOwotICAgICAgICAgICAgcmVzZXRXb3JkQ291bnRlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTm8gZ29vZCBuLWdyYW0gYXQgZnJvbnQsIGFuZCBidWZmZXIgaXMgZnVsbC4gIFNoaWZ0IG91dCB0aGUgZmlyc3Qgd29yZCAob3IgaWYgdGhlcmUKLSAgICAgICAgICAgIC8vIGlzIG5vbmUsIHRoZSBleGlzdGluZyBsb2dVbml0cykuCi0gICAgICAgICAgICBsb2dVbml0cyA9IHBlZWtBdEZpcnN0TldvcmRzKDEpOwotICAgICAgICAgICAgcHVibGlzaChsb2dVbml0cywgZmFsc2UgLyogY2FuSW5jbHVkZVByaXZhdGVEYXRhICovKTsKLSAgICAgICAgICAgIHNoaWZ0T3V0V29yZHMoMSk7CisgICAgICAgICAgICBtTnVtV29yZHNVbnRpbFNhZmVUb1NhbXBsZSA9IG1OdW1Xb3Jkc0JldHdlZW5OR3JhbXM7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gTm8gZ29vZCBuLWdyYW0gYXQgZnJvbnQsIGFuZCBidWZmZXIgaXMgZnVsbC4gIFNoaWZ0IG91dCB1cCB0aHJvdWdoIHRoZSBmaXJzdCBsb2dVbml0CisgICAgICAgIC8vIHdpdGggYXNzb2NpYXRlZCB3b3JkcyAob3IgaWYgdGhlcmUgaXMgbm9uZSwgYWxsIHRoZSBleGlzdGluZyBsb2dVbml0cykuCisgICAgICAgIGxvZ1VuaXRzLmNsZWFyKCk7CisgICAgICAgIExvZ1VuaXQgbG9nVW5pdCA9IHNoaWZ0T3V0KCk7CisgICAgICAgIHdoaWxlIChsb2dVbml0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ1VuaXRzLmFkZChsb2dVbml0KTsKKyAgICAgICAgICAgIGZpbmFsIGludCBudW1Xb3JkcyA9IGxvZ1VuaXQuZ2V0TnVtV29yZHMoKTsKKyAgICAgICAgICAgIGlmIChudW1Xb3JkcyA+IDApIHsKKyAgICAgICAgICAgICAgICBtTnVtV29yZHNVbnRpbFNhZmVUb1NhbXBsZSA9IE1hdGgubWF4KDAsIG1OdW1Xb3Jkc1VudGlsU2FmZVRvU2FtcGxlIC0gbnVtV29yZHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nVW5pdCA9IHNoaWZ0T3V0KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGlzaChsb2dVbml0cywgZmFsc2UgLyogY2FuSW5jbHVkZVByaXZhdGVEYXRhICovKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxOSwxOCArMjMxLDE5IEBACiAgICAgICogQHBhcmFtIGxvZ1VuaXRzIFRoZSBsaXN0IG9mIGxvZ1VuaXRzIHRvIGJlIHB1Ymxpc2hlZC4KICAgICAgKiBAcGFyYW0gY2FuSW5jbHVkZVByaXZhdGVEYXRhIFdoZXRoZXIgdGhlIHByaXZhdGUgZGF0YSBpbiB0aGUgbG9nVW5pdHMgY2FuIGJlIGluY2x1ZGVkIGluCiAgICAgICogcHVibGljYXRpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHB1YmxpY2F0aW9uIHRvIHRoZSBsb2cgZmlsZSBpcyBub3QgcG9zc2libGUKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoKGZpbmFsIEFycmF5TGlzdDxMb2dVbml0PiBsb2dVbml0cywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuSW5jbHVkZVByaXZhdGVEYXRhKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuSW5jbHVkZVByaXZhdGVEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzaGlmdE91dFdvcmRzKGZpbmFsIGludCBudW1Xb3JkcykgewotICAgICAgICBmaW5hbCBpbnQgb2xkTnVtQWN0dWFsV29yZHMgPSBnZXROdW1BY3R1YWxXb3JkcygpOwotICAgICAgICBzdXBlci5zaGlmdE91dFdvcmRzKG51bVdvcmRzKTsKLSAgICAgICAgZmluYWwgaW50IG51bVdvcmRzU2hpZnRlZCA9IG9sZE51bUFjdHVhbFdvcmRzIC0gZ2V0TnVtQWN0dWFsV29yZHMoKTsKLSAgICAgICAgbU51bVdvcmRzVW50aWxTYWZlVG9TYW1wbGUgLT0gbnVtV29yZHNTaGlmdGVkOworICAgIHByb3RlY3RlZCBpbnQgc2hpZnRPdXRXb3JkcyhmaW5hbCBpbnQgbnVtV29yZHMpIHsKKyAgICAgICAgZmluYWwgaW50IG51bVdvcmRzU2hpZnRlZE91dCA9IHN1cGVyLnNoaWZ0T3V0V29yZHMobnVtV29yZHMpOworICAgICAgICBtTnVtV29yZHNVbnRpbFNhZmVUb1NhbXBsZSA9IE1hdGgubWF4KDAsIG1OdW1Xb3Jkc1VudGlsU2FmZVRvU2FtcGxlIC0gbnVtV29yZHNTaGlmdGVkT3V0KTsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJ3b3Jkc1VudGlsU2FmZVRvU2FtcGxlIG5vdyBhdCAiICsgbU51bVdvcmRzVW50aWxTYWZlVG9TYW1wbGUpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBudW1Xb3Jkc1NoaWZ0ZWRPdXQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2cuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nLmphdmEKaW5kZXggMzVhNDkxZi4uM2U4MjEzOSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2cuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZy5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwpAQCAtNjEsNyArNjIsMTEgQEAKICAgICAvKiBwYWNrYWdlICovIGZpbmFsIEZpbGUgbUZpbGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogCi0gICAgcHJpdmF0ZSBKc29uV3JpdGVyIG1Kc29uV3JpdGVyID0gTlVMTF9KU09OX1dSSVRFUjsKKyAgICAvLyBFYXJsaWVyIGltcGxlbWVudGF0aW9ucyB1c2VkIGEgZHVtbXkgSnNvbldyaXRlciB0aGF0IGp1c3Qgc3dhbGxvd2VkIHdoYXQgaXQgd2FzIGdpdmVuLCBidXQKKyAgICAvLyB0aGlzIHdhcyB0cmlja3kgdG8gZG8gd2VsbCwgYmVjYXVzZSBKc29uV3JpdGVyIHRocm93cyBhbiBleGNlcHRpb24gaWYgaXQgaXMgcGFzc2VkIG1vcmUgdGhhbgorICAgIC8vIG9uZSB0b3AtbGV2ZWwgb2JqZWN0LgorICAgIHByaXZhdGUgSnNvbldyaXRlciBtSnNvbldyaXRlciA9IG51bGw7CisKICAgICAvLyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBieXRlIG9mIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBvdXQgdG8gdGhlIGxvZyBmaWxlLiAgVGhpcyBtdXN0IGJlCiAgICAgLy8gcmVtZW1iZXJlZCBiZWNhdXNlIEpzb25Xcml0ZXIgcmVxdWlyZXMgdGhhdCBjYWxscyBtYXRjaGluZyBjYWxscyB0byBiZWdpbk9iamVjdCBhbmQKICAgICAvLyBlbmRPYmplY3QsIGFzIHdlbGwgYXMgYmVnaW5BcnJheSBhbmQgZW5kQXJyYXksIGFuZCB0aGUgZmlsZSBpcyBvcGVuZWQgbGF6aWx5LCBvbmx5IHdoZW4KQEAgLTY5LDI2ICs3NCw2IEBACiAgICAgLy8gY291bGQgYmUgY2F1Z2h0LCBidXQgdGhpcyBtaWdodCBzdXBwcmVzcyBvdGhlciBlcnJvcnMuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNXcml0dGVuRGF0YSA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNvbldyaXRlciBOVUxMX0pTT05fV1JJVEVSID0gbmV3IEpzb25Xcml0ZXIoCi0gICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBOdWxsT3V0cHV0U3RyZWFtKCkpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLSAgICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgewotICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgIH0KLQotICAgICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZmZlcikgewotICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IG9uZUJ5dGUpIHsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBSZXNlYXJjaExvZyhmaW5hbCBGaWxlIG91dHB1dEZpbGUsIGZpbmFsIENvbnRleHQgY29udGV4dCkgewogICAgICAgICBtRXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3IoKTsKICAgICAgICAgbUZpbGUgPSBvdXRwdXRGaWxlOwpAQCAtMTA4LDE2ICs5MywyMSBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUhhc1dyaXR0ZW5EYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhc1dyaXR0ZW5EYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSnNvbldyaXRlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgYW4gZXhjZXB0aW9uLiAgQmV0dGVyIHdvdWxkIGJlIHRvIG5vdCBldmVuCisgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gdGhlIEpzb25Xcml0ZXIgaWYgdGhlIGZpbGUgaXMgbm90IGV2ZW4gb3BlbmVkIHVubGVzcyB0aGVyZSBpcyB2YWxpZCBkYXRhCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdyaXRlLgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1IYXNXcml0dGVuRGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Kc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIG1IYXNXcml0dGVuRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5mbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIndyb3RlIGxvZyB0byAiICsgbUZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2xvc2VkICIgKyBtRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVycm9yIHdoZW4gY2xvc2luZyBSZXNlYXJjaExvZzoiLCBlKTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAvLyBNYXJraW5nIHRoZSBmaWxlIGFzIHJlYWQtb25seSBzaWduYWxzIHRoYXQgdGhpcyBsb2cgZmlsZSBpcyByZWFkeSB0byBiZQpAQCAtMTU4LDcgKzE0OCwxNCBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUpzb25Xcml0ZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSGFzV3JpdHRlbkRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGFuIGV4Y2VwdGlvbi4gIEJldHRlciB3b3VsZCBiZSB0byBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gb3BlbiB0aGUgSnNvbldyaXRlciBpZiB0aGUgZmlsZSBpcyBub3QgZXZlbiBvcGVuZWQgdW5sZXNzIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWxpZCBkYXRhIHRvIHdyaXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSGFzV3JpdHRlbkRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUpzb25Xcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXNXcml0dGVuRGF0YSA9IGZhbHNlOwpAQCAtMjA3LDcgKzIwNCw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYWJsZTxPYmplY3Q+IG1GbHVzaENhbGxhYmxlID0gbmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG1Kc29uV3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICBpZiAobUpzb25Xcml0ZXIgIT0gbnVsbCkgbUpzb25Xcml0ZXIuZmx1c2goKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfTsKQEAgLTI1MywzMCArMjUwLDI5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgSnNvbldyaXRlciBmb3IgdGhpcyBSZXNlYXJjaExvZy4gIEl0IGlzIGluaXRpYWxpemVkIHRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzCiAgICAgICogY2FsbGVkLiAgVGhlIGNhY2hlZCB2YWx1ZSBpcyByZXR1cm5lZCBpbiBmdXR1cmUgY2FsbHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIG9wZW5pbmcgdGhlIEpzb25Xcml0ZXIgaXMgbm90IHBvc3NpYmxlCiAgICAgICovCi0gICAgcHVibGljIEpzb25Xcml0ZXIgZ2V0SW5pdGlhbGl6ZWRKc29uV3JpdGVyTG9ja2VkKCkgewotICAgICAgICBpZiAobUpzb25Xcml0ZXIgIT0gTlVMTF9KU09OX1dSSVRFUiB8fCBtRmlsZSA9PSBudWxsKSByZXR1cm4gbUpzb25Xcml0ZXI7CisgICAgcHVibGljIEpzb25Xcml0ZXIgZ2V0SW5pdGlhbGl6ZWRKc29uV3JpdGVyTG9ja2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Kc29uV3JpdGVyICE9IG51bGwpIHJldHVybiBtSnNvbldyaXRlcjsKKyAgICAgICAgaWYgKG1GaWxlID09IG51bGwpIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIEpzb25Xcml0ZXIganNvbldyaXRlciA9IGNyZWF0ZUpzb25Xcml0ZXIobUNvbnRleHQsIG1GaWxlKTsKLSAgICAgICAgICAgIGlmIChqc29uV3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBtSnNvbldyaXRlciA9IGpzb25Xcml0ZXI7Ci0gICAgICAgICAgICAgICAgbUhhc1dyaXR0ZW5EYXRhID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqc29uV3JpdGVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBKc29uV3JpdGVyIik7CisKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgbUpzb25Xcml0ZXIgPSBqc29uV3JpdGVyOworICAgICAgICAgICAgbUhhc1dyaXR0ZW5EYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBtSnNvbldyaXRlcjsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRXJyb3IgaW4gSnNvbldyaXRlcjsgZGlzYWJsaW5nIGxvZ2dpbmciLCBlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUpzb25Xcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoaXMgaXMganVzdCB0aGUganNvbiBub3QgYmVpbmcgdGVybWluYXRlZCBwcm9wZXJseS4KLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRXJyb3IgaW4gY2xvc2luZyBKc29uV3JpdGVyOyBkaXNhYmxpbmcgbG9nZ2luZyIsIGUxKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbUpzb25Xcml0ZXIgPSBOVUxMX0pTT05fV1JJVEVSOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgSnNvbldyaXRlciIsIGUpOworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNsb3NpbmcgSnNvbldyaXRlciIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Kc29uV3JpdGVyICE9IG51bGwpIG1Kc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICBtSnNvbldyaXRlciA9IG51bGw7CisgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtSnNvbldyaXRlcjsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nRGlyZWN0b3J5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZ0RpcmVjdG9yeS5qYXZhCmluZGV4IDI5MWRlYTUuLmQxNTYwNjggMTAwNjQ0Ci0tLSBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nRGlyZWN0b3J5LmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2dEaXJlY3RvcnkuamF2YQpAQCAtOTcsMTUgKzk3LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgRmlsZSBnZXRMb2dGaWxlUGF0aChmaW5hbCBsb25nIHRpbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG1GaWxlc0RpciwgZ2V0VW5pcXVlRmlsZW5hbWUoTE9HX0ZJTEVOQU1FX1BSRUZJWCwgdGltZSkpOworICAgIHB1YmxpYyBGaWxlIGdldExvZ0ZpbGVQYXRoKGZpbmFsIGxvbmcgdGltZSwgZmluYWwgbG9uZyBuYW5vVGltZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobUZpbGVzRGlyLCBnZXRVbmlxdWVGaWxlbmFtZShMT0dfRklMRU5BTUVfUFJFRklYLCB0aW1lLCBuYW5vVGltZSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBGaWxlIGdldFVzZXJSZWNvcmRpbmdGaWxlUGF0aChmaW5hbCBsb25nIHRpbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG1GaWxlc0RpciwgZ2V0VW5pcXVlRmlsZW5hbWUoVVNFUl9SRUNPUkRJTkdfRklMRU5BTUVfUFJFRklYLCB0aW1lKSk7CisgICAgcHVibGljIEZpbGUgZ2V0VXNlclJlY29yZGluZ0ZpbGVQYXRoKGZpbmFsIGxvbmcgdGltZSwgZmluYWwgbG9uZyBuYW5vVGltZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobUZpbGVzRGlyLCBnZXRVbmlxdWVGaWxlbmFtZShVU0VSX1JFQ09SRElOR19GSUxFTkFNRV9QUkVGSVgsIHRpbWUsCisgICAgICAgICAgICAgICAgbmFub1RpbWUpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRmlsZW5hbWUoZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgbG9uZyB0aW1lKSB7Ci0gICAgICAgIHJldHVybiBwcmVmaXggKyAiLSIgKyB0aW1lICsgRklMRU5BTUVfU1VGRklYOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVGaWxlbmFtZShmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBsb25nIHRpbWUsCisgICAgICAgICAgICBmaW5hbCBsb25nIG5hbm9UaW1lKSB7CisgICAgICAgIHJldHVybiBwcmVmaXggKyAiLSIgKyB0aW1lICsgIi0iICsgbmFub1RpbWUgKyBGSUxFTkFNRV9TVUZGSVg7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2dnZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1Jlc2VhcmNoTG9nZ2VyLmphdmEKaW5kZXggN2EyM2RkYi4uOGI4ZWEyMSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvUmVzZWFyY2hMb2dnZXIuamF2YQorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9yZXNlYXJjaC9SZXNlYXJjaExvZ2dlci5qYXZhCkBAIC0xMTgsNyArMTE4LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZFRURCQUNLX0RJQUxPR19TSE9VTERfUFJFU0VSVkVfVEVYVF9GSUVMRCA9IGZhbHNlOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gc0lzTG9nZ2luZyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVVRQVVRfRk9STUFUX1ZFUlNJT04gPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1VTQUJJTElUWV9TVFVEWV9NT0RFID0gInVzYWJpbGl0eV9zdHVkeV9tb2RlIjsKICAgICAvLyBXaGV0aGVyIGFsbCB3b3JkcyBzaG91bGQgYmUgcmVjb3JkZWQsIGxlYXZpbmcgdW5zYW1wbGVkIHdvcmQgYmV0d2VlbiBiaWdyYW1zLiAgVXNlZnVsIGZvcgogICAgIC8vIHRlc3RpbmcuCiAgICAgLyogcGFja2FnZSBmb3IgdGVzdCAqLyBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19MT0dHSU5HX0VWRVJZVEhJTkcgPSBmYWxzZQpAQCAtMTUwLDI0ICsxNDksMTggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNlYXJjaExvZ2dlciBzSW5zdGFuY2UgPSBuZXcgUmVzZWFyY2hMb2dnZXIoKTsKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0FjY291bnRUeXBlID0gbnVsbDsKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0FsbG93ZWRBY2NvdW50RG9tYWluID0gbnVsbDsKLSAgICAvKiBwYWNrYWdlICovIFJlc2VhcmNoTG9nIG1NYWluUmVzZWFyY2hMb2c7CisgICAgcHJpdmF0ZSBSZXNlYXJjaExvZyBtTWFpblJlc2VhcmNoTG9nOyAvLyBhbHdheXMgbm9uLW51bGwgYWZ0ZXIgaW5pdCgpIGlzIGNhbGxlZAogICAgIC8vIG1GZWVkYmFja0xvZyByZWNvcmRzIGFsbCBldmVudHMgZm9yIHRoZSBzZXNzaW9uLCBwcml2YXRlIG9yIG5vdCAoZXhjZXB0aW5nCiAgICAgLy8gcGFzc3dvcmRzKS4gIEl0IGlzIHdyaXR0ZW4gdG8gcGVybWFuZW50IHN0b3JhZ2Ugb25seSBpZiB0aGUgdXNlciBleHBsaWNpdGx5IGNvbW1hbmRzCiAgICAgLy8gdGhlIHN5c3RlbSB0byBkbyBzby4KICAgICAvLyBMb2dVbml0cyBhcmUgcXVldWVkIGluIHRoZSBMb2dCdWZmZXJzIGFuZCBwdWJsaXNoZWQgdG8gdGhlIFJlc2VhcmNoTG9ncyB3aGVuIHdvcmRzIGFyZQogICAgIC8vIGNvbXBsZXRlLgotICAgIC8qIHBhY2thZ2UgKi8gTWFpbkxvZ0J1ZmZlciBtTWFpbkxvZ0J1ZmZlcjsKLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZlZWRiYWNrIGxvZy4gIFRoZSBmZWVkYmFjayBsb2cgY29udGludW91c2x5IGNhcHR1cmVkIHVzZXIgZGF0YSBpbiBjYXNlIHRoZQotICAgIC8vIHVzZXIgd2FudGVkIHRvIHN1Ym1pdCBpdC4gIFdlIG5vdyB1c2UgdGhlIG1Vc2VyUmVjb3JkaW5nTG9nQnVmZmVyIHRvIGFsbG93IHRoZSB1c2VyIHRvCi0gICAgLy8gZXhwbGljaXRseSByZXByb2R1Y2UgYSBwcm9ibGVtLgotICAgIC8qIHBhY2thZ2UgKi8gUmVzZWFyY2hMb2cgbUZlZWRiYWNrTG9nOwotICAgIC8qIHBhY2thZ2UgKi8gTG9nQnVmZmVyIG1GZWVkYmFja0xvZ0J1ZmZlcjsKKyAgICAvKiBwYWNrYWdlIGZvciB0ZXN0ICovIE1haW5Mb2dCdWZmZXIgbU1haW5Mb2dCdWZmZXI7IC8vIGFsd2F5cyBub24tbnVsbCBhZnRlciBpbml0KCkgaXMgY2FsbGVkCiAgICAgLyogcGFja2FnZSAqLyBSZXNlYXJjaExvZyBtVXNlclJlY29yZGluZ0xvZzsKICAgICAvKiBwYWNrYWdlICovIExvZ0J1ZmZlciBtVXNlclJlY29yZGluZ0xvZ0J1ZmZlcjsKICAgICBwcml2YXRlIEZpbGUgbVVzZXJSZWNvcmRpbmdGaWxlID0gbnVsbDsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQYXNzd29yZFZpZXcgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTG9nZ2luZ1N1c3BlbmRlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgU2hhcmVkUHJlZmVyZW5jZXMgbVByZWZzOwogCiAgICAgLy8gZGlnaXRzIGVudGVyZWQgYnkgdGhlIHVzZXIgYXJlIHJlcGxhY2VkIHdpdGggdGhpcyBjb2RlcG9pbnQuCkBAIC0yMDIsMTUgKzE5NSw2IEBACiAgICAgcHJpdmF0ZSBsb25nIG1TYXZlZERvd25FdmVudFRpbWU7CiAgICAgcHJpdmF0ZSBCdW5kbGUgbUZlZWRiYWNrRGlhbG9nQnVuZGxlID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUluRmVlZGJhY2tEaWFsb2cgPSBmYWxzZTsKLSAgICAvLyBUaGUgZmVlZGJhY2sgZGlhbG9nIGNhdXNlcyBzdG9wKCkgdG8gYmUgY2FsbGVkIGZvciB0aGUga2V5Ym9hcmQgY29ubmVjdGVkIHRvIHRoZSBvcmlnaW5hbAotICAgIC8vIHdpbmRvdy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZmVlZGJhY2sgZGlhbG9nIG11c3QgcHJlc2VudCBpdHMgb3duIEVkaXRUZXh0IGJveCB0aGF0IGRpc3BsYXlzCi0gICAgLy8gYSBrZXlib2FyZC4gIHN0b3AoKSBub3JtYWxseSBjYXVzZXMgbUZlZWRiYWNrTG9nQnVmZmVyLCB3aGljaCBjb250YWlucyB0aGUgdXNlcidzIGRhdGEsIHRvIGJlCi0gICAgLy8gY2xlYXJlZCwgYW5kIGNhdXNlcyBtRmVlZGJhY2tMb2csIHdoaWNoIGlzIHJlYWR5IHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gaW4gY2FzZSB0aGUgdXNlcgotICAgIC8vIHdhbnRzIHRvIHVwbG9hZCwgdG8gYmUgY2xvc2VkLiAgVGhpcyBpcyBnb29kIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBsb2cgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAvLyB3aGF0IHRoZSB1c2VyIGlzIHR5cGluZyBpbiB0aGUgZmVlZGJhY2sgZGlhbG9nLCBidXQgYmFkIGJlY2F1c2UgdGhpcyBkYXRhIG11c3QgYmUgdXBsb2FkZWQuCi0gICAgLy8gSGVyZSB3ZSBzYXZlIHRoZSBMb2dCdWZmZXIgYW5kIExvZyBzbyB0aGUgZmVlZGJhY2sgZGlhbG9nIGNhbiBsYXRlciBhY2Nlc3MgdGhlaXIgZGF0YS4KLSAgICBwcml2YXRlIExvZ0J1ZmZlciBtU2F2ZWRGZWVkYmFja0xvZ0J1ZmZlcjsKLSAgICBwcml2YXRlIFJlc2VhcmNoTG9nIG1TYXZlZEZlZWRiYWNrTG9nOwogICAgIHByaXZhdGUgSGFuZGxlciBtVXNlclJlY29yZGluZ1RpbWVvdXRIYW5kbGVyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVNFUl9SRUNPUkRJTkdfVElNRU9VVF9NUyA9IDMwTCAqIERhdGVVdGlscy5TRUNPTkRfSU5fTUlMTElTOwogCkBAIC0yNDEsNiArMjI1LDkgQEAKICAgICAgICAgbVJlc2VhcmNoTG9nRGlyZWN0b3J5ID0gbmV3IFJlc2VhcmNoTG9nRGlyZWN0b3J5KG1MYXRpbklNRSk7CiAgICAgICAgIGNsZWFuTG9nRGlyZWN0b3J5SWZOZWVkZWQobVJlc2VhcmNoTG9nRGlyZWN0b3J5LCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2cgYnVmZmVycworICAgICAgICByZXNldExvZ0J1ZmZlcnMoKTsKKwogICAgICAgICAvLyBJbml0aWFsaXplIGV4dGVybmFsIHNlcnZpY2VzCiAgICAgICAgIG1VcGxvYWRJbnRlbnQgPSBuZXcgSW50ZW50KG1MYXRpbklNRSwgVXBsb2FkZXJTZXJ2aWNlLmNsYXNzKTsKICAgICAgICAgbVVwbG9hZE5vd0ludGVudCA9IG5ldyBJbnRlbnQobUxhdGluSU1FLCBVcGxvYWRlclNlcnZpY2UuY2xhc3MpOwpAQCAtMjUyLDYgKzIzOSwzNSBAQAogICAgICAgICBtUmVwbGF5ZXIuc2V0S2V5Ym9hcmRTd2l0Y2hlcihrZXlib2FyZFN3aXRjaGVyKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRMb2dCdWZmZXJzKCkgeworICAgICAgICBtTWFpblJlc2VhcmNoTG9nID0gbmV3IFJlc2VhcmNoTG9nKG1SZXNlYXJjaExvZ0RpcmVjdG9yeS5nZXRMb2dGaWxlUGF0aCgKKyAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgU3lzdGVtLm5hbm9UaW1lKCkpLCBtTGF0aW5JTUUpOworICAgICAgICBmaW5hbCBpbnQgbnVtV29yZHNUb0lnbm9yZSA9IG5ldyBSYW5kb20oKS5uZXh0SW50KE5VTUJFUl9PRl9XT1JEU19CRVRXRUVOX1NBTVBMRVMgKyAxKTsKKyAgICAgICAgbU1haW5Mb2dCdWZmZXIgPSBuZXcgTWFpbkxvZ0J1ZmZlcihOVU1CRVJfT0ZfV09SRFNfQkVUV0VFTl9TQU1QTEVTLCBudW1Xb3Jkc1RvSWdub3JlLAorICAgICAgICAgICAgICAgIG1TdWdnZXN0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHB1Ymxpc2goZmluYWwgQXJyYXlMaXN0PExvZ1VuaXQ+IGxvZ1VuaXRzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhbkluY2x1ZGVQcml2YXRlRGF0YSkgeworICAgICAgICAgICAgICAgIGNhbkluY2x1ZGVQcml2YXRlRGF0YSB8PSBJU19MT0dHSU5HX0VWRVJZVEhJTkc7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBMb2dVbml0IGxvZ1VuaXQgOiBsb2dVbml0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3Jkc1N0cmluZyA9IGxvZ1VuaXQuZ2V0V29yZHNBc1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QdWJsaXNoOiAnIiArIHdvcmRzU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicsIGhjOiAiICsgbG9nVW5pdC5jb250YWluc0NvcnJlY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNpcGQ6ICIgKyBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHdvcmQgOiBsb2dVbml0LmdldFdvcmRzQXNTdHJpbmdBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBnZXREaWN0aW9uYXJ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGlzdGljcy5yZWNvcmRXb3JkRW50ZXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSAhPSBudWxsICYmIGRpY3Rpb25hcnkuaXNWYWxpZFdvcmQod29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1VuaXQuY29udGFpbnNDb3JyZWN0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1Ymxpc2hMb2dVbml0cyhsb2dVbml0cywgbU1haW5SZXNlYXJjaExvZywgY2FuSW5jbHVkZVByaXZhdGVEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY2xlYW5Mb2dEaXJlY3RvcnlJZk5lZWRlZChmaW5hbCBSZXNlYXJjaExvZ0RpcmVjdG9yeSByZXNlYXJjaExvZ0RpcmVjdG9yeSwKICAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93KSB7CiAgICAgICAgIGZpbmFsIGxvbmcgbGFzdENsZWFudXBUaW1lID0gUmVzZWFyY2hTZXR0aW5ncy5yZWFkUmVzZWFyY2hMYXN0RGlyQ2xlYW51cFRpbWUobVByZWZzKTsKQEAgLTM3Niw1MiArMzkyLDkgQEAKICAgICAgICAgICAgIExvZy5kKFRBRywgInN0YXJ0IGNhbGxlZCIpOwogICAgICAgICB9CiAgICAgICAgIG1heWJlU2hvd1NwbGFzaFNjcmVlbigpOwotICAgICAgICB1cGRhdGVTdXNwZW5kZWRTdGF0ZSgpOwogICAgICAgICByZXF1ZXN0SW5kaWNhdG9yUmVkcmF3KCk7CiAgICAgICAgIG1TdGF0aXN0aWNzLnJlc2V0KCk7CiAgICAgICAgIGNoZWNrRm9yRW1wdHlFZGl0b3IoKTsKLSAgICAgICAgaWYgKG1GZWVkYmFja0xvZ0J1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXNldEZlZWRiYWNrTG9nZ2luZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNBbGxvd2VkVG9Mb2coKSkgewotICAgICAgICAgICAgLy8gTG9nLncoVEFHLCAibm90IGluIHVzYWJpbGl0eSBtb2RlOyBub3QgbG9nZ2luZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTWFpbkxvZ0J1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWFpblJlc2VhcmNoTG9nID0gbmV3IFJlc2VhcmNoTG9nKG1SZXNlYXJjaExvZ0RpcmVjdG9yeS5nZXRMb2dGaWxlUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLCBtTGF0aW5JTUUpOwotICAgICAgICAgICAgZmluYWwgaW50IG51bVdvcmRzVG9JZ25vcmUgPSBuZXcgUmFuZG9tKCkubmV4dEludChOVU1CRVJfT0ZfV09SRFNfQkVUV0VFTl9TQU1QTEVTICsgMSk7Ci0gICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlciA9IG5ldyBNYWluTG9nQnVmZmVyKE5VTUJFUl9PRl9XT1JEU19CRVRXRUVOX1NBTVBMRVMsIG51bVdvcmRzVG9JZ25vcmUsCi0gICAgICAgICAgICAgICAgICAgIG1TdWdnZXN0KSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaChmaW5hbCBBcnJheUxpc3Q8TG9nVW5pdD4gbG9nVW5pdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhbkluY2x1ZGVQcml2YXRlRGF0YSkgewotICAgICAgICAgICAgICAgICAgICBjYW5JbmNsdWRlUHJpdmF0ZURhdGEgfD0gSVNfTE9HR0lOR19FVkVSWVRISU5HOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbG9nVW5pdHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMb2dVbml0IGxvZ1VuaXQgPSBsb2dVbml0cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZCA9IGxvZ1VuaXQuZ2V0V29yZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmQgIT0gbnVsbCAmJiB3b3JkLmxlbmd0aCgpID4gMCAmJiBoYXNMZXR0ZXJzKHdvcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QdWJsaXNoOiAiICsgd29yZCArICIsIGhjOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxvZ1VuaXQuY29udGFpbnNDb3JyZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERpY3Rpb25hcnkgZGljdGlvbmFyeSA9IGdldERpY3Rpb25hcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGlzdGljcy5yZWNvcmRXb3JkRW50ZXJlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgIT0gbnVsbCAmJiBkaWN0aW9uYXJ5LmlzVmFsaWRXb3JkKHdvcmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nVW5pdC5jb250YWluc0NvcnJlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NYWluUmVzZWFyY2hMb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaExvZ1VuaXRzKGxvZ1VuaXRzLCBtTWFpblJlc2VhcmNoTG9nLCBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldEZlZWRiYWNrTG9nZ2luZygpIHsKLSAgICAgICAgbUZlZWRiYWNrTG9nID0gbmV3IFJlc2VhcmNoTG9nKG1SZXNlYXJjaExvZ0RpcmVjdG9yeS5nZXRMb2dGaWxlUGF0aCgKLSAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSksIG1MYXRpbklNRSk7Ci0gICAgICAgIG1GZWVkYmFja0xvZ0J1ZmZlciA9IG5ldyBGaXhlZExvZ0J1ZmZlcihGRUVEQkFDS19XT1JEX0JVRkZFUl9TSVpFKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgc3RvcCgpIHsKQEAgLTQzMSwzNSArNDA0LDMyIEBACiAgICAgICAgIC8vIENvbW1pdCBtQ3VycmVudExvZ1VuaXQgYmVmb3JlIGNsb3NpbmcuCiAgICAgICAgIGNvbW1pdEN1cnJlbnRMb2dVbml0KCk7CiAKLSAgICAgICAgaWYgKG1NYWluTG9nQnVmZmVyICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1NYWluTG9nQnVmZmVyLnNoaWZ0QW5kUHVibGlzaEFsbCgpOwotICAgICAgICAgICAgbG9nU3RhdGlzdGljcygpOwotICAgICAgICAgICAgY29tbWl0Q3VycmVudExvZ1VuaXQoKTsKLSAgICAgICAgICAgIG1NYWluTG9nQnVmZmVyLnNldElzU3RvcHBpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiSU9FeGNlcHRpb24gd2hlbiBwdWJsaXNoaW5nIExvZ0J1ZmZlciIsIGUpOworICAgICAgICB9CisgICAgICAgIGxvZ1N0YXRpc3RpY3MoKTsKKyAgICAgICAgY29tbWl0Q3VycmVudExvZ1VuaXQoKTsKKyAgICAgICAgbU1haW5Mb2dCdWZmZXIuc2V0SXNTdG9wcGluZygpOworICAgICAgICB0cnkgewogICAgICAgICAgICAgbU1haW5Mb2dCdWZmZXIuc2hpZnRBbmRQdWJsaXNoQWxsKCk7Ci0gICAgICAgICAgICBtTWFpblJlc2VhcmNoTG9nLmJsb2NraW5nQ2xvc2UoUkVTRUFSQ0hMT0dfQ0xPU0VfVElNRU9VVF9JTl9NUyk7Ci0gICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlciA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIklPRXhjZXB0aW9uIHdoZW4gcHVibGlzaGluZyBMb2dCdWZmZXIiLCBlKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUZlZWRiYWNrTG9nQnVmZmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZWVkYmFja0xvZy5ibG9ja2luZ0Nsb3NlKFJFU0VBUkNITE9HX0NMT1NFX1RJTUVPVVRfSU5fTVMpOwotICAgICAgICAgICAgbUZlZWRiYWNrTG9nQnVmZmVyID0gbnVsbDsKLSAgICAgICAgfQorICAgICAgICBtTWFpblJlc2VhcmNoTG9nLmJsb2NraW5nQ2xvc2UoUkVTRUFSQ0hMT0dfQ0xPU0VfVElNRU9VVF9JTl9NUyk7CisKKyAgICAgICAgcmVzZXRMb2dCdWZmZXJzKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWJvcnQoKSB7CiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWJvcnQgY2FsbGVkIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1NYWluTG9nQnVmZmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NYWluTG9nQnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgICAgICBtTWFpblJlc2VhcmNoTG9nLmJsb2NraW5nQWJvcnQoUkVTRUFSQ0hMT0dfQUJPUlRfVElNRU9VVF9JTl9NUyk7Ci0gICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZWVkYmFja0xvZ0J1ZmZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmVlZGJhY2tMb2dCdWZmZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1GZWVkYmFja0xvZy5ibG9ja2luZ0Fib3J0KFJFU0VBUkNITE9HX0FCT1JUX1RJTUVPVVRfSU5fTVMpOwotICAgICAgICAgICAgbUZlZWRiYWNrTG9nQnVmZmVyID0gbnVsbDsKLSAgICAgICAgfQorICAgICAgICBtTWFpbkxvZ0J1ZmZlci5jbGVhcigpOworICAgICAgICBtTWFpblJlc2VhcmNoTG9nLmJsb2NraW5nQWJvcnQoUkVTRUFSQ0hMT0dfQUJPUlRfVElNRU9VVF9JTl9NUyk7CisKKyAgICAgICAgcmVzZXRMb2dCdWZmZXJzKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RhcnQoKSB7CkBAIC00NjcsMjMgKzQzNywxMSBAQAogICAgICAgICBzdGFydCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgbG9uZyBtUmVzdW1lVGltZSA9IDBMOwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdXNwZW5kZWRTdGF0ZSgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmICh0aW1lID4gbVJlc3VtZVRpbWUpIHsKLSAgICAgICAgICAgIG1Jc0xvZ2dpbmdTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZWQoZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMsIGZpbmFsIFN0cmluZyBrZXkpIHsKICAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IHByZWZzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzSXNMb2dnaW5nID0gcHJlZnMuZ2V0Qm9vbGVhbihQUkVGX1VTQUJJTElUWV9TVFVEWV9NT0RFLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzSXNMb2dnaW5nID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICB9CiAgICAgICAgIHJlcXVlc3RJbmRpY2F0b3JSZWRyYXcoKTsKICAgICAgICAgbVByZWZzID0gcHJlZnM7CiAgICAgICAgIHByZWZzQ2hhbmdlZChwcmVmcyk7CkBAIC01MDMsMTIgKzQ2MSw2IEBACiAgICAgICAgICAgICBzYXZlUmVjb3JkaW5nKCk7CiAgICAgICAgIH0KICAgICAgICAgbUluRmVlZGJhY2tEaWFsb2cgPSB0cnVlOwotICAgICAgICBtU2F2ZWRGZWVkYmFja0xvZ0J1ZmZlciA9IG1GZWVkYmFja0xvZ0J1ZmZlcjsKLSAgICAgICAgbVNhdmVkRmVlZGJhY2tMb2cgPSBtRmVlZGJhY2tMb2c7Ci0gICAgICAgIC8vIFNldCB0aGUgbm9uLXNhdmVkIHZlcnNpb25zIHRvIG51bGwgc28gdGhhdCB0aGUgc3RvcCgpIGNhdXNlZCBieSBzd2l0Y2hpbmcgdG8gdGhlCi0gICAgICAgIC8vIEZlZWRiYWNrIGRpYWxvZyB3aWxsIG5vdCBjbG9zZSB0aGVtLgotICAgICAgICBtRmVlZGJhY2tMb2dCdWZmZXIgPSBudWxsOwotICAgICAgICBtRmVlZGJhY2tMb2cgPSBudWxsOwogCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIGludGVudC5zZXRDbGFzcyhtTGF0aW5JTUUsIEZlZWRiYWNrQWN0aXZpdHkuY2xhc3MpOwpAQCAtNTQ1LDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICBtVXNlclJlY29yZGluZ0xvZy5ibG9ja2luZ0Fib3J0KFJFU0VBUkNITE9HX0FCT1JUX1RJTUVPVVRfSU5fTVMpOwogICAgICAgICB9CiAgICAgICAgIG1Vc2VyUmVjb3JkaW5nRmlsZSA9IG1SZXNlYXJjaExvZ0RpcmVjdG9yeS5nZXRVc2VyUmVjb3JkaW5nRmlsZVBhdGgoCi0gICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBTeXN0ZW0ubmFub1RpbWUoKSk7CiAgICAgICAgIG1Vc2VyUmVjb3JkaW5nTG9nID0gbmV3IFJlc2VhcmNoTG9nKG1Vc2VyUmVjb3JkaW5nRmlsZSwgbUxhdGluSU1FKTsKICAgICAgICAgbVVzZXJSZWNvcmRpbmdMb2dCdWZmZXIgPSBuZXcgTG9nQnVmZmVyKCk7CiAgICAgICAgIHJlc2V0UmVjb3JkaW5nVGltZXIoKTsKQEAgLTY2NiwxMiArNjE4LDYgQEAKICAgICAgICAgICAgIG5ldyBMb2dTdGF0ZW1lbnQoIlVzZXJGZWVkYmFjayIsIGZhbHNlLCBmYWxzZSwgImNvbnRlbnRzIiwgImFjY291bnROYW1lIiwgInJlY29yZGluZyIpOwogICAgIHB1YmxpYyB2b2lkIHNlbmRGZWVkYmFjayhmaW5hbCBTdHJpbmcgZmVlZGJhY2tDb250ZW50cywgZmluYWwgYm9vbGVhbiBpbmNsdWRlSGlzdG9yeSwKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJbmNsdWRpbmdBY2NvdW50TmFtZSwgZmluYWwgYm9vbGVhbiBpc0luY2x1ZGluZ1JlY29yZGluZykgewotICAgICAgICBpZiAobVNhdmVkRmVlZGJhY2tMb2dCdWZmZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaW5jbHVkZUhpc3RvcnkpIHsKLSAgICAgICAgICAgIG1TYXZlZEZlZWRiYWNrTG9nQnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIH0KICAgICAgICAgU3RyaW5nIHJlY29yZGluZyA9ICIiOwogICAgICAgICBpZiAoaXNJbmNsdWRpbmdSZWNvcmRpbmcpIHsKICAgICAgICAgICAgIC8vIFRyeSB0byByZWFkIHJlY29yZGluZyBmcm9tIHJlY2VudGx5IHdyaXR0ZW4ganNvbiBmaWxlCkBAIC03MDMsOSArNjQ5LDEzIEBACiAgICAgICAgIGZpbmFsIFN0cmluZyBhY2NvdW50TmFtZSA9IGlzSW5jbHVkaW5nQWNjb3VudE5hbWUgPyBnZXRBY2NvdW50TmFtZSgpIDogIiI7CiAgICAgICAgIGZlZWRiYWNrTG9nVW5pdC5hZGRMb2dTdGF0ZW1lbnQoTE9HU1RBVEVNRU5UX0ZFRURCQUNLLCBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSwKICAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnRlbnRzLCBhY2NvdW50TmFtZSwgcmVjb3JkaW5nKTsKLSAgICAgICAgbUZlZWRiYWNrTG9nQnVmZmVyLnNoaWZ0SW4oZmVlZGJhY2tMb2dVbml0KTsKLSAgICAgICAgcHVibGlzaExvZ0J1ZmZlcihtRmVlZGJhY2tMb2dCdWZmZXIsIG1TYXZlZEZlZWRiYWNrTG9nLCB0cnVlIC8qIGlzSW5jbHVkaW5nUHJpdmF0ZURhdGEgKi8pOwotICAgICAgICBtU2F2ZWRGZWVkYmFja0xvZy5ibG9ja2luZ0Nsb3NlKFJFU0VBUkNITE9HX0NMT1NFX1RJTUVPVVRfSU5fTVMpOworCisgICAgICAgIGZpbmFsIFJlc2VhcmNoTG9nIGZlZWRiYWNrTG9nID0gbmV3IFJlc2VhcmNoTG9nKG1SZXNlYXJjaExvZ0RpcmVjdG9yeS5nZXRMb2dGaWxlUGF0aCgKKyAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgU3lzdGVtLm5hbm9UaW1lKCkpLCBtTGF0aW5JTUUpOworICAgICAgICBmaW5hbCBMb2dCdWZmZXIgZmVlZGJhY2tMb2dCdWZmZXIgPSBuZXcgTG9nQnVmZmVyKCk7CisgICAgICAgIGZlZWRiYWNrTG9nQnVmZmVyLnNoaWZ0SW4oZmVlZGJhY2tMb2dVbml0KTsKKyAgICAgICAgcHVibGlzaExvZ0J1ZmZlcihmZWVkYmFja0xvZ0J1ZmZlciwgZmVlZGJhY2tMb2csIHRydWUgLyogaXNJbmNsdWRpbmdQcml2YXRlRGF0YSAqLyk7CisgICAgICAgIGZlZWRiYWNrTG9nLmJsb2NraW5nQ2xvc2UoUkVTRUFSQ0hMT0dfQ0xPU0VfVElNRU9VVF9JTl9NUyk7CiAgICAgICAgIHVwbG9hZE5vdygpOwogCiAgICAgICAgIGlmIChpc0luY2x1ZGluZ1JlY29yZGluZyAmJiBERUJVR19SRVBMQVlfQUZURVJfRkVFREJBQ0spIHsKQEAgLTc0NCw4ICs2OTQsOCBAQAogCiAgICAgcHVibGljIHZvaWQgaW5pdFN1Z2dlc3QoZmluYWwgU3VnZ2VzdCBzdWdnZXN0KSB7CiAgICAgICAgIG1TdWdnZXN0ID0gc3VnZ2VzdDsKLSAgICAgICAgLy8gTWFpbkxvZ0J1ZmZlciBoYXMgb3V0LW9mLWRhdGUgU3VnZ2VzdCBvYmplY3QuICBOZWVkIHRvIGNsb3NlIGl0IGRvd24gYW5kIGNyZWF0ZSBhIG5ldwotICAgICAgICAvLyBvbmUuCisgICAgICAgIC8vIE1haW5Mb2dCdWZmZXIgbm93IGhhcyBhbiBvdXQtb2YtZGF0ZSBTdWdnZXN0IG9iamVjdC4gIENsb3NlIGRvd24gTWFpbkxvZ0J1ZmZlciBhbmQgY3JlYXRlCisgICAgICAgIC8vIGEgbmV3IG9uZS4KICAgICAgICAgaWYgKG1NYWluTG9nQnVmZmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHN0b3AoKTsKICAgICAgICAgICAgIHN0YXJ0KCk7CkBAIC03NjQsNyArNzE0LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNBbGxvd2VkVG9Mb2coKSB7Ci0gICAgICAgIHJldHVybiAhbUlzUGFzc3dvcmRWaWV3ICYmICFtSXNMb2dnaW5nU3VzcGVuZGVkICYmIHNJc0xvZ2dpbmcgJiYgIW1JbkZlZWRiYWNrRGlhbG9nOworICAgICAgICByZXR1cm4gIW1Jc1Bhc3N3b3JkVmlldyAmJiBzSXNMb2dnaW5nICYmICFtSW5GZWVkYmFja0RpYWxvZzsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0SW5kaWNhdG9yUmVkcmF3KCkgewpAQCAtODEzLDcgKzc2Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZC4gIFRoZSBkb3QgaXMgYWN0dWFsbHkgYSB6ZXJvLXdpZHRoLCB6ZXJvLWhlaWdodCByZWN0YW5nbGUsIHBsYWNlZCBhdCB0aGUKICAgICAgICAgICAgICAgICAvLyBsb3dlci1yaWdodCBjb3JuZXIgb2YgdGhlIGNhbnZhcywgcGFpbnRlZCB3aXRoIGEgbm9uLXplcm8gYm9yZGVyIHdpZHRoLgogICAgICAgICAgICAgICAgIHBhaW50LnNldFN0cm9rZVdpZHRoKDMpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBwYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSwgd2lkdGgsIGhlaWdodCwgcGFpbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGFpbnQuc2V0Q29sb3Ioc2F2ZWRDb2xvcik7CiAgICAgICAgICAgICBwYWludC5zZXRTdHlsZShzYXZlZFN0eWxlKTsKQEAgLTg1MiwxNiArODAyLDExIEBACiAKICAgICAvKiBwYWNrYWdlIGZvciB0ZXN0ICovIHZvaWQgY29tbWl0Q3VycmVudExvZ1VuaXQoKSB7CiAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29tbWl0Q3VycmVudExvZ1VuaXQiICsgKG1DdXJyZW50TG9nVW5pdC5oYXNXb3JkKCkgPwotICAgICAgICAgICAgICAgICAgICAiOiAiICsgbUN1cnJlbnRMb2dVbml0LmdldFdvcmQoKSA6ICIiKSk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJjb21taXRDdXJyZW50TG9nVW5pdCIgKyAobUN1cnJlbnRMb2dVbml0Lmhhc09uZU9yTW9yZVdvcmRzKCkgPworICAgICAgICAgICAgICAgICAgICAiOiAiICsgbUN1cnJlbnRMb2dVbml0LmdldFdvcmRzQXNTdHJpbmcoKSA6ICIiKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtQ3VycmVudExvZ1VuaXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobU1haW5Mb2dCdWZmZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NYWluTG9nQnVmZmVyLnNoaWZ0SW4obUN1cnJlbnRMb2dVbml0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRmVlZGJhY2tMb2dCdWZmZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1GZWVkYmFja0xvZ0J1ZmZlci5zaGlmdEluKG1DdXJyZW50TG9nVW5pdCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtTWFpbkxvZ0J1ZmZlci5zaGlmdEluKG1DdXJyZW50TG9nVW5pdCk7CiAgICAgICAgICAgICBpZiAobVVzZXJSZWNvcmRpbmdMb2dCdWZmZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Vc2VyUmVjb3JkaW5nTG9nQnVmZmVyLnNoaWZ0SW4obUN1cnJlbnRMb2dVbml0KTsKICAgICAgICAgICAgIH0KQEAgLTg4NiwxNSArODMxLDEyIEBACiAgICAgICAgIC8vCiAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgbUxhc3RMb2dVbml0IGhlcmUsIGJlY2F1c2UgaXQgb25seSBnb2VzIG9uZSB3b3JkIGJhY2sgYW5kIGlzIG9ubHkKICAgICAgICAgLy8gbmVlZGVkIGZvciByZXZlcnRzLCB3aGljaCBvbmx5IGhhcHBlbiBvbmUgYmFjay4KLSAgICAgICAgaWYgKG1NYWluTG9nQnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICBmaW5hbCBMb2dVbml0IG9sZExvZ1VuaXQgPSBtTWFpbkxvZ0J1ZmZlci5wZWVrTGFzdExvZ1VuaXQoKTsKIAogICAgICAgICAvLyBDaGVjayB0aGF0IGV4cGVjdGVkIHdvcmQgbWF0Y2hlcy4KICAgICAgICAgaWYgKG9sZExvZ1VuaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9sZExvZ1VuaXRXb3JkID0gb2xkTG9nVW5pdC5nZXRXb3JkKCk7Ci0gICAgICAgICAgICBpZiAoIW9sZExvZ1VuaXRXb3JkLmVxdWFscyhleHBlY3RlZFdvcmQpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb2xkTG9nVW5pdFdvcmRzID0gb2xkTG9nVW5pdC5nZXRXb3Jkc0FzU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAob2xkTG9nVW5pdFdvcmRzICE9IG51bGwgJiYgIW9sZExvZ1VuaXRXb3Jkcy5lcXVhbHMoZXhwZWN0ZWRXb3JkKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEwLDEzICs4NTIsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1DdXJyZW50TG9nVW5pdCA9IG9sZExvZ1VuaXQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1GZWVkYmFja0xvZ0J1ZmZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmVlZGJhY2tMb2dCdWZmZXIudW5zaGlmdEluKCk7Ci0gICAgICAgIH0KICAgICAgICAgZW5xdWV1ZUV2ZW50KExPR1NUQVRFTUVOVF9VTkNPTU1JVF9DVVJSRU5UX0xPR1VOSVQpOwogICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgInVuY29tbWl0Q3VycmVudExvZ1VuaXQgKGR1bXA9IiArIGR1bXBDdXJyZW50TG9nVW5pdCArICIpIGJhY2sgdG8gIgotICAgICAgICAgICAgICAgICAgICArIChtQ3VycmVudExvZ1VuaXQuaGFzV29yZCgpID8gIjogJyIgKyBtQ3VycmVudExvZ1VuaXQuZ2V0V29yZCgpICsgIiciIDogIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgKyAobUN1cnJlbnRMb2dVbml0Lmhhc09uZU9yTW9yZVdvcmRzKCkgPyAiOiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ3VycmVudExvZ1VuaXQuZ2V0V29yZHNBc1N0cmluZygpICsgIiciIDogIiIpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTQxLDYgKzg4MSw3IEBACiAgICAgICAgICAgICBmaW5hbCBSZXNlYXJjaExvZyByZXNlYXJjaExvZywgZmluYWwgYm9vbGVhbiBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpIHsKICAgICAgICAgZmluYWwgTG9nVW5pdCBvcGVuaW5nTG9nVW5pdCA9IG5ldyBMb2dVbml0KCk7CiAgICAgICAgIGlmIChsb2dVbml0cy5pc0VtcHR5KCkpIHJldHVybjsKKyAgICAgICAgaWYgKCFpc0FsbG93ZWRUb0xvZygpKSByZXR1cm47CiAgICAgICAgIC8vIExvZ1VuaXRzIG5vdCBjb250YWluaW5nIHByaXZhdGUgZGF0YSwgc3VjaCBhcyBjb250ZXh0dWFsIGRhdGEgZm9yIHRoZSBsb2csIGRvIG5vdCByZXF1aXJlCiAgICAgICAgIC8vIGxvZ1NlZ21lbnQgYm91bmRhcnkgc3RhdGVtZW50cy4KICAgICAgICAgaWYgKGNhbkluY2x1ZGVQcml2YXRlRGF0YSkgewpAQCAtOTUwLDggKzg5MSw5IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yIChMb2dVbml0IGxvZ1VuaXQgOiBsb2dVbml0cykgewogICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicHVibGlzaExvZ0J1ZmZlcjogIiArIChsb2dVbml0Lmhhc1dvcmQoKSA/IGxvZ1VuaXQuZ2V0V29yZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA6ICI8d29yZGxlc3M+IikgKyAiLCBjb3JyZWN0aW9uPzogIiArIGxvZ1VuaXQuY29udGFpbnNDb3JyZWN0aW9uKCkpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInB1Ymxpc2hMb2dCdWZmZXI6ICIgKyAobG9nVW5pdC5oYXNPbmVPck1vcmVXb3JkcygpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGxvZ1VuaXQuZ2V0V29yZHNBc1N0cmluZygpIDogIjx3b3JkbGVzcz4iKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb3JyZWN0aW9uPzogIiArIGxvZ1VuaXQuY29udGFpbnNDb3JyZWN0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzZWFyY2hMb2cucHVibGlzaChsb2dVbml0LCBjYW5JbmNsdWRlUHJpdmF0ZURhdGEpOwogICAgICAgICB9CkBAIC05ODYsNyArOTI4LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAod29yZC5sZW5ndGgoKSA+IDAgJiYgaGFzTGV0dGVycyh3b3JkKSkgewotICAgICAgICAgICAgbUN1cnJlbnRMb2dVbml0LnNldFdvcmQod29yZCk7CisgICAgICAgICAgICBtQ3VycmVudExvZ1VuaXQuc2V0V29yZHMod29yZCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgTG9nVW5pdCBuZXdMb2dVbml0ID0gbUN1cnJlbnRMb2dVbml0LnNwbGl0QnlUaW1lKG1heFRpbWUpOwogICAgICAgICBlbnF1ZXVlQ29tbWl0VGV4dCh3b3JkLCBpc0JhdGNoTW9kZSk7CkBAIC0xMTA3LDcgKzEwNDksNyBAQAogICAgICAgICAgICAgcGFja2FnZUluZm8gPSBtTGF0aW5JTUUuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlSW5mbyhtTGF0aW5JTUUuZ2V0UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbk5hbWUgPSBwYWNrYWdlSW5mby52ZXJzaW9uTmFtZTsKLSAgICAgICAgICAgIHJldHVybiAhKGRldmVsb3BlckJ1aWxkUmVnZXgubWF0Y2hlcih2ZXJzaW9uTmFtZSkuZmluZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBkZXZlbG9wZXJCdWlsZFJlZ2V4Lm1hdGNoZXIodmVyc2lvbk5hbWUpLmZpbmQoKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBkZXRlcm1pbmUgcGFja2FnZSBuYW1lIiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzczLDExICsxMzE1LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF0aW5JTUVfcHJvbW90ZVBoYW50b21TcGFjZSgpIHsKICAgICAgICAgZmluYWwgUmVzZWFyY2hMb2dnZXIgcmVzZWFyY2hMb2dnZXIgPSBnZXRJbnN0YW5jZSgpOwogICAgICAgICBmaW5hbCBMb2dVbml0IGxvZ1VuaXQ7Ci0gICAgICAgIGlmIChyZXNlYXJjaExvZ2dlci5tTWFpbkxvZ0J1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dVbml0ID0gcmVzZWFyY2hMb2dnZXIubUN1cnJlbnRMb2dVbml0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nVW5pdCA9IHJlc2VhcmNoTG9nZ2VyLm1NYWluTG9nQnVmZmVyLnBlZWtMYXN0TG9nVW5pdCgpOwotICAgICAgICB9CisgICAgICAgIGxvZ1VuaXQgPSByZXNlYXJjaExvZ2dlci5tTWFpbkxvZ0J1ZmZlci5wZWVrTGFzdExvZ1VuaXQoKTsKICAgICAgICAgcmVzZWFyY2hMb2dnZXIuZW5xdWV1ZUV2ZW50KGxvZ1VuaXQsIExPR1NUQVRFTUVOVF9MQVRJTklNRV9QUk9NT1RFUEhBTlRPTVNQQUNFKTsKICAgICB9CiAKQEAgLTEzOTQsMTEgKzEzMzIsNyBAQAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJhY3RlcnNBZnRlclN3YXApIHsKICAgICAgICAgZmluYWwgUmVzZWFyY2hMb2dnZXIgcmVzZWFyY2hMb2dnZXIgPSBnZXRJbnN0YW5jZSgpOwogICAgICAgICBmaW5hbCBMb2dVbml0IGxvZ1VuaXQ7Ci0gICAgICAgIGlmIChyZXNlYXJjaExvZ2dlci5tTWFpbkxvZ0J1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dVbml0ID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZ1VuaXQgPSByZXNlYXJjaExvZ2dlci5tTWFpbkxvZ0J1ZmZlci5wZWVrTGFzdExvZ1VuaXQoKTsKLSAgICAgICAgfQorICAgICAgICBsb2dVbml0ID0gcmVzZWFyY2hMb2dnZXIubU1haW5Mb2dCdWZmZXIucGVla0xhc3RMb2dVbml0KCk7CiAgICAgICAgIGlmIChsb2dVbml0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlc2VhcmNoTG9nZ2VyLmVucXVldWVFdmVudChsb2dVbml0LCBMT0dTVEFURU1FTlRfTEFUSU5JTUVfU1dBUFNXQVBQRVJBTkRTUEFDRSwKICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDaGFyYWN0ZXJzLCBjaGFyYWN0ZXJzQWZ0ZXJTd2FwKTsKQEAgLTE0NzEsMTQgKzE0MDUsMTAgQEAKICAgICAgICAgZmluYWwgUmVzZWFyY2hMb2dnZXIgcmVzZWFyY2hMb2dnZXIgPSBnZXRJbnN0YW5jZSgpOwogICAgICAgICAvLyBUT0RPOiBWZXJpZnkgdGhhdCBtQ3VycmVudExvZ1VuaXQgaGFzIGJlZW4gcmVzdG9yZWQgYW5kIGNvbnRhaW5zIHRoZSByZXZlcnRlZCB3b3JkLgogICAgICAgICBmaW5hbCBMb2dVbml0IGxvZ1VuaXQ7Ci0gICAgICAgIGlmIChyZXNlYXJjaExvZ2dlci5tTWFpbkxvZ0J1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dVbml0ID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZ1VuaXQgPSByZXNlYXJjaExvZ2dlci5tTWFpbkxvZ0J1ZmZlci5wZWVrTGFzdExvZ1VuaXQoKTsKLSAgICAgICAgfQorICAgICAgICBsb2dVbml0ID0gcmVzZWFyY2hMb2dnZXIubU1haW5Mb2dCdWZmZXIucGVla0xhc3RMb2dVbml0KCk7CiAgICAgICAgIGlmIChvcmlnaW5hbGx5VHlwZWRXb3JkLmxlbmd0aCgpID4gMCAmJiBoYXNMZXR0ZXJzKG9yaWdpbmFsbHlUeXBlZFdvcmQpKSB7CiAgICAgICAgICAgICBpZiAobG9nVW5pdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nVW5pdC5zZXRXb3JkKG9yaWdpbmFsbHlUeXBlZFdvcmQpOworICAgICAgICAgICAgICAgIGxvZ1VuaXQuc2V0V29yZHMob3JpZ2luYWxseVR5cGVkV29yZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmVzZWFyY2hMb2dnZXIuZW5xdWV1ZUV2ZW50KGxvZ1VuaXQgIT0gbnVsbCA/IGxvZ1VuaXQgOiByZXNlYXJjaExvZ2dlci5tQ3VycmVudExvZ1VuaXQsCkBAIC0xNjE2LDcgKzE1NDYsNyBAQAogICAgICAqIExvZyBhIGNhbGwgdG8gTGF0aW5JTUUuY29tbWl0Q3VycmVudEF1dG9Db3JyZWN0aW9uKCkuCiAgICAgICoKICAgICAgKiBTeXN0ZW1SZXNwb25zZTogVGhlIElNRSBoYXMgY29tbWl0dGVkIGFuIGF1dG8tY29ycmVjdGlvbi4gIEFuIGF1dG8tY29ycmVjdGlvbiBjaGFuZ2VzIHRoZSByYXcKLSAgICAgKiB0ZXh0IGlucHV0IHRvIGFub3RoZXIgd29yZCB0aGF0IHRoZSB1c2VyIG1vcmUgbGlrZWx5IGRlc2lyZWQgdG8gdHlwZS4KKyAgICAgKiB0ZXh0IGlucHV0IHRvIGFub3RoZXIgd29yZCAob3Igd29yZHMpIHRoYXQgdGhlIHVzZXIgbW9yZSBsaWtlbHkgZGVzaXJlZCB0byB0eXBlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ1N0YXRlbWVudCBMT0dTVEFURU1FTlRfTEFUSU5JTUVfQ09NTUlUQ1VSUkVOVEFVVE9DT1JSRUNUSU9OID0KICAgICAgICAgICAgIG5ldyBMb2dTdGF0ZW1lbnQoIkxhdGluSU1FQ29tbWl0Q3VycmVudEF1dG9Db3JyZWN0aW9uIiwgdHJ1ZSwgdHJ1ZSwgInR5cGVkV29yZCIsCkBAIC0xODI2LDYgKzE3NTYsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsYXRpbklNRV9vbkVuZEJhdGNoSW5wdXQoZmluYWwgQ2hhclNlcXVlbmNlIGVudGVyZWRUZXh0LAogICAgICAgICAgICAgZmluYWwgaW50IGVudGVyZWRXb3JkUG9zLCBmaW5hbCBTdWdnZXN0ZWRXb3JkcyBzdWdnZXN0ZWRXb3JkcykgewogICAgICAgICBmaW5hbCBSZXNlYXJjaExvZ2dlciByZXNlYXJjaExvZ2dlciA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW50ZXJlZFRleHQpICYmIGhhc0xldHRlcnMoZW50ZXJlZFRleHQudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgIHJlc2VhcmNoTG9nZ2VyLm1DdXJyZW50TG9nVW5pdC5zZXRXb3JkcyhlbnRlcmVkVGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgfQogICAgICAgICByZXNlYXJjaExvZ2dlci5lbnF1ZXVlRXZlbnQoTE9HU1RBVEVNRU5UX0xBVElOSU1FX09ORU5EQkFUQ0hJTlBVVCwgZW50ZXJlZFRleHQsCiAgICAgICAgICAgICAgICAgZW50ZXJlZFdvcmRQb3MpOwogICAgICAgICByZXNlYXJjaExvZ2dlci5tQ3VycmVudExvZ1VuaXQuaW5pdGlhbGl6ZVN1Z2dlc3Rpb25zKHN1Z2dlc3RlZFdvcmRzKTsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL3Jlc2VhcmNoL1VwbG9hZGVyU2VydmljZS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvVXBsb2FkZXJTZXJ2aWNlLmphdmEKaW5kZXggNmE5NzE3Yi4uZDJkYjM0OSAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvVXBsb2FkZXJTZXJ2aWNlLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvcmVzZWFyY2gvVXBsb2FkZXJTZXJ2aWNlLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kZWZpbmUuUHJvZHVjdGlvbkZsYWc7CiAKQEAgLTc5LDI4ICs4MCwxNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjYW5jZWxBbmRSZXNjaGVkdWxlVXBsb2FkaW5nU2VydmljZShmaW5hbCBDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRzUmVzY2hlZHVsaW5nKSB7Ci0gICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IGdldFBlbmRpbmdJbnRlbnRGb3JTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBVcGxvYWRlclNlcnZpY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldFNlcnZpY2UoY29udGV4dCwgMCwgaW50ZW50LCAwKTsKICAgICAgICAgZmluYWwgQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlciA9IChBbGFybU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKICAgICAgICAgICAgICAgICBDb250ZXh0LkFMQVJNX1NFUlZJQ0UpOwotICAgICAgICBjYW5jZWxBbnlTY2hlZHVsZWRTZXJ2aWNlQWxhcm0oYWxhcm1NYW5hZ2VyLCBwZW5kaW5nSW50ZW50KTsKLSAgICAgICAgaWYgKG5lZWRzUmVzY2hlZHVsaW5nKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVNlcnZpY2VBbGFybShhbGFybU1hbmFnZXIsIHBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGVuZGluZ0ludGVudCBnZXRQZW5kaW5nSW50ZW50Rm9yU2VydmljZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgVXBsb2FkZXJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIFBlbmRpbmdJbnRlbnQuZ2V0U2VydmljZShjb250ZXh0LCAwLCBpbnRlbnQsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FuY2VsQW55U2NoZWR1bGVkU2VydmljZUFsYXJtKGZpbmFsIEFsYXJtTWFuYWdlciBhbGFybU1hbmFnZXIsCi0gICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQpIHsKICAgICAgICAgYWxhcm1NYW5hZ2VyLmNhbmNlbChwZW5kaW5nSW50ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNjaGVkdWxlU2VydmljZUFsYXJtKGZpbmFsIEFsYXJtTWFuYWdlciBhbGFybU1hbmFnZXIsCi0gICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQpIHsKLSAgICAgICAgYWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIFVwbG9hZGVyU2VydmljZS5SVU5fSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgcGVuZGluZ0ludGVudCk7CisgICAgICAgIGlmIChuZWVkc1Jlc2NoZWR1bGluZykgeworICAgICAgICAgICAgYWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpCisgICAgICAgICAgICAgICAgICAgICsgVXBsb2FkZXJTZXJ2aWNlLlJVTl9JTlRFUlZBTCwgcGVuZGluZ0ludGVudCk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL2NvbV9hbmRyb2lkX2lucHV0bWV0aG9kX2xhdGluX0JpbmFyeURpY3Rpb25hcnkuY3BwIGIvbmF0aXZlL2puaS9jb21fYW5kcm9pZF9pbnB1dG1ldGhvZF9sYXRpbl9CaW5hcnlEaWN0aW9uYXJ5LmNwcAppbmRleCAxMWZhM2RhLi4xZGQ2OGVhIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL2NvbV9hbmRyb2lkX2lucHV0bWV0aG9kX2xhdGluX0JpbmFyeURpY3Rpb25hcnkuY3BwCisrKyBiL25hdGl2ZS9qbmkvY29tX2FuZHJvaWRfaW5wdXRtZXRob2RfbGF0aW5fQmluYXJ5RGljdGlvbmFyeS5jcHAKQEAgLTEwOSw3ICsxMDksOCBAQAogICAgIH0KICAgICBEaWN0aW9uYXJ5ICpkaWN0aW9uYXJ5ID0gMDsKICAgICBpZiAoQmluYXJ5Rm9ybWF0OjpVTktOT1dOX0ZPUk1BVAotICAgICAgICAgICAgPT0gQmluYXJ5Rm9ybWF0OjpkZXRlY3RGb3JtYXQoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihkaWN0QnVmKSkpIHsKKyAgICAgICAgICAgID09IEJpbmFyeUZvcm1hdDo6ZGV0ZWN0Rm9ybWF0KHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZGljdEJ1ZiksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZGljdFNpemUpKSkgewogICAgICAgICBBS0xPR0UoIkRJQ1Q6IGRpY3Rpb25hcnkgZm9ybWF0IGlzIHVua25vd24sIGJhZCBtYWdpYyBudW1iZXIiKTsKICNpZmRlZiBVU0VfTU1BUF9GT1JfRElDVElPTkFSWQogICAgICAgICByZWxlYXNlRGljdEJ1ZihzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGRpY3RCdWYpIC0gYWRqdXN0LCBhZGpEaWN0U2l6ZSwgZmQpOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvYmlncmFtX2RpY3Rpb25hcnkuY3BwIGIvbmF0aXZlL2puaS9zcmMvYmlncmFtX2RpY3Rpb25hcnkuY3BwCmluZGV4IDkyODkwMzguLjkwNTNlNzIgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL2JpZ3JhbV9kaWN0aW9uYXJ5LmNwcAorKysgYi9uYXRpdmUvam5pL3NyYy9iaWdyYW1fZGljdGlvbmFyeS5jcHAKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICAgICAgICAgICZwb3MpOwogICAgICAgICAoKm1hcClbYmlncmFtUG9zXSA9IHByb2JhYmlsaXR5OwogICAgICAgICBzZXRJbkZpbHRlcihmaWx0ZXIsIGJpZ3JhbVBvcyk7Ci0gICAgfSB3aGlsZSAoMCAhPSAoQmluYXJ5Rm9ybWF0OjpGTEFHX0FUVFJJQlVURV9IQVNfTkVYVCAmIGJpZ3JhbUZsYWdzKSk7CisgICAgfSB3aGlsZSAoQmluYXJ5Rm9ybWF0OjpGTEFHX0FUVFJJQlVURV9IQVNfTkVYVCAmIGJpZ3JhbUZsYWdzKTsKIH0KIAogYm9vbCBCaWdyYW1EaWN0aW9uYXJ5OjpjaGVja0ZpcnN0Q2hhcmFjdGVyKGludCAqd29yZCwgaW50ICppbnB1dENvZGVQb2ludHMpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL2JpbmFyeV9mb3JtYXQuaCBiL25hdGl2ZS9qbmkvc3JjL2JpbmFyeV9mb3JtYXQuaAppbmRleCAyZDJlMTk1Li45ODI0MTUzIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9iaW5hcnlfZm9ybWF0LmgKKysrIGIvbmF0aXZlL2puaS9zcmMvYmluYXJ5X2Zvcm1hdC5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlICJibG9vbV9maWx0ZXIuaCIKICNpbmNsdWRlICJjaGFyX3V0aWxzLmgiCisjaW5jbHVkZSAiaGFzaF9tYXBfY29tcGF0LmgiCiAKIG5hbWVzcGFjZSBsYXRpbmltZSB7CiAKQEAgLTYzLDEyICs2NCwxNCBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTl9GT1JNQVQgPSAtMTsKICAgICBzdGF0aWMgY29uc3QgaW50IFNIT1JUQ1VUX0xJU1RfU0laRV9TSVpFID0gMjsKIAotICAgIHN0YXRpYyBpbnQgZGV0ZWN0Rm9ybWF0KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QpOwotICAgIHN0YXRpYyBpbnQgZ2V0SGVhZGVyU2l6ZShjb25zdCB1aW50OF90ICpjb25zdCBkaWN0KTsKLSAgICBzdGF0aWMgaW50IGdldEZsYWdzKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QpOwotICAgIHN0YXRpYyB2b2lkIHJlYWRIZWFkZXJWYWx1ZShjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBjaGFyICpjb25zdCBrZXksIGludCAqb3V0VmFsdWUsCi0gICAgICAgICAgICBjb25zdCBpbnQgb3V0VmFsdWVTaXplKTsKLSAgICBzdGF0aWMgaW50IHJlYWRIZWFkZXJWYWx1ZUludChjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBjaGFyICpjb25zdCBrZXkpOworICAgIHN0YXRpYyBpbnQgZGV0ZWN0Rm9ybWF0KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGludCBkaWN0U2l6ZSk7CisgICAgc3RhdGljIGludCBnZXRIZWFkZXJTaXplKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGludCBkaWN0U2l6ZSk7CisgICAgc3RhdGljIGludCBnZXRGbGFncyhjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBpbnQgZGljdFNpemUpOworICAgIHN0YXRpYyBib29sIGhhc0JsYWNrbGlzdGVkT3JOb3RBV29yZEZsYWcoY29uc3QgaW50IGZsYWdzKTsKKyAgICBzdGF0aWMgdm9pZCByZWFkSGVhZGVyVmFsdWUoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgY29uc3QgaW50IGRpY3RTaXplLAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3Qga2V5LCBpbnQgKm91dFZhbHVlLCBjb25zdCBpbnQgb3V0VmFsdWVTaXplKTsKKyAgICBzdGF0aWMgaW50IHJlYWRIZWFkZXJWYWx1ZUludChjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBpbnQgZGljdFNpemUsCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBrZXkpOwogICAgIHN0YXRpYyBpbnQgZ2V0R3JvdXBDb3VudEFuZEZvcndhcmRQb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGludCAqcG9zKTsKICAgICBzdGF0aWMgdWludDhfdCBnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGludCAqcG9zKTsKICAgICBzdGF0aWMgaW50IGdldENvZGVQb2ludEFuZEZvcndhcmRQb2ludGVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGludCAqcG9zKTsKQEAgLTkyLDcgKzk1LDEzIEBACiAgICAgICAgICAgICBjb25zdCBpbnQgdW5pZ3JhbVByb2JhYmlsaXR5LCBjb25zdCBpbnQgYmlncmFtUHJvYmFiaWxpdHkpOwogICAgIHN0YXRpYyBpbnQgZ2V0UHJvYmFiaWxpdHkoY29uc3QgaW50IHBvc2l0aW9uLCBjb25zdCBzdGQ6Om1hcDxpbnQsIGludD4gKmJpZ3JhbU1hcCwKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpZ3JhbUZpbHRlciwgY29uc3QgaW50IHVuaWdyYW1Qcm9iYWJpbGl0eSk7Ci0gICAgc3RhdGljIGZsb2F0IGdldE11bHRpV29yZENvc3RNdWx0aXBsaWVyKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QpOworICAgIHN0YXRpYyBpbnQgZ2V0QmlncmFtUHJvYmFiaWxpdHlGcm9tSGFzaE1hcChjb25zdCBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICBjb25zdCBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQ+ICpiaWdyYW1NYXAsIGNvbnN0IGludCB1bmlncmFtUHJvYmFiaWxpdHkpOworICAgIHN0YXRpYyBmbG9hdCBnZXRNdWx0aVdvcmRDb3N0TXVsdGlwbGllcihjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBpbnQgZGljdFNpemUpOworICAgIHN0YXRpYyB2b2lkIGZpbGxCaWdyYW1Qcm9iYWJpbGl0eVRvSGFzaE1hcChjb25zdCB1aW50OF90ICpjb25zdCByb290LCBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQ+ICpiaWdyYW1NYXApOworICAgIHN0YXRpYyBpbnQgZ2V0QmlncmFtUHJvYmFiaWxpdHkoY29uc3QgdWludDhfdCAqY29uc3Qgcm9vdCwgaW50IHBvc2l0aW9uLAorICAgICAgICAgICAgY29uc3QgaW50IG5leHRQb3NpdGlvbiwgY29uc3QgaW50IHVuaWdyYW1Qcm9iYWJpbGl0eSk7CiAKICAgICAvLyBGbGFncyBmb3Igc3BlY2lhbCBwcm9jZXNzaW5nCiAgICAgLy8gVGhvc2UgKm11c3QqIG1hdGNoIHRoZSBmbGFncyBpbiBtYWtlZGljdCAoQmluYXJ5RGljdElucHV0T3V0cHV0IypfUFJPQ0VTU0lOR19GTEFHKSBvcgpAQCAtMTA0LDYgKzExMyw4IEBACiAKICBwcml2YXRlOgogICAgIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhCaW5hcnlGb3JtYXQpOworICAgIHN0YXRpYyBpbnQgZ2V0QmlncmFtTGlzdFBvc2l0aW9uRm9yV29yZFBvc2l0aW9uKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGludCBwb3NpdGlvbik7CisKICAgICBzdGF0aWMgY29uc3QgaW50IEZMQUdfR1JPVVBfQUREUkVTU19UWVBFX05PQUREUkVTUyA9IDB4MDA7CiAgICAgc3RhdGljIGNvbnN0IGludCBGTEFHX0dST1VQX0FERFJFU1NfVFlQRV9PTkVCWVRFID0gMHg0MDsKICAgICBzdGF0aWMgY29uc3QgaW50IEZMQUdfR1JPVVBfQUREUkVTU19UWVBFX1RXT0JZVEVTID0gMHg4MDsKQEAgLTExMiw2ICsxMjMsOCBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgRkxBR19BVFRSSUJVVEVfQUREUkVTU19UWVBFX1RXT0JZVEVTID0gMHgyMDsKICAgICBzdGF0aWMgY29uc3QgaW50IEZMQUdfQVRUUklCVVRFX0FERFJFU1NfVFlQRV9USFJFRUJZVEVTID0gMHgzMDsKIAorICAgIC8vIEFueSBmaWxlIHNtYWxsZXIgdGhhbiB0aGlzIGlzIG5vdCBhIGRpY3Rpb25hcnkuCisgICAgc3RhdGljIGNvbnN0IGludCBESUNUSU9OQVJZX01JTklNVU1fU0laRSA9IDQ7CiAgICAgLy8gT3JpZ2luYWxseSwgZm9ybWF0IHZlcnNpb24gMSBoYWQgYSAxNi1iaXQgbWFnaWMgbnVtYmVyLCB0aGVuIHRoZSB2ZXJzaW9uIG51bWJlciBgMDEnCiAgICAgLy8gdGhlbiBvcHRpb25zIHRoYXQgbXVzdCBiZSAwLiBIZW5jZSB0aGUgZmlyc3QgMzItYml0cyBvZiB0aGUgZm9ybWF0IGFyZSBhbHdheXMgYXMgZm9sbG93CiAgICAgLy8gYW5kIGl0J3Mgb2theSB0byBjb25zaWRlciB0aGVtIGEgbWFnaWMgbnVtYmVyIGFzIGEgd2hvbGUuCkBAIC0xMjEsNiArMTM0LDggQEAKICAgICAvLyBudW1iZXIsIHNvIHdlIGhhZCB0byBjaGFuZ2UgaXQgc28gdGhhdCB2ZXJzaW9uIDIgZmlsZXMgd291bGQgYmUgcmVqZWN0ZWQgYnkgb2xkZXIKICAgICAvLyBpbXBsZW1lbnRhdGlvbnMuIE9uIHRoaXMgb2NjYXNpb24sIHdlIG1hZGUgdGhlIG1hZ2ljIG51bWJlciAzMiBiaXRzIGxvbmcuCiAgICAgc3RhdGljIGNvbnN0IGludCBGT1JNQVRfVkVSU0lPTl8yX01BR0lDX05VTUJFUiA9IC0xNjgxODM1MjY2OyAvLyAweDlCQzEzQUZFCisgICAgLy8gTWFnaWMgbnVtYmVyICg0IGJ5dGVzKSwgdmVyc2lvbiAoMiBieXRlcyksIG9wdGlvbnMgKDIgYnl0ZXMpLCBoZWFkZXIgc2l6ZSAoNCBieXRlcykgPSAxMgorICAgIHN0YXRpYyBjb25zdCBpbnQgRk9STUFUX1ZFUlNJT05fMl9NSU5JTVVNX1NJWkUgPSAxMjsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQgQ0hBUkFDVEVSX0FSUkFZX1RFUk1JTkFUT1JfU0laRSA9IDE7CiAgICAgc3RhdGljIGNvbnN0IGludCBNSU5JTUFMX09ORV9CWVRFX0NIQVJBQ1RFUl9WQUxVRSA9IDB4MjA7CkBAIC0xMzEsOCArMTQ2LDExIEBACiAgICAgc3RhdGljIGludCBza2lwQmlncmFtcyhjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCB1aW50OF90IGZsYWdzLCBjb25zdCBpbnQgcG9zKTsKIH07CiAKLUFLX0ZPUkNFX0lOTElORSBpbnQgQmluYXJ5Rm9ybWF0OjpkZXRlY3RGb3JtYXQoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCkgeworQUtfRk9SQ0VfSU5MSU5FIGludCBCaW5hcnlGb3JtYXQ6OmRldGVjdEZvcm1hdChjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBpbnQgZGljdFNpemUpIHsKICAgICAvLyBUaGUgbWFnaWMgbnVtYmVyIGlzIHN0b3JlZCBiaWctZW5kaWFuLgorICAgIC8vIElmIHRoZSBkaWN0aW9uYXJ5IGlzIGxlc3MgdGhhbiA0IGJ5dGVzLCB3ZSBjYW4ndCBldmVuIHJlYWQgdGhlIG1hZ2ljIG51bWJlciwgc28gd2UgZG9uJ3QKKyAgICAvLyB1bmRlcnN0YW5kIHRoaXMgZm9ybWF0LgorICAgIGlmIChkaWN0U2l6ZSA8IERJQ1RJT05BUllfTUlOSU1VTV9TSVpFKSByZXR1cm4gVU5LTk9XTl9GT1JNQVQ7CiAgICAgY29uc3QgaW50IG1hZ2ljTnVtYmVyID0gKGRpY3RbMF0gPDwgMjQpICsgKGRpY3RbMV0gPDwgMTYpICsgKGRpY3RbMl0gPDwgOCkgKyBkaWN0WzNdOwogICAgIHN3aXRjaCAobWFnaWNOdW1iZXIpIHsKICAgICBjYXNlIEZPUk1BVF9WRVJTSU9OXzFfTUFHSUNfTlVNQkVSOgpAQCAtMTQyLDYgKzE2MCwxMCBAQAogICAgICAgICAvLyBPcHRpb25zICgyIGJ5dGVzKSBtdXN0IGJlIDB4MDAgMHgwMAogICAgICAgICByZXR1cm4gMTsKICAgICBjYXNlIEZPUk1BVF9WRVJTSU9OXzJfTUFHSUNfTlVNQkVSOgorICAgICAgICAvLyBWZXJzaW9uIDIgZGljdGlvbmFyaWVzIGFyZSBhdCBsZWFzdCAxMiBieXRlcyBsb25nIChzZWUgYmVsb3cgZGV0YWlscyBmb3IgdGhlIGhlYWRlcikuCisgICAgICAgIC8vIElmIHRoaXMgZGljdGlvbmFyeSBoYXMgdGhlIHZlcnNpb24gMiBtYWdpYyBudW1iZXIgYnV0IGlzIGxlc3MgdGhhbiAxMiBieXRlcyBsb25nLCB0aGVuCisgICAgICAgIC8vIGl0J3MgYW4gdW5rbm93biBmb3JtYXQgYW5kIHdlIG5lZWQgdG8gYXZvaWQgY29uZmlkZW50bHkgcmVhZGluZyB0aGUgbmV4dCBieXRlcy4KKyAgICAgICAgaWYgKGRpY3RTaXplIDwgRk9STUFUX1ZFUlNJT05fMl9NSU5JTVVNX1NJWkUpIHJldHVybiBVTktOT1dOX0ZPUk1BVDsKICAgICAgICAgLy8gRm9ybWF0IDIgaGVhZGVyIGlzIGFzIGZvbGxvd3M6CiAgICAgICAgIC8vIE1hZ2ljIG51bWJlciAoNCBieXRlcykgMHg5QiAweEMxIDB4M0EgMHhGRQogICAgICAgICAvLyBWZXJzaW9uIG51bWJlciAoMiBieXRlcykgMHgwMCAweDAyCkBAIC0xNTMsOCArMTc1LDggQEAKICAgICB9CiB9CiAKLWlubGluZSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRGbGFncyhjb25zdCB1aW50OF90ICpjb25zdCBkaWN0KSB7Ci0gICAgc3dpdGNoIChkZXRlY3RGb3JtYXQoZGljdCkpIHsKK2lubGluZSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRGbGFncyhjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBpbnQgZGljdFNpemUpIHsKKyAgICBzd2l0Y2ggKGRldGVjdEZvcm1hdChkaWN0LCBkaWN0U2l6ZSkpIHsKICAgICBjYXNlIDE6CiAgICAgICAgIHJldHVybiBOT19GTEFHUzsgLy8gVE9ETzogTk9fRkxBR1MgaXMgdW51c2VkIGFueXdoZXJlIGVsc2U/CiAgICAgZGVmYXVsdDoKQEAgLTE2Miw4ICsxODQsMTIgQEAKICAgICB9CiB9CiAKLWlubGluZSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRIZWFkZXJTaXplKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QpIHsKLSAgICBzd2l0Y2ggKGRldGVjdEZvcm1hdChkaWN0KSkgeworaW5saW5lIGJvb2wgQmluYXJ5Rm9ybWF0OjpoYXNCbGFja2xpc3RlZE9yTm90QVdvcmRGbGFnKGNvbnN0IGludCBmbGFncykgeworICAgIHJldHVybiAoZmxhZ3MgJiAoRkxBR19JU19CTEFDS0xJU1RFRCB8IEZMQUdfSVNfTk9UX0FfV09SRCkpICE9IDA7Cit9CisKK2lubGluZSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRIZWFkZXJTaXplKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGludCBkaWN0U2l6ZSkgeworICAgIHN3aXRjaCAoZGV0ZWN0Rm9ybWF0KGRpY3QsIGRpY3RTaXplKSkgewogICAgIGNhc2UgMToKICAgICAgICAgcmV0dXJuIEZPUk1BVF9WRVJTSU9OXzFfSEVBREVSX1NJWkU7CiAgICAgY2FzZSAyOgpAQCAtMTc0LDEyICsyMDAsMTIgQEAKICAgICB9CiB9CiAKLWlubGluZSB2b2lkIEJpbmFyeUZvcm1hdDo6cmVhZEhlYWRlclZhbHVlKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGNoYXIgKmNvbnN0IGtleSwKLSAgICAgICAgaW50ICpvdXRWYWx1ZSwgY29uc3QgaW50IG91dFZhbHVlU2l6ZSkgeworaW5saW5lIHZvaWQgQmluYXJ5Rm9ybWF0OjpyZWFkSGVhZGVyVmFsdWUoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwgY29uc3QgaW50IGRpY3RTaXplLAorICAgICAgICBjb25zdCBjaGFyICpjb25zdCBrZXksIGludCAqb3V0VmFsdWUsIGNvbnN0IGludCBvdXRWYWx1ZVNpemUpIHsKICAgICBpbnQgb3V0VmFsdWVJbmRleCA9IDA7CiAgICAgLy8gT25seSBmb3JtYXQgMiBhbmQgYWJvdmUgaGF2ZSBoZWFkZXIgYXR0cmlidXRlcyBhcyB7a2V5LHZhbHVlfSBzdHJpbmcgcGFpcnMuIEZvciBwcmlvcgogICAgIC8vIGZvcm1hdHMsIHdlIGp1c3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZywgYXMgaWYgdGhlIGtleSB3YXNuJ3QgZm91bmQuCi0gICAgaWYgKDIgPD0gZGV0ZWN0Rm9ybWF0KGRpY3QpKSB7CisgICAgaWYgKDIgPD0gZGV0ZWN0Rm9ybWF0KGRpY3QsIGRpY3RTaXplKSkgewogICAgICAgICBjb25zdCBpbnQgaGVhZGVyT3B0aW9uc09mZnNldCA9IDQgLyogbWFnaWMgbnVtYmVyICovCiAgICAgICAgICAgICAgICAgKyAyIC8qIGRpY3Rpb25hcnkgdmVyc2lvbiAqLyArIDIgLyogZmxhZ3MgKi87CiAgICAgICAgIGNvbnN0IGludCBoZWFkZXJTaXplID0KQEAgLTIyMiwxMSArMjQ4LDEyIEBACiAgICAgaWYgKG91dFZhbHVlSW5kZXggPj0gMCkgb3V0VmFsdWVbb3V0VmFsdWVJbmRleF0gPSAwOwogfQogCi1pbmxpbmUgaW50IEJpbmFyeUZvcm1hdDo6cmVhZEhlYWRlclZhbHVlSW50KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY3QsIGNvbnN0IGNoYXIgKmNvbnN0IGtleSkgeworaW5saW5lIGludCBCaW5hcnlGb3JtYXQ6OnJlYWRIZWFkZXJWYWx1ZUludChjb25zdCB1aW50OF90ICpjb25zdCBkaWN0LCBjb25zdCBpbnQgZGljdFNpemUsCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGtleSkgewogICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gTEFSR0VTVF9JTlRfRElHSVRfQ09VTlQ7CiAgICAgaW50IGludEJ1ZmZlcltidWZmZXJTaXplXTsKICAgICBjaGFyIGNoYXJCdWZmZXJbYnVmZmVyU2l6ZV07Ci0gICAgQmluYXJ5Rm9ybWF0OjpyZWFkSGVhZGVyVmFsdWUoZGljdCwga2V5LCBpbnRCdWZmZXIsIGJ1ZmZlclNpemUpOworICAgIEJpbmFyeUZvcm1hdDo6cmVhZEhlYWRlclZhbHVlKGRpY3QsIGRpY3RTaXplLCBrZXksIGludEJ1ZmZlciwgYnVmZmVyU2l6ZSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJTaXplOyArK2kpIHsKICAgICAgICAgY2hhckJ1ZmZlcltpXSA9IGludEJ1ZmZlcltpXTsKICAgICB9CkBAIC0yNDIsOCArMjY5LDEwIEBACiAgICAgcmV0dXJuICgobXNiICYgMHg3RikgPDwgOCkgfCBkaWN0WygqcG9zKSsrXTsKIH0KIAotaW5saW5lIGZsb2F0IEJpbmFyeUZvcm1hdDo6Z2V0TXVsdGlXb3JkQ29zdE11bHRpcGxpZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCkgewotICAgIGNvbnN0IGludCBoZWFkZXJWYWx1ZSA9IHJlYWRIZWFkZXJWYWx1ZUludChkaWN0LCAiTVVMVElQTEVfV09SRFNfREVNT1RJT05fUkFURSIpOworaW5saW5lIGZsb2F0IEJpbmFyeUZvcm1hdDo6Z2V0TXVsdGlXb3JkQ29zdE11bHRpcGxpZXIoY29uc3QgdWludDhfdCAqY29uc3QgZGljdCwKKyAgICAgICAgY29uc3QgaW50IGRpY3RTaXplKSB7CisgICAgY29uc3QgaW50IGhlYWRlclZhbHVlID0gcmVhZEhlYWRlclZhbHVlSW50KGRpY3QsIGRpY3RTaXplLAorICAgICAgICAgICAgIk1VTFRJUExFX1dPUkRTX0RFTU9USU9OX1JBVEUiKTsKICAgICBpZiAoaGVhZGVyVmFsdWUgPT0gU19JTlRfTUlOKSB7CiAgICAgICAgIHJldHVybiAxLjBmOwogICAgIH0KQEAgLTY4Miw1ICs3MTEsNjggQEAKICAgICB9CiAgICAgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbVByb2JhYmlsaXR5KTsKIH0KKworLy8gVGhpcyByZXR1cm5zIGEgcHJvYmFiaWxpdHkgaW4gbG9nIHNwYWNlLgoraW5saW5lIGludCBCaW5hcnlGb3JtYXQ6OmdldEJpZ3JhbVByb2JhYmlsaXR5RnJvbUhhc2hNYXAoY29uc3QgaW50IHBvc2l0aW9uLAorICAgICAgICBjb25zdCBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQ+ICpiaWdyYW1NYXAsIGNvbnN0IGludCB1bmlncmFtUHJvYmFiaWxpdHkpIHsKKyAgICBpZiAoIWJpZ3JhbU1hcCkgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbVByb2JhYmlsaXR5KTsKKyAgICBjb25zdCBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQ+Ojpjb25zdF9pdGVyYXRvciBiaWdyYW1Qcm9iYWJpbGl0eUl0ID0gYmlncmFtTWFwLT5maW5kKHBvc2l0aW9uKTsKKyAgICBpZiAoYmlncmFtUHJvYmFiaWxpdHlJdCAhPSBiaWdyYW1NYXAtPmVuZCgpKSB7CisgICAgICAgIGNvbnN0IGludCBiaWdyYW1Qcm9iYWJpbGl0eSA9IGJpZ3JhbVByb2JhYmlsaXR5SXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVQcm9iYWJpbGl0eUZvckJpZ3JhbSh1bmlncmFtUHJvYmFiaWxpdHksIGJpZ3JhbVByb2JhYmlsaXR5KTsKKyAgICB9CisgICAgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbVByb2JhYmlsaXR5KTsKK30KKworQUtfRk9SQ0VfSU5MSU5FIHZvaWQgQmluYXJ5Rm9ybWF0OjpmaWxsQmlncmFtUHJvYmFiaWxpdHlUb0hhc2hNYXAoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGludCBwb3NpdGlvbiwgaGFzaF9tYXBfY29tcGF0PGludCwgaW50PiAqYmlncmFtTWFwKSB7CisgICAgcG9zaXRpb24gPSBnZXRCaWdyYW1MaXN0UG9zaXRpb25Gb3JXb3JkUG9zaXRpb24ocm9vdCwgcG9zaXRpb24pOworICAgIGlmICgwID09IHBvc2l0aW9uKSByZXR1cm47CisKKyAgICB1aW50OF90IGJpZ3JhbUZsYWdzOworICAgIGRvIHsKKyAgICAgICAgYmlncmFtRmxhZ3MgPSBnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKHJvb3QsICZwb3NpdGlvbik7CisgICAgICAgIGNvbnN0IGludCBwcm9iYWJpbGl0eSA9IE1BU0tfQVRUUklCVVRFX1BST0JBQklMSVRZICYgYmlncmFtRmxhZ3M7CisgICAgICAgIGNvbnN0IGludCBiaWdyYW1Qb3MgPSBnZXRBdHRyaWJ1dGVBZGRyZXNzQW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgYmlncmFtRmxhZ3MsCisgICAgICAgICAgICAgICAgJnBvc2l0aW9uKTsKKyAgICAgICAgKCpiaWdyYW1NYXApW2JpZ3JhbVBvc10gPSBwcm9iYWJpbGl0eTsKKyAgICB9IHdoaWxlIChGTEFHX0FUVFJJQlVURV9IQVNfTkVYVCAmIGJpZ3JhbUZsYWdzKTsKK30KKworQUtfRk9SQ0VfSU5MSU5FIGludCBCaW5hcnlGb3JtYXQ6OmdldEJpZ3JhbVByb2JhYmlsaXR5KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGludCBwb3NpdGlvbiwKKyAgICAgICAgY29uc3QgaW50IG5leHRQb3NpdGlvbiwgY29uc3QgaW50IHVuaWdyYW1Qcm9iYWJpbGl0eSkgeworICAgIHBvc2l0aW9uID0gZ2V0QmlncmFtTGlzdFBvc2l0aW9uRm9yV29yZFBvc2l0aW9uKHJvb3QsIHBvc2l0aW9uKTsKKyAgICBpZiAoMCA9PSBwb3NpdGlvbikgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbVByb2JhYmlsaXR5KTsKKworICAgIHVpbnQ4X3QgYmlncmFtRmxhZ3M7CisgICAgZG8geworICAgICAgICBiaWdyYW1GbGFncyA9IGdldEZsYWdzQW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgJnBvc2l0aW9uKTsKKyAgICAgICAgY29uc3QgaW50IGJpZ3JhbVBvcyA9IGdldEF0dHJpYnV0ZUFkZHJlc3NBbmRGb3J3YXJkUG9pbnRlcigKKyAgICAgICAgICAgICAgICByb290LCBiaWdyYW1GbGFncywgJnBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGJpZ3JhbVBvcyA9PSBuZXh0UG9zaXRpb24pIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBiaWdyYW1Qcm9iYWJpbGl0eSA9IE1BU0tfQVRUUklCVVRFX1BST0JBQklMSVRZICYgYmlncmFtRmxhZ3M7CisgICAgICAgICAgICByZXR1cm4gY29tcHV0ZVByb2JhYmlsaXR5Rm9yQmlncmFtKHVuaWdyYW1Qcm9iYWJpbGl0eSwgYmlncmFtUHJvYmFiaWxpdHkpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoRkxBR19BVFRSSUJVVEVfSEFTX05FWFQgJiBiaWdyYW1GbGFncyk7CisgICAgcmV0dXJuIGJhY2tvZmYodW5pZ3JhbVByb2JhYmlsaXR5KTsKK30KKworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBiaWdyYW0gbGlzdC4KK0FLX0ZPUkNFX0lOTElORSBpbnQgQmluYXJ5Rm9ybWF0OjpnZXRCaWdyYW1MaXN0UG9zaXRpb25Gb3JXb3JkUG9zaXRpb24oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHJvb3QsIGludCBwb3NpdGlvbikgeworICAgIGlmIChOT1RfVkFMSURfV09SRCA9PSBwb3NpdGlvbikgcmV0dXJuIDA7CisgICAgY29uc3QgdWludDhfdCBmbGFncyA9IGdldEZsYWdzQW5kRm9yd2FyZFBvaW50ZXIocm9vdCwgJnBvc2l0aW9uKTsKKyAgICBpZiAoIShmbGFncyAmIEZMQUdfSEFTX0JJR1JBTVMpKSByZXR1cm4gMDsKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX0hBU19NVUxUSVBMRV9DSEFSUykgeworICAgICAgICBwb3NpdGlvbiA9IHNraXBPdGhlckNoYXJhY3RlcnMocm9vdCwgcG9zaXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIGdldENvZGVQb2ludEFuZEZvcndhcmRQb2ludGVyKHJvb3QsICZwb3NpdGlvbik7CisgICAgfQorICAgIHBvc2l0aW9uID0gc2tpcFByb2JhYmlsaXR5KGZsYWdzLCBwb3NpdGlvbik7CisgICAgcG9zaXRpb24gPSBza2lwQ2hpbGRyZW5Qb3NpdGlvbihmbGFncywgcG9zaXRpb24pOworICAgIHBvc2l0aW9uID0gc2tpcFNob3J0Y3V0cyhyb290LCBmbGFncywgcG9zaXRpb24pOworICAgIHJldHVybiBwb3NpdGlvbjsKK30KKwogfSAvLyBuYW1lc3BhY2UgbGF0aW5pbWUKICNlbmRpZiAvLyBMQVRJTklNRV9CSU5BUllfRk9STUFUX0gKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL2NvcnJlY3Rpb24uY3BwIGIvbmF0aXZlL2puaS9zcmMvY29ycmVjdGlvbi5jcHAKaW5kZXggMGM2NTkzOS4uNjFiZjNmNiAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvY29ycmVjdGlvbi5jcHAKKysrIGIvbmF0aXZlL2puaS9zcmMvY29ycmVjdGlvbi5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlICJkZWZpbmVzLmgiCiAjaW5jbHVkZSAicHJveGltaXR5X2luZm9fc3RhdGUuaCIKICNpbmNsdWRlICJzdWdnZXN0X3V0aWxzLmgiCisjaW5jbHVkZSAic3VnZ2VzdC9wb2xpY3lpbXBsL3V0aWxzL2VkaXRfZGlzdGFuY2UuaCIKKyNpbmNsdWRlICJzdWdnZXN0L3BvbGljeWltcGwvdXRpbHMvZGFtZXJhdV9sZXZlbnNodGVpbl9lZGl0X2Rpc3RhbmNlX3BvbGljeS5oIgogCiBuYW1lc3BhY2UgbGF0aW5pbWUgewogCkBAIC05MDYsNTAgKzkwOCwxMSBAQAogICAgIHJldHVybiB0b3RhbEZyZXE7CiB9CiAKLS8qIERhbWVyYXUtTGV2ZW5zaHRlaW4gZGlzdGFuY2UgKi8KLWlubGluZSBzdGF0aWMgaW50IGVkaXREaXN0YW5jZUludGVybmFsKGludCAqZWRpdERpc3RhbmNlVGFibGUsIGNvbnN0IGludCAqYmVmb3JlLAotICAgICAgICBjb25zdCBpbnQgYmVmb3JlTGVuZ3RoLCBjb25zdCBpbnQgKmFmdGVyLCBjb25zdCBpbnQgYWZ0ZXJMZW5ndGgpIHsKLSAgICAvLyBkcFtsaV1bbG9dIGRwW2FdW2JdID0gZHBbIGEgKiBsbyArIGJdCi0gICAgaW50ICpkcCA9IGVkaXREaXN0YW5jZVRhYmxlOwotICAgIGNvbnN0IGludCBsaSA9IGJlZm9yZUxlbmd0aCArIDE7Ci0gICAgY29uc3QgaW50IGxvID0gYWZ0ZXJMZW5ndGggKyAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGk7ICsraSkgewotICAgICAgICBkcFtsbyAqIGldID0gaTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsbzsgKytpKSB7Ci0gICAgICAgIGRwW2ldID0gaTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpIC0gMTsgKytpKSB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG8gLSAxOyArK2opIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBjaSA9IHRvQmFzZUxvd2VyQ2FzZShiZWZvcmVbaV0pOwotICAgICAgICAgICAgY29uc3QgaW50IGNvID0gdG9CYXNlTG93ZXJDYXNlKGFmdGVyW2pdKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBjb3N0ID0gKGNpID09IGNvKSA/IDAgOiAxOwotICAgICAgICAgICAgZHBbKGkgKyAxKSAqIGxvICsgKGogKyAxKV0gPSBtaW4oZHBbaSAqIGxvICsgKGogKyAxKV0gKyAxLAotICAgICAgICAgICAgICAgICAgICBtaW4oZHBbKGkgKyAxKSAqIGxvICsgal0gKyAxLCBkcFtpICogbG8gKyBqXSArIGNvc3QpKTsKLSAgICAgICAgICAgIGlmIChpID4gMCAmJiBqID4gMCAmJiBjaSA9PSB0b0Jhc2VMb3dlckNhc2UoYWZ0ZXJbaiAtIDFdKQotICAgICAgICAgICAgICAgICAgICAmJiBjbyA9PSB0b0Jhc2VMb3dlckNhc2UoYmVmb3JlW2kgLSAxXSkpIHsKLSAgICAgICAgICAgICAgICBkcFsoaSArIDEpICogbG8gKyAoaiArIDEpXSA9IG1pbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwWyhpICsgMSkgKiBsbyArIChqICsgMSldLCBkcFsoaSAtIDEpICogbG8gKyAoaiAtIDEpXSArIGNvc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKERFQlVHX0VESVRfRElTVEFOQ0UpIHsKLSAgICAgICAgQUtMT0dJKCJJTiA9ICVkLCBPVVQgPSAlZCIsIGJlZm9yZUxlbmd0aCwgYWZ0ZXJMZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpOyArK2kpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG87ICsraikgewotICAgICAgICAgICAgICAgIEFLTE9HSSgiRURJVFslZF1bJWRdLCAlZCIsIGksIGosIGRwW2kgKiBsbyArIGpdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZHBbbGkgKiBsbyAtIDFdOwotfQotCiAvKiBzdGF0aWMgKi8gaW50IENvcnJlY3Rpb246OlJhbmtpbmdBbGdvcml0aG06OmVkaXREaXN0YW5jZShjb25zdCBpbnQgKmJlZm9yZSwKICAgICAgICAgY29uc3QgaW50IGJlZm9yZUxlbmd0aCwgY29uc3QgaW50ICphZnRlciwgY29uc3QgaW50IGFmdGVyTGVuZ3RoKSB7Ci0gICAgaW50IHRhYmxlWyhiZWZvcmVMZW5ndGggKyAxKSAqIChhZnRlckxlbmd0aCArIDEpXTsKLSAgICByZXR1cm4gZWRpdERpc3RhbmNlSW50ZXJuYWwodGFibGUsIGJlZm9yZSwgYmVmb3JlTGVuZ3RoLCBhZnRlciwgYWZ0ZXJMZW5ndGgpOworICAgIGNvbnN0IERhbWVyYXVMZXZlbnNodGVpbkVkaXREaXN0YW5jZVBvbGljeSBkYWVtYXJ1TGV2ZW5zaHRlaW4oCisgICAgICAgICAgICBiZWZvcmUsIGJlZm9yZUxlbmd0aCwgYWZ0ZXIsIGFmdGVyTGVuZ3RoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihFZGl0RGlzdGFuY2U6OmdldEVkaXREaXN0YW5jZSgmZGFlbWFydUxldmVuc2h0ZWluKSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvZGVmaW5lcy5oIGIvbmF0aXZlL2puaS9zcmMvZGVmaW5lcy5oCmluZGV4IDZlZjlmNDEuLmViNTk3NDQgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL2RlZmluZXMuaAorKysgYi9uYXRpdmUvam5pL3NyYy9kZWZpbmVzLmgKQEAgLTM3OSw2ICszNzksMTUgQEAKICNlcnJvciAiQklHUkFNX0ZJTFRFUl9NT0RVTE8gaXMgbGFyZ2VyIHRoYW4gQklHUkFNX0ZJTFRFUl9CWVRFX1NJWkUiCiAjZW5kaWYKIAorLy8gTWF4IG51bWJlciBvZiBiaWdyYW0gbWFwcyAocHJldmlvdXMgd29yZCBjb250ZXh0cykgdG8gYmUgY2FjaGVkLiBJbmNyZWFzaW5nIHRoaXMgbnVtYmVyIGNvdWxkCisvLyBpbXByb3ZlIGJpZ3JhbSBsb29rdXAgc3BlZWQgZm9yIG11bHRpLXdvcmQgc3VnZ2VzdGlvbnMsIGJ1dCBhdCB0aGUgY29zdCBvZiBtb3JlIG1lbW9yeSB1c2FnZS4KKy8vIEFsc28sIHRoZXJlIGFyZSBkaW1pbmlzaGluZyByZXR1cm5zIHNpbmNlIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBiaWdyYW1zIGFyZSB0eXBpY2FsbHkgbmVhcgorLy8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgYW5kIGFyZSB0aHVzIHRoZSBmaXJzdCBvbmVzIHRvIGJlIGNhY2hlZC4gTm90ZSB0aGF0IHRoZXNlIGJpZ3JhbXMKKy8vIGFyZSByZXNldCBmb3IgZWFjaCBuZXcgY29tcG9zaW5nIHdvcmQuCisjZGVmaW5lIE1BWF9DQUNIRURfUFJFVl9XT1JEU19JTl9CSUdSQU1fTUFQIDI1CisvLyBNb3N0IGNvbW1vbiBwcmV2aW91cyB3b3JkIGNvbnRleHRzIGN1cnJlbnRseSBoYXZlIDEwMCBiaWdyYW1zCisjZGVmaW5lIERFRkFVTFRfSEFTSF9NQVBfU0laRV9GT1JfRUFDSF9CSUdSQU1fTUFQIDEwMAorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBBS19GT1JDRV9JTkxJTkUgY29uc3QgVCAmbWluKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIGEgPCBiID8gYSA6IGI7IH0KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEFLX0ZPUkNFX0lOTElORSBjb25zdCBUICZtYXgoY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA+IGIgPyBhIDogYjsgfQogCkBAIC00MTcsMTYgKzQyNiw0NSBAQAogfSBEb3VibGVMZXR0ZXJMZXZlbDsKIAogdHlwZWRlZiBlbnVtIHsKKyAgICAvLyBDb3JyZWN0aW9uIGZvciBNQVRDSF9DSEFSCiAgICAgQ1RfTUFUQ0gsCisgICAgLy8gQ29ycmVjdGlvbiBmb3IgUFJPWElNSVRZX0NIQVIKICAgICBDVF9QUk9YSU1JVFksCisgICAgLy8gQ29ycmVjdGlvbiBmb3IgQURESVRJT05BTF9QUk9YSU1JVFlfQ0hBUgogICAgIENUX0FERElUSU9OQUxfUFJPWElNSVRZLAorICAgIC8vIENvcnJlY3Rpb24gZm9yIFNVQlNUSVRVVElPTl9DSEFSCiAgICAgQ1RfU1VCU1RJVFVUSU9OLAorICAgIC8vIFNraXAgb25lIG9taXR0ZWQgbGV0dGVyCiAgICAgQ1RfT01JU1NJT04sCisgICAgLy8gRGVsZXRlIGFuIHVubmVjZXNzYXJpbHkgaW5zZXJ0ZWQgbGV0dGVyCiAgICAgQ1RfSU5TRVJUSU9OLAorICAgIC8vIFN3YXAgdGhlIG9yZGVyIG9mIG5leHQgdHdvIHRvdWNoIHBvaW50cwogICAgIENUX1RSQU5TUE9TSVRJT04sCiAgICAgQ1RfQ09NUExFVElPTiwKICAgICBDVF9URVJNSU5BTCwKKyAgICAvLyBDcmVhdGUgbmV3IHdvcmQgd2l0aCBzcGFjZSBvbWlzc2lvbgogICAgIENUX05FV19XT1JEX1NQQUNFX09NSVRUSU9OLAorICAgIC8vIENyZWF0ZSBuZXcgd29yZCB3aXRoIHNwYWNlIHN1YnN0aXR1dGlvbgogICAgIENUX05FV19XT1JEX1NQQUNFX1NVQlNUSVRVVElPTiwKIH0gQ29ycmVjdGlvblR5cGU7CisKKy8vIEVycm9yVHlwZSBpcyBtYWlubHkgZGVjaWRlZCBieSBDb3JyZWN0aW9uVHlwZSBidXQgaXQgaXMgYWxzbyBkZXBlbmRpbmcgb24gaWYKKy8vIHRoZSBjb3JyZWN0aW9uIGhhcyByZWFsbHkgYmVlbiBwZXJmb3JtZWQgb3Igbm90LgordHlwZWRlZiBlbnVtIHsKKyAgICAvLyBTdWJzdGl0dXRpb24sIG9taXNzaW9uIGFuZCB0cmFuc3Bvc2l0aW9uCisgICAgRVRfRURJVF9DT1JSRUNUSU9OLAorICAgIC8vIFByb3hpbWl0eSBlcnJvcgorICAgIEVUX1BST1hJTUlUWV9DT1JSRUNUSU9OLAorICAgIC8vIENvbXBsZXRpb24KKyAgICBFVF9DT01QTEVUSU9OLAorICAgIC8vIE5ldyB3b3JkCisgICAgLy8gVE9ETzogUmVtb3ZlLgorICAgIC8vIEEgbmV3IHdvcmQgZXJyb3Igc2hvdWxkIGJlIGFuIGVkaXQgY29ycmVjdGlvbiBlcnJvciBvciBhIHByb3hpbWl0eSBjb3JyZWN0aW9uIGVycm9yLgorICAgIEVUX05FV19XT1JELAorICAgIC8vIFRyZWF0IGVycm9yIGFzIGFuIGludGVudGlvbmFsIG9taXNzaW9uIHdoZW4gdGhlIENvcnJlY3Rpb25UeXBlIGlzIG9taXNzaW9uIGFuZCB0aGUgbm9kZSBjYW4KKyAgICAvLyBiZSBpbnRlbnRpb25hbCBvbWlzc2lvbi4KKyAgICBFVF9JTlRFTlRJT05BTF9PTUlTU0lPTiwKKyAgICAvLyBOb3QgdHJlYXRlZCBhcyBhbiBlcnJvci4gVHJhY2tlZCBmb3IgY2hlY2tpbmcgZXhhY3QgbWF0Y2gKKyAgICBFVF9OT1RfQU5fRVJST1IKK30gRXJyb3JUeXBlOwogI2VuZGlmIC8vIExBVElOSU1FX0RFRklORVNfSApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5jcHAgYi9uYXRpdmUvam5pL3NyYy9kaWN0aW9uYXJ5LmNwcAppbmRleCBjOTk4YzA2Li5kYWRiMmJhIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9kaWN0aW9uYXJ5LmNwcAorKysgYi9uYXRpdmUvam5pL3NyYy9kaWN0aW9uYXJ5LmNwcApAQCAtMzQsOSArMzQsMTEgQEAKIAogRGljdGlvbmFyeTo6RGljdGlvbmFyeSh2b2lkICpkaWN0LCBpbnQgZGljdFNpemUsIGludCBtbWFwRmQsIGludCBkaWN0QnVmQWRqdXN0KQogICAgICAgICA6IG1EaWN0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgKj4oZGljdCkpLAotICAgICAgICAgIG1PZmZzZXREaWN0KChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyICo+KGRpY3QpKSArIEJpbmFyeUZvcm1hdDo6Z2V0SGVhZGVyU2l6ZShtRGljdCkpLAorICAgICAgICAgIG1PZmZzZXREaWN0KChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyICo+KGRpY3QpKQorICAgICAgICAgICAgICAgICAgKyBCaW5hcnlGb3JtYXQ6OmdldEhlYWRlclNpemUobURpY3QsIGRpY3RTaXplKSksCiAgICAgICAgICAgbURpY3RTaXplKGRpY3RTaXplKSwgbU1tYXBGZChtbWFwRmQpLCBtRGljdEJ1ZkFkanVzdChkaWN0QnVmQWRqdXN0KSwKLSAgICAgICAgICBtVW5pZ3JhbURpY3Rpb25hcnkobmV3IFVuaWdyYW1EaWN0aW9uYXJ5KG1PZmZzZXREaWN0LCBCaW5hcnlGb3JtYXQ6OmdldEZsYWdzKG1EaWN0KSkpLAorICAgICAgICAgIG1VbmlncmFtRGljdGlvbmFyeShuZXcgVW5pZ3JhbURpY3Rpb25hcnkobU9mZnNldERpY3QsCisgICAgICAgICAgICAgICAgICBCaW5hcnlGb3JtYXQ6OmdldEZsYWdzKG1EaWN0LCBkaWN0U2l6ZSkpKSwKICAgICAgICAgICBtQmlncmFtRGljdGlvbmFyeShuZXcgQmlncmFtRGljdGlvbmFyeShtT2Zmc2V0RGljdCkpLAogICAgICAgICAgIG1HZXN0dXJlU3VnZ2VzdChuZXcgU3VnZ2VzdChHZXN0dXJlU3VnZ2VzdFBvbGljeUZhY3Rvcnk6OmdldEdlc3R1cmVTdWdnZXN0UG9saWN5KCkpKSwKICAgICAgICAgICBtVHlwaW5nU3VnZ2VzdChuZXcgU3VnZ2VzdChUeXBpbmdTdWdnZXN0UG9saWN5RmFjdG9yeTo6Z2V0VHlwaW5nU3VnZ2VzdFBvbGljeSgpKSkgewpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5oIGIvbmF0aXZlL2puaS9zcmMvZGljdGlvbmFyeS5oCmluZGV4IDA2NTNkM2MuLjJhZDViNmMgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL2RpY3Rpb25hcnkuaAorKysgYi9uYXRpdmUvam5pL3NyYy9kaWN0aW9uYXJ5LmgKQEAgLTMxLDYgKzMxLDcgQEAKIGNsYXNzIERpY3Rpb25hcnkgewogIHB1YmxpYzoKICAgICAvLyBUYWtlbiBmcm9tIFN1Z2dlc3RlZFdvcmRzLmphdmEKKyAgICBzdGF0aWMgY29uc3QgaW50IEtJTkRfTUFTS19LSU5EID0gMHhGRjsgLy8gTWFzayB0byBnZXQgb25seSB0aGUga2luZAogICAgIHN0YXRpYyBjb25zdCBpbnQgS0lORF9UWVBFRCA9IDA7IC8vIFdoYXQgdXNlciB0eXBlZAogICAgIHN0YXRpYyBjb25zdCBpbnQgS0lORF9DT1JSRUNUSU9OID0gMTsgLy8gU2ltcGxlIGNvcnJlY3Rpb24vc3VnZ2VzdGlvbgogICAgIHN0YXRpYyBjb25zdCBpbnQgS0lORF9DT01QTEVUSU9OID0gMjsgLy8gQ29tcGxldGlvbiAoc3VnZ2VzdGlvbiB3aXRoIGFwcGVuZGVkIGNoYXJzKQpAQCAtNDEsNiArNDIsMTAgQEAKICAgICBzdGF0aWMgY29uc3QgaW50IEtJTkRfU0hPUlRDVVQgPSA3OyAvLyBBIHNob3J0Y3V0CiAgICAgc3RhdGljIGNvbnN0IGludCBLSU5EX1BSRURJQ1RJT04gPSA4OyAvLyBBIHByZWRpY3Rpb24gKD09IGEgc3VnZ2VzdGlvbiB3aXRoIG5vIGlucHV0KQogCisgICAgc3RhdGljIGNvbnN0IGludCBLSU5EX01BU0tfRkxBR1MgPSAweEZGRkZGRjAwOyAvLyBNYXNrIHRvIGdldCB0aGUgZmxhZ3MKKyAgICBzdGF0aWMgY29uc3QgaW50IEtJTkRfRkxBR19QT1NTSUJMWV9PRkZFTlNJVkUgPSAweDgwMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgS0lORF9GTEFHX0VYQUNUX01BVENIID0gMHg0MDAwMDAwMDsKKwogICAgIERpY3Rpb25hcnkodm9pZCAqZGljdCwgaW50IGRpY3RTaXplLCBpbnQgbW1hcEZkLCBpbnQgZGljdEJ1ZkFkanVzdCk7CiAKICAgICBpbnQgZ2V0U3VnZ2VzdGlvbnMoUHJveGltaXR5SW5mbyAqcHJveGltaXR5SW5mbywgdm9pZCAqdHJhdmVyc2VTZXNzaW9uLCBpbnQgKnhjb29yZGluYXRlcywKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL211bHRpX2JpZ3JhbV9tYXAuaCBiL25hdGl2ZS9qbmkvc3JjL211bHRpX2JpZ3JhbV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTFiNjMwCi0tLSAvZGV2L251bGwKKysrIGIvbmF0aXZlL2puaS9zcmMvbXVsdGlfYmlncmFtX21hcC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIExBVElOSU1FX01VTFRJX0JJR1JBTV9NQVBfSAorI2RlZmluZSBMQVRJTklNRV9NVUxUSV9CSUdSQU1fTUFQX0gKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJkZWZpbmVzLmgiCisjaW5jbHVkZSAiYmluYXJ5X2Zvcm1hdC5oIgorI2luY2x1ZGUgImhhc2hfbWFwX2NvbXBhdC5oIgorCituYW1lc3BhY2UgbGF0aW5pbWUgeworCisvLyBDbGFzcyBmb3IgY2FjaGluZyBiaWdyYW0gbWFwcyBmb3IgbXVsdGlwbGUgcHJldmlvdXMgd29yZCBjb250ZXh0cy4gVGhpcyBpcyB1c2VmdWwgc2luY2UgdGhlCisvLyBhbGdvcml0aG0gbmVlZHMgdG8gbG9vayB1cCB0aGUgc2V0IG9mIGJpZ3JhbXMgZm9yIGV2ZXJ5IHdvcmQgcGFpciB0aGF0IG9jY3VycyBpbiBldmVyeQorLy8gbXVsdGktd29yZCBzdWdnZXN0aW9uLgorY2xhc3MgTXVsdGlCaWdyYW1NYXAgeworIHB1YmxpYzoKKyAgICBNdWx0aUJpZ3JhbU1hcCgpIDogbUJpZ3JhbU1hcHMoKSB7fQorICAgIH5NdWx0aUJpZ3JhbU1hcCgpIHt9CisKKyAgICAvLyBMb29rIHVwIHRoZSBiaWdyYW0gcHJvYmFiaWxpdHkgZm9yIHRoZSBnaXZlbiB3b3JkIHBhaXIgZnJvbSB0aGUgY2FjaGVkIGJpZ3JhbSBtYXBzLgorICAgIC8vIEFsc28gY2FjaGVzIHRoZSBiaWdyYW1zIGlmIHRoZXJlIGlzIHNwYWNlIHJlbWFpbmluZyBhbmQgdGhleSBoYXZlIG5vdCBiZWVuIGNhY2hlZCBhbHJlYWR5LgorICAgIGludCBnZXRCaWdyYW1Qcm9iYWJpbGl0eShjb25zdCB1aW50OF90ICpjb25zdCBkaWNSb290LCBjb25zdCBpbnQgd29yZFBvc2l0aW9uLAorICAgICAgICAgICAgY29uc3QgaW50IG5leHRXb3JkUG9zaXRpb24sIGNvbnN0IGludCB1bmlncmFtUHJvYmFiaWxpdHkpIHsKKyAgICAgICAgaGFzaF9tYXBfY29tcGF0PGludCwgQmlncmFtTWFwPjo6Y29uc3RfaXRlcmF0b3IgbWFwUG9zaXRpb24gPQorICAgICAgICAgICAgICAgIG1CaWdyYW1NYXBzLmZpbmQod29yZFBvc2l0aW9uKTsKKyAgICAgICAgaWYgKG1hcFBvc2l0aW9uICE9IG1CaWdyYW1NYXBzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwUG9zaXRpb24tPnNlY29uZC5nZXRCaWdyYW1Qcm9iYWJpbGl0eShuZXh0V29yZFBvc2l0aW9uLCB1bmlncmFtUHJvYmFiaWxpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChtQmlncmFtTWFwcy5zaXplKCkgPCBNQVhfQ0FDSEVEX1BSRVZfV09SRFNfSU5fQklHUkFNX01BUCkgeworICAgICAgICAgICAgYWRkQmlncmFtc0ZvcldvcmRQb3NpdGlvbihkaWNSb290LCB3b3JkUG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG1CaWdyYW1NYXBzW3dvcmRQb3NpdGlvbl0uZ2V0QmlncmFtUHJvYmFiaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIG5leHRXb3JkUG9zaXRpb24sIHVuaWdyYW1Qcm9iYWJpbGl0eSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJpbmFyeUZvcm1hdDo6Z2V0QmlncmFtUHJvYmFiaWxpdHkoCisgICAgICAgICAgICAgICAgZGljUm9vdCwgd29yZFBvc2l0aW9uLCBuZXh0V29yZFBvc2l0aW9uLCB1bmlncmFtUHJvYmFiaWxpdHkpOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1CaWdyYW1NYXBzLmNsZWFyKCk7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTXVsdGlCaWdyYW1NYXApOworCisgICAgY2xhc3MgQmlncmFtTWFwIHsKKyAgICAgcHVibGljOgorICAgICAgICBCaWdyYW1NYXAoKSA6IG1CaWdyYW1NYXAoREVGQVVMVF9IQVNIX01BUF9TSVpFX0ZPUl9FQUNIX0JJR1JBTV9NQVApIHt9CisgICAgICAgIH5CaWdyYW1NYXAoKSB7fQorCisgICAgICAgIHZvaWQgaW5pdChjb25zdCB1aW50OF90ICpjb25zdCBkaWNSb290LCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIEJpbmFyeUZvcm1hdDo6ZmlsbEJpZ3JhbVByb2JhYmlsaXR5VG9IYXNoTWFwKGRpY1Jvb3QsIHBvc2l0aW9uLCAmbUJpZ3JhbU1hcCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgaW50IGdldEJpZ3JhbVByb2JhYmlsaXR5KGNvbnN0IGludCBuZXh0V29yZFBvc2l0aW9uLCBjb25zdCBpbnQgdW5pZ3JhbVByb2JhYmlsaXR5KQorICAgICAgICAgICAgICAgIGNvbnN0IHsKKyAgICAgICAgICAgcmV0dXJuIEJpbmFyeUZvcm1hdDo6Z2V0QmlncmFtUHJvYmFiaWxpdHlGcm9tSGFzaE1hcCgKKyAgICAgICAgICAgICAgICAgICBuZXh0V29yZFBvc2l0aW9uLCAmbUJpZ3JhbU1hcCwgdW5pZ3JhbVByb2JhYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgIHByaXZhdGU6CisgICAgICAgIC8vIE5vdGU6IERlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBuZWVkZWQgZm9yIHVzZSBpbiBoYXNoX21hcC4KKyAgICAgICAgaGFzaF9tYXBfY29tcGF0PGludCwgaW50PiBtQmlncmFtTWFwOworICAgIH07CisKKyAgICB2b2lkIGFkZEJpZ3JhbXNGb3JXb3JkUG9zaXRpb24oY29uc3QgdWludDhfdCAqY29uc3QgZGljUm9vdCwgY29uc3QgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1CaWdyYW1NYXBzW3Bvc2l0aW9uXS5pbml0KGRpY1Jvb3QsIHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBoYXNoX21hcF9jb21wYXQ8aW50LCBCaWdyYW1NYXA+IG1CaWdyYW1NYXBzOworfTsKK30gLy8gbmFtZXNwYWNlIGxhdGluaW1lCisjZW5kaWYgLy8gTEFUSU5JTUVfTVVMVElfQklHUkFNX01BUF9ICmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZS5oIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGUuaAppbmRleCAzMmZhYWU1Li40MjI1YmIzIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZS5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlLmgKQEAgLTIxMCw4ICsyMTAsNyBAQAogICAgIH0KIAogICAgIGJvb2wgaXNJbXBvc3NpYmxlQmlncmFtV29yZCgpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgaW50IHByb2JhYmlsaXR5ID0gbURpY05vZGVQcm9wZXJ0aWVzLmdldFByb2JhYmlsaXR5KCk7Ci0gICAgICAgIGlmIChwcm9iYWJpbGl0eSA9PSAwKSB7CisgICAgICAgIGlmIChtRGljTm9kZVByb3BlcnRpZXMuaGFzQmxhY2tsaXN0ZWRPck5vdEFXb3JkRmxhZygpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBpbnQgcHJldldvcmRMZW4gPSBtRGljTm9kZVN0YXRlLm1EaWNOb2RlU3RhdGVQcmV2V29yZC5nZXRQcmV2V29yZExlbmd0aCgpCkBAIC0yMjAsNyArMjE5LDcgQEAKICAgICAgICAgcmV0dXJuIChwcmV2V29yZExlbiA9PSAxICYmIGN1cnJlbnRXb3JkTGVuID09IDEpOwogICAgIH0KIAotICAgIGJvb2wgaXNDYXBpdGFsaXplZCgpIGNvbnN0IHsKKyAgICBib29sIGlzRmlyc3RDaGFyVXBwZXJjYXNlKCkgY29uc3QgewogICAgICAgICBjb25zdCBpbnQgYyA9IGdldE91dHB1dFdvcmRCdWYoKVswXTsKICAgICAgICAgcmV0dXJuIGlzQXNjaWlVcHBlcihjKTsKICAgICB9CkBAIC0zNjAsMTEgKzM1OSw2IEBACiAgICAgICAgIHJldHVybiBtRGljTm9kZVN0YXRlLm1EaWNOb2RlU3RhdGVTY29yaW5nLmdldENvbXBvdW5kRGlzdGFuY2UobGFuZ3VhZ2VXZWlnaHQpOwogICAgIH0KIAotICAgIC8vIE5vdGUgdGhhdCAiY29zdCIgbWVhbnMgZGVsdGEgZm9yICJkaXN0YW5jZSIgdGhhdCBpcyB3ZWlnaHRlZC4KLSAgICBmbG9hdCBnZXRUb3RhbFByZXZXb3Jkc0xhbmd1YWdlQ29zdCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EaWNOb2RlU3RhdGUubURpY05vZGVTdGF0ZVNjb3JpbmcuZ2V0VG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QoKTsKLSAgICB9Ci0KICAgICAvLyBVc2VkIHRvIGNvbW1pdCBpbnB1dCBwYXJ0aWFsbHkKICAgICBpbnQgZ2V0UHJldldvcmROb2RlUG9zKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURpY05vZGVTdGF0ZS5tRGljTm9kZVN0YXRlUHJldldvcmQuZ2V0UHJldldvcmROb2RlUG9zKCk7CkBAIC00NjksNiArNDYzLDEwIEBACiAgICAgICAgIG1EaWNOb2RlU3RhdGUubURpY05vZGVTdGF0ZVNjb3JpbmcuYWR2YW5jZURpZ3JhcGhJbmRleCgpOwogICAgIH0KIAorICAgIGJvb2wgaXNFeGFjdE1hdGNoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURpY05vZGVTdGF0ZS5tRGljTm9kZVN0YXRlU2NvcmluZy5pc0V4YWN0TWF0Y2goKTsKKyAgICB9CisKICAgICB1aW50OF90IGdldEZsYWdzKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURpY05vZGVQcm9wZXJ0aWVzLmdldEZsYWdzKCk7CiAgICAgfQpAQCAtNTQ4LDEzICs1NDYsMTIgQEAKICAgICAvLyBDYXZlYXQ6IE11c3Qgbm90IGJlIGNhbGxlZCBvdXRzaWRlIFdlaWdodGluZwogICAgIC8vIFRoaXMgcmVzdHJpY3Rpb24gaXMgZ3VhcmFudGVlZCBieSAiZnJpZW5kIgogICAgIEFLX0ZPUkNFX0lOTElORSB2b2lkIGFkZENvc3QoY29uc3QgZmxvYXQgc3BhdGlhbENvc3QsIGNvbnN0IGZsb2F0IGxhbmd1YWdlQ29zdCwKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgZG9Ob3JtYWxpemF0aW9uLCBjb25zdCBpbnQgaW5wdXRTaXplLCBjb25zdCBib29sIGlzRWRpdENvcnJlY3Rpb24sCi0gICAgICAgICAgICBjb25zdCBib29sIGlzUHJveGltaXR5Q29ycmVjdGlvbikgeworICAgICAgICAgICAgY29uc3QgYm9vbCBkb05vcm1hbGl6YXRpb24sIGNvbnN0IGludCBpbnB1dFNpemUsIGNvbnN0IEVycm9yVHlwZSBlcnJvclR5cGUpIHsKICAgICAgICAgaWYgKERFQlVHX0dFT19GVUxMKSB7CiAgICAgICAgICAgICBMT0dJX1NIT1dfQUREX0NPU1RfUFJPUDsKICAgICAgICAgfQogICAgICAgICBtRGljTm9kZVN0YXRlLm1EaWNOb2RlU3RhdGVTY29yaW5nLmFkZENvc3Qoc3BhdGlhbENvc3QsIGxhbmd1YWdlQ29zdCwgZG9Ob3JtYWxpemF0aW9uLAotICAgICAgICAgICAgICAgIGlucHV0U2l6ZSwgZ2V0VG90YWxJbnB1dEluZGV4KCksIGlzRWRpdENvcnJlY3Rpb24sIGlzUHJveGltaXR5Q29ycmVjdGlvbik7CisgICAgICAgICAgICAgICAgaW5wdXRTaXplLCBnZXRUb3RhbElucHV0SW5kZXgoKSwgZXJyb3JUeXBlKTsKICAgICB9CiAKICAgICAvLyBDYXZlYXQ6IE11c3Qgbm90IGJlIGNhbGxlZCBvdXRzaWRlIFdlaWdodGluZwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfcHJvcGVydGllcy5oIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfcHJvcGVydGllcy5oCmluZGV4IDE3M2VmMzUuLjYzYTZiMTMgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlX3Byb3BlcnRpZXMuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV9wcm9wZXJ0aWVzLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSAiYmluYXJ5X2Zvcm1hdC5oIgogI2luY2x1ZGUgImRlZmluZXMuaCIKIAogbmFtZXNwYWNlIGxhdGluaW1lIHsKQEAgLTE0NCw2ICsxNDUsMTAgQEAKICAgICAgICAgcmV0dXJuIG1DaGlsZHJlbkNvdW50ID4gMCB8fCBtRGVwdGggIT0gbUxlYXZpbmdEZXB0aDsKICAgICB9CiAKKyAgICBib29sIGhhc0JsYWNrbGlzdGVkT3JOb3RBV29yZEZsYWcoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlGb3JtYXQ6Omhhc0JsYWNrbGlzdGVkT3JOb3RBV29yZEZsYWcobUZsYWdzKTsKKyAgICB9CisKICBwcml2YXRlOgogICAgIC8vIENhdXRpb24hISEKICAgICAvLyBVc2UgYSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgYW5kIGFuIGFzc2lnbiBvcGVyYXRvciBiZWNhdXNlIHNoYWxsb3cgY29waWVzIGFyZSBvawpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfc3RhdGVfaW5wdXQuaCBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlX3N0YXRlX2lucHV0LmgKaW5kZXggN2FkM2UzZS4uYmJkOTQzNSAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfc3RhdGVfaW5wdXQuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV9zdGF0ZV9pbnB1dC5oCkBAIC00Niw4ICs0Niw4IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1BPSU5URVJfQ09VTlRfRzsgaSsrKSB7CiAgICAgICAgICAgICAgbUlucHV0SW5kZXhbaV0gPSBzcmMtPm1JbnB1dEluZGV4W2ldOwogICAgICAgICAgICAgIG1QcmV2Q29kZVBvaW50W2ldID0gc3JjLT5tUHJldkNvZGVQb2ludFtpXTsKLSAgICAgICAgbVRlcm1pbmFsRGlmZkNvc3RbaV0gPSByZXNldFRlcm1pbmFsRGlmZkNvc3QgPwotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihNQVhfVkFMVUVfRk9SX1dFSUdIVElORykgOiBzcmMtPm1UZXJtaW5hbERpZmZDb3N0W2ldOworICAgICAgICAgICAgIG1UZXJtaW5hbERpZmZDb3N0W2ldID0gcmVzZXRUZXJtaW5hbERpZmZDb3N0ID8KKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihNQVhfVkFMVUVfRk9SX1dFSUdIVElORykgOiBzcmMtPm1UZXJtaW5hbERpZmZDb3N0W2ldOwogICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfc3RhdGVfc2NvcmluZy5oIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfc3RhdGVfc2NvcmluZy5oCmluZGV4IDg5MDJkMzEuLmRjYTlkNjAgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlX3N0YXRlX3Njb3JpbmcuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV9zdGF0ZV9zY29yaW5nLmgKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAgICAgICAgICAgbURpZ3JhcGhJbmRleChEaWdyYXBoVXRpbHM6Ok5PVF9BX0RJR1JBUEhfSU5ERVgpLAogICAgICAgICAgICAgICBtRWRpdENvcnJlY3Rpb25Db3VudCgwKSwgbVByb3hpbWl0eUNvcnJlY3Rpb25Db3VudCgwKSwKICAgICAgICAgICAgICAgbU5vcm1hbGl6ZWRDb21wb3VuZERpc3RhbmNlKDAuMGYpLCBtU3BhdGlhbERpc3RhbmNlKDAuMGYpLCBtTGFuZ3VhZ2VEaXN0YW5jZSgwLjBmKSwKLSAgICAgICAgICAgICAgbVRvdGFsUHJldldvcmRzTGFuZ3VhZ2VDb3N0KDAuMGYpLCBtUmF3TGVuZ3RoKDAuMGYpIHsKKyAgICAgICAgICAgICAgbVJhd0xlbmd0aCgwLjBmKSwgbUV4YWN0TWF0Y2godHJ1ZSkgewogICAgIH0KIAogICAgIHZpcnR1YWwgfkRpY05vZGVTdGF0ZVNjb3JpbmcoKSB7fQpAQCAtNDIsMTAgKzQyLDEwIEBACiAgICAgICAgIG1Ob3JtYWxpemVkQ29tcG91bmREaXN0YW5jZSA9IDAuMGY7CiAgICAgICAgIG1TcGF0aWFsRGlzdGFuY2UgPSAwLjBmOwogICAgICAgICBtTGFuZ3VhZ2VEaXN0YW5jZSA9IDAuMGY7Ci0gICAgICAgIG1Ub3RhbFByZXZXb3Jkc0xhbmd1YWdlQ29zdCA9IDAuMGY7CiAgICAgICAgIG1SYXdMZW5ndGggPSAwLjBmOwogICAgICAgICBtRG91YmxlTGV0dGVyTGV2ZWwgPSBOT1RfQV9ET1VCTEVfTEVUVEVSOwogICAgICAgICBtRGlncmFwaEluZGV4ID0gRGlncmFwaFV0aWxzOjpOT1RfQV9ESUdSQVBIX0lOREVYOworICAgICAgICBtRXhhY3RNYXRjaCA9IHRydWU7CiAgICAgfQogCiAgICAgQUtfRk9SQ0VfSU5MSU5FIHZvaWQgaW5pdChjb25zdCBEaWNOb2RlU3RhdGVTY29yaW5nICpjb25zdCBzY29yaW5nKSB7CkBAIC01NCwyNCArNTQsMzUgQEAKICAgICAgICAgbU5vcm1hbGl6ZWRDb21wb3VuZERpc3RhbmNlID0gc2NvcmluZy0+bU5vcm1hbGl6ZWRDb21wb3VuZERpc3RhbmNlOwogICAgICAgICBtU3BhdGlhbERpc3RhbmNlID0gc2NvcmluZy0+bVNwYXRpYWxEaXN0YW5jZTsKICAgICAgICAgbUxhbmd1YWdlRGlzdGFuY2UgPSBzY29yaW5nLT5tTGFuZ3VhZ2VEaXN0YW5jZTsKLSAgICAgICAgbVRvdGFsUHJldldvcmRzTGFuZ3VhZ2VDb3N0ID0gc2NvcmluZy0+bVRvdGFsUHJldldvcmRzTGFuZ3VhZ2VDb3N0OwogICAgICAgICBtUmF3TGVuZ3RoID0gc2NvcmluZy0+bVJhd0xlbmd0aDsKICAgICAgICAgbURvdWJsZUxldHRlckxldmVsID0gc2NvcmluZy0+bURvdWJsZUxldHRlckxldmVsOwogICAgICAgICBtRGlncmFwaEluZGV4ID0gc2NvcmluZy0+bURpZ3JhcGhJbmRleDsKKyAgICAgICAgbUV4YWN0TWF0Y2ggPSBzY29yaW5nLT5tRXhhY3RNYXRjaDsKICAgICB9CiAKICAgICB2b2lkIGFkZENvc3QoY29uc3QgZmxvYXQgc3BhdGlhbENvc3QsIGNvbnN0IGZsb2F0IGxhbmd1YWdlQ29zdCwgY29uc3QgYm9vbCBkb05vcm1hbGl6YXRpb24sCi0gICAgICAgICAgICBjb25zdCBpbnQgaW5wdXRTaXplLCBjb25zdCBpbnQgdG90YWxJbnB1dEluZGV4LCBjb25zdCBib29sIGlzRWRpdENvcnJlY3Rpb24sCi0gICAgICAgICAgICBjb25zdCBib29sIGlzUHJveGltaXR5Q29ycmVjdGlvbikgeworICAgICAgICAgICAgY29uc3QgaW50IGlucHV0U2l6ZSwgY29uc3QgaW50IHRvdGFsSW5wdXRJbmRleCwgY29uc3QgRXJyb3JUeXBlIGVycm9yVHlwZSkgewogICAgICAgICBhZGREaXN0YW5jZShzcGF0aWFsQ29zdCwgbGFuZ3VhZ2VDb3N0LCBkb05vcm1hbGl6YXRpb24sIGlucHV0U2l6ZSwgdG90YWxJbnB1dEluZGV4KTsKLSAgICAgICAgaWYgKGlzRWRpdENvcnJlY3Rpb24pIHsKLSAgICAgICAgICAgICsrbUVkaXRDb3JyZWN0aW9uQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUHJveGltaXR5Q29ycmVjdGlvbikgewotICAgICAgICAgICAgKyttUHJveGltaXR5Q29ycmVjdGlvbkNvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYW5ndWFnZUNvc3QgPiAwLjBmKSB7Ci0gICAgICAgICAgICBzZXRUb3RhbFByZXZXb3Jkc0xhbmd1YWdlQ29zdChtVG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QgKyBsYW5ndWFnZUNvc3QpOworICAgICAgICBzd2l0Y2ggKGVycm9yVHlwZSkgeworICAgICAgICAgICAgY2FzZSBFVF9FRElUX0NPUlJFQ1RJT046CisgICAgICAgICAgICAgICAgKyttRWRpdENvcnJlY3Rpb25Db3VudDsKKyAgICAgICAgICAgICAgICBtRXhhY3RNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVF9QUk9YSU1JVFlfQ09SUkVDVElPTjoKKyAgICAgICAgICAgICAgICArK21Qcm94aW1pdHlDb3JyZWN0aW9uQ291bnQ7CisgICAgICAgICAgICAgICAgbUV4YWN0TWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVRfQ09NUExFVElPTjoKKyAgICAgICAgICAgICAgICBtRXhhY3RNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVF9ORVdfV09SRDoKKyAgICAgICAgICAgICAgICBtRXhhY3RNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVF9JTlRFTlRJT05BTF9PTUlTU0lPTjoKKyAgICAgICAgICAgICAgICBtRXhhY3RNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVF9OT1RfQU5fRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0OCw4ICsxNTksOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZmxvYXQgZ2V0VG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3Q7CisgICAgYm9vbCBpc0V4YWN0TWF0Y2goKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRXhhY3RNYXRjaDsKICAgICB9CiAKICBwcml2YXRlOgpAQCAtMTY1LDggKzE3Niw4IEBACiAgICAgZmxvYXQgbU5vcm1hbGl6ZWRDb21wb3VuZERpc3RhbmNlOwogICAgIGZsb2F0IG1TcGF0aWFsRGlzdGFuY2U7CiAgICAgZmxvYXQgbUxhbmd1YWdlRGlzdGFuY2U7Ci0gICAgZmxvYXQgbVRvdGFsUHJldldvcmRzTGFuZ3VhZ2VDb3N0OwogICAgIGZsb2F0IG1SYXdMZW5ndGg7CisgICAgYm9vbCBtRXhhY3RNYXRjaDsKIAogICAgIEFLX0ZPUkNFX0lOTElORSB2b2lkIGFkZERpc3RhbmNlKGZsb2F0IHNwYXRpYWxEaXN0YW5jZSwgZmxvYXQgbGFuZ3VhZ2VEaXN0YW5jZSwKICAgICAgICAgICAgIGJvb2wgZG9Ob3JtYWxpemF0aW9uLCBpbnQgaW5wdXRTaXplLCBpbnQgdG90YWxJbnB1dEluZGV4KSB7CkBAIC0xNzksMTEgKzE5MCw2IEBACiAgICAgICAgICAgICAgICAgICAgIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1heCgxLCB0b3RhbElucHV0SW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8vVE9ETzogcmVtb3ZlCi0gICAgQUtfRk9SQ0VfSU5MSU5FIHZvaWQgc2V0VG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QoZmxvYXQgdG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QpIHsKLSAgICAgICAgbVRvdGFsUHJldldvcmRzTGFuZ3VhZ2VDb3N0ID0gdG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3Q7Ci0gICAgfQogfTsKIH0gLy8gbmFtZXNwYWNlIGxhdGluaW1lCiAjZW5kaWYgLy8gTEFUSU5JTUVfRElDX05PREVfU1RBVEVfU0NPUklOR19ICmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV91dGlscy5jcHAgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV91dGlscy5jcHAKaW5kZXggMDMxZTcwNi4uNTM1N2MzNyAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfdXRpbHMuY3BwCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlX3V0aWxzLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImRpY19ub2RlLmgiCiAjaW5jbHVkZSAiZGljX25vZGVfdXRpbHMuaCIKICNpbmNsdWRlICJkaWNfbm9kZV92ZWN0b3IuaCIKKyNpbmNsdWRlICJtdWx0aV9iaWdyYW1fbWFwLmgiCiAjaW5jbHVkZSAicHJveGltaXR5X2luZm8uaCIKICNpbmNsdWRlICJwcm94aW1pdHlfaW5mb19zdGF0ZS5oIgogCkBAIC0xOTEsMTEgKzE5MiwxMSBAQAogICogQ29tcHV0ZXMgdGhlIGNvbWJpbmVkIGJpZ3JhbSAvIHVuaWdyYW0gY29zdCBmb3IgdGhlIGdpdmVuIGRpY05vZGUuCiAgKi8KIC8qIHN0YXRpYyAqLyBmbG9hdCBEaWNOb2RlVXRpbHM6OmdldEJpZ3JhbU5vZGVJbXByb2JhYmlsaXR5KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY1Jvb3QsCi0gICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IG5vZGUsIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+ICpiaWdyYW1DYWNoZU1hcCkgeworICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBub2RlLCBNdWx0aUJpZ3JhbU1hcCAqbXVsdGlCaWdyYW1NYXApIHsKICAgICBpZiAobm9kZS0+aXNJbXBvc3NpYmxlQmlncmFtV29yZCgpKSB7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4oTUFYX1ZBTFVFX0ZPUl9XRUlHSFRJTkcpOwogICAgIH0KLSAgICBjb25zdCBpbnQgcHJvYmFiaWxpdHkgPSBnZXRCaWdyYW1Ob2RlUHJvYmFiaWxpdHkoZGljUm9vdCwgbm9kZSwgYmlncmFtQ2FjaGVNYXApOworICAgIGNvbnN0IGludCBwcm9iYWJpbGl0eSA9IGdldEJpZ3JhbU5vZGVQcm9iYWJpbGl0eShkaWNSb290LCBub2RlLCBtdWx0aUJpZ3JhbU1hcCk7CiAgICAgLy8gVE9ETzogVGhpcyBlcXVhdGlvbiB0byBjYWxjdWxhdGUgdGhlIGltcHJvYmFiaWxpdHkgbG9va3MgdW5yZWFzb25hYmxlLiAgSW52ZXN0aWdhdGUgdGhpcy4KICAgICBjb25zdCBmbG9hdCBjb3N0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1BWF9QUk9CQUJJTElUWSAtIHByb2JhYmlsaXR5KQogICAgICAgICAgICAgLyBzdGF0aWNfY2FzdDxmbG9hdD4oTUFYX1BST0JBQklMSVRZKTsKQEAgLTIwMyw5MiArMjA0LDI1IEBACiB9CiAKIC8qIHN0YXRpYyAqLyBpbnQgRGljTm9kZVV0aWxzOjpnZXRCaWdyYW1Ob2RlUHJvYmFiaWxpdHkoY29uc3QgdWludDhfdCAqY29uc3QgZGljUm9vdCwKLSAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3Qgbm9kZSwgaGFzaF9tYXBfY29tcGF0PGludCwgaW50MTZfdD4gKmJpZ3JhbUNhY2hlTWFwKSB7CisgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IG5vZGUsIE11bHRpQmlncmFtTWFwICptdWx0aUJpZ3JhbU1hcCkgewogICAgIGNvbnN0IGludCB1bmlncmFtUHJvYmFiaWxpdHkgPSBub2RlLT5nZXRQcm9iYWJpbGl0eSgpOwotICAgIGNvbnN0IGludCBlbmNvZGVkRGlmZk9mQmlncmFtUHJvYmFiaWxpdHkgPQotICAgICAgICAgICAgZ2V0QmlncmFtTm9kZUVuY29kZWREaWZmUHJvYmFiaWxpdHkoZGljUm9vdCwgbm9kZSwgYmlncmFtQ2FjaGVNYXApOwotICAgIGlmIChOT1RfQV9QUk9CQUJJTElUWSA9PSBlbmNvZGVkRGlmZk9mQmlncmFtUHJvYmFiaWxpdHkpIHsKKyAgICBjb25zdCBpbnQgd29yZFBvcyA9IG5vZGUtPmdldFBvcygpOworICAgIGNvbnN0IGludCBwcmV2V29yZFBvcyA9IG5vZGUtPmdldFByZXZXb3JkUG9zKCk7CisgICAgaWYgKE5PVF9WQUxJRF9XT1JEID09IHdvcmRQb3MgfHwgTk9UX1ZBTElEX1dPUkQgPT0gcHJldldvcmRQb3MpIHsKKyAgICAgICAgLy8gTm90ZTogTm9ybWFsbHkgd29yZFBvcyBjb21lcyBmcm9tIHRoZSBkaWN0aW9uYXJ5IGFuZCBzaG91bGQgbmV2ZXIgZXF1YWwgTk9UX1ZBTElEX1dPUkQuCiAgICAgICAgIHJldHVybiBiYWNrb2ZmKHVuaWdyYW1Qcm9iYWJpbGl0eSk7CiAgICAgfQotICAgIHJldHVybiBCaW5hcnlGb3JtYXQ6OmNvbXB1dGVQcm9iYWJpbGl0eUZvckJpZ3JhbSgKLSAgICAgICAgICAgIHVuaWdyYW1Qcm9iYWJpbGl0eSwgZW5jb2RlZERpZmZPZkJpZ3JhbVByb2JhYmlsaXR5KTsKKyAgICBpZiAobXVsdGlCaWdyYW1NYXApIHsKKyAgICAgICAgcmV0dXJuIG11bHRpQmlncmFtTWFwLT5nZXRCaWdyYW1Qcm9iYWJpbGl0eSgKKyAgICAgICAgICAgICAgICBkaWNSb290LCBwcmV2V29yZFBvcywgd29yZFBvcywgdW5pZ3JhbVByb2JhYmlsaXR5KTsKKyAgICB9CisgICAgcmV0dXJuIEJpbmFyeUZvcm1hdDo6Z2V0QmlncmFtUHJvYmFiaWxpdHkoZGljUm9vdCwgcHJldldvcmRQb3MsIHdvcmRQb3MsIHVuaWdyYW1Qcm9iYWJpbGl0eSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQmlncmFtIC8gVW5pZ3JhbSBkaWN0aW9uYXJ5IHV0aWxzIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotLyogc3RhdGljICovIGludDE2X3QgRGljTm9kZVV0aWxzOjpnZXRCaWdyYW1Ob2RlRW5jb2RlZERpZmZQcm9iYWJpbGl0eShjb25zdCB1aW50OF90ICpjb25zdCBkaWNSb290LAotICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBub2RlLCBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQxNl90PiAqYmlncmFtQ2FjaGVNYXApIHsKLSAgICBjb25zdCBpbnQgd29yZFBvcyA9IG5vZGUtPmdldFBvcygpOwotICAgIGNvbnN0IGludCBwcmV2V29yZFBvcyA9IG5vZGUtPmdldFByZXZXb3JkUG9zKCk7Ci0gICAgcmV0dXJuIGdldEJpZ3JhbVByb2JhYmlsaXR5KGRpY1Jvb3QsIHByZXZXb3JkUG9zLCB3b3JkUG9zLCBiaWdyYW1DYWNoZU1hcCk7Ci19Ci0KLS8vIFRPRE86IE1vdmUgdGhpcyB0byBCaWdyYW1EaWN0aW9uYXJ5Ci0vKiBzdGF0aWMgKi8gaW50MTZfdCBEaWNOb2RlVXRpbHM6OmdldEJpZ3JhbVByb2JhYmlsaXR5KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY1Jvb3QsIGludCBwb3MsCi0gICAgICAgIGNvbnN0IGludCBuZXh0UG9zLCBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQxNl90PiAqYmlncmFtQ2FjaGVNYXApIHsKLSAgICAvLyBUT0RPOiB0aGlzIGlzIHBhaW5mdWxseSBzbG93IGNvbXBhcmVkIHRvIHRoZSBtZXRob2QgdXNlZCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUKLSAgICAvLyBhbGdvcml0aG0uIFN3aXRjaCB0byB0aGF0IG1ldGhvZC4KLSAgICBpZiAoTk9UX1ZBTElEX1dPUkQgPT0gcG9zKSByZXR1cm4gTk9UX0FfUFJPQkFCSUxJVFk7Ci0gICAgaWYgKE5PVF9WQUxJRF9XT1JEID09IG5leHRQb3MpIHJldHVybiBOT1RfQV9QUk9CQUJJTElUWTsKLQotICAgIC8vIENyZWF0ZSBhIGhhc2ggY29kZSBmb3IgdGhlIGdpdmVuIG5vZGUgcGFpciAoYmFzZWQgb24gSm9zaCBCbG9jaCdzIGVmZmVjdGl2ZSBKYXZhKS4KLSAgICAvLyBUT0RPOiBVc2UgYSByZWFsIGhhc2ggbWFwIGRhdGEgc3RydWN0dXJlIHRoYXQgZGVhbHMgd2l0aCBjb2xsaXNpb25zLgotICAgIGludCBoYXNoID0gMTc7Ci0gICAgaGFzaCA9IGhhc2ggKiAzMSArIHBvczsKLSAgICBoYXNoID0gaGFzaCAqIDMxICsgbmV4dFBvczsKLQotICAgIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+Ojpjb25zdF9pdGVyYXRvciBtYXBQb3MgPSBiaWdyYW1DYWNoZU1hcC0+ZmluZChoYXNoKTsKLSAgICBpZiAobWFwUG9zICE9IGJpZ3JhbUNhY2hlTWFwLT5lbmQoKSkgewotICAgICAgICByZXR1cm4gbWFwUG9zLT5zZWNvbmQ7Ci0gICAgfQotICAgIGlmIChOT1RfVkFMSURfV09SRCA9PSBwb3MpIHsKLSAgICAgICAgcmV0dXJuIE5PVF9BX1BST0JBQklMSVRZOwotICAgIH0KLSAgICBjb25zdCB1aW50OF90IGZsYWdzID0gQmluYXJ5Rm9ybWF0OjpnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKGRpY1Jvb3QsICZwb3MpOwotICAgIGlmICgwID09IChmbGFncyAmIEJpbmFyeUZvcm1hdDo6RkxBR19IQVNfQklHUkFNUykpIHsKLSAgICAgICAgcmV0dXJuIE5PVF9BX1BST0JBQklMSVRZOwotICAgIH0KLSAgICBpZiAoMCA9PSAoZmxhZ3MgJiBCaW5hcnlGb3JtYXQ6OkZMQUdfSEFTX01VTFRJUExFX0NIQVJTKSkgewotICAgICAgICBCaW5hcnlGb3JtYXQ6OmdldENvZGVQb2ludEFuZEZvcndhcmRQb2ludGVyKGRpY1Jvb3QsICZwb3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcE90aGVyQ2hhcmFjdGVycyhkaWNSb290LCBwb3MpOwotICAgIH0KLSAgICBwb3MgPSBCaW5hcnlGb3JtYXQ6OnNraXBDaGlsZHJlblBvc2l0aW9uKGZsYWdzLCBwb3MpOwotICAgIHBvcyA9IEJpbmFyeUZvcm1hdDo6c2tpcFByb2JhYmlsaXR5KGZsYWdzLCBwb3MpOwotICAgIHVpbnQ4X3QgYmlncmFtRmxhZ3M7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGJpZ3JhbUZsYWdzID0gQmluYXJ5Rm9ybWF0OjpnZXRGbGFnc0FuZEZvcndhcmRQb2ludGVyKGRpY1Jvb3QsICZwb3MpOwotICAgICAgICBjb25zdCBpbnQgYmlncmFtUG9zID0gQmluYXJ5Rm9ybWF0OjpnZXRBdHRyaWJ1dGVBZGRyZXNzQW5kRm9yd2FyZFBvaW50ZXIoZGljUm9vdCwKLSAgICAgICAgICAgICAgICBiaWdyYW1GbGFncywgJnBvcyk7Ci0gICAgICAgIGlmIChiaWdyYW1Qb3MgPT0gbmV4dFBvcykgewotICAgICAgICAgICAgY29uc3QgaW50MTZfdCBwcm9iYWJpbGl0eSA9IEJpbmFyeUZvcm1hdDo6TUFTS19BVFRSSUJVVEVfUFJPQkFCSUxJVFkgJiBiaWdyYW1GbGFnczsKLSAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KGJpZ3JhbUNhY2hlTWFwLT5zaXplKCkpIDwgTUFYX0JJR1JBTV9NQVBfU0laRSkgewotICAgICAgICAgICAgICAgICgqYmlncmFtQ2FjaGVNYXApW2hhc2hdID0gcHJvYmFiaWxpdHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvYmFiaWxpdHk7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQrKzsKLSAgICB9IHdoaWxlICgoMCAhPSAoQmluYXJ5Rm9ybWF0OjpGTEFHX0FUVFJJQlVURV9IQVNfTkVYVCAmIGJpZ3JhbUZsYWdzKSkKLSAgICAgICAgICAgICYmIGNvdW50IDwgTUFYX0JJR1JBTVNfQ09OU0lERVJFRF9QRVJfQ09OVEVYVCk7Ci0gICAgaWYgKHN0YXRpY19jYXN0PGludD4oYmlncmFtQ2FjaGVNYXAtPnNpemUoKSkgPCBNQVhfQklHUkFNX01BUF9TSVpFKSB7Ci0gICAgICAgIC8vIFRPRE86IGRvZXMgdGhpcyAtMSBtZWFuIE5PVF9WQUxJRF9XT1JEPwotICAgICAgICAoKmJpZ3JhbUNhY2hlTWFwKVtoYXNoXSA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gTk9UX0FfUFJPQkFCSUxJVFk7Ci19Ci0KLS8qIHN0YXRpYyAqLyBpbnQgRGljTm9kZVV0aWxzOjpnZXRXb3JkUG9zKGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY1Jvb3QsIGNvbnN0IGludCAqd29yZCwKLSAgICAgICAgY29uc3QgaW50IHdvcmRMZW5ndGgpIHsKLSAgICBpZiAoIXdvcmQpIHsKLSAgICAgICAgcmV0dXJuIE5PVF9WQUxJRF9XT1JEOwotICAgIH0KLSAgICByZXR1cm4gQmluYXJ5Rm9ybWF0OjpnZXRUZXJtaW5hbFBvc2l0aW9uKAotICAgICAgICAgICAgZGljUm9vdCwgd29yZCwgd29yZExlbmd0aCwgZmFsc2UgLyogZm9yY2VMb3dlckNhc2VTZWFyY2ggKi8pOwotfQotCiAvKiBzdGF0aWMgKi8gYm9vbCBEaWNOb2RlVXRpbHM6OmlzTWF0Y2hlZE5vZGVDb2RlUG9pbnQoY29uc3QgUHJveGltaXR5SW5mb1N0YXRlICpwSW5mb1N0YXRlLAogICAgICAgICBjb25zdCBpbnQgcG9pbnRJbmRleCwgY29uc3QgYm9vbCBleGFjdE9ubHksIGNvbnN0IGludCBub2RlQ29kZVBvaW50KSB7CiAgICAgaWYgKCFwSW5mb1N0YXRlKSB7CmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV91dGlscy5oIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfdXRpbHMuaAppbmRleCAxNWY5NzMwLi41YmM1NDJkIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZV91dGlscy5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlX3V0aWxzLmgKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJkZWZpbmVzLmgiCi0jaW5jbHVkZSAiaGFzaF9tYXBfY29tcGF0LmgiCiAKIG5hbWVzcGFjZSBsYXRpbmltZSB7CiAKQEAgLTI5LDYgKzI4LDcgQEAKIGNsYXNzIERpY05vZGVWZWN0b3I7CiBjbGFzcyBQcm94aW1pdHlJbmZvOwogY2xhc3MgUHJveGltaXR5SW5mb1N0YXRlOworY2xhc3MgTXVsdGlCaWdyYW1NYXA7CiAKIGNsYXNzIERpY05vZGVVdGlscyB7CiAgcHVibGljOgpAQCAtNDEsOSArNDEsOCBAQAogICAgIHN0YXRpYyB2b2lkIGluaXRCeUNvcHkoRGljTm9kZSAqc3JjTm9kZSwgRGljTm9kZSAqZGVzdE5vZGUpOwogICAgIHN0YXRpYyB2b2lkIGdldEFsbENoaWxkRGljTm9kZXMoRGljTm9kZSAqZGljTm9kZSwgY29uc3QgdWludDhfdCAqY29uc3QgZGljUm9vdCwKICAgICAgICAgICAgIERpY05vZGVWZWN0b3IgKmNoaWxkRGljTm9kZXMpOwotICAgIHN0YXRpYyBpbnQgZ2V0V29yZFBvcyhjb25zdCB1aW50OF90ICpjb25zdCBkaWNSb290LCBjb25zdCBpbnQgKndvcmQsIGNvbnN0IGludCBwcmV2V29yZExlbmd0aCk7CiAgICAgc3RhdGljIGZsb2F0IGdldEJpZ3JhbU5vZGVJbXByb2JhYmlsaXR5KGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRpY1Jvb3QsCi0gICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBub2RlLCBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQxNl90PiAqY29uc3QgYmlncmFtQ2FjaGVNYXApOworICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3Qgbm9kZSwgTXVsdGlCaWdyYW1NYXAgKmNvbnN0IG11bHRpQmlncmFtTWFwKTsKICAgICBzdGF0aWMgYm9vbCBpc0RpY05vZGVGaWx0ZXJlZE91dChjb25zdCBpbnQgbm9kZUNvZGVQb2ludCwgY29uc3QgUHJveGltaXR5SW5mbyAqY29uc3QgcEluZm8sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+ICpjb25zdCBjb2RlUG9pbnRzRmlsdGVyKTsKICAgICAvLyBUT0RPOiBNb3ZlIHRvIHByaXZhdGUKQEAgLTU4LDE1ICs1NywxMSBAQAogCiAgcHJpdmF0ZToKICAgICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoRGljTm9kZVV0aWxzKTsKLSAgICAvLyBNYXggY2FjaGUgc2l6ZSBmb3IgdGhlIHNwYWNlIG9taXNzaW9uIGVycm9yIGNvcnJlY3Rpb24gYmlncmFtIGxvb2t1cAotICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0JJR1JBTV9NQVBfU0laRSA9IDIwMDAwOwogICAgIC8vIE1heCBudW1iZXIgb2YgYmlncmFtcyB0byBsb29rIHVwCiAgICAgc3RhdGljIGNvbnN0IGludCBNQVhfQklHUkFNU19DT05TSURFUkVEX1BFUl9DT05URVhUID0gNTAwOwogCiAgICAgc3RhdGljIGludCBnZXRCaWdyYW1Ob2RlUHJvYmFiaWxpdHkoY29uc3QgdWludDhfdCAqY29uc3QgZGljUm9vdCwgY29uc3QgRGljTm9kZSAqY29uc3Qgbm9kZSwKLSAgICAgICAgICAgIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+ICpiaWdyYW1DYWNoZU1hcCk7Ci0gICAgc3RhdGljIGludDE2X3QgZ2V0QmlncmFtTm9kZUVuY29kZWREaWZmUHJvYmFiaWxpdHkoY29uc3QgdWludDhfdCAqY29uc3QgZGljUm9vdCwKLSAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IG5vZGUsIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+ICpiaWdyYW1DYWNoZU1hcCk7CisgICAgICAgICAgICBNdWx0aUJpZ3JhbU1hcCAqbXVsdGlCaWdyYW1NYXApOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUFuZEdldFBhc3NpbmdDaGlsZE5vZGUoRGljTm9kZSAqZGljTm9kZSwgY29uc3QgUHJveGltaXR5SW5mb1N0YXRlICpwSW5mb1N0YXRlLAogICAgICAgICAgICAgY29uc3QgaW50IHBvaW50SW5kZXgsIGNvbnN0IGJvb2wgZXhhY3RPbmx5LCBEaWNOb2RlVmVjdG9yICpjaGlsZERpY05vZGVzKTsKICAgICBzdGF0aWMgdm9pZCBjcmVhdGVBbmRHZXRBbGxMZWF2aW5nQ2hpbGROb2RlcyhEaWNOb2RlICpkaWNOb2RlLCBjb25zdCB1aW50OF90ICpjb25zdCBkaWNSb290LApAQCAtNzcsOCArNzIsNiBAQAogICAgICAgICAgICAgY29uc3QgaW50IHRlcm1pbmFsRGVwdGgsIGNvbnN0IFByb3hpbWl0eUluZm9TdGF0ZSAqcEluZm9TdGF0ZSwgY29uc3QgaW50IHBvaW50SW5kZXgsCiAgICAgICAgICAgICBjb25zdCBib29sIGV4YWN0T25seSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiAqY29uc3QgY29kZVBvaW50c0ZpbHRlciwKICAgICAgICAgICAgIGNvbnN0IFByb3hpbWl0eUluZm8gKmNvbnN0IHBJbmZvLCBEaWNOb2RlVmVjdG9yICpjaGlsZERpY05vZGVzKTsKLSAgICBzdGF0aWMgaW50MTZfdCBnZXRCaWdyYW1Qcm9iYWJpbGl0eShjb25zdCB1aW50OF90ICpjb25zdCBkaWNSb290LCBpbnQgcG9zLCBjb25zdCBpbnQgbmV4dFBvcywKLSAgICAgICAgICAgIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+ICpiaWdyYW1DYWNoZU1hcCk7CiAKICAgICAvLyBUT0RPOiBNb3ZlIHRvIHByb3hpbWl0eSBpbmZvCiAgICAgc3RhdGljIGJvb2wgaXNNYXRjaGVkTm9kZUNvZGVQb2ludChjb25zdCBQcm94aW1pdHlJbmZvU3RhdGUgKnBJbmZvU3RhdGUsIGNvbnN0IGludCBwb2ludEluZGV4LApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3BvbGljeS9zY29yaW5nLmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3Njb3JpbmcuaAppbmRleCBiOGMxMGUyLi4xMDJlODU2IDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3Njb3JpbmcuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3Njb3JpbmcuaApAQCAtMjksMTYgKzI5LDE0IEBACiAgcHVibGljOgogICAgIHZpcnR1YWwgaW50IGNhbGN1bGF0ZUZpbmFsU2NvcmUoY29uc3QgZmxvYXQgY29tcG91bmREaXN0YW5jZSwgY29uc3QgaW50IGlucHV0U2l6ZSwKICAgICAgICAgICAgIGNvbnN0IGJvb2wgZm9yY2VDb21taXQpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgZ2V0TW9zdFByb2JhYmxlU3RyaW5nKAotICAgICAgICAgICAgY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sIGNvbnN0IGludCB0ZXJtaW5hbFNpemUsCi0gICAgICAgICAgICBjb25zdCBmbG9hdCBsYW5ndWFnZVdlaWdodCwgaW50ICpjb25zdCBvdXRwdXRDb2RlUG9pbnRzLCBpbnQgKmNvbnN0IHR5cGUsCi0gICAgICAgICAgICBpbnQgKmNvbnN0IGZyZXEpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0TW9zdFByb2JhYmxlU3RyaW5nKGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAorICAgICAgICAgICAgY29uc3QgaW50IHRlcm1pbmFsU2l6ZSwgY29uc3QgZmxvYXQgbGFuZ3VhZ2VXZWlnaHQsIGludCAqY29uc3Qgb3V0cHV0Q29kZVBvaW50cywKKyAgICAgICAgICAgIGludCAqY29uc3QgdHlwZSwgaW50ICpjb25zdCBmcmVxKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNhZmV0eU5ldEZvck1vc3RQcm9iYWJsZVN0cmluZyhjb25zdCBpbnQgdGVybWluYWxTaXplLAogICAgICAgICAgICAgY29uc3QgaW50IG1heFNjb3JlLCBpbnQgKmNvbnN0IG91dHB1dENvZGVQb2ludHMsIGludCAqY29uc3QgZnJlcXVlbmNpZXMpIGNvbnN0ID0gMDsKICAgICAvLyBUT0RPOiBNYWtlIG1vcmUgZ2VuZXJpYwotICAgIHZpcnR1YWwgdm9pZCBzZWFyY2hXb3JkV2l0aERvdWJsZUxldHRlcihEaWNOb2RlICp0ZXJtaW5hbHMsCi0gICAgICAgICAgICBjb25zdCBpbnQgdGVybWluYWxTaXplLCBpbnQgKmRvdWJsZUxldHRlclRlcm1pbmFsSW5kZXgsCi0gICAgICAgICAgICBEb3VibGVMZXR0ZXJMZXZlbCAqZG91YmxlTGV0dGVyTGV2ZWwpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VhcmNoV29yZFdpdGhEb3VibGVMZXR0ZXIoRGljTm9kZSAqdGVybWluYWxzLCBjb25zdCBpbnQgdGVybWluYWxTaXplLAorICAgICAgICAgICAgaW50ICpkb3VibGVMZXR0ZXJUZXJtaW5hbEluZGV4LCBEb3VibGVMZXR0ZXJMZXZlbCAqZG91YmxlTGV0dGVyTGV2ZWwpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGZsb2F0IGdldEFkanVzdGVkTGFuZ3VhZ2VXZWlnaHQoRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCiAgICAgICAgICAgICBEaWNOb2RlICpjb25zdCB0ZXJtaW5hbHMsIGNvbnN0IGludCBzaXplKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBmbG9hdCBnZXREb3VibGVMZXR0ZXJEZW1vdGlvbkRpc3RhbmNlQ29zdChjb25zdCBpbnQgdGVybWluYWxJbmRleCwKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9wb2xpY3kvc3VnZ2VzdF9wb2xpY3kuaCBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9wb2xpY3kvc3VnZ2VzdF9wb2xpY3kuaAppbmRleCA4ODVlMjE0Li41YjY0MDJjIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3N1Z2dlc3RfcG9saWN5LmgKKysrIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3BvbGljeS9zdWdnZXN0X3BvbGljeS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAiZGVmaW5lcy5oIgogCiBuYW1lc3BhY2UgbGF0aW5pbWUgeworCiBjbGFzcyBUcmF2ZXJzYWw7CiBjbGFzcyBTY29yaW5nOwogY2xhc3MgV2VpZ2h0aW5nOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3BvbGljeS90cmF2ZXJzYWwuaCBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9wb2xpY3kvdHJhdmVyc2FsLmgKaW5kZXggMDJjMzU4YS4uYzZmNjZmMiAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3BvbGljeS90cmF2ZXJzYWwuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3RyYXZlcnNhbC5oCkBAIC0yOCw3ICsyOCw4IEBACiAgICAgdmlydHVhbCBpbnQgZ2V0TWF4UG9pbnRlckNvdW50KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBhbGxvd3NFcnJvckNvcnJlY3Rpb25zKGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNPbWlzc2lvbihjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUsIGNvbnN0IERpY05vZGUgKmNvbnN0IGNoaWxkRGljTm9kZSkgY29uc3QgPSAwOworICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSwgY29uc3QgRGljTm9kZSAqY29uc3QgY2hpbGREaWNOb2RlLAorICAgICAgICAgICAgY29uc3QgYm9vbCBhbGxvd3NFcnJvckNvcnJlY3Rpb25zKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzU3BhY2VTdWJzdGl0dXRpb25UZXJtaW5hbChjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTcGFjZU9taXNzaW9uVGVybWluYWwoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCkBAIC0zOCw5ICszOSw4IEBACiAgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIGNhbkRvTG9va0FoZWFkQ29ycmVjdGlvbihjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIFByb3hpbWl0eVR5cGUgZ2V0UHJveGltaXR5VHlwZSgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLAotICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgY2hpbGREaWNOb2RlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBQcm94aW1pdHlUeXBlIGdldFByb3hpbWl0eVR5cGUoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCisgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLCBjb25zdCBEaWNOb2RlICpjb25zdCBjaGlsZERpY05vZGUpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgc2FtZUFzVHlwZWQoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCiAgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIG5lZWRzVG9UcmF2ZXJzZUFsbFVzZXJJbnB1dCgpIGNvbnN0ID0gMDsKQEAgLTQ4LDkgKzQ4LDggQEAKICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dQYXJ0aWFsQ29tbWl0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50IGdldERlZmF1bHRFeHBhbmREaWNOb2RlU2l6ZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGludCBnZXRNYXhDYWNoZVNpemUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBib29sIGlzUG9zc2libGVPbWlzc2lvbkNoaWxkTm9kZSgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLAotICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1Bvc3NpYmxlT21pc3Npb25DaGlsZE5vZGUoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCisgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzR29vZFRvVHJhdmVyc2VOZXh0V29yZChjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCA9IDA7CiAKICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3dlaWdodGluZy5jcHAgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3dlaWdodGluZy5jcHAKaW5kZXggYjljMGI4MS4uZDAxNTMxZiAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3BvbGljeS93ZWlnaHRpbmcuY3BwCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9wb2xpY3kvd2VpZ2h0aW5nLmNwcApAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSAiY2hhcl91dGlscy5oIgogI2luY2x1ZGUgImRlZmluZXMuaCIKLSNpbmNsdWRlICJoYXNoX21hcF9jb21wYXQuaCIKICNpbmNsdWRlICJzdWdnZXN0L2NvcmUvZGljbm9kZS9kaWNfbm9kZS5oIgogI2luY2x1ZGUgInN1Z2dlc3QvY29yZS9kaWNub2RlL2RpY19ub2RlX3Byb2ZpbGVyLmgiCiAjaW5jbHVkZSAic3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVfdXRpbHMuaCIKQEAgLTI2LDYgKzI1LDggQEAKIAogbmFtZXNwYWNlIGxhdGluaW1lIHsKIAorY2xhc3MgTXVsdGlCaWdyYW1NYXA7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcm9maWxlKGNvbnN0IENvcnJlY3Rpb25UeXBlIGNvcnJlY3Rpb25UeXBlLCBEaWNOb2RlICpjb25zdCBub2RlKSB7CiAjaWYgREVCVUdfRElDVAogICAgIHN3aXRjaCAoY29ycmVjdGlvblR5cGUpIHsKQEAgLTY5LDIwICs3MCwxOCBAQAogfQogCiAvKiBzdGF0aWMgKi8gdm9pZCBXZWlnaHRpbmc6OmFkZENvc3RBbmRGb3J3YXJkSW5wdXRJbmRleChjb25zdCBXZWlnaHRpbmcgKmNvbnN0IHdlaWdodGluZywKLSAgICAgICAgY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUsCi0gICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAorICAgICAgICBjb25zdCBDb3JyZWN0aW9uVHlwZSBjb3JyZWN0aW9uVHlwZSwgY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCiAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IHBhcmVudERpY05vZGUsIERpY05vZGUgKmNvbnN0IGRpY05vZGUsCi0gICAgICAgIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+ICpjb25zdCBiaWdyYW1DYWNoZU1hcCkgeworICAgICAgICBNdWx0aUJpZ3JhbU1hcCAqY29uc3QgbXVsdGlCaWdyYW1NYXApIHsKICAgICBjb25zdCBpbnQgaW5wdXRTaXplID0gdHJhdmVyc2VTZXNzaW9uLT5nZXRJbnB1dFNpemUoKTsKICAgICBEaWNOb2RlX0lucHV0U3RhdGVHIGlucHV0U3RhdGVHOwogICAgIGlucHV0U3RhdGVHLm1OZWVkc1RvVXBkYXRlSW5wdXRTdGF0ZUcgPSBmYWxzZTsgLy8gRG9uJ3QgdXNlIGlucHV0IGluZm8gYnkgZGVmYXVsdAogICAgIGNvbnN0IGZsb2F0IHNwYXRpYWxDb3N0ID0gV2VpZ2h0aW5nOjpnZXRTcGF0aWFsQ29zdCh3ZWlnaHRpbmcsIGNvcnJlY3Rpb25UeXBlLAogICAgICAgICAgICAgdHJhdmVyc2VTZXNzaW9uLCBwYXJlbnREaWNOb2RlLCBkaWNOb2RlLCAmaW5wdXRTdGF0ZUcpOwogICAgIGNvbnN0IGZsb2F0IGxhbmd1YWdlQ29zdCA9IFdlaWdodGluZzo6Z2V0TGFuZ3VhZ2VDb3N0KHdlaWdodGluZywgY29ycmVjdGlvblR5cGUsCi0gICAgICAgICAgICB0cmF2ZXJzZVNlc3Npb24sIHBhcmVudERpY05vZGUsIGRpY05vZGUsIGJpZ3JhbUNhY2hlTWFwKTsKLSAgICBjb25zdCBib29sIGVkaXQgPSBXZWlnaHRpbmc6OmlzRWRpdENvcnJlY3Rpb24oY29ycmVjdGlvblR5cGUpOwotICAgIGNvbnN0IGJvb2wgcHJveGltaXR5ID0gV2VpZ2h0aW5nOjppc1Byb3hpbWl0eUNvcnJlY3Rpb24od2VpZ2h0aW5nLCBjb3JyZWN0aW9uVHlwZSwKLSAgICAgICAgICAgIHRyYXZlcnNlU2Vzc2lvbiwgZGljTm9kZSk7CisgICAgICAgICAgICB0cmF2ZXJzZVNlc3Npb24sIHBhcmVudERpY05vZGUsIGRpY05vZGUsIG11bHRpQmlncmFtTWFwKTsKKyAgICBjb25zdCBFcnJvclR5cGUgZXJyb3JUeXBlID0gd2VpZ2h0aW5nLT5nZXRFcnJvclR5cGUoY29ycmVjdGlvblR5cGUsIHRyYXZlcnNlU2Vzc2lvbiwKKyAgICAgICAgICAgIHBhcmVudERpY05vZGUsIGRpY05vZGUpOwogICAgIHByb2ZpbGUoY29ycmVjdGlvblR5cGUsIGRpY05vZGUpOwogICAgIGlmIChpbnB1dFN0YXRlRy5tTmVlZHNUb1VwZGF0ZUlucHV0U3RhdGVHKSB7CiAgICAgICAgIGRpY05vZGUtPnVwZGF0ZUlucHV0SW5kZXhHKCZpbnB1dFN0YXRlRyk7CkBAIC05MSwxMyArOTAsMTMgQEAKICAgICAgICAgICAgICAgICAoY29ycmVjdGlvblR5cGUgPT0gQ1RfVFJBTlNQT1NJVElPTikpOwogICAgIH0KICAgICBkaWNOb2RlLT5hZGRDb3N0KHNwYXRpYWxDb3N0LCBsYW5ndWFnZUNvc3QsIHdlaWdodGluZy0+bmVlZHNUb05vcm1hbGl6ZUNvbXBvdW5kRGlzdGFuY2UoKSwKLSAgICAgICAgICAgIGlucHV0U2l6ZSwgZWRpdCwgcHJveGltaXR5KTsKKyAgICAgICAgICAgIGlucHV0U2l6ZSwgZXJyb3JUeXBlKTsKIH0KIAogLyogc3RhdGljICovIGZsb2F0IFdlaWdodGluZzo6Z2V0U3BhdGlhbENvc3QoY29uc3QgV2VpZ2h0aW5nICpjb25zdCB3ZWlnaHRpbmcsCi0gICAgICAgIGNvbnN0IENvcnJlY3Rpb25UeXBlIGNvcnJlY3Rpb25UeXBlLAotICAgICAgICBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwgY29uc3QgRGljTm9kZSAqY29uc3QgcGFyZW50RGljTm9kZSwKLSAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSwgRGljTm9kZV9JbnB1dFN0YXRlRyAqY29uc3QgaW5wdXRTdGF0ZUcpIHsKKyAgICAgICAgY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUsIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAorICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLAorICAgICAgICBEaWNOb2RlX0lucHV0U3RhdGVHICpjb25zdCBpbnB1dFN0YXRlRykgewogICAgIHN3aXRjaChjb3JyZWN0aW9uVHlwZSkgewogICAgIGNhc2UgQ1RfT01JU1NJT046CiAgICAgICAgIHJldHVybiB3ZWlnaHRpbmctPmdldE9taXNzaW9uQ29zdChwYXJlbnREaWNOb2RlLCBkaWNOb2RlKTsKQEAgLTEyOSwxNCArMTI4LDE0IEBACiAvKiBzdGF0aWMgKi8gZmxvYXQgV2VpZ2h0aW5nOjpnZXRMYW5ndWFnZUNvc3QoY29uc3QgV2VpZ2h0aW5nICpjb25zdCB3ZWlnaHRpbmcsCiAgICAgICAgIGNvbnN0IENvcnJlY3Rpb25UeXBlIGNvcnJlY3Rpb25UeXBlLCBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgcGFyZW50RGljTm9kZSwgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSwKLSAgICAgICAgaGFzaF9tYXBfY29tcGF0PGludCwgaW50MTZfdD4gKmNvbnN0IGJpZ3JhbUNhY2hlTWFwKSB7CisgICAgICAgIE11bHRpQmlncmFtTWFwICpjb25zdCBtdWx0aUJpZ3JhbU1hcCkgewogICAgIHN3aXRjaChjb3JyZWN0aW9uVHlwZSkgewogICAgIGNhc2UgQ1RfT01JU1NJT046CiAgICAgICAgIHJldHVybiAwLjBmOwogICAgIGNhc2UgQ1RfU1VCU1RJVFVUSU9OOgogICAgICAgICByZXR1cm4gMC4wZjsKICAgICBjYXNlIENUX05FV19XT1JEX1NQQUNFX09NSVRUSU9OOgotICAgICAgICByZXR1cm4gd2VpZ2h0aW5nLT5nZXROZXdXb3JkQmlncmFtQ29zdCh0cmF2ZXJzZVNlc3Npb24sIHBhcmVudERpY05vZGUsIGJpZ3JhbUNhY2hlTWFwKTsKKyAgICAgICAgcmV0dXJuIHdlaWdodGluZy0+Z2V0TmV3V29yZEJpZ3JhbUNvc3QodHJhdmVyc2VTZXNzaW9uLCBwYXJlbnREaWNOb2RlLCBtdWx0aUJpZ3JhbU1hcCk7CiAgICAgY2FzZSBDVF9NQVRDSDoKICAgICAgICAgcmV0dXJuIDAuMGY7CiAgICAgY2FzZSBDVF9DT01QTEVUSU9OOgpAQCAtMTQ0LDExICsxNDMsMTEgQEAKICAgICBjYXNlIENUX1RFUk1JTkFMOiB7CiAgICAgICAgIGNvbnN0IGZsb2F0IGxhbmd1YWdlSW1wcm9iYWJpbGl0eSA9CiAgICAgICAgICAgICAgICAgRGljTm9kZVV0aWxzOjpnZXRCaWdyYW1Ob2RlSW1wcm9iYWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlU2Vzc2lvbi0+Z2V0T2Zmc2V0RGljdCgpLCBkaWNOb2RlLCBiaWdyYW1DYWNoZU1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZVNlc3Npb24tPmdldE9mZnNldERpY3QoKSwgZGljTm9kZSwgbXVsdGlCaWdyYW1NYXApOwogICAgICAgICByZXR1cm4gd2VpZ2h0aW5nLT5nZXRUZXJtaW5hbExhbmd1YWdlQ29zdCh0cmF2ZXJzZVNlc3Npb24sIGRpY05vZGUsIGxhbmd1YWdlSW1wcm9iYWJpbGl0eSk7CiAgICAgfQogICAgIGNhc2UgQ1RfTkVXX1dPUkRfU1BBQ0VfU1VCU1RJVFVUSU9OOgotICAgICAgICByZXR1cm4gd2VpZ2h0aW5nLT5nZXROZXdXb3JkQmlncmFtQ29zdCh0cmF2ZXJzZVNlc3Npb24sIHBhcmVudERpY05vZGUsIGJpZ3JhbUNhY2hlTWFwKTsKKyAgICAgICAgcmV0dXJuIHdlaWdodGluZy0+Z2V0TmV3V29yZEJpZ3JhbUNvc3QodHJhdmVyc2VTZXNzaW9uLCBwYXJlbnREaWNOb2RlLCBtdWx0aUJpZ3JhbU1hcCk7CiAgICAgY2FzZSBDVF9JTlNFUlRJT046CiAgICAgICAgIHJldHVybiAwLjBmOwogICAgIGNhc2UgQ1RfVFJBTlNQT1NJVElPTjoKQEAgLTE1OCw2NCArMTU3LDYgQEAKICAgICB9CiB9CiAKLS8qIHN0YXRpYyAqLyBib29sIFdlaWdodGluZzo6aXNFZGl0Q29ycmVjdGlvbihjb25zdCBDb3JyZWN0aW9uVHlwZSBjb3JyZWN0aW9uVHlwZSkgewotICAgIHN3aXRjaChjb3JyZWN0aW9uVHlwZSkgewotICAgICAgICBjYXNlIENUX09NSVNTSU9OOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgQ1RfQURESVRJT05BTF9QUk9YSU1JVFk6Ci0gICAgICAgICAgICAvLyBTaG91bGQgcmV0dXJuIHRydWU/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ1RfU1VCU1RJVFVUSU9OOgotICAgICAgICAgICAgLy8gU2hvdWxkIHJldHVybiB0cnVlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENUX05FV19XT1JEX1NQQUNFX09NSVRUSU9OOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENUX01BVENIOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENUX0NPTVBMRVRJT046Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ1RfVEVSTUlOQUw6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ1RfTkVXX1dPUkRfU1BBQ0VfU1VCU1RJVFVUSU9OOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENUX0lOU0VSVElPTjoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBjYXNlIENUX1RSQU5TUE9TSVRJT046Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIHN0YXRpYyAqLyBib29sIFdlaWdodGluZzo6aXNQcm94aW1pdHlDb3JyZWN0aW9uKGNvbnN0IFdlaWdodGluZyAqY29uc3Qgd2VpZ2h0aW5nLAotICAgICAgICBjb25zdCBDb3JyZWN0aW9uVHlwZSBjb3JyZWN0aW9uVHlwZSwKLSAgICAgICAgY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIHsKLSAgICBzd2l0Y2goY29ycmVjdGlvblR5cGUpIHsKLSAgICAgICAgY2FzZSBDVF9PTUlTU0lPTjoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDVF9BRERJVElPTkFMX1BST1hJTUlUWToKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDVF9TVUJTVElUVVRJT046Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ1RfTkVXX1dPUkRfU1BBQ0VfT01JVFRJT046Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ1RfTUFUQ0g6Ci0gICAgICAgICAgICByZXR1cm4gd2VpZ2h0aW5nLT5pc1Byb3hpbWl0eURpY05vZGUodHJhdmVyc2VTZXNzaW9uLCBkaWNOb2RlKTsKLSAgICAgICAgY2FzZSBDVF9DT01QTEVUSU9OOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENUX1RFUk1JTkFMOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENUX05FV19XT1JEX1NQQUNFX1NVQlNUSVRVVElPTjoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDVF9JTlNFUlRJT046Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ1RfVFJBTlNQT1NJVElPTjoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KIC8qIHN0YXRpYyAqLyBpbnQgV2VpZ2h0aW5nOjpnZXRGb3J3YXJkSW5wdXRDb3VudChjb25zdCBDb3JyZWN0aW9uVHlwZSBjb3JyZWN0aW9uVHlwZSkgewogICAgIHN3aXRjaChjb3JyZWN0aW9uVHlwZSkgewogICAgICAgICBjYXNlIENUX09NSVNTSU9OOgpAQCAtMjI5LDcgKzE3MCw3IEBACiAgICAgICAgIGNhc2UgQ1RfTUFUQ0g6CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBDVF9DT01QTEVUSU9OOgotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBDVF9URVJNSU5BTDoKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBjYXNlIENUX05FV19XT1JEX1NQQUNFX1NVQlNUSVRVVElPTjoKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9wb2xpY3kvd2VpZ2h0aW5nLmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvcG9saWN5L3dlaWdodGluZy5oCmluZGV4IGJjZTQ3OWMuLjBkMjc0NWIgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9wb2xpY3kvd2VpZ2h0aW5nLmgKKysrIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3BvbGljeS93ZWlnaHRpbmcuaApAQCAtMTgsMTMgKzE4LDEzIEBACiAjZGVmaW5lIExBVElOSU1FX1dFSUdIVElOR19ICiAKICNpbmNsdWRlICJkZWZpbmVzLmgiCi0jaW5jbHVkZSAiaGFzaF9tYXBfY29tcGF0LmgiCiAKIG5hbWVzcGFjZSBsYXRpbmltZSB7CiAKIGNsYXNzIERpY05vZGU7CiBjbGFzcyBEaWNUcmF2ZXJzZVNlc3Npb247CiBzdHJ1Y3QgRGljTm9kZV9JbnB1dFN0YXRlRzsKK2NsYXNzIE11bHRpQmlncmFtTWFwOwogCiBjbGFzcyBXZWlnaHRpbmcgewogIHB1YmxpYzoKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IENvcnJlY3Rpb25UeXBlIGNvcnJlY3Rpb25UeXBlLAogICAgICAgICAgICAgY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCiAgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLAotICAgICAgICAgICAgaGFzaF9tYXBfY29tcGF0PGludCwgaW50MTZfdD4gKmNvbnN0IGJpZ3JhbUNhY2hlTWFwKTsKKyAgICAgICAgICAgIE11bHRpQmlncmFtTWFwICpjb25zdCBtdWx0aUJpZ3JhbU1hcCk7CiAKICBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBmbG9hdCBnZXRUZXJtaW5hbFNwYXRpYWxDb3N0KGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLApAQCAtNjEsNyArNjEsNyBAQAogCiAgICAgdmlydHVhbCBmbG9hdCBnZXROZXdXb3JkQmlncmFtQ29zdCgKICAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLAotICAgICAgICAgICAgaGFzaF9tYXBfY29tcGF0PGludCwgaW50MTZfdD4gKmNvbnN0IGJpZ3JhbUNhY2hlTWFwKSBjb25zdCA9IDA7CisgICAgICAgICAgICBNdWx0aUJpZ3JhbU1hcCAqY29uc3QgbXVsdGlCaWdyYW1NYXApIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgZmxvYXQgZ2V0Q29tcGxldGlvbkNvc3QoCiAgICAgICAgICAgICBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKQEAgLTgwLDYgKzgwLDEwIEBACiAgICAgdmlydHVhbCBmbG9hdCBnZXRTcGFjZVN1YnN0aXR1dGlvbkNvc3QoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCiAgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCA9IDA7CiAKKyAgICB2aXJ0dWFsIEVycm9yVHlwZSBnZXRFcnJvclR5cGUoY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUsCisgICAgICAgICAgICBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IHBhcmVudERpY05vZGUsIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0ID0gMDsKKwogICAgIFdlaWdodGluZygpIHt9CiAgICAgdmlydHVhbCB+V2VpZ2h0aW5nKCkge30KIApAQCAtOTMsMTMgKzk3LDcgQEAKICAgICBzdGF0aWMgZmxvYXQgZ2V0TGFuZ3VhZ2VDb3N0KGNvbnN0IFdlaWdodGluZyAqY29uc3Qgd2VpZ2h0aW5nLAogICAgICAgICAgICAgY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUsIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAogICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgcGFyZW50RGljTm9kZSwgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSwKLSAgICAgICAgICAgIGhhc2hfbWFwX2NvbXBhdDxpbnQsIGludDE2X3Q+ICpjb25zdCBiaWdyYW1DYWNoZU1hcCk7Ci0gICAgLy8gVE9ETzogTW92ZSB0byBUeXBpbmdXZWlnaHRpbmcgYW5kIEdlc3R1cmVXZWlnaHRpbmc/Ci0gICAgc3RhdGljIGJvb2wgaXNFZGl0Q29ycmVjdGlvbihjb25zdCBDb3JyZWN0aW9uVHlwZSBjb3JyZWN0aW9uVHlwZSk7Ci0gICAgLy8gVE9ETzogTW92ZSB0byBUeXBpbmdXZWlnaHRpbmcgYW5kIEdlc3R1cmVXZWlnaHRpbmc/Ci0gICAgc3RhdGljIGJvb2wgaXNQcm94aW1pdHlDb3JyZWN0aW9uKGNvbnN0IFdlaWdodGluZyAqY29uc3Qgd2VpZ2h0aW5nLAotICAgICAgICAgICAgY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUsIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAotICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSk7CisgICAgICAgICAgICBNdWx0aUJpZ3JhbU1hcCAqY29uc3QgbXVsdGlCaWdyYW1NYXApOwogICAgIC8vIFRPRE86IE1vdmUgdG8gVHlwaW5nV2VpZ2h0aW5nIGFuZCBHZXN0dXJlV2VpZ2h0aW5nPwogICAgIHN0YXRpYyBpbnQgZ2V0Rm9yd2FyZElucHV0Q291bnQoY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUpOwogfTsKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9zZXNzaW9uL2RpY190cmF2ZXJzZV9zZXNzaW9uLmNwcCBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9zZXNzaW9uL2RpY190cmF2ZXJzZV9zZXNzaW9uLmNwcAppbmRleCAzYzQ0ZGIyLi42NDA4ZjAxIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvc2Vzc2lvbi9kaWNfdHJhdmVyc2Vfc2Vzc2lvbi5jcHAKKysrIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3Nlc3Npb24vZGljX3RyYXZlcnNlX3Nlc3Npb24uY3BwCkBAIC02NCwxMiArNjQsMjEgQEAKIHZvaWQgRGljVHJhdmVyc2VTZXNzaW9uOjppbml0KGNvbnN0IERpY3Rpb25hcnkgKmNvbnN0IGRpY3Rpb25hcnksIGNvbnN0IGludCAqcHJldldvcmQsCiAgICAgICAgIGludCBwcmV2V29yZExlbmd0aCkgewogICAgIG1EaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTsKLSAgICBtTXVsdGlXb3JkQ29zdE11bHRpcGxpZXIgPSBCaW5hcnlGb3JtYXQ6OmdldE11bHRpV29yZENvc3RNdWx0aXBsaWVyKG1EaWN0aW9uYXJ5LT5nZXREaWN0KCkpOworICAgIG1NdWx0aVdvcmRDb3N0TXVsdGlwbGllciA9IEJpbmFyeUZvcm1hdDo6Z2V0TXVsdGlXb3JkQ29zdE11bHRpcGxpZXIobURpY3Rpb25hcnktPmdldERpY3QoKSwKKyAgICAgICAgICAgIG1EaWN0aW9uYXJ5LT5nZXREaWN0U2l6ZSgpKTsKICAgICBpZiAoIXByZXZXb3JkKSB7CiAgICAgICAgIG1QcmV2V29yZFBvcyA9IE5PVF9WQUxJRF9XT1JEOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1QcmV2V29yZFBvcyA9IERpY05vZGVVdGlsczo6Z2V0V29yZFBvcyhkaWN0aW9uYXJ5LT5nZXRPZmZzZXREaWN0KCksIHByZXZXb3JkLCBwcmV2V29yZExlbmd0aCk7CisgICAgLy8gVE9ETzogbWVyZ2UgZm9sbG93aW5nIHNpbWlsYXIgY2FsbHMgdG8gZ2V0VGVybWluYWxQb3NpdGlvbiBpbnRvIG9uZSBjYXNlLWluc2Vuc2l0aXZlIGNhbGwuCisgICAgbVByZXZXb3JkUG9zID0gQmluYXJ5Rm9ybWF0OjpnZXRUZXJtaW5hbFBvc2l0aW9uKGRpY3Rpb25hcnktPmdldE9mZnNldERpY3QoKSwgcHJldldvcmQsCisgICAgICAgICAgICBwcmV2V29yZExlbmd0aCwgZmFsc2UgLyogZm9yY2VMb3dlckNhc2VTZWFyY2ggKi8pOworICAgIGlmIChtUHJldldvcmRQb3MgPT0gTk9UX1ZBTElEX1dPUkQpIHsKKyAgICAgICAgLy8gQ2hlY2sgYmlncmFtcyBmb3IgbG93ZXItY2FzZWQgcHJldmlvdXMgd29yZCBpZiBvcmlnaW5hbCB3YXMgbm90IGZvdW5kLiBVc2VmdWwgZm9yCisgICAgICAgIC8vIGF1dG8tY2FwaXRhbGl6ZWQgd29yZHMgbGlrZSAiVGhlIFtjdXJyZW50X3dvcmRdIi4KKyAgICAgICAgbVByZXZXb3JkUG9zID0gQmluYXJ5Rm9ybWF0OjpnZXRUZXJtaW5hbFBvc2l0aW9uKGRpY3Rpb25hcnktPmdldE9mZnNldERpY3QoKSwgcHJldldvcmQsCisgICAgICAgICAgICAgICAgcHJldldvcmRMZW5ndGgsIHRydWUgLyogZm9yY2VMb3dlckNhc2VTZWFyY2ggKi8pOworICAgIH0KIH0KIAogdm9pZCBEaWNUcmF2ZXJzZVNlc3Npb246OnNldHVwRm9yR2V0U3VnZ2VzdGlvbnMoY29uc3QgUHJveGltaXR5SW5mbyAqcEluZm8sCkBAIC05Miw3ICsxMDEsNyBAQAogCiB2b2lkIERpY1RyYXZlcnNlU2Vzc2lvbjo6cmVzZXRDYWNoZShjb25zdCBpbnQgbmV4dEFjdGl2ZUNhY2hlU2l6ZSwgY29uc3QgaW50IG1heFdvcmRzKSB7CiAgICAgbURpY05vZGVzQ2FjaGUucmVzZXQobmV4dEFjdGl2ZUNhY2hlU2l6ZSwgbWF4V29yZHMpOwotICAgIG1CaWdyYW1DYWNoZU1hcC5jbGVhcigpOworICAgIG1NdWx0aUJpZ3JhbU1hcC5jbGVhcigpOwogICAgIG1QYXJ0aWFsbHlDb21taXRlZCA9IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvc2Vzc2lvbi9kaWNfdHJhdmVyc2Vfc2Vzc2lvbi5oIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3Nlc3Npb24vZGljX3RyYXZlcnNlX3Nlc3Npb24uaAppbmRleCBkOWMyYTUxLi5kODhiZTViIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvc2Vzc2lvbi9kaWNfdHJhdmVyc2Vfc2Vzc2lvbi5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9zZXNzaW9uL2RpY190cmF2ZXJzZV9zZXNzaW9uLmgKQEAgLTIxLDggKzIxLDggQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJkZWZpbmVzLmgiCi0jaW5jbHVkZSAiaGFzaF9tYXBfY29tcGF0LmgiCiAjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAibXVsdGlfYmlncmFtX21hcC5oIgogI2luY2x1ZGUgInByb3hpbWl0eV9pbmZvX3N0YXRlLmgiCiAjaW5jbHVkZSAic3VnZ2VzdC9jb3JlL2RpY25vZGUvZGljX25vZGVzX2NhY2hlLmgiCiAKQEAgLTM1LDcgKzM1LDcgQEAKICBwdWJsaWM6CiAgICAgQUtfRk9SQ0VfSU5MSU5FIERpY1RyYXZlcnNlU2Vzc2lvbihKTklFbnYgKmVudiwganN0cmluZyBsb2NhbGVTdHIpCiAgICAgICAgICAgICA6IG1QcmV2V29yZFBvcyhOT1RfVkFMSURfV09SRCksIG1Qcm94aW1pdHlJbmZvKDApLAotICAgICAgICAgICAgICBtRGljdGlvbmFyeSgwKSwgbURpY05vZGVzQ2FjaGUoKSwgbUJpZ3JhbUNhY2hlTWFwKCksCisgICAgICAgICAgICAgIG1EaWN0aW9uYXJ5KDApLCBtRGljTm9kZXNDYWNoZSgpLCBtTXVsdGlCaWdyYW1NYXAoKSwKICAgICAgICAgICAgICAgbUlucHV0U2l6ZSgwKSwgbVBhcnRpYWxseUNvbW1pdGVkKGZhbHNlKSwgbU1heFBvaW50ZXJDb3VudCgxKSwKICAgICAgICAgICAgICAgbU11bHRpV29yZENvc3RNdWx0aXBsaWVyKDEuMGYpIHsKICAgICAgICAgLy8gTk9URTogbVByb3hpbWl0eUluZm9TdGF0ZXMgaXMgYW4gYXJyYXkgb2YgaW5zdGFuY2VzLgpAQCAtNjcsNyArNjcsNyBAQAogICAgIC8vIFRPRE86IFVzZSBwcm9wZXIgcGFyYW1ldGVyIHdoZW4gY2hhbmdlZAogICAgIGludCBnZXREaWNSb290UG9zKCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIERpY05vZGVzQ2FjaGUgKmdldERpY1RyYXZlcnNlQ2FjaGUoKSB7IHJldHVybiAmbURpY05vZGVzQ2FjaGU7IH0KLSAgICBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQxNl90PiAqZ2V0QmlncmFtQ2FjaGVNYXAoKSB7IHJldHVybiAmbUJpZ3JhbUNhY2hlTWFwOyB9CisgICAgTXVsdGlCaWdyYW1NYXAgKmdldE11bHRpQmlncmFtTWFwKCkgeyByZXR1cm4gJm1NdWx0aUJpZ3JhbU1hcDsgfQogICAgIGNvbnN0IFByb3hpbWl0eUluZm9TdGF0ZSAqZ2V0UHJveGltaXR5SW5mb1N0YXRlKGludCBpZCkgY29uc3QgewogICAgICAgICByZXR1cm4gJm1Qcm94aW1pdHlJbmZvU3RhdGVzW2lkXTsKICAgICB9CkBAIC0xNzAsNyArMTcwLDcgQEAKIAogICAgIERpY05vZGVzQ2FjaGUgbURpY05vZGVzQ2FjaGU7CiAgICAgLy8gVGVtcG9yYXJ5IGNhY2hlIGZvciBiaWdyYW0gZnJlcXVlbmNpZXMKLSAgICBoYXNoX21hcF9jb21wYXQ8aW50LCBpbnQxNl90PiBtQmlncmFtQ2FjaGVNYXA7CisgICAgTXVsdGlCaWdyYW1NYXAgbU11bHRpQmlncmFtTWFwOwogICAgIFByb3hpbWl0eUluZm9TdGF0ZSBtUHJveGltaXR5SW5mb1N0YXRlc1tNQVhfUE9JTlRFUl9DT1VOVF9HXTsKIAogICAgIGludCBtSW5wdXRTaXplOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3N1Z2dlc3QuY3BwIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9jb3JlL3N1Z2dlc3QuY3BwCmluZGV4IDlkZTJjZDIuLmExODc5NDggMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvY29yZS9zdWdnZXN0LmNwcAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L2NvcmUvc3VnZ2VzdC5jcHAKQEAgLTE2MSwxMiArMTYxLDIwIEBACiAgICAgICAgICAgICAgICAgKyBkb3VibGVMZXR0ZXJDb3N0OwogICAgICAgICBjb25zdCBUZXJtaW5hbEF0dHJpYnV0ZXMgdGVybWluYWxBdHRyaWJ1dGVzKHRyYXZlcnNlU2Vzc2lvbi0+Z2V0T2Zmc2V0RGljdCgpLAogICAgICAgICAgICAgICAgIHRlcm1pbmFsRGljTm9kZS0+Z2V0RmxhZ3MoKSwgdGVybWluYWxEaWNOb2RlLT5nZXRBdHRyaWJ1dGVzUG9zKCkpOwotICAgICAgICBjb25zdCBpbnQgb3JpZ2luYWxUZXJtaW5hbFByb2JhYmlsaXR5ID0gdGVybWluYWxEaWNOb2RlLT5nZXRQcm9iYWJpbGl0eSgpOworICAgICAgICBjb25zdCBib29sIGlzUG9zc2libHlPZmZlbnNpdmVXb3JkID0gdGVybWluYWxEaWNOb2RlLT5nZXRQcm9iYWJpbGl0eSgpIDw9IDA7CisgICAgICAgIGNvbnN0IGJvb2wgaXNFeGFjdE1hdGNoID0gdGVybWluYWxEaWNOb2RlLT5pc0V4YWN0TWF0Y2goKTsKKyAgICAgICAgY29uc3QgYm9vbCBpc0ZpcnN0Q2hhclVwcGVyY2FzZSA9IHRlcm1pbmFsRGljTm9kZS0+aXNGaXJzdENoYXJVcHBlcmNhc2UoKTsKKyAgICAgICAgLy8gSGV1cmlzdGljOiBXZSBleGNsdWRlIGZyZXE9MCBmaXJzdC1jaGFyLXVwcGVyY2FzZSB3b3JkcyBmcm9tIGV4YWN0IG1hdGNoLgorICAgICAgICAvLyAoZS5nLiAiQU1EIiBhbmQgImFuZCIpCisgICAgICAgIGNvbnN0IGJvb2wgaXNTYWZlRXhhY3RNYXRjaCA9IGlzRXhhY3RNYXRjaAorICAgICAgICAgICAgICAgICYmICEoaXNQb3NzaWJseU9mZmVuc2l2ZVdvcmQgJiYgaXNGaXJzdENoYXJVcHBlcmNhc2UpOworICAgICAgICBjb25zdCBpbnQgb3V0cHV0VHlwZUZsYWdzID0KKyAgICAgICAgICAgICAgICAoaXNQb3NzaWJseU9mZmVuc2l2ZVdvcmQgPyBEaWN0aW9uYXJ5OjpLSU5EX0ZMQUdfUE9TU0lCTFlfT0ZGRU5TSVZFIDogMCkKKyAgICAgICAgICAgICAgICB8IChpc1NhZmVFeGFjdE1hdGNoID8gRGljdGlvbmFyeTo6S0lORF9GTEFHX0VYQUNUX01BVENIIDogMCk7CiAKLSAgICAgICAgLy8gRG8gbm90IHN1Z2dlc3Qgd29yZHMgd2l0aCBhIDAgcHJvYmFiaWxpdHksIG9yIGVudHJpZXMgdGhhdCBhcmUgYmxhY2tsaXN0ZWQgb3IgZG8gbm90Ci0gICAgICAgIC8vIHJlcHJlc2VudCBhIHdvcmQuIEhvd2V2ZXIsIHdlIHNob3VsZCBzdGlsbCBzdWJtaXQgdGhlaXIgc2hvcnRjdXRzIGlmIGFueS4KLSAgICAgICAgY29uc3QgYm9vbCBpc1ZhbGlkV29yZCA9Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxUZXJtaW5hbFByb2JhYmlsaXR5ID4gMCAmJiAhdGVybWluYWxBdHRyaWJ1dGVzLmlzQmxhY2tsaXN0ZWRPck5vdEFXb3JkKCk7CisgICAgICAgIC8vIEVudHJpZXMgdGhhdCBhcmUgYmxhY2tsaXN0ZWQgb3IgZG8gbm90IHJlcHJlc2VudCBhIHdvcmQgc2hvdWxkIG5vdCBiZSBvdXRwdXQuCisgICAgICAgIGNvbnN0IGJvb2wgaXNWYWxpZFdvcmQgPSAhdGVybWluYWxBdHRyaWJ1dGVzLmlzQmxhY2tsaXN0ZWRPck5vdEFXb3JkKCk7CisKICAgICAgICAgLy8gSW5jcmVhc2Ugb3V0cHV0IHNjb3JlIG9mIHRvcCB0eXBpbmcgc3VnZ2VzdGlvbiB0byBlbnN1cmUgYXV0b2NvcnJlY3Rpb24uCiAgICAgICAgIC8vIFRPRE86IEJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIGphdmEgc2lkZSBhdXRvY29ycmVjdGlvbiBsb2dpYy4KICAgICAgICAgLy8gRm9yY2UgYXV0b2NvcnJlY3Rpb24gZm9yIG9idmlvdXMgbG9uZyBtdWx0aS13b3JkIHN1Z2dlc3Rpb25zLgpAQCAtMTg4LDEwICsxOTYsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gRG8gbm90IHN1Z2dlc3Qgd29yZHMgd2l0aCBhIDAgcHJvYmFiaWxpdHksIG9yIGVudHJpZXMgdGhhdCBhcmUgYmxhY2tsaXN0ZWQgb3IgZG8gbm90Ci0gICAgICAgIC8vIHJlcHJlc2VudCBhIHdvcmQuIEhvd2V2ZXIsIHdlIHNob3VsZCBzdGlsbCBzdWJtaXQgdGhlaXIgc2hvcnRjdXRzIGlmIGFueS4KKyAgICAgICAgLy8gRG9uJ3Qgb3V0cHV0IGludmFsaWQgd29yZHMuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gc3VibWl0IHRoZWlyIHNob3J0Y3V0cyBpZiBhbnkuCiAgICAgICAgIGlmIChpc1ZhbGlkV29yZCkgewotICAgICAgICAgICAgb3V0cHV0VHlwZXNbb3V0cHV0V29yZEluZGV4XSA9IERpY3Rpb25hcnk6OktJTkRfQ09SUkVDVElPTjsKKyAgICAgICAgICAgIG91dHB1dFR5cGVzW291dHB1dFdvcmRJbmRleF0gPSBEaWN0aW9uYXJ5OjpLSU5EX0NPUlJFQ1RJT04gfCBvdXRwdXRUeXBlRmxhZ3M7CiAgICAgICAgICAgICBmcmVxdWVuY2llc1tvdXRwdXRXb3JkSW5kZXhdID0gZmluYWxTY29yZTsKICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBvdXRwdXRDaGFycyBhcnJheSB3aXRoIHRoZSBzdWdnZXN0ZWQgd29yZC4KICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydEluZGV4ID0gb3V0cHV0V29yZEluZGV4ICogTUFYX1dPUkRfTEVOR1RIOwpAQCAtMjk0LDggKzMwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25EaWNOb2RlLmFkdmFuY2VEaWdyYXBoSW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RpY05vZGVBc0RpZ3JhcGgodHJhdmVyc2VTZXNzaW9uLCAmY29ycmVjdGlvbkRpY05vZGUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dzRXJyb3JDb3JyZWN0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVFJBVkVSU0FMLT5pc09taXNzaW9uKHRyYXZlcnNlU2Vzc2lvbiwgJmRpY05vZGUsIGNoaWxkRGljTm9kZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoVFJBVkVSU0FMLT5pc09taXNzaW9uKHRyYXZlcnNlU2Vzc2lvbiwgJmRpY05vZGUsIGNoaWxkRGljTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93c0Vycm9yQ29ycmVjdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IChHZXN0dXJlKSBDaGFuZ2Ugd2VpZ2h0IGJldHdlZW4gb21pc3Npb24gYW5kIHN1YnN0aXR1dGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogKEdlc3R1cmUpIFRlcm1pbmFsIG5vZGUgc2hvdWxkIG5vdCBiZSBoYW5kbGVkIGFzIG9taXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25EaWNOb2RlLmluaXRCeUNvcHkoY2hpbGREaWNOb2RlKTsKQEAgLTM1Nyw3ICszNjQsNyBAQAogICAgIERpY05vZGUgdGVybWluYWxEaWNOb2RlOwogICAgIERpY05vZGVVdGlsczo6aW5pdEJ5Q29weShkaWNOb2RlLCAmdGVybWluYWxEaWNOb2RlKTsKICAgICBXZWlnaHRpbmc6OmFkZENvc3RBbmRGb3J3YXJkSW5wdXRJbmRleChXRUlHSFRJTkcsIENUX1RFUk1JTkFMLCB0cmF2ZXJzZVNlc3Npb24sIDAsCi0gICAgICAgICAgICAmdGVybWluYWxEaWNOb2RlLCB0cmF2ZXJzZVNlc3Npb24tPmdldEJpZ3JhbUNhY2hlTWFwKCkpOworICAgICAgICAgICAgJnRlcm1pbmFsRGljTm9kZSwgdHJhdmVyc2VTZXNzaW9uLT5nZXRNdWx0aUJpZ3JhbU1hcCgpKTsKICAgICB0cmF2ZXJzZVNlc3Npb24tPmdldERpY1RyYXZlcnNlQ2FjaGUoKS0+Y29weVB1c2hUZXJtaW5hbCgmdGVybWluYWxEaWNOb2RlKTsKIH0KIApAQCAtMzg5LDggKzM5NiwxMCBAQAogCiB2b2lkIFN1Z2dlc3Q6OnByb2Nlc3NEaWNOb2RlQXNBZGRpdGlvbmFsUHJveGltaXR5Q2hhcihEaWNUcmF2ZXJzZVNlc3Npb24gKnRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgRGljTm9kZSAqZGljTm9kZSwgRGljTm9kZSAqY2hpbGREaWNOb2RlKSBjb25zdCB7CisgICAgLy8gTm90ZTogTW9zdCB0eXBlcyBvZiBjb3JyZWN0aW9ucyBkb24ndCBuZWVkIHRvIGxvb2sgdXAgdGhlIGJpZ3JhbSBpbmZvcm1hdGlvbiBzaW5jZSB0aGV5IGRvCisgICAgLy8gbm90IHRyZWF0IHRoZSBub2RlIGFzIGEgdGVybWluYWwuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcGFzcyB0aGUgYmlncmFtIG1hcCBpbiB0aGVzZSBjYXNlcy4KICAgICBXZWlnaHRpbmc6OmFkZENvc3RBbmRGb3J3YXJkSW5wdXRJbmRleChXRUlHSFRJTkcsIENUX0FERElUSU9OQUxfUFJPWElNSVRZLAotICAgICAgICAgICAgdHJhdmVyc2VTZXNzaW9uLCBkaWNOb2RlLCBjaGlsZERpY05vZGUsIDAgLyogYmlncmFtQ2FjaGVNYXAgKi8pOworICAgICAgICAgICAgdHJhdmVyc2VTZXNzaW9uLCBkaWNOb2RlLCBjaGlsZERpY05vZGUsIDAgLyogbXVsdGlCaWdyYW1NYXAgKi8pOwogICAgIHdlaWdodENoaWxkTm9kZSh0cmF2ZXJzZVNlc3Npb24sIGNoaWxkRGljTm9kZSk7CiAgICAgcHJvY2Vzc0V4cGFuZGVkRGljTm9kZSh0cmF2ZXJzZVNlc3Npb24sIGNoaWxkRGljTm9kZSk7CiB9CkBAIC0zOTgsNyArNDA3LDcgQEAKIHZvaWQgU3VnZ2VzdDo6cHJvY2Vzc0RpY05vZGVBc1N1YnN0aXR1dGlvbihEaWNUcmF2ZXJzZVNlc3Npb24gKnRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgRGljTm9kZSAqZGljTm9kZSwgRGljTm9kZSAqY2hpbGREaWNOb2RlKSBjb25zdCB7CiAgICAgV2VpZ2h0aW5nOjphZGRDb3N0QW5kRm9yd2FyZElucHV0SW5kZXgoV0VJR0hUSU5HLCBDVF9TVUJTVElUVVRJT04sIHRyYXZlcnNlU2Vzc2lvbiwKLSAgICAgICAgICAgIGRpY05vZGUsIGNoaWxkRGljTm9kZSwgMCAvKiBiaWdyYW1DYWNoZU1hcCAqLyk7CisgICAgICAgICAgICBkaWNOb2RlLCBjaGlsZERpY05vZGUsIDAgLyogbXVsdGlCaWdyYW1NYXAgKi8pOwogICAgIHdlaWdodENoaWxkTm9kZSh0cmF2ZXJzZVNlc3Npb24sIGNoaWxkRGljTm9kZSk7CiAgICAgcHJvY2Vzc0V4cGFuZGVkRGljTm9kZSh0cmF2ZXJzZVNlc3Npb24sIGNoaWxkRGljTm9kZSk7CiB9CkBAIC00MjIsMjAgKzQzMSwxNSBAQAogICovCiB2b2lkIFN1Z2dlc3Q6OnByb2Nlc3NEaWNOb2RlQXNPbWlzc2lvbigKICAgICAgICAgRGljVHJhdmVyc2VTZXNzaW9uICp0cmF2ZXJzZVNlc3Npb24sIERpY05vZGUgKmRpY05vZGUpIGNvbnN0IHsKLSAgICAvLyBJZiB0aGUgb21pc3Npb24gaXMgc3VyZWx5IGludGVudGlvbmFsIHRoYXQgaXQgc2hvdWxkIGluY3VyIHplcm8gY29zdC4KLSAgICBjb25zdCBib29sIGlzWmVyb0Nvc3RPbWlzc2lvbiA9IGRpY05vZGUtPmlzWmVyb0Nvc3RPbWlzc2lvbigpOwogICAgIERpY05vZGVWZWN0b3IgY2hpbGREaWNOb2RlczsKLQogICAgIERpY05vZGVVdGlsczo6Z2V0QWxsQ2hpbGREaWNOb2RlcyhkaWNOb2RlLCB0cmF2ZXJzZVNlc3Npb24tPmdldE9mZnNldERpY3QoKSwgJmNoaWxkRGljTm9kZXMpOwogCiAgICAgY29uc3QgaW50IHNpemUgPSBjaGlsZERpY05vZGVzLmdldFNpemVBbmRMb2NrKCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgRGljTm9kZSAqY29uc3QgY2hpbGREaWNOb2RlID0gY2hpbGREaWNOb2Rlc1tpXTsKLSAgICAgICAgaWYgKCFpc1plcm9Db3N0T21pc3Npb24pIHsKLSAgICAgICAgICAgIC8vIFRyZWF0IHRoaXMgd29yZCBhcyBvbWlzc2lvbgotICAgICAgICAgICAgV2VpZ2h0aW5nOjphZGRDb3N0QW5kRm9yd2FyZElucHV0SW5kZXgoV0VJR0hUSU5HLCBDVF9PTUlTU0lPTiwgdHJhdmVyc2VTZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBkaWNOb2RlLCBjaGlsZERpY05vZGUsIDAgLyogYmlncmFtQ2FjaGVNYXAgKi8pOwotICAgICAgICB9CisgICAgICAgIC8vIFRyZWF0IHRoaXMgd29yZCBhcyBvbWlzc2lvbgorICAgICAgICBXZWlnaHRpbmc6OmFkZENvc3RBbmRGb3J3YXJkSW5wdXRJbmRleChXRUlHSFRJTkcsIENUX09NSVNTSU9OLCB0cmF2ZXJzZVNlc3Npb24sCisgICAgICAgICAgICAgICAgZGljTm9kZSwgY2hpbGREaWNOb2RlLCAwIC8qIG11bHRpQmlncmFtTWFwICovKTsKICAgICAgICAgd2VpZ2h0Q2hpbGROb2RlKHRyYXZlcnNlU2Vzc2lvbiwgY2hpbGREaWNOb2RlKTsKIAogICAgICAgICBpZiAoIVRSQVZFUlNBTC0+aXNQb3NzaWJsZU9taXNzaW9uQ2hpbGROb2RlKHRyYXZlcnNlU2Vzc2lvbiwgZGljTm9kZSwgY2hpbGREaWNOb2RlKSkgewpAQCAtNDU5LDcgKzQ2Myw3IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgRGljTm9kZSAqY29uc3QgY2hpbGREaWNOb2RlID0gY2hpbGREaWNOb2Rlc1tpXTsKICAgICAgICAgV2VpZ2h0aW5nOjphZGRDb3N0QW5kRm9yd2FyZElucHV0SW5kZXgoV0VJR0hUSU5HLCBDVF9JTlNFUlRJT04sIHRyYXZlcnNlU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICBkaWNOb2RlLCBjaGlsZERpY05vZGUsIDAgLyogYmlncmFtQ2FjaGVNYXAgKi8pOworICAgICAgICAgICAgICAgIGRpY05vZGUsIGNoaWxkRGljTm9kZSwgMCAvKiBtdWx0aUJpZ3JhbU1hcCAqLyk7CiAgICAgICAgIHByb2Nlc3NFeHBhbmRlZERpY05vZGUodHJhdmVyc2VTZXNzaW9uLCBjaGlsZERpY05vZGUpOwogICAgIH0KIH0KQEAgLTQ4NCw3ICs0ODgsNyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZFNpemUyOyBqKyspIHsKICAgICAgICAgICAgICAgICBEaWNOb2RlICpjb25zdCBjaGlsZERpY05vZGUyID0gY2hpbGREaWNOb2RlczJbal07CiAgICAgICAgICAgICAgICAgV2VpZ2h0aW5nOjphZGRDb3N0QW5kRm9yd2FyZElucHV0SW5kZXgoV0VJR0hUSU5HLCBDVF9UUkFOU1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VTZXNzaW9uLCBjaGlsZERpY05vZGVzMVtpXSwgY2hpbGREaWNOb2RlMiwgMCAvKiBiaWdyYW1DYWNoZU1hcCAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZVNlc3Npb24sIGNoaWxkRGljTm9kZXMxW2ldLCBjaGlsZERpY05vZGUyLCAwIC8qIG11bHRpQmlncmFtTWFwICovKTsKICAgICAgICAgICAgICAgICBwcm9jZXNzRXhwYW5kZWREaWNOb2RlKHRyYXZlcnNlU2Vzc2lvbiwgY2hpbGREaWNOb2RlMik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ5OSwxMCArNTAzLDEwIEBACiAgICAgY29uc3QgaW50IGlucHV0U2l6ZSA9IHRyYXZlcnNlU2Vzc2lvbi0+Z2V0SW5wdXRTaXplKCk7CiAgICAgaWYgKGRpY05vZGUtPmlzQ29tcGxldGlvbihpbnB1dFNpemUpKSB7CiAgICAgICAgIFdlaWdodGluZzo6YWRkQ29zdEFuZEZvcndhcmRJbnB1dEluZGV4KFdFSUdIVElORywgQ1RfQ09NUExFVElPTiwgdHJhdmVyc2VTZXNzaW9uLAotICAgICAgICAgICAgICAgIDAgLyogcGFyZW50RGljTm9kZSAqLywgZGljTm9kZSwgMCAvKiBiaWdyYW1DYWNoZU1hcCAqLyk7CisgICAgICAgICAgICAgICAgMCAvKiBwYXJlbnREaWNOb2RlICovLCBkaWNOb2RlLCAwIC8qIG11bHRpQmlncmFtTWFwICovKTsKICAgICB9IGVsc2UgeyAvLyBjb21wbGV0aW9uCiAgICAgICAgIFdlaWdodGluZzo6YWRkQ29zdEFuZEZvcndhcmRJbnB1dEluZGV4KFdFSUdIVElORywgQ1RfTUFUQ0gsIHRyYXZlcnNlU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAwIC8qIHBhcmVudERpY05vZGUgKi8sIGRpY05vZGUsIDAgLyogYmlncmFtQ2FjaGVNYXAgKi8pOworICAgICAgICAgICAgICAgIDAgLyogcGFyZW50RGljTm9kZSAqLywgZGljTm9kZSwgMCAvKiBtdWx0aUJpZ3JhbU1hcCAqLyk7CiAgICAgfQogfQogCkBAIC01MjMsNyArNTI3LDcgQEAKICAgICBjb25zdCBDb3JyZWN0aW9uVHlwZSBjb3JyZWN0aW9uVHlwZSA9IHNwYWNlU3Vic3RpdHV0aW9uID8KICAgICAgICAgICAgIENUX05FV19XT1JEX1NQQUNFX1NVQlNUSVRVVElPTiA6IENUX05FV19XT1JEX1NQQUNFX09NSVRUSU9OOwogICAgIFdlaWdodGluZzo6YWRkQ29zdEFuZEZvcndhcmRJbnB1dEluZGV4KFdFSUdIVElORywgY29ycmVjdGlvblR5cGUsIHRyYXZlcnNlU2Vzc2lvbiwgZGljTm9kZSwKLSAgICAgICAgICAgICZuZXdEaWNOb2RlLCB0cmF2ZXJzZVNlc3Npb24tPmdldEJpZ3JhbUNhY2hlTWFwKCkpOworICAgICAgICAgICAgJm5ld0RpY05vZGUsIHRyYXZlcnNlU2Vzc2lvbi0+Z2V0TXVsdGlCaWdyYW1NYXAoKSk7CiAgICAgdHJhdmVyc2VTZXNzaW9uLT5nZXREaWNUcmF2ZXJzZUNhY2hlKCktPmNvcHlQdXNoTmV4dEFjdGl2ZSgmbmV3RGljTm9kZSk7CiB9CiB9IC8vIG5hbWVzcGFjZSBsYXRpbmltZQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3R5cGluZy9zY29yaW5nX3BhcmFtcy5jcHAgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3Njb3JpbmdfcGFyYW1zLmNwcAppbmRleCAwZmE2ODRmLi5mODc5ODkyIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3Njb3JpbmdfcGFyYW1zLmNwcAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3Njb3JpbmdfcGFyYW1zLmNwcApAQCAtMjgsMjUgKzI4LDI1IEBACiBjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpESVNUQU5DRV9XRUlHSFRfTEVOR1RIID0gMC4xMzJmOwogY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6UFJPWElNSVRZX0NPU1QgPSAwLjA4NmY7CiBjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpGSVJTVF9QUk9YSU1JVFlfQ09TVCA9IDAuMTA0ZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6Ok9NSVNTSU9OX0NPU1QgPSAwLjM4OGY7Ci1jb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpPTUlTU0lPTl9DT1NUX1NBTUVfQ0hBUiA9IDAuNDMxZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6Ok9NSVNTSU9OX0NPU1RfRklSU1RfQ0hBUiA9IDAuNTMyZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OklOU0VSVElPTl9DT1NUID0gMC42NzBmOwotY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6SU5TRVJUSU9OX0NPU1RfU0FNRV9DSEFSID0gMC41MjZmOwotY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6SU5TRVJUSU9OX0NPU1RfRklSU1RfQ0hBUiA9IDAuNTYzZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OlRSQU5TUE9TSVRJT05fQ09TVCA9IDAuNDk0ZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OlNQQUNFX1NVQlNUSVRVVElPTl9DT1NUID0gMC4yMzlmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6T01JU1NJT05fQ09TVCA9IDAuNDU4ZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6Ok9NSVNTSU9OX0NPU1RfU0FNRV9DSEFSID0gMC40OTFmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6T01JU1NJT05fQ09TVF9GSVJTVF9DSEFSID0gMC41ODJmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6SU5TRVJUSU9OX0NPU1QgPSAwLjczMGY7Citjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpJTlNFUlRJT05fQ09TVF9TQU1FX0NIQVIgPSAwLjU4NmY7Citjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpJTlNFUlRJT05fQ09TVF9GSVJTVF9DSEFSID0gMC42MjNmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6VFJBTlNQT1NJVElPTl9DT1NUID0gMC41MTZmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6U1BBQ0VfU1VCU1RJVFVUSU9OX0NPU1QgPSAwLjMxOWY7CiBjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpBRERJVElPTkFMX1BST1hJTUlUWV9DT1NUID0gMC4zODBmOwotY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6U1VCU1RJVFVUSU9OX0NPU1QgPSAwLjM2M2Y7Ci1jb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpDT1NUX05FV19XT1JEID0gMC4wNTRmOwotY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6Q09TVF9ORVdfV09SRF9DQVBJVEFMSVpFRCA9IDAuMTc0ZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OlNVQlNUSVRVVElPTl9DT1NUID0gMC40MDNmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6Q09TVF9ORVdfV09SRCA9IDAuMDQyZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OkNPU1RfU0VDT05EX09SX0xBVEVSX1dPUkRfRklSU1RfQ0hBUl9VUFBFUkNBU0UgPSAwLjI1ZjsKIGNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OkRJU1RBTkNFX1dFSUdIVF9MQU5HVUFHRSA9IDEuMTIzZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OkNPU1RfRklSU1RfTE9PS0FIRUFEID0gMC40NjJmOwotY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6Q09TVF9MT09LQUhFQUQgPSAwLjA5MmY7Ci1jb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpIQVNfUFJPWElNSVRZX1RFUk1JTkFMX0NPU1QgPSAwLjEyNmY7Ci1jb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpIQVNfRURJVF9DT1JSRUNUSU9OX1RFUk1JTkFMX0NPU1QgPSAwLjA1NmY7Ci1jb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpIQVNfTVVMVElfV09SRF9URVJNSU5BTF9DT1NUID0gMC4xMzZmOworY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6Q09TVF9GSVJTVF9MT09LQUhFQUQgPSAwLjU0NWY7Citjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpDT1NUX0xPT0tBSEVBRCA9IDAuMDczZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OkhBU19QUk9YSU1JVFlfVEVSTUlOQUxfQ09TVCA9IDAuMTA1ZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OkhBU19FRElUX0NPUlJFQ1RJT05fVEVSTUlOQUxfQ09TVCA9IDAuMDM4ZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6OkhBU19NVUxUSV9XT1JEX1RFUk1JTkFMX0NPU1QgPSAwLjQ0NGY7CiBjb25zdCBmbG9hdCBTY29yaW5nUGFyYW1zOjpUWVBJTkdfQkFTRV9PVVRQVVRfU0NPUkUgPSAxLjBmOwogY29uc3QgZmxvYXQgU2NvcmluZ1BhcmFtczo6VFlQSU5HX01BWF9PVVRQVVRfU0NPUkVfUEVSX0lOUFVUID0gMC4xZjsKLWNvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6Ok1BWF9OT1JNX0RJU1RBTkNFX0ZPUl9FRElUID0gMC4xZjsKK2NvbnN0IGZsb2F0IFNjb3JpbmdQYXJhbXM6Ok5PUk1BTElaRURfU1BBVElBTF9ESVNUQU5DRV9USFJFU0hPTERfRk9SX0VESVQgPSAwLjA2ZjsKIH0gLy8gbmFtZXNwYWNlIGxhdGluaW1lCmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3Njb3JpbmdfcGFyYW1zLmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3Njb3JpbmdfcGFyYW1zLmgKaW5kZXggOGYxMDRiMy4uNTNhYzk5OSAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3R5cGluZy9zY29yaW5nX3BhcmFtcy5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvcG9saWN5aW1wbC90eXBpbmcvc2NvcmluZ19wYXJhbXMuaApAQCAtNDgsNyArNDgsNyBAQAogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBBRERJVElPTkFMX1BST1hJTUlUWV9DT1NUOwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBTVUJTVElUVVRJT05fQ09TVDsKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgQ09TVF9ORVdfV09SRDsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgQ09TVF9ORVdfV09SRF9DQVBJVEFMSVpFRDsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgQ09TVF9TRUNPTkRfT1JfTEFURVJfV09SRF9GSVJTVF9DSEFSX1VQUEVSQ0FTRTsKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgRElTVEFOQ0VfV0VJR0hUX0xBTkdVQUdFOwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBDT1NUX0ZJUlNUX0xPT0tBSEVBRDsKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgQ09TVF9MT09LQUhFQUQ7CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IEhBU19NVUxUSV9XT1JEX1RFUk1JTkFMX0NPU1Q7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IFRZUElOR19CQVNFX09VVFBVVF9TQ09SRTsKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgVFlQSU5HX01BWF9PVVRQVVRfU0NPUkVfUEVSX0lOUFVUOwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBNQVhfTk9STV9ESVNUQU5DRV9GT1JfRURJVDsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgTk9STUFMSVpFRF9TUEFUSUFMX0RJU1RBTkNFX1RIUkVTSE9MRF9GT1JfRURJVDsKIAogIHByaXZhdGU6CiAgICAgRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFNjb3JpbmdQYXJhbXMpOwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3R5cGluZy90eXBpbmdfdHJhdmVyc2FsLmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ190cmF2ZXJzYWwuaAppbmRleCA5ZjgzNDc0Li4xMjExMGQ1IDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ190cmF2ZXJzYWwuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ190cmF2ZXJzYWwuaApAQCAtMzksMTQgKzM5LDIxIEBACiAKICAgICBBS19GT1JDRV9JTkxJTkUgYm9vbCBhbGxvd3NFcnJvckNvcnJlY3Rpb25zKGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGRpY05vZGUtPmdldE5vcm1hbGl6ZWRTcGF0aWFsRGlzdGFuY2UoKQotICAgICAgICAgICAgICAgIDwgU2NvcmluZ1BhcmFtczo6TUFYX05PUk1fRElTVEFOQ0VfRk9SX0VESVQ7CisgICAgICAgICAgICAgICAgPCBTY29yaW5nUGFyYW1zOjpOT1JNQUxJWkVEX1NQQVRJQUxfRElTVEFOQ0VfVEhSRVNIT0xEX0ZPUl9FRElUOwogICAgIH0KIAogICAgIEFLX0ZPUkNFX0lOTElORSBib29sIGlzT21pc3Npb24oY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCi0gICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLCBjb25zdCBEaWNOb2RlICpjb25zdCBjaGlsZERpY05vZGUpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUsIGNvbnN0IERpY05vZGUgKmNvbnN0IGNoaWxkRGljTm9kZSwKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgYWxsb3dzRXJyb3JDb3JyZWN0aW9ucykgY29uc3QgewogICAgICAgICBpZiAoIUNPUlJFQ1RfT01JU1NJT04pIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBBbHdheXMgY29uc2lkZXIgaW50ZW50aW9uYWwgb21pc3Npb25zIChsaWtlIGFwb3N0cm9waGVzKSBzaW5jZSB0aGV5IGFyZSBjb21tb24uCisgICAgICAgIGNvbnN0IGJvb2wgY2FuQ29uc2lkZXJPbWlzc2lvbiA9CisgICAgICAgICAgICAgICAgYWxsb3dzRXJyb3JDb3JyZWN0aW9ucyB8fCBjaGlsZERpY05vZGUtPmNhbkJlSW50ZW50aW9uYWxPbWlzc2lvbigpOworICAgICAgICBpZiAoIWNhbkNvbnNpZGVyT21pc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBjb25zdCBpbnQgaW5wdXRTaXplID0gdHJhdmVyc2VTZXNzaW9uLT5nZXRJbnB1dFNpemUoKTsKICAgICAgICAgLy8gVE9ETzogRG9uJ3QgcmVmZXIgdG8gaXNDb21wbGV0aW9uPwogICAgICAgICBpZiAoZGljTm9kZS0+aXNDb21wbGV0aW9uKGlucHV0U2l6ZSkpIHsKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvcG9saWN5aW1wbC90eXBpbmcvdHlwaW5nX3dlaWdodGluZy5jcHAgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ193ZWlnaHRpbmcuY3BwCmluZGV4IDE1MDAzNDEuLmU0YzY5ZDEgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvcG9saWN5aW1wbC90eXBpbmcvdHlwaW5nX3dlaWdodGluZy5jcHAKKysrIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3R5cGluZy90eXBpbmdfd2VpZ2h0aW5nLmNwcApAQCAtMjAsNSArMjAsNDEgQEAKICNpbmNsdWRlICJzdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3Njb3JpbmdfcGFyYW1zLmgiCiAKIG5hbWVzcGFjZSBsYXRpbmltZSB7CisKIGNvbnN0IFR5cGluZ1dlaWdodGluZyBUeXBpbmdXZWlnaHRpbmc6OnNJbnN0YW5jZTsKKworRXJyb3JUeXBlIFR5cGluZ1dlaWdodGluZzo6Z2V0RXJyb3JUeXBlKGNvbnN0IENvcnJlY3Rpb25UeXBlIGNvcnJlY3Rpb25UeXBlLAorICAgICAgICBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwgY29uc3QgRGljTm9kZSAqY29uc3QgcGFyZW50RGljTm9kZSwKKyAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSkgY29uc3QgeworICAgIHN3aXRjaCAoY29ycmVjdGlvblR5cGUpIHsKKyAgICAgICAgY2FzZSBDVF9NQVRDSDoKKyAgICAgICAgICAgIGlmIChpc1Byb3hpbWl0eURpY05vZGUodHJhdmVyc2VTZXNzaW9uLCBkaWNOb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFVF9QUk9YSU1JVFlfQ09SUkVDVElPTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVUX05PVF9BTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBDVF9BRERJVElPTkFMX1BST1hJTUlUWToKKyAgICAgICAgICAgIHJldHVybiBFVF9QUk9YSU1JVFlfQ09SUkVDVElPTjsKKyAgICAgICAgY2FzZSBDVF9PTUlTU0lPTjoKKyAgICAgICAgICAgIGlmIChwYXJlbnREaWNOb2RlLT5jYW5CZUludGVudGlvbmFsT21pc3Npb24oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFVF9JTlRFTlRJT05BTF9PTUlTU0lPTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVUX0VESVRfQ09SUkVDVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUX1NVQlNUSVRVVElPTjoKKyAgICAgICAgY2FzZSBDVF9JTlNFUlRJT046CisgICAgICAgIGNhc2UgQ1RfVFJBTlNQT1NJVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFVF9FRElUX0NPUlJFQ1RJT047CisgICAgICAgIGNhc2UgQ1RfTkVXX1dPUkRfU1BBQ0VfT01JVFRJT046CisgICAgICAgIGNhc2UgQ1RfTkVXX1dPUkRfU1BBQ0VfU1VCU1RJVFVUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEVUX05FV19XT1JEOworICAgICAgICBjYXNlIENUX1RFUk1JTkFMOgorICAgICAgICAgICAgcmV0dXJuIEVUX05PVF9BTl9FUlJPUjsKKyAgICAgICAgY2FzZSBDVF9DT01QTEVUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEVUX0NPTVBMRVRJT047CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRVRfTk9UX0FOX0VSUk9SOworICAgIH0KK30KIH0gIC8vIG5hbWVzcGFjZSBsYXRpbmltZQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3R5cGluZy90eXBpbmdfd2VpZ2h0aW5nLmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ193ZWlnaHRpbmcuaAppbmRleCA3NGU0ZTM0Li4zOTM4YzBlIDEwMDY0NAotLS0gYS9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ193ZWlnaHRpbmcuaAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdHlwaW5nL3R5cGluZ193ZWlnaHRpbmcuaApAQCAtMjgsMTQgKzI4LDE1IEBACiAKIGNsYXNzIERpY05vZGU7CiBzdHJ1Y3QgRGljTm9kZV9JbnB1dFN0YXRlRzsKK2NsYXNzIE11bHRpQmlncmFtTWFwOwogCiBjbGFzcyBUeXBpbmdXZWlnaHRpbmcgOiBwdWJsaWMgV2VpZ2h0aW5nIHsKICBwdWJsaWM6CiAgICAgc3RhdGljIGNvbnN0IFR5cGluZ1dlaWdodGluZyAqZ2V0SW5zdGFuY2UoKSB7IHJldHVybiAmc0luc3RhbmNlOyB9CiAKICBwcm90ZWN0ZWQ6Ci0gICAgZmxvYXQgZ2V0VGVybWluYWxTcGF0aWFsQ29zdCgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCB7CisgICAgZmxvYXQgZ2V0VGVybWluYWxTcGF0aWFsQ29zdChjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0IHsKICAgICAgICAgZmxvYXQgY29zdCA9IDAuMGY7CiAgICAgICAgIGlmIChkaWNOb2RlLT5oYXNNdWx0aXBsZVdvcmRzKCkpIHsKICAgICAgICAgICAgIGNvc3QgKz0gU2NvcmluZ1BhcmFtczo6SEFTX01VTFRJX1dPUkRfVEVSTUlOQUxfQ09TVDsKQEAgLTUwLDEzICs1MSwxNCBAQAogICAgIH0KIAogICAgIGZsb2F0IGdldE9taXNzaW9uQ29zdChjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCB7Ci0gICAgICAgIGJvb2wgc2FtZUNvZGVQb2ludCA9IGZhbHNlOwotICAgICAgICBib29sIGlzRmlyc3RMZXR0ZXJPbWlzc2lvbiA9IGZhbHNlOwotICAgICAgICBmbG9hdCBjb3N0ID0gMC4wZjsKLSAgICAgICAgc2FtZUNvZGVQb2ludCA9IGRpY05vZGUtPmlzU2FtZU5vZGVDb2RlUG9pbnQocGFyZW50RGljTm9kZSk7CisgICAgICAgIGNvbnN0IGJvb2wgaXNaZXJvQ29zdE9taXNzaW9uID0gcGFyZW50RGljTm9kZS0+aXNaZXJvQ29zdE9taXNzaW9uKCk7CisgICAgICAgIGNvbnN0IGJvb2wgc2FtZUNvZGVQb2ludCA9IGRpY05vZGUtPmlzU2FtZU5vZGVDb2RlUG9pbnQocGFyZW50RGljTm9kZSk7CiAgICAgICAgIC8vIElmIHRoZSB0cmF2ZXJzYWwgb21pdHRlZCB0aGUgZmlyc3QgbGV0dGVyIHRoZW4gdGhlIGRpY05vZGUgc2hvdWxkIG5vdyBiZSBvbiB0aGUgc2Vjb25kLgotICAgICAgICBpc0ZpcnN0TGV0dGVyT21pc3Npb24gPSBkaWNOb2RlLT5nZXREZXB0aCgpID09IDI7Ci0gICAgICAgIGlmIChpc0ZpcnN0TGV0dGVyT21pc3Npb24pIHsKKyAgICAgICAgY29uc3QgYm9vbCBpc0ZpcnN0TGV0dGVyT21pc3Npb24gPSBkaWNOb2RlLT5nZXREZXB0aCgpID09IDI7CisgICAgICAgIGZsb2F0IGNvc3QgPSAwLjBmOworICAgICAgICBpZiAoaXNaZXJvQ29zdE9taXNzaW9uKSB7CisgICAgICAgICAgICBjb3N0ID0gMC4wZjsKKyAgICAgICAgfSBlbHNlIGlmIChpc0ZpcnN0TGV0dGVyT21pc3Npb24pIHsKICAgICAgICAgICAgIGNvc3QgPSBTY29yaW5nUGFyYW1zOjpPTUlTU0lPTl9DT1NUX0ZJUlNUX0NIQVI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb3N0ID0gc2FtZUNvZGVQb2ludCA/IFNjb3JpbmdQYXJhbXM6Ok9NSVNTSU9OX0NPU1RfU0FNRV9DSEFSCkBAIC02NSw5ICs2Nyw4IEBACiAgICAgICAgIHJldHVybiBjb3N0OwogICAgIH0KIAotICAgIGZsb2F0IGdldE1hdGNoZWRDb3N0KAotICAgICAgICAgICAgY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUsCi0gICAgICAgICAgICBEaWNOb2RlX0lucHV0U3RhdGVHICppbnB1dFN0YXRlRykgY29uc3QgeworICAgIGZsb2F0IGdldE1hdGNoZWRDb3N0KGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAorICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSwgRGljTm9kZV9JbnB1dFN0YXRlRyAqaW5wdXRTdGF0ZUcpIGNvbnN0IHsKICAgICAgICAgY29uc3QgaW50IHBvaW50SW5kZXggPSBkaWNOb2RlLT5nZXRJbnB1dEluZGV4KDApOwogICAgICAgICAvLyBOb3RlOiBtaW4oKSByZXF1aXJlZCBzaW5jZSBsZW5ndGggY2FuIGJlIE1BWF9QT0lOVF9UT19LRVlfTEVOR1RIIGZvciBjaGFyYWN0ZXJzIG5vdCBvbgogICAgICAgICAvLyB0aGUga2V5Ym9hcmQgKGxpa2UgYWNjZW50ZWQgbGV0dGVycykKQEAgLTc5LDEzICs4MCwyMyBAQAogCiAgICAgICAgIGNvbnN0IGJvb2wgaXNGaXJzdENoYXIgPSBwb2ludEluZGV4ID09IDA7CiAgICAgICAgIGNvbnN0IGJvb2wgaXNQcm94aW1pdHkgPSBpc1Byb3hpbWl0eURpY05vZGUodHJhdmVyc2VTZXNzaW9uLCBkaWNOb2RlKTsKLSAgICAgICAgY29uc3QgZmxvYXQgY29zdCA9IGlzUHJveGltaXR5ID8gKGlzRmlyc3RDaGFyID8gU2NvcmluZ1BhcmFtczo6RklSU1RfUFJPWElNSVRZX0NPU1QKKyAgICAgICAgZmxvYXQgY29zdCA9IGlzUHJveGltaXR5ID8gKGlzRmlyc3RDaGFyID8gU2NvcmluZ1BhcmFtczo6RklSU1RfUFJPWElNSVRZX0NPU1QKICAgICAgICAgICAgICAgICA6IFNjb3JpbmdQYXJhbXM6OlBST1hJTUlUWV9DT1NUKSA6IDAuMGY7CisgICAgICAgIGlmIChkaWNOb2RlLT5nZXREZXB0aCgpID09IDIpIHsKKyAgICAgICAgICAgIC8vIEF0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IHdvcmQsIHdlIGNoZWNrIGlmIHRoZSBmaXJzdCBjaGFyIGlzIHVwcGVyY2FzZQorICAgICAgICAgICAgLy8gYW5kIHRoZSB3b3JkIGlzIGEgc2Vjb25kIG9yIGxhdGVyIHdvcmQgb2YgYSBtdWx0aXBsZSB3b3JkIHN1Z2dlc3Rpb24uIFdlIGRlbW90ZSBpdAorICAgICAgICAgICAgLy8gaWYgc28uCisgICAgICAgICAgICBjb25zdCBib29sIGlzU2Vjb25kT3JMYXRlcldvcmRGaXJzdENoYXJVcHBlcmNhc2UgPQorICAgICAgICAgICAgICAgICAgICBkaWNOb2RlLT5oYXNNdWx0aXBsZVdvcmRzKCkgJiYgZGljTm9kZS0+aXNGaXJzdENoYXJVcHBlcmNhc2UoKTsKKyAgICAgICAgICAgIGlmIChpc1NlY29uZE9yTGF0ZXJXb3JkRmlyc3RDaGFyVXBwZXJjYXNlKSB7CisgICAgICAgICAgICAgICAgY29zdCArPSBTY29yaW5nUGFyYW1zOjpDT1NUX1NFQ09ORF9PUl9MQVRFUl9XT1JEX0ZJUlNUX0NIQVJfVVBQRVJDQVNFOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJldHVybiB3ZWlnaHRlZERpc3RhbmNlICsgY29zdDsKICAgICB9CiAKLSAgICBib29sIGlzUHJveGltaXR5RGljTm9kZSgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCB7CisgICAgYm9vbCBpc1Byb3hpbWl0eURpY05vZGUoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCisgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCB7CiAgICAgICAgIGNvbnN0IGludCBwb2ludEluZGV4ID0gZGljTm9kZS0+Z2V0SW5wdXRJbmRleCgwKTsKICAgICAgICAgY29uc3QgaW50IHByaW1hcnlDb2RlUG9pbnQgPSB0b0Jhc2VMb3dlckNhc2UoCiAgICAgICAgICAgICAgICAgdHJhdmVyc2VTZXNzaW9uLT5nZXRQcm94aW1pdHlJbmZvU3RhdGUoMCktPmdldFByaW1hcnlDb2RlUG9pbnRBdChwb2ludEluZGV4KSk7CkBAIC05Myw5ICsxMDQsOCBAQAogICAgICAgICByZXR1cm4gcHJpbWFyeUNvZGVQb2ludCAhPSBkaWNOb2RlQ2hhcjsKICAgICB9CiAKLSAgICBmbG9hdCBnZXRUcmFuc3Bvc2l0aW9uQ29zdCgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLAotICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSkgY29uc3QgeworICAgIGZsb2F0IGdldFRyYW5zcG9zaXRpb25Db3N0KGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAorICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgcGFyZW50RGljTm9kZSwgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSkgY29uc3QgewogICAgICAgICBjb25zdCBpbnQxNl90IHBhcmVudFBvaW50SW5kZXggPSBwYXJlbnREaWNOb2RlLT5nZXRJbnB1dEluZGV4KDApOwogICAgICAgICBjb25zdCBpbnQgcHJldkNvZGVQb2ludCA9IHBhcmVudERpY05vZGUtPmdldE5vZGVDb2RlUG9pbnQoKTsKICAgICAgICAgY29uc3QgZmxvYXQgZGlzdGFuY2UxID0gdHJhdmVyc2VTZXNzaW9uLT5nZXRQcm94aW1pdHlJbmZvU3RhdGUoMCktPmdldFBvaW50VG9LZXlMZW5ndGgoCkBAIC0xMDksOCArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIFNjb3JpbmdQYXJhbXM6OlRSQU5TUE9TSVRJT05fQ09TVCArIHdlaWdodGVkTGVuZ3RoRGlzdGFuY2U7CiAgICAgfQogCi0gICAgZmxvYXQgZ2V0SW5zZXJ0aW9uQ29zdCgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAorICAgIGZsb2F0IGdldEluc2VydGlvbkNvc3QoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCiAgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBwYXJlbnREaWNOb2RlLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlKSBjb25zdCB7CiAgICAgICAgIGNvbnN0IGludDE2X3QgcGFyZW50UG9pbnRJbmRleCA9IHBhcmVudERpY05vZGUtPmdldElucHV0SW5kZXgoMCk7CiAgICAgICAgIGNvbnN0IGludCBwcmV2Q29kZVBvaW50ID0KQEAgLTEzMCwxNyArMTM5LDE0IEBACiAKICAgICBmbG9hdCBnZXROZXdXb3JkQ29zdChjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgYm9vbCBpc0NhcGl0YWxpemVkID0gZGljTm9kZS0+aXNDYXBpdGFsaXplZCgpOwotICAgICAgICBjb25zdCBmbG9hdCBjb3N0ID0gaXNDYXBpdGFsaXplZCA/Ci0gICAgICAgICAgICAgICAgU2NvcmluZ1BhcmFtczo6Q09TVF9ORVdfV09SRF9DQVBJVEFMSVpFRCA6IFNjb3JpbmdQYXJhbXM6OkNPU1RfTkVXX1dPUkQ7Ci0gICAgICAgIHJldHVybiBjb3N0ICogdHJhdmVyc2VTZXNzaW9uLT5nZXRNdWx0aVdvcmRDb3N0TXVsdGlwbGllcigpOworICAgICAgICByZXR1cm4gU2NvcmluZ1BhcmFtczo6Q09TVF9ORVdfV09SRCAqIHRyYXZlcnNlU2Vzc2lvbi0+Z2V0TXVsdGlXb3JkQ29zdE11bHRpcGxpZXIoKTsKICAgICB9CiAKLSAgICBmbG9hdCBnZXROZXdXb3JkQmlncmFtQ29zdCgKLSAgICAgICAgICAgIGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLCBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLAotICAgICAgICAgICAgaGFzaF9tYXBfY29tcGF0PGludCwgaW50MTZfdD4gKmNvbnN0IGJpZ3JhbUNhY2hlTWFwKSBjb25zdCB7CisgICAgZmxvYXQgZ2V0TmV3V29yZEJpZ3JhbUNvc3QoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCisgICAgICAgICAgICBjb25zdCBEaWNOb2RlICpjb25zdCBkaWNOb2RlLAorICAgICAgICAgICAgTXVsdGlCaWdyYW1NYXAgKmNvbnN0IG11bHRpQmlncmFtTWFwKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBEaWNOb2RlVXRpbHM6OmdldEJpZ3JhbU5vZGVJbXByb2JhYmlsaXR5KHRyYXZlcnNlU2Vzc2lvbi0+Z2V0T2Zmc2V0RGljdCgpLAotICAgICAgICAgICAgICAgIGRpY05vZGUsIGJpZ3JhbUNhY2hlTWFwKTsKKyAgICAgICAgICAgICAgICBkaWNOb2RlLCBtdWx0aUJpZ3JhbU1hcCkgKiBTY29yaW5nUGFyYW1zOjpESVNUQU5DRV9XRUlHSFRfTEFOR1VBR0U7CiAgICAgfQogCiAgICAgZmxvYXQgZ2V0Q29tcGxldGlvbkNvc3QoY29uc3QgRGljVHJhdmVyc2VTZXNzaW9uICpjb25zdCB0cmF2ZXJzZVNlc3Npb24sCkBAIC0xNTYsMjEgKzE2Miw5IEBACiAKICAgICBmbG9hdCBnZXRUZXJtaW5hbExhbmd1YWdlQ29zdChjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUsIGNvbnN0IGZsb2F0IGRpY05vZGVMYW5ndWFnZUltcHJvYmFiaWxpdHkpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgYm9vbCBoYXNFZGl0Q291bnQgPSBkaWNOb2RlLT5nZXRFZGl0Q29ycmVjdGlvbkNvdW50KCkgPiAwOwotICAgICAgICBjb25zdCBib29sIGlzU2FtZUxlbmd0aCA9IGRpY05vZGUtPmdldERlcHRoKCkgPT0gdHJhdmVyc2VTZXNzaW9uLT5nZXRJbnB1dFNpemUoKTsKLSAgICAgICAgY29uc3QgYm9vbCBoYXNNdWx0aXBsZVdvcmRzID0gZGljTm9kZS0+aGFzTXVsdGlwbGVXb3JkcygpOwotICAgICAgICBjb25zdCBib29sIGhhc1Byb3hpbWl0eUVycm9ycyA9IGRpY05vZGUtPmdldFByb3hpbWl0eUNvcnJlY3Rpb25Db3VudCgpID4gMDsKLSAgICAgICAgLy8gR2VzdHVyZSBpbnB1dCBpcyBhbHdheXMgYXNzdW1lZCB0byBoYXZlIHByb3hpbWl0eSBlcnJvcnMKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgaW5wdXQgd29yZCBzaG91bGRuJ3QgYmUgdHJlYXRlZCBhcyBwZXJmZWN0Ci0gICAgICAgIGNvbnN0IGJvb2wgaXNFeGFjdE1hdGNoID0gIWhhc0VkaXRDb3VudCAmJiAhaGFzTXVsdGlwbGVXb3JkcwotICAgICAgICAgICAgICAgICYmICFoYXNQcm94aW1pdHlFcnJvcnMgJiYgaXNTYW1lTGVuZ3RoOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IHRvdGFsUHJldldvcmRzTGFuZ3VhZ2VDb3N0ID0gZGljTm9kZS0+Z2V0VG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QoKTsKLSAgICAgICAgY29uc3QgZmxvYXQgbGFuZ3VhZ2VJbXByb2JhYmlsaXR5ID0gaXNFeGFjdE1hdGNoID8gMC4wZiA6IGRpY05vZGVMYW5ndWFnZUltcHJvYmFiaWxpdHk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IGxhbmd1YWdlV2VpZ2h0ID0gU2NvcmluZ1BhcmFtczo6RElTVEFOQ0VfV0VJR0hUX0xBTkdVQUdFOwotICAgICAgICAvLyBUT0RPOiBDYXZlYXQ6IFRoZSBmb2xsb3dpbmcgZXF1YXRpb24gc2hvdWxkIGJlOgotICAgICAgICAvLyB0b3RhbFByZXZXb3Jkc0xhbmd1YWdlQ29zdCArIChsYW5ndWFnZUltcHJvYmFiaWxpdHkgKiBsYW5ndWFnZVdlaWdodCk7Ci0gICAgICAgIHJldHVybiAodG90YWxQcmV2V29yZHNMYW5ndWFnZUNvc3QgKyBsYW5ndWFnZUltcHJvYmFiaWxpdHkpICogbGFuZ3VhZ2VXZWlnaHQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGxhbmd1YWdlSW1wcm9iYWJpbGl0eSA9IChkaWNOb2RlLT5pc0V4YWN0TWF0Y2goKSkgPworICAgICAgICAgICAgICAgIDAuMGYgOiBkaWNOb2RlTGFuZ3VhZ2VJbXByb2JhYmlsaXR5OworICAgICAgICByZXR1cm4gbGFuZ3VhZ2VJbXByb2JhYmlsaXR5ICogU2NvcmluZ1BhcmFtczo6RElTVEFOQ0VfV0VJR0hUX0xBTkdVQUdFOwogICAgIH0KIAogICAgIEFLX0ZPUkNFX0lOTElORSBib29sIG5lZWRzVG9Ob3JtYWxpemVDb21wb3VuZERpc3RhbmNlKCkgY29uc3QgewpAQCAtMTg1LDE1ICsxNzksMTYgQEAKICAgICAgICAgcmV0dXJuIFNjb3JpbmdQYXJhbXM6OlNVQlNUSVRVVElPTl9DT1NUOwogICAgIH0KIAotICAgIEFLX0ZPUkNFX0lOTElORSBmbG9hdCBnZXRTcGFjZVN1YnN0aXR1dGlvbkNvc3QoCi0gICAgICAgICAgICBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKKyAgICBBS19GT1JDRV9JTkxJTkUgZmxvYXQgZ2V0U3BhY2VTdWJzdGl0dXRpb25Db3N0KGNvbnN0IERpY1RyYXZlcnNlU2Vzc2lvbiAqY29uc3QgdHJhdmVyc2VTZXNzaW9uLAogICAgICAgICAgICAgY29uc3QgRGljTm9kZSAqY29uc3QgZGljTm9kZSkgY29uc3QgewotICAgICAgICBjb25zdCBib29sIGlzQ2FwaXRhbGl6ZWQgPSBkaWNOb2RlLT5pc0NhcGl0YWxpemVkKCk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IGNvc3QgPSBTY29yaW5nUGFyYW1zOjpTUEFDRV9TVUJTVElUVVRJT05fQ09TVCArIChpc0NhcGl0YWxpemVkID8KLSAgICAgICAgICAgICAgICBTY29yaW5nUGFyYW1zOjpDT1NUX05FV19XT1JEX0NBUElUQUxJWkVEIDogU2NvcmluZ1BhcmFtczo6Q09TVF9ORVdfV09SRCk7CisgICAgICAgIGNvbnN0IGZsb2F0IGNvc3QgPSBTY29yaW5nUGFyYW1zOjpTUEFDRV9TVUJTVElUVVRJT05fQ09TVCArIFNjb3JpbmdQYXJhbXM6OkNPU1RfTkVXX1dPUkQ7CiAgICAgICAgIHJldHVybiBjb3N0ICogdHJhdmVyc2VTZXNzaW9uLT5nZXRNdWx0aVdvcmRDb3N0TXVsdGlwbGllcigpOwogICAgIH0KIAorICAgIEVycm9yVHlwZSBnZXRFcnJvclR5cGUoY29uc3QgQ29ycmVjdGlvblR5cGUgY29ycmVjdGlvblR5cGUsCisgICAgICAgICAgICBjb25zdCBEaWNUcmF2ZXJzZVNlc3Npb24gKmNvbnN0IHRyYXZlcnNlU2Vzc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IERpY05vZGUgKmNvbnN0IHBhcmVudERpY05vZGUsIGNvbnN0IERpY05vZGUgKmNvbnN0IGRpY05vZGUpIGNvbnN0OworCiAgcHJpdmF0ZToKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwaW5nV2VpZ2h0aW5nKTsKICAgICBzdGF0aWMgY29uc3QgVHlwaW5nV2VpZ2h0aW5nIHNJbnN0YW5jZTsKZGlmZiAtLWdpdCBhL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvcG9saWN5aW1wbC91dGlscy9kYW1lcmF1X2xldmVuc2h0ZWluX2VkaXRfZGlzdGFuY2VfcG9saWN5LmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdXRpbHMvZGFtZXJhdV9sZXZlbnNodGVpbl9lZGl0X2Rpc3RhbmNlX3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTQ1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdXRpbHMvZGFtZXJhdV9sZXZlbnNodGVpbl9lZGl0X2Rpc3RhbmNlX3BvbGljeS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIExBVElOSU1FX0RBRU1BUlVfTEVWRU5TSFRFSU5fRURJVF9ESVNUQU5DRV9QT0xJQ1lfSAorI2RlZmluZSBMQVRJTklNRV9EQUVNQVJVX0xFVkVOU0hURUlOX0VESVRfRElTVEFOQ0VfUE9MSUNZX0gKKworI2luY2x1ZGUgImNoYXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzdWdnZXN0L3BvbGljeWltcGwvdXRpbHMvZWRpdF9kaXN0YW5jZV9wb2xpY3kuaCIKKworbmFtZXNwYWNlIGxhdGluaW1lIHsKKworY2xhc3MgRGFtZXJhdUxldmVuc2h0ZWluRWRpdERpc3RhbmNlUG9saWN5IDogcHVibGljIEVkaXREaXN0YW5jZVBvbGljeSB7CisgcHVibGljOgorICAgIERhbWVyYXVMZXZlbnNodGVpbkVkaXREaXN0YW5jZVBvbGljeShjb25zdCBpbnQgKmNvbnN0IHN0cmluZzAsIGNvbnN0IGludCBsZW5ndGgwLAorICAgICAgICAgICAgY29uc3QgaW50ICpjb25zdCBzdHJpbmcxLCBjb25zdCBpbnQgbGVuZ3RoMSkKKyAgICAgICAgICAgIDogbVN0cmluZzAoc3RyaW5nMCksIG1TdHJpbmcwTGVuZ3RoKGxlbmd0aDApLCBtU3RyaW5nMShzdHJpbmcxKSwKKyAgICAgICAgICAgICAgbVN0cmluZzFMZW5ndGgobGVuZ3RoMSkge30KKyAgICB+RGFtZXJhdUxldmVuc2h0ZWluRWRpdERpc3RhbmNlUG9saWN5KCkge30KKworICAgIEFLX0ZPUkNFX0lOTElORSBmbG9hdCBnZXRTdWJzdGl0dXRpb25Db3N0KGNvbnN0IGludCBpbmRleDAsIGNvbnN0IGludCBpbmRleDEpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgaW50IGMwID0gdG9CYXNlTG93ZXJDYXNlKG1TdHJpbmcwW2luZGV4MF0pOworICAgICAgICBjb25zdCBpbnQgYzEgPSB0b0Jhc2VMb3dlckNhc2UobVN0cmluZzFbaW5kZXgxXSk7CisgICAgICAgIHJldHVybiAoYzAgPT0gYzEpID8gMC4wZiA6IDEuMGY7CisgICAgfQorCisgICAgQUtfRk9SQ0VfSU5MSU5FIGZsb2F0IGdldERlbGV0aW9uQ29zdChjb25zdCBpbnQgaW5kZXgwLCBjb25zdCBpbnQgaW5kZXgxKSBjb25zdCB7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKworICAgIEFLX0ZPUkNFX0lOTElORSBmbG9hdCBnZXRJbnNlcnRpb25Db3N0KGNvbnN0IGludCBpbmRleDAsIGNvbnN0IGludCBpbmRleDEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorCisgICAgQUtfRk9SQ0VfSU5MSU5FIGJvb2wgYWxsb3dUcmFuc3Bvc2l0aW9uKGNvbnN0IGludCBpbmRleDAsIGNvbnN0IGludCBpbmRleDEpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgaW50IGMwID0gdG9CYXNlTG93ZXJDYXNlKG1TdHJpbmcwW2luZGV4MF0pOworICAgICAgICBjb25zdCBpbnQgYzEgPSB0b0Jhc2VMb3dlckNhc2UobVN0cmluZzFbaW5kZXgxXSk7CisgICAgICAgIGlmIChpbmRleDAgPiAwICYmIGluZGV4MSA+IDAgJiYgYzAgPT0gdG9CYXNlTG93ZXJDYXNlKG1TdHJpbmcxW2luZGV4MSAtIDFdKQorICAgICAgICAgICAgICAgICYmIGMxID09IHRvQmFzZUxvd2VyQ2FzZShtU3RyaW5nMFtpbmRleDAgLSAxXSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBS19GT1JDRV9JTkxJTkUgZmxvYXQgZ2V0VHJhbnNwb3NpdGlvbkNvc3QoY29uc3QgaW50IGluZGV4MCwgY29uc3QgaW50IGluZGV4MSkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0U3Vic3RpdHV0aW9uQ29zdChpbmRleDAsIGluZGV4MSk7CisgICAgfQorCisgICAgQUtfRk9SQ0VfSU5MSU5FIGludCBnZXRTdHJpbmcwTGVuZ3RoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmluZzBMZW5ndGg7CisgICAgfQorCisgICAgQUtfRk9SQ0VfSU5MSU5FIGludCBnZXRTdHJpbmcxTGVuZ3RoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmluZzFMZW5ndGg7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04gKERhbWVyYXVMZXZlbnNodGVpbkVkaXREaXN0YW5jZVBvbGljeSk7CisKKyAgICBjb25zdCBpbnQgKmNvbnN0IG1TdHJpbmcwOworICAgIGNvbnN0IGludCBtU3RyaW5nMExlbmd0aDsKKyAgICBjb25zdCBpbnQgKmNvbnN0IG1TdHJpbmcxOworICAgIGNvbnN0IGludCBtU3RyaW5nMUxlbmd0aDsKK307Cit9IC8vIG5hbWVzcGFjZSBsYXRpbmltZQorCisjZW5kaWYgIC8vIExBVElOSU1FX0RBRU1BUlVfTEVWRU5TSFRFSU5fRURJVF9ESVNUQU5DRV9QT0xJQ1lfSApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3V0aWxzL2VkaXRfZGlzdGFuY2UuaCBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvcG9saWN5aW1wbC91dGlscy9lZGl0X2Rpc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiZDY2OAotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9qbmkvc3JjL3N1Z2dlc3QvcG9saWN5aW1wbC91dGlscy9lZGl0X2Rpc3RhbmNlLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTEFUSU5JTUVfRURJVF9ESVNUQU5DRV9ICisjZGVmaW5lIExBVElOSU1FX0VESVRfRElTVEFOQ0VfSAorCisjaW5jbHVkZSAiZGVmaW5lcy5oIgorI2luY2x1ZGUgInN1Z2dlc3QvcG9saWN5aW1wbC91dGlscy9lZGl0X2Rpc3RhbmNlX3BvbGljeS5oIgorCituYW1lc3BhY2UgbGF0aW5pbWUgeworCitjbGFzcyBFZGl0RGlzdGFuY2UgeworIHB1YmxpYzoKKyAgICAvLyBDQVZFQVQ6IFRoZXJlIG1heSBiZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGlmIHlvdSBuZWVkIHRoZSBlZGl0IGRpc3RhbmNlIGFzIGFuIGludGVnZXIgdmFsdWUuCisgICAgQUtfRk9SQ0VfSU5MSU5FIHN0YXRpYyBmbG9hdCBnZXRFZGl0RGlzdGFuY2UoY29uc3QgRWRpdERpc3RhbmNlUG9saWN5ICpjb25zdCBwb2xpY3kpIHsKKyAgICAgICAgY29uc3QgaW50IGJlZm9yZUxlbmd0aCA9IHBvbGljeS0+Z2V0U3RyaW5nMExlbmd0aCgpOworICAgICAgICBjb25zdCBpbnQgYWZ0ZXJMZW5ndGggPSBwb2xpY3ktPmdldFN0cmluZzFMZW5ndGgoKTsKKyAgICAgICAgZmxvYXQgZHBbKGJlZm9yZUxlbmd0aCArIDEpICogKGFmdGVyTGVuZ3RoICsgMSldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBiZWZvcmVMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZHBbKGFmdGVyTGVuZ3RoICsgMSkgKiBpXSA9IGkgKiBwb2xpY3ktPmdldEluc2VydGlvbkNvc3QoaSAtIDEsIC0xKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBhZnRlckxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBkcFtpXSA9IGkgKiBwb2xpY3ktPmdldERlbGV0aW9uQ29zdCgtMSwgaSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZWZvcmVMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhZnRlckxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgZHBbKGFmdGVyTGVuZ3RoICsgMSkgKiAoaSArIDEpICsgKGogKyAxKV0gPSBtaW4oCisgICAgICAgICAgICAgICAgICAgICAgICBkcFsoYWZ0ZXJMZW5ndGggKyAxKSAqIGkgKyAoaiArIDEpXSArIHBvbGljeS0+Z2V0SW5zZXJ0aW9uQ29zdChpLCBqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbihkcFsoYWZ0ZXJMZW5ndGggKyAxKSAqIChpICsgMSkgKyBqXSArIHBvbGljeS0+Z2V0RGVsZXRpb25Db3N0KGksIGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcFsoYWZ0ZXJMZW5ndGggKyAxKSAqIGkgKyBqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcG9saWN5LT5nZXRTdWJzdGl0dXRpb25Db3N0KGksIGopKSk7CisgICAgICAgICAgICAgICAgaWYgKHBvbGljeS0+YWxsb3dUcmFuc3Bvc2l0aW9uKGksIGopKSB7CisgICAgICAgICAgICAgICAgICAgIGRwWyhhZnRlckxlbmd0aCArIDEpICogKGkgKyAxKSArIChqICsgMSldID0gbWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwWyhhZnRlckxlbmd0aCArIDEpICogKGkgKyAxKSArIChqICsgMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwWyhhZnRlckxlbmd0aCArIDEpICogKGkgLSAxKSArIChqIC0gMSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBvbGljeS0+Z2V0VHJhbnNwb3NpdGlvbkNvc3QoaSwgaikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfRURJVF9ESVNUQU5DRSkgeworICAgICAgICAgICAgQUtMT0dJKCJJTiA9ICVkLCBPVVQgPSAlZCIsIGJlZm9yZUxlbmd0aCwgYWZ0ZXJMZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZWZvcmVMZW5ndGggKyAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFmdGVyTGVuZ3RoICsgMTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIEFLTE9HSSgiRURJVFslZF1bJWRdLCAlZiIsIGksIGosIGRwWyhhZnRlckxlbmd0aCArIDEpICogaSArIGpdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRwWyhiZWZvcmVMZW5ndGggKyAxKSAqIChhZnRlckxlbmd0aCArIDEpIC0gMV07CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoRWRpdERpc3RhbmNlKTsKK307Cit9IC8vIG5hbWVzcGFjZSBsYXRpbmltZQorCisjZW5kaWYgIC8vIExBVElOSU1FX0VESVRfRElTVEFOQ0VfSApkaWZmIC0tZ2l0IGEvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3V0aWxzL2VkaXRfZGlzdGFuY2VfcG9saWN5LmggYi9uYXRpdmUvam5pL3NyYy9zdWdnZXN0L3BvbGljeWltcGwvdXRpbHMvZWRpdF9kaXN0YW5jZV9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QxNzkyCi0tLSAvZGV2L251bGwKKysrIGIvbmF0aXZlL2puaS9zcmMvc3VnZ2VzdC9wb2xpY3lpbXBsL3V0aWxzL2VkaXRfZGlzdGFuY2VfcG9saWN5LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTEFUSU5JTUVfRURJVF9ESVNUQU5DRV9QT0xJQ1lfSAorI2RlZmluZSBMQVRJTklNRV9FRElUX0RJU1RBTkNFX1BPTElDWV9ICisKKyNpbmNsdWRlICJkZWZpbmVzLmgiCisKK25hbWVzcGFjZSBsYXRpbmltZSB7CisKK2NsYXNzIEVkaXREaXN0YW5jZVBvbGljeSB7CisgcHVibGljOgorICAgIHZpcnR1YWwgZmxvYXQgZ2V0U3Vic3RpdHV0aW9uQ29zdChjb25zdCBpbnQgaW5kZXgwLCBjb25zdCBpbnQgaW5kZXgxKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBmbG9hdCBnZXREZWxldGlvbkNvc3QoY29uc3QgaW50IGluZGV4MCwgY29uc3QgaW50IGluZGV4MSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgZmxvYXQgZ2V0SW5zZXJ0aW9uQ29zdChjb25zdCBpbnQgaW5kZXgwLCBjb25zdCBpbnQgaW5kZXgxKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGFsbG93VHJhbnNwb3NpdGlvbihjb25zdCBpbnQgaW5kZXgwLCBjb25zdCBpbnQgaW5kZXgxKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBmbG9hdCBnZXRUcmFuc3Bvc2l0aW9uQ29zdChjb25zdCBpbnQgaW5kZXgwLCBjb25zdCBpbnQgaW5kZXgxKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgZ2V0U3RyaW5nMExlbmd0aCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRTdHJpbmcxTGVuZ3RoKCkgY29uc3QgPSAwOworCisgcHJvdGVjdGVkOgorICAgIEVkaXREaXN0YW5jZVBvbGljeSgpIHt9CisgICAgdmlydHVhbCB+RWRpdERpc3RhbmNlUG9saWN5KCkge30KKworIHByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVkaXREaXN0YW5jZVBvbGljeSk7Cit9OworfSAvLyBuYW1lc3BhY2UgbGF0aW5pbWUKKworI2VuZGlmICAvLyBMQVRJTklNRV9FRElUX0RJU1RBTkNFX1BPTElDWV9ICmRpZmYgLS1naXQgYS9uYXRpdmUvam5pL3NyYy90ZXJtaW5hbF9hdHRyaWJ1dGVzLmggYi9uYXRpdmUvam5pL3NyYy90ZXJtaW5hbF9hdHRyaWJ1dGVzLmgKaW5kZXggMTQ0YWUxNC4uOTJlZjcxYyAxMDA2NDQKLS0tIGEvbmF0aXZlL2puaS9zcmMvdGVybWluYWxfYXR0cmlidXRlcy5oCisrKyBiL25hdGl2ZS9qbmkvc3JjL3Rlcm1pbmFsX2F0dHJpYnV0ZXMuaApAQCAtNzIsNyArNzIsNyBAQAogICAgIH0KIAogICAgIGJvb2wgaXNCbGFja2xpc3RlZE9yTm90QVdvcmQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtRmxhZ3MgJiAoQmluYXJ5Rm9ybWF0OjpGTEFHX0lTX0JMQUNLTElTVEVEIHwgQmluYXJ5Rm9ybWF0OjpGTEFHX0lTX05PVF9BX1dPUkQpOworICAgICAgICByZXR1cm4gQmluYXJ5Rm9ybWF0OjpoYXNCbGFja2xpc3RlZE9yTm90QVdvcmRGbGFnKG1GbGFncyk7CiAgICAgfQogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9Nb3JlS2V5c0tleWJvYXJkQnVpbGRlckZpeGVkT3JkZXJUZXN0cy5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01vcmVLZXlzS2V5Ym9hcmRCdWlsZGVyRml4ZWRPcmRlclRlc3RzLmphdmEKaW5kZXggNmJiNWFkYS4uMDE4MTRhZSAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01vcmVLZXlzS2V5Ym9hcmRCdWlsZGVyRml4ZWRPcmRlclRlc3RzLmphdmEKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01vcmVLZXlzS2V5Ym9hcmRCdWlsZGVyRml4ZWRPcmRlclRlc3RzLmphdmEKQEAgLTE3LDExICsxNywxMSBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZDsKIAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLk1vcmVLZXlzS2V5Ym9hcmQuTW9yZUtleXNLZXlib2FyZFBhcmFtczsKIAotQFNtYWxsVGVzdAorQE1lZGl1bVRlc3QKIHB1YmxpYyBjbGFzcyBNb3JlS2V5c0tleWJvYXJkQnVpbGRlckZpeGVkT3JkZXJUZXN0cyBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gMTA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDEwOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01vcmVLZXlzS2V5Ym9hcmRCdWlsZGVyVGVzdHMuamF2YSBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9Nb3JlS2V5c0tleWJvYXJkQnVpbGRlclRlc3RzLmphdmEKaW5kZXggOTlkYTQ4MS4uY2U1NTczZCAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL01vcmVLZXlzS2V5Ym9hcmRCdWlsZGVyVGVzdHMuamF2YQorKysgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvTW9yZUtleXNLZXlib2FyZEJ1aWxkZXJUZXN0cy5qYXZhCkBAIC0xNywxMSArMTcsMTEgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQ7CiAKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5Nb3JlS2V5c0tleWJvYXJkLk1vcmVLZXlzS2V5Ym9hcmRQYXJhbXM7CiAKLUBTbWFsbFRlc3QKK0BNZWRpdW1UZXN0CiBwdWJsaWMgY2xhc3MgTW9yZUtleXNLZXlib2FyZEJ1aWxkZXJUZXN0cyBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gMTA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDEwOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0tleVNwZWNQYXJzZXJDc3ZUZXN0cy5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0tleVNwZWNQYXJzZXJDc3ZUZXN0cy5qYXZhCmluZGV4IGQwNWFhYmYuLjkwMTRlN2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlTcGVjUGFyc2VyQ3N2VGVzdHMuamF2YQorKysgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvS2V5U3BlY1BhcnNlckNzdlRlc3RzLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLkNvbGxlY3Rpb25VdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5TdHJpbmdVdGlsczsKQEAgLTI4LDcgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKLUBTbWFsbFRlc3QKK0BNZWRpdW1UZXN0CiBwdWJsaWMgY2xhc3MgS2V5U3BlY1BhcnNlckNzdlRlc3RzIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgewogICAgIHByaXZhdGUgZmluYWwgS2V5Ym9hcmRUZXh0c1NldCBtVGV4dHNTZXQgPSBuZXcgS2V5Ym9hcmRUZXh0c1NldCgpOwogCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvS2V5Ym9hcmRTdGF0ZVNpbmdsZVRvdWNoVGVzdHMuamF2YSBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlib2FyZFN0YXRlU2luZ2xlVG91Y2hUZXN0cy5qYXZhCmluZGV4IGRmOWNlNWUuLmQ1YjlkMWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlib2FyZFN0YXRlU2luZ2xlVG91Y2hUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlib2FyZFN0YXRlU2luZ2xlVG91Y2hUZXN0cy5qYXZhCkBAIC0zNTIsMzAgKzM1MiwzNCBAQAogICAgICAgICAvLyBBbHBoYWJldCAtPiBzaGlmdCBrZXkgKyBsZXR0ZXIgLT4gYWxwaGFiZXQuCiAgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tIHNoaWZ0IGtleSwgZW50ZXIgYWxwaGFiZXQgc2hpZnRlZC4KICAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldC4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCdaJywgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleXMsIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnQScsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCk7CisgICAgICAgIHN0b3BTbGlkaW5nT25LZXkoJ1onLCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKIAogICAgICAgICAvLyBBbHBoYWJldCAtPiAiPzEyMyIga2V5ICsgbGV0dGVyIC0+IGFscGhhYmV0LgogICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSAiMTIzPyIga2V5LCBlbnRlciBzeW1ib2xzLgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBpbnRvIHN5bWJvbCBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldC4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCchJywgU1lNQk9MU19VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgaW50byBzeW1ib2wgbGV0dGVyIGtleXMsIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnQCcsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIHN0b3BTbGlkaW5nT25LZXkoJyEnLCBTWU1CT0xTX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKIAogICAgICAgICAvLyBBbHBoYWJldCBzaGlmdGVkIC0+IHNoaWZ0IGtleSArIGxldHRlciAtPiBhbHBoYWJldC4KICAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSBzaGlmdCBrZXksIGVudGVyIGFscGhhYmV0IHNoaWZ0ZWQuCiAgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQpOwogICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSBzaGlmdCBrZXksIHJlbWFpbiBhbHBoYWJldCBzaGlmdGVkLgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQpOwotICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXksIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0IChub3QgYWxwaGFiZXQgc2hpZnRlZCkuCi0gICAgICAgIHByZXNzQW5kUmVsZWFzZUtleSgnWicsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXlzLCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldCAobm90IGFscGhhYmV0IHNoaWZ0ZWQpLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnQScsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCk7CisgICAgICAgIHN0b3BTbGlkaW5nT25LZXkoJ1onLCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKIAogICAgICAgICAvLyBBbHBoYWJldCBzaGlmdGVkIC0+ICI/MTIzIiBrZXkgKyBsZXR0ZXIgLT4gYWxwaGFiZXQuCiAgICAgICAgIC8vIFByZXNzL3JlbGVhc2Ugc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdGVkLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVEKTsKICAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gIjEyMz8iIGtleSwgZW50ZXIgc3ltYm9scy4KICAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7Ci0gICAgICAgIC8vIEVudGVyL3JlbGVhc2UgaW50byBzeW1ib2wgbGV0dGVyIGtleSwgc3dpdGNoIGJhY2sgdG8gYWxwaGFiZXQgKG5vdCBhbHBoYWJldCBzaGlmdGVkKS4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCchJywgU1lNQk9MU19VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgaW50byBzeW1ib2wgbGV0dGVyIGtleXMsIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0IChub3QgYWxwaGFiZXQgc2hpZnRlZCkuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCdAJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnIScsIFNZTUJPTFNfVU5TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOwogCiAgICAgICAgIC8vIEFscGhhYmV0IHNoaWZ0IGxvY2tlZCAtPiBzaGlmdCBrZXkgKyBsZXR0ZXIgLT4gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgogICAgICAgICAvLyBMb25nIHByZXNzIHNoaWZ0IGtleSwgZW50ZXIgYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgpAQCAtMzgzLDE0ICszODcsNzYgQEAKICAgICAgICAgICAgICAgICBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOwogICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSAiMTIzPyIga2V5LCBlbnRlciBzeW1ib2xzLgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBpbnRvIHN5bWJvbCBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCi0gICAgICAgIHByZXNzQW5kUmVsZWFzZUtleSgnIScsIFNZTUJPTFNfVU5TSElGVEVELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGludG8gc3ltYm9sIGxldHRlciBrZXlzLCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCchJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnIScsIFNZTUJPTFNfVU5TSElGVEVELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOwogCiAgICAgICAgIC8vIEFscGhhYmV0IHNoaWZ0IGxvY2tlZCAtPiAiPzEyMyIga2V5ICsgbGV0dGVyIC0+IGFscGhhYmV0IHNoaWZ0IGxvY2tlZC4KICAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdGVkLgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9TSElGVF9MT0NLX1NISUZURUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleXMsIHN3aXRjaCBiYWNrIHRvIHNoaWZ0IGxvY2tlZC4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoJ0EnLCBBTFBIQUJFVF9TSElGVF9MT0NLRUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIHN0b3BTbGlkaW5nT25LZXkoJ1onLCBBTFBIQUJFVF9TSElGVF9MT0NLRUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgfQorCisgICAgLy8gQ2FuY2VsIHNsaWRpbmcgaW5wdXQgaW4gYWxwaGFiZXQuCisgICAgcHVibGljIHZvaWQgdGVzdFNsaWRpbmdBbHBoYWJldENhbmNlbCgpIHsKKyAgICAgICAgLy8gQWxwaGFiZXQgLT4gc2hpZnQga2V5ICsgbGV0dGVyIC0+IGNhbmNlbCAtPiBhbHBoYWJldC4KKyAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQpOworICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSBzaGlmdCBrZXksIGVudGVyIGFscGhhYmV0IHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KENPREVfU0hJRlQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleSwgcmVtYWlucyBpbiBhbHBoYWJldCBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnWicsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldC4KKyAgICAgICAgc3RvcFNsaWRpbmdBbmRDYW5jZWwoQUxQSEFCRVRfVU5TSElGVEVEKTsKKworICAgICAgICAvLyBBbHBoYWJldCAtPiAiPzEyMyIga2V5ICsgbGV0dGVyIC0+IGNhbmNlbCAtPiBhbHBoYWJldC4KKyAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gIjEyMz8iIGtleSwgZW50ZXIgc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgaW50byBzeW1ib2wgbGV0dGVyIGtleSwgcmVtYWlucyBpbiBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnIScsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBhbHBoYWJldC4KKyAgICAgICAgc3RvcFNsaWRpbmdBbmRDYW5jZWwoQUxQSEFCRVRfVU5TSElGVEVEKTsKKworICAgICAgICAvLyBBbHBoYWJldCBzaGlmdGVkIC0+IHNoaWZ0IGtleSArIGxldHRlciAtPiBjYW5jZWwgLT4gYWxwaGFiZXQuCisgICAgICAgIC8vIFByZXNzL3JlbGVhc2Ugc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gc2hpZnQga2V5LCByZW1haW4gYWxwaGFiZXQgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCByZW1haW5zIGluIGFscGhhYmV0IHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCdaJywgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0IChub3QgYWxwaGFiZXQgc2hpZnRlZCkuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKEFMUEhBQkVUX1VOU0hJRlRFRCk7CisKKyAgICAgICAgLy8gQWxwaGFiZXQgc2hpZnRlZCAtPiAiPzEyMyIga2V5ICsgbGV0dGVyIC0+IGNhbmNlbCAtPiBhbHBoYWJldC4KKyAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSBzaGlmdCBrZXksIGVudGVyIGFscGhhYmV0IHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQpOworICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSAiMTIzPyIga2V5LCBlbnRlciBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBpbnRvIHN5bWJvbCBsZXR0ZXIga2V5LCByZW1haW5zIGluIHN5bWJvbHMuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCchJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0IChub3QgYWxwaGFiZXQgc2hpZnRlZCkuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKEFMUEhBQkVUX1VOU0hJRlRFRCk7CisKKyAgICAgICAgLy8gQWxwaGFiZXQgc2hpZnQgbG9ja2VkIC0+IHNoaWZ0IGtleSArIGxldHRlciAtPiBjYW5jZWwgLT4gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgorICAgICAgICAvLyBMb25nIHByZXNzIHNoaWZ0IGtleSwgZW50ZXIgYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgorICAgICAgICBsb25nUHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU0hJRlQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwKKyAgICAgICAgICAgICAgICBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSAiMTIzPyIga2V5LCBlbnRlciBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBpbnRvIHN5bWJvbCBsZXR0ZXIga2V5LCByZW1haW5zIGluIHN5bWJvbHMuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCchJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIGFscGhhYmV0IHNoaWZ0IGxvY2tlZC4KKyAgICAgICAgc3RvcFNsaWRpbmdBbmRDYW5jZWwoIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisKKyAgICAgICAgLy8gQWxwaGFiZXQgc2hpZnQgbG9ja2VkIC0+ICI/MTIzIiBrZXkgKyBsZXR0ZXIgLT4gY2FuY2VsIC0+IGFscGhhYmV0IHNoaWZ0IGxvY2tlZC4KKyAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9TSElGVF9MT0NLX1NISUZURUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleSwgcmVtYWlucyBpbiBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCdaJywgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOwogICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXksIHN3aXRjaCBiYWNrIHRvIHNoaWZ0IGxvY2tlZC4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCdaJywgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworICAgICAgICBzdG9wU2xpZGluZ0FuZENhbmNlbChBTFBIQUJFVF9TSElGVF9MT0NLRUQpOwogICAgIH0KIAogICAgIC8vIFNsaWRpbmcgaW5wdXQgaW4gc3ltYm9scy4KQEAgLTM5OCwxNiArNDY0LDE4IEBACiAgICAgICAgIC8vIFN5bWJvbHMgLT4gIj1cPCIga2V5ICsgbGV0dGVyIC0+IHN5bWJvbHMuCiAgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj8xMjMiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7Ci0gICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tIHNoaWZ0IGtleSwgZW50ZXIgc3ltb2xzIHNoaWZ0ZWQuCisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tIHNoaWZ0IGtleSwgZW50ZXIgc3ltYm9scyBzaGlmdGVkLgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7Ci0gICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9sIHNoaWZ0ZWQgbGV0dGVyIGtleSwgc3dpdGNoIGJhY2sgdG8gc3ltYm9scy4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCd+JywgU1lNQk9MU19TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9sIHNoaWZ0ZWQgbGV0dGVyIGtleXMsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCd8JywgU1lNQk9MU19TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOworICAgICAgICBzdG9wU2xpZGluZ09uS2V5KCd+JywgU1lNQk9MU19TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CiAKICAgICAgICAgLy8gU3ltYm9scyAtPiAiQUJDIiBrZXkgKyBsZXR0ZXIgLT4gU3ltYm9scy4KICAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gIkFCQyIga2V5LCBlbnRlciBhbHBoYWJldC4KICAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzLgotICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoJ2EnLCBBTFBIQUJFVF9VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5cywgc3dpdGNoIGJhY2sgdG8gc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoJ3onLCBBTFBIQUJFVF9VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIHN0b3BTbGlkaW5nT25LZXkoJ2EnLCBBTFBIQUJFVF9VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKICAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldC4KICAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBBTFBIQUJFVF9VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CiAKQEAgLTQyMSw4ICs0ODksOSBAQAogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleS4KICAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzLgotICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoJ2EnLCBBTFBIQUJFVF9VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5cywgc3dpdGNoIGJhY2sgdG8gc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoJ3onLCBBTFBIQUJFVF9VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIHN0b3BTbGlkaW5nT25LZXkoJ2EnLCBBTFBIQUJFVF9VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKICAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldCAobm90IGFscGhhYmV0IHNoaWZ0ZWQpLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKIApAQCAtNDM3LDggKzUwNiw5IEBACiAgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NZTUJPTCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKICAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gIkFCQyIga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCiAgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KENPREVfU1lNQk9MLCBBTFBIQUJFVF9TSElGVF9MT0NLRUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7Ci0gICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleSwgc3dpdGNoIGJhY2sgdG8gc3ltYm9scy4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCdBJywgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleXMsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCdaJywgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworICAgICAgICBzdG9wU2xpZGluZ09uS2V5KCdBJywgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBTWU1CT0xTX1VOU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIkFCQyIga2V5LCBzd2l0Y2ggdG8gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKIApAQCAtNDUzLDggKzUyMyw4NSBAQAogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICI9XDwiIGtleSwgZW50ZXIgc3ltYm9scyBzaGlmdGVkLgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7Ci0gICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9scyBzaGlmdCBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzLgotICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoJ34nLCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBzeW1ib2xzIHNoaWZ0IGxldHRlciBrZXlzLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnfCcsIFNZTUJPTFNfU0hJRlRFRCwgU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnficsIFNZTUJPTFNfU0hJRlRFRCwgU1lNQk9MU19VTlNISUZURUQpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICJBQkMiIGtleSwgc3dpdGNoIHRvIGFscGhhYmV0IHNoaWZ0IGxvY2tlZC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBBTFBIQUJFVF9TSElGVF9MT0NLRUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgfQorCisgICAgLy8gQ2FuY2VsIHNsaWRpbmcgaW5wdXQgaW4gc3ltYm9scy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xpZGluZ1N5bWJvbHNDYW5jZWwoKSB7CisgICAgICAgIC8vIFN5bWJvbHMgLT4gIj1cPCIga2V5ICsgbGV0dGVyIC0+IGNhbmNlbCAtPiBzeW1ib2xzLgorICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICI/MTIzIiBrZXksIGVudGVyIGludG8gc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBTWU1CT0xTX1VOU0hJRlRFRCwgU1lNQk9MU19VTlNISUZURUQpOworICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSBzaGlmdCBrZXksIGVudGVyIHN5bWJvbHMgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TSElGVCwgU1lNQk9MU19TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIHN5bWJvbCBzaGlmdGVkIGxldHRlciBrZXksIHJlbWFpbnMgaW4gc3ltYm9scyBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnfCcsIFNZTUJPTFNfU0hJRlRFRCwgU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKFNZTUJPTFNfVU5TSElGVEVEKTsKKworICAgICAgICAvLyBTeW1ib2xzIC0+ICJBQkMiIGtleSArIGxldHRlciAtPiBTeW1ib2xzLgorICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSAiQUJDIiBrZXksIGVudGVyIGFscGhhYmV0LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfVU5TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXlzLCByZW1haW5zIGluIGFscGhhYmV0LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgneicsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBBTFBIQUJFVF9VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisKKyAgICAgICAgLy8gQWxwaGFiZXQgc2hpZnRlZCAtPiBzeW1ib2xzIC0+ICJBQkMiIGtleSArIGxldHRlciAtPiBzeW1ib2xzIC0+CisgICAgICAgIC8vIGFscGhhYmV0LgorICAgICAgICAvLyBMb2FkIGtleWJvYXJkCisgICAgICAgIGxvYWRLZXlib2FyZChBTFBIQUJFVF9VTlNISUZURUQpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlIHNoaWZ0IGtleSwgZW50ZXIgYWxwaGFiZXQgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU0hJRlQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj8xMjMiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleS4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCByZW1haW5zIGluIGFscGhhYmV0LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgneicsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldCAobm90IGFscGhhYmV0IHNoaWZ0ZWQpLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKworICAgICAgICAvLyBBbHBoYWJldCBzaGlmdCBsb2NrZWQgLT4gc3ltYm9scyAtPiAiQUJDIiBrZXkgKyBsZXR0ZXIgLT4gc3ltYm9scyAtPgorICAgICAgICAvLyBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIC8vIExvYWQga2V5Ym9hcmQKKyAgICAgICAgbG9hZEtleWJvYXJkKEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIExvbmcgcHJlc3Mgc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIGxvbmdQcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELAorICAgICAgICAgICAgICAgIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj8xMjMiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleSwgZW50ZXIgYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXksIHJlbWFpbnMgaW4gYWxwaGFiZXQgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoJ1onLCBBTFBIQUJFVF9TSElGVF9MT0NLRUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzLgorICAgICAgICBzdG9wU2xpZGluZ0FuZENhbmNlbChTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIkFCQyIga2V5LCBzd2l0Y2ggdG8gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKKworICAgICAgICAvLyBBbHBoYWJldCBzaGlmdCBsb2NrZWQgLT4gc3ltYm9scyAtPiAiPVw8IiBrZXkgKyBsZXR0ZXIgLT4gc3ltYm9scyAtPgorICAgICAgICAvLyBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIC8vIExvYWQga2V5Ym9hcmQKKyAgICAgICAgbG9hZEtleWJvYXJkKEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIExvbmcgcHJlc3Mgc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIGxvbmdQcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELAorICAgICAgICAgICAgICAgIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj8xMjMiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICI9XDwiIGtleSwgZW50ZXIgc3ltYm9scyBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9scyBzaGlmdCBsZXR0ZXIga2V5LCByZW1haW5zIGluIHN5bWJvbHMgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoJ3wnLCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzLgorICAgICAgICBzdG9wU2xpZGluZ0FuZENhbmNlbChTWU1CT0xTX1VOU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIkFCQyIga2V5LCBzd2l0Y2ggdG8gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKICAgICB9CkBAIC00NjgsMTQgKzYxNSwxNiBAQAogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgU1lNQk9MU19TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOwogICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSBzaGlmdCBrZXksIGVudGVyIHN5bWJvbHMuCiAgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KENPREVfU0hJRlQsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7Ci0gICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9sIGxldHRlciBrZXksIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMgc2hpZnRlZC4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCcxJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9sIGxldHRlciBrZXlzLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCcyJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnMScsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOwogCiAgICAgICAgIC8vIFN5bWJvbHMgc2hpZnRlZCAtPiAiQUJDIiBrZXkgKyBsZXR0ZXIgLT4gc3ltYm9scyBzaGlmdGVkLgogICAgICAgICAvLyBQcmVzcyBhbmQgc2xpZGUgZnJvbSAiQUJDIiBrZXksIGVudGVyIGFscGhhYmV0LgogICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfVU5TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOwotICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXksIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMgc2hpZnRlZC4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCdhJywgQUxQSEFCRVRfVU5TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXlzLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCd6JywgQUxQSEFCRVRfVU5TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOworICAgICAgICBzdG9wU2xpZGluZ09uS2V5KCdhJywgQUxQSEFCRVRfVU5TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOwogICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICJBQkMiIGtleSwgc3dpdGNoIHRvIGFscGhhYmV0LgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKIApAQCAtNDkxLDggKzY0MCw5IEBACiAgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleS4KICAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCi0gICAgICAgIHByZXNzQW5kUmVsZWFzZUtleSgnYScsIEFMUEhBQkVUX1VOU0hJRlRFRCwgU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5cywgc3dpdGNoIGJhY2sgdG8gc3ltYm9scyBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgneicsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnYScsIEFMUEhBQkVUX1VOU0hJRlRFRCwgU1lNQk9MU19TSElGVEVEKTsKICAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldCAobm90IGFscGhhYmV0IHNoaWZ0ZWQpLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKIApAQCAtNTA5LDggKzY1OSw5IEBACiAgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleS4KICAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKLSAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCi0gICAgICAgIHByZXNzQW5kUmVsZWFzZUtleSgnQScsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5cywgc3dpdGNoIGJhY2sgdG8gc3ltYm9scyBzaGlmdGVkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnWicsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnQScsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgU1lNQk9MU19TSElGVEVEKTsKICAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCiAgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOwogCkBAIC01MjcsOCArNjc4LDkzIEBACiAgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICI/MTIzIiBrZXkuCiAgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KENPREVfU0hJRlQsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7Ci0gICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9sIGxldHRlciBrZXksIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMgc2hpZnRlZC4KLSAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KCcxJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2Ugc3ltYm9sIGxldHRlciBrZXlzLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KCcyJywgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgc3RvcFNsaWRpbmdPbktleSgnMScsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1NISUZURUQpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICJBQkMiIGtleSwgc3dpdGNoIHRvIGFscGhhYmV0IHNoaWZ0IGxvY2tlZC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBBTFBIQUJFVF9TSElGVF9MT0NLRUQsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgfQorCisgICAgLy8gQ2FuY2VsIHNsaWRpbmcgaW5wdXQgaW4gc3ltYm9scyBzaGlmdGVkLgorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGlkaW5nU3ltYm9sc1NoaWZ0ZWRDYW5jZWwoKSB7CisgICAgICAgIC8vIFN5bWJvbHMgc2hpZnRlZCAtPiAiPzEyMyIgKyBsZXR0ZXIgLT4gc3ltYm9scyBzaGlmdGVkLgorICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICI/MTIzIiBrZXksIGVudGVyIGludG8gc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBTWU1CT0xTX1VOU0hJRlRFRCwgU1lNQk9MU19VTlNISUZURUQpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICI9XDwiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tIHNoaWZ0IGtleSwgZW50ZXIgc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TSElGVCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBzeW1ib2wgbGV0dGVyIGtleSwgcmVtYWlucyBpbiBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnMicsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKFNZTUJPTFNfU0hJRlRFRCk7CisKKyAgICAgICAgLy8gU3ltYm9scyBzaGlmdGVkIC0+ICJBQkMiIGtleSArIGxldHRlciAtPiBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleSwgZW50ZXIgYWxwaGFiZXQuCisgICAgICAgIHByZXNzQW5kU2xpZGVGcm9tS2V5KENPREVfU1lNQk9MLCBBTFBIQUJFVF9VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIEVudGVyL3JlbGVhc2UgbGV0dGVyIGtleSwgcmVtYWlucyBpbiBhbHBoYWJldC4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoJ3onLCBBTFBIQUJFVF9VTlNISUZURUQsIEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIkFCQyIga2V5LCBzd2l0Y2ggdG8gYWxwaGFiZXQuCisgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfVU5TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOworCisgICAgICAgIC8vIEFscGhhYmV0IHNoaWZ0ZWQgLT4gc3ltYm9scyBzaGlmdGVkIC0+ICJBQkMiICsgbGV0dGVyIC0+IHN5bWJvbHMgc2hpZnRlZCAtPgorICAgICAgICAvLyBhbHBoYWJldC4KKyAgICAgICAgLy8gTG9hZCBrZXlib2FyZAorICAgICAgICBsb2FkS2V5Ym9hcmQoQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSBzaGlmdCBrZXksIGVudGVyIGFscGhhYmV0IHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBBTFBIQUJFVF9NQU5VQUxfU0hJRlRFRCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICI/MTIzIiBrZXksIGVudGVyIGludG8gc3ltYm9scy4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU1lNQk9MLCBTWU1CT0xTX1VOU0hJRlRFRCwgU1lNQk9MU19VTlNISUZURUQpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlICI9XDwiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NISUZULCBTWU1CT0xTX1NISUZURUQsIFNZTUJPTFNfU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzIGFuZCBzbGlkZSBmcm9tICJBQkMiIGtleS4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBsZXR0ZXIga2V5LCByZW1haW5zIGluIGFscGhhYmV0LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgneicsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMgc2hpZnRlZC4KKyAgICAgICAgc3RvcFNsaWRpbmdBbmRDYW5jZWwoU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldCAobm90IGFscGhhYmV0IHNoaWZ0ZWQpLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfVU5TSElGVEVEKTsKKworICAgICAgICAvLyBBbHBoYWJldCBzaGlmdCBsb2NrZWQgLT4gc3ltYm9scyBzaGlmdGVkIC0+ICJBQkMiICsgbGV0dGVyIC0+IHN5bWJvbHMgc2hpZnRlZCAtPgorICAgICAgICAvLyBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIC8vIExvYWQga2V5Ym9hcmQKKyAgICAgICAgbG9hZEtleWJvYXJkKEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIExvbmcgcHJlc3Mgc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIGxvbmdQcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELAorICAgICAgICAgICAgICAgIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj8xMjMiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj1cPCIga2V5LCBlbnRlciBpbnRvIHN5bWJvbHMgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU0hJRlQsIFNZTUJPTFNfU0hJRlRFRCwgU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gIkFCQyIga2V5LgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworICAgICAgICAvLyBFbnRlci9yZWxlYXNlIGxldHRlciBrZXksIHJlbWFpbnMgaW4gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnWicsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKKyAgICAgICAgLy8gQ2FuY2VsIHNsaWRpbmcsIHN3aXRjaCBiYWNrIHRvIHN5bWJvbHMgc2hpZnRlZC4KKyAgICAgICAgc3RvcFNsaWRpbmdBbmRDYW5jZWwoU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MvcmVsZWFzZSAiQUJDIiBrZXksIHN3aXRjaCB0byBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIHByZXNzQW5kUmVsZWFzZUtleShDT0RFX1NZTUJPTCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VELCBBTFBIQUJFVF9TSElGVF9MT0NLRUQpOworCisgICAgICAgIC8vIEFscGhhYmV0IHNoaWZ0IGxvY2tlZCAtPiBzeW1ib2xzIHNoaWZ0ZWQgLT4gIj8xMjMiICsgbGV0dGVyIC0+IHN5bWJvbHMgc2hpZnRlZCAtPgorICAgICAgICAvLyBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIC8vIExvYWQga2V5Ym9hcmQKKyAgICAgICAgbG9hZEtleWJvYXJkKEFMUEhBQkVUX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIExvbmcgcHJlc3Mgc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdCBsb2NrZWQuCisgICAgICAgIGxvbmdQcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVELAorICAgICAgICAgICAgICAgIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj8xMjMiIGtleSwgZW50ZXIgaW50byBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIj1cPCIga2V5LCBlbnRlciBpbnRvIHN5bWJvbHMgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfU0hJRlQsIFNZTUJPTFNfU0hJRlRFRCwgU1lNQk9MU19TSElGVEVEKTsKKyAgICAgICAgLy8gUHJlc3MgYW5kIHNsaWRlIGZyb20gIj8xMjMiIGtleS4KKyAgICAgICAgcHJlc3NBbmRTbGlkZUZyb21LZXkoQ09ERV9TSElGVCwgU1lNQk9MU19VTlNISUZURUQsIFNZTUJPTFNfVU5TSElGVEVEKTsKKyAgICAgICAgLy8gRW50ZXIvcmVsZWFzZSBzeW1ib2wgbGV0dGVyIGtleSwgcmVtYWlucyBpbiBzeW1ib2xzLgorICAgICAgICBwcmVzc0FuZFNsaWRlRnJvbUtleSgnMicsIFNZTUJPTFNfVU5TSElGVEVELCBTWU1CT0xTX1VOU0hJRlRFRCk7CisgICAgICAgIC8vIENhbmNlbCBzbGlkaW5nLCBzd2l0Y2ggYmFjayB0byBzeW1ib2xzIHNoaWZ0ZWQuCisgICAgICAgIHN0b3BTbGlkaW5nQW5kQ2FuY2VsKFNZTUJPTFNfU0hJRlRFRCk7CiAgICAgICAgIC8vIFByZXNzL3JlbGVhc2UgIkFCQyIga2V5LCBzd2l0Y2ggdG8gYWxwaGFiZXQgc2hpZnQgbG9ja2VkLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TWU1CT0wsIEFMUEhBQkVUX1NISUZUX0xPQ0tFRCwgQUxQSEFCRVRfU0hJRlRfTE9DS0VEKTsKICAgICB9CkBAIC01OTcsNiArODMzLDE3IEBACiAgICAgICAgIC8vIFJvdGF0ZSBkZXZpY2UsIHJlbWFpbiBpbiBhbHBoYWJldC4KICAgICAgICAgcm90YXRlRGV2aWNlKEFMUEhBQkVUX1VOU0hJRlRFRCk7CiAKKyAgICAgICAgLy8gQWxwaGFiZXQgYXV0b21hdGljIHNoaWZ0ZWQgLT4gcm90YXRlIC0+IGF1dG9tYXRpYyBzaGlmdGVkLgorICAgICAgICAvLyBTZXQgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGFsbCB3b3JkcyBtb2RlLgorICAgICAgICBzZXRBdXRvQ2Fwc01vZGUoQ0FQX01PREVfV09SRFMpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlIGF1dG8gY2FwcyB0cmlnZ2VyIGxldHRlciB0byBlbnRlciBhbHBoYWJldCBhdXRvbWF0aWMgc2hpZnRlZC4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfQVVUT19DQVBTX1RSSUdHRVIsIEFMUEhBQkVUX1VOU0hJRlRFRCwgQUxQSEFCRVRfQVVUT01BVElDX1NISUZURUQpOworICAgICAgICAvLyBSb3RhdGUgZGV2aWNlLCByZW1haW4gaW4gYWxwaGFiZXQuCisgICAgICAgIHJvdGF0ZURldmljZShBTFBIQUJFVF9BVVRPTUFUSUNfU0hJRlRFRCk7CisgICAgICAgIHNldEF1dG9DYXBzTW9kZShDQVBfTU9ERV9PRkYpOworICAgICAgICAvLyBQcmVzcy9yZWxlYXNlIGF1dG8gY2FwcyB0cmlnZ2VyIGxldHRlciB0byByZXNldCBzaGlmdCBzdGF0ZS4KKyAgICAgICAgcHJlc3NBbmRSZWxlYXNlS2V5KENPREVfQVVUT19DQVBTX1RSSUdHRVIsIEFMUEhBQkVUX0FVVE9NQVRJQ19TSElGVEVELCBBTFBIQUJFVF9VTlNISUZURUQpOworCiAgICAgICAgIC8vIEFscGhhYmV0IHNoaWZ0ZWQgLT4gcm90YXRlIC0+IGFscGhhYmV0IHNoaWZ0ZWQuCiAgICAgICAgIC8vIFByZXNzL3JlbGVhc2Ugc2hpZnQga2V5LCBlbnRlciBhbHBoYWJldCBzaGlmdGVkLgogICAgICAgICBwcmVzc0FuZFJlbGVhc2VLZXkoQ09ERV9TSElGVCwgQUxQSEFCRVRfTUFOVUFMX1NISUZURUQsIEFMUEhBQkVUX01BTlVBTF9TSElGVEVEKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlib2FyZFN0YXRlVGVzdHNCYXNlLmphdmEgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvS2V5Ym9hcmRTdGF0ZVRlc3RzQmFzZS5qYXZhCmluZGV4IDVlOTRhZWIuLmUwNmNhMDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9LZXlib2FyZFN0YXRlVGVzdHNCYXNlLmphdmEKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL0tleWJvYXJkU3RhdGVUZXN0c0Jhc2UuamF2YQpAQCAtNzEsNyArNzEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VLZXkoZmluYWwgaW50IGNvZGUsIGZpbmFsIGludCBhZnRlclJlbGVhc2UpIHsKLSAgICAgICAgbVN3aXRjaGVyLm9uQ29kZUlucHV0KGNvZGUsIFNJTkdMRSk7CisgICAgICAgIG1Td2l0Y2hlci5vbkNvZGVJbnB1dChjb2RlKTsKICAgICAgICAgbVN3aXRjaGVyLm9uUmVsZWFzZUtleShjb2RlLCBOT1RfU0xJRElORyk7CiAgICAgICAgIGFzc2VydExheW91dCgiYWZ0ZXJSZWxlYXNlIiwgYWZ0ZXJSZWxlYXNlLCBtU3dpdGNoZXIuZ2V0TGF5b3V0SWQoKSk7CiAgICAgfQpAQCAtODcsNyArODcsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNob3JkaW5nUmVsZWFzZUtleShmaW5hbCBpbnQgY29kZSwgZmluYWwgaW50IGFmdGVyUmVsZWFzZSkgewotICAgICAgICBtU3dpdGNoZXIub25Db2RlSW5wdXQoY29kZSwgTVVMVEkpOworICAgICAgICBtU3dpdGNoZXIub25Db2RlSW5wdXQoY29kZSk7CiAgICAgICAgIG1Td2l0Y2hlci5vblJlbGVhc2VLZXkoY29kZSwgTk9UX1NMSURJTkcpOwogICAgICAgICBhc3NlcnRMYXlvdXQoImFmdGVyUmVsZWFzZSIsIGFmdGVyUmVsZWFzZSwgbVN3aXRjaGVyLmdldExheW91dElkKCkpOwogICAgIH0KQEAgLTEwNCw2ICsxMDQsMTkgQEAKICAgICAgICAgYXNzZXJ0TGF5b3V0KCJhZnRlclNsaWRlIiwgYWZ0ZXJTbGlkZSwgbVN3aXRjaGVyLmdldExheW91dElkKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHN0b3BTbGlkaW5nT25LZXkoZmluYWwgaW50IGNvZGUsIGZpbmFsIGludCBhZnRlclByZXNzLCBmaW5hbCBpbnQgYWZ0ZXJTbGlkZSkgeworICAgICAgICBwcmVzc0tleShjb2RlLCBhZnRlclByZXNzKTsKKyAgICAgICAgbVN3aXRjaGVyLm9uQ29kZUlucHV0KGNvZGUpOworICAgICAgICBtU3dpdGNoZXIub25SZWxlYXNlS2V5KGNvZGUsIE5PVF9TTElESU5HKTsKKyAgICAgICAgbVN3aXRjaGVyLm9uRmluaXNoU2xpZGluZ0lucHV0KCk7CisgICAgICAgIGFzc2VydExheW91dCgiYWZ0ZXJTbGlkZSIsIGFmdGVyU2xpZGUsIG1Td2l0Y2hlci5nZXRMYXlvdXRJZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wU2xpZGluZ0FuZENhbmNlbChmaW5hbCBpbnQgYWZ0ZXJDYW5jZWxTbGlkaW5nKSB7CisgICAgICAgIG1Td2l0Y2hlci5vbkZpbmlzaFNsaWRpbmdJbnB1dCgpOworICAgICAgICBhc3NlcnRMYXlvdXQoImFmdGVyQ2FuY2VsU2xpZGluZyIsIGFmdGVyQ2FuY2VsU2xpZGluZywgbVN3aXRjaGVyLmdldExheW91dElkKCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGxvbmdQcmVzc0tleShmaW5hbCBpbnQgY29kZSwgZmluYWwgaW50IGFmdGVyUHJlc3MsIGZpbmFsIGludCBhZnRlckxvbmdQcmVzcykgewogICAgICAgICBwcmVzc0tleShjb2RlLCBhZnRlclByZXNzKTsKICAgICAgICAgbVN3aXRjaGVyLm9uTG9uZ1ByZXNzVGltZW91dChjb2RlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9Nb2NrS2V5Ym9hcmRTd2l0Y2hlci5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL01vY2tLZXlib2FyZFN3aXRjaGVyLmphdmEKaW5kZXggNzQ1MDZkMi4uMjU0NGI2YyAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL01vY2tLZXlib2FyZFN3aXRjaGVyLmphdmEKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL01vY2tLZXlib2FyZFN3aXRjaGVyLmphdmEKQEAgLTE4NSw3ICsxODUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25Db2RlSW5wdXQoZmluYWwgaW50IGNvZGUsIGZpbmFsIGJvb2xlYW4gaXNTaW5nbGVQb2ludGVyKSB7CisgICAgcHVibGljIHZvaWQgb25Db2RlSW5wdXQoZmluYWwgaW50IGNvZGUpIHsKICAgICAgICAgaWYgKG1BdXRvQ2Fwc01vZGUgPT0gTW9ja0NvbnN0YW50cy5DQVBfTU9ERV9XT1JEUykgewogICAgICAgICAgICAgaWYgKENvbnN0YW50cy5pc0xldHRlckNvZGUoY29kZSkpIHsKICAgICAgICAgICAgICAgICBtQXV0b0NhcHNTdGF0ZSA9IChjb2RlID09IE1vY2tDb25zdGFudHMuQ09ERV9BVVRPX0NBUFNfVFJJR0dFUikKQEAgLTE5NCwxMCArMTk0LDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtQXV0b0NhcHNTdGF0ZSA9IG1BdXRvQ2Fwc01vZGU7CiAgICAgICAgIH0KLSAgICAgICAgbVN0YXRlLm9uQ29kZUlucHV0KGNvZGUsIGlzU2luZ2xlUG9pbnRlciwgbUF1dG9DYXBzU3RhdGUpOworICAgICAgICBtU3RhdGUub25Db2RlSW5wdXQoY29kZSwgbUF1dG9DYXBzU3RhdGUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsSW5wdXQoZmluYWwgYm9vbGVhbiBpc1NpbmdsZVBvaW50ZXIpIHsKLSAgICAgICAgbVN0YXRlLm9uQ2FuY2VsSW5wdXQoaXNTaW5nbGVQb2ludGVyKTsKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaFNsaWRpbmdJbnB1dCgpIHsKKyAgICAgICAgbVN0YXRlLm9uRmluaXNoU2xpZGluZ0lucHV0KCk7CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9Qb2ludGVyVHJhY2tlclF1ZXVlVGVzdHMuamF2YSBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9rZXlib2FyZC9pbnRlcm5hbC9Qb2ludGVyVHJhY2tlclF1ZXVlVGVzdHMuamF2YQppbmRleCBkNjcwMGNmLi4yNzk1NTljIDEwMDY0NAotLS0gYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2Qva2V5Ym9hcmQvaW50ZXJuYWwvUG9pbnRlclRyYWNrZXJRdWV1ZVRlc3RzLmphdmEKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2tleWJvYXJkL2ludGVybmFsL1BvaW50ZXJUcmFja2VyUXVldWVUZXN0cy5qYXZhCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsVHJhY2tpbmcoKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWxUcmFja2luZ0ZvckFjdGlvbigpIHt9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC02NiwyMyArNjYsMjMgQEAKICAgICBwcml2YXRlIGZpbmFsIFBvaW50ZXJUcmFja2VyUXVldWUgbVF1ZXVlID0gbmV3IFBvaW50ZXJUcmFja2VyUXVldWUoKTsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbXB0eSBxdWV1ZSIsIDAsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImVtcHR5IHF1ZXVlIiwgIltdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFkZCBlbGVtZW50MSIsIDEsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGFkZGluZyBlbGVtZW50MSIsICJbMV0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMV0iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAgICAgICAgIG1RdWV1ZS5hZGQobUVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZGQgZWxlbWVudDIiLCAyLCBtUXVldWUuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciBhZGRpbmcgZWxlbWVudDIiLCAiWzEgMl0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAyXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFkZCBlbGVtZW50MyIsIDMsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGFkZGluZyBlbGVtZW50MyIsICJbMSAyIDNdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzEgMiAzXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFkZCBlbGVtZW50NCIsIDQsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGFkZGluZyBlbGVtZW50NCIsICJbMSAyIDMgNF0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAyIDMgNF0iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKQEAgLTk0LDMzICs5NCwyOSBAQAogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50NCk7CiAKICAgICAgICAgbVF1ZXVlLnJlbW92ZShtRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbW92ZSBlbGVtZW50MiIsIDMsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92aW5nIGVsZW1lbnQyIiwgIlsxIDMgNF0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAzIDRdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwogICAgICAgICBtUXVldWUucmVtb3ZlKG1FbGVtZW50NCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVtb3ZlIGVsZW1lbnQ0IiwgMiwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVtb3ZpbmcgZWxlbWVudDQiLCAiWzEgM10iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAzXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLnJlbW92ZShtRWxlbWVudDQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbW92ZSBlbGVtZW50NCBhZ2FpbiIsIDIsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92aW5nIGVsZW1lbnQ0IGFnYWluIiwgIlsxIDNdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzEgM10iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAgICAgICAgIG1RdWV1ZS5yZW1vdmUobUVsZW1lbnQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW1vdmUgZWxlbWVudDEiLCAxLCBtUXVldWUuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmluZyBlbGVtZW50NCIsICJbM10iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbM10iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAgICAgICAgIG1RdWV1ZS5yZW1vdmUobUVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW1vdmUgZWxlbWVudDMiLCAwLCBtUXVldWUuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmluZyBlbGVtZW50MyIsICJbXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1RdWV1ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwogICAgICAgICBtUXVldWUucmVtb3ZlKG1FbGVtZW50MSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVtb3ZlIGVsZW1lbnQxIGFnYWluIiwgMCwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVtb3ZpbmcgZWxlbWVudDEgYWdhaW4iLCAiW10iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92ZSBlbGVtZW50cyIsIDAsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmUgZWxlbWVudDEiLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDEubVBoYW50b21VcEV2ZW50VGltZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVtb3ZlIGVsZW1lbnQyIiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92ZSBlbGVtZW50MyIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmUgZWxlbWVudDQiLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDQubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBFbGVtZW50LnNQaGFudG9tVXBDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50Mi5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDMubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQ0Lm1QaGFudG9tVXBFdmVudFRpbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbmRSZW1vdmUoKSB7CkBAIC0xMzIsMzggKzEyOCwzNCBAQAogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50NCk7CiAKICAgICAgICAgbVF1ZXVlLnJlbW92ZShtRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbW92ZSBlbGVtZW50MiIsIDMsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92aW5nIGVsZW1lbnQyIiwgIlsxIDMgNF0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAzIDRdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwogICAgICAgICBtUXVldWUucmVtb3ZlKG1FbGVtZW50NCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVtb3ZlIGVsZW1lbnQ0IiwgMiwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVtb3ZpbmcgZWxlbWVudDQiLCAiWzEgM10iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAzXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFkZCBlbGVtZW50MiIsIDMsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGFkZGluZyBlbGVtZW50MiIsICJbMSAzIDJdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzEgMyAyXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLnJlbW92ZShtRWxlbWVudDQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbW92ZSBlbGVtZW50NCBhZ2FpbiIsIDMsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92aW5nIGVsZW1lbnQ0IGFnYWluIiwgIlsxIDMgMl0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSAzIDJdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwogICAgICAgICBtUXVldWUucmVtb3ZlKG1FbGVtZW50MSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVtb3ZlIGVsZW1lbnQxIiwgMiwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVtb3ZpbmcgZWxlbWVudDQiLCAiWzMgMl0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMyAyXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFkZCBlbGVtZW50MSIsIDMsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGFkZGluZyBlbGVtZW50MSIsICJbMyAyIDFdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzMgMiAxXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKICAgICAgICAgbVF1ZXVlLnJlbW92ZShtRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbW92ZSBlbGVtZW50MyIsIDIsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92aW5nIGVsZW1lbnQzIiwgIlsyIDFdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzIgMV0iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAgICAgICAgIG1RdWV1ZS5yZW1vdmUobUVsZW1lbnQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW1vdmUgZWxlbWVudDEgYWdhaW4iLCAxLCBtUXVldWUuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmluZyBlbGVtZW50MSBhZ2FpbiIsICJbMl0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMl0iLCBtUXVldWUudG9TdHJpbmcoKSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmUgZWxlbWVudDEiLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDEubVBoYW50b21VcEV2ZW50VGltZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVtb3ZlIGVsZW1lbnQyIiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbW92ZSBlbGVtZW50MyIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZW1vdmUgZWxlbWVudDQiLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDQubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50Mi5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDMubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQ0Lm1QaGFudG9tVXBFdmVudFRpbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxlYXNlQWxsUG9pbnRlcnMoKSB7CkBAIC0xNzYsMjAgKzE2OCwzMyBAQAogICAgICAgICBmaW5hbCBsb25nIGV2ZW50VGltZSA9IDEyMzsKICAgICAgICAgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQgPSAwOwogICAgICAgICBtUXVldWUucmVsZWFzZUFsbFBvaW50ZXJzKGV2ZW50VGltZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVsZWFzZUFsbFBvaW50ZXJzIiwgNCwgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVycyIsIDAsIG1RdWV1ZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVycyIsICJbXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnMgZWxlbWVudDEiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDEsIG1FbGVtZW50MS5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnMgZWxlbWVudDIiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDIsIG1FbGVtZW50Mi5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnMgZWxlbWVudDMiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDMsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnMgZWxlbWVudDQiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDQsIG1FbGVtZW50NC5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1RdWV1ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRUaW1lICsgMSwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRUaW1lICsgMiwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRUaW1lICsgMywgbUVsZW1lbnQzLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRUaW1lICsgNCwgbUVsZW1lbnQ0Lm1QaGFudG9tVXBFdmVudFRpbWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4oKSB7CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbkZpcnN0KCkgeworICAgICAgICBtRWxlbWVudDIubUlzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50MSk7CisgICAgICAgIG1RdWV1ZS5hZGQobUVsZW1lbnQyKTsKKyAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDMpOworCisgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gMTIzOworICAgICAgICBFbGVtZW50LnNQaGFudG9tVXBDb3VudCA9IDA7CisgICAgICAgIG1RdWV1ZS5yZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4obUVsZW1lbnQxLCBldmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzEgMiAzXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDEubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuTGFzdCgpIHsKICAgICAgICAgbUVsZW1lbnQyLm1Jc01vZGlmaWVyID0gdHJ1ZTsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDEpOwogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50Mik7CkBAIC0xOTksMjAgKzIwNCwzNCBAQAogICAgICAgICBmaW5hbCBsb25nIGV2ZW50VGltZSA9IDEyMzsKICAgICAgICAgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQgPSAwOwogICAgICAgICBtUXVldWUucmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuKG1FbGVtZW50NCwgZXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4iLCAyLCBFbGVtZW50LnNQaGFudG9tVXBDb3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuIiwgMiwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuIiwgIlsyIDRdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbiBlbGVtZW50MSIsCi0gICAgICAgICAgICAgICAgZXZlbnRUaW1lICsgMSwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbiBlbGVtZW50MiIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50Mi5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4gZWxlbWVudDMiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDIsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4gZWxlbWVudDQiLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDQubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBFbGVtZW50LnNQaGFudG9tVXBDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMiA0XSIsIG1RdWV1ZS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50VGltZSArIDEsIG1FbGVtZW50MS5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDIubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhldmVudFRpbWUgKyAyLCBtRWxlbWVudDMubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQ0Lm1QaGFudG9tVXBFdmVudFRpbWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW5XaXRob3V0TW9kaWZpZXIoKSB7CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbldpdGhvdXRNb2RpZmllck1pZGRsZSgpIHsKKyAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDEpOworICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50Mik7CisgICAgICAgIG1RdWV1ZS5hZGQobUVsZW1lbnQzKTsKKyAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDQpOworCisgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gMTIzOworICAgICAgICBFbGVtZW50LnNQaGFudG9tVXBDb3VudCA9IDA7CisgICAgICAgIG1RdWV1ZS5yZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4obUVsZW1lbnQzLCBldmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzMgNF0iLCBtUXVldWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhldmVudFRpbWUgKyAxLCBtRWxlbWVudDEubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhldmVudFRpbWUgKyAyLCBtRWxlbWVudDIubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQzLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50NC5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuV2l0aG91dE1vZGlmaWVyTGFzdCgpIHsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDEpOwogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50Mik7CiAgICAgICAgIG1RdWV1ZS5hZGQobUVsZW1lbnQzKTsKQEAgLTIyMSwxOSArMjQwLDEzIEBACiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gMTIzOwogICAgICAgICBFbGVtZW50LnNQaGFudG9tVXBDb3VudCA9IDA7CiAgICAgICAgIG1RdWV1ZS5yZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4obUVsZW1lbnQ0LCBldmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbiB3aXRob3V0IG1vZGlmaWVyIiwKLSAgICAgICAgICAgICAgICAzLCBFbGVtZW50LnNQaGFudG9tVXBDb3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuIHdpdGhvdXQgbW9kaWZpZXIiLCAxLCBtUXVldWUuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4gd2l0aG91dCBtb2RpZmllciIsCi0gICAgICAgICAgICAgICAgIls0XSIsIG1RdWV1ZS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4gd2l0aG91dCBtb2RpZmllciBlbGVtZW50MSIsCi0gICAgICAgICAgICAgICAgZXZlbnRUaW1lICsgMSwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc09sZGVyVGhhbiB3aXRob3V0IG1vZGlmaWVyIGVsZW1lbnQyIiwKLSAgICAgICAgICAgICAgICBldmVudFRpbWUgKyAyLCBtRWxlbWVudDIubVBoYW50b21VcEV2ZW50VGltZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgcmVsZWFzZUFsbFBvaW50ZXJzT2xkZXJUaGFuIHdpdGhvdXQgbW9kaWZpZXIgZWxlbWVudDMiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDMsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNPbGRlclRoYW4gd2l0aG91dCBtb2RpZmllciBlbGVtZW50NCIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50NC5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1RdWV1ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIls0XSIsIG1RdWV1ZS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50VGltZSArIDEsIG1FbGVtZW50MS5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50VGltZSArIDIsIG1FbGVtZW50Mi5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50VGltZSArIDMsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDQubVBoYW50b21VcEV2ZW50VGltZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VBbGxQb2ludGVyc0V4Y2VwdCgpIHsKQEAgLTI0NiwxNyArMjU5LDEzIEBACiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gMTIzOwogICAgICAgICBFbGVtZW50LnNQaGFudG9tVXBDb3VudCA9IDA7CiAgICAgICAgIG1RdWV1ZS5yZWxlYXNlQWxsUG9pbnRlcnNFeGNlcHQobUVsZW1lbnQzLCBldmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc0V4Y2VwdCIsIDMsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNFeGNlcHQiLCAxLCBtUXVldWUuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNFeGNlcHQiLCAiWzNdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc0V4Y2VwdCBlbGVtZW50MSIsCi0gICAgICAgICAgICAgICAgZXZlbnRUaW1lICsgMSwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc0V4Y2VwdCBlbGVtZW50MiIsCi0gICAgICAgICAgICAgICAgZXZlbnRUaW1lICsgMiwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIHJlbGVhc2VBbGxQb2ludGVyc0V4Y2VwdCBlbGVtZW50MyIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciByZWxlYXNlQWxsUG9pbnRlcnNFeGNlcHQgZWxlbWVudDQiLAotICAgICAgICAgICAgICAgIGV2ZW50VGltZSArIDMsIG1FbGVtZW50NC5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1RdWV1ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlszXSIsIG1RdWV1ZS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50VGltZSArIDEsIG1FbGVtZW50MS5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50VGltZSArIDIsIG1FbGVtZW50Mi5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDMubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhldmVudFRpbWUgKyAzLCBtRWxlbWVudDQubVBoYW50b21VcEV2ZW50VGltZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKCkgewpAQCAtMjY4LDU0ICsyNzcsNDYgQEAKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDMpOwogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50NCk7CiAKLSAgICAgICAgYXNzZXJ0RmFsc2UoImhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQxIiwgbVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50MSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4gZWxlbWVudDIiLCBtUXVldWUuaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4obUVsZW1lbnQyKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJoYXNNb2RpZmllcktleU9sZGVyVGhhbiBlbGVtZW50MyIsIG1RdWV1ZS5oYXNNb2RpZmllcktleU9sZGVyVGhhbihtRWxlbWVudDMpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQ0IiwgbVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50NCkpOworICAgICAgICBhc3NlcnRGYWxzZShtUXVldWUuaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4obUVsZW1lbnQxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1RdWV1ZS5oYXNNb2RpZmllcktleU9sZGVyVGhhbihtRWxlbWVudDIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50MykpOworICAgICAgICBhc3NlcnRGYWxzZShtUXVldWUuaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4obUVsZW1lbnQ0KSk7CiAKICAgICAgICAgbUVsZW1lbnQyLm1Jc01vZGlmaWVyID0gdHJ1ZTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQxIiwgbVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50MSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4gZWxlbWVudDIiLCBtUXVldWUuaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4obUVsZW1lbnQyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQzIiwgbVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50MykpOwotICAgICAgICBhc3NlcnRUcnVlKCJoYXNNb2RpZmllcktleU9sZGVyVGhhbiBlbGVtZW50NCIsIG1RdWV1ZS5oYXNNb2RpZmllcktleU9sZGVyVGhhbihtRWxlbWVudDQpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50MSkpOworICAgICAgICBhc3NlcnRGYWxzZShtUXVldWUuaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4obUVsZW1lbnQyKSk7CisgICAgICAgIGFzc2VydFRydWUobVF1ZXVlLmhhc01vZGlmaWVyS2V5T2xkZXJUaGFuKG1FbGVtZW50MykpOworICAgICAgICBhc3NlcnRUcnVlKG1RdWV1ZS5oYXNNb2RpZmllcktleU9sZGVyVGhhbihtRWxlbWVudDQpKTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIiwgMCwgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIiwgNCwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgaGFzTW9kaWZpZXJLZXlPbGRlclRoYW4iLCAiWzEgMiAzIDRdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQxIiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQxLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQyIiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQzIiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQzLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGhhc01vZGlmaWVyS2V5T2xkZXJUaGFuIGVsZW1lbnQ0IiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQ0Lm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzEgMiAzIDRdIiwgbVF1ZXVlLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50MS5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDIubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQzLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50NC5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBbnlJblNsaWRpbmdLZXlJbnB1dCgpIHsKICAgICAgICAgRWxlbWVudC5zUGhhbnRvbVVwQ291bnQgPSAwOwotICAgICAgICBhc3NlcnRGYWxzZSgiaXNBbnlJblNsaWRpbmdLZXlJbnB1dCBlbXB0eSIsIG1RdWV1ZS5pc0FueUluU2xpZGluZ0tleUlucHV0KCkpOworICAgICAgICBhc3NlcnRGYWxzZShtUXVldWUuaXNBbnlJblNsaWRpbmdLZXlJbnB1dCgpKTsKIAogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50MSk7CiAgICAgICAgIG1RdWV1ZS5hZGQobUVsZW1lbnQyKTsKICAgICAgICAgbVF1ZXVlLmFkZChtRWxlbWVudDMpOwogICAgICAgICBtUXVldWUuYWRkKG1FbGVtZW50NCk7CiAKLSAgICAgICAgYXNzZXJ0RmFsc2UoImlzQW55SW5TbGlkaW5nS2V5SW5wdXQgZWxlbWVudDEiLCBtUXVldWUuaXNBbnlJblNsaWRpbmdLZXlJbnB1dCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVF1ZXVlLmlzQW55SW5TbGlkaW5nS2V5SW5wdXQoKSk7CiAKICAgICAgICAgbUVsZW1lbnQzLm1Jc0luU2xpZGluZ0tleUlucHV0ID0gdHJ1ZTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNBbnlJblNsaWRpbmdLZXlJbnB1dCBlbGVtZW50MSIsIG1RdWV1ZS5pc0FueUluU2xpZGluZ0tleUlucHV0KCkpOworICAgICAgICBhc3NlcnRUcnVlKG1RdWV1ZS5pc0FueUluU2xpZGluZ0tleUlucHV0KCkpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgaXNBbnlJblNsaWRpbmdLZXlJbnB1dCIsIDAsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciBpc0FueUluU2xpZGluZ0tleUlucHV0IiwgNCwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgaXNBbnlJblNsaWRpbmdLZXlJbnB1dCIsICJbMSAyIDMgNF0iLCBtUXVldWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgaXNBbnlJblNsaWRpbmdLZXlJbnB1dCBlbGVtZW50MSIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50MS5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhZnRlciBpc0FueUluU2xpZGluZ0tleUlucHV0IGVsZW1lbnQyIiwKLSAgICAgICAgICAgICAgICBFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFmdGVyIGlzQW55SW5TbGlkaW5nS2V5SW5wdXQgZWxlbWVudDMiLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDMubVBoYW50b21VcEV2ZW50VGltZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWZ0ZXIgaXNBbnlJblNsaWRpbmdLZXlJbnB1dCBlbGVtZW50NCIsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50NC5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEVsZW1lbnQuc1BoYW50b21VcENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIG1RdWV1ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsxIDIgMyA0XSIsIG1RdWV1ZS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDEubVBoYW50b21VcEV2ZW50VGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFbGVtZW50Lk5PVF9IQVBQRU5FRCwgbUVsZW1lbnQyLm1QaGFudG9tVXBFdmVudFRpbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRWxlbWVudC5OT1RfSEFQUEVORUQsIG1FbGVtZW50My5tUGhhbnRvbVVwRXZlbnRUaW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVsZW1lbnQuTk9UX0hBUFBFTkVELCBtRWxlbWVudDQubVBoYW50b21VcEV2ZW50VGltZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JsdWVVbmRlcmxpbmVUZXN0cy5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JsdWVVbmRlcmxpbmVUZXN0cy5qYXZhCmluZGV4IDcyNzVkM2EuLmM0ZmQ1YTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CbHVlVW5kZXJsaW5lVGVzdHMuamF2YQorKysgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmx1ZVVuZGVybGluZVRlc3RzLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgdHlwZShTVFJJTkdfVE9fVFlQRSk7CiAgICAgICAgIHNsZWVwKERFTEFZX1RPX1dBSVRfRk9SX1VOREVSTElORSk7CiAgICAgICAgIHJ1bk1lc3NhZ2VzKCk7Ci0gICAgICAgIGZpbmFsIFNwYW5HZXR0ZXIgc3BhbiA9IG5ldyBTcGFuR2V0dGVyKG1UZXh0Vmlldy5nZXRUZXh0KCksIFN1Z2dlc3Rpb25TcGFuLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3BhbkdldHRlciBzcGFuID0gbmV3IFNwYW5HZXR0ZXIobUVkaXRUZXh0LmdldFRleHQoKSwgU3VnZ2VzdGlvblNwYW4uY2xhc3MpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInNob3cgYmx1ZSB1bmRlcmxpbmUsIHNwYW4gc3RhcnQiLCBFWFBFQ1RFRF9TUEFOX1NUQVJULCBzcGFuLm1TdGFydCk7CiAgICAgICAgIGFzc2VydEVxdWFscygic2hvdyBibHVlIHVuZGVybGluZSwgc3BhbiBlbmQiLCBFWFBFQ1RFRF9TUEFOX0VORCwgc3Bhbi5tRW5kKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG93IGJsdWUgdW5kZXJsaW5lLCBzcGFuIGNvbG9yIiwgdHJ1ZSwgc3Bhbi5pc0F1dG9Db3JyZWN0aW9uSW5kaWNhdG9yKCkpOwpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICB0eXBlKFNUUklOR18yX1RPX1RZUEUpOwogICAgICAgICAvLyBXZSBoYXZlbid0IGhhdmUgdGltZSB0byBsb29rIGludG8gdGhlIGRpY3Rpb25hcnkgeWV0LCBzbyB0aGUgbGluZSBzaG91bGQgc3RpbGwgYmUKICAgICAgICAgLy8gYmx1ZSB0byBhdm9pZCBhbnkgZmxpY2tlci4KLSAgICAgICAgZmluYWwgU3BhbkdldHRlciBzcGFuQmVmb3JlID0gbmV3IFNwYW5HZXR0ZXIobVRleHRWaWV3LmdldFRleHQoKSwgU3VnZ2VzdGlvblNwYW4uY2xhc3MpOworICAgICAgICBmaW5hbCBTcGFuR2V0dGVyIHNwYW5CZWZvcmUgPSBuZXcgU3BhbkdldHRlcihtRWRpdFRleHQuZ2V0VGV4dCgpLCBTdWdnZXN0aW9uU3Bhbi5jbGFzcyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZXh0ZW5kIGJsdWUgdW5kZXJsaW5lLCBzcGFuIHN0YXJ0IiwgRVhQRUNURURfU1BBTl9TVEFSVCwgc3BhbkJlZm9yZS5tU3RhcnQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImV4dGVuZCBibHVlIHVuZGVybGluZSwgc3BhbiBlbmQiLCBFWFBFQ1RFRF9TUEFOX0VORCwgc3BhbkJlZm9yZS5tRW5kKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJleHRlbmQgYmx1ZSB1bmRlcmxpbmUsIHNwYW4gY29sb3IiLCB0cnVlLApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICBzbGVlcChERUxBWV9UT19XQUlUX0ZPUl9VTkRFUkxJTkUpOwogICAgICAgICBydW5NZXNzYWdlcygpOwogICAgICAgICAvLyBOb3cgd2UgaGF2ZSBiZWVuIGFibGUgdG8gcmUtZXZhbHVhdGUgdGhlIHdvcmQsIHRoZXJlIHNob3VsZG4ndCBiZSBhbiBhdXRvLWNvcnJlY3Rpb24gc3BhbgotICAgICAgICBmaW5hbCBTcGFuR2V0dGVyIHNwYW5BZnRlciA9IG5ldyBTcGFuR2V0dGVyKG1UZXh0Vmlldy5nZXRUZXh0KCksIFN1Z2dlc3Rpb25TcGFuLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3BhbkdldHRlciBzcGFuQWZ0ZXIgPSBuZXcgU3BhbkdldHRlcihtRWRpdFRleHQuZ2V0VGV4dCgpLCBTdWdnZXN0aW9uU3Bhbi5jbGFzcyk7CiAgICAgICAgIGFzc2VydE51bGwoImhpZGUgYmx1ZSB1bmRlcmxpbmUiLCBzcGFuQWZ0ZXIubVNwYW4pOwogICAgIH0KIApAQCAtNzYsMTAgKzc2LDEwIEBACiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKICAgICAgICAgc2xlZXAoREVMQVlfVE9fV0FJVF9GT1JfVU5ERVJMSU5FKTsKICAgICAgICAgcnVuTWVzc2FnZXMoKTsKLSAgICAgICAgZmluYWwgU3BhbkdldHRlciBzdWdnZXN0aW9uU3BhbiA9IG5ldyBTcGFuR2V0dGVyKG1UZXh0Vmlldy5nZXRUZXh0KCksIFN1Z2dlc3Rpb25TcGFuLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3BhbkdldHRlciBzdWdnZXN0aW9uU3BhbiA9IG5ldyBTcGFuR2V0dGVyKG1FZGl0VGV4dC5nZXRUZXh0KCksIFN1Z2dlc3Rpb25TcGFuLmNsYXNzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG93IG5vIGJsdWUgdW5kZXJsaW5lIGFmdGVyIGJhY2tzcGFjZSwgc3BhbiBzdGFydCBzaG91bGQgYmUgLTEiLAogICAgICAgICAgICAgICAgIEVYUEVDVEVEX1NVR0dFU1RJT05fU1BBTl9TVEFSVCwgc3VnZ2VzdGlvblNwYW4ubVN0YXJ0KTsKLSAgICAgICAgZmluYWwgU3BhbkdldHRlciB1bmRlcmxpbmVTcGFuID0gbmV3IFNwYW5HZXR0ZXIobVRleHRWaWV3LmdldFRleHQoKSwgVW5kZXJsaW5lU3Bhbi5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNwYW5HZXR0ZXIgdW5kZXJsaW5lU3BhbiA9IG5ldyBTcGFuR2V0dGVyKG1FZGl0VGV4dC5nZXRUZXh0KCksIFVuZGVybGluZVNwYW4uY2xhc3MpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInNob3VsZCBiZSBjb21wb3NpbmcsIHNvIHNob3VsZCBoYXZlIGFuIHVuZGVybGluZSBzcGFuIiwKICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9VTkRFUkxJTkVfU1BBTl9TVEFSVCwgdW5kZXJsaW5lU3Bhbi5tU3RhcnQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInNob3VsZCBiZSBjb21wb3NpbmcsIHNvIHNob3VsZCBoYXZlIGFuIHVuZGVybGluZSBzcGFuIiwKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIE5FV19DVVJTT1JfUE9TSVRJT04sIE5FV19DVVJTT1JfUE9TSVRJT04sIC0xLCAtMSk7CiAgICAgICAgIHNsZWVwKERFTEFZX1RPX1dBSVRfRk9SX1VOREVSTElORSk7CiAgICAgICAgIHJ1bk1lc3NhZ2VzKCk7Ci0gICAgICAgIGZpbmFsIFNwYW5HZXR0ZXIgc3BhbiA9IG5ldyBTcGFuR2V0dGVyKG1UZXh0Vmlldy5nZXRUZXh0KCksIFN1Z2dlc3Rpb25TcGFuLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3BhbkdldHRlciBzcGFuID0gbmV3IFNwYW5HZXR0ZXIobUVkaXRUZXh0LmdldFRleHQoKSwgU3VnZ2VzdGlvblNwYW4uY2xhc3MpOwogICAgICAgICBhc3NlcnROdWxsKCJibHVlIHVuZGVybGluZSByZW1vdmVkIHdoZW4gY3Vyc29yIGlzIG1vdmVkIiwgc3Bhbi5tU3Bhbik7CiAgICAgfQogCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgLy8gSGVyZSB0aGUgYmx1ZSB1bmRlcmxpbmUgaGFzIGJlZW4gc2V0LiB0ZXN0Qmx1ZVVuZGVybGluZSgpIGlzIHRlc3RpbmcgZm9yIHRoaXMgYWxyZWFkeSwKICAgICAgICAgLy8gc28gbGV0J3Mgbm90IHRlc3QgaXQgaGVyZSBhZ2Fpbi4KICAgICAgICAgLy8gTm93IHNpbXVsYXRlIHRoZSB1c2VyIG1vdmluZyB0aGUgY3Vyc29yLgotICAgICAgICBTcGFuR2V0dGVyIHNwYW4gPSBuZXcgU3BhbkdldHRlcihtVGV4dFZpZXcuZ2V0VGV4dCgpLCBVbmRlcmxpbmVTcGFuLmNsYXNzKTsKKyAgICAgICAgU3BhbkdldHRlciBzcGFuID0gbmV3IFNwYW5HZXR0ZXIobUVkaXRUZXh0LmdldFRleHQoKSwgVW5kZXJsaW5lU3Bhbi5jbGFzcyk7CiAgICAgICAgIGFzc2VydE51bGwoInNob3VsZCBub3QgYmUgY29tcG9zaW5nLCBzbyBzaG91bGQgbm90IGhhdmUgYW4gdW5kZXJsaW5lIHNwYW4iLCBzcGFuLm1TcGFuKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vSW5wdXRMb2dpY1Rlc3RzLmphdmEgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vSW5wdXRMb2dpY1Rlc3RzLmphdmEKaW5kZXggNzJjOGQ5Yy4uOTE0MDE5NyAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0lucHV0TG9naWNUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9JbnB1dExvZ2ljVGVzdHMuamF2YQpAQCAtMjQsNyArMjQsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlV29yZCgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIFdPUkRfVE9fVFlQRSA9ICJhYmNkIjsKICAgICAgICAgdHlwZShXT1JEX1RPX1RZUEUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInR5cGUgd29yZCIsIFdPUkRfVE9fVFlQRSwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlIHdvcmQiLCBXT1JEX1RPX1RZUEUsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFBpY2tTdWdnZXN0aW9uVGhlbkJhY2tzcGFjZSgpIHsKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgbUxhdGluSU1FLm9uVXBkYXRlU2VsZWN0aW9uKDAsIDAsIFdPUkRfVE9fVFlQRS5sZW5ndGgoKSwgV09SRF9UT19UWVBFLmxlbmd0aCgpLCAtMSwgLTEpOwogICAgICAgICB0eXBlKENvbnN0YW50cy5DT0RFX0RFTEVURSk7CiAgICAgICAgIGFzc2VydEVxdWFscygicHJlc3Mgc3VnZ2VzdGlvbiB0aGVuIGJhY2tzcGFjZSIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFBpY2tBdXRvQ29ycmVjdGlvblRoZW5CYWNrc3BhY2UoKSB7CkBAIC00OCwxMCArNDgsMTAgQEAKICAgICAgICAgcGlja1N1Z2dlc3Rpb25NYW51YWxseSgwLCBXT1JEX1RPX1BJQ0spOwogICAgICAgICBtTGF0aW5JTUUub25VcGRhdGVTZWxlY3Rpb24oMCwgMCwgV09SRF9UT19UWVBFLmxlbmd0aCgpLCBXT1JEX1RPX1RZUEUubGVuZ3RoKCksIC0xLCAtMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygicGljayB0eXBlZCB3b3JkIG92ZXIgYXV0by1jb3JyZWN0aW9uIHRoZW4gYmFja3NwYWNlIiwgV09SRF9UT19QSUNLLAotICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICAgICAgdHlwZShDb25zdGFudHMuQ09ERV9ERUxFVEUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInBpY2sgdHlwZWQgd29yZCBvdmVyIGF1dG8tY29ycmVjdGlvbiB0aGVuIGJhY2tzcGFjZSIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFBpY2tUeXBlZFdvcmRPdmVyQXV0b0NvcnJlY3Rpb25UaGVuQmFja3NwYWNlKCkgewpAQCAtNjMsMTAgKzYzLDEwIEBACiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMSwgV09SRF9UT19UWVBFKTsKICAgICAgICAgbUxhdGluSU1FLm9uVXBkYXRlU2VsZWN0aW9uKDAsIDAsIFdPUkRfVE9fVFlQRS5sZW5ndGgoKSwgV09SRF9UT19UWVBFLmxlbmd0aCgpLCAtMSwgLTEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInBpY2sgdHlwZWQgd29yZCBvdmVyIGF1dG8tY29ycmVjdGlvbiB0aGVuIGJhY2tzcGFjZSIsIFdPUkRfVE9fVFlQRSwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwaWNrIHR5cGVkIHdvcmQgb3ZlciBhdXRvLWNvcnJlY3Rpb24gdGhlbiBiYWNrc3BhY2UiLCBFWFBFQ1RFRF9SRVNVTFQsCi0gICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrRGlmZmVyZW50U3VnZ2VzdGlvblRoZW5CYWNrc3BhY2UoKSB7CkBAIC03OSwxMCArNzksMTAgQEAKICAgICAgICAgcGlja1N1Z2dlc3Rpb25NYW51YWxseSgyLCBXT1JEX1RPX1BJQ0spOwogICAgICAgICBtTGF0aW5JTUUub25VcGRhdGVTZWxlY3Rpb24oMCwgMCwgV09SRF9UT19UWVBFLmxlbmd0aCgpLCBXT1JEX1RPX1RZUEUubGVuZ3RoKCksIC0xLCAtMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygicGljayBkaWZmZXJlbnQgc3VnZ2VzdGlvbiB0aGVuIGJhY2tzcGFjZSIsIFdPUkRfVE9fUElDSywKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwaWNrIGRpZmZlcmVudCBzdWdnZXN0aW9uIHRoZW4gYmFja3NwYWNlIiwgRVhQRUNURURfUkVTVUxULAotICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU2VsZWN0aW9uKCkgewpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICAgIG1MYXRpbklNRS5vblVwZGF0ZVNlbGVjdGlvbih0eXBlZExlbmd0aCwgdHlwZWRMZW5ndGgsCiAgICAgICAgICAgICAgICAgU0VMRUNUSU9OX1NUQVJULCBTRUxFQ1RJT05fRU5ELCAtMSwgLTEpOwogICAgICAgICB0eXBlKENvbnN0YW50cy5DT0RFX0RFTEVURSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGVsZXRlIHNlbGVjdGlvbiIsIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWxldGUgc2VsZWN0aW9uIiwgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVTZWxlY3Rpb25Ud2ljZSgpIHsKQEAgLTEyMywyMSArMTIzLDIxIEBACiAgICAgICAgICAgICAgICAgU0VMRUNUSU9OX1NUQVJULCBTRUxFQ1RJT05fRU5ELCAtMSwgLTEpOwogICAgICAgICB0eXBlKENvbnN0YW50cy5DT0RFX0RFTEVURSk7CiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWxldGUgc2VsZWN0aW9uIHR3aWNlIiwgRVhQRUNURURfUkVTVUxULCBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlbGV0ZSBzZWxlY3Rpb24gdHdpY2UiLCBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9Db3JyZWN0KCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgU1RSSU5HX1RPX1RZUEUgPSAidGdpcyAiOwogICAgICAgICBmaW5hbCBTdHJpbmcgRVhQRUNURURfUkVTVUxUID0gInRoaXMgIjsKICAgICAgICAgdHlwZShTVFJJTkdfVE9fVFlQRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2ltcGxlIGF1dG8tY29ycmVjdCIsIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaW1wbGUgYXV0by1jb3JyZWN0IiwgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29ycmVjdFdpdGhQZXJpb2QoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBTVFJJTkdfVE9fVFlQRSA9ICJ0Z2lzLiI7CiAgICAgICAgIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9SRVNVTFQgPSAidGhpcy4iOwogICAgICAgICB0eXBlKFNUUklOR19UT19UWVBFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRvLWNvcnJlY3Qgd2l0aCBwZXJpb2QiLCBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXV0by1jb3JyZWN0IHdpdGggcGVyaW9kIiwgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29ycmVjdFdpdGhQZXJpb2RUaGVuUmV2ZXJ0KCkgewpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIG1MYXRpbklNRS5vblVwZGF0ZVNlbGVjdGlvbigwLCAwLCBTVFJJTkdfVE9fVFlQRS5sZW5ndGgoKSwgU1RSSU5HX1RPX1RZUEUubGVuZ3RoKCksIC0xLCAtMSk7CiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRvLWNvcnJlY3Qgd2l0aCBwZXJpb2QgdGhlbiByZXZlcnQiLCBFWFBFQ1RFRF9SRVNVTFQsCi0gICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29ycmVjdFdpdGhTcGFjZVRoZW5SZXZlcnQoKSB7CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICAgICAgbUxhdGluSU1FLm9uVXBkYXRlU2VsZWN0aW9uKDAsIDAsIFNUUklOR19UT19UWVBFLmxlbmd0aCgpLCBTVFJJTkdfVE9fVFlQRS5sZW5ndGgoKSwgLTEsIC0xKTsKICAgICAgICAgdHlwZShDb25zdGFudHMuQ09ERV9ERUxFVEUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImF1dG8tY29ycmVjdCB3aXRoIHNwYWNlIHRoZW4gcmV2ZXJ0IiwgRVhQRUNURURfUkVTVUxULAotICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0NvcnJlY3RUb1NlbGZEb2VzTm90UmV2ZXJ0KCkgewpAQCAtMTY3LDE0ICsxNjcsMTQgQEAKICAgICAgICAgbUxhdGluSU1FLm9uVXBkYXRlU2VsZWN0aW9uKDAsIDAsIFNUUklOR19UT19UWVBFLmxlbmd0aCgpLCBTVFJJTkdfVE9fVFlQRS5sZW5ndGgoKSwgLTEsIC0xKTsKICAgICAgICAgdHlwZShDb25zdGFudHMuQ09ERV9ERUxFVEUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImF1dG8tY29ycmVjdCB3aXRoIHNwYWNlIGRvZXMgbm90IHJldmVydCIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVNwYWNlKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgU1RSSU5HX1RPX1RZUEUgPSAidGhpcyAgIjsKICAgICAgICAgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1JFU1VMVCA9ICJ0aGlzLiAiOwogICAgICAgICB0eXBlKFNUUklOR19UT19UWVBFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb3VibGUgc3BhY2UgbWFrZSBhIHBlcmlvZCIsIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb3VibGUgc3BhY2UgbWFrZSBhIHBlcmlvZCIsIEVYUEVDVEVEX1JFU1VMVCwgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsRG91YmxlU3BhY2UoKSB7CkBAIC0xODIsNyArMTgyLDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1JFU1VMVCA9ICJ0aGlzICAiOwogICAgICAgICB0eXBlKFNUUklOR19UT19UWVBFKTsKICAgICAgICAgdHlwZShDb25zdGFudHMuQ09ERV9ERUxFVEUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRvdWJsZSBzcGFjZSBtYWtlIGEgcGVyaW9kIiwgRVhQRUNURURfUkVTVUxULCBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRvdWJsZSBzcGFjZSBtYWtlIGEgcGVyaW9kIiwgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrc3BhY2VBdFN0YXJ0QWZ0ZXJBdXRvY29ycmVjdCgpIHsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICAgICAgICAgIE5FV19DVVJTT1JfUE9TSVRJT04sIE5FV19DVVJTT1JfUE9TSVRJT04sIC0xLCAtMSk7CiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRvIGNvcnJlY3QgdGhlbiBtb3ZlIGN1cnNvciB0byBzdGFydCBvZiBsaW5lIHRoZW4gYmFja3NwYWNlIiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29ycmVjdFRoZW5Nb3ZlQ3Vyc29yVGhlbkJhY2tzcGFjZSgpIHsKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICAgICAgICAgIE5FV19DVVJTT1JfUE9TSVRJT04sIE5FV19DVVJTT1JfUE9TSVRJT04sIC0xLCAtMSk7CiAgICAgICAgIHR5cGUoQ29uc3RhbnRzLkNPREVfREVMRVRFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRvIGNvcnJlY3QgdGhlbiBtb3ZlIGN1cnNvciB0aGVuIGJhY2tzcGFjZSIsCi0gICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEVYUEVDVEVEX1JFU1VMVCwgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TcGFjZUFmdGVyTWFudWFsUGljaygpIHsKQEAgLTIyMSw3ICsyMjEsNyBAQAogICAgICAgICB0eXBlKFdPUkRfVE9fVFlQRSk7CiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRF9UT19UWVBFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBzcGFjZSBhZnRlciBtYW51YWwgcGljayIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbFBpY2tUaGVuVHlwZSgpIHsKQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgICAgICB0eXBlKFdPUkQxX1RPX1RZUEUpOwogICAgICAgICBwaWNrU3VnZ2VzdGlvbk1hbnVhbGx5KDAsIFdPUkQxX1RPX1RZUEUpOwogICAgICAgICB0eXBlKFdPUkQyX1RPX1RZUEUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1hbnVhbCBwaWNrIHRoZW4gdHlwZSIsIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYW51YWwgcGljayB0aGVuIHR5cGUiLCBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbFBpY2tUaGVuU2VwYXJhdG9yKCkgewpAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgICAgIHR5cGUoV09SRDFfVE9fVFlQRSk7CiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRDFfVE9fVFlQRSk7CiAgICAgICAgIHR5cGUoV09SRDJfVE9fVFlQRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWFudWFsIHBpY2sgdGhlbiBzZXBhcmF0b3IiLCBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWFudWFsIHBpY2sgdGhlbiBzZXBhcmF0b3IiLCBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbFBpY2tUaGVuU3RyaXBwZXJUaGVuUGljaygpIHsKQEAgLTI1NCw3ICsyNTQsNyBAQAogICAgICAgICB0eXBlKFdPUkRfVE9fVFlQRSk7CiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRF9UT19UWVBFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYW51YWwgcGljayB0aGVuIFxcbiB0aGVuIG1hbnVhbCBwaWNrIiwgRVhQRUNURURfUkVTVUxULAotICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFudWFsUGlja1RoZW5TcGFjZVRoZW5UeXBlKCkgewpAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRDFfVE9fVFlQRSk7CiAgICAgICAgIHR5cGUoV09SRDJfVE9fVFlQRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibWFudWFsIHBpY2sgdGhlbiBzcGFjZSB0aGVuIHR5cGUiLCBFWFBFQ1RFRF9SRVNVTFQsCi0gICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW51YWxQaWNrVGhlbk1hbnVhbFBpY2soKSB7CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgLy8gdG8gYWN0dWFsbHkgcGFzcyB0aGUgcmlnaHQgc3RyaW5nLgogICAgICAgICBwaWNrU3VnZ2VzdGlvbk1hbnVhbGx5KDEsIFdPUkQyX1RPX1BJQ0spOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1hbnVhbCBwaWNrIHRoZW4gbWFudWFsIHBpY2siLCBFWFBFQ1RFRF9SRVNVTFQsCi0gICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVXaG9sZUNvbXBvc2luZ1dvcmQoKSB7CkBAIC0yODgsNyArMjg4LDcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBXT1JEX1RPX1RZUEUubGVuZ3RoKCk7ICsraSkgewogICAgICAgICAgICAgdHlwZShDb25zdGFudHMuQ09ERV9ERUxFVEUpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGVsZXRlIHdob2xlIGNvbXBvc2luZyB3b3JkIiwgIiIsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVsZXRlIHdob2xlIGNvbXBvc2luZyB3b3JkIiwgIiIsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogICAgIC8vIFRPRE86IEFkZCBzb21lIHRlc3RzIGZvciBub24tQk1QIGNoYXJhY3RlcnMKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9JbnB1dExvZ2ljVGVzdHNOb25FbmdsaXNoLmphdmEgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vSW5wdXRMb2dpY1Rlc3RzTm9uRW5nbGlzaC5qYXZhCmluZGV4IDMzM2I2MDIuLjJkNzM2ZTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9JbnB1dExvZ2ljVGVzdHNOb25FbmdsaXNoLmphdmEKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0lucHV0TG9naWNUZXN0c05vbkVuZ2xpc2guamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBjaGFuZ2VMYW5ndWFnZSgiZnIiKTsKICAgICAgICAgdHlwZShTVFJJTkdfVE9fVFlQRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygic2ltcGxlIGF1dG8tY29ycmVjdCBmb3IgRnJlbmNoIiwgRVhQRUNURURfUkVTVUxULAotICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFudWFsUGlja1RoZW5TZXBhcmF0b3JGb3JGcmVuY2goKSB7CkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRDFfVE9fVFlQRSk7CiAgICAgICAgIHR5cGUoV09SRDJfVE9fVFlQRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibWFudWFsIHBpY2sgdGhlbiBzZXBhcmF0b3IgZm9yIEZyZW5jaCIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFdvcmRUaGVuU3BhY2VUaGVuUHVuY3R1YXRpb25Gcm9tU3RyaXBUd2ljZUZvckZyZW5jaCgpIHsKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgUFVOQ1RVQVRJT05fRlJPTV9TVFJJUCk7CiAgICAgICAgICAgICBwaWNrU3VnZ2VzdGlvbk1hbnVhbGx5KDAsIFBVTkNUVUFUSU9OX0ZST01fU1RSSVApOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlIHdvcmQgdGhlbiB0eXBlIHNwYWNlIHRoZW4gcHVuY3R1YXRpb24gZnJvbSBzdHJpcCB0d2ljZSBmb3IgRnJlbmNoIiwKLSAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBzZXRCb29sZWFuUHJlZmVyZW5jZShORVhUX1dPUkRfUFJFRElDVElPTl9PUFRJT04sIHByZXZpb3VzTmV4dFdvcmRQcmVkaWN0aW9uT3B0aW9uLAogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TmV4dFdvcmRQcmVkaWN0aW9uT3B0aW9uKTsKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgY2hhbmdlTGFuZ3VhZ2UoImRlIik7CiAgICAgICAgIHR5cGUoU1RSSU5HX1RPX1RZUEUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInNpbXBsZSBhdXRvLWNvcnJlY3QgZm9yIEdlcm1hbiIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9Db3JyZWN0V2l0aFVtbGF1dEZvckdlcm1hbigpIHsKQEAgLTEwNyw2ICsxMDcsNiBAQAogICAgICAgICBjaGFuZ2VMYW5ndWFnZSgiZGUiKTsKICAgICAgICAgdHlwZShTVFJJTkdfVE9fVFlQRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiYXV0by1jb3JyZWN0IHdpdGggdW1sYXV0IGZvciBHZXJtYW4iLCBFWFBFQ1RFRF9SRVNVTFQsCi0gICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9JbnB1dFRlc3RzQmFzZS5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0lucHV0VGVzdHNCYXNlLmphdmEKaW5kZXggOWUxMDdhNC4uYWVjNGFhYyAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0lucHV0VGVzdHNCYXNlLmphdmEKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0lucHV0VGVzdHNCYXNlLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWU7CiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0VHlwZTsKQEAgLTMxLDggKzMwLDggQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5rZXlib2FyZC5LZXk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Qua2V5Ym9hcmQuS2V5Ym9hcmQ7CkBAIC00MCw3ICszOSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1wdWJsaWMgY2xhc3MgSW5wdXRUZXN0c0Jhc2UgZXh0ZW5kcyBTZXJ2aWNlVGVzdENhc2U8TGF0aW5JTUU+IHsKK3B1YmxpYyBjbGFzcyBJbnB1dFRlc3RzQmFzZSBleHRlbmRzIFNlcnZpY2VUZXN0Q2FzZTxMYXRpbklNRUZvclRlc3RzPiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUJVR19NT0RFID0gImRlYnVnX21vZGUiOwogCkBAIC00OSw3ICs0OCw3IEBACiAKICAgICBwcm90ZWN0ZWQgTGF0aW5JTUUgbUxhdGluSU1FOwogICAgIHByb3RlY3RlZCBLZXlib2FyZCBtS2V5Ym9hcmQ7Ci0gICAgcHJvdGVjdGVkIE15VGV4dFZpZXcgbVRleHRWaWV3OworICAgIHByb3RlY3RlZCBNeUVkaXRUZXh0IG1FZGl0VGV4dDsKICAgICBwcm90ZWN0ZWQgVmlldyBtSW5wdXRWaWV3OwogICAgIHByb3RlY3RlZCBJbnB1dENvbm5lY3Rpb24gbUlucHV0Q29ubmVjdGlvbjsKIApAQCAtODgsMjYgKzg3LDQxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBBIGhlbHBlciBjbGFzcyB0byBpbmNyZWFzZSBjb250cm9sIG92ZXIgdGhlIFRleHRWaWV3Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRleHRWaWV3IGV4dGVuZHMgVGV4dFZpZXcgeworICAgIC8vIEEgaGVscGVyIGNsYXNzIHRvIGluY3JlYXNlIGNvbnRyb2wgb3ZlciB0aGUgRWRpdFRleHQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RWRpdFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7CiAgICAgICAgIHB1YmxpYyBMb2NhbGUgbUN1cnJlbnRMb2NhbGU7Ci0gICAgICAgIHB1YmxpYyBNeVRleHRWaWV3KGZpbmFsIENvbnRleHQgYykgeworICAgICAgICBwdWJsaWMgTXlFZGl0VGV4dChmaW5hbCBDb250ZXh0IGMpIHsKICAgICAgICAgICAgIHN1cGVyKGMpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugb25BdHRhY2hlZFRvV2luZG93ICJwdWJsaWMiCiAgICAgICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIG92ZXJyaWRpbmcgaGlkZGVuIEFQSSBpbiBFZGl0VGV4dAogICAgICAgICBwdWJsaWMgTG9jYWxlIGdldFRleHRTZXJ2aWNlc0xvY2FsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFRleHRWaWV3IGlzIGFza2luZyB0aGlzIG1ldGhvZCBmb3IgdGhlIGxhbmd1YWdlCisgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBFZGl0VGV4dCBpcyBhc2tpbmcgdGhpcyBtZXRob2QgZm9yIHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgLy8gdG8gY2hlY2sgdGhlIHNwZWxsIGluLiBJZiB3ZSBkb24ndCBvdmVycmlkZSB0aGlzLCB0aGUgc3BlbGwgY2hlY2tlciB3aWxsIHJ1biBpbgogICAgICAgICAgICAgLy8gd2hhdGV2ZXIgbGFuZ3VhZ2UgdGhlIGtleWJvYXJkIGlzIGN1cnJlbnRseSBzZXQgb24gdGhlIHRlc3QgZGV2aWNlLCBpZ25vcmluZyBhbnkKICAgICAgICAgICAgIC8vIHNldHRpbmdzIHdlIGRvIGluc2lkZSB0aGUgdGVzdHMuCiAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRMb2NhbGU7CiAgICAgICAgIH0KKworICAgICAgICAvLyBvdmVycmlkaW5nIGhpZGRlbiBBUEkgaW4gRWRpdFRleHQKKyAgICAgICAgcHVibGljIExvY2FsZSBnZXRTcGVsbENoZWNrZXJMb2NhbGUoKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBFZGl0VGV4dCBpcyBhc2tpbmcgdGhpcyBtZXRob2QgZm9yIHRoZSBsYW5ndWFnZQorICAgICAgICAgICAgLy8gdG8gY2hlY2sgdGhlIHNwZWxsIGluLiBJZiB3ZSBkb24ndCBvdmVycmlkZSB0aGlzLCB0aGUgc3BlbGwgY2hlY2tlciB3aWxsIHJ1biBpbgorICAgICAgICAgICAgLy8gd2hhdGV2ZXIgbGFuZ3VhZ2UgdGhlIGtleWJvYXJkIGlzIGN1cnJlbnRseSBzZXQgb24gdGhlIHRlc3QgZGV2aWNlLCBpZ25vcmluZyBhbnkKKyAgICAgICAgICAgIC8vIHNldHRpbmdzIHdlIGRvIGluc2lkZSB0aGUgdGVzdHMuCisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRMb2NhbGU7CisgICAgICAgIH0KKwogICAgIH0KIAogICAgIHB1YmxpYyBJbnB1dFRlc3RzQmFzZSgpIHsKLSAgICAgICAgc3VwZXIoTGF0aW5JTUUuY2xhc3MpOworICAgICAgICBzdXBlcihMYXRpbklNRUZvclRlc3RzLmNsYXNzKTsKICAgICB9CiAKICAgICAvLyBUT0RPOiBJc24ndCB0aGVyZSBhIHdheSB0byBtYWtlIHRoaXMgZ2VuZXJpYyBzb21laG93PyBXZSBjYW4gdGFrZSBhIDxUPiBhbmQgcmV0dXJuIGEgPFQ+CkBAIC0xMzAsMTggKzE0NCwxOCBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1UZXh0VmlldyA9IG5ldyBNeVRleHRWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgIG1FZGl0VGV4dCA9IG5ldyBNeUVkaXRUZXh0KGdldENvbnRleHQoKSk7CiAgICAgICAgIGZpbmFsIGludCBpbnB1dFR5cGUgPSBJbnB1dFR5cGUuVFlQRV9DTEFTU19URVhUIHwgSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0FVVE9fQ09SUkVDVAogICAgICAgICAgICAgICAgIHwgSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX01VTFRJX0xJTkU7Ci0gICAgICAgIG1UZXh0Vmlldy5zZXRJbnB1dFR5cGUoaW5wdXRUeXBlKTsKLSAgICAgICAgbVRleHRWaWV3LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1FZGl0VGV4dC5zZXRJbnB1dFR5cGUoaW5wdXRUeXBlKTsKKyAgICAgICAgbUVkaXRUZXh0LnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHVwU2VydmljZSgpOwogICAgICAgICBtTGF0aW5JTUUgPSBnZXRTZXJ2aWNlKCk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJldmlvdXNEZWJ1Z1NldHRpbmcgPSBzZXREZWJ1Z01vZGUodHJ1ZSk7CiAgICAgICAgIG1MYXRpbklNRS5vbkNyZWF0ZSgpOwogICAgICAgICBzZXREZWJ1Z01vZGUocHJldmlvdXNEZWJ1Z1NldHRpbmcpOwogICAgICAgICBmaW5hbCBFZGl0b3JJbmZvIGVpID0gbmV3IEVkaXRvckluZm8oKTsKLSAgICAgICAgZmluYWwgSW5wdXRDb25uZWN0aW9uIGljID0gbVRleHRWaWV3Lm9uQ3JlYXRlSW5wdXRDb25uZWN0aW9uKGVpKTsKKyAgICAgICAgZmluYWwgSW5wdXRDb25uZWN0aW9uIGljID0gbUVkaXRUZXh0Lm9uQ3JlYXRlSW5wdXRDb25uZWN0aW9uKGVpKTsKICAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQogICAgICAgICAgICAgICAgIChMYXlvdXRJbmZsYXRlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKICAgICAgICAgZmluYWwgVmlld0dyb3VwIHZnID0gbmV3IEZyYW1lTGF5b3V0KGdldENvbnRleHQoKSk7CkBAIC0yMjUsOCArMjM5LDggQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VMYW5ndWFnZShmaW5hbCBTdHJpbmcgbG9jYWxlKSB7Ci0gICAgICAgIG1UZXh0Vmlldy5tQ3VycmVudExvY2FsZSA9IExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobG9jYWxlKTsKLSAgICAgICAgU3VidHlwZVN3aXRjaGVyLmdldEluc3RhbmNlKCkuZm9yY2VMb2NhbGUobVRleHRWaWV3Lm1DdXJyZW50TG9jYWxlKTsKKyAgICAgICAgbUVkaXRUZXh0Lm1DdXJyZW50TG9jYWxlID0gTG9jYWxlVXRpbHMuY29uc3RydWN0TG9jYWxlRnJvbVN0cmluZyhsb2NhbGUpOworICAgICAgICBTdWJ0eXBlU3dpdGNoZXIuZ2V0SW5zdGFuY2UoKS5mb3JjZUxvY2FsZShtRWRpdFRleHQubUN1cnJlbnRMb2NhbGUpOwogICAgICAgICBtTGF0aW5JTUUubG9hZEtleWJvYXJkKCk7CiAgICAgICAgIG1LZXlib2FyZCA9IG1MYXRpbklNRS5tS2V5Ym9hcmRTd2l0Y2hlci5nZXRLZXlib2FyZCgpOwogICAgICAgICB3YWl0Rm9yRGljdGlvbmFyeVRvQmVMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9MYXRpbklNRUZvclRlc3RzLmphdmEgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vTGF0aW5JTUVGb3JUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0N2M1NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vTGF0aW5JTUVGb3JUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluOworCitwdWJsaWMgY2xhc3MgTGF0aW5JTUVGb3JUZXN0cyBleHRlbmRzIExhdGluSU1FIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0Vmlld1Nob3duKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUHVuY3R1YXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1B1bmN0dWF0aW9uVGVzdHMuamF2YQppbmRleCAxYjJmMGU2Li44NGZmNmIzMCAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1B1bmN0dWF0aW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vUHVuY3R1YXRpb25UZXN0cy5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgICAgICBwaWNrU3VnZ2VzdGlvbk1hbnVhbGx5KDAsIFBVTkNUVUFUSU9OX0ZST01fU1RSSVApOwogICAgICAgICAgICAgcGlja1N1Z2dlc3Rpb25NYW51YWxseSgwLCBQVU5DVFVBVElPTl9GUk9NX1NUUklQKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygidHlwZSB3b3JkIHRoZW4gdHlwZSBzcGFjZSB0aGVuIHB1bmN0dWF0aW9uIGZyb20gc3RyaXAgdHdpY2UiLAotICAgICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEX1JFU1VMVCwgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHNldEJvb2xlYW5QcmVmZXJlbmNlKE5FWFRfV09SRF9QUkVESUNUSU9OX09QVElPTiwgcHJldmlvdXNOZXh0V29yZFByZWRpY3Rpb25PcHRpb24sCiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHROZXh0V29yZFByZWRpY3Rpb25PcHRpb24pOwpAQCAtNTYsNyArNTYsNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgRVhQRUNURURfUkVTVUxUID0gInRoaXMgISEiOwogICAgICAgICB0eXBlKFdPUkRfVE9fVFlQRSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibWFudWFsIHBpY2sgdGhlbiBzcGFjZSB0aGVuIHB1bmN0dWF0aW9uIGZyb20ga2V5Ym9hcmQgdHdpY2UiLCBFWFBFQ1RFRF9SRVNVTFQsCi0gICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW51YWxQaWNrVGhlblB1bmN0dWF0aW9uRnJvbVN0cmlwVHdpY2VUaGVuVHlwZSgpIHsKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgICAgcGlja1N1Z2dlc3Rpb25NYW51YWxseSgwLCBQVU5DVFVBVElPTl9GUk9NX1NUUklQKTsKICAgICAgICAgdHlwZShXT1JEMl9UT19UWVBFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwaWNrIHdvcmQgdGhlbiBwaWNrIHB1bmN0dWF0aW9uIHR3aWNlIHRoZW4gdHlwZSIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbFBpY2tUaGVuTWFudWFsUGlja1dpdGhQdW5jdEF0U3RhcnQoKSB7CkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRDFfVE9fVFlQRSk7CiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMSwgV09SRDJfVE9fUElDSyk7CiAgICAgICAgIGFzc2VydEVxdWFscygibWFudWFsIHBpY2sgdGhlbiBtYW51YWwgcGljayBhIHdvcmQgd2l0aCBwdW5jdCBhdCBzdGFydCIsIEVYUEVDVEVEX1JFU1VMVCwKLSAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbGx5UGlja2VkV29yZFRoZW5Db2xvbigpIHsKQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgICAgcGlja1N1Z2dlc3Rpb25NYW51YWxseSgwLCBXT1JEX1RPX1RZUEUpOwogICAgICAgICB0eXBlKFBVTkNUVUFUSU9OKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYW51YWxseSBwaWNrIHdvcmQgdGhlbiBjb2xvbiIsCi0gICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtVGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEVYUEVDVEVEX1JFU1VMVCwgbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFudWFsbHlQaWNrZWRXb3JkVGhlbk9wZW5QYXJlbigpIHsKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICBwaWNrU3VnZ2VzdGlvbk1hbnVhbGx5KDAsIFdPUkRfVE9fVFlQRSk7CiAgICAgICAgIHR5cGUoUFVOQ1RVQVRJT04pOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1hbnVhbGx5IHBpY2sgd29yZCB0aGVuIG9wZW4gcGFyZW4iLAotICAgICAgICAgICAgICAgIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbGx5UGlja2VkV29yZFRoZW5DbG9zZVBhcmVuKCkgewpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRF9UT19UWVBFKTsKICAgICAgICAgdHlwZShQVU5DVFVBVElPTik7CiAgICAgICAgIGFzc2VydEVxdWFscygibWFudWFsbHkgcGljayB3b3JkIHRoZW4gY2xvc2UgcGFyZW4iLAotICAgICAgICAgICAgICAgIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbGx5UGlja2VkV29yZFRoZW5TbWlsZXkoKSB7CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgcGlja1N1Z2dlc3Rpb25NYW51YWxseSgwLCBXT1JEX1RPX1RZUEUpOwogICAgICAgICBtTGF0aW5JTUUub25UZXh0SW5wdXQoU1BFQ0lBTF9LRVkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1hbnVhbGx5IHBpY2sgd29yZCB0aGVuIHByZXNzIHRoZSBzbWlsZXkga2V5IiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW51YWxseVBpY2tlZFdvcmRUaGVuRG90Q29tKCkgewpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgICAgIHBpY2tTdWdnZXN0aW9uTWFudWFsbHkoMCwgV09SRF9UT19UWVBFKTsKICAgICAgICAgbUxhdGluSU1FLm9uVGV4dElucHV0KFNQRUNJQUxfS0VZKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYW51YWxseSBwaWNrIHdvcmQgdGhlbiBwcmVzcyB0aGUgLmNvbSBrZXkiLAotICAgICAgICAgICAgICAgIEVYUEVDVEVEX1JFU1VMVCwgbVRleHRWaWV3LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1FZGl0VGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVXb3JkVHlwZURvdFRoZW5QcmVzc0RvdENvbSgpIHsKQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgICAgICB0eXBlKFdPUkRfVE9fVFlQRSk7CiAgICAgICAgIG1MYXRpbklNRS5vblRleHRJbnB1dChTUEVDSUFMX0tFWSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidHlwZSB3b3JkIHR5cGUgZG90IHRoZW4gcHJlc3MgdGhlIC5jb20ga2V5IiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29ycmVjdGlvbldpdGhTaW5nbGVRdW90ZUluc2lkZSgpIHsKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgRVhQRUNURURfUkVTVUxUID0gInlvdSdkICI7CiAgICAgICAgIHR5cGUoV09SRF9UT19UWVBFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRvLWNvcnJlY3Rpb24gd2l0aCBzaW5nbGUgcXVvdGUgaW5zaWRlIiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29ycmVjdGlvbldpdGhTaW5nbGVRdW90ZXNBcm91bmQoKSB7CkBAIC0xNjIsNiArMTYyLDYgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1JFU1VMVCA9ICIndGhpcycgIjsKICAgICAgICAgdHlwZShXT1JEX1RPX1RZUEUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImF1dG8tY29ycmVjdGlvbiB3aXRoIHNpbmdsZSBxdW90ZXMgYXJvdW5kIiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9SRVNVTFQsIG1UZXh0Vmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRVhQRUNURURfUkVTVUxULCBtRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SZXNvdXJjZVV0aWxzVGVzdHMuamF2YSBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9SZXNvdXJjZVV0aWxzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE2ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1Jlc291cmNlVXRpbHNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbjsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlsc1Rlc3RzIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZERlZmF1bHRDb25zdGFudCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbnVsbEFycmF5ID0gbnVsbDsKKyAgICAgICAgYXNzZXJ0TnVsbChSZXNvdXJjZVV0aWxzLmZpbmREZWZhdWx0Q29uc3RhbnQobnVsbEFycmF5KSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZW1wdHlBcnJheSA9IHt9OworICAgICAgICBhc3NlcnROdWxsKFJlc291cmNlVXRpbHMuZmluZERlZmF1bHRDb25zdGFudChlbXB0eUFycmF5KSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gYXJyYXkgPSB7CisgICAgICAgICAgICAiSEFSRFdBUkU9Z3JvdXBlciwwLjMiLAorICAgICAgICAgICAgIkhBUkRXQVJFPW1ha28sMC40IiwKKyAgICAgICAgICAgICIsZGVmYXVsdFZhbHVlMSIsCisgICAgICAgICAgICAiSEFSRFdBUkU9bWFudGEsMC4yIiwKKyAgICAgICAgICAgICIsZGVmYXVsdFZhbHVlMiIsCisgICAgICAgIH07CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmREZWZhdWx0Q29uc3RhbnQoYXJyYXkpLCAiZGVmYXVsdFZhbHVlMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzU2ltcGxlKCkgeworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGFueUtleVZhbHVlID0gQ29sbGVjdGlvblV0aWxzLm5ld0hhc2hNYXAoKTsKKyAgICAgICAgYW55S2V5VmFsdWUucHV0KCJhbnlLZXkiLCAiYW55VmFsdWUiKTsKKyAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBudWxsS2V5VmFsdWUgPSBudWxsOworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGVtcHR5S2V5VmFsdWUgPSBDb2xsZWN0aW9uVXRpbHMubmV3SGFzaE1hcCgpOworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG51bGxBcnJheSA9IG51bGw7CisgICAgICAgIGFzc2VydE51bGwoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGFueUtleVZhbHVlLCBudWxsQXJyYXkpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoZW1wdHlLZXlWYWx1ZSwgbnVsbEFycmF5KSk7CisgICAgICAgIGFzc2VydE51bGwoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKG51bGxLZXlWYWx1ZSwgbnVsbEFycmF5KSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZW1wdHlBcnJheSA9IHt9OworICAgICAgICBhc3NlcnROdWxsKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhhbnlLZXlWYWx1ZSwgZW1wdHlBcnJheSkpOworICAgICAgICBhc3NlcnROdWxsKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhlbXB0eUtleVZhbHVlLCBlbXB0eUFycmF5KSk7CisgICAgICAgIGFzc2VydE51bGwoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKG51bGxLZXlWYWx1ZSwgZW1wdHlBcnJheSkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBIQVJEV0FSRV9LRVkgPSAiSEFSRFdBUkUiOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcnJheSA9IHsKKyAgICAgICAgICAgICIsZGVmYXVsdFZhbHVlIiwKKyAgICAgICAgICAgICJIQVJEV0FSRT1ncm91cGVyLDAuMyIsCisgICAgICAgICAgICAiSEFSRFdBUkU9bWFrbywwLjQiLAorICAgICAgICAgICAgIkhBUkRXQVJFPW1hbnRhLDAuMiIsCisgICAgICAgICAgICAiSEFSRFdBUkU9bWFrbywwLjUiLAorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4ga2V5VmFsdWVzID0gQ29sbGVjdGlvblV0aWxzLm5ld0hhc2hNYXAoKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChIQVJEV0FSRV9LRVksICJncm91cGVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSksICIwLjMiKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChIQVJEV0FSRV9LRVksICJtYWtvIik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSksICIwLjQiKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChIQVJEV0FSRV9LRVksICJtYW50YSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgYXJyYXkpLCAiMC4yIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtleVZhbHVlcy5jbGVhcigpOworICAgICAgICAgICAga2V5VmFsdWVzLnB1dCgiaGFyZHdhcmUiLCAiZ3JvdXBlciIpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnN0YW50ID0gUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgYXJyYXkpOworICAgICAgICAgICAgZmFpbCgiY29uZGl0aW9uIHdpdGhvdXQgSEFSRFdBUkUgbXVzdCBmYWlsOiBjb25zdGFudD0iICsgY29uc3RhbnQpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgIkZvdW5kIHVua25vd24ga2V5OiBIQVJEV0FSRT1ncm91cGVyIik7CisgICAgICAgIH0KKyAgICAgICAga2V5VmFsdWVzLmNsZWFyKCk7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAiTUFLTyIpOworICAgICAgICBhc3NlcnROdWxsKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhrZXlWYWx1ZXMsIGFycmF5KSk7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAibWFudGFyYXkiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29uc3RhbnQgPSBSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoCisgICAgICAgICAgICAgICAgICAgIGVtcHR5S2V5VmFsdWUsIGFycmF5KTsKKyAgICAgICAgICAgIGZhaWwoImVtcHR5Q29uZGl0aW9uIHNob3VsZG4ndCBtYXRjaDogY29uc3RhbnQ9IiArIGNvbnN0YW50KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJGb3VuZCB1bmtub3duIGtleTogSEFSRFdBUkU9Z3JvdXBlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnNDb21iaW5lZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIEhBUkRXQVJFX0tFWSA9ICJIQVJEV0FSRSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBNT0RFTF9LRVkgPSAiTU9ERUwiOworICAgICAgICBmaW5hbCBTdHJpbmcgTUFOVUZBQ1RVUkVSX0tFWSA9ICJNQU5VRkFDVFVSRVIiOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcnJheSA9IHsKKyAgICAgICAgICAgICIsZGVmYXVsdFZhbHVlIiwKKyAgICAgICAgICAgICJIQVJEV0FSRT1ncm91cGVyOk1BTlVGQUNUVVJFUj1hc3VzLDAuMyIsCisgICAgICAgICAgICAiSEFSRFdBUkU9bWFrbzpNT0RFTD1OZXh1cyA0LDAuNCIsCisgICAgICAgICAgICAiSEFSRFdBUkU9bWFudGE6TU9ERUw9TmV4dXMgMTA6TUFOVUZBQ1RVUkVSPXNhbXN1bmcsMC4yIgorICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmdbXSBmYWlsQXJyYXkgPSB7CisgICAgICAgICAgICAiLGRlZmF1bHRWYWx1ZSIsCisgICAgICAgICAgICAiSEFSRFdBUkU9Z3JvdXBlcjpNQU5VRkFDVFVSRVI9QVNVUywwLjMiLAorICAgICAgICAgICAgIkhBUkRXQVJFPW1ha286TU9ERUw9TmV4dXNfNCwwLjQiLAorICAgICAgICAgICAgIkhBUkRXQVJFPW1hbnRhcmF5Ok1PREVMPU5leHVzIDEwOk1BTlVGQUNUVVJFUj1zYW1zdW5nLDAuMiIKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGtleVZhbHVlcyA9IENvbGxlY3Rpb25VdGlscy5uZXdIYXNoTWFwKCk7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAiZ3JvdXBlciIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KE1PREVMX0tFWSwgIk5leHVzIDciKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChNQU5VRkFDVFVSRVJfS0VZLCAiYXN1cyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgYXJyYXkpLCAiMC4zIik7CisgICAgICAgIGFzc2VydE51bGwoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgZmFpbEFycmF5KSk7CisKKyAgICAgICAga2V5VmFsdWVzLmNsZWFyKCk7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAibWFrbyIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KE1PREVMX0tFWSwgIk5leHVzIDQiKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChNQU5VRkFDVFVSRVJfS0VZLCAiTEdFIik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSksICIwLjQiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBmYWlsQXJyYXkpKTsKKworICAgICAgICBrZXlWYWx1ZXMuY2xlYXIoKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChIQVJEV0FSRV9LRVksICJtYW50YSIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KE1PREVMX0tFWSwgIk5leHVzIDEwIik7CisgICAgICAgIGtleVZhbHVlcy5wdXQoTUFOVUZBQ1RVUkVSX0tFWSwgInNhbXN1bmciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhrZXlWYWx1ZXMsIGFycmF5KSwgIjAuMiIpOworICAgICAgICBhc3NlcnROdWxsKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhrZXlWYWx1ZXMsIGZhaWxBcnJheSkpOworICAgICAgICBrZXlWYWx1ZXMucHV0KEhBUkRXQVJFX0tFWSwgIm1hbnRhcmF5Iik7CisgICAgICAgIGFzc2VydE51bGwoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgYXJyYXkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhrZXlWYWx1ZXMsIGZhaWxBcnJheSksICIwLjIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlyc1JlZ2V4cCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIEhBUkRXQVJFX0tFWSA9ICJIQVJEV0FSRSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBNT0RFTF9LRVkgPSAiTU9ERUwiOworICAgICAgICBmaW5hbCBTdHJpbmcgTUFOVUZBQ1RVUkVSX0tFWSA9ICJNQU5VRkFDVFVSRVIiOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcnJheSA9IHsKKyAgICAgICAgICAgICIsZGVmYXVsdFZhbHVlIiwKKyAgICAgICAgICAgICJIQVJEV0FSRT1ncm91cGVyfHRpbGFwaWE6TUFOVUZBQ1RVUkVSPWFzdXMsMC4zIiwKKyAgICAgICAgICAgICJIQVJEV0FSRT1bbU1dW2FBXVtrS11bb09dOk1PREVMPU5leHVzIDQsMC40IiwKKyAgICAgICAgICAgICJIQVJEV0FSRT1tYW50YS4qOk1PREVMPU5leHVzIDEwOk1BTlVGQUNUVVJFUj1zYW1zdW5nLDAuMiIKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGtleVZhbHVlcyA9IENvbGxlY3Rpb25VdGlscy5uZXdIYXNoTWFwKCk7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAiZ3JvdXBlciIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KE1PREVMX0tFWSwgIk5leHVzIDciKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChNQU5VRkFDVFVSRVJfS0VZLCAiYXN1cyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgYXJyYXkpLCAiMC4zIik7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAidGlsYXBpYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VVdGlscy5maW5kQ29uc3RhbnRGb3JLZXlWYWx1ZVBhaXJzKGtleVZhbHVlcywgYXJyYXkpLCAiMC4zIik7CisKKyAgICAgICAga2V5VmFsdWVzLmNsZWFyKCk7CisgICAgICAgIGtleVZhbHVlcy5wdXQoSEFSRFdBUkVfS0VZLCAibWFrbyIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KE1PREVMX0tFWSwgIk5leHVzIDQiKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChNQU5VRkFDVFVSRVJfS0VZLCAiTEdFIik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSksICIwLjQiKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChIQVJEV0FSRV9LRVksICJNQUtPIik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSksICIwLjQiKTsKKworICAgICAgICBrZXlWYWx1ZXMuY2xlYXIoKTsKKyAgICAgICAga2V5VmFsdWVzLnB1dChIQVJEV0FSRV9LRVksICJtYW50YSIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KE1PREVMX0tFWSwgIk5leHVzIDEwIik7CisgICAgICAgIGtleVZhbHVlcy5wdXQoTUFOVUZBQ1RVUkVSX0tFWSwgInNhbXN1bmciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlVXRpbHMuZmluZENvbnN0YW50Rm9yS2V5VmFsdWVQYWlycyhrZXlWYWx1ZXMsIGFycmF5KSwgIjAuMiIpOworICAgICAgICBrZXlWYWx1ZXMucHV0KEhBUkRXQVJFX0tFWSwgIm1hbnRhcmF5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVV0aWxzLmZpbmRDb25zdGFudEZvcktleVZhbHVlUGFpcnMoa2V5VmFsdWVzLCBhcnJheSksICIwLjIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3RyaW5nVXRpbHNUZXN0cy5qYXZhIGIvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1N0cmluZ1V0aWxzVGVzdHMuamF2YQppbmRleCAxZTNjYzhhLi4yOWU3OTBhIDEwMDY0NAotLS0gYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU3RyaW5nVXRpbHNUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TdHJpbmdVdGlsc1Rlc3RzLmphdmEKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKFN0cmluZ1V0aWxzLmlzSWRlbnRpY2FsQWZ0ZXJEb3duY2FzZSgiIikpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjaGVja0NhcGl0YWxpemUoZmluYWwgU3RyaW5nIHNyYywgZmluYWwgU3RyaW5nIGRzdCwgZmluYWwgU3RyaW5nIHNlcGFyYXRvcnMsCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NhcGl0YWxpemUoZmluYWwgU3RyaW5nIHNyYywgZmluYWwgU3RyaW5nIGRzdCwgZmluYWwgU3RyaW5nIHNlcGFyYXRvcnMsCiAgICAgICAgICAgICBmaW5hbCBMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhkc3QsIFN0cmluZ1V0aWxzLmNhcGl0YWxpemVFYWNoV29yZChzcmMsIHNlcGFyYXRvcnMsIGxvY2FsZSkpOwogICAgICAgICBhc3NlcnQoc3JjLmVxdWFscyhkc3QpCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDg3OWNjNDYuLjk5NWQ3ZjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRTcGVsbENoZWNrZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0yNCwxNCArMjQsMTUgQEAKIEBMYXJnZVRlc3QKIHB1YmxpYyBjbGFzcyBBbmRyb2lkU3BlbGxDaGVja2VyU2VydmljZVRlc3QgZXh0ZW5kcyBJbnB1dFRlc3RzQmFzZSB7CiAgICAgcHVibGljIHZvaWQgdGVzdFNwZWxsY2hlY2tlcigpIHsKLSAgICAgICAgbVRleHRWaWV3Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dCgidGdpcyIpOwotICAgICAgICB0eXBlKCIgIik7CisgICAgICAgIGNoYW5nZUxhbmd1YWdlKCJlbl9VUyIpOworICAgICAgICBtRWRpdFRleHQuc2V0VGV4dCgidGdpcyAiKTsKKyAgICAgICAgbUVkaXRUZXh0LnNldFNlbGVjdGlvbihtRWRpdFRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKKyAgICAgICAgbUVkaXRUZXh0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwogICAgICAgICBzbGVlcCgxMDAwKTsKICAgICAgICAgcnVuTWVzc2FnZXMoKTsKICAgICAgICAgc2xlZXAoMTAwMCk7CiAKLSAgICAgICAgZmluYWwgU3BhbkdldHRlciBzcGFuID0gbmV3IFNwYW5HZXR0ZXIobVRleHRWaWV3LmdldFRleHQoKSwgU3VnZ2VzdGlvblNwYW4uY2xhc3MpOworICAgICAgICBmaW5hbCBTcGFuR2V0dGVyIHNwYW4gPSBuZXcgU3BhbkdldHRlcihtRWRpdFRleHQuZ2V0VGV4dCgpLCBTdWdnZXN0aW9uU3Bhbi5jbGFzcyk7CiAgICAgICAgIC8vIElmIG5vIHNwYW4sIHRoZSBmb2xsb3dpbmcgd2lsbCBjcmFzaAogICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdWdnZXN0aW9ucyA9IHNwYW4uZ2V0U3VnZ2VzdGlvbnMoKTsKICAgICAgICAgLy8gRm9yIHRoaXMgdGVzdCB3ZSBjb25zaWRlciAidGdpcyIgc2hvdWxkIHlpZWxkIGF0IGxlYXN0IDIgc3VnZ2VzdGlvbnMgKGF0IHRoaXMgbW9tZW50CkBAIC00MywxNCArNDQsMTUgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdXNzaWFuU3BlbGxjaGVja2VyKCkgewogICAgICAgICBjaGFuZ2VMYW5ndWFnZSgicnUiKTsKLSAgICAgICAgbVRleHRWaWV3Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dCgi0LPQvtC00L8iKTsKLSAgICAgICAgdHlwZSgiICIpOworICAgICAgICBtRWRpdFRleHQub25BdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KCLQs9C+0LTQvyAiKTsKKyAgICAgICAgbUVkaXRUZXh0LnNldFNlbGVjdGlvbihtRWRpdFRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKKyAgICAgICAgbUVkaXRUZXh0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwogICAgICAgICBzbGVlcCgxMDAwKTsKICAgICAgICAgcnVuTWVzc2FnZXMoKTsKICAgICAgICAgc2xlZXAoMTAwMCk7CiAKLSAgICAgICAgZmluYWwgU3BhbkdldHRlciBzcGFuID0gbmV3IFNwYW5HZXR0ZXIobVRleHRWaWV3LmdldFRleHQoKSwgU3VnZ2VzdGlvblNwYW4uY2xhc3MpOworICAgICAgICBmaW5hbCBTcGFuR2V0dGVyIHNwYW4gPSBuZXcgU3BhbkdldHRlcihtRWRpdFRleHQuZ2V0VGV4dCgpLCBTdWdnZXN0aW9uU3Bhbi5jbGFzcyk7CiAgICAgICAgIC8vIElmIG5vIHNwYW4sIHRoZSBmb2xsb3dpbmcgd2lsbCBjcmFzaAogICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdWdnZXN0aW9ucyA9IHNwYW4uZ2V0U3VnZ2VzdGlvbnMoKTsKICAgICAgICAgLy8gRm9yIHRoaXMgdGVzdCB3ZSBjb25zaWRlciAi0LPQvtC00L8iIHNob3VsZCB5aWVsZCBhdCBsZWFzdCAyIHN1Z2dlc3Rpb25zIChhdCB0aGlzIG1vbWVudAo=